feat: 科研分析层全栈落地——光谱/时域/运动学分析工具链 + JWST/X 射线数据源 + 定时文献同步

数据分析层(新增 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 科研功能路线图及实现状态
This commit is contained in:
fmq
2026-09-07 21:50:32 +08:00
parent eaf85707b5
commit d6b064a490
104 changed files with 12101 additions and 3301 deletions
+132
View File
@@ -0,0 +1,132 @@
# Agent 架构硬化 — deepseek-harness 对齐改造
本文档记录 2026-08 的 agent 系统架构改造:以 deepseek-harnessDeepSeek
开源的 agent harness,见 `libs/deepseek-harness`)验证过的架构不变量为
参照,对本项目 agent 子系统的四项核心改造与若干升级。所有改动以
"取其分层思想、不取其运行时插件树"为原则——本项目是垂直应用,
Rust 的 trait + 注册表天然等价于 dsh 的 capability seam。
## 1. 统一 ReAct 引擎(消除四份手写循环)
**不变量**:仓库中有且仅有一个具体的 ReAct 循环实现(对应 dsh 的
"agent-loop 是 harness 中唯一包含具体循环逻辑的包")。
- `src/agent/engine.rs``ReactEngine` 承载完整循环(取消检查 → 压缩 →
预算/nag → 步数上限 → 后台通知 → LLM 调用含恢复阶梯 → 工具执行 → 循环)。
- 行为差异通过组合字段注入而非分叉实现:
| 关注点 | lead(主代理) | subagent | teammate |
|---|---|---|---|
| SSE 事件 | `EventTap::channel` | `EventTap::prefixed(tx, "sub")` | `EventTap::none()` |
| 持久化 | `DbMessageSink`agent_name=lead | `DbMessageSink`agent_name=sub_xxx | None |
| AskUser 权限 | `AskPolicy::Interactive`120s 挂起) | `AskPolicy::AutoDeny` | `AskPolicy::AutoDeny` |
| 取消 | `CancelSource::Session`DashMap | 不可取消 | `CancelSource::Flag` |
| 恢复阶梯/熔断/重复检测 | 共享(runtime 级 Arc) | 引擎局部实例 | 引擎局部实例 |
- 队友因此获得了与主代理对等的能力(错误恢复、压缩熔断、多槽重复检测)。
- `streaming_executor.rs`936 行零调用死代码)已删除。
## 2. 会话级运行时生命周期
**不变量**:runtime 状态属于会话而非请求。
`src/agent/runtime/session_registry.rs``SessionRuntimeRegistry`
(挂在 `AppState.agent_runtimes`):
- 同一会话的请求复用同一 `AgentRuntime`——后台任务队列、压缩折叠日志、
文件缓存、拒绝追踪器、压缩熔断器、prompt cache 不再随 HTTP 请求销毁
(历史上"后台任务结果跨请求丢失、每 turn 重复压缩"两个 bug 的根因)。
- 每会话一个 turn 互斥锁:并发请求 fail-loud 返回 409。
- 空闲 2 小时的条目由后台清扫回收;会话删除时显式移除。
- 会话 ID 在请求入口预分配(`create_or_resume_session_preallocated`),
新会话的首个请求也能写入取消标记(修复 SSE 超时只 abort 不落标记)。
- 模式回放:runtime 首次创建时从 DB 读取会话模式,后续请求不再因传参
不同而静默切换行为。
- 压缩递归守卫从进程级 `AtomicBool` 改为按 session_id 的集合守卫
`try_begin_compaction`/`end_compaction`),并发会话压缩互不干扰。
## 3. 会话事件日志(事件溯源的生命周期侧面)
**不变量**:模型可见 ⟺ 已日志化;turn/compaction 以日志化锁开闭。
新表 `agent_events`migration 20260819000001+
`src/agent/runtime/session_events.rs`
- `turn_start`/`turn_end`(含结构化终止原因 `reason_label`)、
`compaction_start`/`compaction_end` 构成日志化锁。
- 崩溃恢复不截断:`reconcile_interrupted` 检测开口的 start 事件并合成
`interrupted` 关闭(对应 dsh "不伪造完成、但补写中断事实"的策略)。
- `context_snapshot`:turn 内发生过压缩时,turn 结束保存折叠后上下文 +
消息高水位 `base_message_id`;下一 turn 回放"快照 + id > base 的增量"
`context.rs::load_folded_history`),不再从原始消息重建后重新压缩。
rewind/retry/branch 后快照作废(`remove_context_snapshots`)。
## 4. 工具契约集中化(消除散弹式修改)
**不变量**:工具的全部行为元数据声明在工具自身(AgentTool),消费方查询
trait 而非维护平行的名字名单。
`AgentTool` 新增声明方法:
- `untrusted_output()` — 输出来自外部源需 `<untrusted_tool_result>` 包裹
(原 `untrusted.rs` 按名列表);注册表查询不到工具时回退名字启发式。
- `hardline_check(args)` — 参数级不可绕过拒绝(原 executor 按名路由)。
- `causes_file_changes()` — 执行前触发 checkpoint 快照(原
`CHECKPOINT_TRIGGER_TOOLS` 名单)。
- `loop_signals() -> ToolSignals` — 循环行为信号(todo nag 重置/todos
持久化/手动压缩请求),替代主循环对 `todo_write`/`compress_context`
的按名特判。
- 输出契约:`ToolOutput.value`canonical JSON,机器消费:重放/审计/剪枝)
+ `content`(模型侧 render 投影),value 随消息 metadata 持久化。
样例:`search_papers``todo_write`
- 注册表测试从硬编码数量断言(`assert_eq!(defs.len(), 35)`)改为
inventory 不变量断言(名字唯一/元数据完整/信号与身份一致),
新增工具不再需要改测试。
## 5. 权限单调性(deny > ask > allow,只收紧不放松)
**不变量**:多源决策合并唯一入口 `permission::tighten(base, candidate)`
- Deny 粘滞——任何层不能放行另一层已 Deny 的调用;
- Ask 不可被放松为 Allow,可升级为 Deny;
- executor 的 hook 请求、工具级声明、会话级规则全部经 `tighten` 合并;
- 无人值守上下文(子代理/队友)的 AskUser fail-closed 自动拒绝
`AskPolicy::AutoDeny` + `engine::auto_deny_ask`)。
历史上与此语义重复且从未接线的 `resolve_permission_precedence` 已删除。
## 6. 上下文管理升级
- **KV-cache 纪律**system prompt 只包含字节稳定 section;技能清单/
项目记忆以 durable 动态上下文快照(user 消息)追加在历史尾部,哈希
未变不重注入(`context.rs::build_initial_context` +
`AgentRuntime::build_dynamic_context`)。
- **记忆智能选择接线**:记忆条目 > 8 时走 `select_relevant_memories`
(LLM 结构化选择 + 指数时间衰减,此前为零调用代码)。
- **确定性剪枝**`micro_compact` 对长工具结果保留头/尾预览
`prune_tool_result`),短结果仍为纯占位符。
- **Spill 检索指引**:溢出 stub 携带工具名 + 明确取回路径(read_file +
max_lines 分段)。
- **Token 估算统一**:全循环使用 `compact::estimate_message_tokens`
CJK 加权),消除主循环 `len/3` 与 compact 两套口径。
## 7. 其他接线与修复
- **团队协作接线**`spawn_teammate` 等 4 个工具经
`ToolRegistry::new_with_team` 注册进会话 runtimeTeamManager 按
session_key 初始化邮箱目录);队友注册表真正排除 subagent/spawn_teammate
(原注释声称排除但未过滤)。
- **Continuable 子代理**`subagent` 工具新增 `agent_name` + `followup`
参数——命名子代理历史持久化,followup 回放全部历史续话(dsh
Activation 模型的冷恢复路径)。
- **IdlePoller 接线**`AGENT_AUTONOMOUS_ENABLED=true` 时启动自治轮询,
经会话注册表获取 runtime(模式从 DB 回放)。
- **重复检测多槽**`DuplicateDetector` 连续通道 + 滑动窗口双通道,
可检测 A/B 交替死循环(原单槽实现检测不到)。
## 不采用的设计(与理由)
- Cordis 运行时插件树 / bundle/patch/profile 配置组合层:服务于通用
harness 的第三方插件生态,本项目是单二进制垂直应用。
- Typert 类型图 RPC、host/client 双聚合、Python SDK:无对应需求。
- 适配器休眠挂载、profiles 热重载:模型链固定。
+1
View File
@@ -134,3 +134,4 @@ Agent 系统的所有可配置参数,按子系统分类。
| `src/agent/compact.rs` (extract_memories_from_compaction) | `EXTRACT_MEMORY_ENABLED` (P3 压缩记忆桥接) |
| `src/agent/memory/extraction.rs` (ExtractionConfig) | `EXTRACT_MEMORY_ENABLED`, `EXTRACT_MEMORY_THROTTLE_TURNS`, `EXTRACT_MEMORY_MAX_STEPS` |
| `src/services/download.rs` | `OBSCURA_ALLOW_PRIVATE_NETWORK`(程序自动设置) |
| `src/main.rs` (IdlePoller 启动门控) | `AGENT_AUTONOMOUS_ENABLED`(默认 false;true/1 时启用自治轮询,见 dsh-alignment.md §7 |
+10 -2
View File
@@ -2,6 +2,12 @@
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](dsh-alignment.md)。
### 整体架构
```mermaid
@@ -14,16 +20,18 @@ graph TD
AskUser["问答 /api/chat/questions + /api/chat/answer"]
end
subgraph Runtime["AgentRuntime — ReAct 引擎"]
subgraph Runtime["AgentRuntime — 会话级编排"]
RunTurn["run_turn() 主入口"]
SP["SystemPrompt 组装器"]
CtxBuild["Context Builder 上下文构建"]
ReAct["ReAct 主循环"]
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/)"]
+438
View File
@@ -0,0 +1,438 @@
# AstroResearch 科研功能扩展路线图
## 项目现状
### 已实现的核心能力
**数据源(9 个)**
| 数据源 | 产品类型 | 状态 |
| ---------- | ------------------------------------------------ | ---- |
| LAMOST | 光谱(LRS/MRS | 完整 |
| Gaia | XP 光谱(BP/RP)、RVS、历元测光 | 完整 |
| SDSS | 光学光谱(spec)、APOGEE 近红外(apstar/aspcap | 完整 |
| DESI | 暗能量光谱仪(coadd) | 完整 |
| 2MASS | 近红外测光(J/H/K) | 完整 |
| AllWISE | 中红外测光(W1-W4 | 完整 |
| Pan-STARRS | 光学测光(g/r/i/z/y | 完整 |
| ZTF | 时域光变曲线(zg/zr/zi | 完整 |
| TESS | 空间时域光变曲线(2min/FFI) | 完整 |
**Agent 工具集**
- `search_papers` — ADS/arXiv 文献搜索
- `process_paper` — 下载、解析、向量化、翻译
- `get_paper_content` / `get_paper_outline` — 阅读解析后文献
- `rag_search` — 稠密向量 + BM25 混合检索
- `query_target` — CDS Sesame 天体名称解析
- `find_observation` — 跨源观测数据统一下载
- `catalog_operation` — VizieR TAP 星表查询(ADQL + 锥形检索)
- `save_note` — 高亮/笔记存储
- `get_paper_metadata` — 完整文献元数据
- `search_local_library` — 本地文献库搜索
- `get_citation_network` — 引文网络图
- `analyze_image` — 视觉模型图像分析
- 文件操作、bash、记忆、技能、子 Agent、团队协作等
**已有技能**
- `methodology` — 系统性文献综述方法论
- `plotting` — 科研绘图规范(占位,未实现)
- `presentation` — 演示文稿技能
---
## 一、数据获取层 — 补全缺失的数据源
### 1.1 JWST/MIRI 数据获取
**目标**:通过 MAST API 获取詹姆斯·韦伯空间望远镜 NIRSpec/MIRI 光谱数据。
**需求**
- 新增 `src/clients/mast/jwst.rs`,封装 MAST JWST 查询 API
- 实现 `JwstSpectrumFetcher`,注册到 `ObservationRegistry`
- Source 枚举新增 `Jwst` 变体
- 支持 NIRSpec IFU/MOS、MIRI MRS/LRS 光谱产品
- FITS 解析支持 JWST 特有的多扩展 BinTable 格式
**价值**:JWST 是当前最热门的望远镜,大量前沿论文依赖 JWST 数据。
**预估工作量**:中等(MAST API 文档完善,但 FITS 结构复杂)。
### 1.2 X 射线数据(XMM-Newton / Chandra
**目标**:通过 HEASARC TAP 获取高能天体物理观测数据。
**需求**
- 新增 `src/clients/heasarc/`,封装 HEASARC TAP 查询
- 实现 `XmmSpectrumFetcher``ChandraSpectrumFetcher`
- Source 枚举新增 `Xmm``Chandra` 变体
- 支持 X 射线光谱(PHA)和光变曲线产品
**价值**:覆盖高能波段,满足活动星系核、X 射线双星、星系团等研究需求。
**预估工作量**:中等(HEASARC TAP 接口标准,但数据格式多样)。
### 1.3 VLBI/Gaia 天体测量数据
**目标**:通过 VizieR 获取高精度自行、视差和天体测量数据。
**需求**
- 扩展现有 `CatalogOperationTool`,预置 Gaia DR3 天体测量常用查询模板
- 新增 `GaiaAstrometryFetcher`,专门处理高精度自行/视差数据
- 支持按自行/视差筛选的 cone search
**价值**:精密天体测量是银河考古学和恒星动力学的基础。
**预估工作量**:小(VizieR 已支持,主要是模板和预置查询)。
### 1.4 光谱图像 Cutout
**目标**:实现 SDSS/Gaia/DSS 图像 cutout 下载 + 前端渲染。
**需求**
- 实现 `ImageCutoutFetcher`,支持 SDSS SkyServer cutout API、DSS (STScI)、Gaia 推荐图
- 完成 `ImagePreview` 解析器(preview.rs 中已有占位)
- 前端 `ObservationPreviewRenderer` 新增图像渲染 case
- 支持自定义 cutout 大小和坐标
**价值**:观测规划和文献中的发现图(Finding Chart)必备。
**预估工作量**:中等(API 简单,但前端图像渲染需要新组件)。
---
## 二、数据分析层 — 光谱/光变科学分析
### 2.1 光谱参数自动提取
**目标**:从 LAMOST/SDSS FITS 文件中自动读取恒星大气参数(Teff, logg, [Fe/H], 径向速度等),结构化入库。
**需求**
- 新增 `src/services/spectrum/parameters.rs`,实现 FITS Header/BinTable 参数提取
- LAMOST:从 `params.fits``spec.fits` header 读取 `TEFF`, `LOGG`, `FEH`, `RV`
- SDSS/BOSS:从 `line.dat``aspcapStar` 读取 ASPCAP 参数
- SDSS/APOGEE:从 `aspcapStar` FITS 读取完整化学丰度
- DESEI:从 `coadd` FITS header 读取红移和分类
- 结构化数据入库(新建 `spectrum_parameters` 表或扩展 `observation_cache`
- Agent 新增 `get_spectrum_parameters` 工具,查询已提取的参数
**价值**:每篇恒星物理论文都需要这类参数,手动提取极其低效。
**预估工作量**:中等(FITS 解析已有基础,需逐源适配 header 约定)。
### 2.2 光谱线识别与等值宽度测量
**目标**:标注 Balmer/H&K/金属线位置,自动计算等值宽度(EW)和半高全宽(FWHM)。
**需求**
- 新增 `src/services/spectrum/lines.rs`,内置常见谱线波长表(真空/空气波长)
- 实现谱线搜索算法:在给定波长窗口内找局部极值(发射线找极大,吸收线找极小)
- 实现数值积分 EW 计算(梯形法)
- 支持用户自定义谱线列表
- Agent 新增 `measure_spectral_lines` 工具,输入光谱路径 + 谱线名称列表,输出 EW/FWHM
- 前端光谱图支持谱线标注叠加层
**价值**:光谱分析的核心操作,天文学生和研究者日常高频使用。
**预估工作量**:中等偏高(谱线表容易,但稳健的峰值搜索和 EW 计算需要仔细实现)。
### 2.3 交叉相关测速
**目标**:通过模板匹配法测量径向速度(RV),支持多波段光谱。
**需求**
- 新增 `src/services/spectrum/cross_correlate.rs`
- 内置或下载标准模板光谱(如 Pickles Atlas、PHOENIX 模型)
- 实现 FFT 加速的交叉相关函数计算
- 从互相关峰值位置提取 RV + 不确定度估计
- 支持用户上传自定义模板
- Agent 新增 `measure_radial_velocity` 工具
**价值**:双星、视向速度变星、银河系动力学研究的核心工具。
**预估工作量**:中等(算法成熟,但模板管理和多波段适配需要设计)。
### 2.4 光变周期搜索
**目标**:基于 Lomb-Scargle 周期图和 BLSBox Least Squares)算法,自动搜索光变周期。
**需求**
- 新增 `src/services/timeseries/periodicity.rs`
- 实现 Lomb-Scargle 周期图(非均匀采样友好)
- 实现 BLS 算法(凌星检测专用)
- 自动报告最优周期、FAP(误报概率)、次优周期
- 支持 ZTF、TESS、Gaia 历元测光数据
- Agent 新增 `find_period` 工具,输入光变曲线文件,输出周期 + 周期图
- 前端支持折叠光变曲线(Phase-folded light curve)展示
**价值**:ZTF/TESS 数据的刚需,变星和系外行星研究的核心分析。
**预估工作量**:中等(Lomb-Scargle 算法有 Rust 实现可参考,BLS 较复杂)。
### 2.5 光变分类与特征提取
**目标**:自动识别变星类型,提取振幅、形态参数等特征。
**需求**
- 新增 `src/services/timeseries/classification.rs`
- 基于周期 + 振幅 + 偏度 + 峰度等统计特征的简单分类器
- 支持 RR Lyrae、Cepheid、食双星、脉动变星、AGN 等主要类型
- 可选:集成轻量 ML 模型(如 Random Forest,通过 ONNX Runtime
- Agent 新增 `classify_variable_star` 工具
**价值**:时域巡天(ZTF/TESS)数据量巨大,自动化分类是必要环节。
**预估工作量**:高(分类器训练和特征工程需要较多工作)。
### 2.6 SED 拟合与建模
**目标**:多波段测光数据拟合黑体或模板光谱能量分布,求解天体物理参数。
**需求**
- 新增 `src/services/analysis/sed.rs`
- 自动拉取目标所有可用波段测光(2MASS + WISE + PS1 + Gaia
- 实现黑体辐射模型拟合(最小二乘/MCMC)
- 可选模板 SED 拟合(BaSeL/PHOENIX 模板库)
- 输出 T_eff、光度、消光 A_V 及其不确定度
- 前端 SED 图展示(观测点 + 拟合曲线 + 残差)
- Agent 新增 `fit_sed` 工具
**价值**:天体物理参数估计的基础方法,适用于恒星、AGN、超新星等多种天体。
**预估工作量**:中等偏高(黑体拟合简单,但模板拟合和 MCMC 需要较多工作)。
### 2.7 自行/视差运动学分析
**目标**:基于 Gaia DR3 高精度自行 + 视差,计算银河系三维空间速度(UVW),识别移动星群。
**需求**
- 新增 `src/services/analysis/kinematics.rs`
- 实现坐标变换:(RA, Dec, parallax, pmRA, pmDec, RV) → (X, Y, Z, U, V, W)
- 实现移动星群成员概率计算(基于 Banyan Σ 算法简化版)
- 支持批量样本处理
- Agent 新增 `analyze_kinematics` 工具
**价值**:银河考古学(Galactic Archaeology)的核心分析方法。
**预估工作量**:中等(坐标变换公式成熟,Banyan Σ 需要简化实现)。
### 2.8 化学丰度模式分析
**目标**:多元素丰度比([α/Fe] vs [Fe/H])自动提取与可视化,区分厚盘/薄盘/晕星。
**需求**
- 扩展光谱参数提取(2.1),从 APOGEE ASPCAP 数据读取完整化学丰度
- 新增 `src/services/analysis/chemistry.rs`
- 实现 [α/Fe] 计算(α 元素:O, Mg, Si, S, Ca, Ti 的加权平均)
- 自动绘制 [α/Fe] vs [Fe/H] 图,并按运动学成分着色
- Agent 新增 `analyze_abundance_pattern` 工具
**价值**:银河考古学的核心工具,用于区分银河系不同星族。
**预估工作量**:中等(数据提取为主,分析逻辑相对直接)。
---
## 三、可视化与输出层
### 3.1 光谱交互式标注
**目标**:前端光谱图支持点击标注谱线名称,自动显示等值宽度。
**需求**
- 扩展 `SpectrumPlot.tsx`,新增谱线标注叠加层
- 内置常见谱线波长表(Balmer 系列、H&K、NaD、Mg b、Fe 等)
- 支持用户点击光谱图任意位置添加自定义标注
- 标注信息(谱线名、波长、EW)以 tooltip 形式展示
- 后端 `preview.rs` 返回时可选附带谱线标注数据
**价值**:显著提升光谱阅读和教学体验。
**预估工作量**:中等(前端组件开发为主)。
### 3.2 赫罗图(HR Diagram
**目标**:基于 Gaia 数据构建颜色-星等图(CMD),支持叠加自定义样本。
**需求**
- 新增 `src/api/hertzsprung_russell.rs` 或扩展现有 Gaia 查询
- 自动查询给定天区/样本的 Gaia G-mag、BP-RP color、parallax
- 计算绝对星等 M_G = G + 5 + 5*log10(parallax/1000)
- 返回数据供前端渲染 HR 图
- 前端新增 HR Diagram 组件(scatter plot,支持密度着色)
- 支持叠加用户自定义样本(不同颜色/标记)
**价值**:恒星物理的基础可视化,几乎所有恒星相关论文都包含 HR 图。
**预估工作量**:中等(数据查询简单,前端绘图需要新组件)。
### 3.3 发现图(Finding Chart
**目标**:生成目标天区的 DSS/Pan-STARRS 图像 cutout + 标注目标位置。
**需求**
- 调用 STScI DSS cutout API 或 Pan-STARRS cutout API
- 返回 cutout 图像 + 目标中心标注
- 支持自定义 cutout 大小(arcmin)和缩放
- Agent 工具 `find_observation` 可选返回 finding chart
- 前端在观测数据页面展示 finding chart
**价值**:观测准备的必备环节,望远镜观测提案中需要附带 finding chart。
**预估工作量**:小(API 简单,主要是前端展示)。
### 3.4 多波段 SED 图
**目标**:自动拉取所有可用波段测光数据,绘制 SED 图并拟合模型。
**需求**
- 扩展 2.6 节 SED 拟合功能,新增前端 SED 图组件
- 自动标记各波段(2MASS J/H/K、WISE W1-W4、Gaia G/BP/RP 等)
- 支持对数坐标轴
- 拟合曲线叠加显示,残差面板
**价值**:参数化分析的标准可视化。
**预估工作量**:中等(依赖 2.6 节后端实现)。
### 3.5 SkyMap 天球投影
**目标**:在全天球图上可视化样本分布,支持按参数着色。
**需求**
- 新增 `SkyMapPanel` 前端组件
- 使用 Mollweide 或 Aitoff 投影
- 支持按天体类型、金属丰度、自行等参数着色
- 叠加银河平面、银道坐标网格
- 支持交互式缩放和选区
**价值**:巡天论文的标准可视化,用于展示样本的天球分布。
**预估工作量**:中等(前端投影计算 + WebGL 渲染)。
---
## 四、工作流增强
### 4.1 批量样本处理
**目标**:给定一组天体名称/坐标,批量执行"查询 → 下载 → 分析 → 出图 → 保存报告"。
**需求**
- 新增 `src/agent/tools/astro/research/batch_process.rs`,实现 `BatchProcessTool`
- 支持输入格式:天体名称列表、坐标列表、VizieR 查询结果
- 批量流程:query_target → find_observation → 参数提取 → 出图
- 并发控制(避免触发数据源速率限制)
- 进度报告(SSE 事件推送)
- 输出汇总报告(Markdown 表格 + 图表)
**价值**:巡天论文的标准工作流,手动逐个处理效率极低。
**预估工作量**:中等偏高(并发控制和错误处理需要仔细设计)。
### 4.2 定时文献监控
**目标**Cron 定时检查 ADS/arXiv 新文献,匹配用户关注的关键词/作者/天体。
**需求**
- 新增 `src/agent/tools/astro/research/literature_monitor.rs`
- 用户定义监控规则(关键词、作者、天体名称、arXiv 分类)
- 使用现有 `loop` 技能定时触发
- 新文献匹配时通过 SSE 推送通知
- 支持自动下载摘要 + 生成简报
**价值**:帮助研究者跟踪前沿,不遗漏重要文献。
**预估工作量**:中等(定时任务框架已有,主要是规则匹配和通知)。
### 4.3 观测提案辅助
**目标**:根据目标天区自动计算可见性、月相限制、曝光时间估算。
**需求**
- 新增 `src/services/analysis/observability.rs`
- 计算目标在给定台站的升起/落下时间和最佳观测窗口
- 月相和银河背景亮度估算
- 基于目标亮度和望远镜参数的曝光时间估算
- Agent 新增 `plan_observation` 工具
- 输出观测提案所需的标准化信息
**价值**:望远镜申请的时间评估和观测规划必备。
**预估工作量**:中等(天文计算公式成熟,但台站参数和大气消光模型需要数据)。
---
## 五、实施优先级建议
| 优先级 | 功能 | 理由 | 状态 |
| ------ | --------------------------- | -------------------------------------- | ---- |
| P0 | 光谱参数自动提取(2.1) | 已下载数据的直接利用,所有恒星论文都用 | ✅ 已实现 |
| P0 | 光变周期搜索(2.4 | ZTF/TESS 数据的刚需,时域天文学核心 | ✅ 已实现 |
| P1 | 光谱线识别与 EW 测量(2.2) | 光谱分析的日常操作 | ✅ 已实现 |
| P1 | 交叉相关测速(2.3) | 双星/视向速度研究核心工具 | ✅ 已实现 |
| P1 | 绘图 skill 填充(现有占位) | 提升 Agent 绘图能力的基础 | ✅ 已实现 |
| P2 | SED 拟合(2.6 | 多波段分析的标准方法 | ✅ 已实现 |
| P2 | 赫罗图(3.2 | 恒星物理基础可视化 | ✅ 已实现 |
| P2 | 批量样本处理(4.1) | 巡天论文工作流提效 | ✅ 已实现 |
| P3 | JWST 数据获取(1.1) | 前沿望远镜,但使用门槛较高 | ✅ 已实现 |
| P3 | 光变分类(2.5) | 时域数据分析,但分类器训练复杂 | ✅ 已实现 |
| P3 | SkyMap 天球投影(3.5) | 巡天论文可视化,但优先级不如核心分析 | ✅ 已实现 |
---
## 六、已实现功能详情
### 已完成的数据分析层
| 功能 | Agent 工具 | 后端模块 | 状态 |
|------|-----------|----------|------|
| 光谱参数提取 | `get_spectrum_parameters` | `services/spectrum/parameters.rs` | ✅ |
| 谱线识别与EW测量 | `measure_spectral_lines` | `services/spectrum/lines.rs` | ✅ |
| 交叉相关测速 | `measure_radial_velocity` | `services/spectrum/cross_correlate.rs` | ✅ |
| 周期搜索 | `find_period` | `services/timeseries/periodicity.rs` | ✅ |
| 变星分类 | `classify_variable_star` | `services/timeseries/classification.rs` | ✅ |
| SED拟合 | `fit_sed` | `services/analysis/sed.rs` | ✅ |
| 运动学分析 | `analyze_kinematics` | `services/analysis/kinematics.rs` | ✅ |
| 化学丰度分析 | `analyze_abundance_pattern` | `services/analysis/chemistry.rs` | ✅ |
| 观测提案辅助 | `plan_observation` | `services/analysis/observability.rs` | ✅ |
| 批量样本处理 | `batch_process` | `agent/tools/astro/research/batch_process.rs` | ✅ |
| 文献监控 | `literature_monitor` | `agent/tools/astro/research/literature_monitor.rs` | ✅ |
### 已完成的数据获取层
| 功能 | 模块 | 说明 | 状态 |
|------|------|------|------|
| JWST 数据获取 | `clients/mast/jwst.rs` + `services/observation/jwst.rs` | MAST JWST API + SpectrumFetcher | ✅ |
| X射线数据 | `clients/heasarc/` + `services/observation/xray.rs` | HEASARC TAP + XMM/Chandra fetcher | ✅ |
| 光谱图像Cutout | `services/observation/cutout.rs` | SDSS/DSS/Pan-STARRS cutout API + CutoutFetcher | ✅ |
| 赫罗图 | `api/hr_diagram.rs` | Gaia CMD 查询 API | ✅ |
| 绘图skill | `skills/plotting/SKILL.md` | Python matplotlib 科研绘图模板(8种图表) | ✅ |
### 已完成的工作流增强
| 功能 | 模块 | 说明 | 状态 |
|------|------|------|------|
| 批量样本处理 | `agent/tools/astro/research/batch_process.rs` | 查询→下载→分析→报告 | ✅ |
| 文献监控 | `agent/tools/astro/research/literature_monitor.rs` | ADS/arXiv 最新文献匹配 | ✅ |