whosellm 0.2.6__tar.gz → 0.2.7__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of whosellm might be problematic. Click here for more details.

Files changed (122) hide show
  1. {whosellm-0.2.6 → whosellm-0.2.7}/.bumpversion.toml +1 -1
  2. {whosellm-0.2.6 → whosellm-0.2.7}/PKG-INFO +1 -1
  3. {whosellm-0.2.6 → whosellm-0.2.7}/pyproject.toml +1 -1
  4. {whosellm-0.2.6 → whosellm-0.2.7}/tests/models/families/test_deepseek.py +35 -0
  5. {whosellm-0.2.6 → whosellm-0.2.7}/tests/test_variant_priority_config.py +2 -0
  6. {whosellm-0.2.6 → whosellm-0.2.7}/uv.lock +1 -1
  7. {whosellm-0.2.6 → whosellm-0.2.7}/whosellm/__init__.py +1 -1
  8. {whosellm-0.2.6 → whosellm-0.2.7}/whosellm/models/families/deepseek/deepseek_official.py +29 -4
  9. {whosellm-0.2.6 → whosellm-0.2.7}/.claude/commands/interview.md +0 -0
  10. {whosellm-0.2.6 → whosellm-0.2.7}/.claude/projects/-Users-jqq-PycharmProjects-llmeta/memory/MEMORY.md +0 -0
  11. {whosellm-0.2.6 → whosellm-0.2.7}/.claude/projects/-Users-jqq-PycharmProjects-llmeta/memory/feedback_use_uv.md +0 -0
  12. {whosellm-0.2.6 → whosellm-0.2.7}/.claude/settings.json +0 -0
  13. {whosellm-0.2.6 → whosellm-0.2.7}/.claude/skills/code-review/SKILL.md +0 -0
  14. {whosellm-0.2.6 → whosellm-0.2.7}/.claude/skills/create-skill/SKILL.md +0 -0
  15. {whosellm-0.2.6 → whosellm-0.2.7}/.claude/skills/e2e-metadata/SKILL.md +0 -0
  16. {whosellm-0.2.6 → whosellm-0.2.7}/.claude/skills/evolve/SKILL.md +0 -0
  17. {whosellm-0.2.6 → whosellm-0.2.7}/.claude/skills/fix-review/SKILL.md +0 -0
  18. {whosellm-0.2.6 → whosellm-0.2.7}/.claude/skills/release/SKILL.md +0 -0
  19. {whosellm-0.2.6 → whosellm-0.2.7}/.claude/skills/review-provider-model/SKILL.md +0 -0
  20. {whosellm-0.2.6 → whosellm-0.2.7}/.claude/skills/review-provider-model/providers/alibaba.md +0 -0
  21. {whosellm-0.2.6 → whosellm-0.2.7}/.claude/skills/review-provider-model/providers/anthropic.md +0 -0
  22. {whosellm-0.2.6 → whosellm-0.2.7}/.claude/skills/review-provider-model/providers/deepseek.md +0 -0
  23. {whosellm-0.2.6 → whosellm-0.2.7}/.claude/skills/review-provider-model/providers/gemini.md +0 -0
  24. {whosellm-0.2.6 → whosellm-0.2.7}/.claude/skills/review-provider-model/providers/openai.md +0 -0
  25. {whosellm-0.2.6 → whosellm-0.2.7}/.claude/skills/review-provider-model/providers/others.md +0 -0
  26. {whosellm-0.2.6 → whosellm-0.2.7}/.claude/skills/review-provider-model/providers/vidu.md +0 -0
  27. {whosellm-0.2.6 → whosellm-0.2.7}/.claude/skills/review-provider-model/providers/zhipu.md +0 -0
  28. {whosellm-0.2.6 → whosellm-0.2.7}/.claude/skills/update-provider-model/SKILL.md +0 -0
  29. {whosellm-0.2.6 → whosellm-0.2.7}/.claude/skills/update-provider-model/testing.md +0 -0
  30. {whosellm-0.2.6 → whosellm-0.2.7}/.coveragerc +0 -0
  31. {whosellm-0.2.6 → whosellm-0.2.7}/.github/workflows/publish.yml +0 -0
  32. {whosellm-0.2.6 → whosellm-0.2.7}/.github/workflows/tests.yml +0 -0
  33. {whosellm-0.2.6 → whosellm-0.2.7}/.gitignore +0 -0
  34. {whosellm-0.2.6 → whosellm-0.2.7}/.windsurf/workflows/addmodel.md +0 -0
  35. {whosellm-0.2.6 → whosellm-0.2.7}/.windsurf/workflows/arch.md +0 -0
  36. {whosellm-0.2.6 → whosellm-0.2.7}/.windsurf/workflows/testllmeta.md +0 -0
  37. {whosellm-0.2.6 → whosellm-0.2.7}/CHANGELOG.md +0 -0
  38. {whosellm-0.2.6 → whosellm-0.2.7}/CLAUDE.md +0 -0
  39. {whosellm-0.2.6 → whosellm-0.2.7}/LICENSE +0 -0
  40. {whosellm-0.2.6 → whosellm-0.2.7}/README.md +0 -0
  41. {whosellm-0.2.6 → whosellm-0.2.7}/docs/add_new_model_family.md +0 -0
  42. {whosellm-0.2.6 → whosellm-0.2.7}/docs/refactor_proposal.md +0 -0
  43. {whosellm-0.2.6 → whosellm-0.2.7}/docs/spec_model_family_redesign.md +0 -0
  44. {whosellm-0.2.6 → whosellm-0.2.7}/examples/advanced_usage.py +0 -0
  45. {whosellm-0.2.6 → whosellm-0.2.7}/examples/basic_usage.py +0 -0
  46. {whosellm-0.2.6 → whosellm-0.2.7}/mypy.ini +0 -0
  47. {whosellm-0.2.6 → whosellm-0.2.7}/pytest.ini +0 -0
  48. {whosellm-0.2.6 → whosellm-0.2.7}/ruff.toml +0 -0
  49. {whosellm-0.2.6 → whosellm-0.2.7}/tests/__init__.py +0 -0
  50. {whosellm-0.2.6 → whosellm-0.2.7}/tests/e2e/__init__.py +0 -0
  51. {whosellm-0.2.6 → whosellm-0.2.7}/tests/e2e/conftest.py +0 -0
  52. {whosellm-0.2.6 → whosellm-0.2.7}/tests/e2e/test_anthropic.py +0 -0
  53. {whosellm-0.2.6 → whosellm-0.2.7}/tests/e2e/test_google.py +0 -0
  54. {whosellm-0.2.6 → whosellm-0.2.7}/tests/e2e/test_openai.py +0 -0
  55. {whosellm-0.2.6 → whosellm-0.2.7}/tests/e2e/test_zhipu.py +0 -0
  56. {whosellm-0.2.6 → whosellm-0.2.7}/tests/models/__init__.py +0 -0
  57. {whosellm-0.2.6 → whosellm-0.2.7}/tests/models/families/__init__.py +0 -0
  58. {whosellm-0.2.6 → whosellm-0.2.7}/tests/models/families/test_anthropic.py +0 -0
  59. {whosellm-0.2.6 → whosellm-0.2.7}/tests/models/families/test_deepseek_tencent.py +0 -0
  60. {whosellm-0.2.6 → whosellm-0.2.7}/tests/models/families/test_gemini.py +0 -0
  61. {whosellm-0.2.6 → whosellm-0.2.7}/tests/models/families/test_glm41v_thinking.py +0 -0
  62. {whosellm-0.2.6 → whosellm-0.2.7}/tests/models/families/test_glm45.py +0 -0
  63. {whosellm-0.2.6 → whosellm-0.2.7}/tests/models/families/test_glm45v.py +0 -0
  64. {whosellm-0.2.6 → whosellm-0.2.7}/tests/models/families/test_glm46.py +0 -0
  65. {whosellm-0.2.6 → whosellm-0.2.7}/tests/models/families/test_glm46v.py +0 -0
  66. {whosellm-0.2.6 → whosellm-0.2.7}/tests/models/families/test_glm5.py +0 -0
  67. {whosellm-0.2.6 → whosellm-0.2.7}/tests/models/families/test_glm53.py +0 -0
  68. {whosellm-0.2.6 → whosellm-0.2.7}/tests/models/families/test_glm5v_turbo.py +0 -0
  69. {whosellm-0.2.6 → whosellm-0.2.7}/tests/models/families/test_gpt3_5.py +0 -0
  70. {whosellm-0.2.6 → whosellm-0.2.7}/tests/models/families/test_gpt4_1.py +0 -0
  71. {whosellm-0.2.6 → whosellm-0.2.7}/tests/models/families/test_gpt4o.py +0 -0
  72. {whosellm-0.2.6 → whosellm-0.2.7}/tests/models/families/test_gpt5.py +0 -0
  73. {whosellm-0.2.6 → whosellm-0.2.7}/tests/models/families/test_gpt6.py +0 -0
  74. {whosellm-0.2.6 → whosellm-0.2.7}/tests/models/families/test_o1.py +0 -0
  75. {whosellm-0.2.6 → whosellm-0.2.7}/tests/models/families/test_o3.py +0 -0
  76. {whosellm-0.2.6 → whosellm-0.2.7}/tests/models/families/test_o4.py +0 -0
  77. {whosellm-0.2.6 → whosellm-0.2.7}/tests/models/families/test_qwen.py +0 -0
  78. {whosellm-0.2.6 → whosellm-0.2.7}/tests/models/families/test_qwen3_vl_models.py +0 -0
  79. {whosellm-0.2.6 → whosellm-0.2.7}/tests/models/families/test_qwen_ollama.py +0 -0
  80. {whosellm-0.2.6 → whosellm-0.2.7}/tests/models/families/test_qwen_plus.py +0 -0
  81. {whosellm-0.2.6 → whosellm-0.2.7}/tests/test_auto_register.py +0 -0
  82. {whosellm-0.2.6 → whosellm-0.2.7}/tests/test_claude_4x_versions.py +0 -0
  83. {whosellm-0.2.6 → whosellm-0.2.7}/tests/test_llmeta.py +0 -0
  84. {whosellm-0.2.6 → whosellm-0.2.7}/tests/test_model_version.py +0 -0
  85. {whosellm-0.2.6 → whosellm-0.2.7}/tests/test_provider.py +0 -0
  86. {whosellm-0.2.6 → whosellm-0.2.7}/tests/test_registry_merge.py +0 -0
  87. {whosellm-0.2.6 → whosellm-0.2.7}/tests/test_specific_patterns.py +0 -0
  88. {whosellm-0.2.6 → whosellm-0.2.7}/whosellm/capabilities.py +0 -0
  89. {whosellm-0.2.6 → whosellm-0.2.7}/whosellm/model_version.py +0 -0
  90. {whosellm-0.2.6 → whosellm-0.2.7}/whosellm/models/__init__.py +0 -0
  91. {whosellm-0.2.6 → whosellm-0.2.7}/whosellm/models/base.py +0 -0
  92. {whosellm-0.2.6 → whosellm-0.2.7}/whosellm/models/config.py +0 -0
  93. {whosellm-0.2.6 → whosellm-0.2.7}/whosellm/models/dynamic_enum.py +0 -0
  94. {whosellm-0.2.6 → whosellm-0.2.7}/whosellm/models/families/__init__.py +0 -0
  95. {whosellm-0.2.6 → whosellm-0.2.7}/whosellm/models/families/alibaba.py +0 -0
  96. {whosellm-0.2.6 → whosellm-0.2.7}/whosellm/models/families/anthropic.py +0 -0
  97. {whosellm-0.2.6 → whosellm-0.2.7}/whosellm/models/families/deepseek/__init__.py +0 -0
  98. {whosellm-0.2.6 → whosellm-0.2.7}/whosellm/models/families/deepseek/tencent.py +0 -0
  99. {whosellm-0.2.6 → whosellm-0.2.7}/whosellm/models/families/gemini.py +0 -0
  100. {whosellm-0.2.6 → whosellm-0.2.7}/whosellm/models/families/openai/__init__.py +0 -0
  101. {whosellm-0.2.6 → whosellm-0.2.7}/whosellm/models/families/openai/openai_gpt_3_5.py +0 -0
  102. {whosellm-0.2.6 → whosellm-0.2.7}/whosellm/models/families/openai/openai_gpt_4.py +0 -0
  103. {whosellm-0.2.6 → whosellm-0.2.7}/whosellm/models/families/openai/openai_gpt_4_1.py +0 -0
  104. {whosellm-0.2.6 → whosellm-0.2.7}/whosellm/models/families/openai/openai_gpt_4o.py +0 -0
  105. {whosellm-0.2.6 → whosellm-0.2.7}/whosellm/models/families/openai/openai_gpt_5.py +0 -0
  106. {whosellm-0.2.6 → whosellm-0.2.7}/whosellm/models/families/openai/openai_gpt_5_1.py +0 -0
  107. {whosellm-0.2.6 → whosellm-0.2.7}/whosellm/models/families/openai/openai_gpt_5_2.py +0 -0
  108. {whosellm-0.2.6 → whosellm-0.2.7}/whosellm/models/families/openai/openai_gpt_5_3.py +0 -0
  109. {whosellm-0.2.6 → whosellm-0.2.7}/whosellm/models/families/openai/openai_gpt_5_4.py +0 -0
  110. {whosellm-0.2.6 → whosellm-0.2.7}/whosellm/models/families/openai/openai_gpt_5_5.py +0 -0
  111. {whosellm-0.2.6 → whosellm-0.2.7}/whosellm/models/families/openai/openai_gpt_5_6.py +0 -0
  112. {whosellm-0.2.6 → whosellm-0.2.7}/whosellm/models/families/openai/openai_gpt_6.py +0 -0
  113. {whosellm-0.2.6 → whosellm-0.2.7}/whosellm/models/families/openai/openai_o1.py +0 -0
  114. {whosellm-0.2.6 → whosellm-0.2.7}/whosellm/models/families/openai/openai_o3.py +0 -0
  115. {whosellm-0.2.6 → whosellm-0.2.7}/whosellm/models/families/openai/openai_o4.py +0 -0
  116. {whosellm-0.2.6 → whosellm-0.2.7}/whosellm/models/families/others.py +0 -0
  117. {whosellm-0.2.6 → whosellm-0.2.7}/whosellm/models/families/vidu.py +0 -0
  118. {whosellm-0.2.6 → whosellm-0.2.7}/whosellm/models/families/zhipu.py +0 -0
  119. {whosellm-0.2.6 → whosellm-0.2.7}/whosellm/models/patterns.py +0 -0
  120. {whosellm-0.2.6 → whosellm-0.2.7}/whosellm/models/registry.py +0 -0
  121. {whosellm-0.2.6 → whosellm-0.2.7}/whosellm/provider.py +0 -0
  122. {whosellm-0.2.6 → whosellm-0.2.7}/whosellm/py.typed +0 -0
