1
0

fix: 完善转换代理行为

This commit is contained in:
2026-04-26 21:48:17 +08:00
parent 155244433f
commit 9622d44aac
33 changed files with 1127 additions and 1117 deletions

View File

@@ -11,7 +11,8 @@
- `protocolName()` SHALL 返回 `"openai"`
- `supportsPassthrough()` SHALL 返回 true
- `buildHeaders(provider)` SHALL 构建 `Authorization: Bearer <api_key>``Content-Type: application/json`
- `buildUrl(nativePath, interfaceType)` SHALL 按接口类型映射 URL 路径,不带 `/v1` 前缀
- `detectInterfaceType(nativePath)` SHALL 识别带 `/v1` 前缀的 OpenAI nativePath
- `buildUrl(nativePath, interfaceType)` SHALL 按接口类型映射上游 URL 路径,输出路径不带 `/v1` 前缀
- `supportsInterface()` SHALL 对 CHAT、MODELS、MODEL_INFO、EMBEDDINGS、RERANK 返回 true
#### Scenario: 认证 Header 构建
@@ -24,12 +25,34 @@
#### Scenario: URL 映射
- **WHEN** interfaceType == CHAT
- **WHEN** interfaceType == CHAT 且 nativePath 为 `/v1/chat/completions`
- **THEN** SHALL 映射为 `/chat/completions`
- **WHEN** interfaceType == MODELS
- **WHEN** interfaceType == MODELS 且 nativePath 为 `/v1/models`
- **THEN** SHALL 映射为 `/models`
- **WHEN** interfaceType == EMBEDDINGS
- **WHEN** interfaceType == MODEL_INFO 且 nativePath 为 `/v1/models/{id}`
- **THEN** SHALL 映射为 `/models/{id}`
- **WHEN** interfaceType == EMBEDDINGS 且 nativePath 为 `/v1/embeddings`
- **THEN** SHALL 映射为 `/embeddings`
- **WHEN** interfaceType == RERANK 且 nativePath 为 `/v1/rerank`
- **THEN** SHALL 映射为 `/rerank`
#### Scenario: 接口类型识别
- **WHEN** 调用 `DetectInterfaceType("/v1/chat/completions")`
- **THEN** SHALL 返回 `InterfaceTypeChat`
- **WHEN** 调用 `DetectInterfaceType("/v1/models")`
- **THEN** SHALL 返回 `InterfaceTypeModels`
- **WHEN** 调用 `DetectInterfaceType("/v1/embeddings")`
- **THEN** SHALL 返回 `InterfaceTypeEmbeddings`
- **WHEN** 调用 `DetectInterfaceType("/v1/rerank")`
- **THEN** SHALL 返回 `InterfaceTypeRerank`
#### Scenario: 旧无版本路径不再作为已适配接口
- **WHEN** 调用 `DetectInterfaceType("/chat/completions")`
- **THEN** SHALL 返回 `InterfaceTypePassthrough`
- **WHEN** 调用 `DetectInterfaceType("/models")`
- **THEN** SHALL 返回 `InterfaceTypePassthrough`
### Requirement: OpenAI 请求解码OpenAI → Canonical
@@ -272,40 +295,40 @@ Encoder SHALL 维护状态:
- **THEN** SHALL 使用 CanonicalRerankRequest/Response 做字段映射
### Requirement: 模型详情路径识别
OpenAI 适配器 SHALL 正确识别包含统一模型 ID 的模型详情路径。
OpenAI 适配器 SHALL 正确识别包含统一模型 ID 的`/v1` 模型详情路径。
#### Scenario: 含斜杠的统一模型 ID 路径
- **WHEN** 路径为 `/models/openai/gpt-4`
- **WHEN** 路径为 `/v1/models/openai/gpt-4`
- **THEN** `DetectInterfaceType` SHALL 返回 `InterfaceTypeModelInfo`
#### Scenario: 含多段斜杠的统一模型 ID 路径
- **WHEN** 路径为 `/models/azure/accounts/org-123/models/gpt-4`
- **WHEN** 路径为 `/v1/models/azure/accounts/org-123/models/gpt-4`
- **THEN** `DetectInterfaceType` SHALL 返回 `InterfaceTypeModelInfo`
#### Scenario: 模型列表路径不受影响
- **WHEN** 路径为 `/models`
- **WHEN** 路径为 `/v1/models`
- **THEN** `DetectInterfaceType` SHALL 返回 `InterfaceTypeModels`
### Requirement: 提取统一模型 ID
OpenAI 适配器 SHALL 从路径中提取统一模型 ID。
OpenAI 适配器 SHALL 从`/v1` 的模型详情路径中提取统一模型 ID。
#### Scenario: 标准路径提取
- **WHEN** 调用 `ExtractUnifiedModelID("/models/openai/gpt-4")`
- **WHEN** 调用 `ExtractUnifiedModelID("/v1/models/openai/gpt-4")`
- **THEN** SHALL 返回 `"openai/gpt-4"`
#### Scenario: 复杂路径提取
- **WHEN** 调用 `ExtractUnifiedModelID("/models/azure/accounts/org/models/gpt-4")`
- **WHEN** 调用 `ExtractUnifiedModelID("/v1/models/azure/accounts/org/models/gpt-4")`
- **THEN** SHALL 返回 `"azure/accounts/org/models/gpt-4"`
#### Scenario: 非模型详情路径
- **WHEN** 调用 `ExtractUnifiedModelID("/models")`
- **WHEN** 调用 `ExtractUnifiedModelID("/v1/models")`
- **THEN** SHALL 返回错误
### Requirement: 从请求体提取 model