feat(go): Add DeepSeek models and Gitee alias metadata tests (#15885)

This PR expands conf/all_models.json with DeepSeek model entries and
provider aliases.

Changes:

- Added DeepSeek model entries across `V4`, `V3.2`, `V3.1`, `V3`, `R1`,
`Coder`, `Math`, `VL`, `OCR`, `Prover`, `MoE`, and `LLM` series.
- Normalized model name values to lowercase canonical IDs.
- Added alias values for official DeepSeek/Hugging Face names and
provider-specific names from OpenRouter, VolcEngine, SiliconFlow,
HuaweiCloud, and QiniuCloud.
- Preserved model metadata such as max_tokens, model_types, and thinking
where applicable.
- Added Gitee ListModels tests to verify DeepSeek aliases map back to
model metadata from all_models.json.
- Added an optional Gitee integration test gated by
GITEE_LIST_MODELS_INTEGRATION=1.

Test:

/usr/local/go/bin/go clean -cache
/usr/local/go/bin/go test ./internal/entity/models -run
'TestGiteeListModels(MapsAllDeepSeekAliasesToModelMetadata|KeepsOwnedBySuffixAfterAliasMetadataLookup|
Integration)'
This commit is contained in:
Hz_
2026-06-10 13:59:23 +08:00
committed by GitHub
parent 093eec3105
commit 38755c705a
2 changed files with 1064 additions and 4 deletions

View File

