English | 中文
一个用于“从零实现最小可用 Agent”面试题的 Python 学习计划助手。输入学习目标和每天可用时间,Agent 自主查找模拟课程、读取课程大纲、计算学习天数,并支持同会话追问和多个独立窗口。
**核心 Agent Runtime 自行实现,不依赖 LangGraph、OpenHands、OpenClaw 等 Agent 框架。**课程 search 为明确标注的 mock;正式模型请求使用真实 LLM API。前端一期功能完成,界面美化尚未开展。
从项目根目录运行 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 接入说明。
可编辑 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 秒。工具错误作为结果返回后续循环;达到限制时报告未完成,不假装成功。
每次用户请求及内部循环构造 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 页面累计两轮素材采集用量,而非只包含视频这一轮。
.\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 是制作工具,不是应用运行依赖。
- 交付材料清单与阅读顺序
- 开发文档索引
- 后端 API · 前端一期说明
- 逐项验收报告
- 干净环境复现报告
- DeepSeek 真实验证报告
- 前端一期报告
- 本次图文视频整理报告
- AI Prompt 与问题解决记录
- 当前状态与恢复入口
此前69通过、1错误的历史报告保留。已稳定复现并修复连接收尾:先发送错误响应,再半关闭发送方向,最多用250毫秒清理1 MiB残余正文。当前 75/75通过,见修复报告。截图视频保留原录制日期,本次修复不改变页面或Agent主循环。
正常聊天保留并区分角色;文件、附件和项目规则只留名称。架构设计题 DOCX 按最新授权单独公开;旧日志仍仅本机保留、已忽略。公开仓库从当前审核版本建立独立 Git 历史,不包含含原件的旧本地提交。



























