fix: 修复小米 Mimo API 请求失败的问题

- 添加 stream 参数明确设置为非流式响应
- 添加 Accept 请求头确保返回 JSON 格式
- 使用 JSON_UNESCAPED_UNICODE 编码确保中文正确传输
- 添加详细的错误日志记录便于调试
- 改进 SSL 验证设置
- 增强 argon_get_xiaomi_models 函数的错误处理
- 添加测试脚本 test-xiaomi-mimo-api.php
This commit is contained in:
2026-01-26 14:07:41 +08:00
parent 8067a54a84
commit 1d8baeb84a
3 changed files with 424 additions and 6 deletions

View File

@@ -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 验证设置
```

View File

@@ -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'; $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'; $model = !empty($config['model']) ? $config['model'] : 'MiMo-V2-Flash';
// 小米 Mimo API 请求数据
$data = [ $data = [
'model' => $model, 'model' => $model,
'messages' => [ 'messages' => [
@@ -8060,16 +8061,19 @@ function argon_call_xiaomi_api($api_key, $prompt, $content, $post_id = 0) {
['role' => 'user', 'content' => $content] ['role' => 'user', 'content' => $content]
], ],
'temperature' => 0.7, 'temperature' => 0.7,
'max_tokens' => 500 'max_tokens' => 500,
'stream' => false
]; ];
$response = wp_remote_post($endpoint, [ $response = wp_remote_post($endpoint, [
'headers' => [ 'headers' => [
'Content-Type' => 'application/json', 'Content-Type' => 'application/json',
'Authorization' => 'Bearer ' . $api_key 'Authorization' => 'Bearer ' . $api_key,
'Accept' => 'application/json'
], ],
'body' => json_encode($data), 'body' => json_encode($data, JSON_UNESCAPED_UNICODE),
'timeout' => 30 'timeout' => 30,
'sslverify' => true
]); ]);
if (is_wp_error($response)) { if (is_wp_error($response)) {
@@ -9014,13 +9018,24 @@ function argon_get_xiaomi_models($api_key, $custom_endpoint = '') {
$response = wp_remote_get($endpoint, [ $response = wp_remote_get($endpoint, [
'headers' => [ 'headers' => [
'Authorization' => 'Bearer ' . $api_key 'Authorization' => 'Bearer ' . $api_key,
'Accept' => 'application/json'
], ],
'timeout' => 15 'timeout' => 15,
'sslverify' => true
]); ]);
if (is_wp_error($response)) { if (is_wp_error($response)) {
// API 调用失败,返回预设列表 // 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 [ return [
['id' => 'MiMo-V2-Flash', 'name' => 'MiMo-V2-Flash (推荐)'] ['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); $body = json_decode(wp_remote_retrieve_body($response), true);
if (!isset($body['data'])) { if (!isset($body['data'])) {
error_log('Xiaomi Mimo API 响应格式异常: ' . wp_remote_retrieve_body($response));
return [ return [
['id' => 'MiMo-V2-Flash', 'name' => 'MiMo-V2-Flash (推荐)'] ['id' => 'MiMo-V2-Flash', 'name' => 'MiMo-V2-Flash (推荐)']
]; ];

152
test-xiaomi-mimo-api.php Normal file
View File

@@ -0,0 +1,152 @@
<?php
/**
* 小米 Mimo API 测试脚本
* 用于诊断 API 请求失败的问题
*/
// 加载 WordPress
require_once('../../wp-load.php');
// 测试配置
$test_api_key = 'YOUR_API_KEY_HERE'; // 替换为实际的 API 密钥
$test_endpoint = 'https://api.mimo.xiaomi.com/v1/chat/completions';
$test_model = 'MiMo-V2-Flash';
echo "<h2>小米 Mimo API 测试</h2>\n";
echo "<pre>\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 "</pre>\n";