状态: Phase 1–3 完成(openai-compat 为 provider 级禁用,key 数 < 2)
页面: /monitor/inspection
日期: 2026-07-23
相关代码:
src/external/pages/CodexInspectionPage.tsxsrc/external/features/monitoring/codexInspection.tsservices/internal/watcher/synthesizer/config.go(API Key 凭证合成)services/internal/api/handlers/management/api_tools.go(/api-call + $TOKEN$)当前巡检页主要面向 OAuth 认证文件(codex / claude / xai / kimi 等),从 GET /auth-files 取文件型凭证,走用量/账单/chat 健康探测,并支持 delete / disable / enable。
API_KEY 提供商是另一套凭证:
ConfigSynthesizer)runtime_only=trueattributes.api_key + base_urlopenai-compatible-*、codex-apikey、claude-apikey、gemini API key 等目标:
| 维度 | OAuth 认证文件 | API_KEY 提供商 |
|---|---|---|
| 数据来源 | auth-files 文件型 | 同列表 runtime_only / config 合成 |
| 标识 | fileName + auth_index |
id / auth_index,可能无真实文件 |
| 凭证 | access_token / refresh | attributes.api_key + base_url |
| Provider | codex / claude / xai … | openai-compatible-xxx、*-apikey … |
| 探测语义 | 用量/账单/chat | 连通性:/models 或最小 chat |
| 删除 | 可删 auth 文件 | 禁止当作文件删除 |
| disable | PATCH /auth-files/status |
优先 runtime status;持久化写 config 为后续阶段 |
POST /v0/management/api-call 已支持 auth_index + $TOKEN$,token 解析:metadata token → attributes.api_key。探测链路可复用。
账号源: [ oauth ] [ api_key ]
认证类型: 随账号源变化
oauth:保持现有逻辑api_key:只扫描 API Key / runtime 凭证第一期粗类(Family):
| Family | 匹配规则(示意) |
|---|---|
openai-compat |
provider 以 openai-compatible 开头 |
gemini-apikey |
gemini / aistudio 且 runtime_only 或 apikey 形态 |
claude-apikey |
claude 且非 OAuth oat token / runtime apikey |
codex-apikey |
provider=codex 且 label/source 为 apikey 或 runtime_only |
vertex-apikey |
vertex runtime/apikey |
第一期实现优先:
/models,后续再特化从 authFilesApi.list() 全量后过滤:
isApiKeyInspectionAccount(file) =
runtime_only === true
|| provider.startsWith('openai-compatible')
|| provider includes 'apikey' / 已知 apikey provider
|| auth_kind === 'api_key'(若暴露)
规则:
runtime_only 判断,避免与 OAuth 文件冲突auth_index 为空 → 跳过 + warninglabel / compat_name / provider + 脱敏,不展示完整 keyapiCallApi.request({
authIndex,
method,
url,
header: { Authorization: 'Bearer $TOKEN$', ...headers },
data?: string
})
| Family | 首选 | 备选 |
|---|---|---|
| openai-compat | GET {base_url}/models 或规范化 /v1/models |
POST chat/completions 最小请求 |
| 其他 apikey(过渡) | 同上(若有 base_url) | 无 base_url 则 keep + 原因 |
URL 规范化:
base_url:去尾 /,若已以 /v1 结尾则补 /models,否则补 /v1/models(可配置)base_url:跳过探测,action=keep,reason=缺少 base_url现有 probePromptMode(fixed / math / random)仅对 chat 探测 生效。
Phase 1 默认 /models,不强制 chat。
| HTTP | 建议动作 | 说明 |
|---|---|---|
| 2xx | keep;若 disabled 且策略允许 → enable | 可用 |
| 401/403 | disable(不 delete) | 密钥无效 |
| 402/429 | keep 或 disable(可配置,默认 keep) | 额度/限流 |
| 5xx / 0 超时 | disable 或 keep(默认 disable 可选,Phase1 用 disable 与 OAuth 非200对齐需谨慎:建议 timeout→disable,5xx→keep/disable 可配置) | 服务问题 |
| Phase1 默认简化 | 401/403 → disable;2xx → keep/enable;其它非200 → disable;timeout → disable | 与现有 OAuth 非200 体验接近但禁 delete |
复用 formatInspectionProbeBodyLog:
| 动作 | OAuth | API Key |
|---|---|---|
| disable/enable | auth-files/status |
尝试同一 status API;失败则记 failed |
| delete | 删文件 | 禁止;自动策略不含 delete;手动删除按钮禁用或提示 |
| 手动更新 UA/proxy/priority | patch fields | Phase1 可不支持 runtime-only;或仅尝试 fields |
自动动作模式(API Key 源):
none / disable / 后续 recover-enabledelete、strategy4/5/6 中含删除语义的策略(Phase1:强制 auto 不执行 delete)风险备忘:
状态栏(开始巡检行):
账号源 Select 或 segmented:OAuth |
API Key |
结果表:
source 展示(optional Phase1)设置弹窗:
accountSource +(可选)apiKeyFamilytype InspectionAccountSource = 'oauth' | 'api_key';
type InspectionApiKeyFamily =
| 'openai-compat'
| 'gemini-apikey'
| 'claude-apikey'
| 'codex-apikey'
| 'vertex-apikey'
| 'all'; // Phase1 可用 all 表示当前源下全部
// Configurable settings 新增:
accountSource: InspectionAccountSource; // default 'oauth'
apiKeyFamily: InspectionApiKeyFamily; // default 'all' 或 'openai-compat'
CodexInspectionAccount / ResultItem 可增加:
accountSource?: InspectionAccountSource;
baseUrl?: string;
../services/operations/inspection.mdcodexInspection.ts
accountSource / apiKeyFamilyisApiKeyInspectionAccount / family 匹配probeApiKeyAccount(models 探测)CodexInspectionPage.tsx
/models 探测若任务中断,从下列步骤继续:
../development/inspection-api-key-plan.mdaccountSource(targetType 在 api_key 源下承载 family)probeApiKeyAccount 是否存在并在 switch 中调用tsc --noEmit 是否通过已实现:
openai-compat / codex-apikey:GET /v1/models,失败或 404/405 时 chat/completions 回退claude-apikey:POST /v1/messages(x-api-key: $TOKEN$)gemini-apikey / vertex-apikey:GET /v1beta/models,必要时 chat 回退probeModelprobePromptMode(fixed/math/random)none / disable后端 PATCH /auth-files/status 对 config 合成 API Key 已有持久化路径:
excluded-models: ["*"]disabled: true/false,并 reload config同时增强 status 查找:支持 id / fileName / auth_index / id basename,避免 runtime key 用 id 当 name 时 404。
前端 executeStatusChange 对同一账号按多个候选 name 依次尝试 setStatus。
settings 新增 providerFilter(localStorage):
TestToggleConfigAPIKeyExcludedAll_OpenAICompat 通过OpenAICompatibilityAPIKey(无 per-key disabled 字段)。OpenAICompatibility.Disabled。synthesizeOpenAICompat 仅尊重 compat.Disabled;整实例跳过。api-key-entries 上做 per-key skip。toggleConfigAPIKeyExcludedAll:
keyCount >= 2 → error(handled=false)keyCount < 2 或 legacy 无 entries → compat.Disabled = disableTestToggleConfigAPIKeyExcludedAll_OpenAICompat_SingleKeyProviderLevelTestToggleConfigAPIKeyExcludedAll_OpenAICompat_MultiKeyRejectedTestToggleConfigAPIKeyExcludedAll_OpenAICompatLegacyNoEntries配置项 realtimeAutoActions(localStorage,随巡检设置持久化):
| 字段 | 默认 | 说明 |
|---|---|---|
disable |
true |
探测出现禁用建议时立即禁用 |
enable |
true |
探测出现启用建议时立即启用 |
delete |
false |
探测出现删除建议时立即删除(API Key 源强制 false) |
依赖 autoActionMode !== 'none':先按策略映射动作,再按勾选项过滤。运行中串行队列执行,结束时等待队列排空并跳过已成功实时处理的账号,避免重复执行。