feat: 添加统一 API 系统测试脚本和文档
- 创建 test-unified-api-system.php 测试脚本 - 测试功能包括:函数存在性、数据迁移、API配置、向后兼容等 - 添加阶段性实施计划文档 - 添加新 AI 设置界面草稿
This commit is contained in:
144
.kiro/steering/ai-refactor-next-steps.md
Normal file
144
.kiro/steering/ai-refactor-next-steps.md
Normal file
@@ -0,0 +1,144 @@
|
||||
# AI 设置重构 - 下一步工作
|
||||
|
||||
## 已完成的工作 ✅
|
||||
|
||||
### 1. functions.php 更新
|
||||
- ✅ 添加数据迁移函数 `argon_migrate_ai_apis()`
|
||||
- ✅ 添加统一 API 管理函数
|
||||
- `argon_get_all_apis()` - 获取所有 API
|
||||
- `argon_get_api_by_id($api_id)` - 获取指定 API
|
||||
- `argon_add_api($config)` - 添加 API
|
||||
- `argon_update_api($api_id, $config)` - 更新 API
|
||||
- `argon_delete_api($api_id)` - 删除 API
|
||||
- `argon_set_active_api_for_scenario($scenario, $api_id)` - 设置场景使用的 API
|
||||
- `argon_get_active_api_config($scenario)` - 获取场景的活动 API 配置
|
||||
- ✅ 更新 `argon_get_ai_provider_config()` 支持新数据结构
|
||||
- ✅ 添加新的 AJAX 处理函数
|
||||
- `argon_ajax_add_unified_api()`
|
||||
- `argon_ajax_update_unified_api()`
|
||||
- `argon_ajax_delete_unified_api()`
|
||||
- `argon_ajax_set_active_unified_api()`
|
||||
- `argon_ajax_get_all_unified_apis()`
|
||||
- ✅ 在主题加载时自动迁移旧数据
|
||||
|
||||
### 2. 草稿文件
|
||||
- ✅ 创建新的 AI 设置界面草稿 (`tmp/ai-settings-new-structure.php`)
|
||||
- ✅ 设计了新的界面结构和交互逻辑
|
||||
|
||||
## 待完成的工作 📋
|
||||
|
||||
### 3. settings.php 重构
|
||||
|
||||
#### 3.1 移除旧的 AI 设置部分
|
||||
需要移除的内容:
|
||||
- 第 1985-2400 行:旧的文章功能 - AI 摘要部分(包含按提供商分组的 API 配置)
|
||||
- 第 4662-5100 行:评论设置中的 AI 垃圾评论识别部分
|
||||
|
||||
#### 3.2 添加新的 AI 功能部分
|
||||
在合适的位置(建议在第 1985 行之前)插入新的 AI 功能部分:
|
||||
|
||||
```php
|
||||
<!-- ========== AI 功能 ========== -->
|
||||
<h1 style="color: #5e72e4; margin-top: 50px; font-size: 32px;"><?php _e('AI 功能', 'argon');?></h1>
|
||||
|
||||
<!-- API 管理 (h2) -->
|
||||
<!-- 文章摘要 (h2) -->
|
||||
<!-- 评论审核 (h2) -->
|
||||
```
|
||||
|
||||
#### 3.3 添加 JavaScript 交互代码
|
||||
需要添加完整的 JavaScript 代码来处理:
|
||||
- 添加/编辑/删除 API
|
||||
- 测试 API 连通性
|
||||
- 刷新模型列表
|
||||
- 切换活动 API
|
||||
- 表单验证
|
||||
|
||||
#### 3.4 更新选项保存逻辑
|
||||
在 settings.php 末尾的保存函数中:
|
||||
- 移除旧的 API 配置保存逻辑
|
||||
- 添加新的统一 API 配置保存逻辑
|
||||
- 保存场景化的活动 API 设置
|
||||
|
||||
### 4. 测试
|
||||
|
||||
#### 4.1 数据迁移测试
|
||||
- 测试从旧的多 API 系统迁移到新系统
|
||||
- 验证所有 API 配置都正确迁移
|
||||
- 验证活动 API 设置正确
|
||||
|
||||
#### 4.2 功能测试
|
||||
- 测试添加新 API
|
||||
- 测试编辑 API
|
||||
- 测试删除 API
|
||||
- 测试切换活动 API
|
||||
- 测试 API 连通性测试功能
|
||||
- 测试模型列表刷新功能
|
||||
|
||||
#### 4.3 场景测试
|
||||
- 测试文章摘要生成(使用新的 API 系统)
|
||||
- 测试垃圾评论检测(使用新的 API 系统)
|
||||
- 测试不同场景使用不同 API
|
||||
|
||||
#### 4.4 向后兼容测试
|
||||
- 测试没有新数据时的回退逻辑
|
||||
- 测试旧数据的自动迁移
|
||||
|
||||
### 5. 文档更新
|
||||
- 更新用户文档,说明新的 API 管理方式
|
||||
- 更新开发文档,说明新的数据结构
|
||||
|
||||
## 实施建议
|
||||
|
||||
由于 settings.php 的重构涉及大量代码修改(需要移除约 500 行旧代码,添加约 800 行新代码),建议:
|
||||
|
||||
1. **分步实施**:
|
||||
- 第一步:只添加新的 AI 功能部分,保留旧的设置(共存)
|
||||
- 第二步:测试新功能是否正常工作
|
||||
- 第三步:移除旧的设置部分
|
||||
- 第四步:全面测试
|
||||
|
||||
2. **备份策略**:
|
||||
- 在每一步之前都创建备份
|
||||
- 使用 Git 分支进行开发
|
||||
- 保留回滚方案
|
||||
|
||||
3. **用户通知**:
|
||||
- 在更新日志中说明重大变更
|
||||
- 提供迁移指南
|
||||
- 说明新功能的优势
|
||||
|
||||
## 风险评估
|
||||
|
||||
### 高风险项
|
||||
- ❗ settings.php 重构可能影响现有用户的配置
|
||||
- ❗ 数据迁移可能失败,导致 API 配置丢失
|
||||
- ❗ JavaScript 代码可能与现有代码冲突
|
||||
|
||||
### 缓解措施
|
||||
- ✅ 已实现自动数据迁移和向后兼容
|
||||
- ✅ 保留旧数据作为备份
|
||||
- ✅ 使用独立的 AJAX 端点,避免冲突
|
||||
- 📋 需要充分测试后再发布
|
||||
|
||||
## 时间估算
|
||||
|
||||
- settings.php 重构:2-3 小时
|
||||
- JavaScript 代码编写:1-2 小时
|
||||
- 测试和调试:2-3 小时
|
||||
- 文档更新:1 小时
|
||||
|
||||
**总计:6-9 小时**
|
||||
|
||||
## 下一步行动
|
||||
|
||||
1. 用户确认是否继续进行 settings.php 的重构
|
||||
2. 如果继续,建议创建一个新的 Git 分支
|
||||
3. 按照上述步骤逐步实施
|
||||
4. 每完成一个步骤就进行测试和提交
|
||||
|
||||
## 备注
|
||||
|
||||
- 当前已完成的 functions.php 修改已经提交(commit 5254ee0)
|
||||
- 新的数据结构和 API 已经可以使用
|
||||
- 只需要更新 settings.php 的界面部分即可完成整个重构
|
||||
161
.kiro/steering/ai-settings-refactor-plan.md
Normal file
161
.kiro/steering/ai-settings-refactor-plan.md
Normal file
@@ -0,0 +1,161 @@
|
||||
# AI 设置页面重构方案
|
||||
|
||||
## 重构目标
|
||||
|
||||
将当前按提供商分组的 API 管理方式改为统一的 API 列表管理,并重新组织 AI 功能的设置结构。
|
||||
|
||||
## 当前结构问题
|
||||
|
||||
1. **API 管理分散**:每个提供商独立管理 API,用户需要在 10 个提供商之间切换
|
||||
2. **结构不清晰**:AI 摘要和评论审核分散在不同的一级分类中
|
||||
3. **用户体验差**:添加 API 时需要先选择提供商,然后才能配置
|
||||
|
||||
## 新结构设计
|
||||
|
||||
### 页面结构
|
||||
```
|
||||
AI 功能 (独立 h1,不在分类编号中)
|
||||
├── API 管理 (h2)
|
||||
│ ├── 已配置的 API 列表(统一显示所有提供商的 API)
|
||||
│ └── 添加新 API(输入密钥 → 选择提供商 → 选择模型)
|
||||
├── 文章摘要 (h2)
|
||||
│ ├── 启用 AI 摘要
|
||||
│ ├── 默认服务商选择
|
||||
│ ├── Prompt 设置
|
||||
│ └── 排除文章设置
|
||||
└── 评论审核 (h2)
|
||||
├── 启用 AI 识别
|
||||
├── 实时检测模式
|
||||
├── 关键字管理
|
||||
├── Prompt 模式
|
||||
└── 其他配置
|
||||
```
|
||||
|
||||
### 数据结构变更
|
||||
|
||||
#### 旧数据结构
|
||||
```php
|
||||
// 每个提供商独立存储
|
||||
argon_ai_openai_apis = [
|
||||
{id: 'api_1', name: '主API', api_key: 'sk-xxx', ...}
|
||||
]
|
||||
argon_ai_anthropic_apis = [...]
|
||||
// ... 10 个提供商
|
||||
```
|
||||
|
||||
#### 新数据结构
|
||||
```php
|
||||
// 统一存储所有 API
|
||||
argon_ai_apis = [
|
||||
{
|
||||
id: 'api_1',
|
||||
name: '主 OpenAI API',
|
||||
provider: 'openai',
|
||||
api_key: 'sk-xxx',
|
||||
api_endpoint: '',
|
||||
model: 'gpt-4o-mini',
|
||||
is_active: false,
|
||||
created_at: 1234567890
|
||||
},
|
||||
{
|
||||
id: 'api_2',
|
||||
name: '备用 Claude API',
|
||||
provider: 'anthropic',
|
||||
api_key: 'sk-ant-xxx',
|
||||
api_endpoint: '',
|
||||
model: 'claude-3-5-sonnet-20241022',
|
||||
is_active: true,
|
||||
created_at: 1234567891
|
||||
}
|
||||
]
|
||||
|
||||
// 当前使用的 API(按场景)
|
||||
argon_ai_summary_active_api = 'api_1' // 文章摘要使用的 API
|
||||
argon_ai_spam_active_api = 'api_2' // 垃圾评论检测使用的 API
|
||||
```
|
||||
|
||||
## 实施步骤
|
||||
|
||||
### 步骤 1:数据迁移函数
|
||||
创建 `argon_migrate_ai_apis()` 函数,将旧的分散数据迁移到新的统一结构。
|
||||
|
||||
### 步骤 2:更新核心函数
|
||||
- 修改 `argon_get_ai_provider_config()` 支持新数据结构
|
||||
- 添加 `argon_get_all_apis()` 获取所有 API
|
||||
- 添加 `argon_get_api_by_id($api_id)` 获取指定 API
|
||||
- 添加 `argon_add_api($config)` 添加 API
|
||||
- 添加 `argon_update_api($api_id, $config)` 更新 API
|
||||
- 添加 `argon_delete_api($api_id)` 删除 API
|
||||
- 添加 `argon_set_active_api_for_scenario($scenario, $api_id)` 设置场景使用的 API
|
||||
|
||||
### 步骤 3:重构 settings.php
|
||||
- 移除原有的按提供商分组的 API 配置界面
|
||||
- 创建新的统一 API 列表界面
|
||||
- 重新组织 AI 功能的设置结构
|
||||
|
||||
### 步骤 4:更新 AJAX 处理函数
|
||||
- 更新所有 API 管理相关的 AJAX 函数
|
||||
- 支持新的数据结构
|
||||
|
||||
### 步骤 5:向后兼容
|
||||
- 在主题加载时自动检测并迁移旧数据
|
||||
- 保留旧数据作为备份
|
||||
|
||||
## 界面设计
|
||||
|
||||
### API 管理界面
|
||||
```
|
||||
┌─ 已配置的 API ─────────────────────────────────────┐
|
||||
│ │
|
||||
│ ● 主 OpenAI API (gpt-4o-mini) │
|
||||
│ OpenAI (ChatGPT) | sk-xxx... │
|
||||
│ [测试] [编辑] [删除] │
|
||||
│ │
|
||||
│ ○ 备用 Claude API (claude-3-5-sonnet) │
|
||||
│ Anthropic (Claude) | sk-ant-xxx... │
|
||||
│ [测试] [编辑] [删除] │
|
||||
│ │
|
||||
│ [+ 添加新 API] │
|
||||
└─────────────────────────────────────────────────────┘
|
||||
|
||||
添加/编辑 API:
|
||||
┌─────────────────────────────────────────────────────┐
|
||||
│ 配置名称: [主 OpenAI API_________________] │
|
||||
│ API 密钥: [sk-xxx_______________________] [显示] │
|
||||
│ 提供商: [OpenAI (ChatGPT) ▼] │
|
||||
│ API 端点: [_____________________________] (可选) │
|
||||
│ 模型: [gpt-4o-mini__________________] [刷新] │
|
||||
│ │
|
||||
│ [保存] [取消] │
|
||||
└─────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 文章摘要设置
|
||||
```
|
||||
启用 AI 摘要: [启用 ▼]
|
||||
默认使用 API: [主 OpenAI API ▼]
|
||||
Prompt 设置: [...]
|
||||
排除文章 ID: [...]
|
||||
```
|
||||
|
||||
### 评论审核设置
|
||||
```
|
||||
启用 AI 识别: [☑] 启用 AI 自动识别垃圾评论
|
||||
默认使用 API: [备用 Claude API ▼]
|
||||
实时检测模式: [智能抽查 ▼]
|
||||
...
|
||||
```
|
||||
|
||||
## 优势
|
||||
|
||||
1. **统一管理**:所有 API 在一个列表中,一目了然
|
||||
2. **灵活配置**:不同场景可以使用不同的 API
|
||||
3. **易于添加**:添加 API 时直接输入密钥和选择提供商
|
||||
4. **更好的 UX**:不需要在多个提供商之间切换
|
||||
|
||||
## 注意事项
|
||||
|
||||
1. **数据迁移**:确保旧数据能够正确迁移到新结构
|
||||
2. **向后兼容**:保留旧数据作为备份,以防迁移失败
|
||||
3. **测试充分**:需要测试所有 AI 功能是否正常工作
|
||||
4. **文档更新**:更新用户文档说明新的配置方式
|
||||
314
test-unified-api-system.php
Normal file
314
test-unified-api-system.php
Normal file
@@ -0,0 +1,314 @@
|
||||
<?php
|
||||
/**
|
||||
* 测试统一 API 管理系统
|
||||
*
|
||||
* 访问方式:将此文件放在主题根目录,然后访问:
|
||||
* https://your-site.com/wp-content/themes/argon/test-unified-api-system.php
|
||||
*/
|
||||
|
||||
// 加载 WordPress
|
||||
require_once('../../../wp-load.php');
|
||||
|
||||
// 检查权限
|
||||
if (!current_user_can('manage_options')) {
|
||||
wp_die('权限不足');
|
||||
}
|
||||
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>统一 API 系统测试</title>
|
||||
<style>
|
||||
body {
|
||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
|
||||
max-width: 1200px;
|
||||
margin: 40px auto;
|
||||
padding: 20px;
|
||||
background: #f5f5f5;
|
||||
}
|
||||
.test-section {
|
||||
background: #fff;
|
||||
padding: 20px;
|
||||
margin-bottom: 20px;
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
|
||||
}
|
||||
h1 {
|
||||
color: #5e72e4;
|
||||
border-bottom: 3px solid #5e72e4;
|
||||
padding-bottom: 10px;
|
||||
}
|
||||
h2 {
|
||||
color: #333;
|
||||
margin-top: 0;
|
||||
}
|
||||
.success {
|
||||
color: #4caf50;
|
||||
font-weight: bold;
|
||||
}
|
||||
.error {
|
||||
color: #f44336;
|
||||
font-weight: bold;
|
||||
}
|
||||
.info {
|
||||
color: #2196f3;
|
||||
}
|
||||
pre {
|
||||
background: #f5f5f5;
|
||||
padding: 15px;
|
||||
border-radius: 4px;
|
||||
overflow-x: auto;
|
||||
border-left: 4px solid #5e72e4;
|
||||
}
|
||||
table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
margin-top: 10px;
|
||||
}
|
||||
th, td {
|
||||
padding: 12px;
|
||||
text-align: left;
|
||||
border-bottom: 1px solid #ddd;
|
||||
}
|
||||
th {
|
||||
background: #5e72e4;
|
||||
color: white;
|
||||
}
|
||||
.badge {
|
||||
display: inline-block;
|
||||
padding: 4px 8px;
|
||||
border-radius: 4px;
|
||||
font-size: 12px;
|
||||
font-weight: bold;
|
||||
}
|
||||
.badge-success {
|
||||
background: #4caf50;
|
||||
color: white;
|
||||
}
|
||||
.badge-warning {
|
||||
background: #ff9800;
|
||||
color: white;
|
||||
}
|
||||
.badge-info {
|
||||
background: #2196f3;
|
||||
color: white;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>🧪 统一 API 管理系统测试</h1>
|
||||
|
||||
<!-- 测试 1: 检查函数是否存在 -->
|
||||
<div class="test-section">
|
||||
<h2>1️⃣ 函数存在性检查</h2>
|
||||
<?php
|
||||
$functions = [
|
||||
'argon_migrate_ai_apis',
|
||||
'argon_get_all_apis',
|
||||
'argon_get_api_by_id',
|
||||
'argon_add_api',
|
||||
'argon_update_api',
|
||||
'argon_delete_api',
|
||||
'argon_set_active_api_for_scenario',
|
||||
'argon_get_active_api_config'
|
||||
];
|
||||
|
||||
$all_exist = true;
|
||||
echo '<table>';
|
||||
echo '<tr><th>函数名</th><th>状态</th></tr>';
|
||||
foreach ($functions as $func) {
|
||||
$exists = function_exists($func);
|
||||
$all_exist = $all_exist && $exists;
|
||||
echo '<tr>';
|
||||
echo '<td><code>' . esc_html($func) . '</code></td>';
|
||||
echo '<td>' . ($exists ? '<span class="success">✓ 存在</span>' : '<span class="error">✗ 不存在</span>') . '</td>';
|
||||
echo '</tr>';
|
||||
}
|
||||
echo '</table>';
|
||||
|
||||
if ($all_exist) {
|
||||
echo '<p class="success">✓ 所有核心函数都已正确加载</p>';
|
||||
} else {
|
||||
echo '<p class="error">✗ 部分函数缺失,请检查 functions.php</p>';
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
|
||||
<!-- 测试 2: 检查数据迁移状态 -->
|
||||
<div class="test-section">
|
||||
<h2>2️⃣ 数据迁移状态</h2>
|
||||
<?php
|
||||
$migrated = get_option('argon_ai_apis_migrated', 'false');
|
||||
echo '<p><strong>迁移状态:</strong> ';
|
||||
if ($migrated === 'true') {
|
||||
echo '<span class="success">✓ 已迁移</span>';
|
||||
} else {
|
||||
echo '<span class="info">ℹ 未迁移(将在首次访问时自动迁移)</span>';
|
||||
}
|
||||
echo '</p>';
|
||||
|
||||
// 手动触发迁移
|
||||
if ($migrated !== 'true') {
|
||||
echo '<p class="info">正在执行数据迁移...</p>';
|
||||
argon_migrate_ai_apis();
|
||||
$migrated = get_option('argon_ai_apis_migrated', 'false');
|
||||
if ($migrated === 'true') {
|
||||
echo '<p class="success">✓ 数据迁移成功</p>';
|
||||
}
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
|
||||
<!-- 测试 3: 查看所有 API 配置 -->
|
||||
<div class="test-section">
|
||||
<h2>3️⃣ 当前 API 配置</h2>
|
||||
<?php
|
||||
$all_apis = argon_get_all_apis();
|
||||
$summary_active = get_option('argon_ai_summary_active_api', '');
|
||||
$spam_active = get_option('argon_ai_spam_active_api', '');
|
||||
|
||||
if (empty($all_apis)) {
|
||||
echo '<p class="info">ℹ 暂无 API 配置</p>';
|
||||
echo '<p>这可能是因为:</p>';
|
||||
echo '<ul>';
|
||||
echo '<li>您还没有配置任何 AI API</li>';
|
||||
echo '<li>旧数据迁移未找到任何配置</li>';
|
||||
echo '</ul>';
|
||||
} else {
|
||||
echo '<p class="success">✓ 找到 ' . count($all_apis) . ' 个 API 配置</p>';
|
||||
echo '<table>';
|
||||
echo '<tr><th>ID</th><th>名称</th><th>提供商</th><th>模型</th><th>密钥</th><th>使用场景</th></tr>';
|
||||
foreach ($all_apis as $api) {
|
||||
echo '<tr>';
|
||||
echo '<td><code>' . esc_html($api['id']) . '</code></td>';
|
||||
echo '<td>' . esc_html($api['name']) . '</td>';
|
||||
echo '<td>' . esc_html($api['provider']) . '</td>';
|
||||
echo '<td>' . esc_html($api['model'] ?: '默认') . '</td>';
|
||||
echo '<td><code>' . esc_html(substr($api['api_key'], 0, 12)) . '...</code></td>';
|
||||
echo '<td>';
|
||||
if ($api['id'] === $summary_active) {
|
||||
echo '<span class="badge badge-success">文章摘要</span> ';
|
||||
}
|
||||
if ($api['id'] === $spam_active) {
|
||||
echo '<span class="badge badge-warning">评论审核</span>';
|
||||
}
|
||||
if ($api['id'] !== $summary_active && $api['id'] !== $spam_active) {
|
||||
echo '<span class="badge badge-info">未使用</span>';
|
||||
}
|
||||
echo '</td>';
|
||||
echo '</tr>';
|
||||
}
|
||||
echo '</table>';
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
|
||||
<!-- 测试 4: 检查旧数据 -->
|
||||
<div class="test-section">
|
||||
<h2>4️⃣ 旧数据检查</h2>
|
||||
<?php
|
||||
$providers = ['openai', 'anthropic', 'deepseek', 'xiaomi', 'qianwen', 'wenxin', 'doubao', 'kimi', 'zhipu', 'siliconflow'];
|
||||
$old_data_found = false;
|
||||
|
||||
echo '<table>';
|
||||
echo '<tr><th>提供商</th><th>旧数据状态</th><th>API 数量</th></tr>';
|
||||
foreach ($providers as $provider) {
|
||||
$old_apis = get_option("argon_ai_{$provider}_apis", []);
|
||||
$has_data = !empty($old_apis) && is_array($old_apis);
|
||||
if ($has_data) {
|
||||
$old_data_found = true;
|
||||
}
|
||||
echo '<tr>';
|
||||
echo '<td>' . esc_html($provider) . '</td>';
|
||||
echo '<td>' . ($has_data ? '<span class="info">有数据</span>' : '<span>无数据</span>') . '</td>';
|
||||
echo '<td>' . ($has_data ? count($old_apis) : 0) . '</td>';
|
||||
echo '</tr>';
|
||||
}
|
||||
echo '</table>';
|
||||
|
||||
if ($old_data_found) {
|
||||
echo '<p class="info">ℹ 发现旧数据,已保留作为备份</p>';
|
||||
} else {
|
||||
echo '<p>未发现旧数据</p>';
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
|
||||
<!-- 测试 5: 测试场景化 API 获取 -->
|
||||
<div class="test-section">
|
||||
<h2>5️⃣ 场景化 API 配置测试</h2>
|
||||
<?php
|
||||
echo '<h3>文章摘要场景</h3>';
|
||||
$summary_config = argon_get_active_api_config('summary');
|
||||
if (!empty($summary_config['api_key'])) {
|
||||
echo '<p class="success">✓ 成功获取文章摘要 API 配置</p>';
|
||||
echo '<pre>' . print_r($summary_config, true) . '</pre>';
|
||||
} else {
|
||||
echo '<p class="error">✗ 未配置文章摘要 API</p>';
|
||||
}
|
||||
|
||||
echo '<h3>评论审核场景</h3>';
|
||||
$spam_config = argon_get_active_api_config('spam');
|
||||
if (!empty($spam_config['api_key'])) {
|
||||
echo '<p class="success">✓ 成功获取评论审核 API 配置</p>';
|
||||
echo '<pre>' . print_r($spam_config, true) . '</pre>';
|
||||
} else {
|
||||
echo '<p class="error">✗ 未配置评论审核 API</p>';
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
|
||||
<!-- 测试 6: 向后兼容性测试 -->
|
||||
<div class="test-section">
|
||||
<h2>6️⃣ 向后兼容性测试</h2>
|
||||
<?php
|
||||
$test_provider = 'openai';
|
||||
$old_config = argon_get_ai_provider_config($test_provider);
|
||||
|
||||
echo '<p>测试 <code>argon_get_ai_provider_config(\'' . $test_provider . '\')</code></p>';
|
||||
if (!empty($old_config['api_key'])) {
|
||||
echo '<p class="success">✓ 向后兼容函数正常工作</p>';
|
||||
echo '<pre>' . print_r($old_config, true) . '</pre>';
|
||||
} else {
|
||||
echo '<p class="info">ℹ 未找到 ' . $test_provider . ' 的配置(这是正常的,如果您没有配置该提供商)</p>';
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
|
||||
<!-- 测试总结 -->
|
||||
<div class="test-section">
|
||||
<h2>📊 测试总结</h2>
|
||||
<?php
|
||||
$all_apis = argon_get_all_apis();
|
||||
$has_apis = !empty($all_apis);
|
||||
$functions_ok = $all_exist;
|
||||
$migrated_ok = get_option('argon_ai_apis_migrated', 'false') === 'true';
|
||||
|
||||
echo '<ul>';
|
||||
echo '<li>' . ($functions_ok ? '<span class="success">✓</span>' : '<span class="error">✗</span>') . ' 核心函数加载</li>';
|
||||
echo '<li>' . ($migrated_ok ? '<span class="success">✓</span>' : '<span class="info">ℹ</span>') . ' 数据迁移</li>';
|
||||
echo '<li>' . ($has_apis ? '<span class="success">✓</span>' : '<span class="info">ℹ</span>') . ' API 配置</li>';
|
||||
echo '</ul>';
|
||||
|
||||
if ($functions_ok && $migrated_ok) {
|
||||
echo '<p class="success"><strong>✓ 统一 API 管理系统已就绪!</strong></p>';
|
||||
if (!$has_apis) {
|
||||
echo '<p class="info">提示:您可以在主题设置页面添加 API 配置</p>';
|
||||
}
|
||||
} else {
|
||||
echo '<p class="error"><strong>✗ 系统未完全就绪,请检查上述问题</strong></p>';
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
|
||||
<div class="test-section">
|
||||
<h2>🔗 相关链接</h2>
|
||||
<ul>
|
||||
<li><a href="<?php echo admin_url('themes.php?page=argon-theme-options'); ?>">主题设置页面</a></li>
|
||||
<li><a href="<?php echo home_url('/ai-summary-query/'); ?>">AI 查询页面</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
233
tmp/ai-settings-new-structure.php
Normal file
233
tmp/ai-settings-new-structure.php
Normal file
@@ -0,0 +1,233 @@
|
||||
<?php
|
||||
/**
|
||||
* 新的 AI 设置页面结构
|
||||
* 这是一个草稿文件,用于设计新的 AI 设置界面
|
||||
*/
|
||||
|
||||
// 提供商列表
|
||||
$providers = [
|
||||
'openai' => 'OpenAI (ChatGPT)',
|
||||
'anthropic' => 'Anthropic (Claude)',
|
||||
'deepseek' => 'DeepSeek',
|
||||
'xiaomi' => __('小米 Mimo', 'argon'),
|
||||
'qianwen' => __('通义千问', 'argon'),
|
||||
'wenxin' => __('文心一言', 'argon'),
|
||||
'doubao' => __('豆包 (火山引擎)', 'argon'),
|
||||
'kimi' => 'Kimi (Moonshot)',
|
||||
'zhipu' => __('智谱 AI (GLM)', 'argon'),
|
||||
'siliconflow' => __('硅基流动 (SiliconFlow)', 'argon')
|
||||
];
|
||||
|
||||
// 获取所有 API
|
||||
$all_apis = argon_get_all_apis();
|
||||
$summary_active_api = get_option('argon_ai_summary_active_api', '');
|
||||
$spam_active_api = get_option('argon_ai_spam_active_api', '');
|
||||
?>
|
||||
|
||||
<!-- ========== AI 功能 ========== -->
|
||||
<h1 style="color: #5e72e4; margin-top: 50px; font-size: 32px;"><?php _e('AI 功能', 'argon');?></h1>
|
||||
<p><?php _e('统一管理所有 AI 服务商的 API 配置,并配置 AI 文章摘要和评论审核功能', 'argon');?></p>
|
||||
|
||||
<!-- ========== API 管理 ========== -->
|
||||
<tr><th class="subtitle"><h2 id="ai-api-management"><?php _e('API 管理', 'argon');?></h2></th></tr>
|
||||
|
||||
<tr>
|
||||
<th><label><?php _e('已配置的 API', 'argon');?></label></th>
|
||||
<td>
|
||||
<div id="argon-unified-api-list">
|
||||
<?php if (!empty($all_apis)): ?>
|
||||
<?php foreach ($all_apis as $api): ?>
|
||||
<div class="argon-unified-api-item" data-api-id="<?php echo esc_attr($api['id']); ?>" style="padding: 15px; background: #f5f5f5; margin-bottom: 10px; border-radius: 6px; border-left: 4px solid #5e72e4;">
|
||||
<div style="display: flex; align-items: center; justify-content: space-between;">
|
||||
<div style="flex: 1;">
|
||||
<div style="font-size: 16px; font-weight: 600; margin-bottom: 5px;">
|
||||
<?php echo esc_html($api['name']); ?>
|
||||
<?php if (!empty($api['model'])): ?>
|
||||
<span style="color: #666; font-weight: 400; font-size: 14px;">(<?php echo esc_html($api['model']); ?>)</span>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<div style="font-size: 13px; color: #666;">
|
||||
<span style="display: inline-block; padding: 2px 8px; background: #e3f2fd; color: #1976d2; border-radius: 3px; margin-right: 8px;">
|
||||
<?php echo esc_html($providers[$api['provider']]); ?>
|
||||
</span>
|
||||
<?php _e('密钥:', 'argon'); ?> <code><?php echo esc_html(substr($api['api_key'], 0, 12)); ?>...</code>
|
||||
<?php if (!empty($api['api_endpoint'])): ?>
|
||||
| <?php _e('端点:', 'argon'); ?> <code><?php echo esc_html($api['api_endpoint']); ?></code>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<div style="margin-top: 8px; font-size: 12px; color: #888;">
|
||||
<?php if ($api['id'] === $summary_active_api): ?>
|
||||
<span style="display: inline-block; padding: 2px 6px; background: #4caf50; color: #fff; border-radius: 3px; margin-right: 5px;">
|
||||
<?php _e('文章摘要', 'argon'); ?>
|
||||
</span>
|
||||
<?php endif; ?>
|
||||
<?php if ($api['id'] === $spam_active_api): ?>
|
||||
<span style="display: inline-block; padding: 2px 6px; background: #ff9800; color: #fff; border-radius: 3px; margin-right: 5px;">
|
||||
<?php _e('评论审核', 'argon'); ?>
|
||||
</span>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
<div style="display: flex; gap: 5px;">
|
||||
<button type="button" class="button button-small argon-test-unified-api" data-api-id="<?php echo esc_attr($api['id']); ?>">
|
||||
<span class="dashicons dashicons-yes-alt" style="margin-top: 3px;"></span>
|
||||
<?php _e('测试', 'argon'); ?>
|
||||
</button>
|
||||
<button type="button" class="button button-small argon-edit-unified-api" data-api-id="<?php echo esc_attr($api['id']); ?>">
|
||||
<?php _e('编辑', 'argon'); ?>
|
||||
</button>
|
||||
<button type="button" class="button button-small argon-delete-unified-api" data-api-id="<?php echo esc_attr($api['id']); ?>" style="color: #b32d2e;">
|
||||
<?php _e('删除', 'argon'); ?>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
<?php else: ?>
|
||||
<p style="color: #666; padding: 20px; background: #f9f9f9; border-radius: 4px; text-align: center;">
|
||||
<?php _e('暂无配置的 API,请点击下方按钮添加', 'argon'); ?>
|
||||
</p>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
|
||||
<button type="button" class="button button-primary" id="argon-add-unified-api-btn" style="margin-top: 15px;">
|
||||
<span class="dashicons dashicons-plus-alt" style="margin-top: 3px;"></span>
|
||||
<?php _e('添加新 API', 'argon'); ?>
|
||||
</button>
|
||||
|
||||
<!-- API 配置表单(隐藏) -->
|
||||
<div id="argon-unified-api-form" style="display:none; margin-top: 20px; padding: 20px; background: #fff; border: 2px solid #5e72e4; border-radius: 6px;">
|
||||
<h3 style="margin-top: 0;"><?php _e('API 配置', 'argon'); ?></h3>
|
||||
<input type="hidden" id="argon-unified-api-form-id" value="" />
|
||||
|
||||
<p>
|
||||
<label>
|
||||
<strong><?php _e('配置名称:', 'argon'); ?></strong> <span style="color: #d32f2f;">*</span><br>
|
||||
<input type="text" id="argon-unified-api-form-name" class="regular-text" placeholder="<?php _e('例如: 主 OpenAI API', 'argon'); ?>" />
|
||||
</label>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<label>
|
||||
<strong><?php _e('API 密钥:', 'argon'); ?></strong> <span style="color: #d32f2f;">*</span><br>
|
||||
<input type="password" id="argon-unified-api-form-key" class="regular-text" placeholder="sk-..." />
|
||||
<button type="button" class="button" id="argon-toggle-unified-password" style="margin-left: 5px;">
|
||||
<span class="dashicons dashicons-visibility"></span>
|
||||
</button>
|
||||
</label>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<label>
|
||||
<strong><?php _e('提供商:', 'argon'); ?></strong> <span style="color: #d32f2f;">*</span><br>
|
||||
<select id="argon-unified-api-form-provider" class="regular-text">
|
||||
<option value=""><?php _e('请选择提供商', 'argon'); ?></option>
|
||||
<?php foreach ($providers as $key => $name): ?>
|
||||
<option value="<?php echo esc_attr($key); ?>"><?php echo esc_html($name); ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</label>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<label>
|
||||
<strong><?php _e('API 端点:', 'argon'); ?></strong> <small>(<?php _e('可选', 'argon'); ?>)</small><br>
|
||||
<input type="text" id="argon-unified-api-form-endpoint" class="regular-text" placeholder="<?php _e('留空使用默认端点', 'argon'); ?>" />
|
||||
</label>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<label>
|
||||
<strong><?php _e('模型:', 'argon'); ?></strong> <small>(<?php _e('可选', 'argon'); ?>)</small><br>
|
||||
<input type="text" id="argon-unified-api-form-model" class="regular-text" placeholder="<?php _e('留空使用默认模型', 'argon'); ?>" style="width: calc(100% - 120px);" />
|
||||
<button type="button" class="button" id="argon-refresh-unified-models" style="margin-left: 5px;">
|
||||
<span class="dashicons dashicons-update"></span> <?php _e('刷新', 'argon'); ?>
|
||||
</button>
|
||||
</label>
|
||||
<div id="argon-unified-models-list" style="display:none; margin-top: 10px; max-height: 200px; overflow-y: auto; border: 1px solid #ddd; padding: 10px; background: #fafafa; border-radius: 4px;">
|
||||
<p style="margin: 0; color: #666;"><?php _e('加载中...', 'argon'); ?></p>
|
||||
</div>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<button type="button" class="button button-primary" id="argon-save-unified-api">
|
||||
<?php _e('保存', 'argon'); ?>
|
||||
</button>
|
||||
<button type="button" class="button" id="argon-cancel-unified-api">
|
||||
<?php _e('取消', 'argon'); ?>
|
||||
</button>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<p class="description" style="margin-top: 15px;">
|
||||
<span class="dashicons dashicons-info" style="color: #2271b1;"></span>
|
||||
<?php _e('统一管理所有 AI 服务商的 API 配置。不同功能可以使用不同的 API(在下方的文章摘要和评论审核设置中选择)', 'argon');?>
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- ========== 文章摘要 ========== -->
|
||||
<tr><th class="subtitle"><h2 id="ai-summary"><?php _e('文章摘要', 'argon');?></h2></th></tr>
|
||||
|
||||
<tr>
|
||||
<th><label><?php _e('启用 AI 摘要', 'argon');?></label></th>
|
||||
<td>
|
||||
<select name="argon_ai_summary_enable">
|
||||
<?php $argon_ai_summary_enable = get_option('argon_ai_summary_enable', 'false'); ?>
|
||||
<option value="true" <?php if ($argon_ai_summary_enable=='true'){echo 'selected';} ?>><?php _e('启用', 'argon');?></option>
|
||||
<option value="false" <?php if ($argon_ai_summary_enable=='false'){echo 'selected';} ?>><?php _e('禁用', 'argon');?></option>
|
||||
</select>
|
||||
<p class="description"><?php _e('开启后,文章开头会显示 AI 生成的摘要。每篇文章只生成一次,结果会缓存到服务器。', 'argon');?></p>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th><label><?php _e('默认使用 API', 'argon');?></label></th>
|
||||
<td>
|
||||
<select name="argon_ai_summary_active_api">
|
||||
<option value=""><?php _e('请选择 API', 'argon'); ?></option>
|
||||
<?php foreach ($all_apis as $api): ?>
|
||||
<option value="<?php echo esc_attr($api['id']); ?>" <?php selected($summary_active_api, $api['id']); ?>>
|
||||
<?php echo esc_html($api['name']); ?> (<?php echo esc_html($providers[$api['provider']]); ?>)
|
||||
</option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
<p class="description"><?php _e('选择用于生成文章摘要的 API 配置', 'argon');?></p>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- 其他文章摘要设置保持不变 -->
|
||||
|
||||
<!-- ========== 评论审核 ========== -->
|
||||
<tr><th class="subtitle"><h2 id="ai-spam-detection"><?php _e('评论审核', 'argon');?></h2></th></tr>
|
||||
|
||||
<tr>
|
||||
<th><label><?php _e('启用 AI 识别', 'argon');?></label></th>
|
||||
<td>
|
||||
<?php $argon_comment_spam_detection_enable = get_option('argon_comment_spam_detection_enable', 'false'); ?>
|
||||
<label>
|
||||
<input type="checkbox" name="argon_comment_spam_detection_enable" value="true" <?php if ($argon_comment_spam_detection_enable=='true'){echo 'checked';}?>/>
|
||||
<?php _e('启用 AI 自动识别垃圾评论', 'argon');?>
|
||||
</label>
|
||||
<p class="description">
|
||||
<?php _e('开启后,将使用 AI 自动识别广告、反动、违法等垃圾评论。', 'argon');?>
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th><label><?php _e('默认使用 API', 'argon');?></label></th>
|
||||
<td>
|
||||
<select name="argon_ai_spam_active_api">
|
||||
<option value=""><?php _e('请选择 API', 'argon'); ?></option>
|
||||
<?php foreach ($all_apis as $api): ?>
|
||||
<option value="<?php echo esc_attr($api['id']); ?>" <?php selected($spam_active_api, $api['id']); ?>>
|
||||
<?php echo esc_html($api['name']); ?> (<?php echo esc_html($providers[$api['provider']]); ?>)
|
||||
</option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
<p class="description"><?php _e('选择用于垃圾评论检测的 API 配置', 'argon');?></p>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- 其他评论审核设置保持不变 -->
|
||||
Reference in New Issue
Block a user