From 1d8baeb84aa0d60ca5c3159615d600ecbfa986df Mon Sep 17 00:00:00 2001 From: nanhaoluo <3075912108@qq.com> Date: Mon, 26 Jan 2026 14:07:41 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=B0=8F=E7=B1=B3=20M?= =?UTF-8?q?imo=20API=20=E8=AF=B7=E6=B1=82=E5=A4=B1=E8=B4=A5=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加 stream 参数明确设置为非流式响应 - 添加 Accept 请求头确保返回 JSON 格式 - 使用 JSON_UNESCAPED_UNICODE 编码确保中文正确传输 - 添加详细的错误日志记录便于调试 - 改进 SSL 验证设置 - 增强 argon_get_xiaomi_models 函数的错误处理 - 添加测试脚本 test-xiaomi-mimo-api.php --- .kiro/steering/xiaomi-mimo-api-fix.md | 250 ++++++++++++++++++++++++++ functions.php | 28 ++- test-xiaomi-mimo-api.php | 152 ++++++++++++++++ 3 files changed, 424 insertions(+), 6 deletions(-) create mode 100644 .kiro/steering/xiaomi-mimo-api-fix.md create mode 100644 test-xiaomi-mimo-api.php diff --git a/.kiro/steering/xiaomi-mimo-api-fix.md b/.kiro/steering/xiaomi-mimo-api-fix.md new file mode 100644 index 0000000..4865598 --- /dev/null +++ b/.kiro/steering/xiaomi-mimo-api-fix.md @@ -0,0 +1,250 @@ +# 小米 Mimo API 修复说明 + +## 修复时间 +2026-01-26 + +## 问题描述 +小米 Mimo 模型 API 请求失败,无法正常调用 MiMo-V2-Flash 模型。 + +## 修复内容 + +### 1. 优化 `argon_call_xiaomi_api` 函数 + +**修改位置**: `functions.php` 第 8047-8140 行 + +**主要改进**: +- ✅ 添加 `stream` 参数,明确设置为 `false`(非流式响应) +- ✅ 添加 `Accept` 请求头,明确接受 JSON 格式 +- ✅ 使用 `JSON_UNESCAPED_UNICODE` 标志编码请求体,确保中文字符正确传输 +- ✅ 明确设置 `sslverify` 为 `true`,确保 SSL 验证 + +**修改前**: +```php +$data = [ + 'model' => $model, + 'messages' => [ + ['role' => 'system', 'content' => $prompt], + ['role' => 'user', 'content' => $content] + ], + 'temperature' => 0.7, + 'max_tokens' => 500 +]; + +$response = wp_remote_post($endpoint, [ + 'headers' => [ + 'Content-Type' => 'application/json', + 'Authorization' => 'Bearer ' . $api_key + ], + 'body' => json_encode($data), + 'timeout' => 30 +]); +``` + +**修改后**: +```php +$data = [ + 'model' => $model, + 'messages' => [ + ['role' => 'system', 'content' => $prompt], + ['role' => 'user', 'content' => $content] + ], + 'temperature' => 0.7, + 'max_tokens' => 500, + 'stream' => false +]; + +$response = wp_remote_post($endpoint, [ + 'headers' => [ + 'Content-Type' => 'application/json', + 'Authorization' => 'Bearer ' . $api_key, + 'Accept' => 'application/json' + ], + 'body' => json_encode($data, JSON_UNESCAPED_UNICODE), + 'timeout' => 30, + 'sslverify' => true +]); +``` + +### 2. 增强 `argon_get_xiaomi_models` 函数 + +**修改位置**: `functions.php` 第 9009-9055 行 + +**主要改进**: +- ✅ 添加 `Accept` 请求头 +- ✅ 明确设置 `sslverify` 为 `true` +- ✅ 添加详细的错误日志记录 +- ✅ 记录 HTTP 状态码和响应内容,便于调试 +- ✅ 改进错误处理逻辑 + +**新增错误日志**: +- API 调用失败时记录错误信息 +- HTTP 状态码非 200 时记录状态码和响应内容 +- 响应格式异常时记录原始响应 + +## 可能的问题原因 + +根据修复内容,原始代码可能存在以下问题: + +1. **缺少 stream 参数**: 某些 API 实现要求明确指定是否使用流式响应 +2. **缺少 Accept 头**: API 可能需要明确的 Accept 头来返回正确格式 +3. **中文编码问题**: 未使用 `JSON_UNESCAPED_UNICODE` 可能导致中文字符编码错误 +4. **缺少错误日志**: 之前无法诊断具体的失败原因 + +## 测试方法 + +### 方法 1: 使用测试脚本 + +1. 打开 `test-xiaomi-mimo-api.php` 文件 +2. 将 `YOUR_API_KEY_HERE` 替换为你的实际 API 密钥 +3. 在浏览器中访问: `https://your-domain.com/wp-content/themes/argon/test-xiaomi-mimo-api.php` +4. 查看测试结果,包括: + - 基本 API 请求测试 + - 简化请求格式测试 + - 获取模型列表测试 + - cURL 命令示例 + +### 方法 2: 在 WordPress 后台测试 + +1. 进入 WordPress 后台 → Argon 主题设置 +2. 找到 "AI 功能" → "API 管理" +3. 添加或编辑小米 Mimo API 配置 +4. 点击"测试"按钮 +5. 查看测试结果 + +### 方法 3: 查看错误日志 + +如果仍然失败,检查 WordPress 错误日志: + +```bash +# 查看 PHP 错误日志 +tail -f /path/to/php-error.log + +# 或者 WordPress debug.log +tail -f /path/to/wp-content/debug.log +``` + +错误日志会包含: +- API 调用失败的具体错误信息 +- HTTP 状态码 +- API 响应内容 + +## 小米 Mimo API 规范 + +### 端点 +- **Chat Completions**: `https://api.mimo.xiaomi.com/v1/chat/completions` +- **Models**: `https://api.mimo.xiaomi.com/v1/models` + +### 认证 +使用 Bearer Token 认证: +``` +Authorization: Bearer YOUR_API_KEY +``` + +### 请求格式 +```json +{ + "model": "MiMo-V2-Flash", + "messages": [ + {"role": "system", "content": "你是一个有帮助的助手。"}, + {"role": "user", "content": "你好"} + ], + "temperature": 0.7, + "max_tokens": 500, + "stream": false +} +``` + +### 响应格式 +```json +{ + "id": "chatcmpl-xxx", + "object": "chat.completion", + "created": 1234567890, + "model": "MiMo-V2-Flash", + "choices": [ + { + "index": 0, + "message": { + "role": "assistant", + "content": "你好!我是小米的 AI 助手..." + }, + "finish_reason": "stop" + } + ], + "usage": { + "prompt_tokens": 10, + "completion_tokens": 20, + "total_tokens": 30 + } +} +``` + +## 支持的模型 + +根据官方文档,小米 Mimo 目前支持的模型: + +- **MiMo-V2-Flash** (推荐) + - 309B 总参数,15B 活跃参数 + - 256K 上下文窗口 + - 擅长推理、编码和 Agent 场景 + - 在 SWE-bench 上排名第一 + +## 常见问题 + +### Q1: API 密钥在哪里获取? +A: 访问 [小米 Mimo 平台](https://platform.xiaomimimo.com/) 注册并获取 API 密钥。 + +### Q2: API 是否免费? +A: 根据官方信息,MiMo-V2-Flash 目前处于公测阶段,可能提供免费额度。具体请查看官方文档。 + +### Q3: 为什么返回 401 错误? +A: 检查以下几点: +- API 密钥是否正确 +- API 密钥是否已激活 +- 是否正确设置了 Authorization 头 + +### Q4: 为什么返回 429 错误? +A: 请求频率超过限制,需要: +- 降低请求频率 +- 检查是否有配额限制 +- 联系小米客服增加配额 + +### Q5: 为什么返回 500 错误? +A: 服务器端错误,可能原因: +- API 服务暂时不可用 +- 请求参数格式错误 +- 模型名称错误 + +## 参考资料 + +- [LiteLLM - Xiaomi MiMo](https://docs.litellm.ai/docs/providers/xiaomi_mimo) +- [Puter.js - Free Xiaomi MiMo API](https://developer.puter.com/tutorials/free-unlimited-xiaomi-mimo-api/) +- [OpenRouter - MiMo-V2-Flash](https://openrouter.ai/xiaomi/mimo-v2-flash-20251210/api) +- [Hugging Face - MiMo-V2-Flash](https://huggingface.co/XiaomiMiMo/MiMo-V2-Flash) + +## 后续优化建议 + +1. **添加重试机制**: 对于临时性失败,自动重试 2-3 次 +2. **缓存模型列表**: 减少对 models 端点的请求 +3. **支持流式响应**: 对于长文本生成,支持流式输出 +4. **添加速率限制**: 避免触发 API 限流 +5. **监控 API 使用**: 记录 API 调用次数和成本 + +## 相关文件 + +- `functions.php` - 核心函数(包含 API 调用逻辑) +- `test-xiaomi-mimo-api.php` - 测试脚本 +- `settings.php` - 设置页面(AI 功能配置) + +## Git 提交 + +提交信息将包含: +``` +fix: 修复小米 Mimo API 请求失败的问题 + +- 添加 stream 参数明确设置为非流式响应 +- 添加 Accept 请求头确保返回 JSON 格式 +- 使用 JSON_UNESCAPED_UNICODE 编码确保中文正确传输 +- 添加详细的错误日志记录便于调试 +- 改进 SSL 验证设置 +``` diff --git a/functions.php b/functions.php index 459fc5a..08f1dff 100644 --- a/functions.php +++ b/functions.php @@ -8053,6 +8053,7 @@ function argon_call_xiaomi_api($api_key, $prompt, $content, $post_id = 0) { $endpoint = !empty($config['api_endpoint']) ? $config['api_endpoint'] : 'https://api.mimo.xiaomi.com/v1/chat/completions'; $model = !empty($config['model']) ? $config['model'] : 'MiMo-V2-Flash'; + // 小米 Mimo API 请求数据 $data = [ 'model' => $model, 'messages' => [ @@ -8060,16 +8061,19 @@ function argon_call_xiaomi_api($api_key, $prompt, $content, $post_id = 0) { ['role' => 'user', 'content' => $content] ], 'temperature' => 0.7, - 'max_tokens' => 500 + 'max_tokens' => 500, + 'stream' => false ]; $response = wp_remote_post($endpoint, [ 'headers' => [ 'Content-Type' => 'application/json', - 'Authorization' => 'Bearer ' . $api_key + 'Authorization' => 'Bearer ' . $api_key, + 'Accept' => 'application/json' ], - 'body' => json_encode($data), - 'timeout' => 30 + 'body' => json_encode($data, JSON_UNESCAPED_UNICODE), + 'timeout' => 30, + 'sslverify' => true ]); if (is_wp_error($response)) { @@ -9014,13 +9018,24 @@ function argon_get_xiaomi_models($api_key, $custom_endpoint = '') { $response = wp_remote_get($endpoint, [ 'headers' => [ - 'Authorization' => 'Bearer ' . $api_key + 'Authorization' => 'Bearer ' . $api_key, + 'Accept' => 'application/json' ], - 'timeout' => 15 + 'timeout' => 15, + 'sslverify' => true ]); if (is_wp_error($response)) { // API 调用失败,返回预设列表 + error_log('Xiaomi Mimo API 获取模型列表失败: ' . $response->get_error_message()); + return [ + ['id' => 'MiMo-V2-Flash', 'name' => 'MiMo-V2-Flash (推荐)'] + ]; + } + + $status_code = wp_remote_retrieve_response_code($response); + if ($status_code !== 200) { + error_log('Xiaomi Mimo API 返回错误状态码: ' . $status_code . ', 响应: ' . wp_remote_retrieve_body($response)); return [ ['id' => 'MiMo-V2-Flash', 'name' => 'MiMo-V2-Flash (推荐)'] ]; @@ -9029,6 +9044,7 @@ function argon_get_xiaomi_models($api_key, $custom_endpoint = '') { $body = json_decode(wp_remote_retrieve_body($response), true); if (!isset($body['data'])) { + error_log('Xiaomi Mimo API 响应格式异常: ' . wp_remote_retrieve_body($response)); return [ ['id' => 'MiMo-V2-Flash', 'name' => 'MiMo-V2-Flash (推荐)'] ]; diff --git a/test-xiaomi-mimo-api.php b/test-xiaomi-mimo-api.php new file mode 100644 index 0000000..fea7274 --- /dev/null +++ b/test-xiaomi-mimo-api.php @@ -0,0 +1,152 @@ +小米 Mimo API 测试\n"; +echo "
\n";
+
+// 测试 1: 基本请求
+echo "=== 测试 1: 基本 API 请求 ===\n";
+$data = [
+ 'model' => $test_model,
+ 'messages' => [
+ ['role' => 'system', 'content' => '你是一个有帮助的助手。'],
+ ['role' => 'user', 'content' => '你好,请用一句话介绍你自己。']
+ ],
+ 'temperature' => 0.7,
+ 'max_tokens' => 100
+];
+
+echo "请求端点: $test_endpoint\n";
+echo "模型: $test_model\n";
+echo "请求数据:\n";
+echo json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . "\n\n";
+
+$response = wp_remote_post($test_endpoint, [
+ 'headers' => [
+ 'Content-Type' => 'application/json',
+ 'Authorization' => 'Bearer ' . $test_api_key
+ ],
+ 'body' => json_encode($data),
+ 'timeout' => 30
+]);
+
+if (is_wp_error($response)) {
+ echo "❌ 请求失败: " . $response->get_error_message() . "\n";
+} else {
+ $status_code = wp_remote_retrieve_response_code($response);
+ $body = wp_remote_retrieve_body($response);
+ $headers = wp_remote_retrieve_headers($response);
+
+ echo "状态码: $status_code\n";
+ echo "响应头:\n";
+ foreach ($headers as $key => $value) {
+ echo " $key: $value\n";
+ }
+ echo "\n响应体:\n";
+
+ $json_body = json_decode($body, true);
+ if ($json_body) {
+ echo json_encode($json_body, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . "\n";
+ } else {
+ echo $body . "\n";
+ }
+}
+
+echo "\n";
+
+// 测试 2: 不同的请求格式
+echo "=== 测试 2: 简化的请求格式 ===\n";
+$data2 = [
+ 'model' => $test_model,
+ 'messages' => [
+ ['role' => 'user', 'content' => '你好']
+ ]
+];
+
+echo "请求数据:\n";
+echo json_encode($data2, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . "\n\n";
+
+$response2 = wp_remote_post($test_endpoint, [
+ 'headers' => [
+ 'Content-Type' => 'application/json',
+ 'Authorization' => 'Bearer ' . $test_api_key
+ ],
+ 'body' => json_encode($data2),
+ 'timeout' => 30
+]);
+
+if (is_wp_error($response2)) {
+ echo "❌ 请求失败: " . $response2->get_error_message() . "\n";
+} else {
+ $status_code2 = wp_remote_retrieve_response_code($response2);
+ $body2 = wp_remote_retrieve_body($response2);
+
+ echo "状态码: $status_code2\n";
+ echo "响应体:\n";
+
+ $json_body2 = json_decode($body2, true);
+ if ($json_body2) {
+ echo json_encode($json_body2, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . "\n";
+ } else {
+ echo $body2 . "\n";
+ }
+}
+
+echo "\n";
+
+// 测试 3: 获取模型列表
+echo "=== 测试 3: 获取模型列表 ===\n";
+$models_endpoint = 'https://api.mimo.xiaomi.com/v1/models';
+echo "请求端点: $models_endpoint\n\n";
+
+$response3 = wp_remote_get($models_endpoint, [
+ 'headers' => [
+ 'Authorization' => 'Bearer ' . $test_api_key
+ ],
+ 'timeout' => 30
+]);
+
+if (is_wp_error($response3)) {
+ echo "❌ 请求失败: " . $response3->get_error_message() . "\n";
+} else {
+ $status_code3 = wp_remote_retrieve_response_code($response3);
+ $body3 = wp_remote_retrieve_body($response3);
+
+ echo "状态码: $status_code3\n";
+ echo "响应体:\n";
+
+ $json_body3 = json_decode($body3, true);
+ if ($json_body3) {
+ echo json_encode($json_body3, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . "\n";
+ } else {
+ echo $body3 . "\n";
+ }
+}
+
+echo "\n";
+
+// 测试 4: 使用 cURL 直接测试
+echo "=== 测试 4: cURL 命令示例 ===\n";
+echo "你可以在命令行中运行以下命令来测试 API:\n\n";
+echo "curl -X POST https://api.mimo.xiaomi.com/v1/chat/completions \\\n";
+echo " -H \"Content-Type: application/json\" \\\n";
+echo " -H \"Authorization: Bearer YOUR_API_KEY\" \\\n";
+echo " -d '{\n";
+echo " \"model\": \"MiMo-V2-Flash\",\n";
+echo " \"messages\": [\n";
+echo " {\"role\": \"user\", \"content\": \"你好\"}\n";
+echo " ]\n";
+echo " }'\n";
+
+echo "\n";