mirror of
https://github.com/zhayujie/chatgpt-on-wechat.git
synced 2026-06-03 10:47:08 +08:00
Compare commits
11 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4d8458669c | ||
|
|
92ec9653e5 | ||
|
|
e861d98007 | ||
|
|
a97eeb1fd9 | ||
|
|
cd88b23b5d | ||
|
|
33eabf937b | ||
|
|
beb5df16a3 | ||
|
|
7fa743f01a | ||
|
|
1f6859d78f | ||
|
|
2853735472 | ||
|
|
04d28f9d2d |
3
.github/PULL_REQUEST_TEMPLATE.md
vendored
3
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -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 #
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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\")"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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' },
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
2.0.9
|
2.1.0
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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 の提出も歓迎します。
|
||||||
|
|
||||||
## 🌟 コントリビューター
|
## 🌟 コントリビューター
|
||||||
|
|
||||||
|
|||||||
@@ -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専用キー(従量課金とは共有不可) |
|
||||||
|
|
||||||
|
|||||||
@@ -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 | ✅ | ✅ | | | | |
|
||||||
|
|||||||
@@ -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` など。
|
||||||
|
|
||||||
## 画像生成
|
## 画像生成
|
||||||
|
|
||||||
|
|||||||
@@ -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) で作成 |
|
||||||
|
|
||||||
## 画像理解
|
## 画像理解
|
||||||
|
|||||||
@@ -13,19 +13,19 @@ Tongyi Qianwen(DashScope / 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`。
|
||||||
|
|
||||||
## 画像生成
|
## 画像生成
|
||||||
|
|
||||||
|
|||||||
@@ -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 シリーズがネイティブ対応 |
|
||||||
|
|||||||
@@ -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) |
|
||||||
|
|
||||||
|
|||||||
@@ -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 | ✅ | ✅ | | | | |
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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 |
|
||||||
|
|||||||
@@ -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 进行反馈。
|
||||||
|
|
||||||
## 🌟 贡献者
|
## 🌟 贡献者
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -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(与按量计费接口不通用) |
|
||||||
|
|
||||||
|
|||||||
@@ -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 | ✅ | ✅ | | | | |
|
||||||
|
|||||||
@@ -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` 等。
|
||||||
|
|
||||||
## 图像生成
|
## 图像生成
|
||||||
|
|
||||||
|
|||||||
@@ -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) 创建 |
|
||||||
|
|
||||||
## 图像理解
|
## 图像理解
|
||||||
|
|||||||
@@ -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`。
|
||||||
|
|
||||||
## 图像生成
|
## 图像生成
|
||||||
|
|
||||||
|
|||||||
@@ -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 系列原生支持 |
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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),
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
38
run.sh
@@ -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',
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
63
tests/test_dashscope_provider.py
Normal file
63
tests/test_dashscope_provider.py
Normal 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()
|
||||||
@@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
99
tests/test_models_handler.py
Normal file
99
tests/test_models_handler.py
Normal 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()
|
||||||
Reference in New Issue
Block a user