refactor(core): 重构配置与入口模块,统一配置结构并调整导入

- 扁平化应用配置类,合并数据库、LLM、爬虫和通知配置
- 重新实现配置加载,统一环境变量前缀和字段命名
- 入口脚本调整,增加源码路径处理,支持模块绝对导入和直接运行
- HRAgentApplication中使用新配置字段访问方式
- 优化通知渠道注册逻辑,适配新的配置字段重命名
- 模块路径统一由ylhp_hr_2.0改为ylhp_hr_2_0,确保导入一致性
- 删除旧配置模块,避免配置重复和混淆
- service.analysis包暴露MockLLMClient,完善LLM客户端选项
- 保留主入口运行示例,演示系统初始化与功能打印
This commit is contained in:
2026-03-24 11:57:45 +08:00
parent a40c239996
commit 6a5495005e
39 changed files with 226 additions and 145 deletions

78
main.py Normal file
View File

@@ -0,0 +1,78 @@
"""Resume Intelligence Agent - Entry Point
简历智能体系统入口
Usage:
# 运行应用
uv run python main.py
# 或使用模块方式
uv run python -m src.main.python.cn.yinlihupo.ylhp_hr_2.0.main
Environment Variables:
# 数据库配置
DB_URL=mysql+pymysql://root:123456@10.200.8.25:3306/hr_agent
# LLM 配置
LLM_PROVIDER=mock
LLM_API_KEY=your_api_key
# 爬虫配置
CRAWLER_BOSS_WT_TOKEN=your_boss_token
# 通知配置
NOTIFY_WECHAT_WORK_WEBHOOK=https://qyapi.weixin.qq.com/cgi-bin/webhook/...
"""
import asyncio
import sys
from pathlib import Path
# 添加源码路径到 sys.path
src_path = Path(__file__).parent / "src" / "main" / "python"
if str(src_path) not in sys.path:
sys.path.insert(0, str(src_path))
# 导入应用
from cn.yinlihupo.ylhp_hr_2_0.main import HRAgentApplication, get_app
from cn.yinlihupo.ylhp_hr_2_0.domain.candidate import CandidateSource
async def demo():
"""演示:使用 HR Agent 进行简历处理"""
print("=" * 50)
print("简历智能体系统 - 演示")
print("=" * 50)
# 初始化应用
app = get_app()
print("\n已注册爬虫:")
for source in app.crawler_factory.get_registered_sources():
print(f" - {source.value}")
print("\n已配置通知渠道:")
if app.notification_service:
for channel_type in app.notification_service.get_configured_channels():
print(f" - {channel_type.value}")
else:
print(" - 无")
print("\n可用的评价方案:")
schemas = app.analyzer.schema_service.list_schemas()
for schema in schemas:
default_mark = " (默认)" if schema.is_default else ""
print(f" - {schema.name}{default_mark}")
print("\n" + "=" * 50)
print("系统初始化完成")
print("=" * 50)
# 示例:爬取并入库(需要配置 CRAWLER_BOSS_WT_TOKEN
# await app.crawl_and_ingest(
# source=CandidateSource.BOSS,
# job_id="your_job_id"
# )
if __name__ == "__main__":
asyncio.run(demo())