@@ -2,6 +2,14 @@
"models": [
{
"name": "deepseek-v4-flash",
"alias": [
"deepseek-v4-flash",
"deepseek-chat",
"deepseek-ai/DeepSeek-V4-Flash",
"deepseek-ai/deepseek-v4-flash",
"deepseek/deepseek-v4-flash",
"deepseek-v4-flash-260425"
],
"max_tokens": 1048576,
"model_types": [
"chat"
@@ -11,8 +19,28 @@
"clear_thinking": true
}
},
{
"name": "deepseek-v4-flash-base",
"alias": [
"deepseek-v4-flash-base",
"deepseek/deepseek-v4-flash-base",
"deepseek-ai/DeepSeek-V4-Flash-Base",
"deepseek-ai/deepseek-v4-flash-base"
],
"max_tokens": 1048576,
"model_types": [
"chat"
]
},
{
"name": "deepseek-v4-pro",
"alias": [
"deepseek-v4-pro",
"deepseek-ai/DeepSeek-V4-Pro",
"deepseek-ai/deepseek-v4-pro",
"deepseek/deepseek-v4-pro",
"deepseek-v4-pro-260425"
],
"max_tokens": 1048576,
"model_types": [
"chat"
@@ -22,6 +50,814 @@
"clear_thinking": true
}
},
{
"name": "deepseek-v4-pro-base",
"alias": [
"deepseek-v4-pro-base",
"deepseek/deepseek-v4-pro-base",
"deepseek-ai/DeepSeek-V4-Pro-Base",
"deepseek-ai/deepseek-v4-pro-base"
],
"max_tokens": 1048576,
"model_types": [
"chat"
]
},
{
"name": "deepseek-ocr-2",
"alias": [
"deepseek-ocr-2",
"deepseek-ai/DeepSeek-OCR-2",
"deepseek-ai/deepseek-ocr-2"
],
"max_tokens": 8192,
"model_types": [
"ocr"
]
},
{
"name": "deepseek-v3.2",
"alias": [
"deepseek-v3.2",
"deepseek-ai/DeepSeek-V3.2",
"deepseek-ai/deepseek-v3.2",
"deepseek/deepseek-v3.2",
"Pro/deepseek-ai/DeepSeek-V3.2",
"deepseek/deepseek-v3.2-251201",
"deepseek-v3-2-251201"
],
"max_tokens": 163840,
"model_types": [
"chat"
]
},
{
"name": "deepseek-v3.2-speciale",
"alias": [
"deepseek-v3.2-speciale",
"deepseek-ai/DeepSeek-V3.2-Speciale",
"deepseek-ai/deepseek-v3.2-speciale"
],
"max_tokens": 163840,
"model_types": [
"chat"
]
},
{
"name": "deepseek-math-v2",
"alias": [
"deepseek-math-v2",
"deepseek-ai/DeepSeek-Math-V2",
"deepseek-ai/deepseek-math-v2",
"deepseek/deepseek-math-v2"
],
"max_tokens": 163840,
"model_types": [
"chat"
]
},
{
"name": "deepseek-ocr",
"alias": [
"deepseek-ocr",
"deepseek-ai/DeepSeek-OCR",
"deepseek-ai/deepseek-ocr"
],
"max_tokens": 8192,
"model_types": [
"ocr"
]
},
{
"name": "deepseek-v3.2-exp",
"alias": [
"deepseek-v3.2-exp",
"deepseek-ai/DeepSeek-V3.2-Exp",
"deepseek-ai/deepseek-v3.2-exp",
"deepseek/deepseek-v3.2-exp",
"deepseek/deepseek-v3.2-exp-thinking"
],
"max_tokens": 163840,
"model_types": [
"chat"
]
},
{
"name": "deepseek-v3.2-exp-base",
"alias": [
"deepseek-v3.2-exp-base",
"deepseek-ai/DeepSeek-V3.2-Exp-Base",
"deepseek-ai/deepseek-v3.2-exp-base"
],
"max_tokens": 163840,
"model_types": [
"chat"
]
},
{
"name": "deepseek-v3.1-terminus",
"alias": [
"deepseek-v3.1-terminus",
"deepseek-ai/DeepSeek-V3.1-Terminus",
"deepseek-ai/deepseek-v3.1-terminus",
"deepseek/deepseek-v3.1-terminus",
"Pro/deepseek-ai/DeepSeek-V3.1-Terminus",
"deepseek/deepseek-v3.1-terminus-thinking"
],
"max_tokens": 163840,
"model_types": [
"chat"
]
},
{
"name": "deepseek-v3.1",
"alias": [
"deepseek-v3.1",
"deepseek-ai/DeepSeek-V3.1",
"deepseek-ai/deepseek-v3.1",
"deepseek/deepseek-chat-v3.1",
"deepseek-v3-1-250821"
],
"max_tokens": 163840,
"model_types": [
"chat"
]
},
{
"name": "deepseek-v3.1-base",
"alias": [
"deepseek-v3.1-base",
"deepseek-ai/DeepSeek-V3.1-Base",
"deepseek-ai/deepseek-v3.1-base"
],
"max_tokens": 163840,
"model_types": [
"chat"
]
},
{
"name": "deepseek-r1-0528-qwen3-8b",
"alias": [
"deepseek-r1-0528-qwen3-8b",
"deepseek-ai/DeepSeek-R1-0528-Qwen3-8B",
"deepseek-ai/deepseek-r1-0528-qwen3-8b"
],
"max_tokens": 131072,
"model_types": [
"chat"
]
},
{
"name": "deepseek-r1-0528",
"alias": [
"deepseek-r1-0528",
"deepseek-ai/DeepSeek-R1-0528",
"deepseek-ai/deepseek-r1-0528",
"deepseek/deepseek-r1-0528",
"deepseek-r1-250528",
"Pro/deepseek-ai/DeepSeek-R1"
],
"max_tokens": 163840,
"model_types": [
"chat"
]
},
{
"name": "deepseek-prover-v2-671b",
"alias": [
"deepseek-prover-v2-671b",
"deepseek-ai/DeepSeek-Prover-V2-671B",
"deepseek-ai/deepseek-prover-v2-671b"
],
"max_tokens": 163840,
"model_types": [
"chat"
]
},
{
"name": "deepseek-prover-v2-7b",
"alias": [
"deepseek-prover-v2-7b",
"deepseek-ai/DeepSeek-Prover-V2-7B",
"deepseek-ai/deepseek-prover-v2-7b"
],
"max_tokens": 32768,
"model_types": [
"chat"
]
},
{
"name": "deepseek-v3-0324",
"alias": [
"deepseek-v3-0324",
"deepseek-ai/DeepSeek-V3-0324",
"deepseek-ai/deepseek-v3-0324",
"deepseek/deepseek-chat-v3-0324",
"deepseek-v3-250324",
"Pro/deepseek-ai/DeepSeek-V3"
],
"max_tokens": 163840,
"model_types": [
"chat"
]
},
{
"name": "deepseek-r1",
"alias": [
"deepseek-r1",
"deepseek-ai/DeepSeek-R1",
"deepseek-ai/deepseek-r1",
"deepseek/deepseek-r1",
"DeepSeek-R1",
"deepseek-r1-250120",
"deepseek-r1_32k"
],
"max_tokens": 163840,
"model_types": [
"chat"
]
},
{
"name": "deepseek-r1-distill-llama-70b",
"alias": [
"deepseek-r1-distill-llama-70b",
"deepseek-ai/DeepSeek-R1-Distill-Llama-70B",
"deepseek-ai/deepseek-r1-distill-llama-70b",
"deepseek/deepseek-r1-distill-llama-70b"
],
"max_tokens": 131072,
"model_types": [
"chat"
]
},
{
"name": "deepseek-r1-distill-llama-8b",
"alias": [
"deepseek-r1-distill-llama-8b",
"deepseek-ai/DeepSeek-R1-Distill-Llama-8B",
"deepseek-ai/deepseek-r1-distill-llama-8b"
],
"max_tokens": 131072,
"model_types": [
"chat"
]
},
{
"name": "deepseek-r1-distill-qwen-1.5b",
"alias": [
"deepseek-r1-distill-qwen-1.5b",
"deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B",
"deepseek-ai/deepseek-r1-distill-qwen-1.5b"
],
"max_tokens": 131072,
"model_types": [
"chat"
]
},
{
"name": "deepseek-r1-distill-qwen-14b",
"alias": [
"deepseek-r1-distill-qwen-14b",
"deepseek-ai/DeepSeek-R1-Distill-Qwen-14B",
"deepseek-ai/deepseek-r1-distill-qwen-14b"
],
"max_tokens": 131072,
"model_types": [
"chat"
]
},
{
"name": "deepseek-r1-distill-qwen-32b",
"alias": [
"deepseek-r1-distill-qwen-32b",
"deepseek-ai/DeepSeek-R1-Distill-Qwen-32B",
"deepseek-ai/deepseek-r1-distill-qwen-32b",
"deepseek/deepseek-r1-distill-qwen-32b",
"deepseek-r1-distill-qwen-32b-250120"
],
"max_tokens": 131072,
"model_types": [
"chat"
]
},
{
"name": "deepseek-r1-distill-qwen-7b",
"alias": [
"deepseek-r1-distill-qwen-7b",
"deepseek-ai/DeepSeek-R1-Distill-Qwen-7B",
"deepseek-ai/deepseek-r1-distill-qwen-7b",
"deepseek-r1-distill-qwen-7b-250120"
],
"max_tokens": 131072,
"model_types": [
"chat"
]
},
{
"name": "deepseek-r1-zero",
"alias": [
"deepseek-r1-zero",
"deepseek-ai/DeepSeek-R1-Zero",
"deepseek-ai/deepseek-r1-zero"
],
"max_tokens": 163840,
"model_types": [
"chat"
]
},
{
"name": "deepseek-v3",
"alias": [
"deepseek-v3",
"deepseek-ai/DeepSeek-V3",
"deepseek-ai/deepseek-v3",
"deepseek/deepseek-chat",
"DeepSeek-V3"
],
"max_tokens": 163840,
"model_types": [
"chat"
]
},
{
"name": "deepseek-v3-base",
"alias": [
"deepseek-v3-base",
"deepseek-ai/DeepSeek-V3-Base",
"deepseek-ai/deepseek-v3-base"
],
"max_tokens": 163840,
"model_types": [
"chat"
]
},
{
"name": "deepseek-vl2",
"alias": [
"deepseek-vl2",
"deepseek-ai/deepseek-vl2"
],
"max_tokens": 4096,
"model_types": [
"image2text"
]
},
{
"name": "deepseek-vl2-small",
"alias": [
"deepseek-vl2-small",
"deepseek-ai/deepseek-vl2-small"
],
"max_tokens": 4096,
"model_types": [
"image2text"
]
},
{
"name": "deepseek-vl2-tiny",
"alias": [
"deepseek-vl2-tiny",
"deepseek-ai/deepseek-vl2-tiny"
],
"max_tokens": 4096,
"model_types": [
"image2text"
]
},
{
"name": "deepseek-v2.5-1210",
"alias": [
"deepseek-v2.5-1210",
"deepseek-ai/DeepSeek-V2.5-1210",
"deepseek-ai/deepseek-v2.5-1210"
],
"max_tokens": 163840,
"model_types": [
"chat"
]
},
{
"name": "deepseek-coder-v2-instruct-0724",
"alias": [
"deepseek-coder-v2-instruct-0724",
"deepseek-ai/DeepSeek-Coder-V2-Instruct-0724",
"deepseek-ai/deepseek-coder-v2-instruct-0724"
],
"max_tokens": 163840,
"model_types": [
"chat"
]
},
{
"name": "deepseek-v2.5",
"alias": [
"deepseek-v2.5",
"deepseek-ai/DeepSeek-V2.5",
"deepseek-ai/deepseek-v2.5"
],
"max_tokens": 163840,
"model_types": [
"chat"
]
},
{
"name": "deepseek-prover-v1",
"alias": [
"deepseek-prover-v1",
"deepseek-ai/DeepSeek-Prover-V1",
"deepseek-ai/deepseek-prover-v1"
],
"max_tokens": 4096,
"model_types": [
"chat"
]
},
{
"name": "deepseek-prover-v1.5-base",
"alias": [
"deepseek-prover-v1.5-base",
"deepseek-ai/DeepSeek-Prover-V1.5-Base",
"deepseek-ai/deepseek-prover-v1.5-base"
],
"max_tokens": 4096,
"model_types": [
"chat"
]
},
{
"name": "deepseek-prover-v1.5-rl",
"alias": [
"deepseek-prover-v1.5-rl",
"deepseek-ai/DeepSeek-Prover-V1.5-RL",
"deepseek-ai/deepseek-prover-v1.5-rl"
],
"max_tokens": 4096,
"model_types": [
"chat"
]
},
{
"name": "deepseek-prover-v1.5-sft",
"alias": [
"deepseek-prover-v1.5-sft",
"deepseek-ai/DeepSeek-Prover-V1.5-SFT",
"deepseek-ai/deepseek-prover-v1.5-sft"
],
"max_tokens": 4096,
"model_types": [
"chat"
]
},
{
"name": "deepseek-v2-chat-0628",
"alias": [
"deepseek-v2-chat-0628",
"deepseek-ai/DeepSeek-V2-Chat-0628",
"deepseek-ai/deepseek-v2-chat-0628"
],
"max_tokens": 163840,
"model_types": [
"chat"
]
},
{
"name": "deepseek-coder-v2-base",
"alias": [
"deepseek-coder-v2-base",
"deepseek-ai/DeepSeek-Coder-V2-Base",
"deepseek-ai/deepseek-coder-v2-base"
],
"max_tokens": 163840,
"model_types": [
"chat"
]
},
{
"name": "deepseek-coder-v2-instruct",
"alias": [
"deepseek-coder-v2-instruct",
"deepseek-ai/DeepSeek-Coder-V2-Instruct",
"deepseek-ai/deepseek-coder-v2-instruct"
],
"max_tokens": 163840,
"model_types": [
"chat"
]
},
{
"name": "deepseek-coder-v2-lite-base",
"alias": [
"deepseek-coder-v2-lite-base",
"deepseek-ai/DeepSeek-Coder-V2-Lite-Base",
"deepseek-ai/deepseek-coder-v2-lite-base"
],
"max_tokens": 163840,
"model_types": [
"chat"
]
},
{
"name": "deepseek-coder-v2-lite-instruct",
"alias": [
"deepseek-coder-v2-lite-instruct",
"deepseek-ai/DeepSeek-Coder-V2-Lite-Instruct",
"deepseek-ai/deepseek-coder-v2-lite-instruct"
],
"max_tokens": 163840,
"model_types": [
"chat"
]
},
{
"name": "deepseek-v2-lite",
"alias": [
"deepseek-v2-lite",
"deepseek-ai/DeepSeek-V2-Lite",
"deepseek-ai/deepseek-v2-lite"
],
"max_tokens": 163840,
"model_types": [
"chat"
]
},
{
"name": "deepseek-v2-lite-chat",
"alias": [
"deepseek-v2-lite-chat",
"deepseek-ai/DeepSeek-V2-Lite-Chat",
"deepseek-ai/deepseek-v2-lite-chat"
],
"max_tokens": 163840,
"model_types": [
"chat"
]
},
{
"name": "deepseek-v2-chat",
"alias": [
"deepseek-v2-chat",
"deepseek-ai/DeepSeek-V2-Chat",
"deepseek-ai/deepseek-v2-chat"
],
"max_tokens": 163840,
"model_types": [
"chat"
]
},
{
"name": "deepseek-v2",
"alias": [
"deepseek-v2",
"deepseek-ai/DeepSeek-V2",
"deepseek-ai/deepseek-v2"
],
"max_tokens": 163840,
"model_types": [
"chat"
]
},
{
"name": "deepseek-vl-1.3b-base",
"alias": [
"deepseek-vl-1.3b-base",
"deepseek-ai/deepseek-vl-1.3b-base"
],
"max_tokens": 16384,
"model_types": [
"image2text"
]
},
{
"name": "deepseek-vl-1.3b-chat",
"alias": [
"deepseek-vl-1.3b-chat",
"deepseek-ai/deepseek-vl-1.3b-chat"
],
"max_tokens": 16384,
"model_types": [
"image2text"
]
},
{
"name": "deepseek-vl-7b-base",
"alias": [
"deepseek-vl-7b-base",
"deepseek-ai/deepseek-vl-7b-base"
],
"max_tokens": 16384,
"model_types": [
"image2text"
]
},
{
"name": "deepseek-vl-7b-chat",
"alias": [
"deepseek-vl-7b-chat",
"deepseek-ai/deepseek-vl-7b-chat"
],
"max_tokens": 16384,
"model_types": [
"image2text"
]
},
{
"name": "deepseek-math-7b-base",
"alias": [
"deepseek-math-7b-base",
"deepseek-ai/deepseek-math-7b-base"
],
"max_tokens": 4096,
"model_types": [
"chat"
]
},
{
"name": "deepseek-math-7b-instruct",
"alias": [
"deepseek-math-7b-instruct",
"deepseek-ai/deepseek-math-7b-instruct"
],
"max_tokens": 4096,
"model_types": [
"chat"
]
},
{
"name": "deepseek-math-7b-rl",
"alias": [
"deepseek-math-7b-rl",
"deepseek-ai/deepseek-math-7b-rl"
],
"max_tokens": 4096,
"model_types": [
"chat"
]
},
{
"name": "deepseek-coder-7b-base-v1.5",
"alias": [
"deepseek-coder-7b-base-v1.5",
"deepseek-ai/deepseek-coder-7b-base-v1.5"
],
"max_tokens": 4096,
"model_types": [
"chat"
]
},
{
"name": "deepseek-coder-7b-instruct-v1.5",
"alias": [
"deepseek-coder-7b-instruct-v1.5",
"deepseek-ai/deepseek-coder-7b-instruct-v1.5"
],
"max_tokens": 4096,
"model_types": [
"chat"
]
},
{
"name": "deepseek-moe-16b-chat",
"alias": [
"deepseek-moe-16b-chat",
"deepseek-ai/deepseek-moe-16b-chat"
],
"max_tokens": 4096,
"model_types": [
"chat"
]
},
{
"name": "deepseek-moe-16b-base",
"alias": [
"deepseek-moe-16b-base",
"deepseek-ai/deepseek-moe-16b-base"
],
"max_tokens": 4096,
"model_types": [
"chat"
]
},
{
"name": "deepseek-llm-67b-base",
"alias": [
"deepseek-llm-67b-base",
"deepseek-ai/deepseek-llm-67b-base"
],
"max_tokens": 4096,
"model_types": [
"chat"
]
},
{
"name": "deepseek-llm-67b-chat",
"alias": [
"deepseek-llm-67b-chat",
"deepseek-ai/deepseek-llm-67b-chat"
],
"max_tokens": 4096,
"model_types": [
"chat"
]
},
{
"name": "deepseek-llm-7b-base",
"alias": [
"deepseek-llm-7b-base",
"deepseek-ai/deepseek-llm-7b-base"
],
"max_tokens": 4096,
"model_types": [
"chat"
]
},
{
"name": "deepseek-llm-7b-chat",
"alias": [
"deepseek-llm-7b-chat",
"deepseek-ai/deepseek-llm-7b-chat"
],
"max_tokens": 4096,
"model_types": [
"chat"
]
},
{
"name": "deepseek-coder-33b-instruct",
"alias": [
"deepseek-coder-33b-instruct",
"deepseek-ai/deepseek-coder-33b-instruct"
],
"max_tokens": 16384,
"model_types": [
"chat"
]
},
{
"name": "deepseek-coder-5.7bmqa-base",
"alias": [
"deepseek-coder-5.7bmqa-base",
"deepseek-ai/deepseek-coder-5.7bmqa-base"
],
"max_tokens": 16384,
"model_types": [
"chat"
]
},
{
"name": "deepseek-coder-1.3b-instruct",
"alias": [
"deepseek-coder-1.3b-instruct",
"deepseek-ai/deepseek-coder-1.3b-instruct"
],
"max_tokens": 16384,
"model_types": [
"chat"
]
},
{
"name": "deepseek-coder-6.7b-instruct",
"alias": [
"deepseek-coder-6.7b-instruct",
"deepseek-ai/deepseek-coder-6.7b-instruct"
],
"max_tokens": 16384,
"model_types": [
"chat"
]
},
{
"name": "deepseek-coder-1.3b-base",
"alias": [
"deepseek-coder-1.3b-base",
"deepseek-ai/deepseek-coder-1.3b-base"
],
"max_tokens": 16384,
"model_types": [
"chat"
]
},
{
"name": "deepseek-coder-33b-base",
"alias": [
"deepseek-coder-33b-base",
"deepseek-ai/deepseek-coder-33b-base"
],
"max_tokens": 16384,
"model_types": [
"chat"
]
},
{
"name": "deepseek-coder-6.7b-base",
"alias": [
"deepseek-coder-6.7b-base",
"deepseek-ai/deepseek-coder-6.7b-base"
],
"max_tokens": 16384,
"model_types": [
"chat"
]
},
{
"name": "minimax-m3",
"max_tokens": 1024000,
@@ -46,7 +882,9 @@
},
{
"name": "bge-m3",
"alias": ["baai/bge-m3"],
"alias": [
"baai/bge-m3"
],
"max_tokens": 8192,
"model_types": [
"embedding"
@@ -54,7 +892,9 @@
},
{
"name": "bge-reranker-v2-m3",
"alias": ["baai/bge-reranker-v2-m3"],
"alias": [
"baai/bge-reranker-v2-m3"
],
"max_tokens": 1024,
"model_types": [
"rerank"
@@ -68,14 +908,18 @@
},
{
"name": "qwen3-asr-1.7b",
"alias": ["qwen/qwen3-asr-1.7b"],
"alias": [
"qwen/qwen3-asr-1.7b"
],
"model_types": [
"asr"
]
},
{
"name": "paddleocr-vl-0.9b",
"alias": ["paddleocr-vl-1.5"],
"alias": [
"paddleocr-vl-1.5"
],
"model_types": [
"ocr"
]

View File

@@ -0,0 +1,216 @@
//
// Copyright 2026 The InfiniFlow Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
package models
import (
"encoding/json"
"fmt"
"io"
"net/http"
"net/http/httptest"
"os"
"path/filepath"
"sort"
"strings"
"testing"
)
func initProviderManagerWithGiteeForTest(t *testing.T) {
t.Helper()
dir := t.TempDir()
if err := os.WriteFile(filepath.Join(dir, "gitee.json"), readProviderConfig(t, "gitee.json"), 0o600); err != nil {
t.Fatalf("write gitee config: %v", err)
}
if err := InitProviderManager(dir); err != nil {
t.Fatalf("InitProviderManager: %v", err)
}
}
func newGiteeForListModelsTest(baseURL string) *GiteeModel {
return NewGiteeModel(map[string]string{"default": baseURL}, URLSuffix{Models: "models"})
}
func deepSeekAliasModelsForTest(t *testing.T) map[string]Model {
t.Helper()
pm := GetProviderManager()
if pm == nil {
t.Fatal("provider manager is nil")
}
aliasModels := map[string]Model{}
for _, model := range pm.AllModels {
if !strings.HasPrefix(model.Name, "deepseek-") {
continue
}
for _, alias := range model.Alias {
if alias == "" {
continue
}
if existing, ok := aliasModels[alias]; ok {
t.Fatalf("duplicate DeepSeek alias %q for %q and %q", alias, existing.Name, model.Name)
}
aliasModels[alias] = model
}
}
if len(aliasModels) == 0 {
t.Fatal("no DeepSeek aliases found in all_models.json")
}
return aliasModels
}
func TestGiteeListModelsMapsAllDeepSeekAliasesToModelMetadata(t *testing.T) {
initProviderManagerWithGiteeForTest(t)
aliasModels := deepSeekAliasModelsForTest(t)
aliases := make([]string, 0, len(aliasModels))
for alias := range aliasModels {
aliases = append(aliases, alias)
}
sort.Strings(aliases)
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodGet {
t.Errorf("method=%s, want GET", r.Method)
}
if r.URL.Path != "/models" {
t.Errorf("path=%s, want /models", r.URL.Path)
}
if got := r.Header.Get("Content-Type"); got != "application/json" {
t.Errorf("Content-Type=%q, want application/json", got)
}
resp := DSModelList{
Object: "list",
Models: make([]DSModel, 0, len(aliases)+1),
}
for _, alias := range aliases {
resp.Models = append(resp.Models, DSModel{ID: alias})
}
resp.Models = append(resp.Models, DSModel{ID: "unknown-model"})
w.Header().Set("Content-Type", "application/json")
if err := json.NewEncoder(w).Encode(resp); err != nil {
t.Fatalf("encode response: %v", err)
}
}))
defer srv.Close()
models, err := newGiteeForListModelsTest(srv.URL).ListModels(&APIConfig{})
if err != nil {
t.Fatalf("ListModels: %v", err)
}
if got, want := len(models), len(aliases)+1; got != want {
t.Fatalf("len(models)=%d, want %d", got, want)
}
for i, alias := range aliases {
model := models[i]
expected := aliasModels[alias]
if model.Name != alias {
t.Fatalf("models[%d].Name=%q, want %q", i, model.Name, alias)
}
if (model.MaxTokens == nil) != (expected.MaxTokens == nil) {
t.Fatalf("models[%d] alias %q MaxTokens nil=%t, want nil=%t", i, alias, model.MaxTokens == nil, expected.MaxTokens == nil)
}
if model.MaxTokens != nil && expected.MaxTokens != nil && *model.MaxTokens != *expected.MaxTokens {
t.Fatalf("models[%d] alias %q MaxTokens=%d, want %d", i, alias, *model.MaxTokens, *expected.MaxTokens)
}
if strings.Join(model.ModelTypes, ",") != strings.Join(expected.ModelTypes, ",") {
t.Fatalf("models[%d] alias %q ModelTypes=%v, want %v", i, alias, model.ModelTypes, expected.ModelTypes)
}
if (model.Thinking == nil) != (expected.Thinking == nil) {
t.Fatalf("models[%d] alias %q Thinking nil=%t, want nil=%t", i, alias, model.Thinking == nil, expected.Thinking == nil)
}
}
unknown := models[len(models)-1]
if unknown.Name != "unknown-model" {
t.Fatalf("unknown.Name=%q, want unknown-model", unknown.Name)
}
if unknown.MaxTokens != nil {
t.Fatalf("unknown.MaxTokens=%v, want nil", *unknown.MaxTokens)
}
if len(unknown.ModelTypes) != 0 {
t.Fatalf("unknown.ModelTypes=%v, want empty", unknown.ModelTypes)
}
}
func TestGiteeListModelsKeepsOwnedBySuffixAfterAliasMetadataLookup(t *testing.T) {
initProviderManagerWithGiteeForTest(t)
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
_, _ = io.WriteString(w, `{"object":"list","data":[{"id":"deepseek/deepseek-v4-pro","owned_by":"gitee"}]}`)
}))
defer srv.Close()
models, err := newGiteeForListModelsTest(srv.URL).ListModels(&APIConfig{})
if err != nil {
t.Fatalf("ListModels: %v", err)
}
if len(models) != 1 {
t.Fatalf("len(models)=%d, want 1", len(models))
}
model := models[0]
if model.Name != "deepseek/deepseek-v4-pro@gitee" {
t.Fatalf("Name=%q, want deepseek/deepseek-v4-pro@gitee", model.Name)
}
if model.MaxTokens == nil || *model.MaxTokens != 1048576 {
t.Fatalf("MaxTokens=%v, want 1048576", model.MaxTokens)
}
if len(model.ModelTypes) != 1 || model.ModelTypes[0] != "chat" {
t.Fatalf("ModelTypes=%v, want [chat]", model.ModelTypes)
}
if model.Thinking == nil {
t.Fatal("Thinking=nil, want DeepSeek V4 Pro thinking metadata")
}
}
func TestGiteeListModelsIntegration(t *testing.T) {
if os.Getenv("GITEE_LIST_MODELS_INTEGRATION") != "1" {
t.Skip("set GITEE_LIST_MODELS_INTEGRATION=1 to call the real Gitee models endpoint")
}
initProviderManagerWithGiteeForTest(t)
baseURL := os.Getenv("GITEE_BASE_URL")
if baseURL == "" {
baseURL = "https://api.moark.ai/v1"
}
apiConfig := &APIConfig{}
if apiKey := os.Getenv("GITEE_API_KEY"); apiKey != "" {
apiConfig.ApiKey = &apiKey
}
models, err := newGiteeForListModelsTest(baseURL).ListModels(apiConfig)
if err != nil {
t.Fatalf("real Gitee ListModels: %v", err)
}
if len(models) == 0 {
t.Fatal("real Gitee ListModels returned no models")
}
var matchedDeepSeek int
for _, model := range models {
if strings.Contains(strings.ToLower(model.Name), "deepseek") && len(model.ModelTypes) > 0 {
matchedDeepSeek++
}
}
if matchedDeepSeek == 0 {
t.Fatalf("real Gitee ListModels returned %d models but none of the DeepSeek models mapped to all_models metadata: %s", len(models), fmt.Sprint(models))
}
}