feat(ai): 添加 AI 动作支持,集成 OpenAI GPT-4o 驱动自动化流程

- 新增 AIExecutor 类用于调用 OpenAI API 并解析结构化指令
- 在 Settings 中增加 OpenAI 相关配置项(API Key、模型、超时等)
- 扩展 ActionContext 以支持注入 AI 服务实例
- 实现 AIAction 类处理自然语言提示并执行 AI 规划的浏览器操作
- 支持通过 max_step 参数限制 AI 操作步数(默认5,最大20)
- 支持 include_html 和 include_variables 控制上下文内容传递
- 支持运行时覆盖模型和温度参数
- 增加详细的错误处理与日志记录机制- 更新 README 文档说明 AIAction 使用方法与配置选项
- 更新 XSD schema 支持 ai 类型动作定义- 在 FlowRunner 中完善步骤记录逻辑,支持 AI 执行结果输出
- 添加 plan_ai_action.md 设计文档描述实现细节与规划
This commit is contained in:
2025-10-21 21:38:46 +08:00
parent a1a13aae65
commit 85b7ea4f6c
11 changed files with 604 additions and 13 deletions

View File

@@ -49,6 +49,11 @@ pip install drissionpage redis requests pymongo lxml cssselect
| `XSPIDER_REDIS_BLOCK_TIMEOUT` | `30` | Redis `BLPOP` 阻塞秒数 |
| `XSPIDER_MONGO_URI` | `mongodb://localhost:27017` | MongoDB 连接串 |
| `XSPIDER_MONGO_DB` | `xspider` | MongoDB 数据库名称 |
| `OPENAI_API_KEY` | `""` | 调用 `gpt-4o` 时使用的 API Key留空则禁用 AI 动作) |
| `OPENAI_API_BASE` | `https://api.openai.com/v1` | OpenAI API 基础地址,可按需切换代理 |
| `OPENAI_MODEL` | `gpt-4o` | 默认模型名称 |
| `OPENAI_TIMEOUT` | `60` | OpenAI 请求超时,秒 |
| `OPENAI_TEMPERATURE` | `0.0` | OpenAI 采样温度 |
**变量作用域说明**
- 对变量名使用 `site:变量名` 将强制读取/写入当前站点作用域;`global:变量名` 将强制使用全局作用域。
@@ -181,6 +186,7 @@ python main.py
| `set_attr` | `selector``params.attr_name` | `params.attr_value`(默认空字符串) | 修改 DOM 属性值。 |
| `set_var` | `params.var_name``params.var_value` | `params.var_scope``params.var_ttl``params.var_single_use` | 将变量写入变量服务,可带过期策略。 |
| `captcha` | 无(若缺省会截取 `selector` 或整页截图) | `params.image``params.captcha_type``params.captcha_url``params.captcha_config``params.variable` | 调用远程接口识别验证码并写入变量。 |
| `ai` | `params.prompt` | `params.max_step``params.model``params.include_html``params.include_variables``params.temperature` | 调用 `gpt-4o` 生成 DrissionPage 操作步骤并执行,支持限制最大步骤数。 |
> **提示**
> - 当 `selector` 与 `mode` 不匹配时(例如 CSS 模式中使用 XPath解析阶段会抛出异常。
@@ -236,6 +242,25 @@ python main.py
- 服务返回 JSON 后,会尝试读取 `result``text``value``code``data` 等字段作为识别结果。
- 结果最终写入 Redis默认键为站点作用域下的 `captcha_result`,或使用 `params.variable` 覆盖),并同步到 `site_context` 供后续动作引用。
### AIAction 使用示例
`AIAction` 通过调用 OpenAI `gpt-4o` 规划并执行一组 DrissionPage 原生操作,适合处理动态页面或复杂交互。请确保已经在环境变量或 `Settings` 中配置 `OPENAI_API_KEY`
```xml
<action type="ai"
prompt="下载当前页面的首个报表附件,并在完成后返回列表页"
max_step="6"
include_html="true"
include_variables="false"/>
```
- `prompt`:必填,自然语言描述任务目标,支持变量占位符。
- `max_step`:限制模型输出的步骤数量(默认为 5最大 20
- `include_html` / `include_variables`:控制是否向模型提供页面 HTML 片段和当前变量上下文。
- 执行过程中会在 `task_logs``steps` 字段中记录每个 AI 子步骤的执行结果、异常信息与返回值。
若未配置 API Key 或 OpenAI 调用失败,动作会抛出异常并在任务日志中记录具体原因。
## 抽取与存储
- `<extract>` 支持 `record_css` / `record_xpath` 指定列表元素,`<field>` 定义字段名称、选择器、取值模式及可选的 `value_type`