数据分析层(新增 services/{spectrum,timeseries,analysis}):
- 光谱参数提取 parameters.rs:LAMOST/SDSS/APOGEE/DESI FITS header 跨源归一化读取
Teff/logg/[Fe/H]/RV 及 ASPCAP 20+ 元素丰度,rayon 并发批量提取
- 谱线测量 lines.rs:内置真空/空气波长谱线表,窗口内极值搜索 + 梯形法积分 EW + FWHM,支持自定义谱线
- 交叉相关测速 cross_correlate.rs:对数波长重采样对齐,内置 Pickles 模板按光谱型插值,
CCF 峰值位置提取 RV 及不确定度
- 周期搜索 periodicity.rs:Lomb-Scargle 周期图(含 FAP 误报概率)+ BLS 凌星检测 + 相位折叠
- 变星分类 classification.rs:振幅/偏度/峰度/过零率/eta 等统计特征 + 规则分类(RR Lyrae/Cepheid/食双星/AGN 等)
- SED 拟合 sed.rs:多波段测光黑体模型拟合,输出 T_eff/半径/消光 A_V/光度及不确定度
- 运动学 kinematics.rs:视差+自行+RV → 银河系 UVW 空间速度,含移动星群成员概率(Banyan Σ 简化版)
- 化学丰度 chemistry.rs:[α/Fe] vs [Fe/H] 计算,厚盘/薄盘/晕星族判别
- 观测规划 observability.rs:目标升落时间/airmass/月相影响/曝光时间估算
- 赫罗图 hr_diagram.rs:Gaia TAP CMD 查询,新增 GET /api/analysis/hr-diagram 端点
数据获取层:
- JWST:clients/mast/jwst.rs 封装 MAST Portal 锥形检索 + JwstSpectrumFetcher(NIRSpec/MIRI 光谱)
- X 射线:clients/heasarc 封装 HEASARC TAP(ADQL)+ XMM-Newton/Chandra 光谱 fetcher
- 图像 cutout:SDSS SkyServer/STScI DSS/Pan-STARRS 三源 cutout + 发现图(Finding Chart)生成
- Source 枚举新增 Jwst/Xmm/Chandra 并注册 ObservationRegistry,前端 SOURCE_THEME 与筛选器同步三源
Agent 工具集(24→35):
- 新增 9 个分析工具:get_spectrum_parameters / measure_spectral_lines / measure_radial_velocity /
find_period / classify_variable_star / fit_sed / analyze_kinematics / analyze_abundance_pattern / plan_observation
- batch_process:批量样本"查询→下载→分析→报告"流水线,并发控制防数据源速率限制
- literature_monitor:按 ADS 查询式/时间窗/最低引用数检查最新文献
定时文献同步:
- sync_queries 表新增 is_scheduled 列(migration 20260713)
- 新增 POST /sync/queries/:id/schedule 端点
- 服务启动时拉起每小时调度器,对 is_scheduled=1 的检索配置静默执行 ADS(entdate 增量)/arXiv 增量同步
- search_history 工具收敛至 services/search::search_agent_history,消除 FTS 查询逻辑重复
其他:
- plotting skill 由占位填充为完整科研绘图规范:光谱/光变/折叠曲线/CMD/SED/[α/Fe]/周期图/Mollweide/发现图 9 类 matplotlib 模板
- 删除死代码 streaming_executor.rs(929 行,仅剩 mod 声明引用,无调用方)
- 新增 docs/roadmap-research-features.md 科研功能路线图及实现状态
7.6 KiB
7.6 KiB
Agent 架构概览
AstroResearch 内置了一个基于 ReAct (Thought → Action → Observation) 范式的科研智能体引擎 (src/agent/),参考 Claude Code 的分层设计。以下对各子系统的架构、数据流和内部逻辑进行完整说明。
架构演进:2026-08 起,ReAct 循环的唯一实现在
src/agent/engine.rs(ReactEngine,主代理/子代理/队友以不同注入组合复用);AgentRuntime按会话缓存复用(SessionRuntimeRegistry); turn/compaction 生命周期与上下文快照落在agent_events事件日志。 详见 dsh-alignment.md。
整体架构
graph TD
subgraph API["API 层"]
SSE["SSE /api/chat/agent"]
Sessions["Session CRUD"]
Metrics["GET /api/chat/metrics"]
Audit["GET /api/chat/sessions/:id/audit"]
AskUser["问答 /api/chat/questions + /api/chat/answer"]
end
subgraph Runtime["AgentRuntime — 会话级编排"]
RunTurn["run_turn() 主入口"]
SP["SystemPrompt 组装器"]
CtxBuild["Context Builder 上下文构建"]
Engine["ReactEngine 统一循环(engine.rs)"]
Streaming["streaming.rs 流式处理"]
Executor["executor.rs 并行执行"]
Finalize["finalize.rs 会话收尾"]
TokenBudget["token_budget.rs"]
CircuitBreaker["circuit_breaker.rs"]
SessionReg["SessionRuntimeRegistry 会话级缓存"]
EventLog["agent_events 事件日志"]
end
subgraph Tools["工具系统 (tools/)"]
AgentTool["AgentTool trait"]
Registry["ToolRegistry"]
FS["filesystem/ (6 工具)"]
Astro["astro/ (7 工具)"]
AskUserT["ask_user"]
SubAgentT["subagent/delegate_research"]
TeamT["team/ (4 工具)"]
BG["background (2 工具)"]
end
subgraph CrossCutting["横切关注点"]
Hooks["HookRegistry (13 事件)"]
Skills["SkillRegistry (两层加载)"]
Memory["MemoryManager (项目记忆)"]
Permission["PermissionChecker"]
FileCache["FileStateCache (Read 去重)"]
Coordinator["Coordinator Mode (协调者编排)"]
end
subgraph DB["持久化"]
AgentSessions["agent_sessions"]
AgentMessages["agent_messages"]
AgentTasks["agent_tasks"]
AgentAudit["agent_audit_log"]
end
SSE --> RunTurn
RunTurn --> SP
RunTurn --> CtxBuild --> DB
RunTurn --> ReAct
ReAct --> Streaming --> Tools
ReAct --> Executor --> Tools
ReAct --> TokenBudget
ReAct --> CircuitBreaker
ReAct --> Finalize
Hooks -.-> ReAct
Hooks -.-> Tools
Skills -.-> Tools
Memory -.-> SP
Permission -.-> Tools
FileCache -.-> Tools
ReAct 运行循环 (runtime/)
主循环由 AgentRuntime::run_turn() 驱动,分为 4 个阶段:
完整生命周期
sequenceDiagram
participant FE as 前端 SSE
participant RT as AgentRuntime
participant DB as SQLite
participant LLM as LLM API
participant Tools as ToolRegistry
FE->>RT: POST /api/chat/agent { question, session_id? }
Note over RT: Phase 1 — 会话管理
RT->>DB: create_or_resume_session()
alt 新会话
DB-->>RT: session_id = uuid, turn_index = 0
else 恢复会话
DB-->>RT: 验证存在 + 计算 turn_index
end
RT->>RT: 触发 OnSessionStart hook
RT->>RT: 触发 UserPromptSubmit hook (用户输入审计)
RT-->>FE: SSE session { session_id, title }
opt 协调者模式 (coordinator_mode: true)
RT->>RT: run_coordinator_turn() → CoordinatorAgent
Note over RT: Coordinator 委托 Worker → 合成结果
end
Note over RT: Phase 2 — 上下文构建
RT->>RT: build_initial_context()
RT->>RT: ① 组装 SystemPrompt (静态 section + 记忆注入)
RT->>DB: ② 加载历史消息 load_history_for_llm()
RT->>DB: ③ 恢复未完成任务 (agent_tasks)
RT->>RT: ④ 检查压缩/清理上下文
RT->>DB: ⑤ 保存用户消息
RT->>RT: ⑥ 运行 PreToolUse hooks 过滤
Note over RT: Phase 3 — ReAct 循环
loop 每步迭代 (step ≤ max_steps)
RT->>LLM: chat_stream(messages + tool_defs)
LLM-->>RT: ReasoningDelta / TextDelta / ToolCallsComplete
RT-->>FE: SSE thought / text_delta / tool_call
alt 无工具调用 → 最终答案
RT->>DB: 保存 assistant 消息
RT-->>FE: SSE text_delta → usage → done
Note over RT: break 循环
else 有工具调用
RT->>RT: 检查 token 预算 + 熔断器
RT->>RT: validate_and_prepare() — 去重 + 过滤
RT->>Tools: execute_parallel() — 并行执行
Tools-->>RT: (tool_call_id, name, output)
RT-->>FE: SSE tool_result { tool_call_id, name, output }
RT->>DB: 保存 tool 消息 + 审计日志
RT->>RT: 运行 PostToolUse hooks
RT->>RT: 检测压缩需求 (auto_compact)
end
RT->>RT: 检测循环终止条件
end
Note over RT: Phase 4 — 会话收尾
RT->>DB: 更新 turn_count + updated_at
RT->>DB: calculate_and_persist_metrics()
RT->>RT: 运行 OnSessionStop hook
RT-->>FE: SSE done
并行工具执行模型
sequenceDiagram
participant ReAct as ReAct 循环
participant Val as validate_and_prepare
participant Exec as execute_parallel
participant T1 as Tool A
participant T2 as Tool B
participant FE as 前端 SSE
ReAct->>Val: LLM 返回 [tool_call_a, tool_call_b]
Val->>Val: 去重检测 + 权限验证
Val-->>ReAct: prepared_calls[] + has_duplicate 标志
ReAct->>FE: 发送 tool_call SSE (逐一)
ReAct->>Exec: 启动 execute_parallel()
par 并行执行
Exec->>T1: tool_a.execute(args_a)
Exec->>T2: tool_b.execute(args_b)
end
T1-->>Exec: ToolOutput { content, is_error }
Exec-->>FE: SSE tool_result (立即推送)
T2-->>Exec: ToolOutput { content, is_error }
Exec-->>FE: SSE tool_result (立即推送)
Exec-->>ReAct: Vec<(tool_call_id, name, args, output, cancelled)>
ReAct->>ReAct: PostToolUse hooks + 审计日志 + 持久化
- 并发上限:由
max_concurrent_tools环境变量控制,默认不限制 - Sibling Abort:仅
causes_sibling_abort() = true的工具(如download_paper)能在出错时中断兄弟任务 - InterruptBehavior:
Block工具(如ask_user)不可被用户取消;Cancel工具可在取消信号时中断 - 超时控制:每个工具有独立超时,默认 120s(
AGENT_TOOL_TIMEOUT_SECS)
Coordinator Mode(协调者模式, P2)
graph TD
User["用户请求"] --> API["POST /api/chat/agent\n{ coordinator_mode: true }"]
API --> RT["AgentRuntime::run_coordinator_turn()"]
RT --> CA["CoordinatorAgent (仅元工具)"]
CA --> Tool["delegate_task / check_task / task_stop / synthesize"]
Tool --> WP["WorkerPool (Semaphore 并发控制)"]
WP --> W1["Worker 1 (SubAgentRunner)"]
WP --> W2["Worker 2 (SubAgentRunner)"]
WP --> W3["Worker N (SubAgentRunner)"]
W1 --> Synth["synthesize 收集结果"]
W2 --> Synth
W3 --> Synth
Synth --> Answer["最终答案"]
Coordinator 仅拥有 4 个元工具,将实际研究工作委托给拥有完整工具访问权限的 Worker 子代理。Worker 通过 SubAgentRunner + Semaphore 实现并发控制(默认最大 4 并发)。
- 委托 → 检查 → 合成 三步工作流
- 前端通过
coordinator_mode: true字段启用 - 源码:
src/agent/coordinator/{agent,tools,worker,mod}.rs