AstroResearch/.env.example
Asfmq 5db4cc5998 refactor: 全栈架构重构与质量硬化——API 错误统一、工具域重组、安全加固、前端组件化
后端核心变更:
  - API 层: 新增 AppError 枚举统一错误类型,替代散落的 (StatusCode, String)
  - Agent 工具域: 重组为 astro/system/ 和 astro/research/ 两级域,新增 ProcessPaperTool 流水线工具
  - 安全: 新增 SSRF 双层防护 (同步字符串级 + 异步 DNS 解析级),覆盖 IPv4/IPv6 私网段
  - 弱密码检测: 扩展弱密码列表并增加最小长度检查
  - LLM 客户端: 新增 ChatCompleter/Embedder trait,支持依赖注入与批量向量化 embed_batch
  - 批量处理: AssetBatch 从串行改为 Semaphore 并发池 (BATCH_CONCURRENCY=3)
  - 分块器: 重写为三阶段结构化管线 (章节解析→短节合并→带标题路径子块)
  - RAG: embedding 计算移出事务,RetrievalResult 新增 headings/section_index 字段
  - 检索: ADS/arXiv 并行检索 (tokio::join!),去重改用 HashSet,本地库回填批量 IN 查询
  - 天体查询: Sesame API 升级到 v4,新增视差误差/自行/视向速度/多波段测光字段
  - 迁移: 14 个增量文件合并为单一 init.sql,支持 sqlx::migrate! 内存库集成测试
  - 测试: circuit_breaker/hooks/task_board/session/memory/streaming_executor 新增修正 15+ 测试

  前端架构重构:
  - 目录重组: features/ → pages/ + components/ + hooks/ 三层分离
  - App.tsx 从 1181 行压缩至 ~174 行 (逻辑抽入 9 个自定义 Hook)
  - Agent 面板拆分为 AgentSessionSidebar/AgentMessageList/AgentInputArea 子组件
  - 新增 GlobalDialog/PaperDetailModal/UncachedPaperModal 通用对话框组件
  - 工具函数抽取: celestial.ts (天体坐标格式), paper.tsx (文献信息渲染)
2026-06-25 23:45:37 +08:00

160 lines
9.7 KiB
Plaintext
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.

