fix: 修复设置页 AI API 测试功能的错误处理
- 改进错误消息的显示逻辑,正确处理 wp_send_json_error 返回的数据 - 添加更详细的 AJAX 错误日志输出 - 添加测试脚本 test-api-test-function.php 用于诊断 API 测试功能
This commit is contained in:
@@ -2454,10 +2454,14 @@ function themeoptions_page(){
|
|||||||
if (response.success) {
|
if (response.success) {
|
||||||
alert('✓ ' + response.data.message);
|
alert('✓ ' + response.data.message);
|
||||||
} else {
|
} else {
|
||||||
alert('✗ <?php _e('测试失败:', 'argon'); ?> ' + response.data.message);
|
// wp_send_json_error 的错误消息在 response.data 中
|
||||||
|
let errorMsg = response.data || '<?php _e('未知错误', 'argon'); ?>';
|
||||||
|
alert('✗ <?php _e('测试失败:', 'argon'); ?> ' + errorMsg);
|
||||||
}
|
}
|
||||||
$btn.prop('disabled', false).html(originalHtml);
|
$btn.prop('disabled', false).html(originalHtml);
|
||||||
}).fail(function() {
|
}).fail(function(xhr, status, error) {
|
||||||
|
// AJAX 请求本身失败
|
||||||
|
console.error('AJAX Error:', status, error);
|
||||||
alert('<?php _e('请求失败,请重试', 'argon'); ?>');
|
alert('<?php _e('请求失败,请重试', 'argon'); ?>');
|
||||||
$btn.prop('disabled', false).html(originalHtml);
|
$btn.prop('disabled', false).html(originalHtml);
|
||||||
});
|
});
|
||||||
|
|||||||
164
test-api-test-function.php
Normal file
164
test-api-test-function.php
Normal file
@@ -0,0 +1,164 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* 测试 API 测试功能
|
||||||
|
* 访问: http://your-site.com/wp-content/themes/argon/test-api-test-function.php
|
||||||
|
*/
|
||||||
|
|
||||||
|
require_once('../../../wp-load.php');
|
||||||
|
|
||||||
|
if (!current_user_can('manage_options')) {
|
||||||
|
wp_die('权限不足');
|
||||||
|
}
|
||||||
|
|
||||||
|
echo '<h1>API 测试功能诊断</h1>';
|
||||||
|
|
||||||
|
// 1. 检查函数是否存在
|
||||||
|
echo '<h2>1. 函数存在性检查</h2>';
|
||||||
|
$functions = [
|
||||||
|
'argon_ajax_test_unified_api',
|
||||||
|
'argon_get_api_by_id',
|
||||||
|
'argon_get_all_apis'
|
||||||
|
];
|
||||||
|
|
||||||
|
foreach ($functions as $func) {
|
||||||
|
if (function_exists($func)) {
|
||||||
|
echo '<p style="color: green;">✓ ' . $func . ' 存在</p>';
|
||||||
|
} else {
|
||||||
|
echo '<p style="color: red;">✗ ' . $func . ' 不存在</p>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 检查是否有 API 配置
|
||||||
|
echo '<h2>2. API 配置检查</h2>';
|
||||||
|
$all_apis = argon_get_all_apis();
|
||||||
|
if (empty($all_apis)) {
|
||||||
|
echo '<p style="color: orange;">⚠ 没有配置任何 API</p>';
|
||||||
|
} else {
|
||||||
|
echo '<p style="color: green;">✓ 已配置 ' . count($all_apis) . ' 个 API</p>';
|
||||||
|
foreach ($all_apis as $api) {
|
||||||
|
echo '<div style="margin: 10px 0; padding: 10px; background: #f5f5f5; border-left: 4px solid #5e72e4;">';
|
||||||
|
echo '<strong>' . esc_html($api['name']) . '</strong><br>';
|
||||||
|
echo 'ID: ' . esc_html($api['id']) . '<br>';
|
||||||
|
echo '提供商: ' . esc_html($api['provider']) . '<br>';
|
||||||
|
echo '模型: ' . esc_html($api['model']) . '<br>';
|
||||||
|
echo '</div>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. 检查 AJAX action 是否注册
|
||||||
|
echo '<h2>3. AJAX Action 注册检查</h2>';
|
||||||
|
global $wp_filter;
|
||||||
|
if (isset($wp_filter['wp_ajax_argon_ajax_test_unified_api'])) {
|
||||||
|
echo '<p style="color: green;">✓ wp_ajax_argon_ajax_test_unified_api 已注册</p>';
|
||||||
|
} else {
|
||||||
|
echo '<p style="color: red;">✗ wp_ajax_argon_ajax_test_unified_api 未注册</p>';
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4. 测试 nonce 生成
|
||||||
|
echo '<h2>4. Nonce 生成测试</h2>';
|
||||||
|
$nonce = wp_create_nonce('argon_test_unified_api');
|
||||||
|
echo '<p>生成的 nonce: <code>' . $nonce . '</code></p>';
|
||||||
|
echo '<p>验证结果: ';
|
||||||
|
if (wp_verify_nonce($nonce, 'argon_test_unified_api')) {
|
||||||
|
echo '<span style="color: green;">✓ 验证通过</span></p>';
|
||||||
|
} else {
|
||||||
|
echo '<span style="color: red;">✗ 验证失败</span></p>';
|
||||||
|
}
|
||||||
|
|
||||||
|
// 5. 模拟 AJAX 请求测试
|
||||||
|
if (!empty($all_apis)) {
|
||||||
|
echo '<h2>5. 模拟 AJAX 请求测试</h2>';
|
||||||
|
$test_api = $all_apis[0];
|
||||||
|
echo '<p>测试 API: ' . esc_html($test_api['name']) . '</p>';
|
||||||
|
|
||||||
|
// 模拟 $_POST 数据
|
||||||
|
$_POST['api_id'] = $test_api['id'];
|
||||||
|
$_POST['nonce'] = wp_create_nonce('argon_test_unified_api');
|
||||||
|
|
||||||
|
echo '<p>开始测试...</p>';
|
||||||
|
|
||||||
|
// 获取 API 配置
|
||||||
|
$api = argon_get_api_by_id($test_api['id']);
|
||||||
|
if (!$api) {
|
||||||
|
echo '<p style="color: red;">✗ 无法获取 API 配置</p>';
|
||||||
|
} else {
|
||||||
|
echo '<p style="color: green;">✓ 成功获取 API 配置</p>';
|
||||||
|
|
||||||
|
// 获取默认端点
|
||||||
|
$default_endpoints = [
|
||||||
|
'openai' => 'https://api.openai.com/v1/chat/completions',
|
||||||
|
'anthropic' => 'https://api.anthropic.com/v1/messages',
|
||||||
|
'deepseek' => 'https://api.deepseek.com/v1/chat/completions',
|
||||||
|
'xiaomi' => 'https://api.mimo.xiaomi.com/v1/chat/completions',
|
||||||
|
'qianwen' => 'https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions',
|
||||||
|
'wenxin' => 'https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions',
|
||||||
|
'doubao' => 'https://ark.cn-beijing.volces.com/api/v3/chat/completions',
|
||||||
|
'kimi' => 'https://api.moonshot.cn/v1/chat/completions',
|
||||||
|
'zhipu' => 'https://open.bigmodel.cn/api/paas/v4/chat/completions',
|
||||||
|
'siliconflow' => 'https://api.siliconflow.cn/v1/chat/completions'
|
||||||
|
];
|
||||||
|
|
||||||
|
$api_endpoint = !empty($api['api_endpoint']) ? $api['api_endpoint'] : $default_endpoints[$api['provider']];
|
||||||
|
$model = !empty($api['model']) ? $api['model'] : 'gpt-4o-mini';
|
||||||
|
|
||||||
|
echo '<p>API 端点: <code>' . esc_html($api_endpoint) . '</code></p>';
|
||||||
|
echo '<p>模型: <code>' . esc_html($model) . '</code></p>';
|
||||||
|
|
||||||
|
// 构建测试请求
|
||||||
|
$data = [
|
||||||
|
'model' => $model,
|
||||||
|
'messages' => [
|
||||||
|
[
|
||||||
|
'role' => 'user',
|
||||||
|
'content' => '你好,这是一个测试。请回复"测试成功"。'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'max_tokens' => 50
|
||||||
|
];
|
||||||
|
|
||||||
|
echo '<p>发送测试请求...</p>';
|
||||||
|
$start_time = microtime(true);
|
||||||
|
|
||||||
|
$response = wp_remote_post($api_endpoint, [
|
||||||
|
'headers' => [
|
||||||
|
'Content-Type' => 'application/json',
|
||||||
|
'Authorization' => 'Bearer ' . $api['api_key']
|
||||||
|
],
|
||||||
|
'body' => json_encode($data),
|
||||||
|
'timeout' => 30
|
||||||
|
]);
|
||||||
|
|
||||||
|
$response_time = round((microtime(true) - $start_time) * 1000);
|
||||||
|
|
||||||
|
if (is_wp_error($response)) {
|
||||||
|
echo '<p style="color: red;">✗ 请求失败: ' . $response->get_error_message() . '</p>';
|
||||||
|
} else {
|
||||||
|
$status_code = wp_remote_retrieve_response_code($response);
|
||||||
|
$body = wp_remote_retrieve_body($response);
|
||||||
|
|
||||||
|
echo '<p>HTTP 状态码: <code>' . $status_code . '</code></p>';
|
||||||
|
echo '<p>响应时间: <code>' . $response_time . 'ms</code></p>';
|
||||||
|
|
||||||
|
if ($status_code === 200) {
|
||||||
|
$result = json_decode($body, true);
|
||||||
|
if (isset($result['choices'][0]['message']['content']) || isset($result['content'])) {
|
||||||
|
echo '<p style="color: green;">✓ API 测试成功!</p>';
|
||||||
|
if (isset($result['choices'][0]['message']['content'])) {
|
||||||
|
echo '<p>AI 回复: ' . esc_html($result['choices'][0]['message']['content']) . '</p>';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
echo '<p style="color: red;">✗ API 返回格式异常</p>';
|
||||||
|
echo '<pre>' . htmlspecialchars($body) . '</pre>';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
echo '<p style="color: red;">✗ API 返回错误</p>';
|
||||||
|
echo '<pre>' . htmlspecialchars($body) . '</pre>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
echo '<hr>';
|
||||||
|
echo '<h2>测试完成</h2>';
|
||||||
|
echo '<p><a href="' . admin_url('themes.php?page=argon-theme-options') . '">返回设置页</a></p>';
|
||||||
|
?>
|
||||||
Reference in New Issue
Block a user