fix(P0): DoubaoClient vision_completion使用self.model + 构造函数按provider区分fallback
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 1s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 2s
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 52s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 2m6s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 2m33s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m59s
AI Code Review / AI Code Review (pull_request) Successful in 6m59s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 10m55s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 11m56s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 10m42s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 13m47s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 31s
CI/CD Pipeline / Unit Tests (pull_request) Failing after 18m34s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 5m41s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 33m20s
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Failing after 2s
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped

Bug 1(致命):vision_completion payload使用self.vision_model(settings硬编码
豆包视觉模型名),而非构造函数传入的self.model。dashscope provider下发送
豆包模型名到dashscope端点导致404/401。

Bug 2(重要):构造函数api_key/model/base_url为空时一律fallback到doubao
(火山引擎)配置。provider=dashscope时应fallback到dashscope配置,否则
dashscope key请求火山方舟地址返回401。

TTSClient/ImageGenClient/VideoGenClient为纯数据持有者,无fallback逻辑,
无需修改。
This commit is contained in:
Xiaoxia Agent
2026-10-06 19:30:37 +08:00
parent d1c137af8a
commit 54842c1387
+10 -5
View File
@@ -183,15 +183,20 @@ class DoubaoClient:
provider: str = "volcengine",
) -> None:
settings = get_shared_settings()
self.api_key: str = api_key or settings.doubao_api_key
self.model: str = model or settings.doubao_model
self.base_url: str = (base_url or settings.doubao_base_url).rstrip("/")
self.provider: str = provider
if provider == "dashscope":
self.api_key: str = api_key or getattr(settings, "dashscope_api_key", "")
self.model: str = model or getattr(settings, "dashscope_model", "")
self.base_url: str = (base_url or getattr(settings, "dashscope_base_url", "")).rstrip("/")
else: # volcengine (default)
self.api_key = api_key or settings.doubao_api_key
self.model = model or settings.doubao_model
self.base_url = (base_url or settings.doubao_base_url).rstrip("/")
self.timeout: int = timeout or settings.doubao_timeout
self.max_retries: int = max_retries or settings.doubao_max_retries
self.max_tokens: int | None = max_tokens
self.temperature: float | None = temperature
self.extra_params: dict = extra_params or {}
self.provider: str = provider
self.vision_model: str = settings.doubao_vision_model
self.vision_lite_model: str = settings.doubao_vision_lite_model
self.fast_model: str = settings.doubao_fast_model
@@ -391,7 +396,7 @@ class DoubaoClient:
"Content-Type": "application/json",
}
payload: dict[str, Any] = {
"model": model or self.vision_model,
"model": model or self.model,
"messages": vision_messages,
"temperature": temperature,
"max_tokens": max_tokens,