Badminton-Coach-Agent 是一个面向羽毛球训练与身体恢复场景的垂直 Agent 项目。它的目标不是做通用聊天,而是构建一个能够持续理解用户训练状态、提供赛前建议、赛后复盘和恢复提醒的个人教练系统,并支持趣味性玩法,可以配置多语言风格教练,让陪伴不只是机械式地回复。
项目围绕三个高频场景展开:
- 赛前建议:结合近期训练记录、技术弱项、天气和身体状态,给出训练重点、热身建议和风险提醒
- 赛后复盘:将自然语言复盘整理为结构化观察,提炼问题点、进步点和下次训练重点
- 恢复分析:结合疲劳描述和健康截图,输出训练强度与恢复方向建议
- 持续个性化:不是一次性回答,而是形成“赛前建议 -> 训练 -> 赛后复盘 -> 下次更精准建议”的闭环
- 多层记忆:同时维护叙事型记忆、结构化画像和按日期追加的训练日志
- 多场景 skill 驱动:将赛前、赛后、恢复、路由等能力拆成独立 skills,提升行为稳定性
- 飞书接入:支持在真实 IM 场景中交互,而不是只停留在本地 demo
- 可追溯性:支持 structured logs、离线评测和运行结果回放,便于排障和持续优化
最近这一轮改造,核心不是“给 coach 加一点语气词”,而是把人格能力从零散 prompt 调整成了可扩展的多人格结构。
之前的主要问题有两个:
- 回复虽然能给建议,但经常偏模板化,像说明书、表单或 checklist,不太像一个长期带你的教练
SOUL.md和人格内容耦合在一起,后面如果要加更多人格,或者开放给飞书用户切换,会越来越难维护
这次的实现方式是:
SOUL.md只保留稳定的教练底座:身份、场景边界、安全规则- 具体人格放进
personalities/<personality_id>/persona.md + meta.json - 运行时通过
default_personality和可选personality_id选择人格,同时让 prompt 注入和程序化输出共用同一份 style 配置
这样做之后,当前默认接入的 guodegang 人格,已经能明显把回复从“模板腔”拉回到“像一个熟悉你老毛病的教练”,但风险场景下仍然会主动收口,不会为了像人而牺牲安全边界。后续如果要继续加别的人格,或者在飞书里开放人格切换,也不需要再重做一遍主链路。
更完整的说明见:多人格可扩展教练人格总结
| 改造前:恢复建议偏模板 | 改造后:像教练本人在说话 |
![]() |
![]() |
| 改造前:信息完整,但像报告 | 改造后:更自然,会接上下文继续聊 |
![]() |
![]() |
项目采用 Harness + Runtime + Channel + Memory + Skills 的 Agent 架构:
Runtime:负责一次请求的实际执行,包括上下文装配、能力路由、模型调用和结果返回Channel:负责将飞书消息转换为统一输入结构,并将输出渲染为适合用户消费的卡片或文本Skills:负责组织赛前建议、赛后复盘、恢复分析等垂直能力,避免所有行为都依赖单一大 promptMemory:负责沉淀长期记忆与训练历史,让 Agent 能够跨会话持续个性化
多层记忆设计是这个项目的核心之一:
memory.json:保存叙事型长期记忆,用于保留历史背景和用户偏好coach_profile.json:保存结构化画像,包括技术弱项、身体状态、训练习惯等稳定特征memory/reviews/YYYY-MM-DD.md:按日期追加训练和复盘事件,保留可追溯的时间线
运行时会根据当前意图按需装配这些上下文。例如赛前路径会优先读取 profile、最近训练日志和天气信息;赛后路径会优先抽取技术反馈并回写记忆;恢复路径则更关注疲劳和健康相关输入。
- Python
- LLM Runtime / Agent Harness
- Feishu Channel Integration
- YAML / Markdown 驱动配置
- JSON 文件持久化记忆
- Structured Logging
- Offline Evaluation Scripts
- Pytest
- 通过
skills-driven方式组织 Agent 能力,而不是将所有逻辑堆进一个大 prompt - 通过多层记忆实现“赛后更新、赛前读取”的持续个性化闭环
- 通过 channel 抽象隔离外部消息平台与内部运行时,降低接入耦合
- 通过 structured logs、样本集和评测脚本提升 Agent 系统的可观测性和可迭代性
- 支持 Docker 化部署,现有仓库已提供开发 / 生产两套 compose 编排与部署脚本
- 采用
spec-driven + vibe coding的开发方式,先定义目标、阶段和验收标准,再用 AI 生成和收敛实现,提升输出稳定性
- 开发规格目录:按阶段归档的 spec、tasks 与 checklist
- Coach 运行时资产:Agent 配置、记忆与角色定义
其中
SOUL.md是稳定教练底座,具体人格资产位于personalities/<personality_id>/ - 自定义 Skills:赛前、赛后、恢复和路由能力
- Channel 层:渠道接入、消息转换、提醒与日志
- Coach 领域逻辑:赛前、赛后、恢复、档案等核心实现
- 自动化测试:关键路径回归测试
- 文档与评测资料:阶段总结与评测样本
启动前先确保 .env.feishu.local 已配置好模型和飞书凭证,然后:
Warning
本地调试飞书前,先关闭 VPN、代理软件,或至少确保当前终端进程不走系统代理。 这一步不是可选项,必须先做。 否则飞书 WebSocket 很容易出现“能收到表情、但收不到正文”、“连接失败”、“Socks 代理报错”、“open.feishu.cn 解析失败”等问题。 如果你开着 Clash、Surge、V2Ray、系统代理,先关掉再启动下面的命令。
# 加载环境变量(每次新终端都需要)
source .env.feishu.local
# 确认模型变量已正确加载
echo $DEERFLOW_OPENAI_MODEL # 应输出你当前配置的模型名(例如 GPT-5)
# 停掉旧进程并重启整套服务(推荐)
make stop
./scripts/run-feishu-local.sh --watch-logs服务启动后访问 http://localhost:3000 验证前端,http://localhost:8001 验证网关。
如需分别手动启动三个进程(LangGraph / Gateway / Frontend):
# 终端 1:LangGraph
source .env.feishu.local
./scripts/run-feishu-local.sh --watch-logs
cd backend && NO_COLOR=1 uv run langgraph dev --no-browser --allow-blocking --reload
# 终端 2:Gateway
source .env.feishu.local
./scripts/run-feishu-local.sh --watch-logs
cd backend && PYTHONPATH=. uv run uvicorn app.gateway.app:app --host 0.0.0.0 --port 8001 --reload
# 终端 3:Frontend
source .env.feishu.local
./scripts/run-feishu-local.sh --watch-logs
cd frontend && pnpm run dev常见问题
- 模型请求 500:确认
.env.feishu.local里的DEERFLOW_OPENAI_BASE_URL、DEERFLOW_OPENAI_API_KEY、DEERFLOW_OPENAI_MODEL三者匹配;不要再按旧文档写死qwen3.5-plus - 飞书连接失败:先关 VPN、Clash、Surge、V2Ray 和系统代理,再重启服务;如果终端里残留了
ALL_PROXY/HTTP_PROXY/HTTPS_PROXY,也要一起清掉 - 飞书事件报
processor not found:去飞书开放平台后台取消im.message.reaction.created_v1事件订阅
项目已经内置 Docker 部署能力:
- 开发环境:
docker/docker-compose-dev.yaml - 生产环境:
docker/docker-compose.yaml - 生产部署脚本:
scripts/deploy.sh - Makefile 快捷命令:
make up/make down
如果你是第一次上服务器,建议先看:
这次在 Ubuntu 服务器上已经完成了这些工作:
- 登录服务器并确认现有网站占用了
80/443,因此本项目不直接复用这两个端口。 - 将项目上传到独立目录
/home/ubuntu/projects/note-agent,避免影响已有服务。 - 将运行数据目录独立到
/home/ubuntu/data/deer-flow,避免 repo 更新时丢失 memory / thread 数据。 - 将飞书相关环境变量并入部署用
.env,让docker compose能正确读取。 - 使用现有生产脚本
./scripts/deploy.sh启动 Docker 生产栈。 - 为了避免服务器拉取
ghcr.io/astral-sh/uv极慢,额外调整了后端 Dockerfile,让后端镜像改为直接安装uv。
补充说明:
- 这次确实跑了 Docker 生产流水线构建,不是只把代码拷上去。
frontend镜像已经成功构建。gateway/langgraph构建走的是docker compose up --build -d生产链路。- 整个过程没有动现有跑在
80/443的网站。
如果服务器上已经有项目目录,后续日常更新建议按下面步骤:
# 1. 登录服务器
ssh ubuntu@<server_ip>
# 2. 进入项目目录
cd /home/ubuntu/projects/note-agent
# 3. 更新代码
git pull
# 4. 设置部署环境变量
export DEER_FLOW_HOME=/home/ubuntu/data/deer-flow
export DEER_FLOW_CONFIG_PATH=/home/ubuntu/projects/note-agent/config.yaml
export DEER_FLOW_EXTENSIONS_CONFIG_PATH=/home/ubuntu/projects/note-agent/extensions_config.json
export DEER_FLOW_REPO_ROOT=/home/ubuntu/projects/note-agent
export DEER_FLOW_DOCKER_SOCKET=/var/run/docker.sock
export PORT=2026
# 5. 重新构建并启动生产容器
sudo -E ./scripts/deploy.sh如果只是下线:
cd /home/ubuntu/projects/note-agent
export DEER_FLOW_HOME=/home/ubuntu/data/deer-flow
export DEER_FLOW_CONFIG_PATH=/home/ubuntu/projects/note-agent/config.yaml
export DEER_FLOW_EXTENSIONS_CONFIG_PATH=/home/ubuntu/projects/note-agent/extensions_config.json
export DEER_FLOW_REPO_ROOT=/home/ubuntu/projects/note-agent
export DEER_FLOW_DOCKER_SOCKET=/var/run/docker.sock
sudo -E ./scripts/deploy.sh down查看容器状态:
cd /home/ubuntu/projects/note-agent
export DEER_FLOW_HOME=/home/ubuntu/data/deer-flow
export DEER_FLOW_CONFIG_PATH=/home/ubuntu/projects/note-agent/config.yaml
export DEER_FLOW_EXTENSIONS_CONFIG_PATH=/home/ubuntu/projects/note-agent/extensions_config.json
export DEER_FLOW_REPO_ROOT=/home/ubuntu/projects/note-agent
export DEER_FLOW_DOCKER_SOCKET=/var/run/docker.sock
export BETTER_AUTH_SECRET=placeholder
sudo -E docker compose -p deer-flow -f docker/docker-compose.yaml ps查看日志:
cd /home/ubuntu/projects/note-agent
export DEER_FLOW_HOME=/home/ubuntu/data/deer-flow
export DEER_FLOW_CONFIG_PATH=/home/ubuntu/projects/note-agent/config.yaml
export DEER_FLOW_EXTENSIONS_CONFIG_PATH=/home/ubuntu/projects/note-agent/extensions_config.json
export DEER_FLOW_REPO_ROOT=/home/ubuntu/projects/note-agent
export DEER_FLOW_DOCKER_SOCKET=/var/run/docker.sock
export BETTER_AUTH_SECRET=placeholder
sudo -E docker compose -p deer-flow -f docker/docker-compose.yaml logs -f gateway
sudo -E docker compose -p deer-flow -f docker/docker-compose.yaml logs -f langgraph补充几个运维 tradeoff:
- 正式跑 Docker 生产栈时,不需要依赖
screen保活,容器本身就是后台进程。 screen仍然可以保留给你看日志或做长时间 SSH 运维会话。- 如果服务器上已有网站占用
80/443,建议先像现在这样把本项目挂到2026端口,确认稳定后再考虑域名和 HTTPS。
cd backend
source .env.feishu.local
uv run pytest -q tests/test_channels.py tests/test_skills_loader.py tests/test_coach_prematch_rules.py如果你想先了解整体设计和阶段划分,建议先看 dev-spec/,默认从最新版本阶段开始。