# =============================================================================
# AstroResearch 环境变量模板
# 复制此文件为 .env 并填入你的配置值
# =============================================================================
# ─────────────────────────────────────────────────────────────────────────────
# 1. 核心 API 服务
# ─────────────────────────────────────────────────────────────────────────────
# NASA ADS API Token从 ui.adsabs.harvard.edu 申请)
ADS_API_KEY=your_ads_api_key_here
# 大语言模型配置(兼容 OpenAI 接口协议)
LLM_API_KEY=your_llm_api_key_here
LLM_API_BASE=https://api.openai.com/v1
# 可选模型示例deepseek-chat, qwen-flash, gpt-4o-mini
LLM_MODEL=gpt-4o-mini
# 备用模型(连续 3 次 529 过载后自动切换,优先于 LLM_FALLBACK_CHAIN可选
# LLM_FALLBACK_MODEL=gpt-4o-mini
# 备用模型链(逗号分隔,按顺序轮换尝试,可选)
# LLM_FALLBACK_CHAIN=gpt-4o-mini,deepseek-chat
# 中型大语言模型配置用于文献翻译、RAG默认级联回退至核心 LLM 配置)
# LLM_MEDIUM_API_KEY=your_llm_medium_api_key_here
# LLM_MEDIUM_API_BASE=https://api.openai.com/v1
# LLM_MEDIUM_MODEL=gpt-4o-mini
# 快速大语言模型配置(用于记忆提取等后台辅助任务,默认级联回退至中型 LLM 配置)
# LLM_FAST_API_KEY=your_llm_fast_api_key_here
# LLM_FAST_API_BASE=https://api.openai.com/v1
# LLM_FAST_MODEL=gpt-3.5-turbo
# ── 视觉模型(可选,配置后启用图片分析能力)──
# 专用视觉模型名称。主 Agent 可为纯文本模型,图片分析通过 analyze_image 工具
# 委托给此模型。用户上传图片时也会先用此模型预处理再交给 Agent。
# LLM_VISION_MODEL=gpt-4o
# LLM_VISION_API_KEY=your_vision_api_key_here空时回退到 LLM_API_KEY
# LLM_VISION_API_BASE=https://api.openai.com/v1空时回退到 LLM_API_BASE
# 向量嵌入模型配置(未设置时默认回退到 LLM 的 API Key 和 Base
# EMBEDDING_API_KEY=your_embedding_api_key_here
# EMBEDDING_API_BASE=https://api.openai.com/v1
# EMBEDDING_MODEL=text-embedding-3-small
# 向量维度(需与所选模型输出维度一致,默认 1536
# EMBEDDING_DIM=1536
# ─────────────────────────────────────────────────────────────────────────────
# Chunker 结构化切片参数(影响向量化粒度)
# ─────────────────────────────────────────────────────────────────────────────
# 子章节最大字符数(超出则递归切分),默认 2000
# CHUNKER_MAX_CHILD_CHARS=2000
# 短章节合并阈值(字符数),默认 200
# CHUNKER_SHORT_THRESHOLD=200
# 上下文重叠字符数,默认 100
# CHUNKER_OVERLAP_CHARS=100
# ─────────────────────────────────────────────────────────────────────────────
# 2. 七牛云对象存储PDF 解析后的配图托管)
# ─────────────────────────────────────────────────────────────────────────────
QINIU_AK=your_qiniu_access_key_here
QINIU_SK=your_qiniu_secret_key_here
QINIU_BUCKET=your_bucket_name
QINIU_DOMAIN=http://your_cdn_domain.com
# ─────────────────────────────────────────────────────────────────────────────
# 3. 文档解析服务
# ─────────────────────────────────────────────────────────────────────────────
# MinerU PDF 解析远程 API不使用 HTML 解析时可选)
# MINERU_API_URL=https://mineru.net/api/v4/extract/task
# MINERU_API_KEY=your_mineru_api_key_here
# ─────────────────────────────────────────────────────────────────────────────
# 4. 本地路径与端口
# ─────────────────────────────────────────────────────────────────────────────
# SQLite 数据库路径
DATABASE_URL=sqlite://library/astro_research.db
# 本地文献馆藏根目录
LIBRARY_DIR=./library
# Agent Skills 目录Markdown 知识模块)
SKILLS_DIR=./skills
# 后端服务监听端口
PORT=8000
# 认证密码
ADMIN_PASSWORD=fmq
# ─────────────────────────────────────────────────────────────────────────────
# 5. 日志配置
# ─────────────────────────────────────────────────────────────────────────────
# 日志级别trace / debug / info / warn / error可指定模块级别如 info,astroresearch=debug
LOG_LEVEL=info,astroresearch=debug
# 日志格式pretty彩色或 json结构化
LOG_FORMAT=pretty
# 日志输出目标stdout控制台、file文件逗号分隔可同时启用
LOG_OUTPUTS=stdout,file
# 日志文件目录(仅 LOG_OUTPUTS 含 file 时生效)
LOG_DIR=./logs
# ─────────────────────────────────────────────────────────────────────────────
# 6. Agent 运行时参数
# ─────────────────────────────────────────────────────────────────────────────
# Token 软限制:统一压缩触发阈值(默认 80000
# AGENT_TOKEN_SOFT_LIMIT=80000
# Token 硬限制:触发强制压缩或终止(默认 100000
# AGENT_TOKEN_HARD_LIMIT=100000
# ── 权限系统 ──
# Agent 工具权限规则(逗号分隔,支持内容级匹配 "ToolName(pattern)"
# 规则优先级: Deny > Ask > Allow先匹配先生效
#
# 格式: "tool_name" → 工具级规则
# "tool_name(content_pattern)" → 内容级规则
# 示例: "run_bash(rm *)" 匹配以 rm 开头的 bash 命令
# "read_file(*.env)" 匹配 .env 后缀的文件读取
# "file_write(/etc/*)" 匹配 /etc/ 下的文件写入
#
# 权限模式:
# default — 标准:逐项按规则决定(默认)
# accept_edits — 工作目录内的 file_write/file_edit 自动允许
# bypass — 跳过所有 Ask 检查Deny 规则仍生效)
# dont_ask — 将所有 Ask 转为 Deny
# AGENT_PERMISSION_MODE=default
#
# 拒绝规则(逗号分隔,不可覆盖)
# AGENT_PERMISSIONS_DENY=run_bash(rm *),run_bash(sudo *)
# 允许规则(逗号分隔,显式允许)
# AGENT_PERMISSIONS_ALLOW=read_file,grep_files,glob_files,search_papers
# 询问规则(逗号分隔,需用户确认)
# AGENT_PERMISSIONS_ASK=run_bash,file_write,file_edit,download_paper
# 附加文件访问目录(逗号分隔,扩展 Agent 工作沙箱范围,默认空=仅工作目录)
# AGENT_ADDITIONAL_DIRS=/data,/tmp/astro
# 子代理工具白名单(逗号分隔工具名,空=继承父代理全部工具,可选)
# AGENT_SUBAGENT_ALLOWED_TOOLS=read_file,grep_files,search_papers
# ─────────────────────────────────────────────────────────────────────────────
# 7. 自动记忆提取(实验性功能,同时控制压缩记忆桥接 P3
# ─────────────────────────────────────────────────────────────────────────────
# 是否启用自动记忆提取(默认 false开启后会话结束 + 压缩时均触发提取)
# EXTRACT_MEMORY_ENABLED=false
# 记忆提取节流间隔:每 N 个 turn 触发一次(默认 3
# EXTRACT_MEMORY_THROTTLE_TURNS=3
# 记忆提取子代理最大步数(默认 3
# EXTRACT_MEMORY_MAX_STEPS=3
# ─────────────────────────────────────────────────────────────────────────────
# 8. 其他
# ─────────────────────────────────────────────────────────────────────────────
# Obscura 浏览器 Profile 轮换(绕过 Cloudflare/WAF默认 true
# OBSCURA_ROTATE_PROFILE=true