Files
pikasTech-unidesk/config/platform-infra/sub2api-codex-pool.yaml
T
2026-07-14 20:40:15 +02:00

231 lines
7.7 KiB
YAML

version: 1
kind: platform-infra-sub2api-codex-pool
metadata:
id: sub2api-codex-pool
owner: unidesk
relatedIssues:
- 339
- 340
runtime:
errorPassthroughRules:
- id: openai-context-window-client-error
name: UniDesk OpenAI context window client error
enabled: true
priority: 100
errorCodes: [400, 502]
keywords: [context_length_exceeded, input exceeds the context window]
matchMode: all
platforms: [openai]
passthroughCode: false
responseCode: 400
passthroughBody: true
customMessage: null
skipMonitoring: false
description: 将确定的 OpenAI 上下文超限错误作为客户请求错误返回,保留原始错误信息并继续记录运维事件。
templates:
- id: codex-upstream-failover
kind: temp-unschedulable
description: Codex 兼容 API-key 账号的请求路径短时冷却与换号策略。
spec:
enabled: true
rules:
- statusCode: 429
keywords: [concurrency limit exceeded, upstream rate limit exceeded]
durationMinutes: 1
description: 明确命中上游并发或速率限制时短时冷却当前账号。
- statusCode: 400
keywords: [input must be a list]
durationMinutes: 1
description: 明确命中 Responses input 列表兼容错误时短时冷却并切换账号。
- statusCode: 500
keywords: [failed to validate api key, do request failed]
durationMinutes: 1
description: 上游 API-key 查询依赖或请求传输内部失败时短时冷却当前账号。
- statusCode: 502
keywords: [upstream service temporarily unavailable, upstream request failed, service temporarily unavailable, overloaded, concurrency limit exceeded]
durationMinutes: 1
description: 明确命中 502 上游不可用、过载或并发限制时短时冷却当前账号。
- statusCode: 503
keywords: [upstream service temporarily unavailable, upstream request failed, service temporarily unavailable, temporarily unavailable, overloaded, concurrency limit exceeded]
durationMinutes: 1
description: 明确命中 503 上游暂时不可用、过载或并发限制时短时冷却当前账号。
- statusCode: 504
keywords: [concurrency limit exceeded, upstream service temporarily unavailable, input must be a list]
durationMinutes: 1
description: 明确命中 504 上游并发限制、暂时不可用或 Responses input 列表兼容错误时短时冷却当前账号。
- statusCode: 524
keywords: [upstream request failed, service temporarily unavailable, overloaded, concurrency limit exceeded]
durationMinutes: 1
description: 明确命中 524 上游不可用、过载或并发限制时短时冷却当前账号。
profit:
defaultWindow: 24h
usageCostField: actual_cost
accountCostSource: account-name-trailing-cny-per-api-usd
saleRateCnyPerApiUsd: 0.10
groups:
profitable: [unidesk-codex-pool]
selfUse: [自用]
excluded: [grok]
pool:
groupName: unidesk-codex-pool
groupDescription: UniDesk-managed Codex API-key pool for YAML-selected Sub2API clients.
apiKeyName: unidesk-codex-pool-api-key
apiKeySecretName: sub2api-codex-pool-api-key
apiKeySecretKey: API_KEY
adminEmailDefault: admin@sub2api.platform-infra.local
minOwnerBalanceUsd: 1000
defaultAccountPriority: 10
defaultAccountCapacity: 10
defaultAccountLoadFactor: 10
defaultSentinelProtect:
enabled: true
consecutiveFailures: 3
initialRetryDelaySeconds: 2
maxRetryDelaySeconds: 60
backoffMultiplier: 2
defaultTempUnschedulableTemplate: codex-upstream-failover
profiles:
entries:
- profile: yjxm1221
accountName: unidesk-codex-yjxm1221
configFile: config.toml.yjxm1221
authFile: auth.json.yjxm1221
trustUpstream: true
proxyId: 3
- profile: yjxm1221-pro
accountName: unidesk-codex-yjxm1221-pro
configFile: config.toml.yjxm1221-pro
authFile: auth.json.yjxm1221-pro
priority: 50
trustUpstream: true
proxyId: 3
manualAccounts:
bindingSources:
active-target-egress-proxy:
enabled: true
kind: proxy
provider: target-egress-proxy
description: Bind a protected manual account to the selected target's YAML-declared egress proxy.
pk01-host-proxy:
enabled: true
kind: proxy
provider: fixed-http-proxy
description: Bind protected/manual PK01 Sub2API accounts to the PK01 host proxy HTTP endpoint.
hostProxyRef: config/platform-infra/host-proxy.yaml#targets.PK01
fixedProxy:
protocol: http
host: 127.0.0.1
port: 10809
unified-pool-group:
enabled: true
kind: group
provider: pool-group
description: Attach a protected manual account to the unified Codex pool group.
protected:
- accountName: unidesk-codex-gptclub-sub2api
reason: Manually configured in Sub2API as protected; keep outside pool auto-management and sentinel control.
proxyBinding:
enabled: true
source: pk01-host-proxy
proxyName: platform-infra-sub2api-pk01-local-egress-proxy
groupBinding:
enabled: true
source: unified-pool-group
publicExposure:
enabled: false
proxyName: platform-infra-sub2api
configMapName: sub2api-frpc-config
deploymentName: sub2api-frpc
frpcImage: fatedier/frpc:v0.68.1
serverAddr: 74.48.78.17
serverPort: 7000
remotePort: 21880
localIP: sub2api.platform-infra.svc.cluster.local
localPort: 8080
publicBaseUrl: https://sub2api.74-48-78-17.nip.io
masterBaseUrl: http://127.0.0.1:21880
masterFrps:
configPath: /opt/hwlab-frp/frps.dev.toml
containerName: hwlab-frps-dev
masterCaddy:
enabled: true
domain: sub2api.74-48-78-17.nip.io
configPath: /etc/caddy/Caddyfile
serviceName: caddy
upstreamBaseUrl: http://127.0.0.1:21880
responseHeaderTimeoutSeconds: 600
edgeRetry:
enabled: true
tryDurationSeconds: 10
tryIntervalMilliseconds: 250
retryMatch:
methods: [POST]
paths: [/responses/compact]
localCodex:
backupSuffix: pre-sub2api
providerName: OpenAI
wireApi: responses
modelContextWindow: 272000
modelAutoCompactTokenLimit: 240000
supportsWebSockets: false
responsesWebSocketsV2: false
responsesSmokeModel: gpt-5.5
sentinel:
monitor:
enabled: true
actions:
enabled: true
schedule: "*/1 * * * *"
image: python:3.12-alpine
sdk:
openaiPythonVersion: "2.41.1"
serviceAccountName: sub2api-account-sentinel
configMapName: sub2api-account-sentinel-config
credentialsSecretName: sub2api-account-sentinel-profiles
stateConfigMapName: sub2api-account-sentinel-state
cronJobName: sub2api-account-sentinel
roleName: sub2api-account-sentinel
roleBindingName: sub2api-account-sentinel
model: gpt-5.5
endpoint: responses
marker:
prefix: UDSG_OK
exact: true
probe:
timeoutSeconds: 30
maxOutputTokens: 16
transportRetryMinutes: 5
userAgent: Go-http-client/1.1
gatewayFailureMonitor:
enabled: true
lookbackSeconds: 900
tailLines: 4000
initialTtlMinutes: 5
maxTtlMinutes: 30
backoffMultiplier: 2
paths:
- /responses
- /v1/responses
- /responses/compact
- /v1/responses/compact
cadence:
successInitialIntervalMinutes: 1
successMaxIntervalMinutes: 20
trustedSuccessMaxIntervalMinutes: 20
untrustedSuccessMaxIntervalMinutes: 2
successBackoffMultiplier: 2
jitterPercent: 10
freeze:
initialTtlMinutes: 1
maxTtlMinutes: 10
backoffMultiplier: 2
jitterPercent: 10
pricing:
usdPer1MInputTokens: 1.25
usdPer1MOutputTokens: 10
historyLimit: 200