OfferGuide 是一个面向中文求职场景的本地优先 agent。它围绕用户的目标、简历、岗位、投递状态和反馈持续维护自己的状态,并在每次 wake 时决定下一步是行动、追问、通知还是等待。
截图来自临时本地 demo 数据库,只展示示例岗位与 agent 状态。
项目当前的重点是让 agent 拥有可恢复的世界状态:
worldview: 用户画像、策略、开放回路、复盘和长期记忆agent_work_items: agent 正在处理、等待、阻塞或已停止关注的工作项harness_runs: 每次运行的触发、工具调用、状态和成本记录harness_events: 投递、评分、面试、反馈等事实事件scheduled_wakes: agent 自己留下的未来检查点
UI 是这些状态的观察窗口。用户可以从页面查看和修正状态,但主路径应从 Agent Chat 开始。
| 入口 | 路径 | 用途 |
|---|---|---|
| Mission Control | / |
agent 当前状态、开放工作、输入框和近期活动 |
| Pipeline | /pipeline |
候选岗位、投递状态、应用时间线和转化概览 |
| Tailor | /tailor |
简历上下文、定向修改建议和项目事实引用 |
| Interviews | /interviews |
面试准备、面经、复盘上下文 |
| Agent Runs | /agent/runs/{id} |
单次 agent 运行轨迹和工具调用 |
| Lab / Debug | /evolution, /debug, /metrics |
SKILL 演化、调试和系统观测 |
部分旧路由仍保留兼容,例如 /recommended, /applications, /funnel, /jobs, /compare, /mock, /reflect。它们会逐步收敛为 Pipeline / Tailor / Interviews 下的状态切面或详情页。
推荐用 uv:
git clone https://github.com/huy555huy/OfferGuide.git
cd OfferGuide
uv sync --extra dev --extra ui --extra evolution --extra scheduling
cp .env.example .env编辑 .env:
OFFERGUIDE_LLM_API_KEY="sk-..."
OFFERGUIDE_RESUME_PDF="/path/to/your/resume.docx"
# 可选: web search / proactive discovery
TAVILY_API_KEY="tvly-..."
# 可选: OpenAI-compatible endpoint / model
OFFERGUIDE_LLM_BASE_URL="https://api.deepseek.com"
OFFERGUIDE_LLM_MODEL="deepseek-chat"启动 Web UI:
uv run python -m offerguide.ui.web默认地址:
http://127.0.0.1:8000
如果端口被占用:
OFFERGUIDE_PORT=8770 uv run python -m offerguide.ui.web不启用后台 scheduler / ambient crawl:
OFFERGUIDE_NO_SCHEDULER=1 uv run python -m offerguide.ui.web也可以用 pip:
python -m venv .venv
source .venv/bin/activate
pip install -e ".[dev,ui,evolution,scheduling]"
python -m offerguide.ui.web主运行时在 src/offerguide/agent_runtime:
| 文件 | 作用 |
|---|---|
loop.py |
单线程 agent loop: build context -> LLM tool call -> dispatch -> continue / stop |
instructions.md |
agent 的运行契约,包含 Observe / Agenda / Decide / Act / Verify / Sleep |
context.py |
每次 wake 注入系统事实、active goals、work items、agenda、worldview memory |
_schema.py |
运行时表: runs, events, scheduled wakes, work items |
tools.py |
main-agent 工具 schema 和 dispatch |
memory.py |
.offerguide/worldview/*.md 的读写工具 |
triggers.py |
user input / event / scheduled / cron 触发 |
每次运行的大致过程:
trigger
-> materialize work item
-> build system context
-> model chooses tools
-> tools update DB / worldview / inbox / wakes
-> agent updates work item state
-> run record is persisted
agent_work_items 是 agent 自己的注意力账本。状态包括:
open -> in_progress -> done
-> waiting
-> blocked
-> dismissed
完成、等待、阻塞和丢弃都必须写回 durable state。下一次 wake 只应看到仍需继续处理的工作。
默认目录:
.offerguide/worldview/
关键文件:
| 文件 | 内容 |
|---|---|
MEMORY.md |
agent 的主页和跨 wake 摘要 |
agenda.md |
开放回路、阻塞、机会和安静等待项 |
candidate.md |
用户画像、简历事实、偏好和边界 |
tracked-jobs.md |
关注中的岗位和判断 |
upcoming-events.md |
面试、deadline、follow-up |
reflections.md |
agent 对自己行为和用户反馈的复盘 |
strategy.md |
当前求职策略和项目策略 |
这些文件会进入 agent 的上下文,影响下一次 wake 的判断。
OfferGuide 当前包含以下能力:
- JD ingestion: 用户粘 URL 或 JD 文本后进入 jobs 表
- Match scoring: 基于候选人事实和 JD 事实评估匹配
- Resume tailoring: 生成有证据边界的定向修改建议
- Project Vault: 保存项目事实、可讲边界和不可声称内容
- Interview prep: 面试上下文、准备重点和复盘记录
- Pipeline tracking: considered / applied / interview / rejected / offer 等状态
- Scheduled wakes: follow-up、deadline、等待事项的未来检查点
- Skill evolution: 基于用户反馈、应用结果和 follow-through 信号维护 SKILL variants
- Browser extension: 从 BOSS 页面提取 JD / 推荐列表并同步到本地服务
原则上, 用户手动粘 JD 是兜底和监督信号, 不是理想主路径。OfferGuide 应主动发现 用户目标内的岗位; 当用户自己带来 JD 时, agent 需要服务眼前岗位, 也要反查为什么 这类机会没有先出现在候选池里。
加载方式:
Chrome -> chrome://extensions -> Developer mode -> Load unpacked -> browser_extension/
后端需要先运行:
uv run python -m offerguide.ui.web扩展主要负责把页面上的 JD 或推荐列表交给本地 OfferGuide 服务。发送、投递和最终决定仍由用户确认。
src/offerguide/
agent_runtime/ # 主 agent runtime
agents/ # 子 agent 基类、discovery、evaluation
skills/ # SKILL.md 单元和 SkillRuntime
evolution/ # SKILL variant、fitness、release cycle
tools/ # 工具注册和 discovery/evaluation 工具
workers/ # scout / tracker / ambient workers
autonomous/ # scheduler 和后台 job
platforms/ # nowcoder / official_jobs / shixiseng / zerovoice 等来源
memory/ # SQLite store 和 sqlite-vec
profile/ # 简历读取
ui/ # FastAPI + Jinja UI
browser_extension/ # Chrome extension
docs/ # 设计记录、审计、dogfood 和研究材料
tests/ # pytest 测试
PROGRESS.md # 当前进度和 handoff
test-results.json # 长任务验证状态
运行测试:
uv run pytest -q运行 runtime 相关测试:
uv run pytest \
tests/test_w15_harness.py::TestToolDispatch \
tests/test_w15_harness.py::TestHarnessLoop \
tests/test_w15_harness.py::TestTriggers \
tests/test_w15_harness.py::TestContextManager \
tests/test_evidence_first_context.py \
-q检查格式类问题:
git diff --check查看当前项目目标和过程记录:
docs/goal_real_agent_2026-05-16.md
docs/feature_necessity_audit_2026-05-16.md
PROGRESS.md
常用环境变量:
| 变量 | 说明 |
|---|---|
OFFERGUIDE_LLM_API_KEY |
OpenAI-compatible LLM API key |
OFFERGUIDE_LLM_BASE_URL |
LLM API base URL |
OFFERGUIDE_LLM_MODEL |
默认模型 |
OFFERGUIDE_RESUME_PDF |
用户简历路径,支持 pdf / docx |
TAVILY_API_KEY |
web search / discovery |
OFFERGUIDE_DB |
SQLite DB 路径,默认 .offerguide/store.db |
OFFERGUIDE_PORT |
Web 端口,默认 8000 |
OFFERGUIDE_NO_SCHEDULER |
设为 1 时关闭 in-process scheduler |
OFFERGUIDE_NOTIFY |
console, feishu, telegram |
当前主线已经完成:
- redesign shell 接入核心页面
- Pipeline / Tailor / Interviews 的 IA 初步收敛
- active goals / agenda / worldview 注入 agent context
agent_work_itemsdurable stateupdate_work_item工具,支持 done / waiting / blocked / dismissed- feature necessity audit 和 real-agent 过程记录
最近一次完整验证:
866 passed, 2 skipped
下一步优先级:
- 用真实 JD 做端到端 dogfood: user input -> work item -> tools -> state reference -> work item status update
- 继续收敛旧的一等入口,把它们并入 Pipeline / Tailor / Interviews 的状态切面
- 补齐用户 candidate facts,再扩大主动 discovery
MIT. See LICENSE.
