fix(provider): 修复DeepSeek开发凭据解析
This commit is contained in:
@@ -443,6 +443,7 @@ class ProviderPreset(Contract):
|
||||
name: str
|
||||
provider_type: ProviderType
|
||||
base_url: str
|
||||
default_credential_id: str | None = None
|
||||
requires_credential: bool = True
|
||||
|
||||
|
||||
|
||||
@@ -10,8 +10,17 @@ class CredentialResolver(Protocol):
|
||||
class EnvironmentCredentialResolver:
|
||||
"""解析由桌面 Host 注入 Sidecar 进程的临时凭证上下文。"""
|
||||
|
||||
_development_aliases = {
|
||||
"openai": "OPENAI_API_KEY",
|
||||
"deepseek": "DEEPSEEK_API_KEY",
|
||||
}
|
||||
|
||||
def resolve(self, credential_id: str | None) -> str | None:
|
||||
if not credential_id:
|
||||
return None
|
||||
normalized = re.sub(r"[^A-Za-z0-9]", "_", credential_id).upper()
|
||||
return os.getenv(f"AINOTE_CREDENTIAL_{normalized}")
|
||||
injected = os.getenv(f"AINOTE_CREDENTIAL_{normalized}")
|
||||
if injected:
|
||||
return injected
|
||||
alias = self._development_aliases.get(credential_id.lower())
|
||||
return os.getenv(alias) if alias else None
|
||||
|
||||
@@ -35,12 +35,14 @@ class ProviderFactory:
|
||||
name="OpenAI",
|
||||
provider_type=ProviderType.openai_chat,
|
||||
base_url="https://api.openai.com/v1",
|
||||
default_credential_id="openai",
|
||||
),
|
||||
ProviderPreset(
|
||||
preset_id="deepseek",
|
||||
name="DeepSeek",
|
||||
provider_type=ProviderType.openai_compatible,
|
||||
base_url="https://api.deepseek.com",
|
||||
default_credential_id="deepseek",
|
||||
),
|
||||
ProviderPreset(
|
||||
preset_id="ollama",
|
||||
|
||||
@@ -264,6 +264,11 @@ class OpenAICompatibleProvider(TurnStreamingMixin):
|
||||
def _headers(self) -> dict[str, str]:
|
||||
headers = {"Content-Type": "application/json"}
|
||||
api_key = self.credentials.resolve(self.credential_id)
|
||||
if self.credential_id and not api_key:
|
||||
raise ProviderError(
|
||||
"PROVIDER_CREDENTIAL_MISSING",
|
||||
f'Credential "{self.credential_id}" is not available in the AI Core process.',
|
||||
)
|
||||
if api_key:
|
||||
headers["Authorization"] = f"Bearer {api_key}"
|
||||
return headers
|
||||
|
||||
@@ -517,6 +517,7 @@ async def list_provider_models(provider_id: str) -> ProviderModelsResponse:
|
||||
models = await container.providers.list_models(provider_id)
|
||||
except ProviderError as exc:
|
||||
status_code = {
|
||||
"PROVIDER_CREDENTIAL_MISSING": 422,
|
||||
"PROVIDER_AUTH_FAILED": 401,
|
||||
"MODEL_NOT_FOUND": 404,
|
||||
"PROVIDER_RATE_LIMITED": 429,
|
||||
|
||||
Reference in New Issue
Block a user