一个长期运行、带状态的个人求职 AI Agent
A stateful, long-running personal AI agent for job hunting.
画像 → 匹配 → 规划 → 执行 → 复盘 → 回到画像
Profile · Match · Plan · Execute · Reflect · Loop
把"找工作"当成持续运行的工程项目。
个人作品集 · 不自动投递 · 不伪造经历 · 不预测录用概率
| 1,659 测试通过 | 91 FastAPI 路由 | 89% RAG R@1 | 3327 RAG chunks | 14 LangGraph 节点(4 实验 RAG + 10 CareerFlow) | 3 多 Persona 回归 |
求职过程通常被拆成"刷岗位 → 改简历 → 投 → 等"这种一次性动作。
这种方式的问题是:
OfferClaw 的思路:用一个带状态的 Agent 把链路连起来——所有判断走 Prompt 契约 + 规则代码双通路,所有状态写入可读的 Markdown 文件,所有变更经同一个 Orchestrator 反向修正画像与计划。
| 能力 | 说明 |
|---|---|
| 画像渐进收集 | 13 字段用户画像,按需 Onboarding,每次复盘自动回写更新 |
| JD 匹配 + 缺口 | 输入一段 JD,输出结构化能力差距清单(带致命度 / 短期可补性元数据) |
| 学习路线规划 | 基于缺口生成 4 周路线,按周→按日两层任务展开;打开页面按当天切出今日计划,可直接修改并双向同步回整体计划(同一份文件,无副本漂移) |
| 每日执行 + 复盘 | 每日计划 / 实际 / 偏离度判断,复盘结果回写画像 |
| 简历 Review 工作流 | 简历工坊用一个入口生成项目经历或完整简历;Resume Agent 写作,硬规则与独立 Critic 审查,必要时修订,用户批准后才保存 |
| JD 半自动抽取 | 粘贴招聘页 URL,自动抓取(含 Playwright SPA 兜底)并用于当次分析;确认投递后绑定为正式 JD 版本 |
| 今日建议 | 打开页面即看到"今天最该做什么"——由 Orchestrator 跨模块综合判断 |
| 本地 RAG 问答 | 顶部问答条直接查询全部 Prompt 契约 / 画像 / 投递记录 / 复盘日志 |
| 知识库两轨审核入库 | 途径A:md 直投 knowledge_base/ 子目录 → UI「未入库」扫描;途径B:URL 抓取 / 上传 md·txt·pdf·docx(引擎自动路由:PDF→Docling 结构化·公式 LaTeX·图片 qwen-vl 识别,失败回退文字层;docx→原生解析)→ 打分落候选。两轨都经 UI 卡内预览审核后增量入库;使用指南见 knowledge_base/README.md |
| CareerFlow 编排 | LangGraph 10 个业务节点串起完整求职流;条件路由按结论分流(UI 折叠成 8 个可见阶段) |
| ReAct Agent | 一句自然语言驱动 6 个 OpenAI 兼容 Tool,无 KEY 也能跑 |
| MCP Server | Streamable HTTP 传输(POST /mcp),REGISTRY 全部工具暴露给 Claude Code 等任意 MCP 客户端 |
| Trace 重放 | 每次 CareerFlow 落成 JSONL trace,可重放、可审计 |
不只是「功能能跑」,而是把 RAG 检索与 LLM/Agent 调用都做到了生产级工程化——每项改进都有量化指标、故障注入测试、逐轮可追溯日志。完整记录见
docs/RAG_OPTIMIZATION_LOG.md与docs/AGENT_OPTIMIZATION_LOG.md。
生产 /api/query 使用显式检索管线,而不是由 rag_graph.py 统一编排:路由与作用域 → 原问题 + HyDE 双通道 → Dense/BM25/RRF → bge-reranker → answerability v5 判据重排 → 三票共识证据门。rag_graph.py 保留为 LangGraph RAG 实验/演示实现;生产链路集中在 rag_api.py 与 rag_gate.py,便于逐阶段回退和审计。
| 环节 | 当前设计 | 可核验证据 |
|---|---|---|
| 候选形成 | 原问题与 HyDE 各走 Dense/BM25,RRF 融合;距离统一重算回原问题 | Final v4 Candidate 69/80→73/80 |
| 排序 | bge-reranker 提供话题相关性;LLM 判据按“片段是否含答案”分档后再排序 | Final v4 R@3 68/80→70/80,R@5 69/80→72/80 |
| 证据门 | 三态关系 + 三票共识;故障票按拒答处理,判据不可用时不改原排序 | 有效作答 29/80→59/80;历史 Final v4 的门控 correct_premise 8/12→12/12 |
| 回退与谱系 | 提示词、索引、配置留哈希;answerability / gate / HyDE 均有独立回退旋钮 | pytest、冻结包与 pre-push 回归门禁 |
三套评测口径诚实并列:
| 评测集 | R@1 | R@3 | R@5 | MRR | 限定 |
|---|---|---|---|---|---|
| 同分布文件级(n=100) | 89.0% | 95.0% | 97.0% | 0.9195 | 问题与文档标题近义偏多,是偏乐观上限 |
| 口语化回归集(n=52) | 75.0% | 80.8% | 84.6% | 0.7875 | 首列为 Recall@1;最初为 held-out,但已参与多轮开发,不再称盲集 |
| Final v4 strict chunk(80 正例) | 59/80 | 70/80 | 72/80 | 0.8083 | 历史冻结盲测,三跑逐指标中位;nDCG@5 0.8317 |
Final v4 上 Quality 的 R@1 没有提高(A/C 均为 59/80);主要收益是 Candidate、Top-K、有效作答和门控动作。代价是须拒答子集出现 1/28 真误纳,以及完整 Quality 检索在历史同分布 100 题冷缓存下 p50 13.9s、p95 29.8s。当前拒答守卫为简单负例 12/12、近似负例 11/12。
paper_kb 路由生效,不能外推到普通查询。correct_premise 最终答案只有 2/4 真正纠错,说明门控动作尚未完全传给生成合同。原始裁判输出属于本地私有评估包,不进入 Git。tmp_path 隔离合同,不调用外部 LLM、不写真实用户状态。eval_rag_bench.py --fail-under 已落地为 .githooks/pre-push;改检索代码会触发离线回归,不把外部 LLM 可用性当成 push 的硬依赖。把检索侧的弹性容错系统复刻到生成/编排/记忆/工具/数据全栈,用故障注入测试量化:
| 层 | 加固 | 从 → 到 |
|---|---|---|
| LLM 调用 | 统一网关(重试+退避+降级+额度兜底自动切换)+ choices 防御 | 代理抖动崩 CLI → 重试后成功、可读降级;主模型额度耗尽 → 自动切兜底模型 |
| 编排 | DAG 节点 fail-soft(node_guard) | 一处炸=整图崩 → 单节点降级 |
| 工具 | 装配防御 + 墙钟预算 + schema 漂移校验 | 畸形/卡死/漂移即崩 → 降级 + 超时 + CI 拦截 |
| 记忆 | 原子写 + 损坏可恢复 + 并发锁 | 损坏静默吞 → 失败可见 + 沉淀不丢 |
| 数据/CI | 状态原子写 + 评测门禁 | 半截损坏 + 手动跑 → 原子化 + 提交即拦截 |
47 个专项故障注入测试 + 1,659 全量测试通过 + CI 门禁(.github/workflows/ci.yml)。
RAG_CRAG=0 默认关),只在口语化回归集测正后才考虑晋级;生产默认门为 answerability v5 + 三票共识docs/MULTI_AGENT_UPGRADE.md 用户输入一段 JD
│
▼
┌──────────────────────┐
│ profile_loader │ 读 user_profile.md
│ 13 字段画像 + 缓存 │ 按 JSON Schema 校验
└──────────┬───────────┘
│
▼
┌────────────────────────────┐
│ CareerFlow (LangGraph) │ routed: 条件路由 4 分支
│ profile → job_input → │
│ match → gap → plan → │
│ today → resume → │
│ application_suggest │
└──────────┬─────────────────┘
│
┌──────────┼──────────┐
▼ ▼ ▼
适合投递 中长期可转向 暂不建议
│ │ │
▼ ▼ ▼
full path plan+today gap-only → END
│ │ │
└──────────┴──────────┘
│
▼
┌────────────────────────────┐
│ Observability │ JSONL trace
│ logs/traces/<id>.jsonl │ /api/trace 重放
└────────────────────────────┘
旁路:
ReAct Agent (POST /api/agent) ─→ Tool Registry (6 tools)
MCP Server (POST /mcp · Streamable HTTP) ─→ Tool Registry (同一 REGISTRY)
RAG (混合检索+rerank+路由+双证据门控) ─→ ChromaDB (3327 chunks)
Memory Layers (V4) ─→ Episodic / Semantic / Procedural
# 1. 克隆 + 创建本地虚拟环境
git clone https://github.com/zhangrldndx/offerclaw.git
cd offerclaw
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements.txt
# 2. 配置本机 API 环境(已被 .gitignore 忽略)
cp .env.example .env.local
# 然后把 .env.local 里的 API Key 占位符替换为你自己的 Key。
# 百炼推荐配置见 .env.example:chat 走 OPENAI_*,embedding 走 EMBEDDING_PROVIDER=bailian。
# 想用 DeepSeek / 智谱 GLM 等其他国内模型:只改 OPENAI_BASE_URL / OPENAI_API_KEY /
# LLM_MODEL 三个变量(OpenAI 兼容协议,现成示例见 .env.example 注释);
# 手头没有 embedding 类 key 时选 EMBEDDING_PROVIDER=local(本地模型,免费无额度)。
# 2.5 如果切换了 embedding provider/model,重建对应 Chroma collection
python rag_ingest.py --rebuild
# 3. 启动 FastAPI 服务
python -m uvicorn rag_api:app --host 127.0.0.1 --port 8000
# 4. 浏览器打开任一控制台
# /ui — 8 卡片求职工作台(顶部 RAG 问答条 + 今日建议横条 + CareerFlow 流程条)
# /ui/console — V3 CareerFlow 8 步 Stepper(一页跑完整流程)
# /docs — Swagger(91 路由)
JD 半自动抽取会先用轻量请求抓正文;遇到 SPA 招聘页时,job_discovery.py 会优先调用本机 Google Chrome 的无头模式渲染页面,若本机没有 Chrome 或启动失败,再回退到 Playwright 自带 Chromium。
python doctor.py # 12 项环境与文件健康检查
python verify_pipeline.py # 6 步主链路端到端冒烟
python eval_match.py # match_job 评估(status acc / direction acc)
python -m pytest tests/ -q # 1,659 tests passed / 54 skipped
python verify_docs.py # 4 份关键文档指标口径一致性巡检
python normalize_applications.py # applications.md 投递表 schema 校验
OPENAI_*用于 chat completion / Agent 推理;EMBEDDING_PROVIDER、EMBEDDING_MODEL、RAG_COLLECTION_NAME用于 RAG 向量库切换。百炼可用DASHSCOPE_API_KEY,旧智谱路径可用ZHIPU_API_KEY。KEY 仅本地、绝不入 git。
渠道接入和本地部署见 docs/WECHAT_INTEGRATION.md。
工作日早间建议、晚间留痕提醒和周日复盘可自动推送到微信。微信端还支持顶部问答、JD 匹配、附件解析、计划与简历草稿生成,以及投递状态、每日留痕和知识材料的待审核写入;计划、画像、投递、日志、知识库和正式简历等本地状态只有在用户明确确认后才修改。
bash setup_wechat.sh # 幂等一键部署;--dry-run 可先预览
# 首次需扫码配对:openclaw channels login openclaw-weixin
脚本部署 OpenClaw gateway 作为渠道层(调度 + 微信桥),OfferClaw 保持领域后端。上传的 md/txt/pdf/docx 会先解析为来源或候选;图片暂不做 OCR,外部向量数据库也不直接合并。知识材料须先确认候选,再在知识库审核后入库并重建 OfferClaw 自己的索引。完整能力、审批边界和运维方式见 docs/WECHAT_INTEGRATION.md。
V4 把项目从「流程画板」推进到「真正可以被工程师 review 的 Agent 系统」。5 个独立模块、66 个新增测试全部绿、不破坏 V3 任何回归。(V4 之后又做了 RAG 检索 8 轮优化 + LLM/Agent 工程化 A1–A8/B1–B4,再 +47 故障注入测试,详见两份手册)
① Eval-driven Agent
|
② Agentic Graph · 条件路由
|
③ Tool Ecology · ReAct Agent
|
④ Observability · 结构化 Trace
|
⑤ Profile Schema + 分层 Memory
| |
| 层 | 选型 |
|---|---|
| Agent 核心 | Python 3.10+ · OpenAI 兼容 Chat API(百炼 / 代理 / 智谱 fallback)· 仅 requests,无 LangChain / LlamaIndex |
| RAG | 本地 bge-base-zh 向量 + BM25 + RRF + bge-reranker + answerability 判据重排 · HyDE 双通道 · ChromaDB 本地持久化 |
| API | FastAPI + Uvicorn · 91 个路由装饰器(86 个唯一项目路径)· Server-Sent Events 流式 · Swagger UI |
| Orchestration | CareerFlow 使用 LangGraph 10 业务节点 StateGraph;生产 /api/query 使用 rag_api.py + rag_gate.py 显式管线,RAG 4 节点图仅作实验/演示 |
| Tool Layer (V4) | tools_registry.py 6 个 OpenAI 兼容 Tool · react_agent.py deterministic + LLM 双模式 · mcp_server.py 手写 MCP Streamable HTTP 服务端 |
| Observability (V4) | JSONL trace + read_trace / list_traces / trace_career_flow + 3 个新 API |
| JD 抓取 | requests 快速通道 + Playwright Headless Chromium 兜底(覆盖字节 / 阿里 / 腾讯等 SPA 招聘页) |
| State | Markdown 文件 + memory.json 跨会话上下文 + profiles/p*.json 多 Persona · profile_loader.py 集中 13 字段解析 + mtime 缓存 + JSON Schema 校验 |
| Memory (V4) | 三层 memory_layers.py:Episodic(JSONL)+ Semantic(JSON KV)+ Procedural(学到的 SOP) |
| Testing | 1,659 tests passed(54 skipped,需显式外部/E2E、私有评估包或本地运行资产)· match_eval_set.json(30 个合成样本)· rag_bench_set.json(100 题同分布)+ rag_bench_paraphrase_set.json(52 题口语化回归集)· 六域 24 例产品验收 · domain_matrix_corpus.json(跨域泛化矩阵) |
| 运行平台 | 本地 / JVS Claw(文件空间 + 定时任务) |
评估基于自建小规模评估集,仅用于个人项目自检与回归对比,不代表通用基准。
| 指标 | 当前值 | 来源 / 备注 |
|---|---|---|
| 全量测试 | 1,659 tests passed (54 skipped) | python -m pytest tests/ -q |
| 跨域泛化矩阵 | 8 合成画像 × 16 JD=128 对:崩溃 0 · 劫持 1/112(已知缺陷) · 对角主方向 11/16(miss 全为命名变体 fail-safe;画像全合成,诚实标注) | eval_domain_matrix.py |
| Agent 消融/对照 | 记忆/执行追踪消融:最坏情况(连续无推进)重复建议率 100%→33%、9 次主动升级,记忆注入成本 ≈105 tokens/次;E1 三臂(n=12 植入项,temp=0):自查 = 同模独立 10/12(独立性单变量零增益)· 跨模型 12/12(多样性以精度换召回) | eval_memory_ablation.py · eval_critic_llm_arms.py · 结果 docs/agent_eval/ |
| match_job 合成规则回归 | status 100% · direction 100% | python eval_match.py(30 条虚构画像/JD × 3 档;不代表真实招聘效果) |
| RAG 同分布 n=100 | R@1 89.0% · R@3 95.0% · R@5 97.0% · MRR 0.9195 | 偏乐观上限;docs/rag_eval/final_v4/bench100_qualitydefault.json |
| RAG 口语化回归 n=52 | Recall@1 75.0% · R@3 80.8% · R@5 84.6% · MRR 0.7875 | 多轮使用后的回归集,不再称盲集 |
| Final v4 strict chunk | Candidate 73/80 · R@1 59/80 · R@3 70/80 · R@5 72/80 · nDCG@5 0.8317 | 历史冻结盲测;Quality R@1 未涨,主要收益为 Top-K 与有效作答 |
| 有效作答 / 安全性 | 29/80→59/80 · 门控 correct_premise 12/12 · 真误纳 1/28 | Final v4 三跑逐指标中位;不等同于最终生成已执行纠错 |
| Quality 检索延迟 | 冷缓存 p50 13.9s · p95 29.8s | 完整判据与共识门链路;不等同于计划/简历 SSE 首字延迟 |
| 答案质量 v2(n=48) | 忠实度 96.9%–97.1% · 完整度 65.0%–81.3% · 负例端到端动作合同 6/8 | pipeline 路由动作 8/8;双裁判 96/96;开发回归,非盲/非 organic |
| 答案端到端延迟(n=48) | p50 37.6s · p95 97.1s | 独立空判据缓存;包含检索 + 最终生成,当前首要工程短板 |
| 产品小型验收 | 36/36 | 六域各 6 例,确定性、tmp 隔离、无外部 LLM/真实状态写入 |
| FastAPI 路由数 | 91 个装饰器 / 86 个唯一项目路径 | grep -cE '^@(app|router)\.' rag_api.py |
| ChromaDB 知识库 | 3327 chunks | 多源真实化(飞书八股+all-in-rag+hello-agents+LocalFlow;候选 JD 不入库) |
| 工程体检 | doctor 12 OK · 0 WARN · 0 ERR | python doctor.py |
| 文档口径巡检 | all green | python verify_docs.py |
| 投递表校验 | 0 error | python normalize_applications.py |
| 面试故事库 | 8 STAR+R | interview_story_bank.md |
| 端到端链路 | verify_pipeline 6 / 6 | python verify_pipeline.py |
| SSE 首字延迟 | < 2s | 仅计划与简历生成流;不是 Quality RAG 延迟 |
| 多 Persona 回归 | 3 persona × multi-JD 差异化 | docs/persona_compare_report.md |
完整现场输出固化在 docs/verification_report.md。
offerclaw/
│
├─ Prompt 契约层(不变契约 · 全部入 Git)
│ SOUL.md · target_rules.md · source_policy.md
│ onboarding_prompt.md · job_match_prompt.md
│ plan_prompt.md · summary_prompt.md
│
├─ 核心代码(V1 → V4 演进)
│ agent_demo.py # V1 Agent 核心 (tools.py)
│ match_job.py # 规则版 JD 匹配(三档结论)
│ plan_gen.py # 4 周路线生成
│ resume_builder.py # JD 定制简历段
│ job_discovery.py # JD 抓取(含 Playwright 兜底)
│ rag_*.py # RAG + LangGraph 4 节点 + 工具循环
│ career_agent.py # V2 Orchestrator("今天最该做什么")
│ career_flow.py # CareerFlow 10 业务节点 + routed 变体(+4 router)
│ profile_loader.py # V3 状态真实化 + V4 Schema 校验
│
├─ V4 新增模块
│ eval_match.py # match_job 评估 + LLM-as-judge
│ tools_registry.py # OpenAI 兼容 Tool 抽象 + 默认注册表
│ react_agent.py # ReAct Agent(deterministic + LLM)
│ observability.py # JSONL Trace + 重放
│ memory_layers.py # Episodic / Semantic / Procedural
│ profile_schema.json # 13 字段 JSON Schema
│
├─ FastAPI 层
│ rag_api.py # 91 路由 · SSE 流 · Swagger
│ mcp_server.py # 手写 MCP Streamable HTTP 服务端(POST /mcp,工具来自同一 REGISTRY)
│
├─ 工程自检
│ doctor.py # 10 项体检
│ verify_pipeline.py # 6 步冒烟
│ verify_docs.py # 文档口径漂移巡检
│ normalize_applications.py # 投递表 schema 校验
│
├─ 运行时数据(部分入 Git,部分 .gitignore)
│ user_profile.md · daily_log.md · applications.md
│ interview_story_bank.md · application_jds/
├─ 离线回归样例
│ jd_candidates.md(不进入产品 RAG)
│ profiles/p1_demo_ai.json / p2 / p3
│ chroma_db/ · logs/ · memory.json ← .gitignore
│
├─ tests/ # 1,659 tests passed(含 RAG/Agent 工程化故障注入测试)
│
└─ docs/
architecture.md · v3_changelog.md · RESUME_PROJECT.md
verification_report.md · archive/(V1–V2 历史快照)
interview_qa.md · persona_compare_report.md
project_one_pager.md · postmortem.md · ethical_use.md
MEMORY_SYSTEM.md · WECHAT_INTEGRATION.md
requests,SPA 自动回退 Playwright,控制成本同时覆盖主流招聘页REGISTRY 取,不重写 schema(V5 已兑现:mcp_server.py Streamable HTTP)目标:在本地完成 JD → CareerFlow → 简历 → 状态回填 → 复盘闭环。真实投递数据始终留在 Git 忽略的运行时文件中。
1. 临时抽取 JD POST /api/discover → 仅返回结构化结果
2. CareerFlow 评估 POST /api/flow/run → match_report + gaps + today
3. 决策分叉
├─ 适合投递 → §4 生成简历
└─ 其他三档 → plan/4_weeks 中长期补能,本轮不投
4. 生成简历草稿 POST /api/resume/markdown 默认无 LLM 拿骨架
+ POST /api/resume/build SSE 流式 LLM 写定制段
5. 确认登记投递 applications.md 加一行,并绑定不可变 JD 版本
6. 真实投出 状态改 已投递 POST /api/daily 追加日志
7. 回流证据 只保存在本地私密目录,不进入 Git
8. 复盘入 RAG daily_log.md 写 1-2 句 python rag_ingest.py 入库
docs/v3_changelog.mdDEMO_PROFILE 0 生产耦合 · /api/info 与 24 路由 0 漂移 · pytest 64/64完整推进记录见 PROJECT_STATUS.md。
docs/ethical_use.md §1.6user_profile.md 与 interview_story_bank.md 中的真实素材重组、强调和适配 JD,不会编造未发生的项目applications.md / user_profile.md 等用户层文件的关键动作必须 UI 二次确认(详见 DATA_CONTRACT.md §4.0 写入策略表)docs/MULTI_USER_ROADMAP.md)、无登录鉴权 / 限流 / 审计当前代码含 91 个路由装饰器、86 个唯一项目路径(同一路径的不同 HTTP 方法分别注册);完整运行时 Swagger 在
/docs。
| Route | 用途 |
|---|---|
GET / | 重定向到 /ui |
GET /ui | 8 卡片求职工作台(主入口) |
GET /ui/console | V3 CareerFlow 8 步 Stepper |
GET /fonts/{filename} | 展示字体(static/fonts/ 下的 woff2,白名单) |
GET /health | ChromaDB / 知识库健康检查 |
GET /api/info | 元信息 + 路由清单 |
GET /docs | Swagger UI |
| Route | 用途 |
|---|---|
GET /api/profile | 用户画像摘要 |
POST /api/query | RAG 问答(一次性) |
POST /api/stream | RAG 问答(SSE 流式) |
POST /api/search | 仅检索(不生成答案) |
POST /api/match | 岗位匹配(三档结论 + 缺口;use_semantic=true 对齐画像证据) |
| Route | 用途 |
|---|---|
POST /api/plan | 4 周路线规划 |
POST /api/plan/stream | 4 周路线(SSE 流式) |
GET /api/daily | 今日 daily_log + 最近 7 天摘要 |
POST /api/daily | 向 daily_log.md 追加今日条目 |
GET /api/resume | 简历素材聚合 |
POST /api/agent/flows/start | 启动 Plan 或 Resume Review 工作流;简历支持 project_section / full_resume |
POST /api/agent/flows/{thread_id}/resume | 批准、提出修改、保存未评审草稿或拒绝;正式保存前校验 revision |
POST /api/resume/project/stream | 项目经历兼容入口,内部委托给同一 Resume Agent → Critic 工作流 |
POST /api/resume/build 等旧接口 | 轻量兼容接口;Web 简历工坊不再使用这些入口 |
GET /api/today | 今日建议(聚合投递池 + 日志) |
| Route | 用途 |
|---|---|
POST /api/discover | JD 半自动抽取 |
GET /api/jd/queries | 根据 profile 生成搜索关键词组合 |
POST /api/jd/rank | 对一组候选 JD 调 match_job 排序 |
| Route | 用途 |
|---|---|
POST /api/flow/run | CareerFlow 主流程(10 业务节点全状态) |
POST /api/reset | 清空对话历史 |
| Route | 用途 |
|---|---|
POST /api/agent | ReAct Agent(deterministic + LLM 自动降级) |
GET /api/trace | 列最近 N 条 trace |
GET /api/trace/{trace_id} | 读回单条 trace 全部事件 |
POST /api/flow/run_traced | routed CareerFlow + 自动落 JSONL trace |
| Route | 用途 |
|---|---|
POST /mcp | MCP Streamable HTTP 单端点(JSON-RPC:initialize / ping / tools/list / tools/call),暴露 REGISTRY 全部 6 工具 |
个人作品集项目,未配置开源许可。引用或参考请在 issue 中联系。
Built around the discipline of stateful agent engineering.
github.com/zhangrldndx/offerclaw
一个长期运行、带状态的个人求职 AI Agent
A stateful, long-running personal AI agent for job hunting.
画像 → 匹配 → 规划 → 执行 → 复盘 → 回到画像
Profile · Match · Plan · Execute · Reflect · Loop
把"找工作"当成持续运行的工程项目。
个人作品集 · 不自动投递 · 不伪造经历 · 不预测录用概率
| 1,659 测试通过 | 91 FastAPI 路由 | 89% RAG R@1 | 3327 RAG chunks | 14 LangGraph 节点(4 实验 RAG + 10 CareerFlow) | 3 多 Persona 回归 |
求职过程通常被拆成"刷岗位 → 改简历 → 投 → 等"这种一次性动作。
这种方式的问题是:
OfferClaw 的思路:用一个带状态的 Agent 把链路连起来——所有判断走 Prompt 契约 + 规则代码双通路,所有状态写入可读的 Markdown 文件,所有变更经同一个 Orchestrator 反向修正画像与计划。
| 能力 | 说明 |
|---|---|
| 画像渐进收集 | 13 字段用户画像,按需 Onboarding,每次复盘自动回写更新 |
| JD 匹配 + 缺口 | 输入一段 JD,输出结构化能力差距清单(带致命度 / 短期可补性元数据) |
| 学习路线规划 | 基于缺口生成 4 周路线,按周→按日两层任务展开;打开页面按当天切出今日计划,可直接修改并双向同步回整体计划(同一份文件,无副本漂移) |
| 每日执行 + 复盘 | 每日计划 / 实际 / 偏离度判断,复盘结果回写画像 |
| 简历 Review 工作流 | 简历工坊用一个入口生成项目经历或完整简历;Resume Agent 写作,硬规则与独立 Critic 审查,必要时修订,用户批准后才保存 |
| JD 半自动抽取 | 粘贴招聘页 URL,自动抓取(含 Playwright SPA 兜底)并用于当次分析;确认投递后绑定为正式 JD 版本 |
| 今日建议 | 打开页面即看到"今天最该做什么"——由 Orchestrator 跨模块综合判断 |
| 本地 RAG 问答 | 顶部问答条直接查询全部 Prompt 契约 / 画像 / 投递记录 / 复盘日志 |
| 知识库两轨审核入库 | 途径A:md 直投 knowledge_base/ 子目录 → UI「未入库」扫描;途径B:URL 抓取 / 上传 md·txt·pdf·docx(引擎自动路由:PDF→Docling 结构化·公式 LaTeX·图片 qwen-vl 识别,失败回退文字层;docx→原生解析)→ 打分落候选。两轨都经 UI 卡内预览审核后增量入库;使用指南见 knowledge_base/README.md |
| CareerFlow 编排 | LangGraph 10 个业务节点串起完整求职流;条件路由按结论分流(UI 折叠成 8 个可见阶段) |
| ReAct Agent | 一句自然语言驱动 6 个 OpenAI 兼容 Tool,无 KEY 也能跑 |
| MCP Server | Streamable HTTP 传输(POST /mcp),REGISTRY 全部工具暴露给 Claude Code 等任意 MCP 客户端 |
| Trace 重放 | 每次 CareerFlow 落成 JSONL trace,可重放、可审计 |
不只是「功能能跑」,而是把 RAG 检索与 LLM/Agent 调用都做到了生产级工程化——每项改进都有量化指标、故障注入测试、逐轮可追溯日志。完整记录见
docs/RAG_OPTIMIZATION_LOG.md与docs/AGENT_OPTIMIZATION_LOG.md。
生产 /api/query 使用显式检索管线,而不是由 rag_graph.py 统一编排:路由与作用域 → 原问题 + HyDE 双通道 → Dense/BM25/RRF → bge-reranker → answerability v5 判据重排 → 三票共识证据门。rag_graph.py 保留为 LangGraph RAG 实验/演示实现;生产链路集中在 rag_api.py 与 rag_gate.py,便于逐阶段回退和审计。
| 环节 | 当前设计 | 可核验证据 |
|---|---|---|
| 候选形成 | 原问题与 HyDE 各走 Dense/BM25,RRF 融合;距离统一重算回原问题 | Final v4 Candidate 69/80→73/80 |
| 排序 | bge-reranker 提供话题相关性;LLM 判据按“片段是否含答案”分档后再排序 | Final v4 R@3 68/80→70/80,R@5 69/80→72/80 |
| 证据门 | 三态关系 + 三票共识;故障票按拒答处理,判据不可用时不改原排序 | 有效作答 29/80→59/80;历史 Final v4 的门控 correct_premise 8/12→12/12 |
| 回退与谱系 | 提示词、索引、配置留哈希;answerability / gate / HyDE 均有独立回退旋钮 | pytest、冻结包与 pre-push 回归门禁 |
三套评测口径诚实并列:
| 评测集 | R@1 | R@3 | R@5 | MRR | 限定 |
|---|---|---|---|---|---|
| 同分布文件级(n=100) | 89.0% | 95.0% | 97.0% | 0.9195 | 问题与文档标题近义偏多,是偏乐观上限 |
| 口语化回归集(n=52) | 75.0% | 80.8% | 84.6% | 0.7875 | 首列为 Recall@1;最初为 held-out,但已参与多轮开发,不再称盲集 |
| Final v4 strict chunk(80 正例) | 59/80 | 70/80 | 72/80 | 0.8083 | 历史冻结盲测,三跑逐指标中位;nDCG@5 0.8317 |
Final v4 上 Quality 的 R@1 没有提高(A/C 均为 59/80);主要收益是 Candidate、Top-K、有效作答和门控动作。代价是须拒答子集出现 1/28 真误纳,以及完整 Quality 检索在历史同分布 100 题冷缓存下 p50 13.9s、p95 29.8s。当前拒答守卫为简单负例 12/12、近似负例 11/12。
paper_kb 路由生效,不能外推到普通查询。correct_premise 最终答案只有 2/4 真正纠错,说明门控动作尚未完全传给生成合同。原始裁判输出属于本地私有评估包,不进入 Git。tmp_path 隔离合同,不调用外部 LLM、不写真实用户状态。eval_rag_bench.py --fail-under 已落地为 .githooks/pre-push;改检索代码会触发离线回归,不把外部 LLM 可用性当成 push 的硬依赖。把检索侧的弹性容错系统复刻到生成/编排/记忆/工具/数据全栈,用故障注入测试量化:
| 层 | 加固 | 从 → 到 |
|---|---|---|
| LLM 调用 | 统一网关(重试+退避+降级+额度兜底自动切换)+ choices 防御 | 代理抖动崩 CLI → 重试后成功、可读降级;主模型额度耗尽 → 自动切兜底模型 |
| 编排 | DAG 节点 fail-soft(node_guard) | 一处炸=整图崩 → 单节点降级 |
| 工具 | 装配防御 + 墙钟预算 + schema 漂移校验 | 畸形/卡死/漂移即崩 → 降级 + 超时 + CI 拦截 |
| 记忆 | 原子写 + 损坏可恢复 + 并发锁 | 损坏静默吞 → 失败可见 + 沉淀不丢 |
| 数据/CI | 状态原子写 + 评测门禁 | 半截损坏 + 手动跑 → 原子化 + 提交即拦截 |
47 个专项故障注入测试 + 1,659 全量测试通过 + CI 门禁(.github/workflows/ci.yml)。
RAG_CRAG=0 默认关),只在口语化回归集测正后才考虑晋级;生产默认门为 answerability v5 + 三票共识docs/MULTI_AGENT_UPGRADE.md 用户输入一段 JD
│
▼
┌──────────────────────┐
│ profile_loader │ 读 user_profile.md
│ 13 字段画像 + 缓存 │ 按 JSON Schema 校验
└──────────┬───────────┘
│
▼
┌────────────────────────────┐
│ CareerFlow (LangGraph) │ routed: 条件路由 4 分支
│ profile → job_input → │
│ match → gap → plan → │
│ today → resume → │
│ application_suggest │
└──────────┬─────────────────┘
│
┌──────────┼──────────┐
▼ ▼ ▼
适合投递 中长期可转向 暂不建议
│ │ │
▼ ▼ ▼
full path plan+today gap-only → END
│ │ │
└──────────┴──────────┘
│
▼
┌────────────────────────────┐
│ Observability │ JSONL trace
│ logs/traces/<id>.jsonl │ /api/trace 重放
└────────────────────────────┘
旁路:
ReAct Agent (POST /api/agent) ─→ Tool Registry (6 tools)
MCP Server (POST /mcp · Streamable HTTP) ─→ Tool Registry (同一 REGISTRY)
RAG (混合检索+rerank+路由+双证据门控) ─→ ChromaDB (3327 chunks)
Memory Layers (V4) ─→ Episodic / Semantic / Procedural
# 1. 克隆 + 创建本地虚拟环境
git clone https://github.com/zhangrldndx/offerclaw.git
cd offerclaw
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements.txt
# 2. 配置本机 API 环境(已被 .gitignore 忽略)
cp .env.example .env.local
# 然后把 .env.local 里的 API Key 占位符替换为你自己的 Key。
# 百炼推荐配置见 .env.example:chat 走 OPENAI_*,embedding 走 EMBEDDING_PROVIDER=bailian。
# 想用 DeepSeek / 智谱 GLM 等其他国内模型:只改 OPENAI_BASE_URL / OPENAI_API_KEY /
# LLM_MODEL 三个变量(OpenAI 兼容协议,现成示例见 .env.example 注释);
# 手头没有 embedding 类 key 时选 EMBEDDING_PROVIDER=local(本地模型,免费无额度)。
# 2.5 如果切换了 embedding provider/model,重建对应 Chroma collection
python rag_ingest.py --rebuild
# 3. 启动 FastAPI 服务
python -m uvicorn rag_api:app --host 127.0.0.1 --port 8000
# 4. 浏览器打开任一控制台
# /ui — 8 卡片求职工作台(顶部 RAG 问答条 + 今日建议横条 + CareerFlow 流程条)
# /ui/console — V3 CareerFlow 8 步 Stepper(一页跑完整流程)
# /docs — Swagger(91 路由)
JD 半自动抽取会先用轻量请求抓正文;遇到 SPA 招聘页时,job_discovery.py 会优先调用本机 Google Chrome 的无头模式渲染页面,若本机没有 Chrome 或启动失败,再回退到 Playwright 自带 Chromium。
python doctor.py # 12 项环境与文件健康检查
python verify_pipeline.py # 6 步主链路端到端冒烟
python eval_match.py # match_job 评估(status acc / direction acc)
python -m pytest tests/ -q # 1,659 tests passed / 54 skipped
python verify_docs.py # 4 份关键文档指标口径一致性巡检
python normalize_applications.py # applications.md 投递表 schema 校验
OPENAI_*用于 chat completion / Agent 推理;EMBEDDING_PROVIDER、EMBEDDING_MODEL、RAG_COLLECTION_NAME用于 RAG 向量库切换。百炼可用DASHSCOPE_API_KEY,旧智谱路径可用ZHIPU_API_KEY。KEY 仅本地、绝不入 git。
渠道接入和本地部署见 docs/WECHAT_INTEGRATION.md。
工作日早间建议、晚间留痕提醒和周日复盘可自动推送到微信。微信端还支持顶部问答、JD 匹配、附件解析、计划与简历草稿生成,以及投递状态、每日留痕和知识材料的待审核写入;计划、画像、投递、日志、知识库和正式简历等本地状态只有在用户明确确认后才修改。
bash setup_wechat.sh # 幂等一键部署;--dry-run 可先预览
# 首次需扫码配对:openclaw channels login openclaw-weixin
脚本部署 OpenClaw gateway 作为渠道层(调度 + 微信桥),OfferClaw 保持领域后端。上传的 md/txt/pdf/docx 会先解析为来源或候选;图片暂不做 OCR,外部向量数据库也不直接合并。知识材料须先确认候选,再在知识库审核后入库并重建 OfferClaw 自己的索引。完整能力、审批边界和运维方式见 docs/WECHAT_INTEGRATION.md。
V4 把项目从「流程画板」推进到「真正可以被工程师 review 的 Agent 系统」。5 个独立模块、66 个新增测试全部绿、不破坏 V3 任何回归。(V4 之后又做了 RAG 检索 8 轮优化 + LLM/Agent 工程化 A1–A8/B1–B4,再 +47 故障注入测试,详见两份手册)
① Eval-driven Agent
|
② Agentic Graph · 条件路由
|
③ Tool Ecology · ReAct Agent
|
④ Observability · 结构化 Trace
|
⑤ Profile Schema + 分层 Memory
| |
| 层 | 选型 |
|---|---|
| Agent 核心 | Python 3.10+ · OpenAI 兼容 Chat API(百炼 / 代理 / 智谱 fallback)· 仅 requests,无 LangChain / LlamaIndex |
| RAG | 本地 bge-base-zh 向量 + BM25 + RRF + bge-reranker + answerability 判据重排 · HyDE 双通道 · ChromaDB 本地持久化 |
| API | FastAPI + Uvicorn · 91 个路由装饰器(86 个唯一项目路径)· Server-Sent Events 流式 · Swagger UI |
| Orchestration | CareerFlow 使用 LangGraph 10 业务节点 StateGraph;生产 /api/query 使用 rag_api.py + rag_gate.py 显式管线,RAG 4 节点图仅作实验/演示 |
| Tool Layer (V4) | tools_registry.py 6 个 OpenAI 兼容 Tool · react_agent.py deterministic + LLM 双模式 · mcp_server.py 手写 MCP Streamable HTTP 服务端 |
| Observability (V4) | JSONL trace + read_trace / list_traces / trace_career_flow + 3 个新 API |
| JD 抓取 | requests 快速通道 + Playwright Headless Chromium 兜底(覆盖字节 / 阿里 / 腾讯等 SPA 招聘页) |
| State | Markdown 文件 + memory.json 跨会话上下文 + profiles/p*.json 多 Persona · profile_loader.py 集中 13 字段解析 + mtime 缓存 + JSON Schema 校验 |
| Memory (V4) | 三层 memory_layers.py:Episodic(JSONL)+ Semantic(JSON KV)+ Procedural(学到的 SOP) |
| Testing | 1,659 tests passed(54 skipped,需显式外部/E2E、私有评估包或本地运行资产)· match_eval_set.json(30 个合成样本)· rag_bench_set.json(100 题同分布)+ rag_bench_paraphrase_set.json(52 题口语化回归集)· 六域 24 例产品验收 · domain_matrix_corpus.json(跨域泛化矩阵) |
| 运行平台 | 本地 / JVS Claw(文件空间 + 定时任务) |
评估基于自建小规模评估集,仅用于个人项目自检与回归对比,不代表通用基准。
| 指标 | 当前值 | 来源 / 备注 |
|---|---|---|
| 全量测试 | 1,659 tests passed (54 skipped) | python -m pytest tests/ -q |
| 跨域泛化矩阵 | 8 合成画像 × 16 JD=128 对:崩溃 0 · 劫持 1/112(已知缺陷) · 对角主方向 11/16(miss 全为命名变体 fail-safe;画像全合成,诚实标注) | eval_domain_matrix.py |
| Agent 消融/对照 | 记忆/执行追踪消融:最坏情况(连续无推进)重复建议率 100%→33%、9 次主动升级,记忆注入成本 ≈105 tokens/次;E1 三臂(n=12 植入项,temp=0):自查 = 同模独立 10/12(独立性单变量零增益)· 跨模型 12/12(多样性以精度换召回) | eval_memory_ablation.py · eval_critic_llm_arms.py · 结果 docs/agent_eval/ |
| match_job 合成规则回归 | status 100% · direction 100% | python eval_match.py(30 条虚构画像/JD × 3 档;不代表真实招聘效果) |
| RAG 同分布 n=100 | R@1 89.0% · R@3 95.0% · R@5 97.0% · MRR 0.9195 | 偏乐观上限;docs/rag_eval/final_v4/bench100_qualitydefault.json |
| RAG 口语化回归 n=52 | Recall@1 75.0% · R@3 80.8% · R@5 84.6% · MRR 0.7875 | 多轮使用后的回归集,不再称盲集 |
| Final v4 strict chunk | Candidate 73/80 · R@1 59/80 · R@3 70/80 · R@5 72/80 · nDCG@5 0.8317 | 历史冻结盲测;Quality R@1 未涨,主要收益为 Top-K 与有效作答 |
| 有效作答 / 安全性 | 29/80→59/80 · 门控 correct_premise 12/12 · 真误纳 1/28 | Final v4 三跑逐指标中位;不等同于最终生成已执行纠错 |
| Quality 检索延迟 | 冷缓存 p50 13.9s · p95 29.8s | 完整判据与共识门链路;不等同于计划/简历 SSE 首字延迟 |
| 答案质量 v2(n=48) | 忠实度 96.9%–97.1% · 完整度 65.0%–81.3% · 负例端到端动作合同 6/8 | pipeline 路由动作 8/8;双裁判 96/96;开发回归,非盲/非 organic |
| 答案端到端延迟(n=48) | p50 37.6s · p95 97.1s | 独立空判据缓存;包含检索 + 最终生成,当前首要工程短板 |
| 产品小型验收 | 36/36 | 六域各 6 例,确定性、tmp 隔离、无外部 LLM/真实状态写入 |
| FastAPI 路由数 | 91 个装饰器 / 86 个唯一项目路径 | grep -cE '^@(app|router)\.' rag_api.py |
| ChromaDB 知识库 | 3327 chunks | 多源真实化(飞书八股+all-in-rag+hello-agents+LocalFlow;候选 JD 不入库) |
| 工程体检 | doctor 12 OK · 0 WARN · 0 ERR | python doctor.py |
| 文档口径巡检 | all green | python verify_docs.py |
| 投递表校验 | 0 error | python normalize_applications.py |
| 面试故事库 | 8 STAR+R | interview_story_bank.md |
| 端到端链路 | verify_pipeline 6 / 6 | python verify_pipeline.py |
| SSE 首字延迟 | < 2s | 仅计划与简历生成流;不是 Quality RAG 延迟 |
| 多 Persona 回归 | 3 persona × multi-JD 差异化 | docs/persona_compare_report.md |
完整现场输出固化在 docs/verification_report.md。
offerclaw/
│
├─ Prompt 契约层(不变契约 · 全部入 Git)
│ SOUL.md · target_rules.md · source_policy.md
│ onboarding_prompt.md · job_match_prompt.md
│ plan_prompt.md · summary_prompt.md
│
├─ 核心代码(V1 → V4 演进)
│ agent_demo.py # V1 Agent 核心 (tools.py)
│ match_job.py # 规则版 JD 匹配(三档结论)
│ plan_gen.py # 4 周路线生成
│ resume_builder.py # JD 定制简历段
│ job_discovery.py # JD 抓取(含 Playwright 兜底)
│ rag_*.py # RAG + LangGraph 4 节点 + 工具循环
│ career_agent.py # V2 Orchestrator("今天最该做什么")
│ career_flow.py # CareerFlow 10 业务节点 + routed 变体(+4 router)
│ profile_loader.py # V3 状态真实化 + V4 Schema 校验
│
├─ V4 新增模块
│ eval_match.py # match_job 评估 + LLM-as-judge
│ tools_registry.py # OpenAI 兼容 Tool 抽象 + 默认注册表
│ react_agent.py # ReAct Agent(deterministic + LLM)
│ observability.py # JSONL Trace + 重放
│ memory_layers.py # Episodic / Semantic / Procedural
│ profile_schema.json # 13 字段 JSON Schema
│
├─ FastAPI 层
│ rag_api.py # 91 路由 · SSE 流 · Swagger
│ mcp_server.py # 手写 MCP Streamable HTTP 服务端(POST /mcp,工具来自同一 REGISTRY)
│
├─ 工程自检
│ doctor.py # 10 项体检
│ verify_pipeline.py # 6 步冒烟
│ verify_docs.py # 文档口径漂移巡检
│ normalize_applications.py # 投递表 schema 校验
│
├─ 运行时数据(部分入 Git,部分 .gitignore)
│ user_profile.md · daily_log.md · applications.md
│ interview_story_bank.md · application_jds/
├─ 离线回归样例
│ jd_candidates.md(不进入产品 RAG)
│ profiles/p1_demo_ai.json / p2 / p3
│ chroma_db/ · logs/ · memory.json ← .gitignore
│
├─ tests/ # 1,659 tests passed(含 RAG/Agent 工程化故障注入测试)
│
└─ docs/
architecture.md · v3_changelog.md · RESUME_PROJECT.md
verification_report.md · archive/(V1–V2 历史快照)
interview_qa.md · persona_compare_report.md
project_one_pager.md · postmortem.md · ethical_use.md
MEMORY_SYSTEM.md · WECHAT_INTEGRATION.md
requests,SPA 自动回退 Playwright,控制成本同时覆盖主流招聘页REGISTRY 取,不重写 schema(V5 已兑现:mcp_server.py Streamable HTTP)目标:在本地完成 JD → CareerFlow → 简历 → 状态回填 → 复盘闭环。真实投递数据始终留在 Git 忽略的运行时文件中。
1. 临时抽取 JD POST /api/discover → 仅返回结构化结果
2. CareerFlow 评估 POST /api/flow/run → match_report + gaps + today
3. 决策分叉
├─ 适合投递 → §4 生成简历
└─ 其他三档 → plan/4_weeks 中长期补能,本轮不投
4. 生成简历草稿 POST /api/resume/markdown 默认无 LLM 拿骨架
+ POST /api/resume/build SSE 流式 LLM 写定制段
5. 确认登记投递 applications.md 加一行,并绑定不可变 JD 版本
6. 真实投出 状态改 已投递 POST /api/daily 追加日志
7. 回流证据 只保存在本地私密目录,不进入 Git
8. 复盘入 RAG daily_log.md 写 1-2 句 python rag_ingest.py 入库
docs/v3_changelog.mdDEMO_PROFILE 0 生产耦合 · /api/info 与 24 路由 0 漂移 · pytest 64/64完整推进记录见 PROJECT_STATUS.md。
docs/ethical_use.md §1.6user_profile.md 与 interview_story_bank.md 中的真实素材重组、强调和适配 JD,不会编造未发生的项目applications.md / user_profile.md 等用户层文件的关键动作必须 UI 二次确认(详见 DATA_CONTRACT.md §4.0 写入策略表)docs/MULTI_USER_ROADMAP.md)、无登录鉴权 / 限流 / 审计当前代码含 91 个路由装饰器、86 个唯一项目路径(同一路径的不同 HTTP 方法分别注册);完整运行时 Swagger 在
/docs。
| Route | 用途 |
|---|---|
GET / | 重定向到 /ui |
GET /ui | 8 卡片求职工作台(主入口) |
GET /ui/console | V3 CareerFlow 8 步 Stepper |
GET /fonts/{filename} | 展示字体(static/fonts/ 下的 woff2,白名单) |
GET /health | ChromaDB / 知识库健康检查 |
GET /api/info | 元信息 + 路由清单 |
GET /docs | Swagger UI |
| Route | 用途 |
|---|---|
GET /api/profile | 用户画像摘要 |
POST /api/query | RAG 问答(一次性) |
POST /api/stream | RAG 问答(SSE 流式) |
POST /api/search | 仅检索(不生成答案) |
POST /api/match | 岗位匹配(三档结论 + 缺口;use_semantic=true 对齐画像证据) |
| Route | 用途 |
|---|---|
POST /api/plan | 4 周路线规划 |
POST /api/plan/stream | 4 周路线(SSE 流式) |
GET /api/daily | 今日 daily_log + 最近 7 天摘要 |
POST /api/daily | 向 daily_log.md 追加今日条目 |
GET /api/resume | 简历素材聚合 |
POST /api/agent/flows/start | 启动 Plan 或 Resume Review 工作流;简历支持 project_section / full_resume |
POST /api/agent/flows/{thread_id}/resume | 批准、提出修改、保存未评审草稿或拒绝;正式保存前校验 revision |
POST /api/resume/project/stream | 项目经历兼容入口,内部委托给同一 Resume Agent → Critic 工作流 |
POST /api/resume/build 等旧接口 | 轻量兼容接口;Web 简历工坊不再使用这些入口 |
GET /api/today | 今日建议(聚合投递池 + 日志) |
| Route | 用途 |
|---|---|
POST /api/discover | JD 半自动抽取 |
GET /api/jd/queries | 根据 profile 生成搜索关键词组合 |
POST /api/jd/rank | 对一组候选 JD 调 match_job 排序 |
| Route | 用途 |
|---|---|
POST /api/flow/run | CareerFlow 主流程(10 业务节点全状态) |
POST /api/reset | 清空对话历史 |
| Route | 用途 |
|---|---|
POST /api/agent | ReAct Agent(deterministic + LLM 自动降级) |
GET /api/trace | 列最近 N 条 trace |
GET /api/trace/{trace_id} | 读回单条 trace 全部事件 |
POST /api/flow/run_traced | routed CareerFlow + 自动落 JSONL trace |
| Route | 用途 |
|---|---|
POST /mcp | MCP Streamable HTTP 单端点(JSON-RPC:initialize / ping / tools/list / tools/call),暴露 REGISTRY 全部 6 工具 |
个人作品集项目,未配置开源许可。引用或参考请在 issue 中联系。
Built around the discipline of stateful agent engineering.
github.com/zhangrldndx/offerclaw