@@ -2,7 +2,7 @@
2
2
  # 文档 / Documentation: https://callowayproject.github.io/bump-my-version/
3
3
 
4
4
  [tool.bumpversion]
5
- current_version = "0.2.6"
5
+ current_version = "0.2.7"
6
6
  parse = """(?x)
7
7
  (?P<major>0|[1-9]\\d*)\\.
8
8
  (?P<minor>0|[1-9]\\d*)\\.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: whosellm
3
- Version: 0.2.6
3
+ Version: 0.2.7
4
4
  Summary: A unified LLM model version and capability management library
5
5
  Author-email: JQQ <jqq1716@gmail.com>
6
6
  License: MIT
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "whosellm"
3
- version = "0.2.6"
3
+ version = "0.2.7"
4
4
  description = "A unified LLM model version and capability management library"
5
5
  authors = [
6
6
  {name = "JQQ", email = "jqq1716@gmail.com"}
@@ -174,3 +174,38 @@ def test_deepseek_versioned_pattern_matches_official_family() -> None:
174
174
  assert model_v32.provider == Provider.DEEPSEEK
175
175
  assert model_v32.version == "3.2"
176
176
  assert model_v32.variant == "exp"
177
+
178
+
179
+ def test_deepseek_v4_flash_vision_exp_specific_model() -> None:
180
+ """验证 deepseek-v4-flash-vision-exp 配置(多模态实验版)"""
181
+ config = get_specific_model_config("deepseek-v4-flash-vision-exp")
182
+ assert config is not None
183
+ version, variant, capabilities = config
184
+ assert version == "4.0"
185
+ assert variant == "flash-vision-exp"
186
+ assert capabilities is not None
187
+ # 图像输入 / image input
188
+ assert capabilities.supports_vision is True
189
+ # 双模式,默认思考 / dual mode, thinking by default
190
+ assert capabilities.supports_thinking is True
191
+ assert capabilities.supports_function_calling is True
192
+ assert capabilities.supports_streaming is True
193
+ assert capabilities.supports_json_outputs is True
194
+ assert capabilities.supports_structured_outputs is False
195
+ # 不支持视频输入 / no video input
196
+ assert capabilities.supports_video is False
197
+ assert capabilities.max_tokens == 384_000
198
+ assert capabilities.context_window == 1_000_000
199
+
200
+
201
+ def test_deepseek_v4_flash_vision_exp_llmeta() -> None:
202
+ """验证 deepseek-v4-flash-vision-exp LLMeta 解析"""
203
+ from whosellm import LLMeta
204
+
205
+ model = LLMeta("deepseek-v4-flash-vision-exp")
206
+ assert model.provider == Provider.DEEPSEEK
207
+ assert model.family == ModelFamily.DEEPSEEK
208
+ assert model.version == "4.0"
209
+ assert model.variant == "flash-vision-exp"
210
+ assert model.capabilities.context_window == 1_000_000
211
+ assert model.capabilities.supports_vision is True
@@ -144,6 +144,8 @@ MODEL_VARIANT_SAMPLES: dict[ModelFamily, dict[str, list[str]]] = {
144
144
  ModelFamily.DEEPSEEK: {
145
145
  "chat": ["deepseek-chat", "deepseek-chat-beta", "deepseek-chat-v3.2-exp"],
146
146
  "reasoner": ["deepseek-reasoner"],
147
+ # 多模态实验版 / multimodal experimental edition
148
+ "flash-vision-exp": ["deepseek-v4-flash-vision-exp"],
147
149
  },
148
150
  ModelFamily.ABAB: {
149
151
  "mini": ["abab-mini"],
@@ -968,7 +968,7 @@ wheels = [
968
968
 
969
969
  [[package]]
970
970
  name = "whosellm"
971
- version = "0.2.6"
971
+ version = "0.2.7"
972
972
  source = { editable = "." }
973
973
  dependencies = [
974
974
  { name = "parse" },
@@ -7,7 +7,7 @@
7
7
  LLMeta - 统一的大语言模型版本和能力管理库 / A unified LLM model version and capability management library
8
8
  """
