# 平台适配器扩展指南
**本文档引用的文件**
- [backend/app/workers/platforms/base.py](file://backend/app/workers/platforms/base.py)
- [backend/app/workers/platforms/kimi.py](file://backend/app/workers/platforms/kimi.py)
- [backend/app/workers/platforms/wenxin.py](file://backend/app/workers/platforms/wenxin.py)
- [backend/app/workers/citation_engine.py](file://backend/app/workers/citation_engine.py)
- [backend/app/workers/scheduler.py](file://backend/app/workers/scheduler.py)
- [backend/app/models/query.py](file://backend/app/models/query.py)
- [backend/app/config.py](file://backend/app/config.py)
- [frontend/lib/platforms.ts](file://frontend/lib/platforms.ts)
- [frontend/components/charts/platform-chart.tsx](file://frontend/components/charts/platform-chart.tsx)
- [frontend/lib/api.ts](file://frontend/lib/api.ts)
- [tests/test_citation_engine.py](file://tests/test_citation_engine.py)
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖分析](#依赖分析)
7. [性能考虑](#性能考虑)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本指南面向需要为系统新增AI平台适配器的开发者,提供从基类继承、实现必需方法、配置平台参数,到资源管理与性能优化的完整流程。文档同时覆盖两类平台适配策略:基于浏览器自动化(Playwright)的平台与基于API的平台,并给出测试方法、验证标准与常见问题排查建议。
## 项目结构
后端采用分层架构,平台适配器位于 workers/platforms 子目录;引用检测引擎位于 workers 子目录;查询模型与调度器分别位于 models 与 workers 子目录;前端通过 lib 与 components 提供平台映射、图表展示与API封装。
```mermaid
graph TB
subgraph "后端"
CFG["配置
app/config.py"]
SCH["调度器
workers/scheduler.py"]
CE["引用引擎
workers/citation_engine.py"]
BP["适配器基类
workers/platforms/base.py"]
KIMI["Kimi适配器
workers/platforms/kimi.py"]
WENXIN["文心一言适配器
workers/platforms/wenxin.py"]
QRY["查询模型
models/query.py"]
end
subgraph "前端"
PFM["平台映射
lib/platforms.ts"]
API["API封装
lib/api.ts"]
CHART["平台图表
components/charts/platform-chart.tsx"]
end
SCH --> CE
CE --> KIMI
CE --> WENXIN
CE --> QRY
BP -. 继承 .- KIMI
BP -. 继承 .- WENXIN
PFM --> CHART
API --> SCH
```
**图示来源**
- [backend/app/workers/platforms/base.py:1-18](file://backend/app/workers/platforms/base.py#L1-L18)
- [backend/app/workers/platforms/kimi.py:1-206](file://backend/app/workers/platforms/kimi.py#L1-L206)
- [backend/app/workers/platforms/wenxin.py:1-205](file://backend/app/workers/platforms/wenxin.py#L1-L205)
- [backend/app/workers/citation_engine.py:1-309](file://backend/app/workers/citation_engine.py#L1-L309)
- [backend/app/workers/scheduler.py:1-95](file://backend/app/workers/scheduler.py#L1-L95)
- [backend/app/models/query.py:1-55](file://backend/app/models/query.py#L1-L55)
- [backend/app/config.py:1-17](file://backend/app/config.py#L1-L17)
- [frontend/lib/platforms.ts:1-18](file://frontend/lib/platforms.ts#L1-L18)
- [frontend/lib/api.ts:1-58](file://frontend/lib/api.ts#L1-L58)
- [frontend/components/charts/platform-chart.tsx:1-68](file://frontend/components/charts/platform-chart.tsx#L1-L68)
**章节来源**
- [backend/app/workers/platforms/base.py:1-18](file://backend/app/workers/platforms/base.py#L1-L18)
- [backend/app/workers/platforms/kimi.py:1-206](file://backend/app/workers/platforms/kimi.py#L1-L206)
- [backend/app/workers/platforms/wenxin.py:1-205](file://backend/app/workers/platforms/wenxin.py#L1-L205)
- [backend/app/workers/citation_engine.py:1-309](file://backend/app/workers/citation_engine.py#L1-L309)
- [backend/app/workers/scheduler.py:1-95](file://backend/app/workers/scheduler.py#L1-L95)
- [backend/app/models/query.py:1-55](file://backend/app/models/query.py#L1-L55)
- [backend/app/config.py:1-17](file://backend/app/config.py#L1-L17)
- [frontend/lib/platforms.ts:1-18](file://frontend/lib/platforms.ts#L1-L18)
- [frontend/lib/api.ts:1-58](file://frontend/lib/api.ts#L1-L58)
- [frontend/components/charts/platform-chart.tsx:1-68](file://frontend/components/charts/platform-chart.tsx#L1-L68)
## 核心组件
- 适配器基类 BasePlatformAdapter:定义平台名称、平台URL以及抽象方法 query 与可选方法 close。
- 具体适配器 KimiAdapter 与 WenxinAdapter:均继承自基类,实现 query 方法并通过 Playwright 自动化浏览器进行交互。
- 引擎 CitationEngine:负责编排查询、调用适配器、执行品牌匹配与竞争品牌检测、持久化结果。
- 调度器 QueryScheduler:周期性触发查询任务执行。
- 查询模型 Query:承载关键词、目标品牌、别名、平台列表、频率与时间戳等元数据。
- 配置 Settings:集中管理数据库、Redis、JWT、Playwright浏览器路径及第三方API密钥等。
**章节来源**
- [backend/app/workers/platforms/base.py:1-18](file://backend/app/workers/platforms/base.py#L1-L18)
- [backend/app/workers/platforms/kimi.py:1-206](file://backend/app/workers/platforms/kimi.py#L1-L206)
- [backend/app/workers/platforms/wenxin.py:1-205](file://backend/app/workers/platforms/wenxin.py#L1-L205)
- [backend/app/workers/citation_engine.py:1-309](file://backend/app/workers/citation_engine.py#L1-L309)
- [backend/app/workers/scheduler.py:1-95](file://backend/app/workers/scheduler.py#L1-L95)
- [backend/app/models/query.py:1-55](file://backend/app/models/query.py#L1-L55)
- [backend/app/config.py:1-17](file://backend/app/config.py#L1-L17)
## 架构总览
下图展示了从调度器到引擎再到具体适配器的调用链路,以及前端如何消费平台映射与统计数据。
```mermaid
sequenceDiagram
participant S as "调度器
workers/scheduler.py"
participant E as "引擎
workers/citation_engine.py"
participant A as "适配器
Kimi/Wenxin"
participant DB as "数据库
SQLAlchemy"
S->>E : 触发执行查询
E->>DB : 查询待执行的 Query
loop 遍历平台
E->>A : 调用 query(keyword)
A-->>E : 返回原始响应文本
E->>E : 品牌匹配/竞争品牌检测
E->>DB : 写入引用记录与任务状态
end
E-->>S : 返回本次执行结果
```
**图示来源**
- [backend/app/workers/scheduler.py:51-84](file://backend/app/workers/scheduler.py#L51-L84)
- [backend/app/workers/citation_engine.py:159-234](file://backend/app/workers/citation_engine.py#L159-L234)
- [backend/app/workers/platforms/kimi.py:33-48](file://backend/app/workers/platforms/kimi.py#L33-L48)
- [backend/app/workers/platforms/wenxin.py:33-48](file://backend/app/workers/platforms/wenxin.py#L33-L48)
## 详细组件分析
### 基类与继承规范
- 必须实现的方法
- query(keyword: str) -> str:在指定平台查询关键词并返回原始响应文本。
- 可选方法
- close():释放浏览器或网络连接等资源。
- 平台元信息
- platform_name:平台标识字符串。
- platform_url:平台主页URL。
```mermaid
classDiagram
class BasePlatformAdapter {
+string platform_name
+string platform_url
+query(keyword) str
+close() void
}
class KimiAdapter {
+platform_name = "kimi"
+platform_url = "https : //kimi.moonshot.cn"
+query(keyword) str
+close() void
}
class WenxinAdapter {
+platform_name = "wenxin"
+platform_url = "https : //yiyan.baidu.com"
+query(keyword) str
+close() void
}
KimiAdapter --|> BasePlatformAdapter
WenxinAdapter --|> BasePlatformAdapter
```
**图示来源**
- [backend/app/workers/platforms/base.py:4-17](file://backend/app/workers/platforms/base.py#L4-L17)
- [backend/app/workers/platforms/kimi.py:11-20](file://backend/app/workers/platforms/kimi.py#L11-L20)
- [backend/app/workers/platforms/wenxin.py:11-20](file://backend/app/workers/platforms/wenxin.py#L11-L20)
**章节来源**
- [backend/app/workers/platforms/base.py:4-17](file://backend/app/workers/platforms/base.py#L4-L17)
### 浏览器驱动型平台适配策略(以Kimi/Wenxin为例)
- 启动与重用浏览器:首次调用时初始化 Playwright 并启动 Chromium 浏览器,避免重复创建。
- 页面交互:导航至平台URL,等待并定位输入框,填充关键词,提交(回车或点击发送按钮)。
- 稳定性检测:持续轮询消息容器,当文本连续多次保持一致时判定回复稳定,返回内容。
- 错误处理:捕获超时与异常,记录日志并抛出可诊断的错误;提供指数退避重试机制。
- 资源管理:在 finally 中确保 page/context 关闭;close()统一释放浏览器与Playwright实例。
```mermaid
flowchart TD
Start(["进入 query"]) --> Ensure["确保浏览器已启动"]
Ensure --> TryDo["_do_query 尝试一次查询"]
TryDo --> Stable["等待回复稳定"]
Stable --> Done["返回原始响应文本"]
TryDo --> |异常| Retry{"重试次数 < 3?"}
Retry --> |是| Backoff["指数退避等待"] --> TryDo
Retry --> |否| Raise["抛出最终异常"]
Done --> Close["关闭 page/context"]
Raise --> Close
Close --> End(["结束"])
```
**图示来源**
- [backend/app/workers/platforms/kimi.py:21-48](file://backend/app/workers/platforms/kimi.py#L21-L48)
- [backend/app/workers/platforms/kimi.py:50-124](file://backend/app/workers/platforms/kimi.py#L50-L124)
- [backend/app/workers/platforms/kimi.py:126-196](file://backend/app/workers/platforms/kimi.py#L126-L196)
- [backend/app/workers/platforms/kimi.py:198-205](file://backend/app/workers/platforms/kimi.py#L198-L205)
- [backend/app/workers/platforms/wenxin.py:21-48](file://backend/app/workers/platforms/wenxin.py#L21-L48)
- [backend/app/workers/platforms/wenxin.py:50-123](file://backend/app/workers/platforms/wenxin.py#L50-L123)
- [backend/app/workers/platforms/wenxin.py:124-195](file://backend/app/workers/platforms/wenxin.py#L124-L195)
- [backend/app/workers/platforms/wenxin.py:197-204](file://backend/app/workers/platforms/wenxin.py#L197-L204)
**章节来源**
- [backend/app/workers/platforms/kimi.py:1-206](file://backend/app/workers/platforms/kimi.py#L1-L206)
- [backend/app/workers/platforms/wenxin.py:1-205](file://backend/app/workers/platforms/wenxin.py#L1-L205)
### API型平台适配策略(扩展指导)
- 继承基类并实现 query:通过HTTP客户端发起请求,解析JSON响应,提取平台返回的文本内容。
- 错误处理:区分网络错误、平台限流/鉴权失败、解析异常等,统一转换为可诊断的异常类型。
- 资源管理:若使用连接池或长连接,实现 close() 以释放连接;否则可为空实现。
- 配置参数:在 Settings 中添加平台API密钥与基础URL,前端与后端分别读取使用。
(本小节为概念性指导,不直接分析具体文件)
### 引擎与品牌检测
- CitationEngine 负责:
- 初始化各平台适配器实例并注册到平台字典。
- 针对每个 Query 的平台列表依次执行查询。
- 使用 BrandMatcher 执行精确/别名/模糊匹配,返回置信度与位置信息。
- 使用 CompetitorDetector 检测文本中出现的竞争品牌集合。
- 记录 CitationRecord 并更新 Query 的时间戳与下次查询时间。
- 资源关闭:在 close() 中遍历适配器逐一关闭,避免资源泄漏。
```mermaid
classDiagram
class CitationEngine {
+dict platforms
+BrandMatcher matcher
+CompetitorDetector competitor_detector
+execute_query(query, db) list
+execute_single_platform(keyword, platform, ...) dict
+close() void
}
class BrandMatcher {
+match(text) dict
}
class CompetitorDetector {
+detect(text, target_brand) list
}
CitationEngine --> BrandMatcher : "使用"
CitationEngine --> CompetitorDetector : "使用"
```
**图示来源**
- [backend/app/workers/citation_engine.py:148-309](file://backend/app/workers/citation_engine.py#L148-L309)
- [backend/app/workers/citation_engine.py:19-120](file://backend/app/workers/citation_engine.py#L19-L120)
- [backend/app/workers/citation_engine.py:122-146](file://backend/app/workers/citation_engine.py#L122-L146)
**章节来源**
- [backend/app/workers/citation_engine.py:1-309](file://backend/app/workers/citation_engine.py#L1-L309)
### 调度与执行
- QueryScheduler 使用 APScheduler 定时触发检查与执行逻辑,每小时扫描一次到期的查询任务。
- 对每个查询任务,CitationEngine.execute_query 会:
- 创建或获取 QueryTask 并更新状态为 running。
- 遍历平台列表执行查询与检测。
- 记录结果并更新 Query 的 last_queried_at 与 next_query_at。
- 若失败则记录错误并写入一条 cited=False 的占位记录。
- 关闭时统一调用 engine.close() 释放适配器资源。
```mermaid
sequenceDiagram
participant SCH as "调度器"
participant CE as "引擎"
participant DB as "数据库"
SCH->>CE : check_and_execute_queries()
CE->>DB : 查询 active 且到期的 Query
loop 遍历查询
CE->>DB : 获取/创建 QueryTask
CE->>CE : 执行平台查询与检测
CE->>DB : 写入 CitationRecord 与更新 Query
end
SCH->>CE : shutdown()
CE->>CE : close()
```
**图示来源**
- [backend/app/workers/scheduler.py:30-90](file://backend/app/workers/scheduler.py#L30-L90)
- [backend/app/workers/citation_engine.py:159-234](file://backend/app/workers/citation_engine.py#L159-L234)
**章节来源**
- [backend/app/workers/scheduler.py:1-95](file://backend/app/workers/scheduler.py#L1-L95)
- [backend/app/workers/citation_engine.py:1-309](file://backend/app/workers/citation_engine.py#L1-L309)
### 前端集成与展示
- 平台映射:前端 lib/platforms.ts 定义平台键到中文标签的映射,用于UI显示与图表标签。
- 图表组件:components/charts/platform-chart.tsx 接收平台统计数据,渲染引用率柱状图。
- API封装:frontend/lib/api.ts 提供认证、查询、引用与报表导出等接口封装,便于前端调用。
```mermaid
graph LR
PFM["平台映射
lib/platforms.ts"] --> CHART["平台图表
components/charts/platform-chart.tsx"]
API["API封装
lib/api.ts"] --> SCH["调度器
workers/scheduler.py"]
API --> CE["引擎
workers/citation_engine.py"]
```
**图示来源**
- [frontend/lib/platforms.ts:1-18](file://frontend/lib/platforms.ts#L1-L18)
- [frontend/components/charts/platform-chart.tsx:34-39](file://frontend/components/charts/platform-chart.tsx#L34-L39)
- [frontend/lib/api.ts:23-57](file://frontend/lib/api.ts#L23-L57)
**章节来源**
- [frontend/lib/platforms.ts:1-18](file://frontend/lib/platforms.ts#L1-L18)
- [frontend/components/charts/platform-chart.tsx:1-68](file://frontend/components/charts/platform-chart.tsx#L1-L68)
- [frontend/lib/api.ts:1-58](file://frontend/lib/api.ts#L1-L58)
## 依赖分析
- 组件耦合
- CitationEngine 与具体适配器松耦合:通过平台字典注册与动态查找,便于扩展新平台。
- 调度器与引擎解耦:调度器仅负责触发,引擎负责业务逻辑与平台交互。
- 外部依赖
- Playwright:用于浏览器自动化(Kimi/Wenxin)。
- SQLAlchemy:用于数据库访问与事务控制。
- APScheduler:用于定时任务调度。
- Pydantic Settings:用于配置管理。
```mermaid
graph TB
CE["CitationEngine"] --> KIMI["KimiAdapter"]
CE --> WENXIN["WenxinAdapter"]
CE --> DB["SQLAlchemy"]
SCH["QueryScheduler"] --> CE
CE --> CFG["Settings"]
KIMI --> PW["Playwright"]
WENXIN --> PW
```
**图示来源**
- [backend/app/workers/citation_engine.py:152-155](file://backend/app/workers/citation_engine.py#L152-L155)
- [backend/app/workers/scheduler.py:26-28](file://backend/app/workers/scheduler.py#L26-L28)
- [backend/app/config.py:11-14](file://backend/app/config.py#L11-L14)
- [backend/app/workers/platforms/kimi.py:4-6](file://backend/app/workers/platforms/kimi.py#L4-L6)
- [backend/app/workers/platforms/wenxin.py:4-6](file://backend/app/workers/platforms/wenxin.py#L4-L6)
**章节来源**
- [backend/app/workers/citation_engine.py:1-309](file://backend/app/workers/citation_engine.py#L1-L309)
- [backend/app/workers/scheduler.py:1-95](file://backend/app/workers/scheduler.py#L1-L95)
- [backend/app/config.py:1-17](file://backend/app/config.py#L1-L17)
- [backend/app/workers/platforms/kimi.py:1-206](file://backend/app/workers/platforms/kimi.py#L1-L206)
- [backend/app/workers/platforms/wenxin.py:1-205](file://backend/app/workers/platforms/wenxin.py#L1-L205)
## 性能考虑
- 浏览器复用:避免每次查询都启动/关闭浏览器,减少冷启动开销。
- 稳定性检测阈值:合理设置“连续稳定”次数与轮询间隔,平衡准确性和延迟。
- 指数退避:在重试时采用指数退避,降低平台压力并提升成功率。
- 数据库批处理:批量写入引用记录与任务状态,减少IO往返。
- 超时与并发:为页面导航、元素等待与响应稳定检测设置合理超时,避免长时间阻塞。
- 缓存与预热:可在进程启动时预热部分资源(如Playwright浏览器),缩短首次查询耗时。
(本节为通用建议,不直接分析具体文件)
## 故障排查指南
- 浏览器相关
- 现象:启动浏览器失败或找不到输入框。
- 排查:确认已安装 Playwright 浏览器;检查平台URL可达性;核对页面选择器是否随平台更新而变更。
- 参考实现:Kimi/Wenxin 适配器在启动失败时抛出明确提示,需按提示执行安装命令。
- 超时与不稳定
- 现象:页面操作超时或回复未稳定。
- 排查:适当提高等待超时与稳定检测阈值;检查网络环境与平台负载。
- 参考实现:适配器内对超时与异常进行捕获并记录日志。
- 品牌匹配
- 现象:匹配结果不符合预期。
- 排查:调整别名列表、提高模糊匹配阈值或优化候选词提取逻辑。
- 参考实现:测试用例覆盖精确、别名、模糊与无匹配场景。
- 调度与状态
- 现象:查询未按时执行或状态异常。
- 排查:检查调度器是否启动、数据库连接与时区设置、Query 的 next_query_at 是否正确更新。
- 前端展示
- 现象:平台图表标签显示异常。
- 排查:确认前端平台映射与后端平台键一致。
**章节来源**
- [backend/app/workers/platforms/kimi.py:27-31](file://backend/app/workers/platforms/kimi.py#L27-L31)
- [backend/app/workers/platforms/kimi.py:87-88](file://backend/app/workers/platforms/kimi.py#L87-L88)
- [backend/app/workers/platforms/kimi.py:116-118](file://backend/app/workers/platforms/kimi.py#L116-L118)
- [backend/app/workers/platforms/wenxin.py:27-31](file://backend/app/workers/platforms/wenxin.py#L27-L31)
- [backend/app/workers/platforms/wenxin.py:86-87](file://backend/app/workers/platforms/wenxin.py#L86-L87)
- [backend/app/workers/platforms/wenxin.py:114-116](file://backend/app/workers/platforms/wenxin.py#L114-L116)
- [tests/test_citation_engine.py:6-53](file://tests/test_citation_engine.py#L6-L53)
- [backend/app/workers/scheduler.py:30-40](file://backend/app/workers/scheduler.py#L30-L40)
- [backend/app/workers/citation_engine.py:229-232](file://backend/app/workers/citation_engine.py#L229-L232)
- [frontend/lib/platforms.ts:1-18](file://frontend/lib/platforms.ts#L1-L18)
## 结论
通过继承 BasePlatformAdapter 并遵循本文提供的实现规范与最佳实践,可以快速、安全地为系统接入新的AI平台。对于浏览器驱动型平台,重点在于稳定的选择器策略与资源管理;对于API型平台,重点在于健壮的错误处理与配置管理。配合引擎的品牌检测能力与调度器的自动化执行,可构建高可用的跨平台引用检测体系。
## 附录
### 新平台接入步骤清单
- 继承基类并实现必需方法
- 在 workers/platforms 下新建适配器文件,继承 BasePlatformAdapter。
- 实现 query 与可选的 close。
- 设置 platform_name 与 platform_url。
- 注册到引擎
- 在 CitationEngine 的平台字典中注册新适配器实例。
- 配置与密钥
- 在 Settings 中添加必要的配置项(如API密钥、基础URL)。
- 前端集成
- 在前端 lib/platforms.ts 中添加平台键与中文标签。
- 如需展示统计,确保后端返回的数据结构与前端图表组件兼容。
- 测试与验证
- 编写单元测试覆盖品牌匹配与竞争品牌检测逻辑。
- 进行端到端测试,验证调度器触发、引擎执行与数据库写入。
- 性能与稳定性
- 评估并优化超时、重试与稳定检测策略。
- 监控日志与错误指标,持续改进。
(本节为流程性说明,不直接分析具体文件)