# Unified Model ID

## Purpose

定义统一模型 ID 的格式、解析、格式化和校验规则，确保跨协议的模型标识一致性。

## Requirements

### Requirement: 解析统一模型 ID

系统 SHALL 提供 `ParseUnifiedModelID` 函数，将 `provider_id/model_name` 格式的字符串解析为独立的 providerID 和 modelName。

#### Scenario: 标准格式解析

- **WHEN** 传入 `"openai/gpt-4"`
- **THEN** SHALL 返回 providerID=`"openai"`, modelName=`"gpt-4"`

#### Scenario: model_name 含斜杠的解析

- **WHEN** 传入 `"azure/accounts/org-123/models/gpt-4"`
- **THEN** SHALL 在第一个 `/` 处分割，返回 providerID=`"azure"`, modelName=`"accounts/org-123/models/gpt-4"`

#### Scenario: 缺少分隔符

- **WHEN** 传入不含 `/` 的字符串（如 `"gpt-4"`）
- **THEN** SHALL 返回错误

#### Scenario: 空字符串

- **WHEN** 传入空字符串
- **THEN** SHALL 返回错误

#### Scenario: 只有分隔符

- **WHEN** 传入 `"/model"` 或 `"provider/"` 或 `"/"`
- **THEN** SHALL 返回错误

#### Scenario: providerID 不符合字符集

- **WHEN** 传入 `"open-ai/gpt-4"` 或 `"open.ai/gpt-4"` 或 `"供应商/gpt-4"`（providerID 含非 `[a-zA-Z0-9_]` 字符）
- **THEN** SHALL 返回错误

### Requirement: 格式化统一模型 ID

系统 SHALL 提供 `FormatUnifiedModelID` 函数，将 providerID 和 modelName 组合格式化为统一模型 ID。

#### Scenario: 格式化

- **WHEN** 传入 providerID=`"openai"`, modelName=`"gpt-4"`
- **THEN** SHALL 返回 `"openai/gpt-4"`

### Requirement: 校验供应商 ID

系统 SHALL 提供 `ValidateProviderID` 函数，校验 providerID 仅包含字母、数字、下划线。

#### Scenario: 合法 ID

- **WHEN** 传入 `"openai"`, `"deep_seek"`, `"provider01"`, `"OpenAI"`
- **THEN** SHALL 校验通过

#### Scenario: 含非法字符

- **WHEN** 传入含 `-`、`.`、`/`、空格、中文等非 `[a-zA-Z0-9_]` 字符的 ID
- **THEN** SHALL 返回错误

#### Scenario: 空字符串或过长

- **WHEN** 传入空字符串
- **THEN** SHALL 返回错误
- **WHEN** 传入超过 64 个字符的 ID
- **THEN** SHALL 返回错误

### Requirement: 校验统一模型 ID

系统 SHALL 提供 `IsValidUnifiedModelID` 函数，判断字符串是否为合法的统一模型 ID 格式。

#### Scenario: 合法 ID

- **WHEN** 传入 `"openai/gpt-4"`
- **THEN** SHALL 返回 `true`

#### Scenario: 非法 ID

- **WHEN** 传入不含 `/` 的字符串、空字符串、providerID 不符合 `[a-zA-Z0-9_]+` 的字符串
- **THEN** SHALL 返回 `false`
