Files
ars-backend/README.md
Roog 977c8ee272 main: 更新 README,增强架构描述与配置说明
- 添加 `messages.payload` 表达式索引,优化查询性能
- 增强 SSE 功能,支持 seq gap 补偿与心跳保活机制
- 更新 Agent Run 逻辑,支持 HttpProvider 幂等去重与取消机制
- 增加 Agent Provider 配置说明,完善环境变量文档
2025-12-18 18:17:44 +08:00

84 lines
5.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Agent Runtime Server (ARS) · Laravel + Octane + Docker
> 自建可部署的 Agent Runtime Server。愿景兼容大部分 Agent 模型、随时在 Web 终端输入指令/查看日志、断开后任务继续执行,重新连入能续上会话。
>
> “输入 prompt 就能离开工位,路上/手机继续 approve 和观察”。
## 🎯 愿景与思路(摘录)
- 兼容多数 Agent 模型,提供可观测的运行日志。
- Web 终端可随时输入/查看;断线不中断,重连可续。
- 面向开源生态,避免被单一厂商闭锁;先做最小实现,再逐步拆分组件。
## 🏗️ 当前架构概览
- **运行**Docker ComposeFrankenPHP + Laravel Octane。
- **存储**PostgreSQL主存储Redis可选用于 SSE 推送messages.payload 提供表达式索引以加速 run/cancel 查询。
- **鉴权**JWT无状态API 路由均在 `/api/*`
- **会话/消息模型**
- `chat_sessions(session_id UUID, session_name, status OPEN|LOCKED|CLOSED, last_seq, last_message_id, timestamps)`
- `messages(message_id UUID, session_id, role USER|AGENT|TOOL|SYSTEM, type, content, payload jsonb, seq, reply_to, dedupe_key)`
- 约束:`unique(session_id, seq)``unique(session_id, dedupe_key)`append 行锁 + 事务seq 单调递增。
- **实时**SSE `/api/sessions/{id}/sse`backlog 先补历史(按 seq再监听 Redis `session:{id}:messages` 渠道;发现 seq gap 会回补并提供心跳。
- **Agent Run 编排MVP-0**user.prompt 后自动触发 RunDispatcher → `run.status=RUNNING` → AgentRunJobHttpProvider未配置 endpoint 时回退 DummyProvider`agent.message` + `run.status=DONE/FAILED/CANCELED` 落库;同 trigger_message 幂等、同会话只允许一个 RUNNING终态/消息均去重,取消可保证不写 agent.message。
- **队列监控**Horizon本地默认开放 `/horizon`,非 local 环境默认拒绝访问)。
## 🚀 快速启动
```bash
# 构建并启动
docker compose build
docker compose up -d app horizon pgsql redis
# 首次迁移(仅需一次)
docker compose exec app php artisan migrate
# 运行 Feature 测试
docker compose exec app php artisan test --testsuite=Feature
# 队列AgentRunJob开发可用同步队列或用 Horizon
# 同步:.env / phpunit.xml 中 QUEUE_CONNECTION=sync
# Horizondocker compose up -d horizon需 composer install 安装 laravel/horizonQUEUE_CONNECTION=redis
```
### Agent Provider 配置(可选)
`config/agent.php` 读取以下环境变量(默认值已内置):
- `AGENT_PROVIDER_ENDPOINT`
- `AGENT_PROVIDER_TIMEOUT`(默认 30
- `AGENT_PROVIDER_CONNECT_TIMEOUT`(默认 5
- `AGENT_PROVIDER_RETRY_TIMES`(默认 1
- `AGENT_PROVIDER_RETRY_BACKOFF_MS`(默认 500
- `AGENT_RUN_JOB_TRIES`(默认 1
- `AGENT_RUN_JOB_BACKOFF`(默认 5
- `AGENT_RUN_JOB_TIMEOUT`(默认 120
## 🔑 API 能力一览MVP-1.1 + Archive/GetMessage/SSE
- 会话:`POST /api/sessions``GET /api/sessions`(分页/状态/关键词),`GET /api/sessions/{id}``PATCH /api/sessions/{id}`(重命名/状态CLOSED 不可重开),`POST /api/sessions/{id}/archive`幂等归档→CLOSED
- 消息:`POST /api/sessions/{id}/messages`(幂等 dedupe_keyCLOSED/LOCKED 门禁),`GET /api/sessions/{id}/messages`after_seq 增量),`GET /api/sessions/{id}/messages/{message_id}`(校验 session_id
- 实时:`GET /api/sessions/{id}/sse?after_seq=123`SSE 事件 id 为 seq`Last-Event-ID` 优先于 querygap 会回补,定期心跳保活。
- Agent Runuser.prompt 自动触发;或 `POST /api/sessions/{id}/runs {trigger_message_id}` 手动触发,写入 `run.status/agent.message`,幂等去重,失败会写 `error`(含 retryable/http_status/provider/latency_ms
详细字段/示例:`docs/ChatSession/chat-session-api.md`OpenAPI`docs/ChatSession/chat-session-openapi.yaml`。用户管理/鉴权文档:`docs/User/user-api.md`
## 🔒 状态与门禁规则
- `OPEN`:正常追加。
- `LOCKED`:拒绝 `role=USER && type=user.prompt`
- `CLOSED`:拒绝追加,例外 `role=SYSTEM && type in [run.status, error]`
- 幂等:同一 session + dedupe_key 返回已有消息(同 message_id/seqrun.status 与 agent.message 均通过 dedupe_key 防重复。
## 🔌 开发/验证
- 迁移:`docker compose exec app php artisan migrate`
- 测试:`docker compose exec app php artisan test --testsuite=Feature`
- cURL 示例(需 Bearer TOKEN
```bash
# 归档
curl -X POST http://localhost:8000/api/sessions/{sid}/archive -H "Authorization: Bearer $TOKEN"
# 单条消息
curl http://localhost:8000/api/sessions/{sid}/messages/{mid} -H "Authorization: Bearer $TOKEN"
# SSE断线续传可带 Last-Event-ID
curl -N http://localhost:8000/api/sessions/{sid}/sse?after_seq=0 \
-H "Authorization: Bearer $TOKEN" -H "Accept: text/event-stream"
```
## 📌 后续演进(规划)
- Agent Loop/Tools/Policy Engine/Context Store 解耦与插件化。
- 更丰富的前端控制台:日志流、工具审批、移动端友好。
- 兼容多家模型/工具 SDK保持开放生态。