Skip to content

Repository files navigation

Python 学习计划 Agent

English | 中文

一个用于“从零实现最小可用 Agent”面试题的 Python 学习计划助手。输入学习目标和每天可用时间,Agent 自主查找模拟课程、读取课程大纲、计算学习天数,并支持同会话追问和多个独立窗口。

**核心 Agent Runtime 自行实现,不依赖 LangGraph、OpenHands、OpenClaw 等 Agent 框架。**课程 search 为明确标注的 mock;正式模型请求使用真实 LLM API。前端一期功能完成,界面美化尚未开展。

快速开始(Windows x64)

从项目根目录运行 PowerShell。无需预装外部 Python;安装脚本下载并校验项目指定的 Python 3.12.7。

powershell -NoProfile -ExecutionPolicy Bypass -File .\scripts\setup-python.ps1
.\venv\Scripts\python.exe -m pip install -r config\requirements.txt

# 仅首次使用时创建;不覆盖已有凭据
if (!(Test-Path config\ai\api_keys_v0002.yml)) {
    Copy-Item config\ai\api_keys_v0002.example.yml config\ai\api_keys_v0002.yml
}
if (!(Test-Path config\ai\ollama_config_v0001.yml)) {
    Copy-Item config\ai\ollama_config_v0001.example.yml config\ai\ollama_config_v0001.yml
}

将两份正式 YAML 的 kind: example 改成 kind: runtime,然后启动:

.\venv\Scripts\python.exe scripts\backend\server_v0001.py
# 或双击 software\start_frontend_v0001.cmd,自动打开网页

打开 http://127.0.0.1:8765。进入“模型与密钥”,选择供应商,填写账户可用的模型名称和 Key,选择 inline/environment,勾选供应商开关,先保存,再启用所选路由。本次 DeepSeek 演示使用 deepseek-flash;请以自己账户的实际可用模型为准。OpenAI、Kimi、Ollama 也有配置位,不代表全部完成了真实生成验证。

  • inline:Key 保存在本机正式 YAML;文件已被 Git 忽略。
  • environment:可以读取启动进程继承的环境变量;界面输入的 Key 仅当前后端进程有效,重启后需重新提供。
  • 切换到 environment 并保存会清除原 inline 值;切回 inline 需重新填写。
  • 空配置可打开界面;聊天报 MODEL_NOT_CONFIGURED,不偷偷切换模拟模型。
  • Ollama 检测会显示阶段进度,不自动安装、启动服务或下载模型。

更多配置、超时与错误码见 配置使用说明 和 LLM 接入说明。

Runtime 与系统设计

Runtime 流程图

可编辑 SVG 源文件。这是依据当前源码绘制的控制流图,不是外部 Agent 框架。

部分 实际职责
前端 原生 HTML/JS/CSS,同源请求;会话、配置、检测、日志、Token
HTTP 入口 输入与身份校验、会话 API、前端静态文件
Runtime 每请求固定模型、每轮构造 Context、解析决策、调度工具、有界结束
Tool Registry 注册名称、描述、参数 Schema;校验后执行 calculator、search、read_docs
模型层 ConfiguredModel → AIController → 云端兼容接口或本机 Ollama
存储 SQLite 保存会话、原始消息、请求、摘要、Trace;可读日志写 docs/logs

模型输出使用严格 JSON,区分 tool/final;reason 是简短可见的决策说明,不依赖隐藏思维链。无效 JSON 允许一次纠正。默认最多 8 步、单次模型 30 秒、请求总预算 120 秒。工具错误作为结果返回后续循环;达到限制时报告未完成,不假装成功。

Memory 召回时机与放置

每次用户请求及内部循环构造 Context 时,按当前用户和 Session 从 SQLite 召回状态。顺序为:系统规则与工具 Schema → 历史摘要(作为数据)→ 近期对话和当前请求的动作、工具结果。

超过 UTF-8 字节预算时,按完整的旧请求组做基础抽取式压缩,优先保留初始目标、用户约束和工具事实;原始记录不删除。摘要以 truncated 标记说明删减;当前请求仍放不下时受控结束。不使用向量数据库,不把一个会话的记忆自动注入另一个会话。

高清操作视频

实际浏览器操作录屏,无配音;1920×1080、25 fps、H.264 MP4。主流程约 76 秒,第二标签页独立会话约 17 秒。录屏按标签页分开保存,第二个视频补充展示步骤 22;没有将模拟结果伪装成真实模型输出。

播放主流程视频

打开或下载主流程高清视频

播放独立会话视频

打开或下载独立会话高清视频

支持 HTML video 的 Markdown 阅读器可直接播放;GitHub README 可能过滤播放器,请点击封面或文件链接。视频文件随仓库提供,点击文件链接即可查看或下载。

每一步实际操作截图

以下 27 张截图与视频来自同一轮操作,按每次点击、填写、切换、保存、发送和等待结果分别留存。截图宽度为 1920 像素,长页面保留完整高度。界面目前为中文,英文 README 使用同一组真实图片并提供英文说明。

演示在隔离副本和独立数据库中完成,不修改日常配置。inline 步骤只展示切换后的表单,实际保存和调用采用 environment。Ollama 为本机真实检测;完成很快时,中间截图可能已显示 100%,没有人为伪造等待。所有 Key 均以密码框遮蔽。Token 页面累计两轮素材采集用量,而非只包含视频这一轮。

