Skip to content

fix(ci): 单测环境注入哑 LLM key,修复 openai>=3 构造期凭据校验导致的 CI 红 - #12

Open
leaderwm wants to merge 1 commit into
zhyese:mainfrom
leaderwm:fix/ci-test-env-openai-credentials
Open

fix(ci): 单测环境注入哑 LLM key,修复 openai>=3 构造期凭据校验导致的 CI 红#12
leaderwm wants to merge 1 commit into
zhyese:mainfrom
leaderwm:fix/ci-test-env-openai-credentials

Conversation

@leaderwm

@leaderwm leaderwm commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

问题

main 的 CI(testsCI 两个工作流)自 2026-09-03 起持续红,失败集固定为 tests/test_batch3_infra.py 3 例(test_chat_with_usage_returns_real_tokens / test_chat_with_usage_no_usage_returns_none / test_chat_str_contract_unchanged),并连带所有 open PR 的 CI 显示失败。

根因:requirements 中 openai>=2.0 无上界,CI 安装到 openai 3.7.0。3.x 起 AsyncOpenAI() 构造时即校验凭据(2.x 延迟到首次请求才查),且 SDK 仅在 api_key=None 时才回退读 OPENAI_API_KEY 环境变量;而 config.pyDEEPSEEK_API_KEY 等默认值是空串(非 None),被原样传入 → DeepSeekLLM()/QwenLLM()/DoubaoLLM() 在单测环境(无真实 key)构造即抛 OpenAIError: Missing credentials。三个测试都是「先构造 provider 再 mock client.chat.completions.create」的写法,构造一步就挂。

改动(仅测试环境,零生产代码变更)

tests/conftest.pyapp.config.Settings 实例化之前,对三个 provider key setdefault 哑值(sk-test-dummy):

  • 仅满足 openai SDK 的构造期校验——单测中所有 LLM 请求均被 mock,不会真实外发
  • setdefault 不覆盖真实环境变量,本地有真 key 的开发者行为不变;
  • 对 openai 2.x / 3.x 均兼容(2.x 本就延迟校验,注入无副作用)。

验证

  • 修复前:test_batch3_infra.py 3 failed / 11 passed;全量 3 failed, 864 passed
  • 修复后:test_batch3_infra.py 14 passed;全量 867 passed, 0 failed(CI 同款命令 pytest tests/ -q --ignore=tests/test_api.py -m "not integration"
  • python scripts/validate_golden.py 通过(109 条)

openai 3.x 起 AsyncOpenAI() 构造时即校验凭据(2.x 延迟到首次请求),
且仅 api_key=None 时才回退读环境变量;config 默认空串被原样传入 →
DeepSeekLLM/QwenLLM/DoubaoLLM 构造即抛 'Missing credentials',
test_batch3_infra 3 例失败(main CI 自 2026-09-03 起红)。

conftest 在 Settings 实例化前 setdefault 三个 provider key 为哑值:
单测中所有 LLM 请求均被 mock,不会真实外发;对 openai 2.x/3.x 均兼容。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant