fix: 完善转换代理行为
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user