新增文件:
src/config/settings.py - 统一配置管理
PathConfig - 路径配置(消除硬编码)PipelineConfig - Pipeline 运行配置SearchAgentConfig - 完整配置聚合get_config() - 全局配置获取src/config/loader.py - 配置加载器
load_knowledge_sources() - 从 JSON 加载知识源load_json_config() - 通用 JSON 配置加载configs/knowledge_sources.json - 知识源配置文件
收益:
新增文件:
src/application/ - 新增应用层
builder.py - Pipeline 构建器runner.py - 应用执行器__init__.py - 模块导出架构改进:
PipelineBuilder 负责组装 Pipeline核心改进:
ApplicationRunner.load_policy()SearchAgentCore 和 harness/runner 的重复逻辑数据流:
ApplicationRunner.load_policy()
↓
SearchAgentPolicy (已解析)
↓
apply_search_agent_policy(ctx, policy)
↓
PipelineOrchestrator.run(ctx)
修改文件:
run_search_agent.py - 简化为薄壳
ApplicationRunner调用链:
run_search_agent.py (薄壳)
↓
ApplicationRunner.run() (策略加载 + 执行)
↓
PipelineBuilder.build() (组装 Pipeline)
↓
PipelineOrchestrator.run() (编排执行)
src/
├── config/ # 配置管理(新增)
│ ├── settings.py # 统一配置
│ └── loader.py # 配置加载器
│
├── application/ # 应用层(新增)
│ ├── builder.py # Pipeline 构建器
│ ├── runner.py # 应用执行器(策略加载在此)
│ └── __init__.py
│
├── domain/search/ # 领域层(保持不变)
│ ├── core.py # 待简化(下一步)
│ ├── policy.py
│ └── repository.py
│
├── pipeline/ # Pipeline 引擎(保持不变)
│ ├── orchestrator.py
│ ├── stages/
│ ├── gates/
│ ├── hooks/
│ └── adapters/
│
└── harness/ # 待整合到 application(Phase 5)
└── search_agent/
需要做的:
将 src/harness/search_agent/ 中的工具类移到 src/application/
budget.py → 已整合到 runner.pysummary.py → 已整合到 runner.pyplanner.py → 保留(打印计划)environment.py → 保留(环境配置)prerequisites.py → 保留(前置检查)logging_setup.py → 保留(日志配置)简化 SearchAgentCore
删除或归档 run_pipeline.py
# 使用环境变量配置
export PIPELINE_QUERY="你的查询"
export PIPELINE_DEMAND_ID="1"
python run_search_agent.py
# 通过环境变量覆盖路径
export OUTPUT_DIR="/custom/output"
export TRACE_DIR="/custom/traces"
# 通过配置文件覆盖策略
export SEARCH_AGENT_STRATEGY_FILE="configs/custom_strategy.json"
# 通过 JSON 字符串覆盖策略
export SEARCH_AGENT_STRATEGY_JSON='{"search": {"max_keywords": 10}}'
from src.config.settings import get_config
from src.application import ApplicationRunner
# 获取配置
config = get_config()
# 创建执行器
runner = ApplicationRunner(config)
# 执行搜索
summary = await runner.run(
query="你的查询",
demand_id="1",
use_db_policy=True
)
# 检查结果
if summary.success:
print(f"找到 {summary.filtered_count} 篇文章")