9
9
 
10
- __version__ = "0.2.6"
10
+ __version__ = "0.2.7"
11
11
 
12
12
  from whosellm.capabilities import ModelCapabilities
13
13
  from whosellm.model_version import LLMeta
@@ -4,10 +4,11 @@
4
4
  """
5
5
  DeepSeek 官方模型家族配置 / DeepSeek official model family configuration
6
6
 
7
- 当前主力:deepseek-v4-flash / deepseek-v4-pro(1M 上下文,384K 最大输出,
8
- 支持思考与非思考双模式)。
9
- Current primary models: deepseek-v4-flash / deepseek-v4-pro (1M context, 384K max output,
10
- both thinking and non-thinking modes supported).
7
+ 当前主力:deepseek-v4-flash / deepseek-v4-pro / deepseek-v4-flash-vision-exp
8
+ (1M 上下文,384K 最大输出,支持思考与非思考双模式;vision-exp 为多模态实验版)。
9
+ Current primary models: deepseek-v4-flash / deepseek-v4-pro / deepseek-v4-flash-vision-exp
10
+ (1M context, 384K max output, both thinking and non-thinking modes supported;
11
+ vision-exp is the multimodal experimental edition).
11
12
 
12
13
  兼容别名:deepseek-chat / deepseek-reasoner(官方宣布未来将废弃,当前分别对应
13
14
  deepseek-v4-flash 的非思考与思考模式)。
@@ -73,6 +74,30 @@ DEEPSEEK = ModelFamilyConfig(
73
74
  "deepseek-v4-pro",
74
75
  ],
75
76
  ),
77
+ # 多模态实验版:deepseek-v4-flash-vision-exp(2026-09 上线)
78
+ # Multimodal experimental: DeepSeek-V4-Flash-Vision-Exp
79
+ # 官方规格:图像输入(JPEG/PNG/GIF/WebP),文本输出;非思考/思考双模式(默认思考);
80
+ # 1M ctx / 384K out;Json Output / Tool Calls / Responses API / Anthropic API ✓;FIM ✗;
81
+ # 价格与 v4-flash 相同;不支持视频输入
82
+ # Sources: https://api-docs.deepseek.com/quick_start/pricing + /guides/vision
83
+ "deepseek-v4-flash-vision-exp": SpecificModelConfig(
84
+ version_default="4.0",
85
+ variant_default="flash-vision-exp",
86
+ variant_priority=(0,),
87
+ capabilities=ModelCapabilities(
88
+ supports_thinking=True, # 双模式,默认思考 / dual mode, thinking by default
89
+ supports_vision=True, # 图像输入 / image input
90
+ supports_function_calling=True,
91
+ supports_streaming=True,
92
+ supports_json_outputs=True,
93
+ supports_structured_outputs=False,
94
+ max_tokens=384_000,
95
+ context_window=1_000_000,
96
+ ),
97
+ patterns=[
98
+ "deepseek-v4-flash-vision-exp",
99
+ ],
100
+ ),
76
101
  # 兼容别名:deepseek-chat → v4-flash 非思考模式
77
102
  # Legacy alias: deepseek-chat → v4-flash non-thinking mode
78
103
  "deepseek-chat": SpecificModelConfig(
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes