Compare commits

...

11 Commits

Author SHA1 Message Date
zhayujie
4d8458669c chore(install): simplify model menu, add MiMo option 2026-06-02 17:10:26 +08:00
zhayujie
92ec9653e5 feat(models): support qwen3.7-plus multi-modal model 2026-06-02 16:38:17 +08:00
zhayujie
e861d98007 feat(models): support ASR model selection in web console 2026-06-02 15:05:35 +08:00
zhayujie
a97eeb1fd9 Merge pull request #2857 from nightwhite/codex/fix-asr-model-hot-switch
Fix ASR model persistence in models API
2026-06-02 14:54:02 +08:00
nightwhite
cd88b23b5d fix: persist ASR model in models API 2026-06-02 13:01:20 +08:00
zhayujie
33eabf937b Merge pull request #2853 from Wyh-max-star/WYH
chore:add group task board plugin source
2026-06-02 10:38:29 +08:00
zhayujie
beb5df16a3 Merge pull request #2855 from octo-patch/feature/upgrade-minimax-m3
feat(minimax): add MiniMax-M3 as default, drop older M2.5/M2.1/M2
2026-06-02 10:30:42 +08:00
octo-patch
7fa743f01a feat(minimax): add MiniMax-M3, set as default, drop M2.5/M2.1/M2
- Add MINIMAX_M3 = "MiniMax-M3" constant and put it first in MODEL_LIST
- Default MinimaxBot model: MiniMax-M2.7 -> MiniMax-M3
- Keep MiniMax-M2.7 and MiniMax-M2.7-highspeed as legacy options
- Drop MINIMAX_M2_5 / MINIMAX_M2_1 / MINIMAX_M2_1_LIGHTNING / MINIMAX_M2
- Update web console recommended/provider model lists
- Update README capability table and docs/models index (en/zh/ja)
- Update docs/models/minimax.mdx and coding-plan.mdx MiniMax section
- Update run.sh / run.ps1 installer default and menu hint
- Update zh CLI status sample output
- Update unit tests to assert new M3 default and constant

TTS (speech-2.*) and API base URL remain unchanged.
2026-06-01 21:30:38 +08:00
zhayujie
1f6859d78f feat: update CLI version to 2.1.0 2026-06-01 16:59:19 +08:00
zhayujie
2853735472 docs: update README.md 2026-06-01 16:46:16 +08:00
Wyh-max-star
04d28f9d2d chore:add group task board plugin source 2026-05-31 20:52:42 +08:00
37 changed files with 350 additions and 122 deletions

View File

