frontend/:Vue 3 + Vite 前端backend/:Deno 后端(API + 生产静态托管)data/:简历数据源(resume.json)
- 开发模式(前后端分离)
- 前端:
http://localhost:5173 - 后端 API:
http://localhost:8000
- 前端:
- 生产模式
- 后端直接托管
frontend/dist - 同时提供
/api/*
- 后端直接托管
后端会自动加载 .env / .env.local,示例见 .env.example。
常用变量:
MOONSHOT_API_KEYMOONSHOT_BASE_URLMOONSHOT_MODELZHIPU_API_KEYZHIPU_BASE_URLZHIPU_MODELCHAT_PROVIDERAPI_HOSTAPI_PORTALLOWED_ORIGINCHAT_STREAM_FIRST_TOKEN_MAX_LATENCY_MSCHAT_STREAM_MIN_TOKEN_EVENTS
开发(前后端一起启动):
deno task dev仅启动后端 API:
deno task dev:api构建前端:
deno task build生产启动(托管 frontend/dist + API):
deno task startDocker 本地构建:
docker build -t resume-app:local .Docker 本地运行:
docker run --rm -p 8000:8000 -e API_PORT=8000 resume-app:local本地防护仿真:
deno task simulate:guardGET /api/profilePOST /api/chatPOST /api/chat/stream(SSE 流式)
后端支持两个 OpenAI 兼容提供方:
kimi(默认)zhipu(默认模型GLM-4.7-Flash)
选择优先级:
- 请求体里的
provider - 环境变量
CHAT_PROVIDER - 默认回退
kimi
请求示例:
{
"message": "请介绍一下候选人的项目经验",
"history": [],
"provider": "zhipu"
}POST /api/chat/stream 现在采用统一适配层,默认策略为:
- provider
native流式优先 - 初始化失败时自动 fallback 到
compatible流式
后端会输出结构化日志(STREAM_QUALITY)用于判断是否“真流式”,关键字段:
request_idprovider/modelprovider_mode(native/compatible)fallback_reasonfirst_token_latency_mstoken_event_counttoken_gap_ms_p95stream_duration_msdegraded_streaming
当出现以下任一条件时会标记 degraded_streaming=true:
token_event_count <= CHAT_STREAM_MIN_TOKEN_EVENTSfirst_token_latency_ms > CHAT_STREAM_FIRST_TOKEN_MAX_LATENCY_MS
可使用 curl --no-buffer 脚本做端到端冒烟:
bash scripts/stream-smoke.sh常用参数:
API_BASE_URL(默认http://localhost:8000)PROVIDER(kimi/zhipu)MESSAGE
- 若首 token 很慢或只出现 1 个 token 事件,先看
STREAM_QUALITY中provider_mode与fallback_reason。 - 若部署在 Nginx,确认已关闭缓冲:
proxy_buffering off;,并保留响应头X-Accel-Buffering: no。 - 用
scripts/stream-smoke.sh分别对kimi、zhipu重复采样,比较first_token_latency_ms与token_event_count。
- 工作流文件:
.github/workflows/ghcr-release.yml - 触发条件:推送 tag
v*(例如v1.2.3) - 镜像地址:
ghcr.io/<owner>/<repo> - 标签规则:
- 原始 tag:
v1.2.3 - 语义化 tag:
1.2.3(自动去掉v前缀) - 稳定 tag:
latest(当 tag 不包含-预发布后缀时)
- 原始 tag:
示例发布:
git tag v1.2.3
git push origin v1.2.3拉取示例:
docker pull ghcr.io/<owner>/<repo>:v1.2.3
docker pull ghcr.io/<owner>/<repo>:1.2.3执行 deno task simulate:guard 后,重点看这几行:
phase=staging-loose:低流量场景,用于观察误伤率是否足够低。phase=prod-stage-1/2/3:逐步收紧阈值后,allowed应持续下降。- 出现
simulation=passed表示本地仿真通过。