Chat Resume 是一个展示 Agent 工程能力的 AI 求职工作台:从上传简历、解析目标 JD、结构化工具调用、用户确认式 diff 修改,到导出和语音模拟面试,串成一条完整求职闭环。
上传/创建简历
-> 结构化编辑
-> 填写或识别 JD
-> Resume Agent 分析匹配
-> 工具调用生成匹配摘要 / Top gaps / 修改 diff
-> 用户确认后应用修改
-> 预览、一页适配、导出
-> 基于简历进入模拟面试
LLM 不能直接修改简历数据,只能通过受约束的工具提出结构化变更。
Observe
-> 读取当前简历、目标 JD、聊天历史和已确认 diff
Reason
-> 判断用户想咨询、分析匹配度,还是实际修改简历
Act
-> 调用只读分析工具或修改类工具
Confirm
-> 修改类工具先在 preview context 上执行,生成 diff 等待用户确认
Persist
-> 用户确认后才在真实 resume_content 上执行并写入数据库
Replay
-> SSE 连接中断后,可通过 session event cursor 回放并恢复
Agent 的输出不是“自然语言声称已修改”。只有真实工具调用成功,并通过确认门后,简历内容才会被写入。
当前 Resume Agent 的工具分为只读分析和写入修改两类。
只读工具会自动执行:
generate_job_match_summary:生成岗位匹配摘要,返回 matched_keywords、missing_keywords、resume_changes、fact_gaps 和 top_gaps。修改工具需要用户确认:
update_summary:更新个人总结,调整整份简历的职业定位和核心能力摘要。update_profile:更新个人信息中的求职定位、headline、地点和公开链接;不修改姓名、邮箱、电话。upsert_job_application:创建或更新目标公司、目标岗位和 JD。update_item_fields:更新工作、项目、教育条目的非 bullet 字段,例如职位、项目简介、角色、技术栈、学历字段。update_skills:更新技能分类名称和技能列表,支持替换或合并。add_resume_item:新增工作、项目、教育、技能、语言或自定义条目;必须提供用户明确事实来源。remove_resume_item:删除已有工作、项目、教育、技能、语言或自定义条目。update_overview:更新项目简介。update_bullet:更新已有要点。add_bullet:新增要点。remove_bullet:删除要点。每个修改工具都会返回结构化 diff,包括修改前、修改后和修改原因。前端展示确认卡,用户接受后才应用到简历。
当前 JD 匹配是轻量关键词、证据链和能力缺口归并,不是完整语义匹配模型。
它会:
它当前不会:
项目包含三层验证:
最近一次本地验收结果:
backend basedpyright: passed
backend key tests: 128 passed
frontend type-check: passed
frontend build: passed
frontend e2e: 55 passed
Frontend (Next.js / React)
-> FastAPI HTTP API
-> ResumeAgentStreamService
-> OpenAI Agents SDK ResumeAgentRuntime
-> Resume Tools
-> Tool Confirmation Gate
-> ResumeService / AgentSessionStore
-> Database
backend/app/entrypoints/http/ # FastAPI 路由
backend/app/agents/resume/ # 简历 Agent 定义和提示词上下文
backend/app/runtime/ # OpenAI Agents SDK 运行时适配、确认和恢复
backend/app/tools/resume/ # 简历工具
backend/app/services/ # 业务服务
backend/app/state/ # Agent session 存储和 SSE 回放
frontend/src/app/ # Next.js 页面
frontend/src/components/ # 前端组件
frontend/src/hooks/ # 页面级业务 hooks
frontend/src/i18n/ # 国际化配置
frontend/locales/ # 中英文翻译文件
eval/ # Agent eval 脚本和用例
要求:
启动前后端:
./restart.sh
默认地址:
http://localhost:3000http://localhost:8000http://localhost:8000/docs单独启动:
./backend.sh
./frontend.sh
示例文件:
backend/.env.examplefrontend/.env.example本地最少需要:
# backend/.env
DATABASE_URL=sqlite:///./chat_resume.db
SECRET_KEY=your-secret-key-here
OPENAI_AGENTS_PROVIDER=openai
OPENAI_API_KEY=
OPENAI_AGENTS_MODEL=gpt-5.5
DEEPSEEK_API_KEY=
DEEPSEEK_API_BASE=https://api.deepseek.com
DEEPSEEK_THINKING_TYPE=disabled
OPENROUTER_API_KEY=
OPENROUTER_API_BASE=https://openrouter.ai/api/v1
OPENROUTER_MODEL=deepseek/deepseek-v4-pro
OPENROUTER_JOB_MATCH_MODEL=deepseek/deepseek-v4-pro
OPENROUTER_RESUME_PARSER_MODEL=deepseek/deepseek-v4-pro
FRONTEND_URL=http://localhost:3000
BACKEND_CORS_ORIGINS=http://localhost:3000,https://localhost:3000
# frontend/.env.local
NEXT_PUBLIC_API_URL=http://localhost:8000
将简历优化 Agent 切到 DeepSeek 官方 API 时,设置
OPENAI_AGENTS_PROVIDER=deepseek、OPENAI_AGENTS_MODEL=deepseek-v4-pro,
并填写 DEEPSEEK_API_KEY。该分支使用 OpenAI-compatible Chat Completions,
默认用 DEEPSEEK_THINKING_TYPE=disabled 避免工具确认后的 reasoning_content 回放错误。
Resume Agent 评估保留本地 eval/ 跑法,同时输出 OpenAI Agents SDK 标准兼容产物:
openai_agents_eval.trace:写入 SDK RunConfig.workflow_name、trace_id、group_id 和 metadata,真实 OpenAI provider 运行时可在 Traces 中定位。openai_agents_eval.dataset_item:把本地 case 转成 dataset item 形状,包含输入、期望决策、期望工具、关键词和禁止内容。openai_agents_eval.model_sample:把 Agent 回复、工具调用和最终简历状态转成 grader sample。openai_agents_eval.grader:提供 OpenAI Python grader 配置,用于评分决策、工具调用、关键词、禁止内容和回复形态。普通评估:
cd backend
uv run python ../eval/run_eval.py --cases TC001 --output ../eval/results/latest.json
优秀简历黄金样例:
cd backend
uv run python ../eval/run_excellent_eval.py --cases excellent-002 --output ../eval/results/excellent_latest.json
默认 OpenAI provider 使用 OPENAI_API_KEY;切到 OPENAI_AGENTS_PROVIDER=deepseek
时使用 DEEPSEEK_API_KEY。DeepSeek 兼容分支仍可本地评分,但不会上传 OpenAI 平台 trace。
可选能力按需配置:
GOOGLE_OAUTH_CLIENT_ID、GOOGLE_OAUTH_CLIENT_SECRET、GOOGLE_OAUTH_REDIRECT_URIPAYPAL_CLIENT_ID、PAYPAL_CLIENT_SECRET、PAYPAL_PLAN_ID、PAYPAL_WEBHOOK_IDVOLCENGINE_DIALOGUE_*、VOLCENGINE_ACCESS_TOKEN、VOLCENGINE_TTS_*cd backend
uv run alembic upgrade head
# 后端
cd backend
uv run --extra dev python -m pytest tests
# 前端类型检查
cd frontend
npm run type-check
# 前端构建
npm run build
# E2E
npm run e2e
前端设计规范见 DESIGN.md。
$ claude mcp add chat-resume \
-- python -m otcore.mcp_server <graph>