Files
openless/Sources/OpenLessPersistence/CredentialsError.swift
T
baiqing d8fb309feb feat(persistence): generalize providers.llm + multi-provider vault API
将 v1 schema 中 `providers.llm` 从 Ark 专用结构推广为通用
`CredentialsProviderLLMEntry`(containing displayName / temperature / extraHeaders),
为 OpenAI / DeepSeek / DashScope / Moonshot 等多 LLM provider 共用一套字段。

旧 `CredentialsProviderLLMArk` 保留为 typealias,已迁移过的 v1 文件无需再次迁移即可继续解码。

新增公开 API:
- `CredentialsVault.activeLLMProviderId` getter/setter
- `CredentialsVault.configuredLLMProviderIds`
- `CredentialsVault.llmProviderConfig(for:)`
- `CredentialsVault.setLLMProviderConfig(_:)`
- `CredentialsVault.removeLLMProvider(_:)`,禁删 active provider

`OpenLessCore` 新增 `LLMProviderRegistry`,集中维护 5 家 OpenAI 兼容供应商
预设(baseURL / model / 帮助文案 / docs URL),UI 与 vault 兜底逻辑共用。

`PolishOutputCleaner` 从 DoubaoPolishClient 内部提升为独立 public 类型,
让 `OpenAICompatibleLLMProvider` 输出统一过 boilerplate / markdown 栅栏清理。

DoubaoPolishClient.swift 已无调用方,整个文件删除。

Tests:
- LLMProviderRegistryTests:5 家预设健康检查 + 唯一性 / URL 合法性
- CredentialsVaultMultiProviderTests:active 默认 / 增删 / 往返 /
  老 `ark.*` 账号 key 路由到 active provider
2026-04-29 11:54:11 +08:00

26 lines
966 B
Swift

import Foundation
/// 凭据存储相关错误。
///
/// `unparseable` / `futureVersion` 都意味着**不要碰原文件**,让用户自己处理或上报。
public enum CredentialsError: Error, Sendable, Equatable {
/// 文件存在但 JSON 解析失败。携带文件 URL,方便给用户显示具体路径。
case unparseable(URL)
/// 文件版本号超过当前代码支持的范围。携带读到的版本号。
case futureVersion(Int)
/// 通用 IO 错误(读 / 创建目录等)。携带可读描述。
case ioError(String)
/// 备份 v0 文件失败。携带备份目标 URL。
case backupFailed(URL)
/// 写入 v1 文件失败。携带目标 URL 和失败描述。
case writeFailed(URL, String)
/// 试图删除当前 active 的 LLM provider。携带 providerId。
/// 调用方必须先把 active 切到别的 provider 再调 `removeLLMProvider`。
case cannotRemoveActiveProvider(String)
}