@@ -1,6 +1,6 @@
<!-- <!--
Thanks for your contribution! Please write this PR in English. Thanks for your contribution! Please write this PR in English.
【中文开发者】请使用英文填写,感谢 ❤️ 推荐使用英文填写,感谢 ❤️
--> -->
## What does this PR do? ## What does this PR do?
@@ -16,6 +16,7 @@ Thanks for your contribution! Please write this PR in English.
## Checklist ## Checklist
- [ ] I have read the [Contributing Guide](https://github.com/zhayujie/CowAgent/blob/master/CONTRIBUTING.md)
- [ ] I tested this change locally - [ ] I tested this change locally
- [ ] Code comments and docs are in English - [ ] Code comments and docs are in English
- [ ] Linked related issue (if any): closes # - [ ] Linked related issue (if any): closes #

View File

@@ -98,11 +98,11 @@ CowAgent supports all mainstream LLM providers. **Chat, vision, image generation
| [OpenAI](https://docs.cowagent.ai/models/openai) | gpt-5.5, o-series | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | [OpenAI](https://docs.cowagent.ai/models/openai) | gpt-5.5, o-series | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| [Gemini](https://docs.cowagent.ai/models/gemini) | gemini-3.5-flash | ✅ | ✅ | ✅ | | | | | [Gemini](https://docs.cowagent.ai/models/gemini) | gemini-3.5-flash | ✅ | ✅ | ✅ | | | |
| [DeepSeek](https://docs.cowagent.ai/models/deepseek) | deepseek-v4-flash / pro | ✅ | | | | | | | [DeepSeek](https://docs.cowagent.ai/models/deepseek) | deepseek-v4-flash / pro | ✅ | | | | | |
| [Qwen](https://docs.cowagent.ai/models/qwen) | qwen3.7-max | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | [Qwen](https://docs.cowagent.ai/models/qwen) | qwen3.7-plus | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| [GLM](https://docs.cowagent.ai/models/glm) | glm-5.1, glm-5v-turbo | ✅ | ✅ | | ✅ | | ✅ | | [GLM](https://docs.cowagent.ai/models/glm) | glm-5.1, glm-5v-turbo | ✅ | ✅ | | ✅ | | ✅ |
| [Doubao](https://docs.cowagent.ai/models/doubao) | doubao-seed-2.0 series | ✅ | ✅ | ✅ | | | ✅ | | [Doubao](https://docs.cowagent.ai/models/doubao) | doubao-seed-2.0 series | ✅ | ✅ | ✅ | | | ✅ |
| [Kimi](https://docs.cowagent.ai/models/kimi) | kimi-k2.6 | ✅ | ✅ | | | | | | [Kimi](https://docs.cowagent.ai/models/kimi) | kimi-k2.6 | ✅ | ✅ | | | | |
| [MiniMax](https://docs.cowagent.ai/models/minimax) | MiniMax-M2.7 | ✅ | ✅ | ✅ | | ✅ | | | [MiniMax](https://docs.cowagent.ai/models/minimax) | MiniMax-M3 | ✅ | ✅ | ✅ | | ✅ | |
| [ERNIE](https://docs.cowagent.ai/models/qianfan) | ernie-5.1 | ✅ | ✅ | | | | | | [ERNIE](https://docs.cowagent.ai/models/qianfan) | ernie-5.1 | ✅ | ✅ | | | | |
| [MiMo](https://docs.cowagent.ai/models/mimo) | mimo-v2.5 / pro | ✅ | ✅ | | | ✅ | | | [MiMo](https://docs.cowagent.ai/models/mimo) | mimo-v2.5 / pro | ✅ | ✅ | | | ✅ | |
| [LinkAI](https://docs.cowagent.ai/models/linkai) | One key for 100+ models | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | [LinkAI](https://docs.cowagent.ai/models/linkai) | One key for 100+ models | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
@@ -238,9 +238,9 @@ For enterprise inquiries: sales@simple-future.tech or [scan the QR code](https:/
## 🛠️ Development & Contributing ## 🛠️ Development & Contributing
Contributions are welcome — add a new channel by following the [Feishu channel reference](https://github.com/zhayujie/CowAgent/blob/master/channel/feishu/feishu_channel.py), or contribute new skills to [Skill Hub](https://skills.cowagent.ai/submit). All kinds of contributions are welcome — new features, bug fixes, performance improvements, docs, or sharing your own skills on the [Skill Hub](https://skills.cowagent.ai/submit). See [CONTRIBUTING.md](/CONTRIBUTING.md) to get started, then open an Issue to discuss or send a PR directly.
⭐ Star the project to follow updates, and feel free to open PRs and Issues. ⭐ Star the project to show your support, and Watch → Custom → Releases to get notified of new versions. PRs and Issues are always welcome.
## 🌟 Contributors ## 🌟 Contributors

View File

@@ -51,7 +51,7 @@ _MAIN_MODEL_PROVIDER_NAME = "MainModel"
_DISCOVERABLE_MODELS = [ _DISCOVERABLE_MODELS = [
("moonshot_api_key", const.MOONSHOT, const.KIMI_K2_6, "Moonshot"), ("moonshot_api_key", const.MOONSHOT, const.KIMI_K2_6, "Moonshot"),
("ark_api_key", const.DOUBAO, const.DOUBAO_SEED_2_PRO, "Doubao"), ("ark_api_key", const.DOUBAO, const.DOUBAO_SEED_2_PRO, "Doubao"),
("dashscope_api_key", const.QWEN_DASHSCOPE, const.QWEN36_PLUS, "DashScope"), ("dashscope_api_key", const.QWEN_DASHSCOPE, const.QWEN37_PLUS, "DashScope"),
("claude_api_key", const.CLAUDEAPI, const.CLAUDE_4_6_SONNET, "Claude"), ("claude_api_key", const.CLAUDEAPI, const.CLAUDE_4_6_SONNET, "Claude"),
("gemini_api_key", const.GEMINI, const.GEMINI_35_FLASH, "Gemini"), ("gemini_api_key", const.GEMINI, const.GEMINI_35_FLASH, "Gemini"),
("qianfan_api_key", const.QIANFAN, const.ERNIE_45_TURBO_VL, "Qianfan"), ("qianfan_api_key", const.QIANFAN, const.ERNIE_45_TURBO_VL, "Qianfan"),
@@ -161,7 +161,7 @@ class Vision(BaseTool):
"Error: No model available for Vision.\n" "Error: No model available for Vision.\n"
"The main model does not support vision and no other API keys are configured.\n" "The main model does not support vision and no other API keys are configured.\n"
"Options:\n" "Options:\n"
" 1. Switch to a multimodal model (e.g. ernie-4.5-turbo-vl, qwen3.6-plus, claude-sonnet-4-6, gemini-2.0-flash)\n" " 1. Switch to a multimodal model (e.g. ernie-4.5-turbo-vl, qwen3.7-plus, claude-sonnet-4-6, gemini-2.0-flash)\n"
" 2. Configure OPENAI_API_KEY: env_config(action=\"set\", key=\"OPENAI_API_KEY\", value=\"your-key\")\n" " 2. Configure OPENAI_API_KEY: env_config(action=\"set\", key=\"OPENAI_API_KEY\", value=\"your-key\")\n"
" 3. Configure LINKAI_API_KEY: env_config(action=\"set\", key=\"LINKAI_API_KEY\", value=\"your-key\")" " 3. Configure LINKAI_API_KEY: env_config(action=\"set\", key=\"LINKAI_API_KEY\", value=\"your-key\")"
) )

View File

@@ -4025,7 +4025,7 @@ const MODELS_CAPABILITY_DEFS = [
iconChip: 'bg-blue-50 dark:bg-blue-900/30', iconGlyph: 'text-blue-500' }, iconChip: 'bg-blue-50 dark:bg-blue-900/30', iconGlyph: 'text-blue-500' },
{ id: 'image', icon: 'fa-image', editable: true, needsModel: true, titleKey: 'models_capability_image', descKey: 'models_capability_image_desc', { id: 'image', icon: 'fa-image', editable: true, needsModel: true, titleKey: 'models_capability_image', descKey: 'models_capability_image_desc',
iconChip: 'bg-blue-50 dark:bg-blue-900/30', iconGlyph: 'text-blue-500' }, iconChip: 'bg-blue-50 dark:bg-blue-900/30', iconGlyph: 'text-blue-500' },
{ id: 'asr', icon: 'fa-microphone', editable: true, needsModel: false, titleKey: 'models_capability_asr', descKey: 'models_capability_asr_desc', { id: 'asr', icon: 'fa-microphone', editable: true, needsModel: true, titleKey: 'models_capability_asr', descKey: 'models_capability_asr_desc',
iconChip: 'bg-amber-50 dark:bg-amber-900/30', iconGlyph: 'text-amber-500' }, iconChip: 'bg-amber-50 dark:bg-amber-900/30', iconGlyph: 'text-amber-500' },
{ id: 'tts', icon: 'fa-volume-high', editable: true, needsModel: true, titleKey: 'models_capability_tts', descKey: 'models_capability_tts_desc', { id: 'tts', icon: 'fa-volume-high', editable: true, needsModel: true, titleKey: 'models_capability_tts', descKey: 'models_capability_tts_desc',
iconChip: 'bg-amber-50 dark:bg-amber-900/30', iconGlyph: 'text-amber-500' }, iconChip: 'bg-amber-50 dark:bg-amber-900/30', iconGlyph: 'text-amber-500' },

View File

@@ -1404,12 +1404,12 @@ class ConfigHandler:
_RECOMMENDED_MODELS = [ _RECOMMENDED_MODELS = [
const.DEEPSEEK_V4_FLASH, const.DEEPSEEK_V4_PRO, const.DEEPSEEK_CHAT, const.DEEPSEEK_REASONER, const.DEEPSEEK_V4_FLASH, const.DEEPSEEK_V4_PRO, const.DEEPSEEK_CHAT, const.DEEPSEEK_REASONER,
const.MINIMAX_M2_7_HIGHSPEED, const.MINIMAX_M2_7, const.MINIMAX_M2_5, const.MINIMAX_M2_1, const.MINIMAX_M2_1_LIGHTNING, const.MINIMAX_M3, const.MINIMAX_M2_7_HIGHSPEED, const.MINIMAX_M2_7,
const.CLAUDE_4_8_OPUS, const.CLAUDE_4_7_OPUS, const.CLAUDE_4_6_SONNET, const.CLAUDE_4_6_OPUS, const.CLAUDE_4_5_SONNET, const.CLAUDE_4_8_OPUS, const.CLAUDE_4_7_OPUS, const.CLAUDE_4_6_SONNET, const.CLAUDE_4_6_OPUS, const.CLAUDE_4_5_SONNET,
const.GEMINI_35_FLASH, const.GEMINI_31_FLASH_LITE_PRE, const.GEMINI_31_PRO_PRE, const.GEMINI_3_FLASH_PRE, const.GEMINI_35_FLASH, const.GEMINI_31_FLASH_LITE_PRE, const.GEMINI_31_PRO_PRE, const.GEMINI_3_FLASH_PRE,
const.GPT_55, const.GPT_54, const.GPT_54_MINI, const.GPT_54_NANO, const.GPT_5, const.GPT_41, const.GPT_4o, const.GPT_55, const.GPT_54, const.GPT_54_MINI, const.GPT_54_NANO, const.GPT_5, const.GPT_41, const.GPT_4o,
const.GLM_5_1, const.GLM_5_TURBO, const.GLM_5, const.GLM_4_7, const.GLM_5_1, const.GLM_5_TURBO, const.GLM_5, const.GLM_4_7,
const.QWEN36_PLUS, const.QWEN37_MAX, const.QWEN35_PLUS, const.QWEN3_MAX, const.QWEN37_PLUS, const.QWEN37_MAX, const.QWEN36_PLUS,
const.DOUBAO_SEED_2_PRO, const.DOUBAO_SEED_2_CODE, const.DOUBAO_SEED_2_PRO, const.DOUBAO_SEED_2_CODE,
const.KIMI_K2_6, const.KIMI_K2_5, const.KIMI_K2, const.KIMI_K2_6, const.KIMI_K2_5, const.KIMI_K2,
const.ERNIE_5_1, const.ERNIE_5, const.ERNIE_X1_1, const.ERNIE_45_TURBO_128K, const.ERNIE_45_TURBO_32K, const.ERNIE_5_1, const.ERNIE_5, const.ERNIE_X1_1, const.ERNIE_45_TURBO_128K, const.ERNIE_45_TURBO_32K,
@@ -1442,7 +1442,7 @@ class ConfigHandler:
"api_base_key": None, "api_base_key": None,
"api_base_default": None, "api_base_default": None,
"api_base_placeholder": "", "api_base_placeholder": "",
"models": [const.MINIMAX_M2_7, const.MINIMAX_M2_7_HIGHSPEED, const.MINIMAX_M2_5, const.MINIMAX_M2_1, const.MINIMAX_M2_1_LIGHTNING], "models": [const.MINIMAX_M3, const.MINIMAX_M2_7, const.MINIMAX_M2_7_HIGHSPEED],
}), }),
("claudeAPI", { ("claudeAPI", {
"label": "Claude", "label": "Claude",
@@ -1482,7 +1482,7 @@ class ConfigHandler:
"api_base_key": None, "api_base_key": None,
"api_base_default": None, "api_base_default": None,
"api_base_placeholder": "", "api_base_placeholder": "",
"models": [const.QWEN36_PLUS, const.QWEN37_MAX, const.QWEN35_PLUS, const.QWEN3_MAX], "models": [const.QWEN37_PLUS, const.QWEN37_MAX, const.QWEN36_PLUS],
}), }),
("doubao", { ("doubao", {
"label": {"zh": "豆包", "en": "Doubao"}, "label": {"zh": "豆包", "en": "Doubao"},
@@ -1720,6 +1720,28 @@ class ModelsHandler:
], ],
} }
# ASR engine catalog per provider. The first entry of each list is the
# runtime default (mirrors DEFAULT_ASR_MODEL in voice/*). Users can still
# pick "custom" in the UI to send any other model id.
_ASR_PROVIDER_MODELS = {
"openai": [
{"value": "gpt-4o-mini-transcribe", "hint": "默认 · 速度快"},
{"value": "gpt-4o-transcribe", "hint": "更高准确率"},
{"value": "whisper-1", "hint": "经典 Whisper"},
],
"dashscope": [
{"value": "qwen3-asr-flash", "hint": "覆盖普通话、方言与主流外语"},
],
"zhipu": [
{"value": "glm-asr-2512", "hint": "智谱语音识别"},
],
# LinkAI gateway pins whisper-1 for ASR and ignores any other id,
# so expose only that to avoid misleading the user.
"linkai": [
{"value": "whisper-1", "hint": "网关固定使用"},
],
}
# Per-provider voice timbres. Entries can be a bare code string # Per-provider voice timbres. Entries can be a bare code string
# (label = code) or {value, hint?} when a friendly secondary label # (label = code) or {value, hint?} when a friendly secondary label
# helps recognition. We keep `value` as the raw API code so power # helps recognition. We keep `value` as the raw API code so power
@@ -1964,7 +1986,7 @@ class ModelsHandler:
], ],
"doubao": [const.DOUBAO_SEED_2_PRO], "doubao": [const.DOUBAO_SEED_2_PRO],
"moonshot": [const.KIMI_K2_6], "moonshot": [const.KIMI_K2_6],
"dashscope": [const.QWEN36_PLUS, const.QWEN35_PLUS, const.QWEN3_MAX], "dashscope": [const.QWEN37_PLUS, const.QWEN36_PLUS],
"claudeAPI": [const.CLAUDE_4_8_OPUS, const.CLAUDE_4_7_OPUS, const.CLAUDE_4_6_SONNET, const.CLAUDE_4_6_OPUS], "claudeAPI": [const.CLAUDE_4_8_OPUS, const.CLAUDE_4_7_OPUS, const.CLAUDE_4_6_SONNET, const.CLAUDE_4_6_OPUS],
"gemini": [const.GEMINI_35_FLASH, const.GEMINI_31_FLASH_LITE_PRE, const.GEMINI_31_PRO_PRE, const.GEMINI_3_FLASH_PRE], "gemini": [const.GEMINI_35_FLASH, const.GEMINI_31_FLASH_LITE_PRE, const.GEMINI_31_PRO_PRE, const.GEMINI_3_FLASH_PRE],
"qianfan": [const.ERNIE_45_TURBO_VL], "qianfan": [const.ERNIE_45_TURBO_VL],
@@ -1985,7 +2007,7 @@ class ModelsHandler:
"linkai": [ "linkai": [
const.GPT_41_MINI, const.GPT_41_MINI,
const.GPT_54_MINI, const.GPT_54_MINI,
const.QWEN36_PLUS, const.QWEN37_PLUS,
const.DOUBAO_SEED_2_PRO, const.DOUBAO_SEED_2_PRO,
const.KIMI_K2_6, const.KIMI_K2_6,
const.CLAUDE_4_6_SONNET, const.CLAUDE_4_6_SONNET,
@@ -2102,7 +2124,7 @@ class ModelsHandler:
_VISION_AUTO_ORDER = [ _VISION_AUTO_ORDER = [
("moonshot", "moonshot_api_key", const.KIMI_K2_6), ("moonshot", "moonshot_api_key", const.KIMI_K2_6),
("doubao", "ark_api_key", const.DOUBAO_SEED_2_PRO), ("doubao", "ark_api_key", const.DOUBAO_SEED_2_PRO),
("dashscope", "dashscope_api_key", const.QWEN36_PLUS), ("dashscope", "dashscope_api_key", const.QWEN37_PLUS),
("claudeAPI", "claude_api_key", const.CLAUDE_4_6_SONNET), ("claudeAPI", "claude_api_key", const.CLAUDE_4_6_SONNET),
("gemini", "gemini_api_key", const.GEMINI_35_FLASH), ("gemini", "gemini_api_key", const.GEMINI_35_FLASH),
("qianfan", "qianfan_api_key", const.ERNIE_45_TURBO_VL), ("qianfan", "qianfan_api_key", const.ERNIE_45_TURBO_VL),
@@ -2240,8 +2262,9 @@ class ModelsHandler:
"editable": True, "editable": True,
"current_provider": explicit, "current_provider": explicit,
"suggested_provider": suggested, "suggested_provider": suggested,
"current_model": "", "current_model": (local_config.get("voice_to_text_model") or "") if explicit else "",
"providers": cls._ASR_PROVIDERS, "providers": cls._ASR_PROVIDERS,
"provider_models": cls._ASR_PROVIDER_MODELS,
} }
@classmethod @classmethod
@@ -2613,7 +2636,7 @@ class ModelsHandler:
if capability == "vision": if capability == "vision":
return self._set_vision(provider_id, model) return self._set_vision(provider_id, model)
if capability == "asr": if capability == "asr":
return self._set_simple("voice_to_text", provider_id) return self._set_asr(provider_id, model)
if capability == "tts": if capability == "tts":
return self._set_tts(provider_id, model, (data.get("voice") or "").strip()) return self._set_tts(provider_id, model, (data.get("voice") or "").strip())
if capability == "embedding": if capability == "embedding":
@@ -2773,6 +2796,30 @@ class ModelsHandler:
self._refresh_voice_routing() self._refresh_voice_routing()
return json.dumps({"status": "success", key: value}) return json.dumps({"status": "success", key: value})
def _set_asr(self, provider_id: str, model: str) -> str:
local_config = conf()
file_cfg = self._read_file_config()
local_config["voice_to_text"] = provider_id
file_cfg["voice_to_text"] = provider_id
# Only overwrite the model when one is supplied. An empty model means
# "keep whatever is configured" so switching provider from the console
# never wipes a user's hand-set voice_to_text_model (runtime falls back
# to the engine default via `or DEFAULT_ASR_MODEL` regardless).
if model:
local_config["voice_to_text_model"] = model
file_cfg["voice_to_text_model"] = model
self._write_file_config(file_cfg)
logger.info(
f"[ModelsHandler] asr updated: provider={provider_id!r} "
f"model={model!r}"
)
self._refresh_voice_routing()
return json.dumps({
"status": "success",
"provider": provider_id,
"model": local_config.get("voice_to_text_model", ""),
})
def _set_tts(self, provider_id: str, model: str, voice: str = "") -> str: def _set_tts(self, provider_id: str, model: str, voice: str = "") -> str:
local_config = conf() local_config = conf()
file_cfg = self._read_file_config() file_cfg = self._read_file_config()

View File

@@ -1 +1 @@
2.0.9 2.1.0

View File

@@ -108,17 +108,15 @@ QWEN_LONG = "qwen-long"
QWEN3_MAX = "qwen3-max" # Qwen3 Max - Agent推荐模型 QWEN3_MAX = "qwen3-max" # Qwen3 Max - Agent推荐模型
QWEN35_PLUS = "qwen3.5-plus" # Qwen3.5 Plus - Omni model (MultiModalConversation) QWEN35_PLUS = "qwen3.5-plus" # Qwen3.5 Plus - Omni model (MultiModalConversation)
QWEN36_PLUS = "qwen3.6-plus" # Qwen3.6 Plus - Omni model (MultiModalConversation) QWEN36_PLUS = "qwen3.6-plus" # Qwen3.6 Plus - Omni model (MultiModalConversation)
QWEN37_PLUS = "qwen3.7-plus" # Qwen3.7 Plus - Omni model (MultiModalConversation)
QWEN37_MAX = "qwen3.7-max" # Qwen3.7 Max - Agent推荐模型 QWEN37_MAX = "qwen3.7-max" # Qwen3.7 Max - Agent推荐模型
QWQ_PLUS = "qwq-plus" QWQ_PLUS = "qwq-plus"
# MiniMax # MiniMax
MINIMAX_M2_7 = "MiniMax-M2.7" # MiniMax M2.7 - Latest MINIMAX_M3 = "MiniMax-M3" # MiniMax M3 - Latest (default)
MINIMAX_TEXT_01 = "MiniMax-Text-01" # MiniMax 多模态 (vision) MINIMAX_M2_7 = "MiniMax-M2.7" # MiniMax M2.7
MINIMAX_M2_7_HIGHSPEED = "MiniMax-M2.7-highspeed" # MiniMax M2.7 highspeed MINIMAX_M2_7_HIGHSPEED = "MiniMax-M2.7-highspeed" # MiniMax M2.7 highspeed
MINIMAX_M2_5 = "MiniMax-M2.5" # MiniMax M2.5 MINIMAX_TEXT_01 = "MiniMax-Text-01" # MiniMax 多模态 (vision)
MINIMAX_M2_1 = "MiniMax-M2.1" # MiniMax M2.1
MINIMAX_M2_1_LIGHTNING = "MiniMax-M2.1-lightning" # MiniMax M2.1 极速版
MINIMAX_M2 = "MiniMax-M2" # MiniMax M2
MINIMAX_ABAB6_5 = "abab6.5-chat" # MiniMax abab6.5 MINIMAX_ABAB6_5 = "abab6.5-chat" # MiniMax abab6.5
# GLM (智谱AI) # GLM (智谱AI)
@@ -189,7 +187,7 @@ MODEL_LIST = [
ERNIE_45_TURBO_VL, ERNIE_45_TURBO_VL_32K, ERNIE_45_TURBO_VL, ERNIE_45_TURBO_VL_32K,
# MiniMax # MiniMax
MiniMax, MINIMAX_M2_7, MINIMAX_M2_7_HIGHSPEED, MINIMAX_M2_5, MINIMAX_M2_1, MINIMAX_M2_1_LIGHTNING, MINIMAX_M2, MINIMAX_ABAB6_5, MiniMax, MINIMAX_M3, MINIMAX_M2_7, MINIMAX_M2_7_HIGHSPEED, MINIMAX_ABAB6_5,
# 小米 MiMo # 小米 MiMo
MIMO, MIMO_V2_5_PRO, MIMO_V2_5, MIMO_V2_PRO, MIMO_V2_OMNI, MIMO_V2_FLASH, MIMO, MIMO_V2_5_PRO, MIMO_V2_5, MIMO_V2_PRO, MIMO_V2_OMNI, MIMO_V2_FLASH,
@@ -218,7 +216,7 @@ MODEL_LIST = [
GLM_4_0520, GLM_4_AIR, GLM_4_AIRX, GLM_4_7, GLM_4_0520, GLM_4_AIR, GLM_4_AIRX, GLM_4_7,
# Qwen (通义千问) # Qwen (通义千问)
QWEN37_MAX, QWEN36_PLUS, QWEN35_PLUS, QWEN3_MAX, QWEN_MAX, QWEN_PLUS, QWEN_TURBO, QWEN_LONG, QWEN37_PLUS, QWEN37_MAX, QWEN36_PLUS, QWEN35_PLUS, QWEN3_MAX, QWEN_MAX, QWEN_PLUS, QWEN_TURBO, QWEN_LONG,
# Doubao (豆包) # Doubao (豆包)
DOUBAO, DOUBAO_SEED_2_CODE, DOUBAO_SEED_2_PRO, DOUBAO_SEED_2_LITE, DOUBAO_SEED_2_MINI, DOUBAO, DOUBAO_SEED_2_CODE, DOUBAO_SEED_2_PRO, DOUBAO_SEED_2_LITE, DOUBAO_SEED_2_MINI,

View File

@@ -98,11 +98,11 @@ CowAgent は主要な LLM プロバイダーすべてに対応しています。
| [OpenAI](https://docs.cowagent.ai/ja/models/openai) | gpt-5.5、o シリーズ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | [OpenAI](https://docs.cowagent.ai/ja/models/openai) | gpt-5.5、o シリーズ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| [Gemini](https://docs.cowagent.ai/ja/models/gemini) | gemini-3.5-flash | ✅ | ✅ | ✅ | | | | | [Gemini](https://docs.cowagent.ai/ja/models/gemini) | gemini-3.5-flash | ✅ | ✅ | ✅ | | | |
| [DeepSeek](https://docs.cowagent.ai/ja/models/deepseek) | deepseek-v4-flash / pro | ✅ | | | | | | | [DeepSeek](https://docs.cowagent.ai/ja/models/deepseek) | deepseek-v4-flash / pro | ✅ | | | | | |
| [Qwen](https://docs.cowagent.ai/ja/models/qwen) | qwen3.7-max | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | [Qwen](https://docs.cowagent.ai/ja/models/qwen) | qwen3.7-plus | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| [GLM](https://docs.cowagent.ai/ja/models/glm) | glm-5.1、glm-5v-turbo | ✅ | ✅ | | ✅ | | ✅ | | [GLM](https://docs.cowagent.ai/ja/models/glm) | glm-5.1、glm-5v-turbo | ✅ | ✅ | | ✅ | | ✅ |
| [Doubao](https://docs.cowagent.ai/ja/models/doubao) | doubao-seed-2.0 シリーズ | ✅ | ✅ | ✅ | | | ✅ | | [Doubao](https://docs.cowagent.ai/ja/models/doubao) | doubao-seed-2.0 シリーズ | ✅ | ✅ | ✅ | | | ✅ |
| [Kimi](https://docs.cowagent.ai/ja/models/kimi) | kimi-k2.6 | ✅ | ✅ | | | | | | [Kimi](https://docs.cowagent.ai/ja/models/kimi) | kimi-k2.6 | ✅ | ✅ | | | | |
| [MiniMax](https://docs.cowagent.ai/ja/models/minimax) | MiniMax-M2.7 | ✅ | ✅ | ✅ | | ✅ | | | [MiniMax](https://docs.cowagent.ai/ja/models/minimax) | MiniMax-M3 | ✅ | ✅ | ✅ | | ✅ | |
| [ERNIE](https://docs.cowagent.ai/ja/models/qianfan) | ernie-5.1 | ✅ | ✅ | | | | | | [ERNIE](https://docs.cowagent.ai/ja/models/qianfan) | ernie-5.1 | ✅ | ✅ | | | | |
| [MiMo](https://docs.cowagent.ai/ja/models/mimo) | mimo-v2.5-pro / v2.5 | ✅ | ✅ | | | ✅ | | | [MiMo](https://docs.cowagent.ai/ja/models/mimo) | mimo-v2.5-pro / v2.5 | ✅ | ✅ | | | ✅ | |
| [LinkAI](https://docs.cowagent.ai/ja/models/linkai) | 1 つの Key で 100+ モデルに接続 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | [LinkAI](https://docs.cowagent.ai/ja/models/linkai) | 1 つの Key で 100+ モデルに接続 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
@@ -238,9 +238,9 @@ GitHub で [Issue を報告](https://github.com/zhayujie/CowAgent/issues) する
## 🛠️ 開発とコントリビューション ## 🛠️ 開発とコントリビューション
新しいチャネルの追加を歓迎します — [Feishu チャネル](https://github.com/zhayujie/CowAgent/blob/master/channel/feishu/feishu_channel.py) を参考にカスタムチャネルを実装できます。新しい Skill のコントリビューションも [Skill Hub](https://skills.cowagent.ai/submit) で受け付けています あらゆる形のコントリビューションを歓迎します —— 新機能、バグ修正、パフォーマンス改善、ドキュメント、あるいは [Skill Hub](https://skills.cowagent.ai/submit) への Skill の共有など。まずは [CONTRIBUTING.md](/CONTRIBUTING.md) をご覧いただき、Issue で相談するか、直接 PR を送ってください
⭐ Star でプロジェクトの更新をフォローしてください。PR や Issue の提出も歓迎します。 ⭐ Star でプロジェクトを応援し、Watch → Custom → Releases で新バージョンの通知を受け取れます。PR や Issue の提出も歓迎します。
## 🌟 コントリビューター ## 🌟 コントリビューター

View File

@@ -61,7 +61,7 @@ description: Coding Planモデルの設定
```json ```json
{ {
"bot_type": "openai", "bot_type": "openai",
"model": "MiniMax-M2.5", "model": "MiniMax-M3",
"open_ai_api_base": "https://api.minimaxi.com/v1", "open_ai_api_base": "https://api.minimaxi.com/v1",
"open_ai_api_key": "YOUR_API_KEY" "open_ai_api_key": "YOUR_API_KEY"
} }
@@ -69,7 +69,7 @@ description: Coding Planモデルの設定
| パラメータ | 説明 | | パラメータ | 説明 |
| --- | --- | | --- | --- |
| `model` | `MiniMax-M2.5`、`MiniMax-M2.5-highspeed`、`MiniMax-M2.1`、`MiniMax-M2` | | `model` | `MiniMax-M3`、`MiniMax-M2.7`、`MiniMax-M2.7-highspeed` |
| `open_ai_api_base` | 中国: `https://api.minimaxi.com/v1`、グローバル: `https://api.minimax.io/v1` | | `open_ai_api_base` | 中国: `https://api.minimaxi.com/v1`、グローバル: `https://api.minimax.io/v1` |
| `open_ai_api_key` | Coding Plan専用キー従量課金とは共有不可 | | `open_ai_api_key` | Coding Plan専用キー従量課金とは共有不可 |

View File

@@ -6,7 +6,7 @@ description: CowAgent がサポートするモデルベンダーと機能マト
CowAgent は国内外の主要ベンダーの大規模言語モデルをサポートしており、モデル接続の実装はプロジェクトの `models/` ディレクトリにあります。テキスト対話に加えて、一部のベンダーは画像理解、画像生成、音声認識、音声合成、ベクトルなどの機能も提供しており、Agent フローの中で必要に応じて呼び出すことができます。 CowAgent は国内外の主要ベンダーの大規模言語モデルをサポートしており、モデル接続の実装はプロジェクトの `models/` ディレクトリにあります。テキスト対話に加えて、一部のベンダーは画像理解、画像生成、音声認識、音声合成、ベクトルなどの機能も提供しており、Agent フローの中で必要に応じて呼び出すことができます。
<Note> <Note>
Agent モードでは、効果とコストのバランスを考慮して以下のモデルの利用を推奨しますdeepseek-v4-flash、MiniMax-M2.7、claude-sonnet-4-6、gemini-3.5-flash、glm-5.1、qwen3.6-plus、kimi-k2.6、ernie-5.1。 Agent モードでは、効果とコストのバランスを考慮して以下のモデルの利用を推奨しますdeepseek-v4-flash、MiniMax-M3、claude-sonnet-4-6、gemini-3.5-flash、glm-5.1、qwen3.7-plus、kimi-k2.6、ernie-5.1。
同時に [LinkAI](https://link-ai.tech) プラットフォームの API もサポートしており、1 つの Key で複数ベンダーを柔軟に切り替えられ、ナレッジベース、ワークフロー、プラグインなどの機能も付属しています。 同時に [LinkAI](https://link-ai.tech) プラットフォームの API もサポートしており、1 つの Key で複数ベンダーを柔軟に切り替えられ、ナレッジベース、ワークフロー、プラグインなどの機能も付属しています。
</Note> </Note>
@@ -19,12 +19,12 @@ CowAgent は国内外の主要ベンダーの大規模言語モデルをサポ
| ベンダー | 代表モデル | テキスト | 画像理解 | 画像生成 | 音声認識 | 音声合成 | ベクトル | | ベンダー | 代表モデル | テキスト | 画像理解 | 画像生成 | 音声認識 | 音声合成 | ベクトル |
| --- | --- | :-: | :-: | :-: | :-: | :-: | :-: | | --- | --- | :-: | :-: | :-: | :-: | :-: | :-: |
| [DeepSeek](/models/deepseek) | deepseek-v4-flash / pro | ✅ | | | | | | | [DeepSeek](/models/deepseek) | deepseek-v4-flash / pro | ✅ | | | | | |
| [MiniMax](/models/minimax) | MiniMax-M2.7 | ✅ | ✅ | ✅ | | ✅ | | | [MiniMax](/models/minimax) | MiniMax-M3 | ✅ | ✅ | ✅ | | ✅ | |
| [Claude](/models/claude) | claude-opus-4-8 | ✅ | ✅ | | | | | | [Claude](/models/claude) | claude-opus-4-8 | ✅ | ✅ | | | | |
| [Gemini](/models/gemini) | gemini-3.5-flash | ✅ | ✅ | ✅ | | | | | [Gemini](/models/gemini) | gemini-3.5-flash | ✅ | ✅ | ✅ | | | |
| [OpenAI](/models/openai) | gpt-5.5、o シリーズ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | [OpenAI](/models/openai) | gpt-5.5、o シリーズ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| [Zhipu GLM](/models/glm) | glm-5.1、glm-5v-turbo | ✅ | ✅ | | ✅ | | ✅ | | [Zhipu GLM](/models/glm) | glm-5.1、glm-5v-turbo | ✅ | ✅ | | ✅ | | ✅ |
| [Tongyi Qianwen](/models/qwen) | qwen3.7-max | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | [Tongyi Qianwen](/models/qwen) | qwen3.7-plus | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| [Doubao](/models/doubao) | doubao-seed-2.0 シリーズ | ✅ | ✅ | ✅ | | | ✅ | | [Doubao](/models/doubao) | doubao-seed-2.0 シリーズ | ✅ | ✅ | ✅ | | | ✅ |
| [Kimi](/models/kimi) | kimi-k2.6 | ✅ | ✅ | | | | | | [Kimi](/models/kimi) | kimi-k2.6 | ✅ | ✅ | | | | |
| [Baidu Qianfan](/models/qianfan) | ernie-5.1 | ✅ | ✅ | | | | | | [Baidu Qianfan](/models/qianfan) | ernie-5.1 | ✅ | ✅ | | | | |

View File

@@ -40,7 +40,7 @@ description: LinkAI プラットフォーム経由でテキスト、ビジョン
} }
``` ```
選択可能なモデル:`gpt-4.1-mini`、`gpt-5.4-mini`、`qwen3.6-plus`、`doubao-seed-2-0-pro-260215`、`kimi-k2.6`、`claude-sonnet-4-6`、`gemini-3.1-flash-lite-preview` など。 選択可能なモデル:`gpt-4.1-mini`、`gpt-5.4-mini`、`qwen3.7-plus`、`doubao-seed-2-0-pro-260215`、`kimi-k2.6`、`claude-sonnet-4-6`、`gemini-3.1-flash-lite-preview` など。
## 画像生成 ## 画像生成

View File

@@ -13,14 +13,14 @@ MiniMax はテキスト対話、画像理解、画像生成、音声合成をサ
```json ```json
{ {
"model": "MiniMax-M2.7", "model": "MiniMax-M3",
"minimax_api_key": "YOUR_API_KEY" "minimax_api_key": "YOUR_API_KEY"
} }
``` ```
| パラメータ | 説明 | | パラメータ | 説明 |
| --- | --- | | --- | --- |
| `model` | `MiniMax-M2.7`、`MiniMax-M2.7-highspeed`、`MiniMax-M2.5`、`MiniMax-M2.1`、`MiniMax-M2.1-lightning`、`MiniMax-M2` などを指定可能 | | `model` | `MiniMax-M3`、`MiniMax-M2.7`、`MiniMax-M2.7-highspeed` などを指定可能 |
| `minimax_api_key` | [MiniMax コンソール](https://platform.minimaxi.com/user-center/basic-information/interface-key) で作成 | | `minimax_api_key` | [MiniMax コンソール](https://platform.minimaxi.com/user-center/basic-information/interface-key) で作成 |
## 画像理解 ## 画像理解

View File

@@ -13,19 +13,19 @@ Tongyi QianwenDashScope / Bailianは国内で最も広範な機能をカ
```json ```json
{ {
"model": "qwen3.6-plus", "model": "qwen3.7-plus",
"dashscope_api_key": "YOUR_API_KEY" "dashscope_api_key": "YOUR_API_KEY"
} }
``` ```
| パラメータ | 説明 | | パラメータ | 説明 |
| --- | --- | | --- | --- |
| `model` | `qwen3.6-plus`、`qwen3.7-max`、`qwen3.5-plus`、`qwen3-max`、`qwen-max`、`qwen-plus`、`qwen-turbo`、`qwq-plus` などを指定可能 | | `model` | `qwen3.7-plus`、`qwen3.7-max`、`qwen3.6-plus`、`qwen3.5-plus`、`qwen3-max`、`qwen-max`、`qwen-plus`、`qwen-turbo`、`qwq-plus` などを指定可能 |
| `dashscope_api_key` | [Bailian コンソール](https://bailian.console.aliyun.com/?tab=model#/api-key) で作成。詳細は [公式ドキュメント](https://bailian.console.aliyun.com/?tab=api#/api) を参照 | | `dashscope_api_key` | [Bailian コンソール](https://bailian.console.aliyun.com/?tab=model#/api-key) で作成。詳細は [公式ドキュメント](https://bailian.console.aliyun.com/?tab=api#/api) を参照 |
## 画像理解 ## 画像理解
`dashscope_api_key` を設定すると、Agent の Vision ツールは自動的に Qwen のビジョンモデルを呼び出して画像を認識します。`qwen3-max` / `qwen3.5-plus` / `qwen3.6-plus` などのモデルはそのままマルチモーダルです。メインモデルがテキスト専用(`qwen-turbo` など)の場合は、自動的に `qwen-vl-max` にフォールバックします。 `dashscope_api_key` を設定すると、Agent の Vision ツールは自動的に Qwen のビジョンモデルを呼び出して画像を認識します。`qwen3.7-plus` / `qwen3.6-plus` / `qwen3.5-plus` / `qwen3-max` などのモデルはそのままマルチモーダルです。メインモデルがテキスト専用(`qwen-turbo` など)の場合は、自動的に `qwen-vl-max` にフォールバックします。
Vision モデルを手動で指定したい場合: Vision モデルを手動で指定したい場合:
@@ -33,13 +33,13 @@ Vision モデルを手動で指定したい場合:
{ {
"tools": { "tools": {
"vision": { "vision": {
"model": "qwen3.6-plus" "model": "qwen3.7-plus"
} }
} }
} }
``` ```
サポートするモデル:`qwen3.6-plus`、`qwen3.5-plus`、`qwen3-max`。 サポートするモデル:`qwen3.7-plus`、`qwen3.6-plus`、`qwen3.5-plus`、`qwen3-max`。
## 画像生成 ## 画像生成

View File

@@ -19,7 +19,7 @@ Vision ツールは多段階の自動選択 + 自動フォールバック戦略
| プロバイダー | ビジョンモデル | 説明 | | プロバイダー | ビジョンモデル | 説明 |
| --- | --- | --- | | --- | --- | --- |
| OpenAI / 互換プロトコル | メインモデルを使用 | すべての OpenAI 互換マルチモーダルモデルに対応 | | OpenAI / 互換プロトコル | メインモデルを使用 | すべての OpenAI 互換マルチモーダルモデルに対応 |
| 通義千問 (DashScope) | メインモデルを使用 | 例qwen3.6-plus など | | 通義千問 (DashScope) | メインモデルを使用 | 例qwen3.7-plus など |
| Claude | メインモデルを使用 | Anthropic ネイティブ画像形式 | | Claude | メインモデルを使用 | Anthropic ネイティブ画像形式 |
| Gemini | メインモデルを使用 | inlineData 形式 | | Gemini | メインモデルを使用 | inlineData 形式 |
| 豆包 (Doubao) | メインモデルを使用 | doubao-seed-2-0 シリーズがネイティブ対応 | | 豆包 (Doubao) | メインモデルを使用 | doubao-seed-2-0 シリーズがネイティブ対応 |

View File

@@ -61,7 +61,7 @@ Reference: [Quick Start](https://help.aliyun.com/zh/model-studio/coding-plan-qui
```json ```json
{ {
"bot_type": "openai", "bot_type": "openai",
"model": "MiniMax-M2.5", "model": "MiniMax-M3",
"open_ai_api_base": "https://api.minimaxi.com/v1", "open_ai_api_base": "https://api.minimaxi.com/v1",
"open_ai_api_key": "YOUR_API_KEY" "open_ai_api_key": "YOUR_API_KEY"
} }
@@ -69,7 +69,7 @@ Reference: [Quick Start](https://help.aliyun.com/zh/model-studio/coding-plan-qui
| Parameter | Description | | Parameter | Description |
| --- | --- | | --- | --- |
| `model` | `MiniMax-M2.5`, `MiniMax-M2.5-highspeed`, `MiniMax-M2.1`, `MiniMax-M2` | | `model` | `MiniMax-M3`, `MiniMax-M2.7`, `MiniMax-M2.7-highspeed` |
| `open_ai_api_base` | China: `https://api.minimaxi.com/v1`; Global: `https://api.minimax.io/v1` | | `open_ai_api_base` | China: `https://api.minimaxi.com/v1`; Global: `https://api.minimax.io/v1` |
| `open_ai_api_key` | Coding Plan specific key (not shared with pay-as-you-go) | | `open_ai_api_key` | Coding Plan specific key (not shared with pay-as-you-go) |

View File

@@ -12,12 +12,12 @@ A snapshot of each vendor's capabilities. "Text" refers to the main chat model;
| Vendor | Representative Models | Text | Vision | Image Gen | STT | TTS | Embedding | | Vendor | Representative Models | Text | Vision | Image Gen | STT | TTS | Embedding |
| --- | --- | :-: | :-: | :-: | :-: | :-: | :-: | | --- | --- | :-: | :-: | :-: | :-: | :-: | :-: |
| [DeepSeek](/models/deepseek) | deepseek-v4-flash / pro | ✅ | | | | | | | [DeepSeek](/models/deepseek) | deepseek-v4-flash / pro | ✅ | | | | | |
| [MiniMax](/models/minimax) | MiniMax-M2.7 | ✅ | ✅ | ✅ | | ✅ | | | [MiniMax](/models/minimax) | MiniMax-M3 | ✅ | ✅ | ✅ | | ✅ | |
| [Claude](/models/claude) | claude-opus-4-8 | ✅ | ✅ | | | | | | [Claude](/models/claude) | claude-opus-4-8 | ✅ | ✅ | | | | |
| [Gemini](/models/gemini) | gemini-3.5-flash | ✅ | ✅ | ✅ | | | | | [Gemini](/models/gemini) | gemini-3.5-flash | ✅ | ✅ | ✅ | | | |
| [OpenAI](/models/openai) | gpt-5.5, o-series | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | [OpenAI](/models/openai) | gpt-5.5, o-series | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| [GLM](/models/glm) | glm-5.1, glm-5v-turbo | ✅ | ✅ | | ✅ | | ✅ | | [GLM](/models/glm) | glm-5.1, glm-5v-turbo | ✅ | ✅ | | ✅ | | ✅ |
| [Qwen](/models/qwen) | qwen3.7-max | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | [Qwen](/models/qwen) | qwen3.7-plus | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| [Doubao](/models/doubao) | doubao-seed-2.0 series | ✅ | ✅ | ✅ | | | ✅ | | [Doubao](/models/doubao) | doubao-seed-2.0 series | ✅ | ✅ | ✅ | | | ✅ |
| [Kimi](/models/kimi) | kimi-k2.6 | ✅ | ✅ | | | | | | [Kimi](/models/kimi) | kimi-k2.6 | ✅ | ✅ | | | | |
| [ERNIE](/models/qianfan) | ernie-5.1 | ✅ | ✅ | | | | | | [ERNIE](/models/qianfan) | ernie-5.1 | ✅ | ✅ | | | | |

View File

@@ -40,7 +40,7 @@ Once configured, the Agent's Vision tool automatically calls multimodal models v
} }
``` ```
Available models: `gpt-4.1-mini`, `gpt-5.4-mini`, `qwen3.6-plus`, `doubao-seed-2-0-pro-260215`, `kimi-k2.6`, `claude-sonnet-4-6`, `gemini-3.1-flash-lite-preview`, etc. Available models: `gpt-4.1-mini`, `gpt-5.4-mini`, `qwen3.7-plus`, `doubao-seed-2-0-pro-260215`, `kimi-k2.6`, `claude-sonnet-4-6`, `gemini-3.1-flash-lite-preview`, etc.
## Image Generation ## Image Generation

View File

@@ -13,14 +13,14 @@ MiniMax supports text chat, image understanding, image generation, and text-to-s
```json ```json
{ {
"model": "MiniMax-M2.7", "model": "MiniMax-M3",
"minimax_api_key": "YOUR_API_KEY" "minimax_api_key": "YOUR_API_KEY"
} }
``` ```
| Parameter | Description | | Parameter | Description |
| --- | --- | | --- | --- |
| `model` | Can be `MiniMax-M2.7`, `MiniMax-M2.7-highspeed`, `MiniMax-M2.5`, `MiniMax-M2.1`, `MiniMax-M2.1-lightning`, `MiniMax-M2`, etc. | | `model` | Can be `MiniMax-M3`, `MiniMax-M2.7`, `MiniMax-M2.7-highspeed`, etc. |
| `minimax_api_key` | Create one in the [MiniMax Console](https://platform.minimaxi.com/user-center/basic-information/interface-key) | | `minimax_api_key` | Create one in the [MiniMax Console](https://platform.minimaxi.com/user-center/basic-information/interface-key) |
## Image Understanding ## Image Understanding

View File

@@ -13,19 +13,19 @@ Qwen (Alibaba DashScope / Bailian) is one of the most fully-featured vendors. Te
```json ```json
{ {
"model": "qwen3.6-plus", "model": "qwen3.7-plus",
"dashscope_api_key": "YOUR_API_KEY" "dashscope_api_key": "YOUR_API_KEY"
} }
``` ```
| Parameter | Description | | Parameter | Description |
| --- | --- | | --- | --- |
| `model` | Can be `qwen3.6-plus`, `qwen3.7-max`, `qwen3.5-plus`, `qwen3-max`, `qwen-max`, `qwen-plus`, `qwen-turbo`, `qwq-plus`, etc. | | `model` | Can be `qwen3.7-plus`, `qwen3.7-max`, `qwen3.6-plus`, `qwen3.5-plus`, `qwen3-max`, `qwen-max`, `qwen-plus`, `qwen-turbo`, `qwq-plus`, etc. |
| `dashscope_api_key` | Create one in the [Bailian Console](https://bailian.console.aliyun.com/?tab=model#/api-key); see the [official docs](https://bailian.console.aliyun.com/?tab=api#/api) | | `dashscope_api_key` | Create one in the [Bailian Console](https://bailian.console.aliyun.com/?tab=model#/api-key); see the [official docs](https://bailian.console.aliyun.com/?tab=api#/api) |
## Image Understanding ## Image Understanding
Once `dashscope_api_key` is configured, the Agent's Vision tool automatically calls Qwen's vision models to recognize images. Models like `qwen3-max` / `qwen3.5-plus` / `qwen3.6-plus` are already multimodal; if the main model is text-only (e.g. `qwen-turbo`), it automatically falls back to `qwen-vl-max`. Once `dashscope_api_key` is configured, the Agent's Vision tool automatically calls Qwen's vision models to recognize images. Models like `qwen3.7-plus` / `qwen3.6-plus` / `qwen3.5-plus` / `qwen3-max` are already multimodal; if the main model is text-only (e.g. `qwen-turbo`), it automatically falls back to `qwen-vl-max`.
To manually specify a Vision model: To manually specify a Vision model:
@@ -33,13 +33,13 @@ To manually specify a Vision model:
{ {
"tools": { "tools": {
"vision": { "vision": {
"model": "qwen3.6-plus" "model": "qwen3.7-plus"
} }
} }
} }
``` ```
Supported models: `qwen3.6-plus`, `qwen3.5-plus`, `qwen3-max`. Supported models: `qwen3.7-plus`, `qwen3.6-plus`, `qwen3.5-plus`, `qwen3-max`.
## Image Generation ## Image Generation

View File

@@ -19,7 +19,7 @@ If the current provider fails, the tool automatically tries the next one until i
| Provider | Vision Model | Notes | | Provider | Vision Model | Notes |
| --- | --- | --- | | --- | --- | --- |
| OpenAI / Compatible | Main model | All OpenAI-protocol-compatible multimodal models | | OpenAI / Compatible | Main model | All OpenAI-protocol-compatible multimodal models |
| Qwen (DashScope) | Main model | e.g. qwen3.6-plus, etc. | | Qwen (DashScope) | Main model | e.g. qwen3.7-plus, etc. |
| Claude | Main model | Anthropic native image format | | Claude | Main model | Anthropic native image format |
| Gemini | Main model | inlineData format | | Gemini | Main model | inlineData format |
| Doubao | Main model | doubao-seed-2-0 series natively supported | | Doubao | Main model | doubao-seed-2-0 series natively supported |

View File

@@ -95,12 +95,12 @@ CowAgent 支持国内外主流厂商的大语言模型。**文本对话、图像
| 厂商 | 代表模型 | 文本 | 图像理解 | 图像生成 | 语音识别 | 语音合成 | 向量 | | 厂商 | 代表模型 | 文本 | 图像理解 | 图像生成 | 语音识别 | 语音合成 | 向量 |
| --- | --- | :-: | :-: | :-: | :-: | :-: | :-: | | --- | --- | :-: | :-: | :-: | :-: | :-: | :-: |
| [DeepSeek](https://docs.cowagent.ai/zh/models/deepseek) | deepseek-v4-flash / pro | ✅ | | | | | | | [DeepSeek](https://docs.cowagent.ai/zh/models/deepseek) | deepseek-v4-flash / pro | ✅ | | | | | |
| [MiniMax](https://docs.cowagent.ai/zh/models/minimax) | MiniMax-M2.7 | ✅ | ✅ | ✅ | | ✅ | | | [MiniMax](https://docs.cowagent.ai/zh/models/minimax) | MiniMax-M3 | ✅ | ✅ | ✅ | | ✅ | |
| [Claude](https://docs.cowagent.ai/zh/models/claude) | claude-opus-4-8 | ✅ | ✅ | | | | | | [Claude](https://docs.cowagent.ai/zh/models/claude) | claude-opus-4-8 | ✅ | ✅ | | | | |
| [Gemini](https://docs.cowagent.ai/zh/models/gemini) | gemini-3.5-flash | ✅ | ✅ | ✅ | | | | | [Gemini](https://docs.cowagent.ai/zh/models/gemini) | gemini-3.5-flash | ✅ | ✅ | ✅ | | | |
| [OpenAI](https://docs.cowagent.ai/zh/models/openai) | gpt-5.5、o 系列 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | [OpenAI](https://docs.cowagent.ai/zh/models/openai) | gpt-5.5、o 系列 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| [智谱 GLM](https://docs.cowagent.ai/zh/models/glm) | glm-5.1、glm-5v-turbo | ✅ | ✅ | | ✅ | | ✅ | | [智谱 GLM](https://docs.cowagent.ai/zh/models/glm) | glm-5.1、glm-5v-turbo | ✅ | ✅ | | ✅ | | ✅ |
| [通义千问](https://docs.cowagent.ai/zh/models/qwen) | qwen3.7-max | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | [通义千问](https://docs.cowagent.ai/zh/models/qwen) | qwen3.7-plus | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| [豆包 Doubao](https://docs.cowagent.ai/zh/models/doubao) | doubao-seed-2.0 系列 | ✅ | ✅ | ✅ | | | ✅ | | [豆包 Doubao](https://docs.cowagent.ai/zh/models/doubao) | doubao-seed-2.0 系列 | ✅ | ✅ | ✅ | | | ✅ |
| [Kimi](https://docs.cowagent.ai/zh/models/kimi) | kimi-k2.6 | ✅ | ✅ | | | | | | [Kimi](https://docs.cowagent.ai/zh/models/kimi) | kimi-k2.6 | ✅ | ✅ | | | | |
| [百度ERNIE](https://docs.cowagent.ai/zh/models/qianfan) | ernie-5.1 | ✅ | ✅ | | | | | | [百度ERNIE](https://docs.cowagent.ai/zh/models/qianfan) | ernie-5.1 | ✅ | ✅ | | | | |
@@ -250,9 +250,9 @@ CowAgent 支持国内外主流厂商的大语言模型。**文本对话、图像
## 🛠️ 开发与贡献 ## 🛠️ 开发与贡献
欢迎接入更多应用通道,参考 [飞书通道实现](https://github.com/zhayujie/CowAgent/blob/master/channel/feishu/feishu_channel.py) 新增自定义通道;同时欢迎贡献新技能,向 [Skill Hub](https://skills.cowagent.ai/submit) 提交 欢迎各种形式的贡献新功能、Bug 修复、性能优化、文档完善,或向 [Skill Hub](https://skills.cowagent.ai/submit) 分享你的技能。请先阅读 [CONTRIBUTING.md](/CONTRIBUTING.md) 了解如何开始,然后提交 Issue 讨论或直接发起 PR
通过 ⭐ Star 关注项目更新,欢迎提交 PR、Issue 进行反馈。 欢迎 ⭐ Star 支持项目,并通过 Watch → Custom → Releases 订阅新版本通知。也欢迎提交 PR、Issue 进行反馈。
## 🌟 贡献者 ## 🌟 贡献者

View File

@@ -33,7 +33,7 @@ description: 查看状态、管理配置和上下文等常用命令
Process: PID 12345 | Running 2h 15m Process: PID 12345 | Running 2h 15m
Version: 2.0.4 Version: 2.0.4
Channel: web Channel: web
Model: MiniMax-M2.5 Model: MiniMax-M3
Mode: agent Mode: agent
Session: 12 messages | 8 skills loaded Session: 12 messages | 8 skills loaded

View File

@@ -75,7 +75,7 @@ cow status
Status: ● Running (PID: 12345) Status: ● Running (PID: 12345)
Version: 2.0.4 Version: 2.0.4
Channel: web Channel: web
Model: MiniMax-M2.5 Model: MiniMax-M3
Mode: agent Mode: agent
``` ```

View File

@@ -61,7 +61,7 @@ description: Coding Plan 模式模型配置
```json ```json
{ {
"bot_type": "openai", "bot_type": "openai",
"model": "MiniMax-M2.5", "model": "MiniMax-M3",
"open_ai_api_base": "https://api.minimaxi.com/v1", "open_ai_api_base": "https://api.minimaxi.com/v1",
"open_ai_api_key": "YOUR_API_KEY" "open_ai_api_key": "YOUR_API_KEY"
} }
@@ -69,7 +69,7 @@ description: Coding Plan 模式模型配置
| 参数 | 说明 | | 参数 | 说明 |
| --- | --- | | --- | --- |
| `model` | `MiniMax-M2.5`、`MiniMax-M2.5-highspeed`、`MiniMax-M2.1`、`MiniMax-M2` | | `model` | `MiniMax-M3`、`MiniMax-M2.7`、`MiniMax-M2.7-highspeed` |
| `open_ai_api_base` | 国内:`https://api.minimaxi.com/v1`;海外:`https://api.minimax.io/v1` | | `open_ai_api_base` | 国内:`https://api.minimaxi.com/v1`;海外:`https://api.minimax.io/v1` |
| `open_ai_api_key` | Coding Plan 专用 Key与按量计费接口不通用 | | `open_ai_api_key` | Coding Plan 专用 Key与按量计费接口不通用 |

View File

@@ -13,12 +13,12 @@ CowAgent 支持国内外主流厂商的大语言模型,模型接口实现在
| 厂商 | 代表模型 | 文本 | 图像理解 | 图像生成 | 语音识别 | 语音合成 | 向量 | | 厂商 | 代表模型 | 文本 | 图像理解 | 图像生成 | 语音识别 | 语音合成 | 向量 |
| --- | --- | :-: | :-: | :-: | :-: | :-: | :-: | | --- | --- | :-: | :-: | :-: | :-: | :-: | :-: |
| [DeepSeek](/zh/models/deepseek) | deepseek-v4-flash / pro | ✅ | | | | | | | [DeepSeek](/zh/models/deepseek) | deepseek-v4-flash / pro | ✅ | | | | | |
| [MiniMax](/zh/models/minimax) | MiniMax-M2.7 | ✅ | ✅ | ✅ | | ✅ | | | [MiniMax](/zh/models/minimax) | MiniMax-M3 | ✅ | ✅ | ✅ | | ✅ | |
| [Claude](/zh/models/claude) | claude-opus-4-8 | ✅ | ✅ | | | | | | [Claude](/zh/models/claude) | claude-opus-4-8 | ✅ | ✅ | | | | |
| [Gemini](/zh/models/gemini) | gemini-3.5-flash | ✅ | ✅ | ✅ | | | | | [Gemini](/zh/models/gemini) | gemini-3.5-flash | ✅ | ✅ | ✅ | | | |
| [OpenAI](/zh/models/openai) | gpt-5.5、o 系列 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | [OpenAI](/zh/models/openai) | gpt-5.5、o 系列 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| [智谱 GLM](/zh/models/glm) | glm-5.1、glm-5v-turbo | ✅ | ✅ | | ✅ | | ✅ | | [智谱 GLM](/zh/models/glm) | glm-5.1、glm-5v-turbo | ✅ | ✅ | | ✅ | | ✅ |
| [通义千问](/zh/models/qwen) | qwen3.7-max | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | [通义千问](/zh/models/qwen) | qwen3.7-plus | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| [豆包 Doubao](/zh/models/doubao) | doubao-seed-2.0 系列 | ✅ | ✅ | ✅ | | | ✅ | | [豆包 Doubao](/zh/models/doubao) | doubao-seed-2.0 系列 | ✅ | ✅ | ✅ | | | ✅ |
| [Kimi](/zh/models/kimi) | kimi-k2.6 | ✅ | ✅ | | | | | | [Kimi](/zh/models/kimi) | kimi-k2.6 | ✅ | ✅ | | | | |
| [百度千帆](/zh/models/qianfan) | ernie-5.1 | ✅ | ✅ | | | | | | [百度千帆](/zh/models/qianfan) | ernie-5.1 | ✅ | ✅ | | | | |

View File

@@ -40,7 +40,7 @@ description: 通过 LinkAI 平台统一接入文本、视觉、图像、语音
} }
``` ```
可选模型:`gpt-4.1-mini`、`gpt-5.4-mini`、`qwen3.6-plus`、`doubao-seed-2-0-pro-260215`、`kimi-k2.6`、`claude-sonnet-4-6`、`gemini-3.1-flash-lite-preview` 等。 可选模型:`gpt-4.1-mini`、`gpt-5.4-mini`、`qwen3.7-plus`、`doubao-seed-2-0-pro-260215`、`kimi-k2.6`、`claude-sonnet-4-6`、`gemini-3.1-flash-lite-preview` 等。
## 图像生成 ## 图像生成

View File

@@ -13,14 +13,14 @@ MiniMax 支持文本对话、图像理解、图像生成与语音合成,一份
```json ```json
{ {
"model": "MiniMax-M2.7", "model": "MiniMax-M3",
"minimax_api_key": "YOUR_API_KEY" "minimax_api_key": "YOUR_API_KEY"
} }
``` ```
| 参数 | 说明 | | 参数 | 说明 |
| --- | --- | | --- | --- |
| `model` | 可填 `MiniMax-M2.7`、`MiniMax-M2.7-highspeed`、`MiniMax-M2.5`、`MiniMax-M2.1`、`MiniMax-M2.1-lightning`、`MiniMax-M2` 等 | | `model` | 可填 `MiniMax-M3`、`MiniMax-M2.7`、`MiniMax-M2.7-highspeed` 等 |
| `minimax_api_key` | 在 [MiniMax 控制台](https://platform.minimaxi.com/user-center/basic-information/interface-key) 创建 | | `minimax_api_key` | 在 [MiniMax 控制台](https://platform.minimaxi.com/user-center/basic-information/interface-key) 创建 |
## 图像理解 ## 图像理解

View File

@@ -13,19 +13,19 @@ description: 通义千问模型配置(文本 / 图像理解 / 图像生成 /
```json ```json
{ {
"model": "qwen3.6-plus", "model": "qwen3.7-plus",
"dashscope_api_key": "YOUR_API_KEY" "dashscope_api_key": "YOUR_API_KEY"
} }
``` ```
| 参数 | 说明 | | 参数 | 说明 |
| --- | --- | | --- | --- |
| `model` | 可填 `qwen3.6-plus`、`qwen3.7-max`、`qwen3.5-plus`、`qwen3-max`、`qwen-max`、`qwen-plus`、`qwen-turbo`、`qwq-plus` 等 | | `model` | 可填 `qwen3.7-plus`、`qwen3.7-max`、`qwen3.6-plus`、`qwen3.5-plus`、`qwen3-max`、`qwen-max`、`qwen-plus`、`qwen-turbo`、`qwq-plus` 等 |
| `dashscope_api_key` | 在 [百炼控制台](https://bailian.console.aliyun.com/?tab=model#/api-key) 创建,参考 [官方文档](https://bailian.console.aliyun.com/?tab=api#/api) | | `dashscope_api_key` | 在 [百炼控制台](https://bailian.console.aliyun.com/?tab=model#/api-key) 创建,参考 [官方文档](https://bailian.console.aliyun.com/?tab=api#/api) |
## 图像理解 ## 图像理解
配置 `dashscope_api_key` 后 Agent 的 Vision 工具会自动调用千问的视觉模型识别图像。`qwen3-max` / `qwen3.5-plus` / `qwen3.6-plus` 等模型本身就是多模态;若主模型是纯文本(如 `qwen-turbo`),会自动回落到 `qwen-vl-max`。 配置 `dashscope_api_key` 后 Agent 的 Vision 工具会自动调用千问的视觉模型识别图像。`qwen3.7-plus` / `qwen3.6-plus` / `qwen3.5-plus` / `qwen3-max` 等模型本身就是多模态;若主模型是纯文本(如 `qwen-turbo`),会自动回落到 `qwen-vl-max`。
如需手动指定 Vision 模型: 如需手动指定 Vision 模型:
@@ -33,13 +33,13 @@ description: 通义千问模型配置(文本 / 图像理解 / 图像生成 /
{ {
"tools": { "tools": {
"vision": { "vision": {
"model": "qwen3.6-plus" "model": "qwen3.7-plus"
} }
} }
} }
``` ```
支持模型:`qwen3.6-plus`、`qwen3.5-plus`、`qwen3-max`。 支持模型:`qwen3.7-plus`、`qwen3.6-plus`、`qwen3.5-plus`、`qwen3-max`。
## 图像生成 ## 图像生成

View File

@@ -19,7 +19,7 @@ Vision 工具采用多级自动选择 + 自动兜底策略,无需手动配置
| 厂商 | 视觉模型 | 说明 | | 厂商 | 视觉模型 | 说明 |
| --- | --- | --- | | --- | --- | --- |
| OpenAI / 兼容协议 | 使用主模型 | 支持所有 OpenAI 协议兼容的多模态模型 | | OpenAI / 兼容协议 | 使用主模型 | 支持所有 OpenAI 协议兼容的多模态模型 |
| 通义千问 (DashScope) | 使用主模型 | 例如 qwen3.6-plus 等 | | 通义千问 (DashScope) | 使用主模型 | 例如 qwen3.7-plus 等 |
| Claude | 使用主模型 | Anthropic 原生图像格式 | | Claude | 使用主模型 | Anthropic 原生图像格式 |
| Gemini | 使用主模型 | inlineData 格式 | | Gemini | 使用主模型 | inlineData 格式 |
| 豆包 (Doubao) | 使用主模型 | doubao-seed-2-0 系列原生支持 | | 豆包 (Doubao) | 使用主模型 | doubao-seed-2-0 系列原生支持 |

View File

@@ -28,15 +28,15 @@ dashscope_models = {
# Model name prefixes that require MultiModalConversation API instead of Generation API. # Model name prefixes that require MultiModalConversation API instead of Generation API.
# Qwen3.5+ series are omni models that only support MultiModalConversation. # Qwen3.5+ series are omni models that only support MultiModalConversation.
MULTIMODAL_MODEL_PREFIXES = ("qwen3.5-", "qwen3.6-") MULTIMODAL_MODEL_PREFIXES = ("qwen3.5-", "qwen3.6-", "qwen3.7-plus")
# Qwen对话模型API # Qwen对话模型API
class DashscopeBot(Bot): class DashscopeBot(Bot):
def __init__(self): def __init__(self):
super().__init__() super().__init__()
self.sessions = SessionManager(DashscopeSession, model=conf().get("model") or "qwen3.6-plus") self.sessions = SessionManager(DashscopeSession, model=conf().get("model") or "qwen3.7-plus")
self.model_name = conf().get("model") or "qwen3.6-plus" self.model_name = conf().get("model") or "qwen3.7-plus"
self.client = dashscope.Generation self.client = dashscope.Generation
api_key = conf().get("dashscope_api_key") api_key = conf().get("dashscope_api_key")
if api_key: if api_key:

View File

@@ -22,7 +22,7 @@ class MinimaxBot(Bot):
def __init__(self): def __init__(self):
super().__init__() super().__init__()
self.args = { self.args = {
"model": conf().get("model") or "MiniMax-M2.7", "model": conf().get("model") or "MiniMax-M3",
"temperature": conf().get("temperature", 0.3), "temperature": conf().get("temperature", 0.3),
"top_p": conf().get("top_p", 0.95), "top_p": conf().get("top_p", 0.95),
} }

View File

@@ -24,6 +24,10 @@
"url": "https://github.com/dividduang/blackroom.git", "url": "https://github.com/dividduang/blackroom.git",
"desc": "小黑屋插件,被拉进小黑屋的人将不能使用@bot的功能的插件" "desc": "小黑屋插件,被拉进小黑屋的人将不能使用@bot的功能的插件"
}, },
"group_task_board": {
"url": "https://github.com/Wyh-max-star/cowagent-plugin-group-task-board.git",
"desc": "群聊任务看板插件,支持从群聊消息中创建、查看和管理任务"
},
"midjourney": { "midjourney": {
"url": "https://github.com/baojingyu/midjourney.git", "url": "https://github.com/baojingyu/midjourney.git",
"desc": "利用midjourney实现ai绘图的的插件" "desc": "利用midjourney实现ai绘图的的插件"

38
run.sh
View File

@@ -596,17 +596,18 @@ select_model() {
echo "" echo ""
local title sel local title sel
title="$(t "选择 AI 模型" "Select AI Model")" title="$(t "选择 AI 模型" "Select AI Model")"
# The 11th option is "skip" -> configure later in the web console. # The 12th option is "skip" -> configure later in the web console.
select_menu sel "$title" \ select_menu sel "$title" \
"DeepSeek (deepseek-v4-flash, deepseek-v4-pro, etc.)" \ "DeepSeek (deepseek-v4-flash, deepseek-v4-pro, etc.)" \
"Claude (claude-opus-4-8, claude-opus-4-7, claude-sonnet-4-6, etc.)" \ "Claude (claude-opus-4-8, claude-opus-4-7, etc.)" \
"Gemini (gemini-3.1-flash-lite-preview, gemini-3.1-pro-preview, etc.)" \ "Gemini (gemini-3.5-flash, gemini-3.1-pro-preview, etc.)" \
"OpenAI GPT (gpt-5.4, gpt-5.2, gpt-4.1, etc.)" \ "OpenAI (gpt-5.5, etc.)" \
"MiniMax (MiniMax-M2.7, MiniMax-M2.5, etc.)" \ "MiniMax (MiniMax-M3, etc.)" \
"Zhipu AI (glm-5.1, glm-5-turbo, glm-5, etc.)" \ "GLM (glm-5.1, etc.)" \
"Qwen (qwen3.6-plus, qwen3.5-plus, qwen3-max, qwq-plus, etc.)" \ "Qwen (qwen3.7-plus, qwen3.7-max, etc.)" \
"Doubao (doubao-seed-2-0-code-preview-260215, etc.)" \ "Doubao (doubao-seed-2.0, etc.)" \
"Kimi (kimi-k2.6, kimi-k2.5, kimi-k2, etc.)" \ "Kimi (kimi-k2.6, etc.)" \
"MiMo (mimo-v2.5-pro, etc.)" \
"LinkAI ($(t "一个 Key 接入所有模型" "access all models via one API"))" \ "LinkAI ($(t "一个 Key 接入所有模型" "access all models via one API"))" \
"$(t "⏭ 跳过(稍后在 Web 控制台配置)" "⏭ Skip (configure later in the web console)")" "$(t "⏭ 跳过(稍后在 Web 控制台配置)" "⏭ Skip (configure later in the web console)")"
model_choice="$sel" model_choice="$sel"
@@ -632,19 +633,20 @@ configure_model() {
1) read_model_config "DeepSeek" "deepseek-v4-flash" "DEEPSEEK_KEY" ;; 1) read_model_config "DeepSeek" "deepseek-v4-flash" "DEEPSEEK_KEY" ;;
2) read_model_config "Claude" "claude-opus-4-8" "CLAUDE_KEY" ;; 2) read_model_config "Claude" "claude-opus-4-8" "CLAUDE_KEY" ;;
3) read_model_config "Gemini" "gemini-3.1-pro-preview" "GEMINI_KEY" ;; 3) read_model_config "Gemini" "gemini-3.1-pro-preview" "GEMINI_KEY" ;;
4) read_model_config "OpenAI GPT" "gpt-5.4" "OPENAI_KEY" ;; 4) read_model_config "OpenAI" "gpt-5.5" "OPENAI_KEY" ;;
5) read_model_config "MiniMax" "MiniMax-M2.7" "MINIMAX_KEY" ;; 5) read_model_config "MiniMax" "MiniMax-M3" "MINIMAX_KEY" ;;
6) read_model_config "Zhipu AI" "glm-5.1" "ZHIPU_KEY" ;; 6) read_model_config "GLM" "glm-5.1" "ZHIPU_KEY" ;;
7) read_model_config "Qwen (DashScope)" "qwen3.6-plus" "DASHSCOPE_KEY" ;; 7) read_model_config "Qwen (DashScope)" "qwen3.7-plus" "DASHSCOPE_KEY" ;;
8) read_model_config "Doubao (Volcengine Ark)" "doubao-seed-2-0-code-preview-260215" "ARK_KEY" ;; 8) read_model_config "Doubao (Volcengine Ark)" "doubao-seed-2-0-code-preview-260215" "ARK_KEY" ;;
9) read_model_config "Kimi (Moonshot)" "kimi-k2.6" "MOONSHOT_KEY" ;; 9) read_model_config "Kimi (Moonshot)" "kimi-k2.6" "MOONSHOT_KEY" ;;
10) 10) read_model_config "MiMo" "mimo-v2.5-pro" "MIMO_KEY" ;;
11)
# Show where to obtain a LinkAI key (zh users -> console page). # Show where to obtain a LinkAI key (zh users -> console page).
echo -e "${CYAN}$(t "获取 LinkAI Key" "Get your LinkAI Key"): https://link-ai.tech/console/interface${NC}" echo -e "${CYAN}$(t "获取 LinkAI Key" "Get your LinkAI Key"): https://link-ai.tech/console/interface${NC}"
read_model_config "LinkAI" "deepseek-v4-flash" "LINKAI_KEY" read_model_config "LinkAI" "deepseek-v4-flash" "LINKAI_KEY"
USE_LINKAI="true" USE_LINKAI="true"
;; ;;
11) 12)
# Skip: leave model unset, will be configured in web console # Skip: leave model unset, will be configured in web console
MODEL_SKIPPED="true" MODEL_SKIPPED="true"
MODEL_NAME="" MODEL_NAME=""
@@ -657,8 +659,8 @@ configure_model() {
channel_label() { channel_label() {
case "$1" in case "$1" in
web) t "Web 网页控制台(推荐,开箱即用)" "Web Console (recommended, ready to use)" ;; web) t "Web 网页控制台(推荐,开箱即用)" "Web Console (recommended, ready to use)" ;;
weixin) t "微信" "WeChat (Weixin)" ;; weixin) t "微信" "Wechat" ;;
feishu) t "飞书" "Feishu / Lark" ;; feishu) t "飞书" "Feishu" ;;
dingtalk) t "钉钉" "DingTalk" ;; dingtalk) t "钉钉" "DingTalk" ;;
wecom_bot) t "企微智能机器人" "WeCom Bot" ;; wecom_bot) t "企微智能机器人" "WeCom Bot" ;;
qq) printf '%s' "QQ" ;; qq) printf '%s' "QQ" ;;
@@ -823,6 +825,7 @@ create_config_file() {
ARK_KEY="${ARK_KEY:-}" \ ARK_KEY="${ARK_KEY:-}" \
DASHSCOPE_KEY="${DASHSCOPE_KEY:-}" \ DASHSCOPE_KEY="${DASHSCOPE_KEY:-}" \
MINIMAX_KEY="${MINIMAX_KEY:-}" \ MINIMAX_KEY="${MINIMAX_KEY:-}" \
MIMO_KEY="${MIMO_KEY:-}" \
DEEPSEEK_KEY="${DEEPSEEK_KEY:-}" \ DEEPSEEK_KEY="${DEEPSEEK_KEY:-}" \
DEEPSEEK_BASE="${DEEPSEEK_BASE:-https://api.deepseek.com/v1}" \ DEEPSEEK_BASE="${DEEPSEEK_BASE:-https://api.deepseek.com/v1}" \
USE_LINKAI="${USE_LINKAI:-false}" \ USE_LINKAI="${USE_LINKAI:-false}" \
@@ -865,6 +868,7 @@ base = {
'ark_api_key': e('ARK_KEY', ''), 'ark_api_key': e('ARK_KEY', ''),
'dashscope_api_key': e('DASHSCOPE_KEY', ''), 'dashscope_api_key': e('DASHSCOPE_KEY', ''),
'minimax_api_key': e('MINIMAX_KEY', ''), 'minimax_api_key': e('MINIMAX_KEY', ''),
'mimo_api_key': e('MIMO_KEY', ''),
'deepseek_api_key': e('DEEPSEEK_KEY', ''), 'deepseek_api_key': e('DEEPSEEK_KEY', ''),
'deepseek_api_base': e('DEEPSEEK_BASE'), 'deepseek_api_base': e('DEEPSEEK_BASE'),
'voice_to_text': 'openai', 'voice_to_text': 'openai',

View File

@@ -367,13 +367,14 @@ $ModelChoices = @{
1 = @{ Provider = "DeepSeek"; Default = "deepseek-v4-flash"; Field = "deepseek_api_key" } 1 = @{ Provider = "DeepSeek"; Default = "deepseek-v4-flash"; Field = "deepseek_api_key" }
2 = @{ Provider = "Claude"; Default = "claude-opus-4-8"; Field = "claude_api_key"; BaseField = "claude_api_base" } 2 = @{ Provider = "Claude"; Default = "claude-opus-4-8"; Field = "claude_api_key"; BaseField = "claude_api_base" }
3 = @{ Provider = "Gemini"; Default = "gemini-3.1-pro-preview"; Field = "gemini_api_key"; BaseField = "gemini_api_base" } 3 = @{ Provider = "Gemini"; Default = "gemini-3.1-pro-preview"; Field = "gemini_api_key"; BaseField = "gemini_api_base" }
4 = @{ Provider = "OpenAI GPT"; Default = "gpt-5.4"; Field = "open_ai_api_key"; BaseField = "open_ai_api_base" } 4 = @{ Provider = "OpenAI"; Default = "gpt-5.5"; Field = "open_ai_api_key"; BaseField = "open_ai_api_base" }
5 = @{ Provider = "MiniMax"; Default = "MiniMax-M2.7"; Field = "minimax_api_key" } 5 = @{ Provider = "MiniMax"; Default = "MiniMax-M3"; Field = "minimax_api_key" }
6 = @{ Provider = "Zhipu AI"; Default = "glm-5.1"; Field = "zhipu_ai_api_key" } 6 = @{ Provider = "GLM"; Default = "glm-5.1"; Field = "zhipu_ai_api_key" }
7 = @{ Provider = "Qwen (DashScope)"; Default = "qwen3.6-plus"; Field = "dashscope_api_key" } 7 = @{ Provider = "Qwen (DashScope)"; Default = "qwen3.7-plus"; Field = "dashscope_api_key" }
8 = @{ Provider = "Doubao (Volcengine Ark)"; Default = "doubao-seed-2-0-code-preview-260215"; Field = "ark_api_key" } 8 = @{ Provider = "Doubao (Volcengine Ark)"; Default = "doubao-seed-2-0-code-preview-260215"; Field = "ark_api_key" }
9 = @{ Provider = "Kimi (Moonshot)"; Default = "kimi-k2.6"; Field = "moonshot_api_key" } 9 = @{ Provider = "Kimi (Moonshot)"; Default = "kimi-k2.6"; Field = "moonshot_api_key" }
10 = @{ Provider = "LinkAI"; Default = "deepseek-v4-flash"; Field = "linkai_api_key"; Linkai = $true } 10 = @{ Provider = "MiMo"; Default = "mimo-v2.5-pro"; Field = "mimo_api_key" }
11 = @{ Provider = "LinkAI"; Default = "deepseek-v4-flash"; Field = "linkai_api_key"; Linkai = $true }
} }
function Select-Model { function Select-Model {
@@ -381,14 +382,15 @@ function Select-Model {
$title = T "选择 AI 模型" "Select AI Model" $title = T "选择 AI 模型" "Select AI Model"
$options = @( $options = @(
"DeepSeek (deepseek-v4-flash, deepseek-v4-pro, etc.)", "DeepSeek (deepseek-v4-flash, deepseek-v4-pro, etc.)",
"Claude (claude-opus-4-8, claude-opus-4-7, claude-sonnet-4-6, etc.)", "Claude (claude-opus-4-8, claude-opus-4-7, etc.)",
"Gemini (gemini-3.1-flash-lite-preview, gemini-3.1-pro-preview, etc.)", "Gemini (gemini-3.5-flash, gemini-3.1-pro-preview, etc.)",
"OpenAI GPT (gpt-5.4, gpt-5.2, gpt-4.1, etc.)", "OpenAI (gpt-5.5, etc.)",
"MiniMax (MiniMax-M2.7, MiniMax-M2.5, etc.)", "MiniMax (MiniMax-M3, etc.)",
"Zhipu AI (glm-5.1, glm-5-turbo, glm-5, etc.)", "GLM (glm-5.1, etc.)",
"Qwen (qwen3.6-plus, qwen3.5-plus, qwen3-max, qwq-plus, etc.)", "Qwen (qwen3.7-plus, qwen3.7-max, etc.)",
"Doubao (doubao-seed-2-0-code-preview-260215, etc.)", "Doubao (doubao-seed-2.0, etc.)",
"Kimi (kimi-k2.6, kimi-k2.5, kimi-k2, etc.)", "Kimi (kimi-k2.6, etc.)",
"MiMo (mimo-v2.5-pro, etc.)",
("LinkAI (" + (T "一个 Key 接入所有模型" "access all models via one API") + ")"), ("LinkAI (" + (T "一个 Key 接入所有模型" "access all models via one API") + ")"),
(T "⏭ 跳过(稍后在 Web 控制台配置)" "⏭ Skip (configure later in the web console)") (T "⏭ 跳过(稍后在 Web 控制台配置)" "⏭ Skip (configure later in the web console)")
) )
@@ -406,7 +408,7 @@ function Configure-Model {
$script:ApiBaseField = "" $script:ApiBaseField = ""
$script:UseLinkai = $false $script:UseLinkai = $false
if ($script:ModelChoice -eq 11) { if ($script:ModelChoice -eq 12) {
# Skip: leave model unset, will be configured in the web console. # Skip: leave model unset, will be configured in the web console.
Write-Warn (T "已跳过模型配置,稍后可在 Web 控制台填写" "Model configuration skipped, you can set it later in the web console") Write-Warn (T "已跳过模型配置,稍后可在 Web 控制台填写" "Model configuration skipped, you can set it later in the web console")
return return
@@ -432,8 +434,8 @@ function Get-ChannelLabel {
param([string]$Key) param([string]$Key)
switch ($Key) { switch ($Key) {
"web" { return (T "Web 网页控制台(推荐,开箱即用)" "Web Console (recommended, ready to use)") } "web" { return (T "Web 网页控制台(推荐,开箱即用)" "Web Console (recommended, ready to use)") }
"weixin" { return (T "微信 Weixin" "WeChat (Weixin)") } "weixin" { return (T "微信 Weixin" "Wechat") }
"feishu" { return (T "飞书 Feishu" "Feishu / Lark") } "feishu" { return (T "飞书 Feishu" "Feishu") }
"dingtalk" { return (T "钉钉 DingTalk" "DingTalk") } "dingtalk" { return (T "钉钉 DingTalk" "DingTalk") }
"wecom_bot" { return (T "企微智能机器人 WeCom Bot" "WeCom Bot") } "wecom_bot" { return (T "企微智能机器人 WeCom Bot" "WeCom Bot") }
"qq" { return "QQ" } "qq" { return "QQ" }
@@ -563,6 +565,7 @@ function New-ConfigFile {
ark_api_key = "" ark_api_key = ""
dashscope_api_key = "" dashscope_api_key = ""
minimax_api_key = "" minimax_api_key = ""
mimo_api_key = ""
deepseek_api_key = "" deepseek_api_key = ""
deepseek_api_base = "https://api.deepseek.com/v1" deepseek_api_base = "https://api.deepseek.com/v1"
voice_to_text = "openai" voice_to_text = "openai"

View File

@@ -0,0 +1,63 @@
# encoding:utf-8
"""Unit tests for Qwen DashScope qwen3.7-plus provider updates."""
import os
import sys
import unittest
from unittest.mock import MagicMock, patch
sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))
class TestDashscopeConst(unittest.TestCase):
def test_qwen37_plus_constant_defined(self):
from common import const
self.assertEqual(const.QWEN37_PLUS, "qwen3.7-plus")
def test_qwen37_plus_in_model_list(self):
from common import const
self.assertIn("qwen3.7-plus", const.MODEL_LIST)
def test_qwen37_plus_before_qwen37_max_in_model_list(self):
from common import const
qwen_models = [m for m in const.MODEL_LIST if str(m).startswith("qwen")]
self.assertGreater(
len(qwen_models),
1,
)
self.assertEqual(qwen_models[0], "qwen3.7-plus")
class TestDashscopeBotDefaultModel(unittest.TestCase):
def test_default_model_is_qwen37_plus(self):
mock_conf = MagicMock()
mock_conf.get = MagicMock(side_effect=lambda key, default=None: default)
with patch("models.dashscope.dashscope_bot.conf", return_value=mock_conf):
with patch("models.dashscope.dashscope_bot.SessionManager"):
from models.dashscope.dashscope_bot import DashscopeBot
bot = DashscopeBot.__new__(DashscopeBot)
bot.sessions = MagicMock()
bot.model_name = mock_conf.get("model") or "qwen3.7-plus"
self.assertEqual(bot.model_name, "qwen3.7-plus")
def test_default_model_string_in_source(self):
bot_path = os.path.join(
os.path.dirname(__file__), "..", "models", "dashscope", "dashscope_bot.py"
)
with open(bot_path, encoding="utf-8") as f:
source = f.read()
self.assertIn('"qwen3.7-plus"', source)
class TestDashscopeMultimodalRouting(unittest.TestCase):
def test_qwen37_plus_uses_multimodal_api(self):
from models.dashscope.dashscope_bot import DashscopeBot
self.assertTrue(DashscopeBot._is_multimodal_model("qwen3.7-plus"))
def test_qwen37_max_uses_generation_api(self):
from models.dashscope.dashscope_bot import DashscopeBot
self.assertFalse(DashscopeBot._is_multimodal_model("qwen3.7-max"))
if __name__ == "__main__":
unittest.main()

View File

@@ -1,7 +1,7 @@
# encoding:utf-8 # encoding:utf-8
""" """
Unit tests for MiniMax provider additions: Unit tests for MiniMax provider additions:
- MiniMax-M2.7-highspeed constant in const.py - MiniMax-M3 / M2.7 / M2.7-highspeed constants in const.py
- Default model update in MinimaxBot - Default model update in MinimaxBot
- MinimaxVoice TTS provider - MinimaxVoice TTS provider
""" """
@@ -16,7 +16,12 @@ sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))
class TestMinimaxConst(unittest.TestCase): class TestMinimaxConst(unittest.TestCase):
"""Test that MiniMax-M2.7-highspeed is properly registered in const.py.""" """Test that MiniMax M3 / M2.7 constants are properly registered in const.py."""
def test_m3_constant_defined(self):
from common import const
self.assertTrue(hasattr(const, "MINIMAX_M3"))
self.assertEqual(const.MINIMAX_M3, "MiniMax-M3")
def test_m2_7_highspeed_constant_defined(self): def test_m2_7_highspeed_constant_defined(self):
from common import const from common import const
@@ -27,6 +32,10 @@ class TestMinimaxConst(unittest.TestCase):
from common import const from common import const
self.assertEqual(const.MINIMAX_M2_7, "MiniMax-M2.7") self.assertEqual(const.MINIMAX_M2_7, "MiniMax-M2.7")
def test_m3_in_model_list(self):
from common import const
self.assertIn("MiniMax-M3", const.MODEL_LIST)
def test_m2_7_highspeed_in_model_list(self): def test_m2_7_highspeed_in_model_list(self):
from common import const from common import const
self.assertIn("MiniMax-M2.7-highspeed", const.MODEL_LIST) self.assertIn("MiniMax-M2.7-highspeed", const.MODEL_LIST)
@@ -41,9 +50,9 @@ class TestMinimaxConst(unittest.TestCase):
class TestMinimaxBotDefaultModel(unittest.TestCase): class TestMinimaxBotDefaultModel(unittest.TestCase):
"""Test that MinimaxBot defaults to MiniMax-M2.7.""" """Test that MinimaxBot defaults to MiniMax-M3."""
def test_default_model_is_m2_7(self): def test_default_model_is_m3(self):
# Patch conf() to return empty config # Patch conf() to return empty config
mock_conf = MagicMock() mock_conf = MagicMock()
mock_conf.get = MagicMock(side_effect=lambda key, default=None: default) mock_conf.get = MagicMock(side_effect=lambda key, default=None: default)
@@ -57,18 +66,18 @@ class TestMinimaxBotDefaultModel(unittest.TestCase):
with patch("models.minimax.minimax_bot.conf", return_value=mock_conf): with patch("models.minimax.minimax_bot.conf", return_value=mock_conf):
bot = minimax_bot.MinimaxBot.__new__(minimax_bot.MinimaxBot) bot = minimax_bot.MinimaxBot.__new__(minimax_bot.MinimaxBot)
bot.args = { bot.args = {
"model": mock_conf.get("model") or "MiniMax-M2.7", "model": mock_conf.get("model") or "MiniMax-M3",
} }
self.assertEqual(bot.args["model"], "MiniMax-M2.7") self.assertEqual(bot.args["model"], "MiniMax-M3")
def test_default_model_string(self): def test_default_model_string(self):
"""Verify the fallback string literal in minimax_bot.py is MiniMax-M2.7.""" """Verify the fallback string literal in minimax_bot.py is MiniMax-M3."""
import ast import ast
bot_path = os.path.join(os.path.dirname(__file__), "..", "models", "minimax", "minimax_bot.py") bot_path = os.path.join(os.path.dirname(__file__), "..", "models", "minimax", "minimax_bot.py")
with open(bot_path) as f: with open(bot_path) as f:
source = f.read() source = f.read()
# Verify MiniMax-M2.7 is in the source (not M2.1) # Verify MiniMax-M3 is in the source (not the older default)
self.assertIn("MiniMax-M2.7", source) self.assertIn("MiniMax-M3", source)
self.assertNotIn('"MiniMax-M2.1"', source) self.assertNotIn('"MiniMax-M2.1"', source)

View File

@@ -0,0 +1,99 @@
# encoding:utf-8
import json
import os
import sys
import types
import unittest
from unittest.mock import patch
sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))
if "web" not in sys.modules:
web_stub = types.ModuleType("web")
web_stub.HTTPError = type("HTTPError", (Exception,), {})
web_stub.cookies = lambda: {}
web_stub.header = lambda *args, **kwargs: None
web_stub.data = lambda: b"{}"
web_stub.input = lambda **kwargs: types.SimpleNamespace(**kwargs)
web_stub.setcookie = lambda *args, **kwargs: None
web_stub.seeother = lambda *args, **kwargs: Exception("seeother")
web_stub.notfound = lambda *args, **kwargs: Exception("notfound")
web_stub.badrequest = lambda *args, **kwargs: Exception("badrequest")
web_stub.application = lambda *args, **kwargs: types.SimpleNamespace(wsgifunc=lambda: None)
web_stub.httpserver = types.SimpleNamespace(
LogMiddleware=type("LogMiddleware", (), {"log": lambda *args, **kwargs: None}),
StaticMiddleware=lambda app: app,
WSGIServer=lambda *args, **kwargs: types.SimpleNamespace(serve_forever=lambda: None),
)
sys.modules["web"] = web_stub
class TestModelsHandler(unittest.TestCase):
def test_set_asr_capability_persists_provider_and_model(self):
from channel.web.web_channel import ModelsHandler
local_config = {}
file_config = {}
handler = ModelsHandler()
with patch("channel.web.web_channel.conf", return_value=local_config):
with patch.object(ModelsHandler, "_read_file_config", return_value=file_config):
with patch.object(ModelsHandler, "_write_file_config") as write_file:
with patch.object(ModelsHandler, "_refresh_voice_routing") as refresh_voice:
result = json.loads(handler._handle_set_capability({
"capability": "asr",
"provider_id": "dashscope",
"model": "qwen3-asr-flash",
}))
self.assertEqual(result["status"], "success")
self.assertEqual(local_config["voice_to_text"], "dashscope")
self.assertEqual(local_config["voice_to_text_model"], "qwen3-asr-flash")
self.assertEqual(file_config["voice_to_text"], "dashscope")
self.assertEqual(file_config["voice_to_text_model"], "qwen3-asr-flash")
write_file.assert_called_once_with(file_config)
refresh_voice.assert_called_once()
def test_set_asr_empty_model_keeps_existing(self):
# Switching provider with an empty model must not wipe a user's
# hand-configured voice_to_text_model.
from channel.web.web_channel import ModelsHandler
local_config = {"voice_to_text_model": "qwen3-asr-flash"}
file_config = {"voice_to_text_model": "qwen3-asr-flash"}
handler = ModelsHandler()
with patch("channel.web.web_channel.conf", return_value=local_config):
with patch.object(ModelsHandler, "_read_file_config", return_value=file_config):
with patch.object(ModelsHandler, "_write_file_config"):
with patch.object(ModelsHandler, "_refresh_voice_routing"):
result = json.loads(handler._handle_set_capability({
"capability": "asr",
"provider_id": "zhipu",
"model": "",
}))
self.assertEqual(result["status"], "success")
self.assertEqual(local_config["voice_to_text"], "zhipu")
# Existing model preserved, not overwritten with "".
self.assertEqual(local_config["voice_to_text_model"], "qwen3-asr-flash")
self.assertEqual(file_config["voice_to_text_model"], "qwen3-asr-flash")
self.assertEqual(result["model"], "qwen3-asr-flash")
def test_asr_capability_exposes_provider_models(self):
from channel.web.web_channel import ModelsHandler
cap = ModelsHandler._asr_capability({
"voice_to_text": "dashscope",
"voice_to_text_model": "qwen3-asr-flash",
})
self.assertTrue(cap["editable"])
self.assertEqual(cap["current_provider"], "dashscope")
self.assertEqual(cap["current_model"], "qwen3-asr-flash")
self.assertIn("provider_models", cap)
self.assertIn("dashscope", cap["provider_models"])
if __name__ == "__main__":
unittest.main()