1. 打开首页,后端已连接,自动建立演示会话

打开首页,后端已连接,自动建立演示会话

2. 点击“模型与密钥”

点击“模型与密钥”

3. 选择 DeepSeek 供应商

选择 DeepSeek 供应商

4. 填写当前账户可用的模型名称

填写当前账户可用的模型名称

5. 切换为 inline,查看本机保存方式;此步不保存

切换为 inline,查看本机保存方式;此步不保存

6. 切回 environment,使用进程环境变量

切回 environment,使用进程环境变量

7. 填写本次演示的环境变量名称

填写本次演示的环境变量名称

8. 在密码框输入 Key;截图中保持遮蔽

在密码框输入 Key;截图中保持遮蔽

9. 勾选启用此供应商配置

勾选启用此供应商配置

10. 保存配置,Key 输入框清空,不回显密钥

保存配置,Key 输入框清空,不回显密钥

11. 启用 DeepSeek 路由,后续请求使用所选模型

启用 DeepSeek 路由,后续请求使用所选模型

12. 点击检测本机 Ollama;保留此时真实进度

点击检测本机 Ollama;保留此时真实进度

13. 检测结束,查看本机实际结果;不自动安装或下载

检测结束,查看本机实际结果;不自动安装或下载

14. 返回会话与计划

返回会话与计划

15. 输入学习目标、每天45分钟及资料查询请求

输入学习目标、每天45分钟及资料查询请求

16. 发送学习计划请求,界面显示执行状态

发送学习计划请求,界面显示执行状态

17. 收到计划与 Trace:实际经过 search、read_docs、calculator

收到计划与 Trace:实际经过 search、read_docs、calculator

18. 在同一会话输入每天30分钟的追问

在同一会话输入每天30分钟的追问

19. 发送追问,复用当前会话历史

发送追问,复用当前会话历史

20. 收到调整后的6天计划与本轮工具轨迹

收到调整后的6天计划与本轮工具轨迹

21. 刷新页面,原会话与两次回答仍保留

刷新页面,原会话与两次回答仍保留

22. 打开第二个标签页,得到独立会话,不混入上一窗口历史

打开第二个标签页,得到独立会话,不混入上一窗口历史

23. 切回第一个标签页,继续查看原计划

切回第一个标签页,继续查看原计划

24. 打开 Token 用量,查看按模型累计的实际返回数值

打开 Token 用量,查看按模型累计的实际返回数值

25. 刷新 Token 统计

刷新 Token 统计

26. 打开可读运行日志,查看调用与工具执行记录

打开可读运行日志,查看调用与工具执行记录

27. 刷新运行日志

刷新运行日志

验证结果与边界

.\venv\Scripts\python.exe -B -m unittest discover -s tests -v
# 显式真实 API 冒烟测试,会产生模型调用费用
.\venv\Scripts\python.exe -B scripts\backend\test_deepseek_live_v0001.py --run
  • 当前75项自动化测试全部通过:核心34、模型接入18、前端配套服务18、HTTP收尾回归5;使用模拟模型/本机替身,不是75次真实调用。
  • DeepSeek 已有直答、三工具循环、工具追问、会话隔离真实证据;本次录屏再次完成课程计划与追问。
  • 干净目录复现 70/70 通过,重新下载 Python、安装依赖、启动页面、真实工具调用及重启恢复均通过。这是同机 Windows 验证,不是全新系统验收。
  • 历史HTTP 403/413路径曾出现WinError 10053,现已定位并修复提前拒绝后的连接收尾时序缺陷,针对性及完整回归通过;历史证据保留。
  • 本机 X-User-ID 只用于身份隔离演示,不是公网认证;不提供跨域访问。
  • 工具时限在工具返回后检测,不承诺强制中断任意阻塞函数;DNS 解析受操作系统影响。
  • 公开代码仓库:ailoha_vibe_coding_test;界面美化不是题干硬性要求。

目录与材料

目录 内容
scripts/backend、scripts/frontend 分离的后端与前端实现
scripts/archive 格式示例、素材采集辅助脚本
config/ai example 和被忽略的本机正式配置
tests 自动化测试与浏览器验证脚本
software Windows 启动 CMD
sql 本地 SQLite 数据库,不提交
picture Runtime 图和完整操作截图
docs/videos 高清演示视频
docs/development、docs/summary、docs/evidence 开发依据、报告和验证证据
venv 项目专用 Python,不提交

脚本名及注释头保留 v0001,Git 管理修订历史。核心只用 Python 标准库;PyYAML 6.0.3 用于配置解析。浏览器采集所用 Playwright/FFmpeg 是制作工具,不是应用运行依赖。

最新修复与复测(2026-09-23)

此前69通过、1错误的历史报告保留。已稳定复现并修复连接收尾:先发送错误响应,再半关闭发送方向,最多用250毫秒清理1 MiB残余正文。当前 75/75通过,见修复报告。截图视频保留原录制日期,本次修复不改变页面或Agent主循环。

补充材料

正常聊天保留并区分角色;文件、附件和项目规则只留名称。架构设计题 DOCX 按最新授权单独公开;旧日志仍仅本机保留、已忽略。公开仓库从当前审核版本建立独立 Git 历史,不包含含原件的旧本地提交。

About

ailoha vibe coding 面试测试:从零实现 Python 学习计划 Agent

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages