Files
hack/tools/scripts/llm-key-hunter/results/_cache/content/1420079678-ctrl_zhiyuxing-ai-assistant.json

1 line
293 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"repo": "1420079678-ctrl/zhiyuxing-ai-assistant", "files": {"docs/usage-guide.md": {"ae16815c4abd513e54177647e0738b109a8a5ee5": {"t": 1785746500.0084815, "n": 4526, "h": "01b6c25df24f8288", "c": "# 使用说明\n\n[中文](usage-guide.md) | [English](usage-guide.en.md)\n\n这份文档用于说明项目的运行方式、环境变量和常见问题,方便直接启动和继续开发。\n\n## 运行模式\n\n### 1. 本地演示模式\n\n- 默认可用\n- 不要求配置 `OPENAI_API_KEY`\n- `/chat` 会返回内置的支持性建议\n- 会结合本地知识库、会话记忆和风险规则生成演示回复\n- 适合先验证页面、接口和整体流程\n\n### 2. 模型调用模式\n\n- 需要配置与当前模型匹配的密钥变量\n- 支持 `OPENAI_API_KEY`\n- 也支持 `DEEPSEEK_API_KEY`\n- 可选配置 `OPENAI_BASE_URL`、`MODEL_NAME`、`MODEL_PROVIDER`、`MODEL_API_KEY_ENV`\n- `/chat` 会调用 OpenAI 兼容接口返回模型回复\n- 适合继续验证真实模型能力\n\n## 环境变量\n\n可参考仓库根目录的 `.env.example`。\n\n| 变量名 | 说明 | 是否必填 |\n| --- | --- | --- |\n| `OPENAI_API_KEY` | OpenAI 兼容接口密钥,留空时自动进入本地演示模式 | 否 |\n| `DEEPSEEK_API_KEY` | DeepSeek 密钥,未设置 `OPENAI_API_KEY` 时会回退使用 | 否 |\n| `OPENAI_BASE_URL` | OpenAI 兼容接口地址 | 否 |\n| `MODEL_NAME` | 调用的模型名称 | 否 |\n| `MODEL_PROVIDER` | 页面展示用的提供商名称,例如 `OpenAI` / `DeepSeek` | 否 |\n| `MODEL_API_KEY_ENV` | 当前模型优先读取哪个密钥变量,例如 `OPENAI_API_KEY` / `DEEPSEEK_API_KEY` | 否 |\n| `MODEL_TEMPERATURE` | 温度参数 | 否 |\n| `DEMO_MODE` | 设置为 `true` 时强制使用本地演示模式 | 否 |\n| `CHAT_DB_PATH` | 本地 SQLite 会话库路径,默认写入 `data/zhiyuxing.db` | 否 |\n| `KNOWLEDGE_UPLOAD_DIR` | 自定义知识文档写入目录,默认写入 `data/knowledge_uploads` | 否 |\n\n## 本地启动\n\n### 1. 创建虚拟环境并安装依赖\n\n```bash\npython -m venv .venv\n.venv\\Scripts\\activate\npython -m pip install -r requirements.txt -r requirements-dev.txt\n```\n\n### 2. 一键配置模型\n\n优先推荐直接运行一键脚本:\n\n```powershell\n.\\setup-openai.ps1\n.\\setup-deepseek-chat.ps1\n.\\setup-deepseek-r1.ps1\n```\n\n也可以双击对应的 `.bat` 文件。\n\n这些脚本会自动:\n\n- 初始化 `.env`\n- 写入当前模型所需的 `OPENAI_BASE_URL`\n- 写入 `MODEL_NAME`、`MODEL_PROVIDER`\n- 自动设置 `MODEL_API_KEY_ENV`\n- 尽量保留现有密钥和其他环境变量\n\n这几个脚本不是免 Key 调用,只是把模型接入配置一次写好:\n\n- `.\\setup-openai.ps1`:真实调用需要 `OPENAI_API_KEY`\n- `.\\setup-deepseek-chat.ps1`:真实调用需要 `DEEPSEEK_API_KEY`\n- `.\\setup-deepseek-r1.ps1`:真实调用需要 `DEEPSEEK_API_KEY`\n\n如果你没有填写对应 Key,项目也不会坏掉,只是会继续运行在本地演示模式。\n\n### 3. 手动配置环境变量\n\n```powershell\nCopy-Item .env.example .env\n```\n\n### 4. 启动前检查\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py\n```\n\n它会检查:\n\n- 当前模型会读取哪个 API Key\n- 当前 `.env` 是否真的能进入真实模型调用模式\n- 当前 `OPENAI_BASE_URL` 和 `MODEL_NAME` 是否存在明显错配\n- `deepseek-reasoner` 的参数兼容规则是否已处理\n\n如果已经配置了真实密钥,还可以继续执行:\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py --probe\n```\n\n这会实际发起一次最小模型请求,用来验证当前 API 是否真的能被本项目正常调用。\n\n### 5. 启动服务\n\n```bash\npython -m uvicorn app:app --reload\n```\n\n如果系统环境里缺少依赖,优先使用仓库虚拟环境:\n\n```powershell\n.\\.venv\\Scripts\\python -m uvicorn app:app --reload\n```\n\n也可以直接运行:\n\n```powershell\n.\\start-web.ps1\n```\n\n或者双击根目录的 `start-web.bat`。\n\n## 常用地址\n\n- `/`:Web 页面入口\n- `/chat`:对话接口\n- `/health`:健康检查\n- `/api/meta`:服务元信息与当前运行模式\n- `/api/compatibility`:模型接入兼容检查\n- `/api/knowledge/search?q=关键词`:本地知识库检索\n- `/api/knowledge/documents`:列出或写入知识文档\n- `/api/session/{session_id}`:最近会话历史\n- `/api/feedback`:提交回复反馈\n- `/docs`:Swagger 文档\n- `/project-docs/model-integration.md`:不同模型接入说明\n- `/project-docs/dingtalk-integration.md`:钉钉接入说明\n- `/project-docs/api-reference.md`:接口参考\n\n## 常见问题\n\n### 为什么没配 API Key 也能返回结果?\n\n因为项目默认支持本地演示模式。这样仓库拿下来后可以直接跑通流程,不会因为缺少密钥导致页面不可用。\n\n当前演示模式也不是只有固定一句模板,而是会结合:\n\n- 最近会话记录\n- 本地知识库片段\n- 风险检测规则\n\n### 一键脚本是不是代表不用 API Key?\n\n不是。一键脚本只是把 `.env` 写成对应模型的推荐配置。\n\n- OpenAI 预设仍然需要 `OPENAI_API_KEY`\n- DeepSeek 预设仍然需要 `DEEPSEEK_API_KEY`\n\n如果 Key 留空,项目会自动回退到本地演示模式,所以页面仍然能返回内容,但那不是线上模型真实回复。\n\n### 为什么配置了 API Key 还是走本地演示模式?\n\n先检查 `.env` 中的 `DEMO_MODE` 是否被设置为 `true`。如果是,系统会优先使用本地演示模式。\n\n再检查当前模型是不是在读取正确的密钥变量。现在项目会优先按 `MODEL_API_KEY_ENV` 读取密钥,而不是只看有没有任意一个 Key。最稳的方式是直接运行:\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py\n```\n\n### 为什么明明填了 `OPENAI_API_KEY`,切到 DeepSeek 还是可能失败?\n\n因为 DeepSeek 默认应读取 `DEEPSEEK_API_KEY`,而不是只要有任意一个 Key 就算配置完成。\n\n当前项目已经补上了这层判断:\n\n- 切到 OpenAI 时,会优先读取 `OPENAI_API_KEY`\n- 切到 DeepSeek 时,会优先读取 `DEEPSEEK_API_KEY`\n- 如果你接的是其他 OpenAI 兼容供应商,可以手动设置 `MODEL_API_KEY_ENV`\n\n### 为什么系统环境里跑 `python -m pytest` 失败?\n\n通常是因为全局 Python 没安装测试依赖。优先使用仓库虚拟环境中的解释器,例如:\n\n```bash\n.\\.venv\\Scripts\\python -m pytest -q\n```\n\n### 为什么运行 `python -m uvicorn app:app --reload` 会报错?\n\n如果报错类似 `No module named uvicorn`,说明你用的是系统 Python,而不是项目虚拟环境。请改用:\n\n```powershell\n.\\.venv\\Scripts\\python -m uvicorn app:app --reload\n```\n\n或者直接运行 `start-web.ps1` / `start-web.bat`。\n\n### 钉钉是不是必须项?\n\n不是。当前项目可以作为独立 Web 服务运行,钉钉是可选的接入场景。\n\n如果你现在接的是钉钉企业内部应用,那么它通常只对对应组织内成员可用,不能像 Web 页面那样直接公开给任何人访问。\n\n### 本地对话记录存在哪里?\n\n默认会保存在仓库下的 `data/zhiyuxing.db`。如果你想切到其他路径,可以在 `.env` 里设置 `CHAT_DB_PATH`。\n\n### 能不能把自己的知识文档接进来?\n\n可以。现在项目支持通过 `POST /api/knowledge/documents` 写入自定义知识文档,写入目录默认是 `data/knowledge_uploads`,也可以通过 `KNOWLEDGE_UPLOAD_DIR` 改掉。\n\n### 如何接入 DeepSeek R1 这类不同模型?\n\n项目使用的是 OpenAI 兼容接口方式。只要修改 `.env` 中的 `OPENAI_BASE_URL`、`MODEL_NAME`、`MODEL_API_KEY_ENV` 和对应密钥,就可以切换不同模型提供商。详细示例见:\n\n- [model-integration.md](model-integration.md)\n"}, "344df4a9f8f4952192e584faf7709304d7646bde": {"t": 1785764986.915656, "n": 4526, "h": "01b6c25df24f8288", "c": "# 使用说明\n\n[中文](usage-guide.md) | [English](usage-guide.en.md)\n\n这份文档用于说明项目的运行方式、环境变量和常见问题,方便直接启动和继续开发。\n\n## 运行模式\n\n### 1. 本地演示模式\n\n- 默认可用\n- 不要求配置 `OPENAI_API_KEY`\n- `/chat` 会返回内置的支持性建议\n- 会结合本地知识库、会话记忆和风险规则生成演示回复\n- 适合先验证页面、接口和整体流程\n\n### 2. 模型调用模式\n\n- 需要配置与当前模型匹配的密钥变量\n- 支持 `OPENAI_API_KEY`\n- 也支持 `DEEPSEEK_API_KEY`\n- 可选配置 `OPENAI_BASE_URL`、`MODEL_NAME`、`MODEL_PROVIDER`、`MODEL_API_KEY_ENV`\n- `/chat` 会调用 OpenAI 兼容接口返回模型回复\n- 适合继续验证真实模型能力\n\n## 环境变量\n\n可参考仓库根目录的 `.env.example`。\n\n| 变量名 | 说明 | 是否必填 |\n| --- | --- | --- |\n| `OPENAI_API_KEY` | OpenAI 兼容接口密钥,留空时自动进入本地演示模式 | 否 |\n| `DEEPSEEK_API_KEY` | DeepSeek 密钥,未设置 `OPENAI_API_KEY` 时会回退使用 | 否 |\n| `OPENAI_BASE_URL` | OpenAI 兼容接口地址 | 否 |\n| `MODEL_NAME` | 调用的模型名称 | 否 |\n| `MODEL_PROVIDER` | 页面展示用的提供商名称,例如 `OpenAI` / `DeepSeek` | 否 |\n| `MODEL_API_KEY_ENV` | 当前模型优先读取哪个密钥变量,例如 `OPENAI_API_KEY` / `DEEPSEEK_API_KEY` | 否 |\n| `MODEL_TEMPERATURE` | 温度参数 | 否 |\n| `DEMO_MODE` | 设置为 `true` 时强制使用本地演示模式 | 否 |\n| `CHAT_DB_PATH` | 本地 SQLite 会话库路径,默认写入 `data/zhiyuxing.db` | 否 |\n| `KNOWLEDGE_UPLOAD_DIR` | 自定义知识文档写入目录,默认写入 `data/knowledge_uploads` | 否 |\n\n## 本地启动\n\n### 1. 创建虚拟环境并安装依赖\n\n```bash\npython -m venv .venv\n.venv\\Scripts\\activate\npython -m pip install -r requirements.txt -r requirements-dev.txt\n```\n\n### 2. 一键配置模型\n\n优先推荐直接运行一键脚本:\n\n```powershell\n.\\setup-openai.ps1\n.\\setup-deepseek-chat.ps1\n.\\setup-deepseek-r1.ps1\n```\n\n也可以双击对应的 `.bat` 文件。\n\n这些脚本会自动:\n\n- 初始化 `.env`\n- 写入当前模型所需的 `OPENAI_BASE_URL`\n- 写入 `MODEL_NAME`、`MODEL_PROVIDER`\n- 自动设置 `MODEL_API_KEY_ENV`\n- 尽量保留现有密钥和其他环境变量\n\n这几个脚本不是免 Key 调用,只是把模型接入配置一次写好:\n\n- `.\\setup-openai.ps1`:真实调用需要 `OPENAI_API_KEY`\n- `.\\setup-deepseek-chat.ps1`:真实调用需要 `DEEPSEEK_API_KEY`\n- `.\\setup-deepseek-r1.ps1`:真实调用需要 `DEEPSEEK_API_KEY`\n\n如果你没有填写对应 Key,项目也不会坏掉,只是会继续运行在本地演示模式。\n\n### 3. 手动配置环境变量\n\n```powershell\nCopy-Item .env.example .env\n```\n\n### 4. 启动前检查\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py\n```\n\n它会检查:\n\n- 当前模型会读取哪个 API Key\n- 当前 `.env` 是否真的能进入真实模型调用模式\n- 当前 `OPENAI_BASE_URL` 和 `MODEL_NAME` 是否存在明显错配\n- `deepseek-reasoner` 的参数兼容规则是否已处理\n\n如果已经配置了真实密钥,还可以继续执行:\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py --probe\n```\n\n这会实际发起一次最小模型请求,用来验证当前 API 是否真的能被本项目正常调用。\n\n### 5. 启动服务\n\n```bash\npython -m uvicorn app:app --reload\n```\n\n如果系统环境里缺少依赖,优先使用仓库虚拟环境:\n\n```powershell\n.\\.venv\\Scripts\\python -m uvicorn app:app --reload\n```\n\n也可以直接运行:\n\n```powershell\n.\\start-web.ps1\n```\n\n或者双击根目录的 `start-web.bat`。\n\n## 常用地址\n\n- `/`:Web 页面入口\n- `/chat`:对话接口\n- `/health`:健康检查\n- `/api/meta`:服务元信息与当前运行模式\n- `/api/compatibility`:模型接入兼容检查\n- `/api/knowledge/search?q=关键词`:本地知识库检索\n- `/api/knowledge/documents`:列出或写入知识文档\n- `/api/session/{session_id}`:最近会话历史\n- `/api/feedback`:提交回复反馈\n- `/docs`:Swagger 文档\n- `/project-docs/model-integration.md`:不同模型接入说明\n- `/project-docs/dingtalk-integration.md`:钉钉接入说明\n- `/project-docs/api-reference.md`:接口参考\n\n## 常见问题\n\n### 为什么没配 API Key 也能返回结果?\n\n因为项目默认支持本地演示模式。这样仓库拿下来后可以直接跑通流程,不会因为缺少密钥导致页面不可用。\n\n当前演示模式也不是只有固定一句模板,而是会结合:\n\n- 最近会话记录\n- 本地知识库片段\n- 风险检测规则\n\n### 一键脚本是不是代表不用 API Key?\n\n不是。一键脚本只是把 `.env` 写成对应模型的推荐配置。\n\n- OpenAI 预设仍然需要 `OPENAI_API_KEY`\n- DeepSeek 预设仍然需要 `DEEPSEEK_API_KEY`\n\n如果 Key 留空,项目会自动回退到本地演示模式,所以页面仍然能返回内容,但那不是线上模型真实回复。\n\n### 为什么配置了 API Key 还是走本地演示模式?\n\n先检查 `.env` 中的 `DEMO_MODE` 是否被设置为 `true`。如果是,系统会优先使用本地演示模式。\n\n再检查当前模型是不是在读取正确的密钥变量。现在项目会优先按 `MODEL_API_KEY_ENV` 读取密钥,而不是只看有没有任意一个 Key。最稳的方式是直接运行:\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py\n```\n\n### 为什么明明填了 `OPENAI_API_KEY`,切到 DeepSeek 还是可能失败?\n\n因为 DeepSeek 默认应读取 `DEEPSEEK_API_KEY`,而不是只要有任意一个 Key 就算配置完成。\n\n当前项目已经补上了这层判断:\n\n- 切到 OpenAI 时,会优先读取 `OPENAI_API_KEY`\n- 切到 DeepSeek 时,会优先读取 `DEEPSEEK_API_KEY`\n- 如果你接的是其他 OpenAI 兼容供应商,可以手动设置 `MODEL_API_KEY_ENV`\n\n### 为什么系统环境里跑 `python -m pytest` 失败?\n\n通常是因为全局 Python 没安装测试依赖。优先使用仓库虚拟环境中的解释器,例如:\n\n```bash\n.\\.venv\\Scripts\\python -m pytest -q\n```\n\n### 为什么运行 `python -m uvicorn app:app --reload` 会报错?\n\n如果报错类似 `No module named uvicorn`,说明你用的是系统 Python,而不是项目虚拟环境。请改用:\n\n```powershell\n.\\.venv\\Scripts\\python -m uvicorn app:app --reload\n```\n\n或者直接运行 `start-web.ps1` / `start-web.bat`。\n\n### 钉钉是不是必须项?\n\n不是。当前项目可以作为独立 Web 服务运行,钉钉是可选的接入场景。\n\n如果你现在接的是钉钉企业内部应用,那么它通常只对对应组织内成员可用,不能像 Web 页面那样直接公开给任何人访问。\n\n### 本地对话记录存在哪里?\n\n默认会保存在仓库下的 `data/zhiyuxing.db`。如果你想切到其他路径,可以在 `.env` 里设置 `CHAT_DB_PATH`。\n\n### 能不能把自己的知识文档接进来?\n\n可以。现在项目支持通过 `POST /api/knowledge/documents` 写入自定义知识文档,写入目录默认是 `data/knowledge_uploads`,也可以通过 `KNOWLEDGE_UPLOAD_DIR` 改掉。\n\n### 如何接入 DeepSeek R1 这类不同模型?\n\n项目使用的是 OpenAI 兼容接口方式。只要修改 `.env` 中的 `OPENAI_BASE_URL`、`MODEL_NAME`、`MODEL_API_KEY_ENV` 和对应密钥,就可以切换不同模型提供商。详细示例见:\n\n- [model-integration.md](model-integration.md)\n"}, "3b58546acbb22d10fe2d101b2b45769d8de787d1": {"t": 1785764988.1784043, "n": 4467, "h": "9f9d39f8814694aa", "c": "# 使用说明\n\n[中文](usage-guide.md) | [English](usage-guide.en.md)\n\n这份文档用于说明项目的运行方式、环境变量和常见问题,方便直接启动和继续开发。\n\n## 运行模式\n\n### 1. 本地演示模式\n\n- 默认可用\n- 不要求配置 `OPENAI_API_KEY`\n- `/chat` 会返回内置的支持性建议\n- 会结合本地知识库、会话记忆和风险规则生成演示回复\n- 适合先验证页面、接口和整体流程\n\n### 2. 模型调用模式\n\n- 需要配置与当前模型匹配的密钥变量\n- 支持 `OPENAI_API_KEY`\n- 也支持 `DEEPSEEK_API_KEY`\n- 可选配置 `OPENAI_BASE_URL`、`MODEL_NAME`、`MODEL_PROVIDER`、`MODEL_API_KEY_ENV`\n- `/chat` 会调用 OpenAI 兼容接口返回模型回复\n- 适合继续验证真实模型能力\n\n## 环境变量\n\n可参考仓库根目录的 `.env.example`。\n\n| 变量名 | 说明 | 是否必填 |\n| --- | --- | --- |\n| `OPENAI_API_KEY` | OpenAI 兼容接口密钥,留空时自动进入本地演示模式 | 否 |\n| `DEEPSEEK_API_KEY` | DeepSeek 密钥,未设置 `OPENAI_API_KEY` 时会回退使用 | 否 |\n| `OPENAI_BASE_URL` | OpenAI 兼容接口地址 | 否 |\n| `MODEL_NAME` | 调用的模型名称 | 否 |\n| `MODEL_PROVIDER` | 页面展示用的提供商名称,例如 `OpenAI` / `DeepSeek` | 否 |\n| `MODEL_API_KEY_ENV` | 当前模型优先读取哪个密钥变量,例如 `OPENAI_API_KEY` / `DEEPSEEK_API_KEY` | 否 |\n| `MODEL_TEMPERATURE` | 温度参数 | 否 |\n| `DEMO_MODE` | 设置为 `true` 时强制使用本地演示模式 | 否 |\n| `CHAT_DB_PATH` | 本地 SQLite 会话库路径,默认写入 `data/zhiyuxing.db` | 否 |\n| `KNOWLEDGE_UPLOAD_DIR` | 自定义知识文档写入目录,默认写入 `data/knowledge_uploads` | 否 |\n\n## 本地启动\n\n### 1. 创建虚拟环境并安装依赖\n\n```bash\npython -m venv .venv\n.venv\\Scripts\\activate\npython -m pip install -r requirements.txt -r requirements-dev.txt\n```\n\n### 2. 一键配置模型\n\n优先推荐直接运行一键脚本:\n\n```powershell\n.\\setup-openai.ps1\n.\\setup-deepseek-chat.ps1\n.\\setup-deepseek-r1.ps1\n```\n\n也可以双击对应的 `.bat` 文件。\n\n这些脚本会自动:\n\n- 初始化 `.env`\n- 写入当前模型所需的 `OPENAI_BASE_URL`\n- 写入 `MODEL_NAME`、`MODEL_PROVIDER`\n- 自动设置 `MODEL_API_KEY_ENV`\n- 尽量保留现有密钥和其他环境变量\n\n这几个脚本不是免 Key 调用,只是把模型接入配置一次写好:\n\n- `.\\setup-openai.ps1`:真实调用需要 `OPENAI_API_KEY`\n- `.\\setup-deepseek-chat.ps1`:真实调用需要 `DEEPSEEK_API_KEY`\n- `.\\setup-deepseek-r1.ps1`:真实调用需要 `DEEPSEEK_API_KEY`\n\n如果你没有填写对应 Key,项目也不会坏掉,只是会继续运行在本地演示模式。\n\n### 3. 手动配置环境变量\n\n```powershell\nCopy-Item .env.example .env\n```\n\n### 4. 启动前检查\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py\n```\n\n它会检查:\n\n- 当前模型会读取哪个 API Key\n- 当前 `.env` 是否真的能进入真实模型调用模式\n- 当前 `OPENAI_BASE_URL` 和 `MODEL_NAME` 是否存在明显错配\n- `deepseek-reasoner` 的参数兼容规则是否已处理\n\n如果已经配置了真实密钥,还可以继续执行:\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py --probe\n```\n\n这会实际发起一次最小模型请求,用来验证当前 API 是否真的能被本项目正常调用。\n\n### 5. 启动服务\n\n```bash\npython -m uvicorn app:app --reload\n```\n\n如果系统环境里缺少依赖,优先使用仓库虚拟环境:\n\n```powershell\n.\\.venv\\Scripts\\python -m uvicorn app:app --reload\n```\n\n也可以直接运行:\n\n```powershell\n.\\start-web.ps1\n```\n\n或者双击根目录的 `start-web.bat`。\n\n## 常用地址\n\n- `/`:Web 页面入口\n- `/chat`:对话接口\n- `/health`:健康检查\n- `/api/meta`:服务元信息与当前运行模式\n- `/api/compatibility`:模型接入兼容检查\n- `/api/knowledge/search?q=关键词`:本地知识库检索\n- `/api/knowledge/documents`:列出或写入知识文档\n- `/api/session/{session_id}`:最近会话历史\n- `/api/feedback`:提交回复反馈\n- `/docs`:Swagger 文档\n- `/project-docs/model-integration.md`:不同模型接入说明\n- `/project-docs/dingtalk-integration.md`:钉钉接入说明\n- `/project-docs/api-reference.md`:接口参考\n\n## 常见问题\n\n### 为什么没配 API Key 也能返回结果?\n\n因为项目默认支持本地演示模式。这样仓库拿下来后可以直接跑通流程,不会因为缺少密钥导致页面不可用。\n\n当前演示模式也不是只有固定一句模板,而是会结合:\n\n- 最近会话记录\n- 本地知识库片段\n- 风险检测规则\n\n### 一键脚本是不是代表不用 API Key?\n\n不是。一键脚本只是把 `.env` 写成对应模型的推荐配置。\n\n- OpenAI 预设仍然需要 `OPENAI_API_KEY`\n- DeepSeek 预设仍然需要 `DEEPSEEK_API_KEY`\n\n如果 Key 留空,项目会自动回退到本地演示模式,所以页面仍然能返回内容,但那不是线上模型真实回复。\n\n### 为什么配置了 API Key 还是走本地演示模式?\n\n先检查 `.env` 中的 `DEMO_MODE` 是否被设置为 `true`。如果是,系统会优先使用本地演示模式。\n\n再检查当前模型是不是在读取正确的密钥变量。现在项目会优先按 `MODEL_API_KEY_ENV` 读取密钥,而不是只看有没有任意一个 Key。最稳的方式是直接运行:\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py\n```\n\n### 为什么明明填了 `OPENAI_API_KEY`,切到 DeepSeek 还是可能失败?\n\n因为 DeepSeek 默认应读取 `DEEPSEEK_API_KEY`,而不是只要有任意一个 Key 就算配置完成。\n\n当前项目已经补上了这层判断:\n\n- 切到 OpenAI 时,会优先读取 `OPENAI_API_KEY`\n- 切到 DeepSeek 时,会优先读取 `DEEPSEEK_API_KEY`\n- 如果你接的是其他 OpenAI 兼容供应商,可以手动设置 `MODEL_API_KEY_ENV`\n\n### 为什么系统环境里跑 `python -m pytest` 失败?\n\n通常是因为全局 Python 没安装测试依赖。优先使用仓库虚拟环境中的解释器,例如:\n\n```bash\n.\\.venv\\Scripts\\python -m pytest -q\n```\n\n### 为什么运行 `python -m uvicorn app:app --reload` 会报错?\n\n如果报错类似 `No module named uvicorn`,说明你用的是系统 Python,而不是项目虚拟环境。请改用:\n\n```powershell\n.\\.venv\\Scripts\\python -m uvicorn app:app --reload\n```\n\n或者直接运行 `start-web.ps1` / `start-web.bat`。\n\n### 钉钉是不是必须项?\n\n不是。当前项目可以作为独立 Web 服务运行,钉钉是可选的接入场景。\n\n### 本地对话记录存在哪里?\n\n默认会保存在仓库下的 `data/zhiyuxing.db`。如果你想切到其他路径,可以在 `.env` 里设置 `CHAT_DB_PATH`。\n\n### 能不能把自己的知识文档接进来?\n\n可以。现在项目支持通过 `POST /api/knowledge/documents` 写入自定义知识文档,写入目录默认是 `data/knowledge_uploads`,也可以通过 `KNOWLEDGE_UPLOAD_DIR` 改掉。\n\n### 如何接入 DeepSeek R1 这类不同模型?\n\n项目使用的是 OpenAI 兼容接口方式。只要修改 `.env` 中的 `OPENAI_BASE_URL`、`MODEL_NAME`、`MODEL_API_KEY_ENV` 和对应密钥,就可以切换不同模型提供商。详细示例见:\n\n- [model-integration.md](model-integration.md)\n"}, "43dcef3be7aa070bd63ed0f188b2280dd4867fc2": {"t": 1785764990.1073308, "n": 4171, "h": "679cfe80cbb1dfde", "c": "# 使用说明\n\n[中文](usage-guide.md) | [English](usage-guide.en.md)\n\n这份文档用于说明项目的运行方式、环境变量和常见问题,方便直接启动和继续开发。\n\n## 运行模式\n\n### 1. 本地演示模式\n\n- 默认可用\n- 不要求配置 `OPENAI_API_KEY`\n- `/chat` 会返回内置的支持性建议\n- 会结合本地知识库、会话记忆和风险规则生成演示回复\n- 适合先验证页面、接口和整体流程\n\n### 2. 模型调用模式\n\n- 需要配置与当前模型匹配的密钥变量\n- 支持 `OPENAI_API_KEY`\n- 也支持 `DEEPSEEK_API_KEY`\n- 可选配置 `OPENAI_BASE_URL`、`MODEL_NAME`、`MODEL_PROVIDER`、`MODEL_API_KEY_ENV`\n- `/chat` 会调用 OpenAI 兼容接口返回模型回复\n- 适合继续验证真实模型能力\n\n## 环境变量\n\n可参考仓库根目录的 `.env.example`。\n\n| 变量名 | 说明 | 是否必填 |\n| --- | --- | --- |\n| `OPENAI_API_KEY` | OpenAI 兼容接口密钥,留空时自动进入本地演示模式 | 否 |\n| `DEEPSEEK_API_KEY` | DeepSeek 密钥,未设置 `OPENAI_API_KEY` 时会回退使用 | 否 |\n| `OPENAI_BASE_URL` | OpenAI 兼容接口地址 | 否 |\n| `MODEL_NAME` | 调用的模型名称 | 否 |\n| `MODEL_PROVIDER` | 页面展示用的提供商名称,例如 `OpenAI` / `DeepSeek` | 否 |\n| `MODEL_API_KEY_ENV` | 当前模型优先读取哪个密钥变量,例如 `OPENAI_API_KEY` / `DEEPSEEK_API_KEY` | 否 |\n| `MODEL_TEMPERATURE` | 温度参数 | 否 |\n| `DEMO_MODE` | 设置为 `true` 时强制使用本地演示模式 | 否 |\n| `CHAT_DB_PATH` | 本地 SQLite 会话库路径,默认写入 `data/zhiyuxing.db` | 否 |\n\n## 本地启动\n\n### 1. 创建虚拟环境并安装依赖\n\n```bash\npython -m venv .venv\n.venv\\Scripts\\activate\npython -m pip install -r requirements.txt -r requirements-dev.txt\n```\n\n### 2. 一键配置模型\n\n优先推荐直接运行一键脚本:\n\n```powershell\n.\\setup-openai.ps1\n.\\setup-deepseek-chat.ps1\n.\\setup-deepseek-r1.ps1\n```\n\n也可以双击对应的 `.bat` 文件。\n\n这些脚本会自动:\n\n- 初始化 `.env`\n- 写入当前模型所需的 `OPENAI_BASE_URL`\n- 写入 `MODEL_NAME`、`MODEL_PROVIDER`\n- 自动设置 `MODEL_API_KEY_ENV`\n- 尽量保留现有密钥和其他环境变量\n\n这几个脚本不是免 Key 调用,只是把模型接入配置一次写好:\n\n- `.\\setup-openai.ps1`:真实调用需要 `OPENAI_API_KEY`\n- `.\\setup-deepseek-chat.ps1`:真实调用需要 `DEEPSEEK_API_KEY`\n- `.\\setup-deepseek-r1.ps1`:真实调用需要 `DEEPSEEK_API_KEY`\n\n如果你没有填写对应 Key,项目也不会坏掉,只是会继续运行在本地演示模式。\n\n### 3. 手动配置环境变量\n\n```powershell\nCopy-Item .env.example .env\n```\n\n### 4. 启动前检查\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py\n```\n\n它会检查:\n\n- 当前模型会读取哪个 API Key\n- 当前 `.env` 是否真的能进入真实模型调用模式\n- 当前 `OPENAI_BASE_URL` 和 `MODEL_NAME` 是否存在明显错配\n- `deepseek-reasoner` 的参数兼容规则是否已处理\n\n如果已经配置了真实密钥,还可以继续执行:\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py --probe\n```\n\n这会实际发起一次最小模型请求,用来验证当前 API 是否真的能被本项目正常调用。\n\n### 5. 启动服务\n\n```bash\npython -m uvicorn app:app --reload\n```\n\n如果系统环境里缺少依赖,优先使用仓库虚拟环境:\n\n```powershell\n.\\.venv\\Scripts\\python -m uvicorn app:app --reload\n```\n\n也可以直接运行:\n\n```powershell\n.\\start-web.ps1\n```\n\n或者双击根目录的 `start-web.bat`。\n\n## 常用地址\n\n- `/`:Web 页面入口\n- `/chat`:对话接口\n- `/health`:健康检查\n- `/api/meta`:服务元信息与当前运行模式\n- `/api/compatibility`:模型接入兼容检查\n- `/api/knowledge/search?q=关键词`:本地知识库检索\n- `/api/session/{session_id}`:最近会话历史\n- `/api/feedback`:提交回复反馈\n- `/docs`:Swagger 文档\n- `/project-docs/model-integration.md`:不同模型接入说明\n- `/project-docs/dingtalk-integration.md`:钉钉接入说明\n\n## 常见问题\n\n### 为什么没配 API Key 也能返回结果?\n\n因为项目默认支持本地演示模式。这样仓库拿下来后可以直接跑通流程,不会因为缺少密钥导致页面不可用。\n\n当前演示模式也不是只有固定一句模板,而是会结合:\n\n- 最近会话记录\n- 本地知识库片段\n- 风险检测规则\n\n### 一键脚本是不是代表不用 API Key?\n\n不是。一键脚本只是把 `.env` 写成对应模型的推荐配置。\n\n- OpenAI 预设仍然需要 `OPENAI_API_KEY`\n- DeepSeek 预设仍然需要 `DEEPSEEK_API_KEY`\n\n如果 Key 留空,项目会自动回退到本地演示模式,所以页面仍然能返回内容,但那不是线上模型真实回复。\n\n### 为什么配置了 API Key 还是走本地演示模式?\n\n先检查 `.env` 中的 `DEMO_MODE` 是否被设置为 `true`。如果是,系统会优先使用本地演示模式。\n\n再检查当前模型是不是在读取正确的密钥变量。现在项目会优先按 `MODEL_API_KEY_ENV` 读取密钥,而不是只看有没有任意一个 Key。最稳的方式是直接运行:\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py\n```\n\n### 为什么明明填了 `OPENAI_API_KEY`,切到 DeepSeek 还是可能失败?\n\n因为 DeepSeek 默认应读取 `DEEPSEEK_API_KEY`,而不是只要有任意一个 Key 就算配置完成。\n\n当前项目已经补上了这层判断:\n\n- 切到 OpenAI 时,会优先读取 `OPENAI_API_KEY`\n- 切到 DeepSeek 时,会优先读取 `DEEPSEEK_API_KEY`\n- 如果你接的是其他 OpenAI 兼容供应商,可以手动设置 `MODEL_API_KEY_ENV`\n\n### 为什么系统环境里跑 `python -m pytest` 失败?\n\n通常是因为全局 Python 没安装测试依赖。优先使用仓库虚拟环境中的解释器,例如:\n\n```bash\n.\\.venv\\Scripts\\python -m pytest -q\n```\n\n### 为什么运行 `python -m uvicorn app:app --reload` 会报错?\n\n如果报错类似 `No module named uvicorn`,说明你用的是系统 Python,而不是项目虚拟环境。请改用:\n\n```powershell\n.\\.venv\\Scripts\\python -m uvicorn app:app --reload\n```\n\n或者直接运行 `start-web.ps1` / `start-web.bat`。\n\n### 钉钉是不是必须项?\n\n不是。当前项目可以作为独立 Web 服务运行,钉钉是可选的接入场景。\n\n### 本地对话记录存在哪里?\n\n默认会保存在仓库下的 `data/zhiyuxing.db`。如果你想切到其他路径,可以在 `.env` 里设置 `CHAT_DB_PATH`。\n\n### 如何接入 DeepSeek R1 这类不同模型?\n\n项目使用的是 OpenAI 兼容接口方式。只要修改 `.env` 中的 `OPENAI_BASE_URL`、`MODEL_NAME`、`MODEL_API_KEY_ENV` 和对应密钥,就可以切换不同模型提供商。详细示例见:\n\n- [model-integration.md](model-integration.md)\n"}, "e8987d60b75a119016a27b8ae44ea149466b0017": {"t": 1785764991.5976212, "n": 3830, "h": "f05756a5402553d0", "c": "# 使用说明\n\n[中文](usage-guide.md) | [English](usage-guide.en.md)\n\n这份文档用于说明项目的运行方式、环境变量和常见问题,方便直接启动和继续开发。\n\n## 运行模式\n\n### 1. 本地演示模式\n\n- 默认可用\n- 不要求配置 `OPENAI_API_KEY`\n- `/chat` 会返回内置的支持性建议\n- 适合先验证页面、接口和整体流程\n\n### 2. 模型调用模式\n\n- 需要配置与当前模型匹配的密钥变量\n- 支持 `OPENAI_API_KEY`\n- 也支持 `DEEPSEEK_API_KEY`\n- 可选配置 `OPENAI_BASE_URL`、`MODEL_NAME`、`MODEL_PROVIDER`、`MODEL_API_KEY_ENV`\n- `/chat` 会调用 OpenAI 兼容接口返回模型回复\n- 适合继续验证真实模型能力\n\n## 环境变量\n\n可参考仓库根目录的 `.env.example`。\n\n| 变量名 | 说明 | 是否必填 |\n| --- | --- | --- |\n| `OPENAI_API_KEY` | OpenAI 兼容接口密钥,留空时自动进入本地演示模式 | 否 |\n| `DEEPSEEK_API_KEY` | DeepSeek 密钥,未设置 `OPENAI_API_KEY` 时会回退使用 | 否 |\n| `OPENAI_BASE_URL` | OpenAI 兼容接口地址 | 否 |\n| `MODEL_NAME` | 调用的模型名称 | 否 |\n| `MODEL_PROVIDER` | 页面展示用的提供商名称,例如 `OpenAI` / `DeepSeek` | 否 |\n| `MODEL_API_KEY_ENV` | 当前模型优先读取哪个密钥变量,例如 `OPENAI_API_KEY` / `DEEPSEEK_API_KEY` | 否 |\n| `MODEL_TEMPERATURE` | 温度参数 | 否 |\n| `DEMO_MODE` | 设置为 `true` 时强制使用本地演示模式 | 否 |\n\n## 本地启动\n\n### 1. 创建虚拟环境并安装依赖\n\n```bash\npython -m venv .venv\n.venv\\Scripts\\activate\npython -m pip install -r requirements.txt -r requirements-dev.txt\n```\n\n### 2. 一键配置模型\n\n优先推荐直接运行一键脚本:\n\n```powershell\n.\\setup-openai.ps1\n.\\setup-deepseek-chat.ps1\n.\\setup-deepseek-r1.ps1\n```\n\n也可以双击对应的 `.bat` 文件。\n\n这些脚本会自动:\n\n- 初始化 `.env`\n- 写入当前模型所需的 `OPENAI_BASE_URL`\n- 写入 `MODEL_NAME`、`MODEL_PROVIDER`\n- 自动设置 `MODEL_API_KEY_ENV`\n- 尽量保留现有密钥和其他环境变量\n\n这几个脚本不是免 Key 调用,只是把模型接入配置一次写好:\n\n- `.\\setup-openai.ps1`:真实调用需要 `OPENAI_API_KEY`\n- `.\\setup-deepseek-chat.ps1`:真实调用需要 `DEEPSEEK_API_KEY`\n- `.\\setup-deepseek-r1.ps1`:真实调用需要 `DEEPSEEK_API_KEY`\n\n如果你没有填写对应 Key,项目也不会坏掉,只是会继续运行在本地演示模式。\n\n### 3. 手动配置环境变量\n\n```powershell\nCopy-Item .env.example .env\n```\n\n### 4. 启动前检查\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py\n```\n\n它会检查:\n\n- 当前模型会读取哪个 API Key\n- 当前 `.env` 是否真的能进入真实模型调用模式\n- 当前 `OPENAI_BASE_URL` 和 `MODEL_NAME` 是否存在明显错配\n- `deepseek-reasoner` 的参数兼容规则是否已处理\n\n如果已经配置了真实密钥,还可以继续执行:\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py --probe\n```\n\n这会实际发起一次最小模型请求,用来验证当前 API 是否真的能被本项目正常调用。\n\n### 5. 启动服务\n\n```bash\npython -m uvicorn app:app --reload\n```\n\n如果系统环境里缺少依赖,优先使用仓库虚拟环境:\n\n```powershell\n.\\.venv\\Scripts\\python -m uvicorn app:app --reload\n```\n\n也可以直接运行:\n\n```powershell\n.\\start-web.ps1\n```\n\n或者双击根目录的 `start-web.bat`。\n\n## 常用地址\n\n- `/`:Web 页面入口\n- `/chat`:对话接口\n- `/health`:健康检查\n- `/api/meta`:服务元信息与当前运行模式\n- `/api/compatibility`:模型接入兼容检查\n- `/docs`:Swagger 文档\n- `/project-docs/model-integration.md`:不同模型接入说明\n- `/project-docs/dingtalk-integration.md`:钉钉接入说明\n\n## 常见问题\n\n### 为什么没配 API Key 也能返回结果?\n\n因为项目默认支持本地演示模式。这样仓库拿下来后可以直接跑通流程,不会因为缺少密钥导致页面不可用。\n\n### 一键脚本是不是代表不用 API Key?\n\n不是。一键脚本只是把 `.env` 写成对应模型的推荐配置。\n\n- OpenAI 预设仍然需要 `OPENAI_API_KEY`\n- DeepSeek 预设仍然需要 `DEEPSEEK_API_KEY`\n\n如果 Key 留空,项目会自动回退到本地演示模式,所以页面仍然能返回内容,但那不是线上模型真实回复。\n\n### 为什么配置了 API Key 还是走本地演示模式?\n\n先检查 `.env` 中的 `DEMO_MODE` 是否被设置为 `true`。如果是,系统会优先使用本地演示模式。\n\n再检查当前模型是不是在读取正确的密钥变量。现在项目会优先按 `MODEL_API_KEY_ENV` 读取密钥,而不是只看有没有任意一个 Key。最稳的方式是直接运行:\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py\n```\n\n### 为什么明明填了 `OPENAI_API_KEY`,切到 DeepSeek 还是可能失败?\n\n因为 DeepSeek 默认应读取 `DEEPSEEK_API_KEY`,而不是只要有任意一个 Key 就算配置完成。\n\n当前项目已经补上了这层判断:\n\n- 切到 OpenAI 时,会优先读取 `OPENAI_API_KEY`\n- 切到 DeepSeek 时,会优先读取 `DEEPSEEK_API_KEY`\n- 如果你接的是其他 OpenAI 兼容供应商,可以手动设置 `MODEL_API_KEY_ENV`\n\n### 为什么系统环境里跑 `python -m pytest` 失败?\n\n通常是因为全局 Python 没安装测试依赖。优先使用仓库虚拟环境中的解释器,例如:\n\n```bash\n.\\.venv\\Scripts\\python -m pytest -q\n```\n\n### 为什么运行 `python -m uvicorn app:app --reload` 会报错?\n\n如果报错类似 `No module named uvicorn`,说明你用的是系统 Python,而不是项目虚拟环境。请改用:\n\n```powershell\n.\\.venv\\Scripts\\python -m uvicorn app:app --reload\n```\n\n或者直接运行 `start-web.ps1` / `start-web.bat`。\n\n### 钉钉是不是必须项?\n\n不是。当前项目可以作为独立 Web 服务运行,钉钉是可选的接入场景。\n\n### 如何接入 DeepSeek R1 这类不同模型?\n\n项目使用的是 OpenAI 兼容接口方式。只要修改 `.env` 中的 `OPENAI_BASE_URL`、`MODEL_NAME`、`MODEL_API_KEY_ENV` 和对应密钥,就可以切换不同模型提供商。详细示例见:\n\n- [model-integration.md](model-integration.md)\n"}, "d54f5f0e02a91ae009654cb4e4e191e28117f192": {"t": 1785764993.0086684, "n": 3777, "h": "f4aa55f6e6855f75", "c": "# 使用说明\n\n这份文档用于说明项目的运行方式、环境变量和常见问题,方便直接启动和继续开发。\n\n## 运行模式\n\n### 1. 本地演示模式\n\n- 默认可用\n- 不要求配置 `OPENAI_API_KEY`\n- `/chat` 会返回内置的支持性建议\n- 适合先验证页面、接口和整体流程\n\n### 2. 模型调用模式\n\n- 需要配置与当前模型匹配的密钥变量\n- 支持 `OPENAI_API_KEY`\n- 也支持 `DEEPSEEK_API_KEY`\n- 可选配置 `OPENAI_BASE_URL`、`MODEL_NAME`、`MODEL_PROVIDER`、`MODEL_API_KEY_ENV`\n- `/chat` 会调用 OpenAI 兼容接口返回模型回复\n- 适合继续验证真实模型能力\n\n## 环境变量\n\n可参考仓库根目录的 `.env.example`。\n\n| 变量名 | 说明 | 是否必填 |\n| --- | --- | --- |\n| `OPENAI_API_KEY` | OpenAI 兼容接口密钥,留空时自动进入本地演示模式 | 否 |\n| `DEEPSEEK_API_KEY` | DeepSeek 密钥,未设置 `OPENAI_API_KEY` 时会回退使用 | 否 |\n| `OPENAI_BASE_URL` | OpenAI 兼容接口地址 | 否 |\n| `MODEL_NAME` | 调用的模型名称 | 否 |\n| `MODEL_PROVIDER` | 页面展示用的提供商名称,例如 `OpenAI` / `DeepSeek` | 否 |\n| `MODEL_API_KEY_ENV` | 当前模型优先读取哪个密钥变量,例如 `OPENAI_API_KEY` / `DEEPSEEK_API_KEY` | 否 |\n| `MODEL_TEMPERATURE` | 温度参数 | 否 |\n| `DEMO_MODE` | 设置为 `true` 时强制使用本地演示模式 | 否 |\n\n## 本地启动\n\n### 1. 创建虚拟环境并安装依赖\n\n```bash\npython -m venv .venv\n.venv\\Scripts\\activate\npython -m pip install -r requirements.txt -r requirements-dev.txt\n```\n\n### 2. 一键配置模型\n\n优先推荐直接运行一键脚本:\n\n```powershell\n.\\setup-openai.ps1\n.\\setup-deepseek-chat.ps1\n.\\setup-deepseek-r1.ps1\n```\n\n也可以双击对应的 `.bat` 文件。\n\n这些脚本会自动:\n\n- 初始化 `.env`\n- 写入当前模型所需的 `OPENAI_BASE_URL`\n- 写入 `MODEL_NAME`、`MODEL_PROVIDER`\n- 自动设置 `MODEL_API_KEY_ENV`\n- 尽量保留现有密钥和其他环境变量\n\n这几个脚本不是免 Key 调用,只是把模型接入配置一次写好:\n\n- `.\\setup-openai.ps1`:真实调用需要 `OPENAI_API_KEY`\n- `.\\setup-deepseek-chat.ps1`:真实调用需要 `DEEPSEEK_API_KEY`\n- `.\\setup-deepseek-r1.ps1`:真实调用需要 `DEEPSEEK_API_KEY`\n\n如果你没有填写对应 Key,项目也不会坏掉,只是会继续运行在本地演示模式。\n\n### 3. 手动配置环境变量\n\n```powershell\nCopy-Item .env.example .env\n```\n\n### 4. 启动前检查\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py\n```\n\n它会检查:\n\n- 当前模型会读取哪个 API Key\n- 当前 `.env` 是否真的能进入真实模型调用模式\n- 当前 `OPENAI_BASE_URL` 和 `MODEL_NAME` 是否存在明显错配\n- `deepseek-reasoner` 的参数兼容规则是否已处理\n\n如果已经配置了真实密钥,还可以继续执行:\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py --probe\n```\n\n这会实际发起一次最小模型请求,用来验证当前 API 是否真的能被本项目正常调用。\n\n### 5. 启动服务\n\n```bash\npython -m uvicorn app:app --reload\n```\n\n如果系统环境里缺少依赖,优先使用仓库虚拟环境:\n\n```powershell\n.\\.venv\\Scripts\\python -m uvicorn app:app --reload\n```\n\n也可以直接运行:\n\n```powershell\n.\\start-web.ps1\n```\n\n或者双击根目录的 `start-web.bat`。\n\n## 常用地址\n\n- `/`:Web 页面入口\n- `/chat`:对话接口\n- `/health`:健康检查\n- `/api/meta`:服务元信息与当前运行模式\n- `/api/compatibility`:模型接入兼容检查\n- `/docs`:Swagger 文档\n- `/project-docs/model-integration.md`:不同模型接入说明\n- `/project-docs/dingtalk-integration.md`:钉钉接入说明\n\n## 常见问题\n\n### 为什么没配 API Key 也能返回结果?\n\n因为项目默认支持本地演示模式。这样仓库拿下来后可以直接跑通流程,不会因为缺少密钥导致页面不可用。\n\n### 一键脚本是不是代表不用 API Key?\n\n不是。一键脚本只是把 `.env` 写成对应模型的推荐配置。\n\n- OpenAI 预设仍然需要 `OPENAI_API_KEY`\n- DeepSeek 预设仍然需要 `DEEPSEEK_API_KEY`\n\n如果 Key 留空,项目会自动回退到本地演示模式,所以页面仍然能返回内容,但那不是线上模型真实回复。\n\n### 为什么配置了 API Key 还是走本地演示模式?\n\n先检查 `.env` 中的 `DEMO_MODE` 是否被设置为 `true`。如果是,系统会优先使用本地演示模式。\n\n再检查当前模型是不是在读取正确的密钥变量。现在项目会优先按 `MODEL_API_KEY_ENV` 读取密钥,而不是只看有没有任意一个 Key。最稳的方式是直接运行:\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py\n```\n\n### 为什么明明填了 `OPENAI_API_KEY`,切到 DeepSeek 还是可能失败?\n\n因为 DeepSeek 默认应读取 `DEEPSEEK_API_KEY`,而不是只要有任意一个 Key 就算配置完成。\n\n当前项目已经补上了这层判断:\n\n- 切到 OpenAI 时,会优先读取 `OPENAI_API_KEY`\n- 切到 DeepSeek 时,会优先读取 `DEEPSEEK_API_KEY`\n- 如果你接的是其他 OpenAI 兼容供应商,可以手动设置 `MODEL_API_KEY_ENV`\n\n### 为什么系统环境里跑 `python -m pytest` 失败?\n\n通常是因为全局 Python 没安装测试依赖。优先使用仓库虚拟环境中的解释器,例如:\n\n```bash\n.\\.venv\\Scripts\\python -m pytest -q\n```\n\n### 为什么运行 `python -m uvicorn app:app --reload` 会报错?\n\n如果报错类似 `No module named uvicorn`,说明你用的是系统 Python,而不是项目虚拟环境。请改用:\n\n```powershell\n.\\.venv\\Scripts\\python -m uvicorn app:app --reload\n```\n\n或者直接运行 `start-web.ps1` / `start-web.bat`。\n\n### 钉钉是不是必须项?\n\n不是。当前项目可以作为独立 Web 服务运行,钉钉是可选的接入场景。\n\n### 如何接入 DeepSeek R1 这类不同模型?\n\n项目使用的是 OpenAI 兼容接口方式。只要修改 `.env` 中的 `OPENAI_BASE_URL`、`MODEL_NAME`、`MODEL_API_KEY_ENV` 和对应密钥,就可以切换不同模型提供商。详细示例见:\n\n- [model-integration.md](model-integration.md)\n"}, "ce631a17aaaf82181757cfd3a6f988ae2e52abcc": {"t": 1785764994.329259, "n": 3367, "h": "5480f428f471debd", "c": "# 使用说明\n\n这份文档用于说明项目的运行方式、环境变量和常见问题,方便直接启动和继续开发。\n\n## 运行模式\n\n### 1. 本地演示模式\n\n- 默认可用\n- 不要求配置 `OPENAI_API_KEY`\n- `/chat` 会返回内置的支持性建议\n- 适合先验证页面、接口和整体流程\n\n### 2. 模型调用模式\n\n- 需要配置与当前模型匹配的密钥变量\n- 支持 `OPENAI_API_KEY`\n- 也支持 `DEEPSEEK_API_KEY`\n- 可选配置 `OPENAI_BASE_URL`、`MODEL_NAME`、`MODEL_PROVIDER`、`MODEL_API_KEY_ENV`\n- `/chat` 会调用 OpenAI 兼容接口返回模型回复\n- 适合继续验证真实模型能力\n\n## 环境变量\n\n可参考仓库根目录的 `.env.example`。\n\n| 变量名 | 说明 | 是否必填 |\n| --- | --- | --- |\n| `OPENAI_API_KEY` | OpenAI 兼容接口密钥,留空时自动进入本地演示模式 | 否 |\n| `DEEPSEEK_API_KEY` | DeepSeek 密钥,未设置 `OPENAI_API_KEY` 时会回退使用 | 否 |\n| `OPENAI_BASE_URL` | OpenAI 兼容接口地址 | 否 |\n| `MODEL_NAME` | 调用的模型名称 | 否 |\n| `MODEL_PROVIDER` | 页面展示用的提供商名称,例如 `OpenAI` / `DeepSeek` | 否 |\n| `MODEL_API_KEY_ENV` | 当前模型优先读取哪个密钥变量,例如 `OPENAI_API_KEY` / `DEEPSEEK_API_KEY` | 否 |\n| `MODEL_TEMPERATURE` | 温度参数 | 否 |\n| `DEMO_MODE` | 设置为 `true` 时强制使用本地演示模式 | 否 |\n\n## 本地启动\n\n### 1. 创建虚拟环境并安装依赖\n\n```bash\npython -m venv .venv\n.venv\\Scripts\\activate\npython -m pip install -r requirements.txt -r requirements-dev.txt\n```\n\n### 2. 一键配置模型\n\n优先推荐直接运行一键脚本:\n\n```powershell\n.\\setup-openai.ps1\n.\\setup-deepseek-chat.ps1\n.\\setup-deepseek-r1.ps1\n```\n\n也可以双击对应的 `.bat` 文件。\n\n这些脚本会自动:\n\n- 初始化 `.env`\n- 写入当前模型所需的 `OPENAI_BASE_URL`\n- 写入 `MODEL_NAME`、`MODEL_PROVIDER`\n- 自动设置 `MODEL_API_KEY_ENV`\n- 尽量保留现有密钥和其他环境变量\n\n### 3. 手动配置环境变量\n\n```powershell\nCopy-Item .env.example .env\n```\n\n### 4. 启动前检查\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py\n```\n\n它会检查:\n\n- 当前模型会读取哪个 API Key\n- 当前 `.env` 是否真的能进入真实模型调用模式\n- 当前 `OPENAI_BASE_URL` 和 `MODEL_NAME` 是否存在明显错配\n- `deepseek-reasoner` 的参数兼容规则是否已处理\n\n如果已经配置了真实密钥,还可以继续执行:\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py --probe\n```\n\n这会实际发起一次最小模型请求,用来验证当前 API 是否真的能被本项目正常调用。\n\n### 5. 启动服务\n\n```bash\npython -m uvicorn app:app --reload\n```\n\n如果系统环境里缺少依赖,优先使用仓库虚拟环境:\n\n```powershell\n.\\.venv\\Scripts\\python -m uvicorn app:app --reload\n```\n\n也可以直接运行:\n\n```powershell\n.\\start-web.ps1\n```\n\n或者双击根目录的 `start-web.bat`。\n\n## 常用地址\n\n- `/`:Web 页面入口\n- `/chat`:对话接口\n- `/health`:健康检查\n- `/api/meta`:服务元信息与当前运行模式\n- `/api/compatibility`:模型接入兼容检查\n- `/docs`:Swagger 文档\n- `/project-docs/model-integration.md`:不同模型接入说明\n- `/project-docs/dingtalk-integration.md`:钉钉接入说明\n\n## 常见问题\n\n### 为什么没配 API Key 也能返回结果?\n\n因为项目默认支持本地演示模式。这样仓库拿下来后可以直接跑通流程,不会因为缺少密钥导致页面不可用。\n\n### 为什么配置了 API Key 还是走本地演示模式?\n\n先检查 `.env` 中的 `DEMO_MODE` 是否被设置为 `true`。如果是,系统会优先使用本地演示模式。\n\n再检查当前模型是不是在读取正确的密钥变量。现在项目会优先按 `MODEL_API_KEY_ENV` 读取密钥,而不是只看有没有任意一个 Key。最稳的方式是直接运行:\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py\n```\n\n### 为什么明明填了 `OPENAI_API_KEY`,切到 DeepSeek 还是可能失败?\n\n因为 DeepSeek 默认应读取 `DEEPSEEK_API_KEY`,而不是只要有任意一个 Key 就算配置完成。\n\n当前项目已经补上了这层判断:\n\n- 切到 OpenAI 时,会优先读取 `OPENAI_API_KEY`\n- 切到 DeepSeek 时,会优先读取 `DEEPSEEK_API_KEY`\n- 如果你接的是其他 OpenAI 兼容供应商,可以手动设置 `MODEL_API_KEY_ENV`\n\n### 为什么系统环境里跑 `python -m pytest` 失败?\n\n通常是因为全局 Python 没安装测试依赖。优先使用仓库虚拟环境中的解释器,例如:\n\n```bash\n.\\.venv\\Scripts\\python -m pytest -q\n```\n\n### 为什么运行 `python -m uvicorn app:app --reload` 会报错?\n\n如果报错类似 `No module named uvicorn`,说明你用的是系统 Python,而不是项目虚拟环境。请改用:\n\n```powershell\n.\\.venv\\Scripts\\python -m uvicorn app:app --reload\n```\n\n或者直接运行 `start-web.ps1` / `start-web.bat`。\n\n### 钉钉是不是必须项?\n\n不是。当前项目可以作为独立 Web 服务运行,钉钉是可选的接入场景。\n\n### 如何接入 DeepSeek R1 这类不同模型?\n\n项目使用的是 OpenAI 兼容接口方式。只要修改 `.env` 中的 `OPENAI_BASE_URL`、`MODEL_NAME`、`MODEL_API_KEY_ENV` 和对应密钥,就可以切换不同模型提供商。详细示例见:\n\n- [model-integration.md](model-integration.md)\n"}, "420134e583cb6a02b515fad542efc15411c78ccf": {"t": 1785764995.6247232, "n": 2136, "h": "7ceaf9c7f7770ce2", "c": "# 使用说明\n\n这份文档用于说明项目的运行方式、环境变量和常见问题,方便直接启动和继续开发。\n\n## 运行模式\n\n### 1. 本地演示模式\n\n- 默认可用\n- 不要求配置 `OPENAI_API_KEY`\n- `/chat` 会返回内置的支持性建议\n- 适合先验证页面、接口和整体流程\n\n### 2. 模型调用模式\n\n- 需要配置 `OPENAI_API_KEY`\n- 也支持配置 `DEEPSEEK_API_KEY`\n- 可选配置 `OPENAI_BASE_URL`、`MODEL_NAME`、`MODEL_PROVIDER`\n- `/chat` 会调用 OpenAI 兼容接口返回模型回复\n- 适合继续验证真实模型能力\n\n## 环境变量\n\n可参考仓库根目录的 `.env.example`。\n\n| 变量名 | 说明 | 是否必填 |\n| --- | --- | --- |\n| `OPENAI_API_KEY` | OpenAI 兼容接口密钥,留空时自动进入本地演示模式 | 否 |\n| `DEEPSEEK_API_KEY` | DeepSeek 密钥,未设置 `OPENAI_API_KEY` 时会回退使用 | 否 |\n| `OPENAI_BASE_URL` | OpenAI 兼容接口地址 | 否 |\n| `MODEL_NAME` | 调用的模型名称 | 否 |\n| `MODEL_PROVIDER` | 页面展示用的提供商名称,例如 `OpenAI` / `DeepSeek` | 否 |\n| `MODEL_TEMPERATURE` | 温度参数 | 否 |\n| `DEMO_MODE` | 设置为 `true` 时强制使用本地演示模式 | 否 |\n\n## 本地启动\n\n### 1. 创建虚拟环境并安装依赖\n\n```bash\npython -m venv .venv\n.venv\\Scripts\\activate\npython -m pip install -r requirements.txt -r requirements-dev.txt\n```\n\n### 2. 配置环境变量\n\n```powershell\nCopy-Item .env.example .env\n```\n\n### 3. 启动服务\n\n```bash\npython -m uvicorn app:app --reload\n```\n\n如果系统环境里缺少依赖,优先使用仓库虚拟环境:\n\n```powershell\n.\\.venv\\Scripts\\python -m uvicorn app:app --reload\n```\n\n也可以直接运行:\n\n```powershell\n.\\start-web.ps1\n```\n\n或者双击根目录的 `start-web.bat`。\n\n## 常用地址\n\n- `/`:Web 页面入口\n- `/chat`:对话接口\n- `/health`:健康检查\n- `/api/meta`:服务元信息与当前运行模式\n- `/docs`:Swagger 文档\n- `/project-docs/model-integration.md`:不同模型接入说明\n- `/project-docs/dingtalk-integration.md`:钉钉接入说明\n\n## 常见问题\n\n### 为什么没配 API Key 也能返回结果?\n\n因为项目默认支持本地演示模式。这样仓库拿下来后可以直接跑通流程,不会因为缺少密钥导致页面不可用。\n\n### 为什么配置了 API Key 还是走本地演示模式?\n\n检查 `.env` 中的 `DEMO_MODE` 是否被设置为 `true`。如果是,系统会优先使用本地演示模式。\n\n### 为什么系统环境里跑 `python -m pytest` 失败?\n\n通常是因为全局 Python 没安装测试依赖。优先使用仓库虚拟环境中的解释器,例如:\n\n```bash\n.\\.venv\\Scripts\\python -m pytest -q\n```\n\n### 为什么运行 `python -m uvicorn app:app --reload` 会报错?\n\n如果报错类似 `No module named uvicorn`,说明你用的是系统 Python,而不是项目虚拟环境。请改用:\n\n```powershell\n.\\.venv\\Scripts\\python -m uvicorn app:app --reload\n```\n\n或者直接运行 `start-web.ps1` / `start-web.bat`。\n\n### 钉钉是不是必须项?\n\n不是。当前项目可以作为独立 Web 服务运行,钉钉是可选的接入场景。\n\n### 如何接入 DeepSeek R1 这类不同模型?\n\n项目使用的是 OpenAI 兼容接口方式。只要修改 `.env` 中的 `OPENAI_BASE_URL`、`MODEL_NAME` 和密钥配置,就可以切换不同模型提供商。详细示例见:\n\n- [model-integration.md](model-integration.md)\n"}, "d55a58f4bc5f6a6b21368bee3ad465e5d1543926": {"t": 1785764996.8780298, "n": 1706, "h": "2f4b183b4e676d1f", "c": "# 使用说明\n\n这份文档用于说明项目的运行方式、环境变量和常见问题,方便直接启动和继续开发。\n\n## 运行模式\n\n### 1. 本地演示模式\n\n- 默认可用\n- 不要求配置 `OPENAI_API_KEY`\n- `/chat` 会返回内置的支持性建议\n- 适合先验证页面、接口和整体流程\n\n### 2. 模型调用模式\n\n- 需要配置 `OPENAI_API_KEY`\n- 可选配置 `OPENAI_BASE_URL` 和 `MODEL_NAME`\n- `/chat` 会调用 OpenAI 兼容接口返回模型回复\n- 适合继续验证真实模型能力\n\n## 环境变量\n\n可参考仓库根目录的 `.env.example`。\n\n| 变量名 | 说明 | 是否必填 |\n| --- | --- | --- |\n| `OPENAI_API_KEY` | OpenAI 兼容接口密钥,留空时自动进入本地演示模式 | 否 |\n| `OPENAI_BASE_URL` | OpenAI 兼容接口地址 | 否 |\n| `MODEL_NAME` | 调用的模型名称 | 否 |\n| `DEMO_MODE` | 设置为 `true` 时强制使用本地演示模式 | 否 |\n\n## 本地启动\n\n### 1. 创建虚拟环境并安装依赖\n\n```bash\npython -m venv .venv\n.venv\\Scripts\\activate\npython -m pip install -r requirements.txt -r requirements-dev.txt\n```\n\n### 2. 配置环境变量\n\n```powershell\nCopy-Item .env.example .env\n```\n\n### 3. 启动服务\n\n```bash\npython -m uvicorn app:app --reload\n```\n\n如果系统环境里缺少依赖,优先使用仓库虚拟环境:\n\n```powershell\n.\\.venv\\Scripts\\python -m uvicorn app:app --reload\n```\n\n也可以直接运行:\n\n```powershell\n.\\start-web.ps1\n```\n\n或者双击根目录的 `start-web.bat`。\n\n## 常用地址\n\n- `/`:Web 页面入口\n- `/chat`:对话接口\n- `/health`:健康检查\n- `/api/meta`:服务元信息与当前运行模式\n- `/docs`:Swagger 文档\n- `/project-docs/dingtalk-integration.md`:钉钉接入说明\n\n## 常见问题\n\n### 为什么没配 API Key 也能返回结果?\n\n因为项目默认支持本地演示模式。这样仓库拿下来后可以直接跑通流程,不会因为缺少密钥导致页面不可用。\n\n### 为什么配置了 API Key 还是走本地演示模式?\n\n检查 `.env` 中的 `DEMO_MODE` 是否被设置为 `true`。如果是,系统会优先使用本地演示模式。\n\n### 为什么系统环境里跑 `python -m pytest` 失败?\n\n通常是因为全局 Python 没安装测试依赖。优先使用仓库虚拟环境中的解释器,例如:\n\n```bash\n.\\.venv\\Scripts\\python -m pytest -q\n```\n\n### 为什么运行 `python -m uvicorn app:app --reload` 会报错?\n\n如果报错类似 `No module named uvicorn`,说明你用的是系统 Python,而不是项目虚拟环境。请改用:\n\n```powershell\n.\\.venv\\Scripts\\python -m uvicorn app:app --reload\n```\n\n或者直接运行 `start-web.ps1` / `start-web.bat`。\n\n### 钉钉是不是必须项?\n\n不是。当前项目可以作为独立 Web 服务运行,钉钉是可选的接入场景。\n"}, "4664b04ffbb37b67021899c06388c391dd338e29": {"t": 1785764998.3254688, "n": 1308, "h": "2f84c42ded09f309", "c": "# 使用说明\n\n这份文档用于说明项目的运行方式、环境变量和常见问题,方便直接启动和继续开发。\n\n## 运行模式\n\n### 1. 本地演示模式\n\n- 默认可用\n- 不要求配置 `OPENAI_API_KEY`\n- `/chat` 会返回内置的支持性建议\n- 适合先验证页面、接口和整体流程\n\n### 2. 模型调用模式\n\n- 需要配置 `OPENAI_API_KEY`\n- 可选配置 `OPENAI_BASE_URL` 和 `MODEL_NAME`\n- `/chat` 会调用 OpenAI 兼容接口返回模型回复\n- 适合继续验证真实模型能力\n\n## 环境变量\n\n可参考仓库根目录的 `.env.example`。\n\n| 变量名 | 说明 | 是否必填 |\n| --- | --- | --- |\n| `OPENAI_API_KEY` | OpenAI 兼容接口密钥,留空时自动进入本地演示模式 | 否 |\n| `OPENAI_BASE_URL` | OpenAI 兼容接口地址 | 否 |\n| `MODEL_NAME` | 调用的模型名称 | 否 |\n| `DEMO_MODE` | 设置为 `true` 时强制使用本地演示模式 | 否 |\n\n## 本地启动\n\n### 1. 创建虚拟环境并安装依赖\n\n```bash\npython -m venv .venv\n.venv\\Scripts\\activate\npython -m pip install -r requirements.txt -r requirements-dev.txt\n```\n\n### 2. 配置环境变量\n\n```powershell\nCopy-Item .env.example .env\n```\n\n### 3. 启动服务\n\n```bash\npython -m uvicorn app:app --reload\n```\n\n## 常用地址\n\n- `/`:Web 页面入口\n- `/chat`:对话接口\n- `/health`:健康检查\n- `/api/meta`:服务元信息与当前运行模式\n- `/docs`:Swagger 文档\n- `/project-docs/dingtalk-integration.md`:钉钉接入说明\n\n## 常见问题\n\n### 为什么没配 API Key 也能返回结果?\n\n因为项目默认支持本地演示模式。这样仓库拿下来后可以直接跑通流程,不会因为缺少密钥导致页面不可用。\n\n### 为什么配置了 API Key 还是走本地演示模式?\n\n检查 `.env` 中的 `DEMO_MODE` 是否被设置为 `true`。如果是,系统会优先使用本地演示模式。\n\n### 为什么系统环境里跑 `python -m pytest` 失败?\n\n通常是因为全局 Python 没安装测试依赖。优先使用仓库虚拟环境中的解释器,例如:\n\n```bash\n.\\.venv\\Scripts\\python -m pytest -q\n```\n\n### 钉钉是不是必须项?\n\n不是。当前项目可以作为独立 Web 服务运行,钉钉是可选的接入场景。\n"}}, "README.md": {"ae16815c4abd513e54177647e0738b109a8a5ee5": {"t": 1785746503.1947422, "n": 10723, "h": "f4e6ed056dfaa5c5", "c": "# 知愈星 AI Assistant\n\n[中文](README.md) | [English](README_EN.md)\n\n在线 Demo(部署后):`https://1420079678-ctrl.github.io/zhiyuxing-ai-assistant/`\n\n![Python 3.13](https://img.shields.io/badge/Python-3.13-3776AB?logo=python&logoColor=white)\n![FastAPI](https://img.shields.io/badge/FastAPI-Service-009688?logo=fastapi&logoColor=white)\n![CI](https://github.com/1420079678-ctrl/zhiyuxing-ai-assistant/actions/workflows/ci.yml/badge.svg)\n![License](https://img.shields.io/badge/License-MIT-green.svg)\n[![Live Demo](https://img.shields.io/badge/Live%20Demo-GitHub%20Pages-145f66)](https://1420079678-ctrl.github.io/zhiyuxing-ai-assistant/)\n[![Release](https://img.shields.io/github/v/release/1420079678-ctrl/zhiyuxing-ai-assistant)](https://github.com/1420079678-ctrl/zhiyuxing-ai-assistant/releases/latest)\n[![Stars](https://img.shields.io/github/stars/1420079678-ctrl/zhiyuxing-ai-assistant?style=social)](https://github.com/1420079678-ctrl/zhiyuxing-ai-assistant)\n\n面向大学生场景的 AI 情绪支持与学习辅助服务,围绕学业压力、拖延内耗、考试与面试焦虑等高频问题,提供温和、具体、可执行的支持性建议。\n\n这个仓库的目标不是单纯展示方案,而是提供一个可以直接运行、便于继续开发、也能逐步接入钉钉等平台的完整项目基础。\n\n如果这个项目对你有帮助,欢迎点一个 `Star`。\n\n## 快速入口\n\n- `在线体验`:[Live Demo](https://1420079678-ctrl.github.io/zhiyuxing-ai-assistant/)\n- `下载发布包`:[Latest Release](https://github.com/1420079678-ctrl/zhiyuxing-ai-assistant/releases/latest)\n- `英文说明`:[README_EN.md](README_EN.md)\n- `模型接入`:[docs/model-integration.md](docs/model-integration.md)\n- `API 参考`:[docs/api-reference.md](docs/api-reference.md)\n- `受限公开后端`:[docs/public-demo.md](docs/public-demo.md)\n- `启动排障`:[docs/troubleshooting.md](docs/troubleshooting.md)\n- `Release 安装`:[docs/release-install.md](docs/release-install.md)\n\n## 30 秒能看到什么\n\n- 一个可直接打开的在线 Demo,而不是只停留在方案文档\n- 一个可本地运行的 FastAPI + Web 项目,而不是只有截图\n- 一个可临时公开访问的受限后端,而不是只能在本机自测\n- 一个支持 OpenAI / DeepSeek 接入、知识检索、会话记忆和兼容性检查的工程化仓库\n\n说明:\nGitHub Pages 上的在线 Demo 主要用于公开展示页面和交互流程;完整的知识库检索、会话持久化、反馈记录和真实模型调用,需要按下文步骤本地启动后端。\n\n## 项目价值\n\n- 聚焦真实且高频的大学生使用场景,而不是泛化聊天。\n- 把“情绪支持”和“学习行动建议”放进同一轮对话,形成更完整的支持闭环。\n- 支持无密钥运行的本地演示模式,拿到仓库后可以直接启动和体验。\n- 预留模型调用和钉钉集成空间,便于后续继续做成更完整的产品。\n\n## 核心能力\n\n- `情绪支持对话`:识别压力、焦虑、拖延等常见表达,给出温和回应。\n- `学习行动建议`:把大问题拆成可立刻执行的小步骤,降低启动门槛。\n- `本地知识库检索`:根据问题检索内置心理支持与学习建议文档片段,增强回复内容。\n- `自定义知识文档接入`:可通过 API 把自定义 Markdown / 文本写入知识库,形成更像 RAG 项目的可扩展入口。\n- `会话记忆与持久化`:自动记录最近对话,支持继续追问、查看历史和本地 SQLite 持久化。\n- `风险识别与转介兜底`:遇到高风险表达时优先切换固定安全回复,而不是继续普通对话。\n- `双运行模式`:未配置模型密钥时使用本地演示模式;配置后切换到 OpenAI 兼容模型调用模式。\n- `受限公开后端体验`:可一键启动临时公网隧道,让他人直接访问真实后端接口进行体验。\n- `Web 服务化`:提供可直接访问的页面、健康检查、接口元信息和 Swagger 文档。\n- `工程基础`:包含测试、CI、环境变量说明和补充文档。\n\n## 工程结构\n\n```text\nbackend/\n api/ # 路由层\n app_factory.py # FastAPI 应用装配\n chat_logic.py # 提示词、风格和 Demo 回复逻辑\n chat_service.py # 完整对话流程\n config.py # 运行配置\n runtime.py # 模型解析与兼容性检查\n schemas.py # 请求/响应模型\nservices/\n knowledge.py # 知识检索与自定义文档写入\n safety.py # 风险检测\n storage.py # SQLite 会话持久化\nstatic/ # Web 前端\ntests/ # 回归测试\n api/ # API 路由与集成测试\n services/ # chat / runtime / safety / knowledge / storage 单元测试\n conftest.py # 统一测试夹具\n```\n\n## 使用场景\n\n- 学业压力大,任务很多,不知道从哪里开始\n- 长期拖延,明知道该做但迟迟启动不了\n- 考试、答辩、面试前持续紧张,难以进入准备状态\n- 情绪混乱导致学习节奏失序,需要先稳定状态再恢复行动\n\n## 运行模式\n\n| 模式 | 说明 | 需要的配置 |\n| --- | --- | --- |\n| 本地演示模式 | 使用内置规则生成支持性回复,适合本地启动、调试界面和展示流程 | 无需 API Key |\n| 模型调用模式 | 调用 OpenAI 兼容接口生成回复,适合继续做真实能力验证 | 与当前模型匹配的 API Key |\n\n项目默认优先保证“拿到就能跑”。如果没有配置模型密钥,页面和 `/chat` 接口仍然可以完整返回结果。\n\n## 页面预览\n\n### 独立 Web 页面\n\n当前仓库默认运行的是独立 Web 页面,不需要打开钉钉即可访问和体验。\n\n![Web 页面预览](docs/assets/11-web-demo.png)\n\n也提供基于 GitHub Pages 的公开在线演示页,方便在不配置后端和 API Key 的情况下直接体验交互流程:\n\n- `https://1420079678-ctrl.github.io/zhiyuxing-ai-assistant/`\n\n### 钉钉接入场景示意\n\n下面两张图保留为钉钉平台接入场景示意,用于说明项目后续可以如何落到企业协同平台中。\n\n![平台界面示意](docs/assets/09-platform-overview.png)\n\n![对话界面示意](docs/assets/10-chat-demo.png)\n\n## 技术栈\n\n- Python 3.13\n- FastAPI\n- OpenAI Python SDK\n- Pydantic\n- python-dotenv\n- SQLite\n- Markdown Knowledge Base\n- Pytest\n- GitHub Actions\n\n## 架构图\n\n![技术架构图](docs/assets/07-technical-architecture.png)\n\n## 快速启动\n\n推荐使用 Python 3.13,以保持与当前本地开发和 CI 环境一致。\n\n### Release 压缩包安装\n\n如果你不想 clone 仓库,也不想手动配 Git,最省事的方式是直接下载 Release 压缩包:\n\n- [Latest Release](https://github.com/1420079678-ctrl/zhiyuxing-ai-assistant/releases/latest)\n\n优先下载:\n\n- `zhiyuxing-ai-assistant-release-v*.zip`\n\n这类压缩包里会额外包含:\n\n- `start-web.bat`\n- `doctor.bat`\n- `INSTALL.txt`\n\n完整说明见:[docs/release-install.md](docs/release-install.md)\n\n### 最简单启动方式\n\n如果你是刚 clone 下来,先进入项目根目录:\n\n```powershell\ncd zhiyuxing-ai-assistant\n```\n\n如果你只是想先把 Web 版跑起来,不想手动配虚拟环境,直接在项目根目录运行:\n\n```powershell\n.\\start-web.ps1\n```\n\n或者直接双击:\n\n```text\nstart-web.bat\n```\n\n首次运行时,脚本会自动:\n\n- 创建 `.venv`\n- 安装项目依赖\n- 自动复制 `.env`\n- 检查当前模型接入配置\n- 启动 Web 服务\n\n如果别人第一次运行失败,先不要手动折腾环境,直接运行:\n\n```powershell\n.\\doctor.ps1\n```\n\n或双击:\n\n```text\ndoctor.bat\n```\n\n这个脚本会自动检查:\n\n- 是否在项目根目录\n- Python 是否安装\n- `.venv` 和依赖是否能自动补齐\n- `8000` 端口是否被占用\n- 当前模型配置是否只能走 demo mode\n\n要跑测试也不需要自己记命令,直接运行:\n\n```powershell\ncd zhiyuxing-ai-assistant\n.\\run-tests.ps1\n```\n\n或双击:\n\n```text\nrun-tests.bat\n```\n\n### 1. 手动安装依赖(进阶)\n\n```bash\npython -m venv .venv\n.venv\\Scripts\\activate\npython -m pip install -r requirements.txt -r requirements-dev.txt\n```\n\n### 2. 一键配置模型接入\n\n推荐直接使用仓库根目录下一键脚本:\n\n```powershell\n.\\setup-openai.ps1\n.\\setup-deepseek-chat.ps1\n.\\setup-deepseek-r1.ps1\n```\n\n也可以双击对应的 `.bat` 文件。脚本会自动:\n\n- 不存在 `.env` 时,从 `.env.example` 复制一份\n- 按目标模型写入 `OPENAI_BASE_URL`、`MODEL_NAME`、`MODEL_PROVIDER`\n- 自动设置 `MODEL_API_KEY_ENV`,确保项目优先读取正确的密钥变量\n- 保留其他未切换的配置项\n\n需要注意:这几个脚本只是帮你一键写好模型接入配置,不是免 API Key 调用。\n\n- `.\\setup-openai.ps1` 对应 OpenAI 官方接口,真实调用需要 `OPENAI_API_KEY`\n- `.\\setup-deepseek-chat.ps1` 对应 DeepSeek Chat,真实调用需要 `DEEPSEEK_API_KEY`\n- `.\\setup-deepseek-r1.ps1` 对应 DeepSeek R1,真实调用也需要 `DEEPSEEK_API_KEY`\n\n如果运行脚本时没有填写对应 Key,项目仍然可以启动,但会自动回退到本地演示模式,不会真的调用线上模型。\n\n如果想手动配置,至少需要关注:\n\n- `OPENAI_API_KEY`\n- `DEEPSEEK_API_KEY`\n- `OPENAI_BASE_URL`\n- `MODEL_NAME`\n- `MODEL_PROVIDER`\n- `MODEL_API_KEY_ENV`\n- `MODEL_TEMPERATURE`\n- `DEMO_MODE`\n- `CHAT_DB_PATH`\n\n### 3. 启动前检查兼容性\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py\n```\n\n这个检查会直接告诉你:\n\n- 当前到底会读取哪个密钥变量\n- 当前模型和 API 地址是否存在明显错配\n- `deepseek-reasoner` 这类模型是否已经按兼容规则处理\n- 当前配置是否真的可以进入真实模型调用模式\n\n如果你已经填了真实 Key,还可以追加一次最小真实探测:\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py --probe\n```\n\n这一步会实际发起一次极小请求,用来确认“不是看起来兼容,而是真的能调通”。\n\n### 4. 启动服务\n\n```bash\npython -m uvicorn app:app --reload\n```\n\n如果你的系统 Python 没装项目依赖,最稳的方式是直接使用仓库自带虚拟环境:\n\n```powershell\n.\\.venv\\Scripts\\python -m uvicorn app:app --reload\n```\n\n也可以直接运行仓库根目录下的一键脚本:\n\n```powershell\n.\\start-web.ps1\n```\n\n或双击:\n\n```text\nstart-web.bat\n```\n\n如果你想把“真实后端”临时分享给老师、同学或面试官,也可以启动受限公开演示:\n\n```powershell\n.\\start-public-demo.ps1\n```\n\n这个脚本会自动启动一个专用后端并建立临时公网隧道,终端里会打印一个可直接访问的公开 URL。需要注意:\n\n- 它会强制启用 `PUBLIC_DEMO_MODE=true`\n- `/chat`、`/api/meta`、`/docs` 等读接口可访问\n- `/api/knowledge/documents` 与 `/api/feedback` 等写接口会被禁止\n- 它只适合公开演示,不会发起真实模型调用\n- 链接只在你的电脑和脚本持续运行时有效\n\n更完整说明见:[docs/public-demo.md](docs/public-demo.md)\n\n启动后可访问:\n\n- `http://127.0.0.1:8000/`\n- `http://127.0.0.1:8000/api/meta`\n- `http://127.0.0.1:8000/api/compatibility`\n- `http://127.0.0.1:8000/api/knowledge/search?q=失眠`\n- `http://127.0.0.1:8000/api/session/<session_id>`\n- `http://127.0.0.1:8000/health`\n- `http://127.0.0.1:8000/docs`\n- `http://127.0.0.1:8000/project-docs/usage-guide.md`\n\n### 5. 运行测试\n\n```bash\npython -m pytest -vv\n```\n\n更推荐直接使用仓库脚本,这样不会误用系统 Python:\n\n```powershell\n.\\run-tests.ps1\n```\n\n当前测试已经按子系统拆分,不再集中在单个文件里:\n\n- `tests/api/test_api.py`\n- `tests/services/test_chat_logic.py`\n- `tests/services/test_runtime.py`\n- `tests/services/test_knowledge.py`\n- `tests/services/test_safety.py`\n- `tests/services/test_storage.py`\n\n如果只想针对某个层级回归,也可以这样运行:\n\n```bash\npython -m pytest tests/api tests/services -vv\n```\n\n## 接口概览\n\n- `GET /`:Web 页面入口\n- `POST /chat`:对话接口\n- `GET /health`:服务健康检查\n- `GET /api/meta`:服务元信息与当前运行模式\n- `GET /api/compatibility`:模型接入兼容性检查\n- `GET /api/knowledge/search`:本地知识库检索\n- `GET /api/knowledge/documents`:列出当前知识文档\n- `POST /api/knowledge/documents`:写入自定义知识文档\n- `GET /api/session/{session_id}`:最近会话记录\n- `POST /api/feedback`:对回复提交有帮助 / 需要更具体的反馈\n- `GET /docs`:Swagger 文档\n- `GET /project-docs/...`:项目补充文档\n\n### `POST /chat`\n\n请求示例:\n\n```json\n{\n \"message\": \"这周压力很大,感觉完全学不进去。\",\n \"system_hint\": \"给出温和且可执行的建议\"\n}\n```\n\n返回示例:\n\n```json\n{\n \"reply\": \"当前状态里明显存在压力堆积,可以先不追求一次解决整周问题,而是把任务缩小到今天最容易开始的一步,比如先完成 20 分钟复习。\",\n \"note\": \"当前为模型调用模式。回复由配置的 OpenAI 兼容接口生成,并结合了最近会话与知识库片段。\",\n \"mode\": \"openai\",\n \"session_id\": \"sess_xxxxxxxxxxxx\",\n \"assistant_message_id\": 12,\n \"memory_messages_used\": 2,\n \"knowledge_hits\": [\n {\n \"title\": \"考试压力与恢复\",\n \"excerpt\": \"当考试焦虑已经影响睡眠时,建议同时安排线下支持和短时复习块。\",\n \"source_path\": \"knowledge_base/04-sleep-and-recovery.md\",\n \"score\": 3.8\n }\n ],\n \"safety\": {\n \"level\": \"medium\",\n \"label\": \"需要额外关注\",\n \"note\": \"检测到持续失眠、崩溃或明显耗竭相关表达,建议尽快联系线下支持资源。\",\n \"needs_human_support\": true,\n \"matched_keywords\": [\"失眠\"]\n }\n}\n```\n\n## 文档入口\n\n- 中文:\n [docs/api-reference.md](docs/api-reference.md)、\n [docs/project-report.md](docs/project-report.md)、\n [docs/usage-guide.md](docs/usage-guide.md)、\n [docs/model-integration.md](docs/model-integration.md)、\n [docs/dingtalk-integration.md](docs/dingtalk-integration.md)\n- English:\n [docs/api-reference.en.md](docs/api-reference.en.md)、\n [docs/project-report.en.md](docs/project-report.en.md)、\n [docs/usage-guide.en.md](docs/usage-guide.en.md)、\n [docs/model-integration.en.md](docs/model-integration.en.md)、\n [docs/dingtalk-integration.en.md](docs/dingtalk-integration.en.md)\n- 其他:\n [CONTRIBUTING.md](CONTRIBUTING.md)、\n [CHANGELOG.md](CHANGELOG.md)、\n [LICENSE](LICENSE)、\n [ROADMAP.md](ROADMAP.md)、\n [SECURITY.md](SECURITY.md)、\n [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md)、\n [docs/github-launch-kit.md](docs/github-launch-kit.md)\n\n## 路线图\n\n- 继续增强危机表达识别和更安全的引导边界\n- 继续扩展更多 OpenAI 兼容供应商的兼容检查\n- 增强多轮对话连续性与回复稳定性\n- 将本地知识库扩展到更多高校场景\n\n## 接入不同大模型\n\n当前项目后端使用的是 OpenAI 兼容接口,因此可以通过修改 `.env` 或直接运行一键脚本切换不同模型提供商。\n\n- 切到 OpenAI:运行 `.\\setup-openai.ps1`\n- 切到 DeepSeek Chat:运行 `.\\setup-deepseek-chat.ps1`\n- 切到 DeepSeek R1:运行 `.\\setup-deepseek-r1.ps1`\n- 切到其他 OpenAI 兼容供应商:运行 `scripts/setup_model_config.py` 并传入自定义 `base_url`、`model_name`、`api_key_env`\n- Web 页面支持直接下拉选择模型目标和辅导风格\n- 页面右侧会直接显示当前提供商、当前模型、API 地址和接入兼容检查结果\n\n再次强调:这些脚本表示“项目已内置这些接入预设”,不是“这几个模型可以不填 Key 直接调用”。\n\n如果要接 `DeepSeek-R1`,当前代码已经处理了 `deepseek-reasoner` 的参数兼容问题,不会再强行传不适合的 `temperature` 参数。\n\n需要说明的是:本项目对 `OpenAI` 和 `DeepSeek` 官方接口可以做到明确兼容;对其他“OpenAI 兼容”供应商,是否完全兼容仍取决于对方是否真的支持 Chat Completions、当前模型名和常用参数格式。仓库里新增的兼容检查接口和脚本,就是用来把这件事提前说明白,而不是等运行时报错。\n\n## 安全边界\n\n- 项目定位是情绪支持和学习辅助,不替代专业心理诊断或治疗。\n- 当前实现强调温和、具体、避免危险引导的回复风格。\n- 如果用户出现持续失眠、严重低落或自伤相关表达,实际产品应优先引导线下求助与转介。\n\n## 钉钉接入说明\n\n- Web 页面是默认入口,便于直接访问和继续开发。\n- 钉钉是可选的真实业务接入场景,不影响项目本身独立运行。\n- 如果当前接的是钉钉`企业内部应用`,通常只有该组织内成员才能在钉钉里使用,往往还需要管理员授权。\n- 这意味着别人一般不能“直接打开你的钉钉版就用”,除非他加入该组织,或你把应用做成多组织分发 / 第三方应用。\n- 如果目标是让任何人都能直接体验,这个项目应以 Web 版为主入口,而不是把钉钉端当成唯一入口。\n\n## 测试与持续集成\n\n- 本地测试命令:`python -m pytest -vv`\n- 仓库已配置 GitHub Actions,在推送后自动运行基础测试\n"}, "2cda69c30bcdbe7da1d9a85c26212da942394801": {"t": 1785764988.896954, "n": 10326, "h": "d66b7e75d956f9f5", "c": "# 知愈星 AI Assistant\n\n[中文](README.md) | [English](README_EN.md)\n\n在线 Demo(部署后):`https://1420079678-ctrl.github.io/zhiyuxing-ai-assistant/`\n\n![Python 3.13](https://img.shields.io/badge/Python-3.13-3776AB?logo=python&logoColor=white)\n![FastAPI](https://img.shields.io/badge/FastAPI-Service-009688?logo=fastapi&logoColor=white)\n![CI](https://github.com/1420079678-ctrl/zhiyuxing-ai-assistant/actions/workflows/ci.yml/badge.svg)\n![License](https://img.shields.io/badge/License-MIT-green.svg)\n[![Live Demo](https://img.shields.io/badge/Live%20Demo-GitHub%20Pages-145f66)](https://1420079678-ctrl.github.io/zhiyuxing-ai-assistant/)\n[![Release](https://img.shields.io/github/v/release/1420079678-ctrl/zhiyuxing-ai-assistant)](https://github.com/1420079678-ctrl/zhiyuxing-ai-assistant/releases/tag/v0.1.0)\n[![Stars](https://img.shields.io/github/stars/1420079678-ctrl/zhiyuxing-ai-assistant?style=social)](https://github.com/1420079678-ctrl/zhiyuxing-ai-assistant)\n\n面向大学生场景的 AI 情绪支持与学习辅助服务,围绕学业压力、拖延内耗、考试与面试焦虑等高频问题,提供温和、具体、可执行的支持性建议。\n\n这个仓库的目标不是单纯展示方案,而是提供一个可以直接运行、便于继续开发、也能逐步接入钉钉等平台的完整项目基础。\n\n如果这个项目对你有帮助,欢迎点一个 `Star`。\n\n## 快速入口\n\n- `在线体验`:[Live Demo](https://1420079678-ctrl.github.io/zhiyuxing-ai-assistant/)\n- `查看版本`:[v0.1.0 Release](https://github.com/1420079678-ctrl/zhiyuxing-ai-assistant/releases/tag/v0.1.0)\n- `英文说明`:[README_EN.md](README_EN.md)\n- `模型接入`:[docs/model-integration.md](docs/model-integration.md)\n- `API 参考`:[docs/api-reference.md](docs/api-reference.md)\n- `受限公开后端`:[docs/public-demo.md](docs/public-demo.md)\n- `启动排障`:[docs/troubleshooting.md](docs/troubleshooting.md)\n\n## 30 秒能看到什么\n\n- 一个可直接打开的在线 Demo,而不是只停留在方案文档\n- 一个可本地运行的 FastAPI + Web 项目,而不是只有截图\n- 一个可临时公开访问的受限后端,而不是只能在本机自测\n- 一个支持 OpenAI / DeepSeek 接入、知识检索、会话记忆和兼容性检查的工程化仓库\n\n说明:\nGitHub Pages 上的在线 Demo 主要用于公开展示页面和交互流程;完整的知识库检索、会话持久化、反馈记录和真实模型调用,需要按下文步骤本地启动后端。\n\n## 项目价值\n\n- 聚焦真实且高频的大学生使用场景,而不是泛化聊天。\n- 把“情绪支持”和“学习行动建议”放进同一轮对话,形成更完整的支持闭环。\n- 支持无密钥运行的本地演示模式,拿到仓库后可以直接启动和体验。\n- 预留模型调用和钉钉集成空间,便于后续继续做成更完整的产品。\n\n## 核心能力\n\n- `情绪支持对话`:识别压力、焦虑、拖延等常见表达,给出温和回应。\n- `学习行动建议`:把大问题拆成可立刻执行的小步骤,降低启动门槛。\n- `本地知识库检索`:根据问题检索内置心理支持与学习建议文档片段,增强回复内容。\n- `自定义知识文档接入`:可通过 API 把自定义 Markdown / 文本写入知识库,形成更像 RAG 项目的可扩展入口。\n- `会话记忆与持久化`:自动记录最近对话,支持继续追问、查看历史和本地 SQLite 持久化。\n- `风险识别与转介兜底`:遇到高风险表达时优先切换固定安全回复,而不是继续普通对话。\n- `双运行模式`:未配置模型密钥时使用本地演示模式;配置后切换到 OpenAI 兼容模型调用模式。\n- `受限公开后端体验`:可一键启动临时公网隧道,让他人直接访问真实后端接口进行体验。\n- `Web 服务化`:提供可直接访问的页面、健康检查、接口元信息和 Swagger 文档。\n- `工程基础`:包含测试、CI、环境变量说明和补充文档。\n\n## 工程结构\n\n```text\nbackend/\n api/ # 路由层\n app_factory.py # FastAPI 应用装配\n chat_logic.py # 提示词、风格和 Demo 回复逻辑\n chat_service.py # 完整对话流程\n config.py # 运行配置\n runtime.py # 模型解析与兼容性检查\n schemas.py # 请求/响应模型\nservices/\n knowledge.py # 知识检索与自定义文档写入\n safety.py # 风险检测\n storage.py # SQLite 会话持久化\nstatic/ # Web 前端\ntests/ # 回归测试\n api/ # API 路由与集成测试\n services/ # chat / runtime / safety / knowledge / storage 单元测试\n conftest.py # 统一测试夹具\n```\n\n## 使用场景\n\n- 学业压力大,任务很多,不知道从哪里开始\n- 长期拖延,明知道该做但迟迟启动不了\n- 考试、答辩、面试前持续紧张,难以进入准备状态\n- 情绪混乱导致学习节奏失序,需要先稳定状态再恢复行动\n\n## 运行模式\n\n| 模式 | 说明 | 需要的配置 |\n| --- | --- | --- |\n| 本地演示模式 | 使用内置规则生成支持性回复,适合本地启动、调试界面和展示流程 | 无需 API Key |\n| 模型调用模式 | 调用 OpenAI 兼容接口生成回复,适合继续做真实能力验证 | 与当前模型匹配的 API Key |\n\n项目默认优先保证“拿到就能跑”。如果没有配置模型密钥,页面和 `/chat` 接口仍然可以完整返回结果。\n\n## 页面预览\n\n### 独立 Web 页面\n\n当前仓库默认运行的是独立 Web 页面,不需要打开钉钉即可访问和体验。\n\n![Web 页面预览](docs/assets/11-web-demo.png)\n\n也提供基于 GitHub Pages 的公开在线演示页,方便在不配置后端和 API Key 的情况下直接体验交互流程:\n\n- `https://1420079678-ctrl.github.io/zhiyuxing-ai-assistant/`\n\n### 钉钉接入场景示意\n\n下面两张图保留为钉钉平台接入场景示意,用于说明项目后续可以如何落到企业协同平台中。\n\n![平台界面示意](docs/assets/09-platform-overview.png)\n\n![对话界面示意](docs/assets/10-chat-demo.png)\n\n## 技术栈\n\n- Python 3.13\n- FastAPI\n- OpenAI Python SDK\n- Pydantic\n- python-dotenv\n- SQLite\n- Markdown Knowledge Base\n- Pytest\n- GitHub Actions\n\n## 架构图\n\n![技术架构图](docs/assets/07-technical-architecture.png)\n\n## 快速启动\n\n推荐使用 Python 3.13,以保持与当前本地开发和 CI 环境一致。\n\n### 最简单启动方式\n\n如果你是刚 clone 下来,先进入项目根目录:\n\n```powershell\ncd zhiyuxing-ai-assistant\n```\n\n如果你只是想先把 Web 版跑起来,不想手动配虚拟环境,直接在项目根目录运行:\n\n```powershell\n.\\start-web.ps1\n```\n\n或者直接双击:\n\n```text\nstart-web.bat\n```\n\n首次运行时,脚本会自动:\n\n- 创建 `.venv`\n- 安装项目依赖\n- 自动复制 `.env`\n- 检查当前模型接入配置\n- 启动 Web 服务\n\n如果别人第一次运行失败,先不要手动折腾环境,直接运行:\n\n```powershell\n.\\doctor.ps1\n```\n\n或双击:\n\n```text\ndoctor.bat\n```\n\n这个脚本会自动检查:\n\n- 是否在项目根目录\n- Python 是否安装\n- `.venv` 和依赖是否能自动补齐\n- `8000` 端口是否被占用\n- 当前模型配置是否只能走 demo mode\n\n要跑测试也不需要自己记命令,直接运行:\n\n```powershell\ncd zhiyuxing-ai-assistant\n.\\run-tests.ps1\n```\n\n或双击:\n\n```text\nrun-tests.bat\n```\n\n### 1. 手动安装依赖(进阶)\n\n```bash\npython -m venv .venv\n.venv\\Scripts\\activate\npython -m pip install -r requirements.txt -r requirements-dev.txt\n```\n\n### 2. 一键配置模型接入\n\n推荐直接使用仓库根目录下一键脚本:\n\n```powershell\n.\\setup-openai.ps1\n.\\setup-deepseek-chat.ps1\n.\\setup-deepseek-r1.ps1\n```\n\n也可以双击对应的 `.bat` 文件。脚本会自动:\n\n- 不存在 `.env` 时,从 `.env.example` 复制一份\n- 按目标模型写入 `OPENAI_BASE_URL`、`MODEL_NAME`、`MODEL_PROVIDER`\n- 自动设置 `MODEL_API_KEY_ENV`,确保项目优先读取正确的密钥变量\n- 保留其他未切换的配置项\n\n需要注意:这几个脚本只是帮你一键写好模型接入配置,不是免 API Key 调用。\n\n- `.\\setup-openai.ps1` 对应 OpenAI 官方接口,真实调用需要 `OPENAI_API_KEY`\n- `.\\setup-deepseek-chat.ps1` 对应 DeepSeek Chat,真实调用需要 `DEEPSEEK_API_KEY`\n- `.\\setup-deepseek-r1.ps1` 对应 DeepSeek R1,真实调用也需要 `DEEPSEEK_API_KEY`\n\n如果运行脚本时没有填写对应 Key,项目仍然可以启动,但会自动回退到本地演示模式,不会真的调用线上模型。\n\n如果想手动配置,至少需要关注:\n\n- `OPENAI_API_KEY`\n- `DEEPSEEK_API_KEY`\n- `OPENAI_BASE_URL`\n- `MODEL_NAME`\n- `MODEL_PROVIDER`\n- `MODEL_API_KEY_ENV`\n- `MODEL_TEMPERATURE`\n- `DEMO_MODE`\n- `CHAT_DB_PATH`\n\n### 3. 启动前检查兼容性\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py\n```\n\n这个检查会直接告诉你:\n\n- 当前到底会读取哪个密钥变量\n- 当前模型和 API 地址是否存在明显错配\n- `deepseek-reasoner` 这类模型是否已经按兼容规则处理\n- 当前配置是否真的可以进入真实模型调用模式\n\n如果你已经填了真实 Key,还可以追加一次最小真实探测:\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py --probe\n```\n\n这一步会实际发起一次极小请求,用来确认“不是看起来兼容,而是真的能调通”。\n\n### 4. 启动服务\n\n```bash\npython -m uvicorn app:app --reload\n```\n\n如果你的系统 Python 没装项目依赖,最稳的方式是直接使用仓库自带虚拟环境:\n\n```powershell\n.\\.venv\\Scripts\\python -m uvicorn app:app --reload\n```\n\n也可以直接运行仓库根目录下的一键脚本:\n\n```powershell\n.\\start-web.ps1\n```\n\n或双击:\n\n```text\nstart-web.bat\n```\n\n如果你想把“真实后端”临时分享给老师、同学或面试官,也可以启动受限公开演示:\n\n```powershell\n.\\start-public-demo.ps1\n```\n\n这个脚本会自动启动一个专用后端并建立临时公网隧道,终端里会打印一个可直接访问的公开 URL。需要注意:\n\n- 它会强制启用 `PUBLIC_DEMO_MODE=true`\n- `/chat`、`/api/meta`、`/docs` 等读接口可访问\n- `/api/knowledge/documents` 与 `/api/feedback` 等写接口会被禁止\n- 它只适合公开演示,不会发起真实模型调用\n- 链接只在你的电脑和脚本持续运行时有效\n\n更完整说明见:[docs/public-demo.md](docs/public-demo.md)\n\n启动后可访问:\n\n- `http://127.0.0.1:8000/`\n- `http://127.0.0.1:8000/api/meta`\n- `http://127.0.0.1:8000/api/compatibility`\n- `http://127.0.0.1:8000/api/knowledge/search?q=失眠`\n- `http://127.0.0.1:8000/api/session/<session_id>`\n- `http://127.0.0.1:8000/health`\n- `http://127.0.0.1:8000/docs`\n- `http://127.0.0.1:8000/project-docs/usage-guide.md`\n\n### 5. 运行测试\n\n```bash\npython -m pytest -vv\n```\n\n更推荐直接使用仓库脚本,这样不会误用系统 Python:\n\n```powershell\n.\\run-tests.ps1\n```\n\n当前测试已经按子系统拆分,不再集中在单个文件里:\n\n- `tests/api/test_api.py`\n- `tests/services/test_chat_logic.py`\n- `tests/services/test_runtime.py`\n- `tests/services/test_knowledge.py`\n- `tests/services/test_safety.py`\n- `tests/services/test_storage.py`\n\n如果只想针对某个层级回归,也可以这样运行:\n\n```bash\npython -m pytest tests/api tests/services -vv\n```\n\n## 接口概览\n\n- `GET /`:Web 页面入口\n- `POST /chat`:对话接口\n- `GET /health`:服务健康检查\n- `GET /api/meta`:服务元信息与当前运行模式\n- `GET /api/compatibility`:模型接入兼容性检查\n- `GET /api/knowledge/search`:本地知识库检索\n- `GET /api/knowledge/documents`:列出当前知识文档\n- `POST /api/knowledge/documents`:写入自定义知识文档\n- `GET /api/session/{session_id}`:最近会话记录\n- `POST /api/feedback`:对回复提交有帮助 / 需要更具体的反馈\n- `GET /docs`:Swagger 文档\n- `GET /project-docs/...`:项目补充文档\n\n### `POST /chat`\n\n请求示例:\n\n```json\n{\n \"message\": \"这周压力很大,感觉完全学不进去。\",\n \"system_hint\": \"给出温和且可执行的建议\"\n}\n```\n\n返回示例:\n\n```json\n{\n \"reply\": \"当前状态里明显存在压力堆积,可以先不追求一次解决整周问题,而是把任务缩小到今天最容易开始的一步,比如先完成 20 分钟复习。\",\n \"note\": \"当前为模型调用模式。回复由配置的 OpenAI 兼容接口生成,并结合了最近会话与知识库片段。\",\n \"mode\": \"openai\",\n \"session_id\": \"sess_xxxxxxxxxxxx\",\n \"assistant_message_id\": 12,\n \"memory_messages_used\": 2,\n \"knowledge_hits\": [\n {\n \"title\": \"考试压力与恢复\",\n \"excerpt\": \"当考试焦虑已经影响睡眠时,建议同时安排线下支持和短时复习块。\",\n \"source_path\": \"knowledge_base/04-sleep-and-recovery.md\",\n \"score\": 3.8\n }\n ],\n \"safety\": {\n \"level\": \"medium\",\n \"label\": \"需要额外关注\",\n \"note\": \"检测到持续失眠、崩溃或明显耗竭相关表达,建议尽快联系线下支持资源。\",\n \"needs_human_support\": true,\n \"matched_keywords\": [\"失眠\"]\n }\n}\n```\n\n## 文档入口\n\n- 中文:\n [docs/api-reference.md](docs/api-reference.md)、\n [docs/project-report.md](docs/project-report.md)、\n [docs/usage-guide.md](docs/usage-guide.md)、\n [docs/model-integration.md](docs/model-integration.md)、\n [docs/dingtalk-integration.md](docs/dingtalk-integration.md)\n- English:\n [docs/api-reference.en.md](docs/api-reference.en.md)、\n [docs/project-report.en.md](docs/project-report.en.md)、\n [docs/usage-guide.en.md](docs/usage-guide.en.md)、\n [docs/model-integration.en.md](docs/model-integration.en.md)、\n [docs/dingtalk-integration.en.md](docs/dingtalk-integration.en.md)\n- 其他:\n [CONTRIBUTING.md](CONTRIBUTING.md)、\n [CHANGELOG.md](CHANGELOG.md)、\n [LICENSE](LICENSE)、\n [ROADMAP.md](ROADMAP.md)、\n [SECURITY.md](SECURITY.md)、\n [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md)、\n [docs/github-launch-kit.md](docs/github-launch-kit.md)\n\n## 路线图\n\n- 继续增强危机表达识别和更安全的引导边界\n- 继续扩展更多 OpenAI 兼容供应商的兼容检查\n- 增强多轮对话连续性与回复稳定性\n- 将本地知识库扩展到更多高校场景\n\n## 接入不同大模型\n\n当前项目后端使用的是 OpenAI 兼容接口,因此可以通过修改 `.env` 或直接运行一键脚本切换不同模型提供商。\n\n- 切到 OpenAI:运行 `.\\setup-openai.ps1`\n- 切到 DeepSeek Chat:运行 `.\\setup-deepseek-chat.ps1`\n- 切到 DeepSeek R1:运行 `.\\setup-deepseek-r1.ps1`\n- 切到其他 OpenAI 兼容供应商:运行 `scripts/setup_model_config.py` 并传入自定义 `base_url`、`model_name`、`api_key_env`\n- Web 页面支持直接下拉选择模型目标和辅导风格\n- 页面右侧会直接显示当前提供商、当前模型、API 地址和接入兼容检查结果\n\n再次强调:这些脚本表示“项目已内置这些接入预设”,不是“这几个模型可以不填 Key 直接调用”。\n\n如果要接 `DeepSeek-R1`,当前代码已经处理了 `deepseek-reasoner` 的参数兼容问题,不会再强行传不适合的 `temperature` 参数。\n\n需要说明的是:本项目对 `OpenAI` 和 `DeepSeek` 官方接口可以做到明确兼容;对其他“OpenAI 兼容”供应商,是否完全兼容仍取决于对方是否真的支持 Chat Completions、当前模型名和常用参数格式。仓库里新增的兼容检查接口和脚本,就是用来把这件事提前说明白,而不是等运行时报错。\n\n## 安全边界\n\n- 项目定位是情绪支持和学习辅助,不替代专业心理诊断或治疗。\n- 当前实现强调温和、具体、避免危险引导的回复风格。\n- 如果用户出现持续失眠、严重低落或自伤相关表达,实际产品应优先引导线下求助与转介。\n\n## 钉钉接入说明\n\n- Web 页面是默认入口,便于直接访问和继续开发。\n- 钉钉是可选的真实业务接入场景,不影响项目本身独立运行。\n- 如果当前接的是钉钉`企业内部应用`,通常只有该组织内成员才能在钉钉里使用,往往还需要管理员授权。\n- 这意味着别人一般不能“直接打开你的钉钉版就用”,除非他加入该组织,或你把应用做成多组织分发 / 第三方应用。\n- 如果目标是让任何人都能直接体验,这个项目应以 Web 版为主入口,而不是把钉钉端当成唯一入口。\n\n## 测试与持续集成\n\n- 本地测试命令:`python -m pytest -vv`\n- 仓库已配置 GitHub Actions,在推送后自动运行基础测试\n"}, "23b14c2dabc789999027e8f10032a8bcb041ab36": {"t": 1785764990.728488, "n": 10075, "h": "990ded4aa6d4de43", "c": "# 知愈星 AI Assistant\n\n[中文](README.md) | [English](README_EN.md)\n\n在线 Demo(部署后):`https://1420079678-ctrl.github.io/zhiyuxing-ai-assistant/`\n\n![Python 3.13](https://img.shields.io/badge/Python-3.13-3776AB?logo=python&logoColor=white)\n![FastAPI](https://img.shields.io/badge/FastAPI-Service-009688?logo=fastapi&logoColor=white)\n![CI](https://github.com/1420079678-ctrl/zhiyuxing-ai-assistant/actions/workflows/ci.yml/badge.svg)\n![License](https://img.shields.io/badge/License-MIT-green.svg)\n[![Live Demo](https://img.shields.io/badge/Live%20Demo-GitHub%20Pages-145f66)](https://1420079678-ctrl.github.io/zhiyuxing-ai-assistant/)\n[![Release](https://img.shields.io/github/v/release/1420079678-ctrl/zhiyuxing-ai-assistant)](https://github.com/1420079678-ctrl/zhiyuxing-ai-assistant/releases/tag/v0.1.0)\n[![Stars](https://img.shields.io/github/stars/1420079678-ctrl/zhiyuxing-ai-assistant?style=social)](https://github.com/1420079678-ctrl/zhiyuxing-ai-assistant)\n\n面向大学生场景的 AI 情绪支持与学习辅助服务,围绕学业压力、拖延内耗、考试与面试焦虑等高频问题,提供温和、具体、可执行的支持性建议。\n\n这个仓库的目标不是单纯展示方案,而是提供一个可以直接运行、便于继续开发、也能逐步接入钉钉等平台的完整项目基础。\n\n如果这个项目对你有帮助,欢迎点一个 `Star`。\n\n## 快速入口\n\n- `在线体验`:[Live Demo](https://1420079678-ctrl.github.io/zhiyuxing-ai-assistant/)\n- `查看版本`:[v0.1.0 Release](https://github.com/1420079678-ctrl/zhiyuxing-ai-assistant/releases/tag/v0.1.0)\n- `英文说明`:[README_EN.md](README_EN.md)\n- `模型接入`:[docs/model-integration.md](docs/model-integration.md)\n- `API 参考`:[docs/api-reference.md](docs/api-reference.md)\n- `受限公开后端`:[docs/public-demo.md](docs/public-demo.md)\n\n## 30 秒能看到什么\n\n- 一个可直接打开的在线 Demo,而不是只停留在方案文档\n- 一个可本地运行的 FastAPI + Web 项目,而不是只有截图\n- 一个可临时公开访问的受限后端,而不是只能在本机自测\n- 一个支持 OpenAI / DeepSeek 接入、知识检索、会话记忆和兼容性检查的工程化仓库\n\n说明:\nGitHub Pages 上的在线 Demo 主要用于公开展示页面和交互流程;完整的知识库检索、会话持久化、反馈记录和真实模型调用,需要按下文步骤本地启动后端。\n\n## 项目价值\n\n- 聚焦真实且高频的大学生使用场景,而不是泛化聊天。\n- 把“情绪支持”和“学习行动建议”放进同一轮对话,形成更完整的支持闭环。\n- 支持无密钥运行的本地演示模式,拿到仓库后可以直接启动和体验。\n- 预留模型调用和钉钉集成空间,便于后续继续做成更完整的产品。\n\n## 核心能力\n\n- `情绪支持对话`:识别压力、焦虑、拖延等常见表达,给出温和回应。\n- `学习行动建议`:把大问题拆成可立刻执行的小步骤,降低启动门槛。\n- `本地知识库检索`:根据问题检索内置心理支持与学习建议文档片段,增强回复内容。\n- `自定义知识文档接入`:可通过 API 把自定义 Markdown / 文本写入知识库,形成更像 RAG 项目的可扩展入口。\n- `会话记忆与持久化`:自动记录最近对话,支持继续追问、查看历史和本地 SQLite 持久化。\n- `风险识别与转介兜底`:遇到高风险表达时优先切换固定安全回复,而不是继续普通对话。\n- `双运行模式`:未配置模型密钥时使用本地演示模式;配置后切换到 OpenAI 兼容模型调用模式。\n- `受限公开后端体验`:可一键启动临时公网隧道,让他人直接访问真实后端接口进行体验。\n- `Web 服务化`:提供可直接访问的页面、健康检查、接口元信息和 Swagger 文档。\n- `工程基础`:包含测试、CI、环境变量说明和补充文档。\n\n## 工程结构\n\n```text\nbackend/\n api/ # 路由层\n app_factory.py # FastAPI 应用装配\n chat_logic.py # 提示词、风格和 Demo 回复逻辑\n chat_service.py # 完整对话流程\n config.py # 运行配置\n runtime.py # 模型解析与兼容性检查\n schemas.py # 请求/响应模型\nservices/\n knowledge.py # 知识检索与自定义文档写入\n safety.py # 风险检测\n storage.py # SQLite 会话持久化\nstatic/ # Web 前端\ntests/ # 回归测试\n api/ # API 路由与集成测试\n services/ # chat / runtime / safety / knowledge / storage 单元测试\n conftest.py # 统一测试夹具\n```\n\n## 使用场景\n\n- 学业压力大,任务很多,不知道从哪里开始\n- 长期拖延,明知道该做但迟迟启动不了\n- 考试、答辩、面试前持续紧张,难以进入准备状态\n- 情绪混乱导致学习节奏失序,需要先稳定状态再恢复行动\n\n## 运行模式\n\n| 模式 | 说明 | 需要的配置 |\n| --- | --- | --- |\n| 本地演示模式 | 使用内置规则生成支持性回复,适合本地启动、调试界面和展示流程 | 无需 API Key |\n| 模型调用模式 | 调用 OpenAI 兼容接口生成回复,适合继续做真实能力验证 | 与当前模型匹配的 API Key |\n\n项目默认优先保证“拿到就能跑”。如果没有配置模型密钥,页面和 `/chat` 接口仍然可以完整返回结果。\n\n## 页面预览\n\n### 独立 Web 页面\n\n当前仓库默认运行的是独立 Web 页面,不需要打开钉钉即可访问和体验。\n\n![Web 页面预览](docs/assets/11-web-demo.png)\n\n也提供基于 GitHub Pages 的公开在线演示页,方便在不配置后端和 API Key 的情况下直接体验交互流程:\n\n- `https://1420079678-ctrl.github.io/zhiyuxing-ai-assistant/`\n\n### 钉钉接入场景示意\n\n下面两张图保留为钉钉平台接入场景示意,用于说明项目后续可以如何落到企业协同平台中。\n\n![平台界面示意](docs/assets/09-platform-overview.png)\n\n![对话界面示意](docs/assets/10-chat-demo.png)\n\n## 技术栈\n\n- Python 3.13\n- FastAPI\n- OpenAI Python SDK\n- Pydantic\n- python-dotenv\n- SQLite\n- Markdown Knowledge Base\n- Pytest\n- GitHub Actions\n\n## 架构图\n\n![技术架构图](docs/assets/07-technical-architecture.png)\n\n## 快速启动\n\n推荐使用 Python 3.13,以保持与当前本地开发和 CI 环境一致。\n\n### 最简单启动方式\n\n如果你是刚 clone 下来,先进入项目根目录:\n\n```powershell\ncd zhiyuxing-ai-assistant\n```\n\n如果你只是想先把 Web 版跑起来,不想手动配虚拟环境,直接在项目根目录运行:\n\n```powershell\n.\\start-web.ps1\n```\n\n或者直接双击:\n\n```text\nstart-web.bat\n```\n\n首次运行时,脚本会自动:\n\n- 创建 `.venv`\n- 安装项目依赖\n- 自动复制 `.env`\n- 检查当前模型接入配置\n- 启动 Web 服务\n\n要跑测试也不需要自己记命令,直接运行:\n\n```powershell\ncd zhiyuxing-ai-assistant\n.\\run-tests.ps1\n```\n\n或双击:\n\n```text\nrun-tests.bat\n```\n\n### 1. 手动安装依赖(进阶)\n\n```bash\npython -m venv .venv\n.venv\\Scripts\\activate\npython -m pip install -r requirements.txt -r requirements-dev.txt\n```\n\n### 2. 一键配置模型接入\n\n推荐直接使用仓库根目录下一键脚本:\n\n```powershell\n.\\setup-openai.ps1\n.\\setup-deepseek-chat.ps1\n.\\setup-deepseek-r1.ps1\n```\n\n也可以双击对应的 `.bat` 文件。脚本会自动:\n\n- 不存在 `.env` 时,从 `.env.example` 复制一份\n- 按目标模型写入 `OPENAI_BASE_URL`、`MODEL_NAME`、`MODEL_PROVIDER`\n- 自动设置 `MODEL_API_KEY_ENV`,确保项目优先读取正确的密钥变量\n- 保留其他未切换的配置项\n\n需要注意:这几个脚本只是帮你一键写好模型接入配置,不是免 API Key 调用。\n\n- `.\\setup-openai.ps1` 对应 OpenAI 官方接口,真实调用需要 `OPENAI_API_KEY`\n- `.\\setup-deepseek-chat.ps1` 对应 DeepSeek Chat,真实调用需要 `DEEPSEEK_API_KEY`\n- `.\\setup-deepseek-r1.ps1` 对应 DeepSeek R1,真实调用也需要 `DEEPSEEK_API_KEY`\n\n如果运行脚本时没有填写对应 Key,项目仍然可以启动,但会自动回退到本地演示模式,不会真的调用线上模型。\n\n如果想手动配置,至少需要关注:\n\n- `OPENAI_API_KEY`\n- `DEEPSEEK_API_KEY`\n- `OPENAI_BASE_URL`\n- `MODEL_NAME`\n- `MODEL_PROVIDER`\n- `MODEL_API_KEY_ENV`\n- `MODEL_TEMPERATURE`\n- `DEMO_MODE`\n- `CHAT_DB_PATH`\n\n### 3. 启动前检查兼容性\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py\n```\n\n这个检查会直接告诉你:\n\n- 当前到底会读取哪个密钥变量\n- 当前模型和 API 地址是否存在明显错配\n- `deepseek-reasoner` 这类模型是否已经按兼容规则处理\n- 当前配置是否真的可以进入真实模型调用模式\n\n如果你已经填了真实 Key,还可以追加一次最小真实探测:\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py --probe\n```\n\n这一步会实际发起一次极小请求,用来确认“不是看起来兼容,而是真的能调通”。\n\n### 4. 启动服务\n\n```bash\npython -m uvicorn app:app --reload\n```\n\n如果你的系统 Python 没装项目依赖,最稳的方式是直接使用仓库自带虚拟环境:\n\n```powershell\n.\\.venv\\Scripts\\python -m uvicorn app:app --reload\n```\n\n也可以直接运行仓库根目录下的一键脚本:\n\n```powershell\n.\\start-web.ps1\n```\n\n或双击:\n\n```text\nstart-web.bat\n```\n\n如果你想把“真实后端”临时分享给老师、同学或面试官,也可以启动受限公开演示:\n\n```powershell\n.\\start-public-demo.ps1\n```\n\n这个脚本会自动启动一个专用后端并建立临时公网隧道,终端里会打印一个可直接访问的公开 URL。需要注意:\n\n- 它会强制启用 `PUBLIC_DEMO_MODE=true`\n- `/chat`、`/api/meta`、`/docs` 等读接口可访问\n- `/api/knowledge/documents` 与 `/api/feedback` 等写接口会被禁止\n- 它只适合公开演示,不会发起真实模型调用\n- 链接只在你的电脑和脚本持续运行时有效\n\n更完整说明见:[docs/public-demo.md](docs/public-demo.md)\n\n启动后可访问:\n\n- `http://127.0.0.1:8000/`\n- `http://127.0.0.1:8000/api/meta`\n- `http://127.0.0.1:8000/api/compatibility`\n- `http://127.0.0.1:8000/api/knowledge/search?q=失眠`\n- `http://127.0.0.1:8000/api/session/<session_id>`\n- `http://127.0.0.1:8000/health`\n- `http://127.0.0.1:8000/docs`\n- `http://127.0.0.1:8000/project-docs/usage-guide.md`\n\n### 5. 运行测试\n\n```bash\npython -m pytest -vv\n```\n\n更推荐直接使用仓库脚本,这样不会误用系统 Python:\n\n```powershell\n.\\run-tests.ps1\n```\n\n当前测试已经按子系统拆分,不再集中在单个文件里:\n\n- `tests/api/test_api.py`\n- `tests/services/test_chat_logic.py`\n- `tests/services/test_runtime.py`\n- `tests/services/test_knowledge.py`\n- `tests/services/test_safety.py`\n- `tests/services/test_storage.py`\n\n如果只想针对某个层级回归,也可以这样运行:\n\n```bash\npython -m pytest tests/api tests/services -vv\n```\n\n## 接口概览\n\n- `GET /`:Web 页面入口\n- `POST /chat`:对话接口\n- `GET /health`:服务健康检查\n- `GET /api/meta`:服务元信息与当前运行模式\n- `GET /api/compatibility`:模型接入兼容性检查\n- `GET /api/knowledge/search`:本地知识库检索\n- `GET /api/knowledge/documents`:列出当前知识文档\n- `POST /api/knowledge/documents`:写入自定义知识文档\n- `GET /api/session/{session_id}`:最近会话记录\n- `POST /api/feedback`:对回复提交有帮助 / 需要更具体的反馈\n- `GET /docs`:Swagger 文档\n- `GET /project-docs/...`:项目补充文档\n\n### `POST /chat`\n\n请求示例:\n\n```json\n{\n \"message\": \"这周压力很大,感觉完全学不进去。\",\n \"system_hint\": \"给出温和且可执行的建议\"\n}\n```\n\n返回示例:\n\n```json\n{\n \"reply\": \"当前状态里明显存在压力堆积,可以先不追求一次解决整周问题,而是把任务缩小到今天最容易开始的一步,比如先完成 20 分钟复习。\",\n \"note\": \"当前为模型调用模式。回复由配置的 OpenAI 兼容接口生成,并结合了最近会话与知识库片段。\",\n \"mode\": \"openai\",\n \"session_id\": \"sess_xxxxxxxxxxxx\",\n \"assistant_message_id\": 12,\n \"memory_messages_used\": 2,\n \"knowledge_hits\": [\n {\n \"title\": \"考试压力与恢复\",\n \"excerpt\": \"当考试焦虑已经影响睡眠时,建议同时安排线下支持和短时复习块。\",\n \"source_path\": \"knowledge_base/04-sleep-and-recovery.md\",\n \"score\": 3.8\n }\n ],\n \"safety\": {\n \"level\": \"medium\",\n \"label\": \"需要额外关注\",\n \"note\": \"检测到持续失眠、崩溃或明显耗竭相关表达,建议尽快联系线下支持资源。\",\n \"needs_human_support\": true,\n \"matched_keywords\": [\"失眠\"]\n }\n}\n```\n\n## 文档入口\n\n- 中文:\n [docs/api-reference.md](docs/api-reference.md)、\n [docs/project-report.md](docs/project-report.md)、\n [docs/usage-guide.md](docs/usage-guide.md)、\n [docs/model-integration.md](docs/model-integration.md)、\n [docs/dingtalk-integration.md](docs/dingtalk-integration.md)\n- English:\n [docs/api-reference.en.md](docs/api-reference.en.md)、\n [docs/project-report.en.md](docs/project-report.en.md)、\n [docs/usage-guide.en.md](docs/usage-guide.en.md)、\n [docs/model-integration.en.md](docs/model-integration.en.md)、\n [docs/dingtalk-integration.en.md](docs/dingtalk-integration.en.md)\n- 其他:\n [CONTRIBUTING.md](CONTRIBUTING.md)、\n [CHANGELOG.md](CHANGELOG.md)、\n [LICENSE](LICENSE)、\n [ROADMAP.md](ROADMAP.md)、\n [SECURITY.md](SECURITY.md)、\n [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md)、\n [docs/github-launch-kit.md](docs/github-launch-kit.md)\n\n## 路线图\n\n- 继续增强危机表达识别和更安全的引导边界\n- 继续扩展更多 OpenAI 兼容供应商的兼容检查\n- 增强多轮对话连续性与回复稳定性\n- 将本地知识库扩展到更多高校场景\n\n## 接入不同大模型\n\n当前项目后端使用的是 OpenAI 兼容接口,因此可以通过修改 `.env` 或直接运行一键脚本切换不同模型提供商。\n\n- 切到 OpenAI:运行 `.\\setup-openai.ps1`\n- 切到 DeepSeek Chat:运行 `.\\setup-deepseek-chat.ps1`\n- 切到 DeepSeek R1:运行 `.\\setup-deepseek-r1.ps1`\n- 切到其他 OpenAI 兼容供应商:运行 `scripts/setup_model_config.py` 并传入自定义 `base_url`、`model_name`、`api_key_env`\n- Web 页面支持直接下拉选择模型目标和辅导风格\n- 页面右侧会直接显示当前提供商、当前模型、API 地址和接入兼容检查结果\n\n再次强调:这些脚本表示“项目已内置这些接入预设”,不是“这几个模型可以不填 Key 直接调用”。\n\n如果要接 `DeepSeek-R1`,当前代码已经处理了 `deepseek-reasoner` 的参数兼容问题,不会再强行传不适合的 `temperature` 参数。\n\n需要说明的是:本项目对 `OpenAI` 和 `DeepSeek` 官方接口可以做到明确兼容;对其他“OpenAI 兼容”供应商,是否完全兼容仍取决于对方是否真的支持 Chat Completions、当前模型名和常用参数格式。仓库里新增的兼容检查接口和脚本,就是用来把这件事提前说明白,而不是等运行时报错。\n\n## 安全边界\n\n- 项目定位是情绪支持和学习辅助,不替代专业心理诊断或治疗。\n- 当前实现强调温和、具体、避免危险引导的回复风格。\n- 如果用户出现持续失眠、严重低落或自伤相关表达,实际产品应优先引导线下求助与转介。\n\n## 钉钉接入说明\n\n- Web 页面是默认入口,便于直接访问和继续开发。\n- 钉钉是可选的真实业务接入场景,不影响项目本身独立运行。\n- 如果当前接的是钉钉`企业内部应用`,通常只有该组织内成员才能在钉钉里使用,往往还需要管理员授权。\n- 这意味着别人一般不能“直接打开你的钉钉版就用”,除非他加入该组织,或你把应用做成多组织分发 / 第三方应用。\n- 如果目标是让任何人都能直接体验,这个项目应以 Web 版为主入口,而不是把钉钉端当成唯一入口。\n\n## 测试与持续集成\n\n- 本地测试命令:`python -m pytest -vv`\n- 仓库已配置 GitHub Actions,在推送后自动运行基础测试\n"}, "31967f3658110462b2c4944eec4dd26b8db241f0": {"t": 1785764992.4613962, "n": 9617, "h": "190b142ec9d37768", "c": "# 知愈星 AI Assistant\n\n[中文](README.md) | [English](README_EN.md)\n\n在线 Demo(部署后):`https://1420079678-ctrl.github.io/zhiyuxing-ai-assistant/`\n\n![Python 3.13](https://img.shields.io/badge/Python-3.13-3776AB?logo=python&logoColor=white)\n![FastAPI](https://img.shields.io/badge/FastAPI-Service-009688?logo=fastapi&logoColor=white)\n![CI](https://github.com/1420079678-ctrl/zhiyuxing-ai-assistant/actions/workflows/ci.yml/badge.svg)\n![License](https://img.shields.io/badge/License-MIT-green.svg)\n[![Live Demo](https://img.shields.io/badge/Live%20Demo-GitHub%20Pages-145f66)](https://1420079678-ctrl.github.io/zhiyuxing-ai-assistant/)\n[![Release](https://img.shields.io/github/v/release/1420079678-ctrl/zhiyuxing-ai-assistant)](https://github.com/1420079678-ctrl/zhiyuxing-ai-assistant/releases/tag/v0.1.0)\n[![Stars](https://img.shields.io/github/stars/1420079678-ctrl/zhiyuxing-ai-assistant?style=social)](https://github.com/1420079678-ctrl/zhiyuxing-ai-assistant)\n\n面向大学生场景的 AI 情绪支持与学习辅助服务,围绕学业压力、拖延内耗、考试与面试焦虑等高频问题,提供温和、具体、可执行的支持性建议。\n\n这个仓库的目标不是单纯展示方案,而是提供一个可以直接运行、便于继续开发、也能逐步接入钉钉等平台的完整项目基础。\n\n如果这个项目对你有帮助,欢迎点一个 `Star`。\n\n## 快速入口\n\n- `在线体验`:[Live Demo](https://1420079678-ctrl.github.io/zhiyuxing-ai-assistant/)\n- `查看版本`:[v0.1.0 Release](https://github.com/1420079678-ctrl/zhiyuxing-ai-assistant/releases/tag/v0.1.0)\n- `英文说明`:[README_EN.md](README_EN.md)\n- `模型接入`:[docs/model-integration.md](docs/model-integration.md)\n- `API 参考`:[docs/api-reference.md](docs/api-reference.md)\n- `受限公开后端`:[docs/public-demo.md](docs/public-demo.md)\n\n## 30 秒能看到什么\n\n- 一个可直接打开的在线 Demo,而不是只停留在方案文档\n- 一个可本地运行的 FastAPI + Web 项目,而不是只有截图\n- 一个可临时公开访问的受限后端,而不是只能在本机自测\n- 一个支持 OpenAI / DeepSeek 接入、知识检索、会话记忆和兼容性检查的工程化仓库\n\n说明:\nGitHub Pages 上的在线 Demo 主要用于公开展示页面和交互流程;完整的知识库检索、会话持久化、反馈记录和真实模型调用,需要按下文步骤本地启动后端。\n\n## 项目价值\n\n- 聚焦真实且高频的大学生使用场景,而不是泛化聊天。\n- 把“情绪支持”和“学习行动建议”放进同一轮对话,形成更完整的支持闭环。\n- 支持无密钥运行的本地演示模式,拿到仓库后可以直接启动和体验。\n- 预留模型调用和钉钉集成空间,便于后续继续做成更完整的产品。\n\n## 核心能力\n\n- `情绪支持对话`:识别压力、焦虑、拖延等常见表达,给出温和回应。\n- `学习行动建议`:把大问题拆成可立刻执行的小步骤,降低启动门槛。\n- `本地知识库检索`:根据问题检索内置心理支持与学习建议文档片段,增强回复内容。\n- `自定义知识文档接入`:可通过 API 把自定义 Markdown / 文本写入知识库,形成更像 RAG 项目的可扩展入口。\n- `会话记忆与持久化`:自动记录最近对话,支持继续追问、查看历史和本地 SQLite 持久化。\n- `风险识别与转介兜底`:遇到高风险表达时优先切换固定安全回复,而不是继续普通对话。\n- `双运行模式`:未配置模型密钥时使用本地演示模式;配置后切换到 OpenAI 兼容模型调用模式。\n- `受限公开后端体验`:可一键启动临时公网隧道,让他人直接访问真实后端接口进行体验。\n- `Web 服务化`:提供可直接访问的页面、健康检查、接口元信息和 Swagger 文档。\n- `工程基础`:包含测试、CI、环境变量说明和补充文档。\n\n## 工程结构\n\n```text\nbackend/\n api/ # 路由层\n app_factory.py # FastAPI 应用装配\n chat_logic.py # 提示词、风格和 Demo 回复逻辑\n chat_service.py # 完整对话流程\n config.py # 运行配置\n runtime.py # 模型解析与兼容性检查\n schemas.py # 请求/响应模型\nservices/\n knowledge.py # 知识检索与自定义文档写入\n safety.py # 风险检测\n storage.py # SQLite 会话持久化\nstatic/ # Web 前端\ntests/ # 回归测试\n api/ # API 路由与集成测试\n services/ # chat / runtime / safety / knowledge / storage 单元测试\n conftest.py # 统一测试夹具\n```\n\n## 使用场景\n\n- 学业压力大,任务很多,不知道从哪里开始\n- 长期拖延,明知道该做但迟迟启动不了\n- 考试、答辩、面试前持续紧张,难以进入准备状态\n- 情绪混乱导致学习节奏失序,需要先稳定状态再恢复行动\n\n## 运行模式\n\n| 模式 | 说明 | 需要的配置 |\n| --- | --- | --- |\n| 本地演示模式 | 使用内置规则生成支持性回复,适合本地启动、调试界面和展示流程 | 无需 API Key |\n| 模型调用模式 | 调用 OpenAI 兼容接口生成回复,适合继续做真实能力验证 | 与当前模型匹配的 API Key |\n\n项目默认优先保证“拿到就能跑”。如果没有配置模型密钥,页面和 `/chat` 接口仍然可以完整返回结果。\n\n## 页面预览\n\n### 独立 Web 页面\n\n当前仓库默认运行的是独立 Web 页面,不需要打开钉钉即可访问和体验。\n\n![Web 页面预览](docs/assets/11-web-demo.png)\n\n也提供基于 GitHub Pages 的公开在线演示页,方便在不配置后端和 API Key 的情况下直接体验交互流程:\n\n- `https://1420079678-ctrl.github.io/zhiyuxing-ai-assistant/`\n\n### 钉钉接入场景示意\n\n下面两张图保留为钉钉平台接入场景示意,用于说明项目后续可以如何落到企业协同平台中。\n\n![平台界面示意](docs/assets/09-platform-overview.png)\n\n![对话界面示意](docs/assets/10-chat-demo.png)\n\n## 技术栈\n\n- Python 3.13\n- FastAPI\n- OpenAI Python SDK\n- Pydantic\n- python-dotenv\n- SQLite\n- Markdown Knowledge Base\n- Pytest\n- GitHub Actions\n\n## 架构图\n\n![技术架构图](docs/assets/07-technical-architecture.png)\n\n## 快速启动\n\n推荐使用 Python 3.13,以保持与当前本地开发和 CI 环境一致。\n\n### 1. 安装依赖\n\n```bash\npython -m venv .venv\n.venv\\Scripts\\activate\npython -m pip install -r requirements.txt -r requirements-dev.txt\n```\n\n### 2. 一键配置模型接入\n\n推荐直接使用仓库根目录下一键脚本:\n\n```powershell\n.\\setup-openai.ps1\n.\\setup-deepseek-chat.ps1\n.\\setup-deepseek-r1.ps1\n```\n\n也可以双击对应的 `.bat` 文件。脚本会自动:\n\n- 不存在 `.env` 时,从 `.env.example` 复制一份\n- 按目标模型写入 `OPENAI_BASE_URL`、`MODEL_NAME`、`MODEL_PROVIDER`\n- 自动设置 `MODEL_API_KEY_ENV`,确保项目优先读取正确的密钥变量\n- 保留其他未切换的配置项\n\n需要注意:这几个脚本只是帮你一键写好模型接入配置,不是免 API Key 调用。\n\n- `.\\setup-openai.ps1` 对应 OpenAI 官方接口,真实调用需要 `OPENAI_API_KEY`\n- `.\\setup-deepseek-chat.ps1` 对应 DeepSeek Chat,真实调用需要 `DEEPSEEK_API_KEY`\n- `.\\setup-deepseek-r1.ps1` 对应 DeepSeek R1,真实调用也需要 `DEEPSEEK_API_KEY`\n\n如果运行脚本时没有填写对应 Key,项目仍然可以启动,但会自动回退到本地演示模式,不会真的调用线上模型。\n\n如果想手动配置,至少需要关注:\n\n- `OPENAI_API_KEY`\n- `DEEPSEEK_API_KEY`\n- `OPENAI_BASE_URL`\n- `MODEL_NAME`\n- `MODEL_PROVIDER`\n- `MODEL_API_KEY_ENV`\n- `MODEL_TEMPERATURE`\n- `DEMO_MODE`\n- `CHAT_DB_PATH`\n\n### 3. 启动前检查兼容性\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py\n```\n\n这个检查会直接告诉你:\n\n- 当前到底会读取哪个密钥变量\n- 当前模型和 API 地址是否存在明显错配\n- `deepseek-reasoner` 这类模型是否已经按兼容规则处理\n- 当前配置是否真的可以进入真实模型调用模式\n\n如果你已经填了真实 Key,还可以追加一次最小真实探测:\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py --probe\n```\n\n这一步会实际发起一次极小请求,用来确认“不是看起来兼容,而是真的能调通”。\n\n### 4. 启动服务\n\n```bash\npython -m uvicorn app:app --reload\n```\n\n如果你的系统 Python 没装项目依赖,最稳的方式是直接使用仓库自带虚拟环境:\n\n```powershell\n.\\.venv\\Scripts\\python -m uvicorn app:app --reload\n```\n\n也可以直接运行仓库根目录下的一键脚本:\n\n```powershell\n.\\start-web.ps1\n```\n\n或双击:\n\n```text\nstart-web.bat\n```\n\n如果你想把“真实后端”临时分享给老师、同学或面试官,也可以启动受限公开演示:\n\n```powershell\n.\\start-public-demo.ps1\n```\n\n这个脚本会自动启动一个专用后端并建立临时公网隧道,终端里会打印一个可直接访问的公开 URL。需要注意:\n\n- 它会强制启用 `PUBLIC_DEMO_MODE=true`\n- `/chat`、`/api/meta`、`/docs` 等读接口可访问\n- `/api/knowledge/documents` 与 `/api/feedback` 等写接口会被禁止\n- 它只适合公开演示,不会发起真实模型调用\n- 链接只在你的电脑和脚本持续运行时有效\n\n更完整说明见:[docs/public-demo.md](docs/public-demo.md)\n\n启动后可访问:\n\n- `http://127.0.0.1:8000/`\n- `http://127.0.0.1:8000/api/meta`\n- `http://127.0.0.1:8000/api/compatibility`\n- `http://127.0.0.1:8000/api/knowledge/search?q=失眠`\n- `http://127.0.0.1:8000/api/session/<session_id>`\n- `http://127.0.0.1:8000/health`\n- `http://127.0.0.1:8000/docs`\n- `http://127.0.0.1:8000/project-docs/usage-guide.md`\n\n### 5. 运行测试\n\n```bash\npython -m pytest -vv\n```\n\n当前测试已经按子系统拆分,不再集中在单个文件里:\n\n- `tests/api/test_api.py`\n- `tests/services/test_chat_logic.py`\n- `tests/services/test_runtime.py`\n- `tests/services/test_knowledge.py`\n- `tests/services/test_safety.py`\n- `tests/services/test_storage.py`\n\n如果只想针对某个层级回归,也可以这样运行:\n\n```bash\npython -m pytest tests/api tests/services -vv\n```\n\n## 接口概览\n\n- `GET /`:Web 页面入口\n- `POST /chat`:对话接口\n- `GET /health`:服务健康检查\n- `GET /api/meta`:服务元信息与当前运行模式\n- `GET /api/compatibility`:模型接入兼容性检查\n- `GET /api/knowledge/search`:本地知识库检索\n- `GET /api/knowledge/documents`:列出当前知识文档\n- `POST /api/knowledge/documents`:写入自定义知识文档\n- `GET /api/session/{session_id}`:最近会话记录\n- `POST /api/feedback`:对回复提交有帮助 / 需要更具体的反馈\n- `GET /docs`:Swagger 文档\n- `GET /project-docs/...`:项目补充文档\n\n### `POST /chat`\n\n请求示例:\n\n```json\n{\n \"message\": \"这周压力很大,感觉完全学不进去。\",\n \"system_hint\": \"给出温和且可执行的建议\"\n}\n```\n\n返回示例:\n\n```json\n{\n \"reply\": \"当前状态里明显存在压力堆积,可以先不追求一次解决整周问题,而是把任务缩小到今天最容易开始的一步,比如先完成 20 分钟复习。\",\n \"note\": \"当前为模型调用模式。回复由配置的 OpenAI 兼容接口生成,并结合了最近会话与知识库片段。\",\n \"mode\": \"openai\",\n \"session_id\": \"sess_xxxxxxxxxxxx\",\n \"assistant_message_id\": 12,\n \"memory_messages_used\": 2,\n \"knowledge_hits\": [\n {\n \"title\": \"考试压力与恢复\",\n \"excerpt\": \"当考试焦虑已经影响睡眠时,建议同时安排线下支持和短时复习块。\",\n \"source_path\": \"knowledge_base/04-sleep-and-recovery.md\",\n \"score\": 3.8\n }\n ],\n \"safety\": {\n \"level\": \"medium\",\n \"label\": \"需要额外关注\",\n \"note\": \"检测到持续失眠、崩溃或明显耗竭相关表达,建议尽快联系线下支持资源。\",\n \"needs_human_support\": true,\n \"matched_keywords\": [\"失眠\"]\n }\n}\n```\n\n## 文档入口\n\n- 中文:\n [docs/api-reference.md](docs/api-reference.md)、\n [docs/project-report.md](docs/project-report.md)、\n [docs/usage-guide.md](docs/usage-guide.md)、\n [docs/model-integration.md](docs/model-integration.md)、\n [docs/dingtalk-integration.md](docs/dingtalk-integration.md)\n- English:\n [docs/api-reference.en.md](docs/api-reference.en.md)、\n [docs/project-report.en.md](docs/project-report.en.md)、\n [docs/usage-guide.en.md](docs/usage-guide.en.md)、\n [docs/model-integration.en.md](docs/model-integration.en.md)、\n [docs/dingtalk-integration.en.md](docs/dingtalk-integration.en.md)\n- 其他:\n [CONTRIBUTING.md](CONTRIBUTING.md)、\n [CHANGELOG.md](CHANGELOG.md)、\n [LICENSE](LICENSE)、\n [ROADMAP.md](ROADMAP.md)、\n [SECURITY.md](SECURITY.md)、\n [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md)、\n [docs/github-launch-kit.md](docs/github-launch-kit.md)\n\n## 路线图\n\n- 继续增强危机表达识别和更安全的引导边界\n- 继续扩展更多 OpenAI 兼容供应商的兼容检查\n- 增强多轮对话连续性与回复稳定性\n- 将本地知识库扩展到更多高校场景\n\n## 接入不同大模型\n\n当前项目后端使用的是 OpenAI 兼容接口,因此可以通过修改 `.env` 或直接运行一键脚本切换不同模型提供商。\n\n- 切到 OpenAI:运行 `.\\setup-openai.ps1`\n- 切到 DeepSeek Chat:运行 `.\\setup-deepseek-chat.ps1`\n- 切到 DeepSeek R1:运行 `.\\setup-deepseek-r1.ps1`\n- 切到其他 OpenAI 兼容供应商:运行 `scripts/setup_model_config.py` 并传入自定义 `base_url`、`model_name`、`api_key_env`\n- Web 页面支持直接下拉选择模型目标和辅导风格\n- 页面右侧会直接显示当前提供商、当前模型、API 地址和接入兼容检查结果\n\n再次强调:这些脚本表示“项目已内置这些接入预设”,不是“这几个模型可以不填 Key 直接调用”。\n\n如果要接 `DeepSeek-R1`,当前代码已经处理了 `deepseek-reasoner` 的参数兼容问题,不会再强行传不适合的 `temperature` 参数。\n\n需要说明的是:本项目对 `OpenAI` 和 `DeepSeek` 官方接口可以做到明确兼容;对其他“OpenAI 兼容”供应商,是否完全兼容仍取决于对方是否真的支持 Chat Completions、当前模型名和常用参数格式。仓库里新增的兼容检查接口和脚本,就是用来把这件事提前说明白,而不是等运行时报错。\n\n## 安全边界\n\n- 项目定位是情绪支持和学习辅助,不替代专业心理诊断或治疗。\n- 当前实现强调温和、具体、避免危险引导的回复风格。\n- 如果用户出现持续失眠、严重低落或自伤相关表达,实际产品应优先引导线下求助与转介。\n\n## 钉钉接入说明\n\n- Web 页面是默认入口,便于直接访问和继续开发。\n- 钉钉是可选的真实业务接入场景,不影响项目本身独立运行。\n- 如果当前接的是钉钉`企业内部应用`,通常只有该组织内成员才能在钉钉里使用,往往还需要管理员授权。\n- 这意味着别人一般不能“直接打开你的钉钉版就用”,除非他加入该组织,或你把应用做成多组织分发 / 第三方应用。\n- 如果目标是让任何人都能直接体验,这个项目应以 Web 版为主入口,而不是把钉钉端当成唯一入口。\n\n## 测试与持续集成\n\n- 本地测试命令:`python -m pytest -vv`\n- 仓库已配置 GitHub Actions,在推送后自动运行基础测试\n"}, "344df4a9f8f4952192e584faf7709304d7646bde": {"t": 1785764993.9364178, "n": 8689, "h": "a0d121a99e5290bd", "c": "# 知愈星 AI Assistant\n\n[中文](README.md) | [English](README_EN.md)\n\n在线 Demo(部署后):`https://1420079678-ctrl.github.io/zhiyuxing-ai-assistant/`\n\n![Python 3.13](https://img.shields.io/badge/Python-3.13-3776AB?logo=python&logoColor=white)\n![FastAPI](https://img.shields.io/badge/FastAPI-Service-009688?logo=fastapi&logoColor=white)\n![CI](https://github.com/1420079678-ctrl/zhiyuxing-ai-assistant/actions/workflows/ci.yml/badge.svg)\n![License](https://img.shields.io/badge/License-MIT-green.svg)\n[![Live Demo](https://img.shields.io/badge/Live%20Demo-GitHub%20Pages-145f66)](https://1420079678-ctrl.github.io/zhiyuxing-ai-assistant/)\n[![Release](https://img.shields.io/github/v/release/1420079678-ctrl/zhiyuxing-ai-assistant)](https://github.com/1420079678-ctrl/zhiyuxing-ai-assistant/releases/tag/v0.1.0)\n[![Stars](https://img.shields.io/github/stars/1420079678-ctrl/zhiyuxing-ai-assistant?style=social)](https://github.com/1420079678-ctrl/zhiyuxing-ai-assistant)\n\n面向大学生场景的 AI 情绪支持与学习辅助服务,围绕学业压力、拖延内耗、考试与面试焦虑等高频问题,提供温和、具体、可执行的支持性建议。\n\n这个仓库的目标不是单纯展示方案,而是提供一个可以直接运行、便于继续开发、也能逐步接入钉钉等平台的完整项目基础。\n\n如果这个项目对你有帮助,欢迎点一个 `Star`。\n\n## 快速入口\n\n- `在线体验`:[Live Demo](https://1420079678-ctrl.github.io/zhiyuxing-ai-assistant/)\n- `查看版本`:[v0.1.0 Release](https://github.com/1420079678-ctrl/zhiyuxing-ai-assistant/releases/tag/v0.1.0)\n- `英文说明`:[README_EN.md](README_EN.md)\n- `模型接入`:[docs/model-integration.md](docs/model-integration.md)\n- `API 参考`:[docs/api-reference.md](docs/api-reference.md)\n\n## 30 秒能看到什么\n\n- 一个可直接打开的在线 Demo,而不是只停留在方案文档\n- 一个可本地运行的 FastAPI + Web 项目,而不是只有截图\n- 一个支持 OpenAI / DeepSeek 接入、知识检索、会话记忆和兼容性检查的工程化仓库\n\n说明:\nGitHub Pages 上的在线 Demo 主要用于公开展示页面和交互流程;完整的知识库检索、会话持久化、反馈记录和真实模型调用,需要按下文步骤本地启动后端。\n\n## 项目价值\n\n- 聚焦真实且高频的大学生使用场景,而不是泛化聊天。\n- 把“情绪支持”和“学习行动建议”放进同一轮对话,形成更完整的支持闭环。\n- 支持无密钥运行的本地演示模式,拿到仓库后可以直接启动和体验。\n- 预留模型调用和钉钉集成空间,便于后续继续做成更完整的产品。\n\n## 核心能力\n\n- `情绪支持对话`:识别压力、焦虑、拖延等常见表达,给出温和回应。\n- `学习行动建议`:把大问题拆成可立刻执行的小步骤,降低启动门槛。\n- `本地知识库检索`:根据问题检索内置心理支持与学习建议文档片段,增强回复内容。\n- `自定义知识文档接入`:可通过 API 把自定义 Markdown / 文本写入知识库,形成更像 RAG 项目的可扩展入口。\n- `会话记忆与持久化`:自动记录最近对话,支持继续追问、查看历史和本地 SQLite 持久化。\n- `风险识别与转介兜底`:遇到高风险表达时优先切换固定安全回复,而不是继续普通对话。\n- `双运行模式`:未配置模型密钥时使用本地演示模式;配置后切换到 OpenAI 兼容模型调用模式。\n- `Web 服务化`:提供可直接访问的页面、健康检查、接口元信息和 Swagger 文档。\n- `工程基础`:包含测试、CI、环境变量说明和补充文档。\n\n## 工程结构\n\n```text\nbackend/\n api/ # 路由层\n app_factory.py # FastAPI 应用装配\n chat_logic.py # 提示词、风格和 Demo 回复逻辑\n chat_service.py # 完整对话流程\n config.py # 运行配置\n runtime.py # 模型解析与兼容性检查\n schemas.py # 请求/响应模型\nservices/\n knowledge.py # 知识检索与自定义文档写入\n safety.py # 风险检测\n storage.py # SQLite 会话持久化\nstatic/ # Web 前端\ntests/ # 回归测试\n```\n\n## 使用场景\n\n- 学业压力大,任务很多,不知道从哪里开始\n- 长期拖延,明知道该做但迟迟启动不了\n- 考试、答辩、面试前持续紧张,难以进入准备状态\n- 情绪混乱导致学习节奏失序,需要先稳定状态再恢复行动\n\n## 运行模式\n\n| 模式 | 说明 | 需要的配置 |\n| --- | --- | --- |\n| 本地演示模式 | 使用内置规则生成支持性回复,适合本地启动、调试界面和展示流程 | 无需 API Key |\n| 模型调用模式 | 调用 OpenAI 兼容接口生成回复,适合继续做真实能力验证 | 与当前模型匹配的 API Key |\n\n项目默认优先保证“拿到就能跑”。如果没有配置模型密钥,页面和 `/chat` 接口仍然可以完整返回结果。\n\n## 页面预览\n\n### 独立 Web 页面\n\n当前仓库默认运行的是独立 Web 页面,不需要打开钉钉即可访问和体验。\n\n![Web 页面预览](docs/assets/11-web-demo.png)\n\n也提供基于 GitHub Pages 的公开在线演示页,方便在不配置后端和 API Key 的情况下直接体验交互流程:\n\n- `https://1420079678-ctrl.github.io/zhiyuxing-ai-assistant/`\n\n### 钉钉接入场景示意\n\n下面两张图保留为钉钉平台接入场景示意,用于说明项目后续可以如何落到企业协同平台中。\n\n![平台界面示意](docs/assets/09-platform-overview.png)\n\n![对话界面示意](docs/assets/10-chat-demo.png)\n\n## 技术栈\n\n- Python 3.13\n- FastAPI\n- OpenAI Python SDK\n- Pydantic\n- python-dotenv\n- SQLite\n- Markdown Knowledge Base\n- Pytest\n- GitHub Actions\n\n## 架构图\n\n![技术架构图](docs/assets/07-technical-architecture.png)\n\n## 快速启动\n\n推荐使用 Python 3.13,以保持与当前本地开发和 CI 环境一致。\n\n### 1. 安装依赖\n\n```bash\npython -m venv .venv\n.venv\\Scripts\\activate\npython -m pip install -r requirements.txt -r requirements-dev.txt\n```\n\n### 2. 一键配置模型接入\n\n推荐直接使用仓库根目录下一键脚本:\n\n```powershell\n.\\setup-openai.ps1\n.\\setup-deepseek-chat.ps1\n.\\setup-deepseek-r1.ps1\n```\n\n也可以双击对应的 `.bat` 文件。脚本会自动:\n\n- 不存在 `.env` 时,从 `.env.example` 复制一份\n- 按目标模型写入 `OPENAI_BASE_URL`、`MODEL_NAME`、`MODEL_PROVIDER`\n- 自动设置 `MODEL_API_KEY_ENV`,确保项目优先读取正确的密钥变量\n- 保留其他未切换的配置项\n\n需要注意:这几个脚本只是帮你一键写好模型接入配置,不是免 API Key 调用。\n\n- `.\\setup-openai.ps1` 对应 OpenAI 官方接口,真实调用需要 `OPENAI_API_KEY`\n- `.\\setup-deepseek-chat.ps1` 对应 DeepSeek Chat,真实调用需要 `DEEPSEEK_API_KEY`\n- `.\\setup-deepseek-r1.ps1` 对应 DeepSeek R1,真实调用也需要 `DEEPSEEK_API_KEY`\n\n如果运行脚本时没有填写对应 Key,项目仍然可以启动,但会自动回退到本地演示模式,不会真的调用线上模型。\n\n如果想手动配置,至少需要关注:\n\n- `OPENAI_API_KEY`\n- `DEEPSEEK_API_KEY`\n- `OPENAI_BASE_URL`\n- `MODEL_NAME`\n- `MODEL_PROVIDER`\n- `MODEL_API_KEY_ENV`\n- `MODEL_TEMPERATURE`\n- `DEMO_MODE`\n- `CHAT_DB_PATH`\n\n### 3. 启动前检查兼容性\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py\n```\n\n这个检查会直接告诉你:\n\n- 当前到底会读取哪个密钥变量\n- 当前模型和 API 地址是否存在明显错配\n- `deepseek-reasoner` 这类模型是否已经按兼容规则处理\n- 当前配置是否真的可以进入真实模型调用模式\n\n如果你已经填了真实 Key,还可以追加一次最小真实探测:\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py --probe\n```\n\n这一步会实际发起一次极小请求,用来确认“不是看起来兼容,而是真的能调通”。\n\n### 4. 启动服务\n\n```bash\npython -m uvicorn app:app --reload\n```\n\n如果你的系统 Python 没装项目依赖,最稳的方式是直接使用仓库自带虚拟环境:\n\n```powershell\n.\\.venv\\Scripts\\python -m uvicorn app:app --reload\n```\n\n也可以直接运行仓库根目录下的一键脚本:\n\n```powershell\n.\\start-web.ps1\n```\n\n或双击:\n\n```text\nstart-web.bat\n```\n\n启动后可访问:\n\n- `http://127.0.0.1:8000/`\n- `http://127.0.0.1:8000/api/meta`\n- `http://127.0.0.1:8000/api/compatibility`\n- `http://127.0.0.1:8000/api/knowledge/search?q=失眠`\n- `http://127.0.0.1:8000/api/session/<session_id>`\n- `http://127.0.0.1:8000/health`\n- `http://127.0.0.1:8000/docs`\n- `http://127.0.0.1:8000/project-docs/usage-guide.md`\n\n### 5. 运行测试\n\n```bash\npython -m pytest -vv\n```\n\n## 接口概览\n\n- `GET /`:Web 页面入口\n- `POST /chat`:对话接口\n- `GET /health`:服务健康检查\n- `GET /api/meta`:服务元信息与当前运行模式\n- `GET /api/compatibility`:模型接入兼容性检查\n- `GET /api/knowledge/search`:本地知识库检索\n- `GET /api/knowledge/documents`:列出当前知识文档\n- `POST /api/knowledge/documents`:写入自定义知识文档\n- `GET /api/session/{session_id}`:最近会话记录\n- `POST /api/feedback`:对回复提交有帮助 / 需要更具体的反馈\n- `GET /docs`:Swagger 文档\n- `GET /project-docs/...`:项目补充文档\n\n### `POST /chat`\n\n请求示例:\n\n```json\n{\n \"message\": \"这周压力很大,感觉完全学不进去。\",\n \"system_hint\": \"给出温和且可执行的建议\"\n}\n```\n\n返回示例:\n\n```json\n{\n \"reply\": \"当前状态里明显存在压力堆积,可以先不追求一次解决整周问题,而是把任务缩小到今天最容易开始的一步,比如先完成 20 分钟复习。\",\n \"note\": \"当前为模型调用模式。回复由配置的 OpenAI 兼容接口生成,并结合了最近会话与知识库片段。\",\n \"mode\": \"openai\",\n \"session_id\": \"sess_xxxxxxxxxxxx\",\n \"assistant_message_id\": 12,\n \"memory_messages_used\": 2,\n \"knowledge_hits\": [\n {\n \"title\": \"考试压力与恢复\",\n \"excerpt\": \"当考试焦虑已经影响睡眠时,建议同时安排线下支持和短时复习块。\",\n \"source_path\": \"knowledge_base/04-sleep-and-recovery.md\",\n \"score\": 3.8\n }\n ],\n \"safety\": {\n \"level\": \"medium\",\n \"label\": \"需要额外关注\",\n \"note\": \"检测到持续失眠、崩溃或明显耗竭相关表达,建议尽快联系线下支持资源。\",\n \"needs_human_support\": true,\n \"matched_keywords\": [\"失眠\"]\n }\n}\n```\n\n## 文档入口\n\n- 中文:\n [docs/api-reference.md](docs/api-reference.md)、\n [docs/project-report.md](docs/project-report.md)、\n [docs/usage-guide.md](docs/usage-guide.md)、\n [docs/model-integration.md](docs/model-integration.md)、\n [docs/dingtalk-integration.md](docs/dingtalk-integration.md)\n- English:\n [docs/api-reference.en.md](docs/api-reference.en.md)、\n [docs/project-report.en.md](docs/project-report.en.md)、\n [docs/usage-guide.en.md](docs/usage-guide.en.md)、\n [docs/model-integration.en.md](docs/model-integration.en.md)、\n [docs/dingtalk-integration.en.md](docs/dingtalk-integration.en.md)\n- 其他:\n [CONTRIBUTING.md](CONTRIBUTING.md)、\n [CHANGELOG.md](CHANGELOG.md)、\n [LICENSE](LICENSE)、\n [ROADMAP.md](ROADMAP.md)、\n [SECURITY.md](SECURITY.md)、\n [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md)、\n [docs/github-launch-kit.md](docs/github-launch-kit.md)\n\n## 路线图\n\n- 继续增强危机表达识别和更安全的引导边界\n- 继续扩展更多 OpenAI 兼容供应商的兼容检查\n- 增强多轮对话连续性与回复稳定性\n- 将本地知识库扩展到更多高校场景\n\n## 接入不同大模型\n\n当前项目后端使用的是 OpenAI 兼容接口,因此可以通过修改 `.env` 或直接运行一键脚本切换不同模型提供商。\n\n- 切到 OpenAI:运行 `.\\setup-openai.ps1`\n- 切到 DeepSeek Chat:运行 `.\\setup-deepseek-chat.ps1`\n- 切到 DeepSeek R1:运行 `.\\setup-deepseek-r1.ps1`\n- 切到其他 OpenAI 兼容供应商:运行 `scripts/setup_model_config.py` 并传入自定义 `base_url`、`model_name`、`api_key_env`\n- Web 页面支持直接下拉选择模型目标和辅导风格\n- 页面右侧会直接显示当前提供商、当前模型、API 地址和接入兼容检查结果\n\n再次强调:这些脚本表示“项目已内置这些接入预设”,不是“这几个模型可以不填 Key 直接调用”。\n\n如果要接 `DeepSeek-R1`,当前代码已经处理了 `deepseek-reasoner` 的参数兼容问题,不会再强行传不适合的 `temperature` 参数。\n\n需要说明的是:本项目对 `OpenAI` 和 `DeepSeek` 官方接口可以做到明确兼容;对其他“OpenAI 兼容”供应商,是否完全兼容仍取决于对方是否真的支持 Chat Completions、当前模型名和常用参数格式。仓库里新增的兼容检查接口和脚本,就是用来把这件事提前说明白,而不是等运行时报错。\n\n## 安全边界\n\n- 项目定位是情绪支持和学习辅助,不替代专业心理诊断或治疗。\n- 当前实现强调温和、具体、避免危险引导的回复风格。\n- 如果用户出现持续失眠、严重低落或自伤相关表达,实际产品应优先引导线下求助与转介。\n\n## 钉钉接入说明\n\n- Web 页面是默认入口,便于直接访问和继续开发。\n- 钉钉是可选的真实业务接入场景,不影响项目本身独立运行。\n- 如果当前接的是钉钉`企业内部应用`,通常只有该组织内成员才能在钉钉里使用,往往还需要管理员授权。\n- 这意味着别人一般不能“直接打开你的钉钉版就用”,除非他加入该组织,或你把应用做成多组织分发 / 第三方应用。\n- 如果目标是让任何人都能直接体验,这个项目应以 Web 版为主入口,而不是把钉钉端当成唯一入口。\n\n## 测试与持续集成\n\n- 本地测试命令:`python -m pytest -vv`\n- 仓库已配置 GitHub Actions,在推送后自动运行基础测试\n"}, "3b58546acbb22d10fe2d101b2b45769d8de787d1": {"t": 1785764995.493698, "n": 8571, "h": "0cfb4936662c2781", "c": "# 知愈星 AI Assistant\n\n[中文](README.md) | [English](README_EN.md)\n\n在线 Demo(部署后):`https://1420079678-ctrl.github.io/zhiyuxing-ai-assistant/`\n\n![Python 3.13](https://img.shields.io/badge/Python-3.13-3776AB?logo=python&logoColor=white)\n![FastAPI](https://img.shields.io/badge/FastAPI-Service-009688?logo=fastapi&logoColor=white)\n![CI](https://github.com/1420079678-ctrl/zhiyuxing-ai-assistant/actions/workflows/ci.yml/badge.svg)\n![License](https://img.shields.io/badge/License-MIT-green.svg)\n[![Live Demo](https://img.shields.io/badge/Live%20Demo-GitHub%20Pages-145f66)](https://1420079678-ctrl.github.io/zhiyuxing-ai-assistant/)\n[![Release](https://img.shields.io/github/v/release/1420079678-ctrl/zhiyuxing-ai-assistant)](https://github.com/1420079678-ctrl/zhiyuxing-ai-assistant/releases/tag/v0.1.0)\n[![Stars](https://img.shields.io/github/stars/1420079678-ctrl/zhiyuxing-ai-assistant?style=social)](https://github.com/1420079678-ctrl/zhiyuxing-ai-assistant)\n\n面向大学生场景的 AI 情绪支持与学习辅助服务,围绕学业压力、拖延内耗、考试与面试焦虑等高频问题,提供温和、具体、可执行的支持性建议。\n\n这个仓库的目标不是单纯展示方案,而是提供一个可以直接运行、便于继续开发、也能逐步接入钉钉等平台的完整项目基础。\n\n如果这个项目对你有帮助,欢迎点一个 `Star`。\n\n## 快速入口\n\n- `在线体验`:[Live Demo](https://1420079678-ctrl.github.io/zhiyuxing-ai-assistant/)\n- `查看版本`:[v0.1.0 Release](https://github.com/1420079678-ctrl/zhiyuxing-ai-assistant/releases/tag/v0.1.0)\n- `英文说明`:[README_EN.md](README_EN.md)\n- `模型接入`:[docs/model-integration.md](docs/model-integration.md)\n- `API 参考`:[docs/api-reference.md](docs/api-reference.md)\n\n## 30 秒能看到什么\n\n- 一个可直接打开的在线 Demo,而不是只停留在方案文档\n- 一个可本地运行的 FastAPI + Web 项目,而不是只有截图\n- 一个支持 OpenAI / DeepSeek 接入、知识检索、会话记忆和兼容性检查的工程化仓库\n\n说明:\nGitHub Pages 上的在线 Demo 主要用于公开展示页面和交互流程;完整的知识库检索、会话持久化、反馈记录和真实模型调用,需要按下文步骤本地启动后端。\n\n## 项目价值\n\n- 聚焦真实且高频的大学生使用场景,而不是泛化聊天。\n- 把“情绪支持”和“学习行动建议”放进同一轮对话,形成更完整的支持闭环。\n- 支持无密钥运行的本地演示模式,拿到仓库后可以直接启动和体验。\n- 预留模型调用和钉钉集成空间,便于后续继续做成更完整的产品。\n\n## 核心能力\n\n- `情绪支持对话`:识别压力、焦虑、拖延等常见表达,给出温和回应。\n- `学习行动建议`:把大问题拆成可立刻执行的小步骤,降低启动门槛。\n- `本地知识库检索`:根据问题检索内置心理支持与学习建议文档片段,增强回复内容。\n- `自定义知识文档接入`:可通过 API 把自定义 Markdown / 文本写入知识库,形成更像 RAG 项目的可扩展入口。\n- `会话记忆与持久化`:自动记录最近对话,支持继续追问、查看历史和本地 SQLite 持久化。\n- `风险识别与转介兜底`:遇到高风险表达时优先切换固定安全回复,而不是继续普通对话。\n- `双运行模式`:未配置模型密钥时使用本地演示模式;配置后切换到 OpenAI 兼容模型调用模式。\n- `Web 服务化`:提供可直接访问的页面、健康检查、接口元信息和 Swagger 文档。\n- `工程基础`:包含测试、CI、环境变量说明和补充文档。\n\n## 工程结构\n\n```text\nbackend/\n api/ # 路由层\n app_factory.py # FastAPI 应用装配\n chat_logic.py # 提示词、风格和 Demo 回复逻辑\n chat_service.py # 完整对话流程\n config.py # 运行配置\n runtime.py # 模型解析与兼容性检查\n schemas.py # 请求/响应模型\nservices/\n knowledge.py # 知识检索与自定义文档写入\n safety.py # 风险检测\n storage.py # SQLite 会话持久化\nstatic/ # Web 前端\ntests/ # 回归测试\n```\n\n## 使用场景\n\n- 学业压力大,任务很多,不知道从哪里开始\n- 长期拖延,明知道该做但迟迟启动不了\n- 考试、答辩、面试前持续紧张,难以进入准备状态\n- 情绪混乱导致学习节奏失序,需要先稳定状态再恢复行动\n\n## 运行模式\n\n| 模式 | 说明 | 需要的配置 |\n| --- | --- | --- |\n| 本地演示模式 | 使用内置规则生成支持性回复,适合本地启动、调试界面和展示流程 | 无需 API Key |\n| 模型调用模式 | 调用 OpenAI 兼容接口生成回复,适合继续做真实能力验证 | 与当前模型匹配的 API Key |\n\n项目默认优先保证“拿到就能跑”。如果没有配置模型密钥,页面和 `/chat` 接口仍然可以完整返回结果。\n\n## 页面预览\n\n### 独立 Web 页面\n\n当前仓库默认运行的是独立 Web 页面,不需要打开钉钉即可访问和体验。\n\n![Web 页面预览](docs/assets/11-web-demo.png)\n\n也提供基于 GitHub Pages 的公开在线演示页,方便在不配置后端和 API Key 的情况下直接体验交互流程:\n\n- `https://1420079678-ctrl.github.io/zhiyuxing-ai-assistant/`\n\n### 钉钉接入场景示意\n\n下面两张图保留为钉钉平台接入场景示意,用于说明项目后续可以如何落到企业协同平台中。\n\n![平台界面示意](docs/assets/09-platform-overview.png)\n\n![对话界面示意](docs/assets/10-chat-demo.png)\n\n## 技术栈\n\n- Python 3.13\n- FastAPI\n- OpenAI Python SDK\n- Pydantic\n- python-dotenv\n- SQLite\n- Markdown Knowledge Base\n- Pytest\n- GitHub Actions\n\n## 架构图\n\n![技术架构图](docs/assets/07-technical-architecture.png)\n\n## 快速启动\n\n推荐使用 Python 3.13,以保持与当前本地开发和 CI 环境一致。\n\n### 1. 安装依赖\n\n```bash\npython -m venv .venv\n.venv\\Scripts\\activate\npython -m pip install -r requirements.txt -r requirements-dev.txt\n```\n\n### 2. 一键配置模型接入\n\n推荐直接使用仓库根目录下一键脚本:\n\n```powershell\n.\\setup-openai.ps1\n.\\setup-deepseek-chat.ps1\n.\\setup-deepseek-r1.ps1\n```\n\n也可以双击对应的 `.bat` 文件。脚本会自动:\n\n- 不存在 `.env` 时,从 `.env.example` 复制一份\n- 按目标模型写入 `OPENAI_BASE_URL`、`MODEL_NAME`、`MODEL_PROVIDER`\n- 自动设置 `MODEL_API_KEY_ENV`,确保项目优先读取正确的密钥变量\n- 保留其他未切换的配置项\n\n需要注意:这几个脚本只是帮你一键写好模型接入配置,不是免 API Key 调用。\n\n- `.\\setup-openai.ps1` 对应 OpenAI 官方接口,真实调用需要 `OPENAI_API_KEY`\n- `.\\setup-deepseek-chat.ps1` 对应 DeepSeek Chat,真实调用需要 `DEEPSEEK_API_KEY`\n- `.\\setup-deepseek-r1.ps1` 对应 DeepSeek R1,真实调用也需要 `DEEPSEEK_API_KEY`\n\n如果运行脚本时没有填写对应 Key,项目仍然可以启动,但会自动回退到本地演示模式,不会真的调用线上模型。\n\n如果想手动配置,至少需要关注:\n\n- `OPENAI_API_KEY`\n- `DEEPSEEK_API_KEY`\n- `OPENAI_BASE_URL`\n- `MODEL_NAME`\n- `MODEL_PROVIDER`\n- `MODEL_API_KEY_ENV`\n- `MODEL_TEMPERATURE`\n- `DEMO_MODE`\n- `CHAT_DB_PATH`\n\n### 3. 启动前检查兼容性\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py\n```\n\n这个检查会直接告诉你:\n\n- 当前到底会读取哪个密钥变量\n- 当前模型和 API 地址是否存在明显错配\n- `deepseek-reasoner` 这类模型是否已经按兼容规则处理\n- 当前配置是否真的可以进入真实模型调用模式\n\n如果你已经填了真实 Key,还可以追加一次最小真实探测:\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py --probe\n```\n\n这一步会实际发起一次极小请求,用来确认“不是看起来兼容,而是真的能调通”。\n\n### 4. 启动服务\n\n```bash\npython -m uvicorn app:app --reload\n```\n\n如果你的系统 Python 没装项目依赖,最稳的方式是直接使用仓库自带虚拟环境:\n\n```powershell\n.\\.venv\\Scripts\\python -m uvicorn app:app --reload\n```\n\n也可以直接运行仓库根目录下的一键脚本:\n\n```powershell\n.\\start-web.ps1\n```\n\n或双击:\n\n```text\nstart-web.bat\n```\n\n启动后可访问:\n\n- `http://127.0.0.1:8000/`\n- `http://127.0.0.1:8000/api/meta`\n- `http://127.0.0.1:8000/api/compatibility`\n- `http://127.0.0.1:8000/api/knowledge/search?q=失眠`\n- `http://127.0.0.1:8000/api/session/<session_id>`\n- `http://127.0.0.1:8000/health`\n- `http://127.0.0.1:8000/docs`\n- `http://127.0.0.1:8000/project-docs/usage-guide.md`\n\n### 5. 运行测试\n\n```bash\npython -m pytest -vv\n```\n\n## 接口概览\n\n- `GET /`:Web 页面入口\n- `POST /chat`:对话接口\n- `GET /health`:服务健康检查\n- `GET /api/meta`:服务元信息与当前运行模式\n- `GET /api/compatibility`:模型接入兼容性检查\n- `GET /api/knowledge/search`:本地知识库检索\n- `GET /api/knowledge/documents`:列出当前知识文档\n- `POST /api/knowledge/documents`:写入自定义知识文档\n- `GET /api/session/{session_id}`:最近会话记录\n- `POST /api/feedback`:对回复提交有帮助 / 需要更具体的反馈\n- `GET /docs`:Swagger 文档\n- `GET /project-docs/...`:项目补充文档\n\n### `POST /chat`\n\n请求示例:\n\n```json\n{\n \"message\": \"这周压力很大,感觉完全学不进去。\",\n \"system_hint\": \"给出温和且可执行的建议\"\n}\n```\n\n返回示例:\n\n```json\n{\n \"reply\": \"当前状态里明显存在压力堆积,可以先不追求一次解决整周问题,而是把任务缩小到今天最容易开始的一步,比如先完成 20 分钟复习。\",\n \"note\": \"当前为模型调用模式。回复由配置的 OpenAI 兼容接口生成,并结合了最近会话与知识库片段。\",\n \"mode\": \"openai\",\n \"session_id\": \"sess_xxxxxxxxxxxx\",\n \"assistant_message_id\": 12,\n \"memory_messages_used\": 2,\n \"knowledge_hits\": [\n {\n \"title\": \"考试压力与恢复\",\n \"excerpt\": \"当考试焦虑已经影响睡眠时,建议同时安排线下支持和短时复习块。\",\n \"source_path\": \"knowledge_base/04-sleep-and-recovery.md\",\n \"score\": 3.8\n }\n ],\n \"safety\": {\n \"level\": \"medium\",\n \"label\": \"需要额外关注\",\n \"note\": \"检测到持续失眠、崩溃或明显耗竭相关表达,建议尽快联系线下支持资源。\",\n \"needs_human_support\": true,\n \"matched_keywords\": [\"失眠\"]\n }\n}\n```\n\n## 文档入口\n\n- 中文:\n [docs/api-reference.md](docs/api-reference.md)、\n [docs/project-report.md](docs/project-report.md)、\n [docs/usage-guide.md](docs/usage-guide.md)、\n [docs/model-integration.md](docs/model-integration.md)、\n [docs/dingtalk-integration.md](docs/dingtalk-integration.md)\n- English:\n [docs/api-reference.en.md](docs/api-reference.en.md)、\n [docs/project-report.en.md](docs/project-report.en.md)、\n [docs/usage-guide.en.md](docs/usage-guide.en.md)、\n [docs/model-integration.en.md](docs/model-integration.en.md)、\n [docs/dingtalk-integration.en.md](docs/dingtalk-integration.en.md)\n- 其他:\n [CONTRIBUTING.md](CONTRIBUTING.md)、\n [CHANGELOG.md](CHANGELOG.md)、\n [LICENSE](LICENSE)、\n [ROADMAP.md](ROADMAP.md)、\n [SECURITY.md](SECURITY.md)、\n [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md)、\n [docs/github-launch-kit.md](docs/github-launch-kit.md)\n\n## 路线图\n\n- 继续增强危机表达识别和更安全的引导边界\n- 继续扩展更多 OpenAI 兼容供应商的兼容检查\n- 增强多轮对话连续性与回复稳定性\n- 将本地知识库扩展到更多高校场景\n\n## 接入不同大模型\n\n当前项目后端使用的是 OpenAI 兼容接口,因此可以通过修改 `.env` 或直接运行一键脚本切换不同模型提供商。\n\n- 切到 OpenAI:运行 `.\\setup-openai.ps1`\n- 切到 DeepSeek Chat:运行 `.\\setup-deepseek-chat.ps1`\n- 切到 DeepSeek R1:运行 `.\\setup-deepseek-r1.ps1`\n- 切到其他 OpenAI 兼容供应商:运行 `scripts/setup_model_config.py` 并传入自定义 `base_url`、`model_name`、`api_key_env`\n- Web 页面支持直接下拉选择模型目标和辅导风格\n- 页面右侧会直接显示当前提供商、当前模型、API 地址和接入兼容检查结果\n\n再次强调:这些脚本表示“项目已内置这些接入预设”,不是“这几个模型可以不填 Key 直接调用”。\n\n如果要接 `DeepSeek-R1`,当前代码已经处理了 `deepseek-reasoner` 的参数兼容问题,不会再强行传不适合的 `temperature` 参数。\n\n需要说明的是:本项目对 `OpenAI` 和 `DeepSeek` 官方接口可以做到明确兼容;对其他“OpenAI 兼容”供应商,是否完全兼容仍取决于对方是否真的支持 Chat Completions、当前模型名和常用参数格式。仓库里新增的兼容检查接口和脚本,就是用来把这件事提前说明白,而不是等运行时报错。\n\n## 安全边界\n\n- 项目定位是情绪支持和学习辅助,不替代专业心理诊断或治疗。\n- 当前实现强调温和、具体、避免危险引导的回复风格。\n- 如果用户出现持续失眠、严重低落或自伤相关表达,实际产品应优先引导线下求助与转介。\n\n## 钉钉接入说明\n\n- Web 页面是默认入口,便于直接访问和继续开发。\n- 钉钉是可选的真实业务接入场景,不影响项目本身独立运行。\n- 如果接入钉钉,需要根据企业内部应用、多组织分发或用户授权模式处理权限问题。\n\n## 测试与持续集成\n\n- 本地测试命令:`python -m pytest -vv`\n- 仓库已配置 GitHub Actions,在推送后自动运行基础测试\n"}, "43dcef3be7aa070bd63ed0f188b2280dd4867fc2": {"t": 1785764997.4250593, "n": 7866, "h": "1b023041cfbe6645", "c": "# 知愈星 AI Assistant\n\n[中文](README.md) | [English](README_EN.md)\n\n在线 Demo(部署后):`https://1420079678-ctrl.github.io/zhiyuxing-ai-assistant/`\n\n![Python 3.13](https://img.shields.io/badge/Python-3.13-3776AB?logo=python&logoColor=white)\n![FastAPI](https://img.shields.io/badge/FastAPI-Service-009688?logo=fastapi&logoColor=white)\n![CI](https://github.com/1420079678-ctrl/zhiyuxing-ai-assistant/actions/workflows/ci.yml/badge.svg)\n![License](https://img.shields.io/badge/License-MIT-green.svg)\n[![Live Demo](https://img.shields.io/badge/Live%20Demo-GitHub%20Pages-145f66)](https://1420079678-ctrl.github.io/zhiyuxing-ai-assistant/)\n[![Release](https://img.shields.io/github/v/release/1420079678-ctrl/zhiyuxing-ai-assistant)](https://github.com/1420079678-ctrl/zhiyuxing-ai-assistant/releases/tag/v0.1.0)\n[![Stars](https://img.shields.io/github/stars/1420079678-ctrl/zhiyuxing-ai-assistant?style=social)](https://github.com/1420079678-ctrl/zhiyuxing-ai-assistant)\n\n面向大学生场景的 AI 情绪支持与学习辅助服务,围绕学业压力、拖延内耗、考试与面试焦虑等高频问题,提供温和、具体、可执行的支持性建议。\n\n这个仓库的目标不是单纯展示方案,而是提供一个可以直接运行、便于继续开发、也能逐步接入钉钉等平台的完整项目基础。\n\n如果这个项目对你有帮助,欢迎点一个 `Star`。\n\n## 快速入口\n\n- `在线体验`:[Live Demo](https://1420079678-ctrl.github.io/zhiyuxing-ai-assistant/)\n- `查看版本`:[v0.1.0 Release](https://github.com/1420079678-ctrl/zhiyuxing-ai-assistant/releases/tag/v0.1.0)\n- `英文说明`:[README_EN.md](README_EN.md)\n- `模型接入`:[docs/model-integration.md](docs/model-integration.md)\n\n## 30 秒能看到什么\n\n- 一个可直接打开的在线 Demo,而不是只停留在方案文档\n- 一个可本地运行的 FastAPI + Web 项目,而不是只有截图\n- 一个支持 OpenAI / DeepSeek 接入、知识检索、会话记忆和兼容性检查的工程化仓库\n\n说明:\nGitHub Pages 上的在线 Demo 主要用于公开展示页面和交互流程;完整的知识库检索、会话持久化、反馈记录和真实模型调用,需要按下文步骤本地启动后端。\n\n## 项目价值\n\n- 聚焦真实且高频的大学生使用场景,而不是泛化聊天。\n- 把“情绪支持”和“学习行动建议”放进同一轮对话,形成更完整的支持闭环。\n- 支持无密钥运行的本地演示模式,拿到仓库后可以直接启动和体验。\n- 预留模型调用和钉钉集成空间,便于后续继续做成更完整的产品。\n\n## 核心能力\n\n- `情绪支持对话`:识别压力、焦虑、拖延等常见表达,给出温和回应。\n- `学习行动建议`:把大问题拆成可立刻执行的小步骤,降低启动门槛。\n- `本地知识库检索`:根据问题检索内置心理支持与学习建议文档片段,增强回复内容。\n- `会话记忆与持久化`:自动记录最近对话,支持继续追问、查看历史和本地 SQLite 持久化。\n- `风险识别与转介兜底`:遇到高风险表达时优先切换固定安全回复,而不是继续普通对话。\n- `双运行模式`:未配置模型密钥时使用本地演示模式;配置后切换到 OpenAI 兼容模型调用模式。\n- `Web 服务化`:提供可直接访问的页面、健康检查、接口元信息和 Swagger 文档。\n- `工程基础`:包含测试、CI、环境变量说明和补充文档。\n\n## 使用场景\n\n- 学业压力大,任务很多,不知道从哪里开始\n- 长期拖延,明知道该做但迟迟启动不了\n- 考试、答辩、面试前持续紧张,难以进入准备状态\n- 情绪混乱导致学习节奏失序,需要先稳定状态再恢复行动\n\n## 运行模式\n\n| 模式 | 说明 | 需要的配置 |\n| --- | --- | --- |\n| 本地演示模式 | 使用内置规则生成支持性回复,适合本地启动、调试界面和展示流程 | 无需 API Key |\n| 模型调用模式 | 调用 OpenAI 兼容接口生成回复,适合继续做真实能力验证 | 与当前模型匹配的 API Key |\n\n项目默认优先保证“拿到就能跑”。如果没有配置模型密钥,页面和 `/chat` 接口仍然可以完整返回结果。\n\n## 页面预览\n\n### 独立 Web 页面\n\n当前仓库默认运行的是独立 Web 页面,不需要打开钉钉即可访问和体验。\n\n![Web 页面预览](docs/assets/11-web-demo.png)\n\n也提供基于 GitHub Pages 的公开在线演示页,方便在不配置后端和 API Key 的情况下直接体验交互流程:\n\n- `https://1420079678-ctrl.github.io/zhiyuxing-ai-assistant/`\n\n### 钉钉接入场景示意\n\n下面两张图保留为钉钉平台接入场景示意,用于说明项目后续可以如何落到企业协同平台中。\n\n![平台界面示意](docs/assets/09-platform-overview.png)\n\n![对话界面示意](docs/assets/10-chat-demo.png)\n\n## 技术栈\n\n- Python 3.13\n- FastAPI\n- OpenAI Python SDK\n- Pydantic\n- python-dotenv\n- SQLite\n- Markdown Knowledge Base\n- Pytest\n- GitHub Actions\n\n## 架构图\n\n![技术架构图](docs/assets/07-technical-architecture.png)\n\n## 快速启动\n\n推荐使用 Python 3.13,以保持与当前本地开发和 CI 环境一致。\n\n### 1. 安装依赖\n\n```bash\npython -m venv .venv\n.venv\\Scripts\\activate\npython -m pip install -r requirements.txt -r requirements-dev.txt\n```\n\n### 2. 一键配置模型接入\n\n推荐直接使用仓库根目录下一键脚本:\n\n```powershell\n.\\setup-openai.ps1\n.\\setup-deepseek-chat.ps1\n.\\setup-deepseek-r1.ps1\n```\n\n也可以双击对应的 `.bat` 文件。脚本会自动:\n\n- 不存在 `.env` 时,从 `.env.example` 复制一份\n- 按目标模型写入 `OPENAI_BASE_URL`、`MODEL_NAME`、`MODEL_PROVIDER`\n- 自动设置 `MODEL_API_KEY_ENV`,确保项目优先读取正确的密钥变量\n- 保留其他未切换的配置项\n\n需要注意:这几个脚本只是帮你一键写好模型接入配置,不是免 API Key 调用。\n\n- `.\\setup-openai.ps1` 对应 OpenAI 官方接口,真实调用需要 `OPENAI_API_KEY`\n- `.\\setup-deepseek-chat.ps1` 对应 DeepSeek Chat,真实调用需要 `DEEPSEEK_API_KEY`\n- `.\\setup-deepseek-r1.ps1` 对应 DeepSeek R1,真实调用也需要 `DEEPSEEK_API_KEY`\n\n如果运行脚本时没有填写对应 Key,项目仍然可以启动,但会自动回退到本地演示模式,不会真的调用线上模型。\n\n如果想手动配置,至少需要关注:\n\n- `OPENAI_API_KEY`\n- `DEEPSEEK_API_KEY`\n- `OPENAI_BASE_URL`\n- `MODEL_NAME`\n- `MODEL_PROVIDER`\n- `MODEL_API_KEY_ENV`\n- `MODEL_TEMPERATURE`\n- `DEMO_MODE`\n- `CHAT_DB_PATH`\n\n### 3. 启动前检查兼容性\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py\n```\n\n这个检查会直接告诉你:\n\n- 当前到底会读取哪个密钥变量\n- 当前模型和 API 地址是否存在明显错配\n- `deepseek-reasoner` 这类模型是否已经按兼容规则处理\n- 当前配置是否真的可以进入真实模型调用模式\n\n如果你已经填了真实 Key,还可以追加一次最小真实探测:\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py --probe\n```\n\n这一步会实际发起一次极小请求,用来确认“不是看起来兼容,而是真的能调通”。\n\n### 4. 启动服务\n\n```bash\npython -m uvicorn app:app --reload\n```\n\n如果你的系统 Python 没装项目依赖,最稳的方式是直接使用仓库自带虚拟环境:\n\n```powershell\n.\\.venv\\Scripts\\python -m uvicorn app:app --reload\n```\n\n也可以直接运行仓库根目录下的一键脚本:\n\n```powershell\n.\\start-web.ps1\n```\n\n或双击:\n\n```text\nstart-web.bat\n```\n\n启动后可访问:\n\n- `http://127.0.0.1:8000/`\n- `http://127.0.0.1:8000/api/meta`\n- `http://127.0.0.1:8000/api/compatibility`\n- `http://127.0.0.1:8000/api/knowledge/search?q=失眠`\n- `http://127.0.0.1:8000/api/session/<session_id>`\n- `http://127.0.0.1:8000/health`\n- `http://127.0.0.1:8000/docs`\n- `http://127.0.0.1:8000/project-docs/usage-guide.md`\n\n### 5. 运行测试\n\n```bash\npython -m pytest -vv\n```\n\n## 接口概览\n\n- `GET /`:Web 页面入口\n- `POST /chat`:对话接口\n- `GET /health`:服务健康检查\n- `GET /api/meta`:服务元信息与当前运行模式\n- `GET /api/compatibility`:模型接入兼容性检查\n- `GET /api/knowledge/search`:本地知识库检索\n- `GET /api/session/{session_id}`:最近会话记录\n- `POST /api/feedback`:对回复提交有帮助 / 需要更具体的反馈\n- `GET /docs`:Swagger 文档\n- `GET /project-docs/...`:项目补充文档\n\n### `POST /chat`\n\n请求示例:\n\n```json\n{\n \"message\": \"这周压力很大,感觉完全学不进去。\",\n \"system_hint\": \"给出温和且可执行的建议\"\n}\n```\n\n返回示例:\n\n```json\n{\n \"reply\": \"当前状态里明显存在压力堆积,可以先不追求一次解决整周问题,而是把任务缩小到今天最容易开始的一步,比如先完成 20 分钟复习。\",\n \"note\": \"当前为模型调用模式。回复由配置的 OpenAI 兼容接口生成,并结合了最近会话与知识库片段。\",\n \"mode\": \"openai\",\n \"session_id\": \"sess_xxxxxxxxxxxx\",\n \"assistant_message_id\": 12,\n \"memory_messages_used\": 2,\n \"knowledge_hits\": [\n {\n \"title\": \"考试压力与恢复\",\n \"excerpt\": \"当考试焦虑已经影响睡眠时,建议同时安排线下支持和短时复习块。\",\n \"source_path\": \"knowledge_base/04-sleep-and-recovery.md\",\n \"score\": 3.8\n }\n ],\n \"safety\": {\n \"level\": \"medium\",\n \"label\": \"需要额外关注\",\n \"note\": \"检测到持续失眠、崩溃或明显耗竭相关表达,建议尽快联系线下支持资源。\",\n \"needs_human_support\": true,\n \"matched_keywords\": [\"失眠\"]\n }\n}\n```\n\n## 文档入口\n\n- 中文:\n [docs/project-report.md](docs/project-report.md)、\n [docs/usage-guide.md](docs/usage-guide.md)、\n [docs/model-integration.md](docs/model-integration.md)、\n [docs/dingtalk-integration.md](docs/dingtalk-integration.md)\n- English:\n [docs/project-report.en.md](docs/project-report.en.md)、\n [docs/usage-guide.en.md](docs/usage-guide.en.md)、\n [docs/model-integration.en.md](docs/model-integration.en.md)、\n [docs/dingtalk-integration.en.md](docs/dingtalk-integration.en.md)\n- 其他:\n [CONTRIBUTING.md](CONTRIBUTING.md)、\n [CHANGELOG.md](CHANGELOG.md)、\n [LICENSE](LICENSE)、\n [ROADMAP.md](ROADMAP.md)、\n [SECURITY.md](SECURITY.md)、\n [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md)、\n [docs/github-launch-kit.md](docs/github-launch-kit.md)\n\n## 路线图\n\n- 继续增强危机表达识别和更安全的引导边界\n- 继续扩展更多 OpenAI 兼容供应商的兼容检查\n- 增强多轮对话连续性与回复稳定性\n- 将本地知识库扩展到更多高校场景\n\n## 接入不同大模型\n\n当前项目后端使用的是 OpenAI 兼容接口,因此可以通过修改 `.env` 或直接运行一键脚本切换不同模型提供商。\n\n- 切到 OpenAI:运行 `.\\setup-openai.ps1`\n- 切到 DeepSeek Chat:运行 `.\\setup-deepseek-chat.ps1`\n- 切到 DeepSeek R1:运行 `.\\setup-deepseek-r1.ps1`\n- 切到其他 OpenAI 兼容供应商:运行 `scripts/setup_model_config.py` 并传入自定义 `base_url`、`model_name`、`api_key_env`\n- Web 页面支持直接下拉选择模型目标和辅导风格\n- 页面右侧会直接显示当前提供商、当前模型、API 地址和接入兼容检查结果\n\n再次强调:这些脚本表示“项目已内置这些接入预设”,不是“这几个模型可以不填 Key 直接调用”。\n\n如果要接 `DeepSeek-R1`,当前代码已经处理了 `deepseek-reasoner` 的参数兼容问题,不会再强行传不适合的 `temperature` 参数。\n\n需要说明的是:本项目对 `OpenAI` 和 `DeepSeek` 官方接口可以做到明确兼容;对其他“OpenAI 兼容”供应商,是否完全兼容仍取决于对方是否真的支持 Chat Completions、当前模型名和常用参数格式。仓库里新增的兼容检查接口和脚本,就是用来把这件事提前说明白,而不是等运行时报错。\n\n## 安全边界\n\n- 项目定位是情绪支持和学习辅助,不替代专业心理诊断或治疗。\n- 当前实现强调温和、具体、避免危险引导的回复风格。\n- 如果用户出现持续失眠、严重低落或自伤相关表达,实际产品应优先引导线下求助与转介。\n\n## 钉钉接入说明\n\n- Web 页面是默认入口,便于直接访问和继续开发。\n- 钉钉是可选的真实业务接入场景,不影响项目本身独立运行。\n- 如果接入钉钉,需要根据企业内部应用、多组织分发或用户授权模式处理权限问题。\n\n## 测试与持续集成\n\n- 本地测试命令:`python -m pytest -vv`\n- 仓库已配置 GitHub Actions,在推送后自动运行基础测试\n"}, "abb4ef82e2770694bebd7734efb46e023977eaa8": {"t": 1785764999.0641615, "n": 6875, "h": "8968ddf0262217ad", "c": "# 知愈星 AI Assistant\n\n[中文](README.md) | [English](README_EN.md)\n\n在线 Demo(部署后):`https://1420079678-ctrl.github.io/zhiyuxing-ai-assistant/`\n\n![Python 3.13](https://img.shields.io/badge/Python-3.13-3776AB?logo=python&logoColor=white)\n![FastAPI](https://img.shields.io/badge/FastAPI-Service-009688?logo=fastapi&logoColor=white)\n![CI](https://github.com/1420079678-ctrl/zhiyuxing-ai-assistant/actions/workflows/ci.yml/badge.svg)\n![License](https://img.shields.io/badge/License-MIT-green.svg)\n[![Live Demo](https://img.shields.io/badge/Live%20Demo-GitHub%20Pages-145f66)](https://1420079678-ctrl.github.io/zhiyuxing-ai-assistant/)\n[![Release](https://img.shields.io/github/v/release/1420079678-ctrl/zhiyuxing-ai-assistant)](https://github.com/1420079678-ctrl/zhiyuxing-ai-assistant/releases/tag/v0.1.0)\n[![Stars](https://img.shields.io/github/stars/1420079678-ctrl/zhiyuxing-ai-assistant?style=social)](https://github.com/1420079678-ctrl/zhiyuxing-ai-assistant)\n\n面向大学生场景的 AI 情绪支持与学习辅助服务,围绕学业压力、拖延内耗、考试与面试焦虑等高频问题,提供温和、具体、可执行的支持性建议。\n\n这个仓库的目标不是单纯展示方案,而是提供一个可以直接运行、便于继续开发、也能逐步接入钉钉等平台的完整项目基础。\n\n如果这个项目对你有帮助,欢迎点一个 `Star`。\n\n## 快速入口\n\n- `在线体验`:[Live Demo](https://1420079678-ctrl.github.io/zhiyuxing-ai-assistant/)\n- `查看版本`:[v0.1.0 Release](https://github.com/1420079678-ctrl/zhiyuxing-ai-assistant/releases/tag/v0.1.0)\n- `英文说明`:[README_EN.md](README_EN.md)\n- `模型接入`:[docs/model-integration.md](docs/model-integration.md)\n\n## 30 秒能看到什么\n\n- 一个可直接打开的在线 Demo,而不是只停留在方案文档\n- 一个可本地运行的 FastAPI + Web 项目,而不是只有截图\n- 一个支持 OpenAI / DeepSeek 接入和兼容性检查的工程化仓库\n\n## 项目价值\n\n- 聚焦真实且高频的大学生使用场景,而不是泛化聊天。\n- 把“情绪支持”和“学习行动建议”放进同一轮对话,形成更完整的支持闭环。\n- 支持无密钥运行的本地演示模式,拿到仓库后可以直接启动和体验。\n- 预留模型调用和钉钉集成空间,便于后续继续做成更完整的产品。\n\n## 核心能力\n\n- `情绪支持对话`:识别压力、焦虑、拖延等常见表达,给出温和回应。\n- `学习行动建议`:把大问题拆成可立刻执行的小步骤,降低启动门槛。\n- `双运行模式`:未配置模型密钥时使用本地演示模式;配置后切换到 OpenAI 兼容模型调用模式。\n- `Web 服务化`:提供可直接访问的页面、健康检查、接口元信息和 Swagger 文档。\n- `工程基础`:包含测试、CI、环境变量说明和补充文档。\n\n## 使用场景\n\n- 学业压力大,任务很多,不知道从哪里开始\n- 长期拖延,明知道该做但迟迟启动不了\n- 考试、答辩、面试前持续紧张,难以进入准备状态\n- 情绪混乱导致学习节奏失序,需要先稳定状态再恢复行动\n\n## 运行模式\n\n| 模式 | 说明 | 需要的配置 |\n| --- | --- | --- |\n| 本地演示模式 | 使用内置规则生成支持性回复,适合本地启动、调试界面和展示流程 | 无需 API Key |\n| 模型调用模式 | 调用 OpenAI 兼容接口生成回复,适合继续做真实能力验证 | 与当前模型匹配的 API Key |\n\n项目默认优先保证“拿到就能跑”。如果没有配置模型密钥,页面和 `/chat` 接口仍然可以完整返回结果。\n\n## 页面预览\n\n### 独立 Web 页面\n\n当前仓库默认运行的是独立 Web 页面,不需要打开钉钉即可访问和体验。\n\n![Web 页面预览](docs/assets/11-web-demo.png)\n\n也提供基于 GitHub Pages 的公开在线演示页,方便在不配置后端和 API Key 的情况下直接体验交互流程:\n\n- `https://1420079678-ctrl.github.io/zhiyuxing-ai-assistant/`\n\n### 钉钉接入场景示意\n\n下面两张图保留为钉钉平台接入场景示意,用于说明项目后续可以如何落到企业协同平台中。\n\n![平台界面示意](docs/assets/09-platform-overview.png)\n\n![对话界面示意](docs/assets/10-chat-demo.png)\n\n## 技术栈\n\n- Python 3.13\n- FastAPI\n- OpenAI Python SDK\n- Pydantic\n- python-dotenv\n- Pytest\n- GitHub Actions\n\n## 架构图\n\n![技术架构图](docs/assets/07-technical-architecture.png)\n\n## 快速启动\n\n推荐使用 Python 3.13,以保持与当前本地开发和 CI 环境一致。\n\n### 1. 安装依赖\n\n```bash\npython -m venv .venv\n.venv\\Scripts\\activate\npython -m pip install -r requirements.txt -r requirements-dev.txt\n```\n\n### 2. 一键配置模型接入\n\n推荐直接使用仓库根目录下一键脚本:\n\n```powershell\n.\\setup-openai.ps1\n.\\setup-deepseek-chat.ps1\n.\\setup-deepseek-r1.ps1\n```\n\n也可以双击对应的 `.bat` 文件。脚本会自动:\n\n- 不存在 `.env` 时,从 `.env.example` 复制一份\n- 按目标模型写入 `OPENAI_BASE_URL`、`MODEL_NAME`、`MODEL_PROVIDER`\n- 自动设置 `MODEL_API_KEY_ENV`,确保项目优先读取正确的密钥变量\n- 保留其他未切换的配置项\n\n需要注意:这几个脚本只是帮你一键写好模型接入配置,不是免 API Key 调用。\n\n- `.\\setup-openai.ps1` 对应 OpenAI 官方接口,真实调用需要 `OPENAI_API_KEY`\n- `.\\setup-deepseek-chat.ps1` 对应 DeepSeek Chat,真实调用需要 `DEEPSEEK_API_KEY`\n- `.\\setup-deepseek-r1.ps1` 对应 DeepSeek R1,真实调用也需要 `DEEPSEEK_API_KEY`\n\n如果运行脚本时没有填写对应 Key,项目仍然可以启动,但会自动回退到本地演示模式,不会真的调用线上模型。\n\n如果想手动配置,至少需要关注:\n\n- `OPENAI_API_KEY`\n- `DEEPSEEK_API_KEY`\n- `OPENAI_BASE_URL`\n- `MODEL_NAME`\n- `MODEL_PROVIDER`\n- `MODEL_API_KEY_ENV`\n- `MODEL_TEMPERATURE`\n- `DEMO_MODE`\n\n### 3. 启动前检查兼容性\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py\n```\n\n这个检查会直接告诉你:\n\n- 当前到底会读取哪个密钥变量\n- 当前模型和 API 地址是否存在明显错配\n- `deepseek-reasoner` 这类模型是否已经按兼容规则处理\n- 当前配置是否真的可以进入真实模型调用模式\n\n如果你已经填了真实 Key,还可以追加一次最小真实探测:\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py --probe\n```\n\n这一步会实际发起一次极小请求,用来确认“不是看起来兼容,而是真的能调通”。\n\n### 4. 启动服务\n\n```bash\npython -m uvicorn app:app --reload\n```\n\n如果你的系统 Python 没装项目依赖,最稳的方式是直接使用仓库自带虚拟环境:\n\n```powershell\n.\\.venv\\Scripts\\python -m uvicorn app:app --reload\n```\n\n也可以直接运行仓库根目录下的一键脚本:\n\n```powershell\n.\\start-web.ps1\n```\n\n或双击:\n\n```text\nstart-web.bat\n```\n\n启动后可访问:\n\n- `http://127.0.0.1:8000/`\n- `http://127.0.0.1:8000/api/meta`\n- `http://127.0.0.1:8000/api/compatibility`\n- `http://127.0.0.1:8000/health`\n- `http://127.0.0.1:8000/docs`\n- `http://127.0.0.1:8000/project-docs/usage-guide.md`\n\n### 5. 运行测试\n\n```bash\npython -m pytest -vv\n```\n\n## 接口概览\n\n- `GET /`:Web 页面入口\n- `POST /chat`:对话接口\n- `GET /health`:服务健康检查\n- `GET /api/meta`:服务元信息与当前运行模式\n- `GET /api/compatibility`:模型接入兼容性检查\n- `GET /docs`:Swagger 文档\n- `GET /project-docs/...`:项目补充文档\n\n### `POST /chat`\n\n请求示例:\n\n```json\n{\n \"message\": \"这周压力很大,感觉完全学不进去。\",\n \"system_hint\": \"给出温和且可执行的建议\"\n}\n```\n\n返回示例:\n\n```json\n{\n \"reply\": \"当前状态里明显存在压力堆积,可以先不追求一次解决整周问题,而是把任务缩小到今天最容易开始的一步,比如先完成 20 分钟复习。\",\n \"note\": \"当前为模型调用模式。回复由配置的 OpenAI 兼容接口生成。\",\n \"mode\": \"openai\"\n}\n```\n\n## 文档入口\n\n- 中文:\n [docs/project-report.md](docs/project-report.md)、\n [docs/usage-guide.md](docs/usage-guide.md)、\n [docs/model-integration.md](docs/model-integration.md)、\n [docs/dingtalk-integration.md](docs/dingtalk-integration.md)\n- English:\n [docs/project-report.en.md](docs/project-report.en.md)、\n [docs/usage-guide.en.md](docs/usage-guide.en.md)、\n [docs/model-integration.en.md](docs/model-integration.en.md)、\n [docs/dingtalk-integration.en.md](docs/dingtalk-integration.en.md)\n- 其他:\n [CONTRIBUTING.md](CONTRIBUTING.md)、\n [CHANGELOG.md](CHANGELOG.md)、\n [LICENSE](LICENSE)、\n [ROADMAP.md](ROADMAP.md)、\n [SECURITY.md](SECURITY.md)、\n [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md)、\n [docs/github-launch-kit.md](docs/github-launch-kit.md)\n\n## 路线图\n\n- 继续增强危机表达识别和更安全的引导边界\n- 继续扩展更多 OpenAI 兼容供应商的兼容检查\n- 增强多轮对话连续性与回复稳定性\n- 提供更适合公开展示的在线 Demo 入口\n\n## 接入不同大模型\n\n当前项目后端使用的是 OpenAI 兼容接口,因此可以通过修改 `.env` 或直接运行一键脚本切换不同模型提供商。\n\n- 切到 OpenAI:运行 `.\\setup-openai.ps1`\n- 切到 DeepSeek Chat:运行 `.\\setup-deepseek-chat.ps1`\n- 切到 DeepSeek R1:运行 `.\\setup-deepseek-r1.ps1`\n- 切到其他 OpenAI 兼容供应商:运行 `scripts/setup_model_config.py` 并传入自定义 `base_url`、`model_name`、`api_key_env`\n- Web 页面支持直接下拉选择模型目标和辅导风格\n- 页面右侧会直接显示当前提供商、当前模型、API 地址和接入兼容检查结果\n\n再次强调:这些脚本表示“项目已内置这些接入预设”,不是“这几个模型可以不填 Key 直接调用”。\n\n如果要接 `DeepSeek-R1`,当前代码已经处理了 `deepseek-reasoner` 的参数兼容问题,不会再强行传不适合的 `temperature` 参数。\n\n需要说明的是:本项目对 `OpenAI` 和 `DeepSeek` 官方接口可以做到明确兼容;对其他“OpenAI 兼容”供应商,是否完全兼容仍取决于对方是否真的支持 Chat Completions、当前模型名和常用参数格式。仓库里新增的兼容检查接口和脚本,就是用来把这件事提前说明白,而不是等运行时报错。\n\n## 安全边界\n\n- 项目定位是情绪支持和学习辅助,不替代专业心理诊断或治疗。\n- 当前实现强调温和、具体、避免危险引导的回复风格。\n- 如果用户出现持续失眠、严重低落或自伤相关表达,实际产品应优先引导线下求助与转介。\n\n## 钉钉接入说明\n\n- Web 页面是默认入口,便于直接访问和继续开发。\n- 钉钉是可选的真实业务接入场景,不影响项目本身独立运行。\n- 如果接入钉钉,需要根据企业内部应用、多组织分发或用户授权模式处理权限问题。\n\n## 测试与持续集成\n\n- 本地测试命令:`python -m pytest -vv`\n- 仓库已配置 GitHub Actions,在推送后自动运行基础测试\n"}, "9817c3bae12701cc58ac61a82a085a1cb7a8d036": {"t": 1785765000.4730844, "n": 5988, "h": "7105a412f1badefe", "c": "# 知愈星 AI Assistant\n\n[中文](README.md) | [English](README_EN.md)\n\n在线 Demo(部署后):`https://1420079678-ctrl.github.io/zhiyuxing-ai-assistant/`\n\n![Python 3.13](https://img.shields.io/badge/Python-3.13-3776AB?logo=python&logoColor=white)\n![FastAPI](https://img.shields.io/badge/FastAPI-Service-009688?logo=fastapi&logoColor=white)\n![CI](https://github.com/1420079678-ctrl/zhiyuxing-ai-assistant/actions/workflows/ci.yml/badge.svg)\n![License](https://img.shields.io/badge/License-MIT-green.svg)\n\n面向大学生场景的 AI 情绪支持与学习辅助服务,围绕学业压力、拖延内耗、考试与面试焦虑等高频问题,提供温和、具体、可执行的支持性建议。\n\n这个仓库的目标不是单纯展示方案,而是提供一个可以直接运行、便于继续开发、也能逐步接入钉钉等平台的完整项目基础。\n\n如果这个项目对你有帮助,欢迎点一个 `Star`。\n\n## 项目价值\n\n- 聚焦真实且高频的大学生使用场景,而不是泛化聊天。\n- 把“情绪支持”和“学习行动建议”放进同一轮对话,形成更完整的支持闭环。\n- 支持无密钥运行的本地演示模式,拿到仓库后可以直接启动和体验。\n- 预留模型调用和钉钉集成空间,便于后续继续做成更完整的产品。\n\n## 核心能力\n\n- `情绪支持对话`:识别压力、焦虑、拖延等常见表达,给出温和回应。\n- `学习行动建议`:把大问题拆成可立刻执行的小步骤,降低启动门槛。\n- `双运行模式`:未配置模型密钥时使用本地演示模式;配置后切换到 OpenAI 兼容模型调用模式。\n- `Web 服务化`:提供可直接访问的页面、健康检查、接口元信息和 Swagger 文档。\n- `工程基础`:包含测试、CI、环境变量说明和补充文档。\n\n## 使用场景\n\n- 学业压力大,任务很多,不知道从哪里开始\n- 长期拖延,明知道该做但迟迟启动不了\n- 考试、答辩、面试前持续紧张,难以进入准备状态\n- 情绪混乱导致学习节奏失序,需要先稳定状态再恢复行动\n\n## 运行模式\n\n| 模式 | 说明 | 需要的配置 |\n| --- | --- | --- |\n| 本地演示模式 | 使用内置规则生成支持性回复,适合本地启动、调试界面和展示流程 | 无需 API Key |\n| 模型调用模式 | 调用 OpenAI 兼容接口生成回复,适合继续做真实能力验证 | 与当前模型匹配的 API Key |\n\n项目默认优先保证“拿到就能跑”。如果没有配置模型密钥,页面和 `/chat` 接口仍然可以完整返回结果。\n\n## 页面预览\n\n### 独立 Web 页面\n\n当前仓库默认运行的是独立 Web 页面,不需要打开钉钉即可访问和体验。\n\n![Web 页面预览](docs/assets/11-web-demo.png)\n\n也提供基于 GitHub Pages 的公开在线演示页,方便在不配置后端和 API Key 的情况下直接体验交互流程:\n\n- `https://1420079678-ctrl.github.io/zhiyuxing-ai-assistant/`\n\n### 钉钉接入场景示意\n\n下面两张图保留为钉钉平台接入场景示意,用于说明项目后续可以如何落到企业协同平台中。\n\n![平台界面示意](docs/assets/09-platform-overview.png)\n\n![对话界面示意](docs/assets/10-chat-demo.png)\n\n## 技术栈\n\n- Python 3.13\n- FastAPI\n- OpenAI Python SDK\n- Pydantic\n- python-dotenv\n- Pytest\n- GitHub Actions\n\n## 架构图\n\n![技术架构图](docs/assets/07-technical-architecture.png)\n\n## 快速启动\n\n推荐使用 Python 3.13,以保持与当前本地开发和 CI 环境一致。\n\n### 1. 安装依赖\n\n```bash\npython -m venv .venv\n.venv\\Scripts\\activate\npython -m pip install -r requirements.txt -r requirements-dev.txt\n```\n\n### 2. 一键配置模型接入\n\n推荐直接使用仓库根目录下一键脚本:\n\n```powershell\n.\\setup-openai.ps1\n.\\setup-deepseek-chat.ps1\n.\\setup-deepseek-r1.ps1\n```\n\n也可以双击对应的 `.bat` 文件。脚本会自动:\n\n- 不存在 `.env` 时,从 `.env.example` 复制一份\n- 按目标模型写入 `OPENAI_BASE_URL`、`MODEL_NAME`、`MODEL_PROVIDER`\n- 自动设置 `MODEL_API_KEY_ENV`,确保项目优先读取正确的密钥变量\n- 保留其他未切换的配置项\n\n需要注意:这几个脚本只是帮你一键写好模型接入配置,不是免 API Key 调用。\n\n- `.\\setup-openai.ps1` 对应 OpenAI 官方接口,真实调用需要 `OPENAI_API_KEY`\n- `.\\setup-deepseek-chat.ps1` 对应 DeepSeek Chat,真实调用需要 `DEEPSEEK_API_KEY`\n- `.\\setup-deepseek-r1.ps1` 对应 DeepSeek R1,真实调用也需要 `DEEPSEEK_API_KEY`\n\n如果运行脚本时没有填写对应 Key,项目仍然可以启动,但会自动回退到本地演示模式,不会真的调用线上模型。\n\n如果想手动配置,至少需要关注:\n\n- `OPENAI_API_KEY`\n- `DEEPSEEK_API_KEY`\n- `OPENAI_BASE_URL`\n- `MODEL_NAME`\n- `MODEL_PROVIDER`\n- `MODEL_API_KEY_ENV`\n- `MODEL_TEMPERATURE`\n- `DEMO_MODE`\n\n### 3. 启动前检查兼容性\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py\n```\n\n这个检查会直接告诉你:\n\n- 当前到底会读取哪个密钥变量\n- 当前模型和 API 地址是否存在明显错配\n- `deepseek-reasoner` 这类模型是否已经按兼容规则处理\n- 当前配置是否真的可以进入真实模型调用模式\n\n如果你已经填了真实 Key,还可以追加一次最小真实探测:\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py --probe\n```\n\n这一步会实际发起一次极小请求,用来确认“不是看起来兼容,而是真的能调通”。\n\n### 4. 启动服务\n\n```bash\npython -m uvicorn app:app --reload\n```\n\n如果你的系统 Python 没装项目依赖,最稳的方式是直接使用仓库自带虚拟环境:\n\n```powershell\n.\\.venv\\Scripts\\python -m uvicorn app:app --reload\n```\n\n也可以直接运行仓库根目录下的一键脚本:\n\n```powershell\n.\\start-web.ps1\n```\n\n或双击:\n\n```text\nstart-web.bat\n```\n\n启动后可访问:\n\n- `http://127.0.0.1:8000/`\n- `http://127.0.0.1:8000/api/meta`\n- `http://127.0.0.1:8000/api/compatibility`\n- `http://127.0.0.1:8000/health`\n- `http://127.0.0.1:8000/docs`\n- `http://127.0.0.1:8000/project-docs/usage-guide.md`\n\n### 5. 运行测试\n\n```bash\npython -m pytest -vv\n```\n\n## 接口概览\n\n- `GET /`:Web 页面入口\n- `POST /chat`:对话接口\n- `GET /health`:服务健康检查\n- `GET /api/meta`:服务元信息与当前运行模式\n- `GET /api/compatibility`:模型接入兼容性检查\n- `GET /docs`:Swagger 文档\n- `GET /project-docs/...`:项目补充文档\n\n### `POST /chat`\n\n请求示例:\n\n```json\n{\n \"message\": \"这周压力很大,感觉完全学不进去。\",\n \"system_hint\": \"给出温和且可执行的建议\"\n}\n```\n\n返回示例:\n\n```json\n{\n \"reply\": \"当前状态里明显存在压力堆积,可以先不追求一次解决整周问题,而是把任务缩小到今天最容易开始的一步,比如先完成 20 分钟复习。\",\n \"note\": \"当前为模型调用模式。回复由配置的 OpenAI 兼容接口生成。\",\n \"mode\": \"openai\"\n}\n```\n\n## 文档入口\n\n- 中文:\n [docs/project-report.md](docs/project-report.md)、\n [docs/usage-guide.md](docs/usage-guide.md)、\n [docs/model-integration.md](docs/model-integration.md)、\n [docs/dingtalk-integration.md](docs/dingtalk-integration.md)\n- English:\n [docs/project-report.en.md](docs/project-report.en.md)、\n [docs/usage-guide.en.md](docs/usage-guide.en.md)、\n [docs/model-integration.en.md](docs/model-integration.en.md)、\n [docs/dingtalk-integration.en.md](docs/dingtalk-integration.en.md)\n- 其他:\n [CONTRIBUTING.md](CONTRIBUTING.md)、\n [CHANGELOG.md](CHANGELOG.md)、\n [LICENSE](LICENSE)、\n [ROADMAP.md](ROADMAP.md)、\n [SECURITY.md](SECURITY.md)、\n [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md)、\n [docs/github-launch-kit.md](docs/github-launch-kit.md)\n\n## 路线图\n\n- 继续增强危机表达识别和更安全的引导边界\n- 继续扩展更多 OpenAI 兼容供应商的兼容检查\n- 增强多轮对话连续性与回复稳定性\n- 提供更适合公开展示的在线 Demo 入口\n\n## 接入不同大模型\n\n当前项目后端使用的是 OpenAI 兼容接口,因此可以通过修改 `.env` 或直接运行一键脚本切换不同模型提供商。\n\n- 切到 OpenAI:运行 `.\\setup-openai.ps1`\n- 切到 DeepSeek Chat:运行 `.\\setup-deepseek-chat.ps1`\n- 切到 DeepSeek R1:运行 `.\\setup-deepseek-r1.ps1`\n- 切到其他 OpenAI 兼容供应商:运行 `scripts/setup_model_config.py` 并传入自定义 `base_url`、`model_name`、`api_key_env`\n- Web 页面支持直接下拉选择模型目标和辅导风格\n- 页面右侧会直接显示当前提供商、当前模型、API 地址和接入兼容检查结果\n\n再次强调:这些脚本表示“项目已内置这些接入预设”,不是“这几个模型可以不填 Key 直接调用”。\n\n如果要接 `DeepSeek-R1`,当前代码已经处理了 `deepseek-reasoner` 的参数兼容问题,不会再强行传不适合的 `temperature` 参数。\n\n需要说明的是:本项目对 `OpenAI` 和 `DeepSeek` 官方接口可以做到明确兼容;对其他“OpenAI 兼容”供应商,是否完全兼容仍取决于对方是否真的支持 Chat Completions、当前模型名和常用参数格式。仓库里新增的兼容检查接口和脚本,就是用来把这件事提前说明白,而不是等运行时报错。\n\n## 安全边界\n\n- 项目定位是情绪支持和学习辅助,不替代专业心理诊断或治疗。\n- 当前实现强调温和、具体、避免危险引导的回复风格。\n- 如果用户出现持续失眠、严重低落或自伤相关表达,实际产品应优先引导线下求助与转介。\n\n## 钉钉接入说明\n\n- Web 页面是默认入口,便于直接访问和继续开发。\n- 钉钉是可选的真实业务接入场景,不影响项目本身独立运行。\n- 如果接入钉钉,需要根据企业内部应用、多组织分发或用户授权模式处理权限问题。\n\n## 测试与持续集成\n\n- 本地测试命令:`python -m pytest -vv`\n- 仓库已配置 GitHub Actions,在推送后自动运行基础测试\n"}, "ce358b947b65585bb84c3fa9b9ec716c64e7ebea": {"t": 1785765001.8386722, "n": 5790, "h": "17ae23598318a5e6", "c": "# 知愈星 AI Assistant\n\n[中文](README.md) | [English](README_EN.md)\n\n![Python 3.13](https://img.shields.io/badge/Python-3.13-3776AB?logo=python&logoColor=white)\n![FastAPI](https://img.shields.io/badge/FastAPI-Service-009688?logo=fastapi&logoColor=white)\n![CI](https://github.com/1420079678-ctrl/zhiyuxing-ai-assistant/actions/workflows/ci.yml/badge.svg)\n![License](https://img.shields.io/badge/License-MIT-green.svg)\n\n面向大学生场景的 AI 情绪支持与学习辅助服务,围绕学业压力、拖延内耗、考试与面试焦虑等高频问题,提供温和、具体、可执行的支持性建议。\n\n这个仓库的目标不是单纯展示方案,而是提供一个可以直接运行、便于继续开发、也能逐步接入钉钉等平台的完整项目基础。\n\n如果这个项目对你有帮助,欢迎点一个 `Star`。\n\n## 项目价值\n\n- 聚焦真实且高频的大学生使用场景,而不是泛化聊天。\n- 把“情绪支持”和“学习行动建议”放进同一轮对话,形成更完整的支持闭环。\n- 支持无密钥运行的本地演示模式,拿到仓库后可以直接启动和体验。\n- 预留模型调用和钉钉集成空间,便于后续继续做成更完整的产品。\n\n## 核心能力\n\n- `情绪支持对话`:识别压力、焦虑、拖延等常见表达,给出温和回应。\n- `学习行动建议`:把大问题拆成可立刻执行的小步骤,降低启动门槛。\n- `双运行模式`:未配置模型密钥时使用本地演示模式;配置后切换到 OpenAI 兼容模型调用模式。\n- `Web 服务化`:提供可直接访问的页面、健康检查、接口元信息和 Swagger 文档。\n- `工程基础`:包含测试、CI、环境变量说明和补充文档。\n\n## 使用场景\n\n- 学业压力大,任务很多,不知道从哪里开始\n- 长期拖延,明知道该做但迟迟启动不了\n- 考试、答辩、面试前持续紧张,难以进入准备状态\n- 情绪混乱导致学习节奏失序,需要先稳定状态再恢复行动\n\n## 运行模式\n\n| 模式 | 说明 | 需要的配置 |\n| --- | --- | --- |\n| 本地演示模式 | 使用内置规则生成支持性回复,适合本地启动、调试界面和展示流程 | 无需 API Key |\n| 模型调用模式 | 调用 OpenAI 兼容接口生成回复,适合继续做真实能力验证 | 与当前模型匹配的 API Key |\n\n项目默认优先保证“拿到就能跑”。如果没有配置模型密钥,页面和 `/chat` 接口仍然可以完整返回结果。\n\n## 页面预览\n\n### 独立 Web 页面\n\n当前仓库默认运行的是独立 Web 页面,不需要打开钉钉即可访问和体验。\n\n![Web 页面预览](docs/assets/11-web-demo.png)\n\n### 钉钉接入场景示意\n\n下面两张图保留为钉钉平台接入场景示意,用于说明项目后续可以如何落到企业协同平台中。\n\n![平台界面示意](docs/assets/09-platform-overview.png)\n\n![对话界面示意](docs/assets/10-chat-demo.png)\n\n## 技术栈\n\n- Python 3.13\n- FastAPI\n- OpenAI Python SDK\n- Pydantic\n- python-dotenv\n- Pytest\n- GitHub Actions\n\n## 架构图\n\n![技术架构图](docs/assets/07-technical-architecture.png)\n\n## 快速启动\n\n推荐使用 Python 3.13,以保持与当前本地开发和 CI 环境一致。\n\n### 1. 安装依赖\n\n```bash\npython -m venv .venv\n.venv\\Scripts\\activate\npython -m pip install -r requirements.txt -r requirements-dev.txt\n```\n\n### 2. 一键配置模型接入\n\n推荐直接使用仓库根目录下一键脚本:\n\n```powershell\n.\\setup-openai.ps1\n.\\setup-deepseek-chat.ps1\n.\\setup-deepseek-r1.ps1\n```\n\n也可以双击对应的 `.bat` 文件。脚本会自动:\n\n- 不存在 `.env` 时,从 `.env.example` 复制一份\n- 按目标模型写入 `OPENAI_BASE_URL`、`MODEL_NAME`、`MODEL_PROVIDER`\n- 自动设置 `MODEL_API_KEY_ENV`,确保项目优先读取正确的密钥变量\n- 保留其他未切换的配置项\n\n需要注意:这几个脚本只是帮你一键写好模型接入配置,不是免 API Key 调用。\n\n- `.\\setup-openai.ps1` 对应 OpenAI 官方接口,真实调用需要 `OPENAI_API_KEY`\n- `.\\setup-deepseek-chat.ps1` 对应 DeepSeek Chat,真实调用需要 `DEEPSEEK_API_KEY`\n- `.\\setup-deepseek-r1.ps1` 对应 DeepSeek R1,真实调用也需要 `DEEPSEEK_API_KEY`\n\n如果运行脚本时没有填写对应 Key,项目仍然可以启动,但会自动回退到本地演示模式,不会真的调用线上模型。\n\n如果想手动配置,至少需要关注:\n\n- `OPENAI_API_KEY`\n- `DEEPSEEK_API_KEY`\n- `OPENAI_BASE_URL`\n- `MODEL_NAME`\n- `MODEL_PROVIDER`\n- `MODEL_API_KEY_ENV`\n- `MODEL_TEMPERATURE`\n- `DEMO_MODE`\n\n### 3. 启动前检查兼容性\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py\n```\n\n这个检查会直接告诉你:\n\n- 当前到底会读取哪个密钥变量\n- 当前模型和 API 地址是否存在明显错配\n- `deepseek-reasoner` 这类模型是否已经按兼容规则处理\n- 当前配置是否真的可以进入真实模型调用模式\n\n如果你已经填了真实 Key,还可以追加一次最小真实探测:\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py --probe\n```\n\n这一步会实际发起一次极小请求,用来确认“不是看起来兼容,而是真的能调通”。\n\n### 4. 启动服务\n\n```bash\npython -m uvicorn app:app --reload\n```\n\n如果你的系统 Python 没装项目依赖,最稳的方式是直接使用仓库自带虚拟环境:\n\n```powershell\n.\\.venv\\Scripts\\python -m uvicorn app:app --reload\n```\n\n也可以直接运行仓库根目录下的一键脚本:\n\n```powershell\n.\\start-web.ps1\n```\n\n或双击:\n\n```text\nstart-web.bat\n```\n\n启动后可访问:\n\n- `http://127.0.0.1:8000/`\n- `http://127.0.0.1:8000/api/meta`\n- `http://127.0.0.1:8000/api/compatibility`\n- `http://127.0.0.1:8000/health`\n- `http://127.0.0.1:8000/docs`\n- `http://127.0.0.1:8000/project-docs/usage-guide.md`\n\n### 5. 运行测试\n\n```bash\npython -m pytest -vv\n```\n\n## 接口概览\n\n- `GET /`:Web 页面入口\n- `POST /chat`:对话接口\n- `GET /health`:服务健康检查\n- `GET /api/meta`:服务元信息与当前运行模式\n- `GET /api/compatibility`:模型接入兼容性检查\n- `GET /docs`:Swagger 文档\n- `GET /project-docs/...`:项目补充文档\n\n### `POST /chat`\n\n请求示例:\n\n```json\n{\n \"message\": \"这周压力很大,感觉完全学不进去。\",\n \"system_hint\": \"给出温和且可执行的建议\"\n}\n```\n\n返回示例:\n\n```json\n{\n \"reply\": \"当前状态里明显存在压力堆积,可以先不追求一次解决整周问题,而是把任务缩小到今天最容易开始的一步,比如先完成 20 分钟复习。\",\n \"note\": \"当前为模型调用模式。回复由配置的 OpenAI 兼容接口生成。\",\n \"mode\": \"openai\"\n}\n```\n\n## 文档入口\n\n- 中文:\n [docs/project-report.md](docs/project-report.md)、\n [docs/usage-guide.md](docs/usage-guide.md)、\n [docs/model-integration.md](docs/model-integration.md)、\n [docs/dingtalk-integration.md](docs/dingtalk-integration.md)\n- English:\n [docs/project-report.en.md](docs/project-report.en.md)、\n [docs/usage-guide.en.md](docs/usage-guide.en.md)、\n [docs/model-integration.en.md](docs/model-integration.en.md)、\n [docs/dingtalk-integration.en.md](docs/dingtalk-integration.en.md)\n- 其他:\n [CONTRIBUTING.md](CONTRIBUTING.md)、\n [CHANGELOG.md](CHANGELOG.md)、\n [LICENSE](LICENSE)、\n [ROADMAP.md](ROADMAP.md)、\n [SECURITY.md](SECURITY.md)、\n [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md)、\n [docs/github-launch-kit.md](docs/github-launch-kit.md)\n\n## 路线图\n\n- 继续增强危机表达识别和更安全的引导边界\n- 继续扩展更多 OpenAI 兼容供应商的兼容检查\n- 增强多轮对话连续性与回复稳定性\n- 提供更适合公开展示的在线 Demo 入口\n\n## 接入不同大模型\n\n当前项目后端使用的是 OpenAI 兼容接口,因此可以通过修改 `.env` 或直接运行一键脚本切换不同模型提供商。\n\n- 切到 OpenAI:运行 `.\\setup-openai.ps1`\n- 切到 DeepSeek Chat:运行 `.\\setup-deepseek-chat.ps1`\n- 切到 DeepSeek R1:运行 `.\\setup-deepseek-r1.ps1`\n- 切到其他 OpenAI 兼容供应商:运行 `scripts/setup_model_config.py` 并传入自定义 `base_url`、`model_name`、`api_key_env`\n- Web 页面支持直接下拉选择模型目标和辅导风格\n- 页面右侧会直接显示当前提供商、当前模型、API 地址和接入兼容检查结果\n\n再次强调:这些脚本表示“项目已内置这些接入预设”,不是“这几个模型可以不填 Key 直接调用”。\n\n如果要接 `DeepSeek-R1`,当前代码已经处理了 `deepseek-reasoner` 的参数兼容问题,不会再强行传不适合的 `temperature` 参数。\n\n需要说明的是:本项目对 `OpenAI` 和 `DeepSeek` 官方接口可以做到明确兼容;对其他“OpenAI 兼容”供应商,是否完全兼容仍取决于对方是否真的支持 Chat Completions、当前模型名和常用参数格式。仓库里新增的兼容检查接口和脚本,就是用来把这件事提前说明白,而不是等运行时报错。\n\n## 安全边界\n\n- 项目定位是情绪支持和学习辅助,不替代专业心理诊断或治疗。\n- 当前实现强调温和、具体、避免危险引导的回复风格。\n- 如果用户出现持续失眠、严重低落或自伤相关表达,实际产品应优先引导线下求助与转介。\n\n## 钉钉接入说明\n\n- Web 页面是默认入口,便于直接访问和继续开发。\n- 钉钉是可选的真实业务接入场景,不影响项目本身独立运行。\n- 如果接入钉钉,需要根据企业内部应用、多组织分发或用户授权模式处理权限问题。\n\n## 测试与持续集成\n\n- 本地测试命令:`python -m pytest -vv`\n- 仓库已配置 GitHub Actions,在推送后自动运行基础测试\n"}, "2c6fad7429330dba4165ec51b596e5e39005a406": {"t": 1785765003.1829586, "n": 5531, "h": "120c23ae3d2ebde1", "c": "# 知愈星 AI Assistant\n\n[中文](README.md) | [English](README_EN.md)\n\n![Python 3.13](https://img.shields.io/badge/Python-3.13-3776AB?logo=python&logoColor=white)\n![FastAPI](https://img.shields.io/badge/FastAPI-Service-009688?logo=fastapi&logoColor=white)\n![CI](https://github.com/1420079678-ctrl/zhiyuxing-ai-assistant/actions/workflows/ci.yml/badge.svg)\n![License](https://img.shields.io/badge/License-MIT-green.svg)\n\n面向大学生场景的 AI 情绪支持与学习辅助服务,围绕学业压力、拖延内耗、考试与面试焦虑等高频问题,提供温和、具体、可执行的支持性建议。\n\n这个仓库的目标不是单纯展示方案,而是提供一个可以直接运行、便于继续开发、也能逐步接入钉钉等平台的完整项目基础。\n\n如果这个项目对你有帮助,欢迎点一个 `Star`。\n\n## 项目价值\n\n- 聚焦真实且高频的大学生使用场景,而不是泛化聊天。\n- 把“情绪支持”和“学习行动建议”放进同一轮对话,形成更完整的支持闭环。\n- 支持无密钥运行的本地演示模式,拿到仓库后可以直接启动和体验。\n- 预留模型调用和钉钉集成空间,便于后续继续做成更完整的产品。\n\n## 核心能力\n\n- `情绪支持对话`:识别压力、焦虑、拖延等常见表达,给出温和回应。\n- `学习行动建议`:把大问题拆成可立刻执行的小步骤,降低启动门槛。\n- `双运行模式`:未配置模型密钥时使用本地演示模式;配置后切换到 OpenAI 兼容模型调用模式。\n- `Web 服务化`:提供可直接访问的页面、健康检查、接口元信息和 Swagger 文档。\n- `工程基础`:包含测试、CI、环境变量说明和补充文档。\n\n## 使用场景\n\n- 学业压力大,任务很多,不知道从哪里开始\n- 长期拖延,明知道该做但迟迟启动不了\n- 考试、答辩、面试前持续紧张,难以进入准备状态\n- 情绪混乱导致学习节奏失序,需要先稳定状态再恢复行动\n\n## 运行模式\n\n| 模式 | 说明 | 需要的配置 |\n| --- | --- | --- |\n| 本地演示模式 | 使用内置规则生成支持性回复,适合本地启动、调试界面和展示流程 | 无需 API Key |\n| 模型调用模式 | 调用 OpenAI 兼容接口生成回复,适合继续做真实能力验证 | 与当前模型匹配的 API Key |\n\n项目默认优先保证“拿到就能跑”。如果没有配置模型密钥,页面和 `/chat` 接口仍然可以完整返回结果。\n\n## 页面预览\n\n### 独立 Web 页面\n\n当前仓库默认运行的是独立 Web 页面,不需要打开钉钉即可访问和体验。\n\n![Web 页面预览](docs/assets/11-web-demo.png)\n\n### 钉钉接入场景示意\n\n下面两张图保留为钉钉平台接入场景示意,用于说明项目后续可以如何落到企业协同平台中。\n\n![平台界面示意](docs/assets/09-platform-overview.png)\n\n![对话界面示意](docs/assets/10-chat-demo.png)\n\n## 技术栈\n\n- Python 3.13\n- FastAPI\n- OpenAI Python SDK\n- Pydantic\n- python-dotenv\n- Pytest\n- GitHub Actions\n\n## 架构图\n\n![技术架构图](docs/assets/07-technical-architecture.png)\n\n## 快速启动\n\n推荐使用 Python 3.13,以保持与当前本地开发和 CI 环境一致。\n\n### 1. 安装依赖\n\n```bash\npython -m venv .venv\n.venv\\Scripts\\activate\npython -m pip install -r requirements.txt -r requirements-dev.txt\n```\n\n### 2. 一键配置模型接入\n\n推荐直接使用仓库根目录下一键脚本:\n\n```powershell\n.\\setup-openai.ps1\n.\\setup-deepseek-chat.ps1\n.\\setup-deepseek-r1.ps1\n```\n\n也可以双击对应的 `.bat` 文件。脚本会自动:\n\n- 不存在 `.env` 时,从 `.env.example` 复制一份\n- 按目标模型写入 `OPENAI_BASE_URL`、`MODEL_NAME`、`MODEL_PROVIDER`\n- 自动设置 `MODEL_API_KEY_ENV`,确保项目优先读取正确的密钥变量\n- 保留其他未切换的配置项\n\n需要注意:这几个脚本只是帮你一键写好模型接入配置,不是免 API Key 调用。\n\n- `.\\setup-openai.ps1` 对应 OpenAI 官方接口,真实调用需要 `OPENAI_API_KEY`\n- `.\\setup-deepseek-chat.ps1` 对应 DeepSeek Chat,真实调用需要 `DEEPSEEK_API_KEY`\n- `.\\setup-deepseek-r1.ps1` 对应 DeepSeek R1,真实调用也需要 `DEEPSEEK_API_KEY`\n\n如果运行脚本时没有填写对应 Key,项目仍然可以启动,但会自动回退到本地演示模式,不会真的调用线上模型。\n\n如果想手动配置,至少需要关注:\n\n- `OPENAI_API_KEY`\n- `DEEPSEEK_API_KEY`\n- `OPENAI_BASE_URL`\n- `MODEL_NAME`\n- `MODEL_PROVIDER`\n- `MODEL_API_KEY_ENV`\n- `MODEL_TEMPERATURE`\n- `DEMO_MODE`\n\n### 3. 启动前检查兼容性\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py\n```\n\n这个检查会直接告诉你:\n\n- 当前到底会读取哪个密钥变量\n- 当前模型和 API 地址是否存在明显错配\n- `deepseek-reasoner` 这类模型是否已经按兼容规则处理\n- 当前配置是否真的可以进入真实模型调用模式\n\n如果你已经填了真实 Key,还可以追加一次最小真实探测:\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py --probe\n```\n\n这一步会实际发起一次极小请求,用来确认“不是看起来兼容,而是真的能调通”。\n\n### 4. 启动服务\n\n```bash\npython -m uvicorn app:app --reload\n```\n\n如果你的系统 Python 没装项目依赖,最稳的方式是直接使用仓库自带虚拟环境:\n\n```powershell\n.\\.venv\\Scripts\\python -m uvicorn app:app --reload\n```\n\n也可以直接运行仓库根目录下的一键脚本:\n\n```powershell\n.\\start-web.ps1\n```\n\n或双击:\n\n```text\nstart-web.bat\n```\n\n启动后可访问:\n\n- `http://127.0.0.1:8000/`\n- `http://127.0.0.1:8000/api/meta`\n- `http://127.0.0.1:8000/api/compatibility`\n- `http://127.0.0.1:8000/health`\n- `http://127.0.0.1:8000/docs`\n- `http://127.0.0.1:8000/project-docs/usage-guide.md`\n\n### 5. 运行测试\n\n```bash\npython -m pytest -vv\n```\n\n## 接口概览\n\n- `GET /`:Web 页面入口\n- `POST /chat`:对话接口\n- `GET /health`:服务健康检查\n- `GET /api/meta`:服务元信息与当前运行模式\n- `GET /api/compatibility`:模型接入兼容性检查\n- `GET /docs`:Swagger 文档\n- `GET /project-docs/...`:项目补充文档\n\n### `POST /chat`\n\n请求示例:\n\n```json\n{\n \"message\": \"这周压力很大,感觉完全学不进去。\",\n \"system_hint\": \"给出温和且可执行的建议\"\n}\n```\n\n返回示例:\n\n```json\n{\n \"reply\": \"当前状态里明显存在压力堆积,可以先不追求一次解决整周问题,而是把任务缩小到今天最容易开始的一步,比如先完成 20 分钟复习。\",\n \"note\": \"当前为模型调用模式。回复由配置的 OpenAI 兼容接口生成。\",\n \"mode\": \"openai\"\n}\n```\n\n## 文档入口\n\n- 中文:\n [docs/project-report.md](docs/project-report.md)、\n [docs/usage-guide.md](docs/usage-guide.md)、\n [docs/model-integration.md](docs/model-integration.md)、\n [docs/dingtalk-integration.md](docs/dingtalk-integration.md)\n- English:\n [docs/project-report.en.md](docs/project-report.en.md)、\n [docs/usage-guide.en.md](docs/usage-guide.en.md)、\n [docs/model-integration.en.md](docs/model-integration.en.md)、\n [docs/dingtalk-integration.en.md](docs/dingtalk-integration.en.md)\n- 其他:\n [CONTRIBUTING.md](CONTRIBUTING.md)、\n [CHANGELOG.md](CHANGELOG.md)、\n [LICENSE](LICENSE)\n\n## 接入不同大模型\n\n当前项目后端使用的是 OpenAI 兼容接口,因此可以通过修改 `.env` 或直接运行一键脚本切换不同模型提供商。\n\n- 切到 OpenAI:运行 `.\\setup-openai.ps1`\n- 切到 DeepSeek Chat:运行 `.\\setup-deepseek-chat.ps1`\n- 切到 DeepSeek R1:运行 `.\\setup-deepseek-r1.ps1`\n- 切到其他 OpenAI 兼容供应商:运行 `scripts/setup_model_config.py` 并传入自定义 `base_url`、`model_name`、`api_key_env`\n- Web 页面支持直接下拉选择模型目标和辅导风格\n- 页面右侧会直接显示当前提供商、当前模型、API 地址和接入兼容检查结果\n\n再次强调:这些脚本表示“项目已内置这些接入预设”,不是“这几个模型可以不填 Key 直接调用”。\n\n如果要接 `DeepSeek-R1`,当前代码已经处理了 `deepseek-reasoner` 的参数兼容问题,不会再强行传不适合的 `temperature` 参数。\n\n需要说明的是:本项目对 `OpenAI` 和 `DeepSeek` 官方接口可以做到明确兼容;对其他“OpenAI 兼容”供应商,是否完全兼容仍取决于对方是否真的支持 Chat Completions、当前模型名和常用参数格式。仓库里新增的兼容检查接口和脚本,就是用来把这件事提前说明白,而不是等运行时报错。\n\n## 安全边界\n\n- 项目定位是情绪支持和学习辅助,不替代专业心理诊断或治疗。\n- 当前实现强调温和、具体、避免危险引导的回复风格。\n- 如果用户出现持续失眠、严重低落或自伤相关表达,实际产品应优先引导线下求助与转介。\n\n## 钉钉接入说明\n\n- Web 页面是默认入口,便于直接访问和继续开发。\n- 钉钉是可选的真实业务接入场景,不影响项目本身独立运行。\n- 如果接入钉钉,需要根据企业内部应用、多组织分发或用户授权模式处理权限问题。\n\n## 测试与持续集成\n\n- 本地测试命令:`python -m pytest -vv`\n- 仓库已配置 GitHub Actions,在推送后自动运行基础测试\n"}, "e8987d60b75a119016a27b8ae44ea149466b0017": {"t": 1785765004.553487, "n": 5344, "h": "c72064c5d015db0e", "c": "# 知愈星 AI Assistant\n\n[中文](README.md) | [English](README_EN.md)\n\n![Python 3.13](https://img.shields.io/badge/Python-3.13-3776AB?logo=python&logoColor=white)\n![FastAPI](https://img.shields.io/badge/FastAPI-Service-009688?logo=fastapi&logoColor=white)\n![CI](https://github.com/1420079678-ctrl/zhiyuxing-ai-assistant/actions/workflows/ci.yml/badge.svg)\n\n面向大学生场景的 AI 情绪支持与学习辅助服务,围绕学业压力、拖延内耗、考试与面试焦虑等高频问题,提供温和、具体、可执行的支持性建议。\n\n这个仓库的目标不是单纯展示方案,而是提供一个可以直接运行、便于继续开发、也能逐步接入钉钉等平台的完整项目基础。\n\n## 项目价值\n\n- 聚焦真实且高频的大学生使用场景,而不是泛化聊天。\n- 把“情绪支持”和“学习行动建议”放进同一轮对话,形成更完整的支持闭环。\n- 支持无密钥运行的本地演示模式,拿到仓库后可以直接启动和体验。\n- 预留模型调用和钉钉集成空间,便于后续继续做成更完整的产品。\n\n## 核心能力\n\n- `情绪支持对话`:识别压力、焦虑、拖延等常见表达,给出温和回应。\n- `学习行动建议`:把大问题拆成可立刻执行的小步骤,降低启动门槛。\n- `双运行模式`:未配置模型密钥时使用本地演示模式;配置后切换到 OpenAI 兼容模型调用模式。\n- `Web 服务化`:提供可直接访问的页面、健康检查、接口元信息和 Swagger 文档。\n- `工程基础`:包含测试、CI、环境变量说明和补充文档。\n\n## 使用场景\n\n- 学业压力大,任务很多,不知道从哪里开始\n- 长期拖延,明知道该做但迟迟启动不了\n- 考试、答辩、面试前持续紧张,难以进入准备状态\n- 情绪混乱导致学习节奏失序,需要先稳定状态再恢复行动\n\n## 运行模式\n\n| 模式 | 说明 | 需要的配置 |\n| --- | --- | --- |\n| 本地演示模式 | 使用内置规则生成支持性回复,适合本地启动、调试界面和展示流程 | 无需 API Key |\n| 模型调用模式 | 调用 OpenAI 兼容接口生成回复,适合继续做真实能力验证 | 与当前模型匹配的 API Key |\n\n项目默认优先保证“拿到就能跑”。如果没有配置模型密钥,页面和 `/chat` 接口仍然可以完整返回结果。\n\n## 页面预览\n\n### 独立 Web 页面\n\n当前仓库默认运行的是独立 Web 页面,不需要打开钉钉即可访问和体验。\n\n![Web 页面预览](docs/assets/11-web-demo.png)\n\n### 钉钉接入场景示意\n\n下面两张图保留为钉钉平台接入场景示意,用于说明项目后续可以如何落到企业协同平台中。\n\n![平台界面示意](docs/assets/09-platform-overview.png)\n\n![对话界面示意](docs/assets/10-chat-demo.png)\n\n## 技术栈\n\n- Python 3.13\n- FastAPI\n- OpenAI Python SDK\n- Pydantic\n- python-dotenv\n- Pytest\n- GitHub Actions\n\n## 架构图\n\n![技术架构图](docs/assets/07-technical-architecture.png)\n\n## 快速启动\n\n推荐使用 Python 3.13,以保持与当前本地开发和 CI 环境一致。\n\n### 1. 安装依赖\n\n```bash\npython -m venv .venv\n.venv\\Scripts\\activate\npython -m pip install -r requirements.txt -r requirements-dev.txt\n```\n\n### 2. 一键配置模型接入\n\n推荐直接使用仓库根目录下一键脚本:\n\n```powershell\n.\\setup-openai.ps1\n.\\setup-deepseek-chat.ps1\n.\\setup-deepseek-r1.ps1\n```\n\n也可以双击对应的 `.bat` 文件。脚本会自动:\n\n- 不存在 `.env` 时,从 `.env.example` 复制一份\n- 按目标模型写入 `OPENAI_BASE_URL`、`MODEL_NAME`、`MODEL_PROVIDER`\n- 自动设置 `MODEL_API_KEY_ENV`,确保项目优先读取正确的密钥变量\n- 保留其他未切换的配置项\n\n需要注意:这几个脚本只是帮你一键写好模型接入配置,不是免 API Key 调用。\n\n- `.\\setup-openai.ps1` 对应 OpenAI 官方接口,真实调用需要 `OPENAI_API_KEY`\n- `.\\setup-deepseek-chat.ps1` 对应 DeepSeek Chat,真实调用需要 `DEEPSEEK_API_KEY`\n- `.\\setup-deepseek-r1.ps1` 对应 DeepSeek R1,真实调用也需要 `DEEPSEEK_API_KEY`\n\n如果运行脚本时没有填写对应 Key,项目仍然可以启动,但会自动回退到本地演示模式,不会真的调用线上模型。\n\n如果想手动配置,至少需要关注:\n\n- `OPENAI_API_KEY`\n- `DEEPSEEK_API_KEY`\n- `OPENAI_BASE_URL`\n- `MODEL_NAME`\n- `MODEL_PROVIDER`\n- `MODEL_API_KEY_ENV`\n- `MODEL_TEMPERATURE`\n- `DEMO_MODE`\n\n### 3. 启动前检查兼容性\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py\n```\n\n这个检查会直接告诉你:\n\n- 当前到底会读取哪个密钥变量\n- 当前模型和 API 地址是否存在明显错配\n- `deepseek-reasoner` 这类模型是否已经按兼容规则处理\n- 当前配置是否真的可以进入真实模型调用模式\n\n如果你已经填了真实 Key,还可以追加一次最小真实探测:\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py --probe\n```\n\n这一步会实际发起一次极小请求,用来确认“不是看起来兼容,而是真的能调通”。\n\n### 4. 启动服务\n\n```bash\npython -m uvicorn app:app --reload\n```\n\n如果你的系统 Python 没装项目依赖,最稳的方式是直接使用仓库自带虚拟环境:\n\n```powershell\n.\\.venv\\Scripts\\python -m uvicorn app:app --reload\n```\n\n也可以直接运行仓库根目录下的一键脚本:\n\n```powershell\n.\\start-web.ps1\n```\n\n或双击:\n\n```text\nstart-web.bat\n```\n\n启动后可访问:\n\n- `http://127.0.0.1:8000/`\n- `http://127.0.0.1:8000/api/meta`\n- `http://127.0.0.1:8000/api/compatibility`\n- `http://127.0.0.1:8000/health`\n- `http://127.0.0.1:8000/docs`\n- `http://127.0.0.1:8000/project-docs/usage-guide.md`\n\n### 5. 运行测试\n\n```bash\npython -m pytest -vv\n```\n\n## 接口概览\n\n- `GET /`:Web 页面入口\n- `POST /chat`:对话接口\n- `GET /health`:服务健康检查\n- `GET /api/meta`:服务元信息与当前运行模式\n- `GET /api/compatibility`:模型接入兼容性检查\n- `GET /docs`:Swagger 文档\n- `GET /project-docs/...`:项目补充文档\n\n### `POST /chat`\n\n请求示例:\n\n```json\n{\n \"message\": \"这周压力很大,感觉完全学不进去。\",\n \"system_hint\": \"给出温和且可执行的建议\"\n}\n```\n\n返回示例:\n\n```json\n{\n \"reply\": \"当前状态里明显存在压力堆积,可以先不追求一次解决整周问题,而是把任务缩小到今天最容易开始的一步,比如先完成 20 分钟复习。\",\n \"note\": \"当前为模型调用模式。回复由配置的 OpenAI 兼容接口生成。\",\n \"mode\": \"openai\"\n}\n```\n\n## 文档入口\n\n- 中文:\n [docs/project-report.md](docs/project-report.md)、\n [docs/usage-guide.md](docs/usage-guide.md)、\n [docs/model-integration.md](docs/model-integration.md)、\n [docs/dingtalk-integration.md](docs/dingtalk-integration.md)\n- English:\n [docs/project-report.en.md](docs/project-report.en.md)、\n [docs/usage-guide.en.md](docs/usage-guide.en.md)、\n [docs/model-integration.en.md](docs/model-integration.en.md)、\n [docs/dingtalk-integration.en.md](docs/dingtalk-integration.en.md)\n\n## 接入不同大模型\n\n当前项目后端使用的是 OpenAI 兼容接口,因此可以通过修改 `.env` 或直接运行一键脚本切换不同模型提供商。\n\n- 切到 OpenAI:运行 `.\\setup-openai.ps1`\n- 切到 DeepSeek Chat:运行 `.\\setup-deepseek-chat.ps1`\n- 切到 DeepSeek R1:运行 `.\\setup-deepseek-r1.ps1`\n- 切到其他 OpenAI 兼容供应商:运行 `scripts/setup_model_config.py` 并传入自定义 `base_url`、`model_name`、`api_key_env`\n- Web 页面支持直接下拉选择模型目标和辅导风格\n- 页面右侧会直接显示当前提供商、当前模型、API 地址和接入兼容检查结果\n\n再次强调:这些脚本表示“项目已内置这些接入预设”,不是“这几个模型可以不填 Key 直接调用”。\n\n如果要接 `DeepSeek-R1`,当前代码已经处理了 `deepseek-reasoner` 的参数兼容问题,不会再强行传不适合的 `temperature` 参数。\n\n需要说明的是:本项目对 `OpenAI` 和 `DeepSeek` 官方接口可以做到明确兼容;对其他“OpenAI 兼容”供应商,是否完全兼容仍取决于对方是否真的支持 Chat Completions、当前模型名和常用参数格式。仓库里新增的兼容检查接口和脚本,就是用来把这件事提前说明白,而不是等运行时报错。\n\n## 安全边界\n\n- 项目定位是情绪支持和学习辅助,不替代专业心理诊断或治疗。\n- 当前实现强调温和、具体、避免危险引导的回复风格。\n- 如果用户出现持续失眠、严重低落或自伤相关表达,实际产品应优先引导线下求助与转介。\n\n## 钉钉接入说明\n\n- Web 页面是默认入口,便于直接访问和继续开发。\n- 钉钉是可选的真实业务接入场景,不影响项目本身独立运行。\n- 如果接入钉钉,需要根据企业内部应用、多组织分发或用户授权模式处理权限问题。\n\n## 测试与持续集成\n\n- 本地测试命令:`python -m pytest -vv`\n- 仓库已配置 GitHub Actions,在推送后自动运行基础测试\n"}, "d54f5f0e02a91ae009654cb4e4e191e28117f192": {"t": 1785765005.8386726, "n": 5105, "h": "5c3fc79d7afc417f", "c": "# 知愈星 AI Assistant\n\n![Python 3.13](https://img.shields.io/badge/Python-3.13-3776AB?logo=python&logoColor=white)\n![FastAPI](https://img.shields.io/badge/FastAPI-Service-009688?logo=fastapi&logoColor=white)\n![CI](https://github.com/1420079678-ctrl/zhiyuxing-ai-assistant/actions/workflows/ci.yml/badge.svg)\n\n面向大学生场景的 AI 情绪支持与学习辅助服务,围绕学业压力、拖延内耗、考试与面试焦虑等高频问题,提供温和、具体、可执行的支持性建议。\n\n这个仓库的目标不是单纯展示方案,而是提供一个可以直接运行、便于继续开发、也能逐步接入钉钉等平台的完整项目基础。\n\n## 项目价值\n\n- 聚焦真实且高频的大学生使用场景,而不是泛化聊天。\n- 把“情绪支持”和“学习行动建议”放进同一轮对话,形成更完整的支持闭环。\n- 支持无密钥运行的本地演示模式,拿到仓库后可以直接启动和体验。\n- 预留模型调用和钉钉集成空间,便于后续继续做成更完整的产品。\n\n## 核心能力\n\n- `情绪支持对话`:识别压力、焦虑、拖延等常见表达,给出温和回应。\n- `学习行动建议`:把大问题拆成可立刻执行的小步骤,降低启动门槛。\n- `双运行模式`:未配置模型密钥时使用本地演示模式;配置后切换到 OpenAI 兼容模型调用模式。\n- `Web 服务化`:提供可直接访问的页面、健康检查、接口元信息和 Swagger 文档。\n- `工程基础`:包含测试、CI、环境变量说明和补充文档。\n\n## 使用场景\n\n- 学业压力大,任务很多,不知道从哪里开始\n- 长期拖延,明知道该做但迟迟启动不了\n- 考试、答辩、面试前持续紧张,难以进入准备状态\n- 情绪混乱导致学习节奏失序,需要先稳定状态再恢复行动\n\n## 运行模式\n\n| 模式 | 说明 | 需要的配置 |\n| --- | --- | --- |\n| 本地演示模式 | 使用内置规则生成支持性回复,适合本地启动、调试界面和展示流程 | 无需 API Key |\n| 模型调用模式 | 调用 OpenAI 兼容接口生成回复,适合继续做真实能力验证 | 与当前模型匹配的 API Key |\n\n项目默认优先保证“拿到就能跑”。如果没有配置模型密钥,页面和 `/chat` 接口仍然可以完整返回结果。\n\n## 页面预览\n\n### 独立 Web 页面\n\n当前仓库默认运行的是独立 Web 页面,不需要打开钉钉即可访问和体验。\n\n![Web 页面预览](docs/assets/11-web-demo.png)\n\n### 钉钉接入场景示意\n\n下面两张图保留为钉钉平台接入场景示意,用于说明项目后续可以如何落到企业协同平台中。\n\n![平台界面示意](docs/assets/09-platform-overview.png)\n\n![对话界面示意](docs/assets/10-chat-demo.png)\n\n## 技术栈\n\n- Python 3.13\n- FastAPI\n- OpenAI Python SDK\n- Pydantic\n- python-dotenv\n- Pytest\n- GitHub Actions\n\n## 架构图\n\n![技术架构图](docs/assets/07-technical-architecture.png)\n\n## 快速启动\n\n推荐使用 Python 3.13,以保持与当前本地开发和 CI 环境一致。\n\n### 1. 安装依赖\n\n```bash\npython -m venv .venv\n.venv\\Scripts\\activate\npython -m pip install -r requirements.txt -r requirements-dev.txt\n```\n\n### 2. 一键配置模型接入\n\n推荐直接使用仓库根目录下一键脚本:\n\n```powershell\n.\\setup-openai.ps1\n.\\setup-deepseek-chat.ps1\n.\\setup-deepseek-r1.ps1\n```\n\n也可以双击对应的 `.bat` 文件。脚本会自动:\n\n- 不存在 `.env` 时,从 `.env.example` 复制一份\n- 按目标模型写入 `OPENAI_BASE_URL`、`MODEL_NAME`、`MODEL_PROVIDER`\n- 自动设置 `MODEL_API_KEY_ENV`,确保项目优先读取正确的密钥变量\n- 保留其他未切换的配置项\n\n需要注意:这几个脚本只是帮你一键写好模型接入配置,不是免 API Key 调用。\n\n- `.\\setup-openai.ps1` 对应 OpenAI 官方接口,真实调用需要 `OPENAI_API_KEY`\n- `.\\setup-deepseek-chat.ps1` 对应 DeepSeek Chat,真实调用需要 `DEEPSEEK_API_KEY`\n- `.\\setup-deepseek-r1.ps1` 对应 DeepSeek R1,真实调用也需要 `DEEPSEEK_API_KEY`\n\n如果运行脚本时没有填写对应 Key,项目仍然可以启动,但会自动回退到本地演示模式,不会真的调用线上模型。\n\n如果想手动配置,至少需要关注:\n\n- `OPENAI_API_KEY`\n- `DEEPSEEK_API_KEY`\n- `OPENAI_BASE_URL`\n- `MODEL_NAME`\n- `MODEL_PROVIDER`\n- `MODEL_API_KEY_ENV`\n- `MODEL_TEMPERATURE`\n- `DEMO_MODE`\n\n### 3. 启动前检查兼容性\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py\n```\n\n这个检查会直接告诉你:\n\n- 当前到底会读取哪个密钥变量\n- 当前模型和 API 地址是否存在明显错配\n- `deepseek-reasoner` 这类模型是否已经按兼容规则处理\n- 当前配置是否真的可以进入真实模型调用模式\n\n如果你已经填了真实 Key,还可以追加一次最小真实探测:\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py --probe\n```\n\n这一步会实际发起一次极小请求,用来确认“不是看起来兼容,而是真的能调通”。\n\n### 4. 启动服务\n\n```bash\npython -m uvicorn app:app --reload\n```\n\n如果你的系统 Python 没装项目依赖,最稳的方式是直接使用仓库自带虚拟环境:\n\n```powershell\n.\\.venv\\Scripts\\python -m uvicorn app:app --reload\n```\n\n也可以直接运行仓库根目录下的一键脚本:\n\n```powershell\n.\\start-web.ps1\n```\n\n或双击:\n\n```text\nstart-web.bat\n```\n\n启动后可访问:\n\n- `http://127.0.0.1:8000/`\n- `http://127.0.0.1:8000/api/meta`\n- `http://127.0.0.1:8000/api/compatibility`\n- `http://127.0.0.1:8000/health`\n- `http://127.0.0.1:8000/docs`\n- `http://127.0.0.1:8000/project-docs/usage-guide.md`\n\n### 5. 运行测试\n\n```bash\npython -m pytest -vv\n```\n\n## 接口概览\n\n- `GET /`:Web 页面入口\n- `POST /chat`:对话接口\n- `GET /health`:服务健康检查\n- `GET /api/meta`:服务元信息与当前运行模式\n- `GET /api/compatibility`:模型接入兼容性检查\n- `GET /docs`:Swagger 文档\n- `GET /project-docs/...`:项目补充文档\n\n### `POST /chat`\n\n请求示例:\n\n```json\n{\n \"message\": \"这周压力很大,感觉完全学不进去。\",\n \"system_hint\": \"给出温和且可执行的建议\"\n}\n```\n\n返回示例:\n\n```json\n{\n \"reply\": \"当前状态里明显存在压力堆积,可以先不追求一次解决整周问题,而是把任务缩小到今天最容易开始的一步,比如先完成 20 分钟复习。\",\n \"note\": \"当前为模型调用模式。回复由配置的 OpenAI 兼容接口生成。\",\n \"mode\": \"openai\"\n}\n```\n\n## 文档入口\n\n- [docs/project-report.md](docs/project-report.md):完整项目报告与方案背景\n- [docs/usage-guide.md](docs/usage-guide.md):运行模式、环境变量和常见问题说明\n- [docs/model-integration.md](docs/model-integration.md):不同大模型的接入方式与 `.env` 配置示例\n- [docs/dingtalk-integration.md](docs/dingtalk-integration.md):钉钉权限模型与集成边界说明\n\n## 接入不同大模型\n\n当前项目后端使用的是 OpenAI 兼容接口,因此可以通过修改 `.env` 或直接运行一键脚本切换不同模型提供商。\n\n- 切到 OpenAI:运行 `.\\setup-openai.ps1`\n- 切到 DeepSeek Chat:运行 `.\\setup-deepseek-chat.ps1`\n- 切到 DeepSeek R1:运行 `.\\setup-deepseek-r1.ps1`\n- 切到其他 OpenAI 兼容供应商:运行 `scripts/setup_model_config.py` 并传入自定义 `base_url`、`model_name`、`api_key_env`\n- Web 页面支持直接下拉选择模型目标和辅导风格\n- 页面右侧会直接显示当前提供商、当前模型、API 地址和接入兼容检查结果\n\n再次强调:这些脚本表示“项目已内置这些接入预设”,不是“这几个模型可以不填 Key 直接调用”。\n\n如果要接 `DeepSeek-R1`,当前代码已经处理了 `deepseek-reasoner` 的参数兼容问题,不会再强行传不适合的 `temperature` 参数。\n\n需要说明的是:本项目对 `OpenAI` 和 `DeepSeek` 官方接口可以做到明确兼容;对其他“OpenAI 兼容”供应商,是否完全兼容仍取决于对方是否真的支持 Chat Completions、当前模型名和常用参数格式。仓库里新增的兼容检查接口和脚本,就是用来把这件事提前说明白,而不是等运行时报错。\n\n## 安全边界\n\n- 项目定位是情绪支持和学习辅助,不替代专业心理诊断或治疗。\n- 当前实现强调温和、具体、避免危险引导的回复风格。\n- 如果用户出现持续失眠、严重低落或自伤相关表达,实际产品应优先引导线下求助与转介。\n\n## 钉钉接入说明\n\n- Web 页面是默认入口,便于直接访问和继续开发。\n- 钉钉是可选的真实业务接入场景,不影响项目本身独立运行。\n- 如果接入钉钉,需要根据企业内部应用、多组织分发或用户授权模式处理权限问题。\n\n## 测试与持续集成\n\n- 本地测试命令:`python -m pytest -vv`\n- 仓库已配置 GitHub Actions,在推送后自动运行基础测试\n"}, "ce631a17aaaf82181757cfd3a6f988ae2e52abcc": {"t": 1785765007.1775863, "n": 4753, "h": "08b23793d52e6a86", "c": "# 知愈星 AI Assistant\n\n![Python 3.13](https://img.shields.io/badge/Python-3.13-3776AB?logo=python&logoColor=white)\n![FastAPI](https://img.shields.io/badge/FastAPI-Service-009688?logo=fastapi&logoColor=white)\n![CI](https://github.com/1420079678-ctrl/zhiyuxing-ai-assistant/actions/workflows/ci.yml/badge.svg)\n\n面向大学生场景的 AI 情绪支持与学习辅助服务,围绕学业压力、拖延内耗、考试与面试焦虑等高频问题,提供温和、具体、可执行的支持性建议。\n\n这个仓库的目标不是单纯展示方案,而是提供一个可以直接运行、便于继续开发、也能逐步接入钉钉等平台的完整项目基础。\n\n## 项目价值\n\n- 聚焦真实且高频的大学生使用场景,而不是泛化聊天。\n- 把“情绪支持”和“学习行动建议”放进同一轮对话,形成更完整的支持闭环。\n- 支持无密钥运行的本地演示模式,拿到仓库后可以直接启动和体验。\n- 预留模型调用和钉钉集成空间,便于后续继续做成更完整的产品。\n\n## 核心能力\n\n- `情绪支持对话`:识别压力、焦虑、拖延等常见表达,给出温和回应。\n- `学习行动建议`:把大问题拆成可立刻执行的小步骤,降低启动门槛。\n- `双运行模式`:未配置模型密钥时使用本地演示模式;配置后切换到 OpenAI 兼容模型调用模式。\n- `Web 服务化`:提供可直接访问的页面、健康检查、接口元信息和 Swagger 文档。\n- `工程基础`:包含测试、CI、环境变量说明和补充文档。\n\n## 使用场景\n\n- 学业压力大,任务很多,不知道从哪里开始\n- 长期拖延,明知道该做但迟迟启动不了\n- 考试、答辩、面试前持续紧张,难以进入准备状态\n- 情绪混乱导致学习节奏失序,需要先稳定状态再恢复行动\n\n## 运行模式\n\n| 模式 | 说明 | 需要的配置 |\n| --- | --- | --- |\n| 本地演示模式 | 使用内置规则生成支持性回复,适合本地启动、调试界面和展示流程 | 无需 API Key |\n| 模型调用模式 | 调用 OpenAI 兼容接口生成回复,适合继续做真实能力验证 | 与当前模型匹配的 API Key |\n\n项目默认优先保证“拿到就能跑”。如果没有配置模型密钥,页面和 `/chat` 接口仍然可以完整返回结果。\n\n## 页面预览\n\n### 独立 Web 页面\n\n当前仓库默认运行的是独立 Web 页面,不需要打开钉钉即可访问和体验。\n\n![Web 页面预览](docs/assets/11-web-demo.png)\n\n### 钉钉接入场景示意\n\n下面两张图保留为钉钉平台接入场景示意,用于说明项目后续可以如何落到企业协同平台中。\n\n![平台界面示意](docs/assets/09-platform-overview.png)\n\n![对话界面示意](docs/assets/10-chat-demo.png)\n\n## 技术栈\n\n- Python 3.13\n- FastAPI\n- OpenAI Python SDK\n- Pydantic\n- python-dotenv\n- Pytest\n- GitHub Actions\n\n## 架构图\n\n![技术架构图](docs/assets/07-technical-architecture.png)\n\n## 快速启动\n\n推荐使用 Python 3.13,以保持与当前本地开发和 CI 环境一致。\n\n### 1. 安装依赖\n\n```bash\npython -m venv .venv\n.venv\\Scripts\\activate\npython -m pip install -r requirements.txt -r requirements-dev.txt\n```\n\n### 2. 一键配置模型接入\n\n推荐直接使用仓库根目录下一键脚本:\n\n```powershell\n.\\setup-openai.ps1\n.\\setup-deepseek-chat.ps1\n.\\setup-deepseek-r1.ps1\n```\n\n也可以双击对应的 `.bat` 文件。脚本会自动:\n\n- 不存在 `.env` 时,从 `.env.example` 复制一份\n- 按目标模型写入 `OPENAI_BASE_URL`、`MODEL_NAME`、`MODEL_PROVIDER`\n- 自动设置 `MODEL_API_KEY_ENV`,确保项目优先读取正确的密钥变量\n- 保留其他未切换的配置项\n\n如果想手动配置,至少需要关注:\n\n- `OPENAI_API_KEY`\n- `DEEPSEEK_API_KEY`\n- `OPENAI_BASE_URL`\n- `MODEL_NAME`\n- `MODEL_PROVIDER`\n- `MODEL_API_KEY_ENV`\n- `MODEL_TEMPERATURE`\n- `DEMO_MODE`\n\n### 3. 启动前检查兼容性\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py\n```\n\n这个检查会直接告诉你:\n\n- 当前到底会读取哪个密钥变量\n- 当前模型和 API 地址是否存在明显错配\n- `deepseek-reasoner` 这类模型是否已经按兼容规则处理\n- 当前配置是否真的可以进入真实模型调用模式\n\n如果你已经填了真实 Key,还可以追加一次最小真实探测:\n\n```powershell\n.\\.venv\\Scripts\\python scripts\\check_model_config.py --probe\n```\n\n这一步会实际发起一次极小请求,用来确认“不是看起来兼容,而是真的能调通”。\n\n### 4. 启动服务\n\n```bash\npython -m uvicorn app:app --reload\n```\n\n如果你的系统 Python 没装项目依赖,最稳的方式是直接使用仓库自带虚拟环境:\n\n```powershell\n.\\.venv\\Scripts\\python -m uvicorn app:app --reload\n```\n\n也可以直接运行仓库根目录下的一键脚本:\n\n```powershell\n.\\start-web.ps1\n```\n\n或双击:\n\n```text\nstart-web.bat\n```\n\n启动后可访问:\n\n- `http://127.0.0.1:8000/`\n- `http://127.0.0.1:8000/api/meta`\n- `http://127.0.0.1:8000/api/compatibility`\n- `http://127.0.0.1:8000/health`\n- `http://127.0.0.1:8000/docs`\n- `http://127.0.0.1:8000/project-docs/usage-guide.md`\n\n### 5. 运行测试\n\n```bash\npython -m pytest -vv\n```\n\n## 接口概览\n\n- `GET /`:Web 页面入口\n- `POST /chat`:对话接口\n- `GET /health`:服务健康检查\n- `GET /api/meta`:服务元信息与当前运行模式\n- `GET /api/compatibility`:模型接入兼容性检查\n- `GET /docs`:Swagger 文档\n- `GET /project-docs/...`:项目补充文档\n\n### `POST /chat`\n\n请求示例:\n\n```json\n{\n \"message\": \"这周压力很大,感觉完全学不进去。\",\n \"system_hint\": \"给出温和且可执行的建议\"\n}\n```\n\n返回示例:\n\n```json\n{\n \"reply\": \"当前状态里明显存在压力堆积,可以先不追求一次解决整周问题,而是把任务缩小到今天最容易开始的一步,比如先完成 20 分钟复习。\",\n \"note\": \"当前为模型调用模式。回复由配置的 OpenAI 兼容接口生成。\",\n \"mode\": \"openai\"\n}\n```\n\n## 文档入口\n\n- [docs/project-report.md](docs/project-report.md):完整项目报告与方案背景\n- [docs/usage-guide.md](docs/usage-guide.md):运行模式、环境变量和常见问题说明\n- [docs/model-integration.md](docs/model-integration.md):不同大模型的接入方式与 `.env` 配置示例\n- [docs/dingtalk-integration.md](docs/dingtalk-integration.md):钉钉权限模型与集成边界说明\n\n## 接入不同大模型\n\n当前项目后端使用的是 OpenAI 兼容接口,因此可以通过修改 `.env` 或直接运行一键脚本切换不同模型提供商。\n\n- 切到 OpenAI:运行 `.\\setup-openai.ps1`\n- 切到 DeepSeek Chat:运行 `.\\setup-deepseek-chat.ps1`\n- 切到 DeepSeek R1:运行 `.\\setup-deepseek-r1.ps1`\n- 切到其他 OpenAI 兼容供应商:运行 `scripts/setup_model_config.py` 并传入自定义 `base_url`、`model_name`、`api_key_env`\n- Web 页面支持直接下拉选择模型目标和辅导风格\n- 页面右侧会直接显示当前提供商、当前模型、API 地址和接入兼容检查结果\n\n如果要接 `DeepSeek-R1`,当前代码已经处理了 `deepseek-reasoner` 的参数兼容问题,不会再强行传不适合的 `temperature` 参数。\n\n需要说明的是:本项目对 `OpenAI` 和 `DeepSeek` 官方接口可以做到明确兼容;对其他“OpenAI 兼容”供应商,是否完全兼容仍取决于对方是否真的支持 Chat Completions、当前模型名和常用参数格式。仓库里新增的兼容检查接口和脚本,就是用来把这件事提前说明白,而不是等运行时报错。\n\n## 安全边界\n\n- 项目定位是情绪支持和学习辅助,不替代专业心理诊断或治疗。\n- 当前实现强调温和、具体、避免危险引导的回复风格。\n- 如果用户出现持续失眠、严重低落或自伤相关表达,实际产品应优先引导线下求助与转介。\n\n## 钉钉接入说明\n\n- Web 页面是默认入口,便于直接访问和继续开发。\n- 钉钉是可选的真实业务接入场景,不影响项目本身独立运行。\n- 如果接入钉钉,需要根据企业内部应用、多组织分发或用户授权模式处理权限问题。\n\n## 测试与持续集成\n\n- 本地测试命令:`python -m pytest -vv`\n- 仓库已配置 GitHub Actions,在推送后自动运行基础测试\n"}, "f0145da240d627254a9e6df81f4605545eda8c3b": {"t": 1785765012.1647952, "n": 3914, "h": "20ead794bf58b518", "c": "# 知愈星 AI Assistant\n\n![Python 3.13](https://img.shields.io/badge/Python-3.13-3776AB?logo=python&logoColor=white)\n![FastAPI](https://img.shields.io/badge/FastAPI-Service-009688?logo=fastapi&logoColor=white)\n![CI](https://github.com/1420079678-ctrl/zhiyuxing-ai-assistant/actions/workflows/ci.yml/badge.svg)\n\n面向大学生场景的 AI 情绪支持与学习辅助服务,围绕学业压力、拖延内耗、考试与面试焦虑等高频问题,提供温和、具体、可执行的支持性建议。\n\n这个仓库的目标不是单纯展示方案,而是提供一个可以直接运行、便于继续开发、也能逐步接入钉钉等平台的完整项目基础。\n\n## 项目价值\n\n- 聚焦真实且高频的大学生使用场景,而不是泛化聊天。\n- 把“情绪支持”和“学习行动建议”放进同一轮对话,形成更完整的支持闭环。\n- 支持无密钥运行的本地演示模式,拿到仓库后可以直接启动和体验。\n- 预留模型调用和钉钉集成空间,便于后续继续做成更完整的产品。\n\n## 核心能力\n\n- `情绪支持对话`:识别压力、焦虑、拖延等常见表达,给出温和回应。\n- `学习行动建议`:把大问题拆成可立刻执行的小步骤,降低启动门槛。\n- `双运行模式`:未配置模型密钥时使用本地演示模式;配置后切换到 OpenAI 兼容模型调用模式。\n- `Web 服务化`:提供可直接访问的页面、健康检查、接口元信息和 Swagger 文档。\n- `工程基础`:包含测试、CI、环境变量说明和补充文档。\n\n## 使用场景\n\n- 学业压力大,任务很多,不知道从哪里开始\n- 长期拖延,明知道该做但迟迟启动不了\n- 考试、答辩、面试前持续紧张,难以进入准备状态\n- 情绪混乱导致学习节奏失序,需要先稳定状态再恢复行动\n\n## 运行模式\n\n| 模式 | 说明 | 需要的配置 |\n| --- | --- | --- |\n| 本地演示模式 | 使用内置规则生成支持性回复,适合本地启动、调试界面和展示流程 | 无需 API Key |\n| 模型调用模式 | 调用 OpenAI 兼容接口生成回复,适合继续做真实能力验证 | `OPENAI_API_KEY` |\n\n项目默认优先保证“拿到就能跑”。如果没有配置模型密钥,页面和 `/chat` 接口仍然可以完整返回结果。\n\n## 页面预览\n\n### 独立 Web 页面\n\n当前仓库默认运行的是独立 Web 页面,不需要打开钉钉即可访问和体验。\n\n![Web 页面预览](docs/assets/11-web-demo.png)\n\n### 钉钉接入场景示意\n\n下面两张图保留为钉钉平台接入场景示意,用于说明项目后续可以如何落到企业协同平台中。\n\n![平台界面示意](docs/assets/09-platform-overview.png)\n\n![对话界面示意](docs/assets/10-chat-demo.png)\n\n## 技术栈\n\n- Python 3.13\n- FastAPI\n- OpenAI Python SDK\n- Pydantic\n- python-dotenv\n- Pytest\n- GitHub Actions\n\n## 架构图\n\n![技术架构图](docs/assets/07-technical-architecture.png)\n\n## 快速启动\n\n推荐使用 Python 3.13,以保持与当前本地开发和 CI 环境一致。\n\n### 1. 安装依赖\n\n```bash\npython -m venv .venv\n.venv\\Scripts\\activate\npython -m pip install -r requirements.txt -r requirements-dev.txt\n```\n\n### 2. 配置环境变量\n\n```powershell\nCopy-Item .env.example .env\n```\n\n在 `.env` 中配置:\n\n- `OPENAI_API_KEY`:可留空,留空时自动进入本地演示模式\n- `DEEPSEEK_API_KEY`:可作为 DeepSeek 的密钥变量使用\n- `OPENAI_BASE_URL`\n- `MODEL_NAME`\n- `MODEL_PROVIDER`\n- `MODEL_TEMPERATURE`\n- `DEMO_MODE`:可选,设置为 `true` 时强制使用本地演示模式\n\n### 3. 启动服务\n\n```bash\npython -m uvicorn app:app --reload\n```\n\n如果你的系统 Python 没装项目依赖,最稳的方式是直接使用仓库自带虚拟环境:\n\n```powershell\n.\\.venv\\Scripts\\python -m uvicorn app:app --reload\n```\n\n也可以直接运行仓库根目录下的一键脚本:\n\n```powershell\n.\\start-web.ps1\n```\n\n或双击:\n\n```text\nstart-web.bat\n```\n\n启动后可访问:\n\n- `http://127.0.0.1:8000/`\n- `http://127.0.0.1:8000/api/meta`\n- `http://127.0.0.1:8000/health`\n- `http://127.0.0.1:8000/docs`\n- `http://127.0.0.1:8000/project-docs/usage-guide.md`\n\n### 4. 运行测试\n\n```bash\npython -m pytest -vv\n```\n\n## 接口概览\n\n- `GET /`:Web 页面入口\n- `POST /chat`:对话接口\n- `GET /health`:服务健康检查\n- `GET /api/meta`:服务元信息与当前运行模式\n- `GET /docs`:Swagger 文档\n- `GET /project-docs/...`:项目补充文档\n\n### `POST /chat`\n\n请求示例:\n\n```json\n{\n \"message\": \"这周压力很大,感觉完全学不进去。\",\n \"system_hint\": \"给出温和且可执行的建议\"\n}\n```\n\n返回示例:\n\n```json\n{\n \"reply\": \"当前状态里明显存在压力堆积,可以先不追求一次解决整周问题,而是把任务缩小到今天最容易开始的一步,比如先完成 20 分钟复习。\",\n \"note\": \"当前为模型调用模式。回复由配置的 OpenAI 兼容接口生成。\",\n \"mode\": \"openai\"\n}\n```\n\n## 文档入口\n\n- [docs/project-report.md](docs/project-report.md):完整项目报告与方案背景\n- [docs/usage-guide.md](docs/usage-guide.md):运行模式、环境变量和常见问题说明\n- [docs/model-integration.md](docs/model-integration.md):不同大模型的接入方式与 `.env` 配置示例\n- [docs/dingtalk-integration.md](docs/dingtalk-integration.md):钉钉权限模型与集成边界说明\n\n## 接入不同大模型\n\n当前项目后端使用的是 OpenAI 兼容接口,因此可以通过修改 `.env` 切换不同模型提供商。\n\n- 切到 OpenAI:修改 `OPENAI_API_KEY`、`OPENAI_BASE_URL`、`MODEL_NAME`\n- 切到 DeepSeek:修改 `DEEPSEEK_API_KEY`、`OPENAI_BASE_URL=https://api.deepseek.com`、`MODEL_NAME=deepseek-chat` 或 `deepseek-reasoner`\n- Web 页面支持直接下拉选择模型目标和辅导风格\n- 页面右侧会直接显示当前提供商、当前模型和 API 地址,便于确认是否接对\n\n如果要接 `DeepSeek-R1`,当前代码已经处理了 `deepseek-reasoner` 的参数兼容问题,不会再强行传不适合的 `temperature` 参数。\n\n## 安全边界\n\n- 项目定位是情绪支持和学习辅助,不替代专业心理诊断或治疗。\n- 当前实现强调温和、具体、避免危险引导的回复风格。\n- 如果用户出现持续失眠、严重低落或自伤相关表达,实际产品应优先引导线下求助与转介。\n\n## 钉钉接入说明\n\n- Web 页面是默认入口,便于直接访问和继续开发。\n- 钉钉是可选的真实业务接入场景,不影响项目本身独立运行。\n- 如果接入钉钉,需要根据企业内部应用、多组织分发或用户授权模式处理权限问题。\n\n## 测试与持续集成\n\n- 本地测试命令:`python -m pytest -vv`\n- 仓库已配置 GitHub Actions,在推送后自动运行基础测试\n"}, "420134e583cb6a02b515fad542efc15411c78ccf": {"t": 1785765013.7817333, "n": 3892, "h": "c30405f1315ea87e", "c": "# 知愈星 AI Assistant\n\n![Python 3.13](https://img.shields.io/badge/Python-3.13-3776AB?logo=python&logoColor=white)\n![FastAPI](https://img.shields.io/badge/FastAPI-Service-009688?logo=fastapi&logoColor=white)\n![CI](https://github.com/1420079678-ctrl/zhiyuxing-ai-assistant/actions/workflows/ci.yml/badge.svg)\n\n面向大学生场景的 AI 情绪支持与学习辅助服务,围绕学业压力、拖延内耗、考试与面试焦虑等高频问题,提供温和、具体、可执行的支持性建议。\n\n这个仓库的目标不是单纯展示方案,而是提供一个可以直接运行、便于继续开发、也能逐步接入钉钉等平台的完整项目基础。\n\n## 项目价值\n\n- 聚焦真实且高频的大学生使用场景,而不是泛化聊天。\n- 把“情绪支持”和“学习行动建议”放进同一轮对话,形成更完整的支持闭环。\n- 支持无密钥运行的本地演示模式,拿到仓库后可以直接启动和体验。\n- 预留模型调用和钉钉集成空间,便于后续继续做成更完整的产品。\n\n## 核心能力\n\n- `情绪支持对话`:识别压力、焦虑、拖延等常见表达,给出温和回应。\n- `学习行动建议`:把大问题拆成可立刻执行的小步骤,降低启动门槛。\n- `双运行模式`:未配置模型密钥时使用本地演示模式;配置后切换到 OpenAI 兼容模型调用模式。\n- `Web 服务化`:提供可直接访问的页面、健康检查、接口元信息和 Swagger 文档。\n- `工程基础`:包含测试、CI、环境变量说明和补充文档。\n\n## 使用场景\n\n- 学业压力大,任务很多,不知道从哪里开始\n- 长期拖延,明知道该做但迟迟启动不了\n- 考试、答辩、面试前持续紧张,难以进入准备状态\n- 情绪混乱导致学习节奏失序,需要先稳定状态再恢复行动\n\n## 运行模式\n\n| 模式 | 说明 | 需要的配置 |\n| --- | --- | --- |\n| 本地演示模式 | 使用内置规则生成支持性回复,适合本地启动、调试界面和展示流程 | 无需 API Key |\n| 模型调用模式 | 调用 OpenAI 兼容接口生成回复,适合继续做真实能力验证 | `OPENAI_API_KEY` |\n\n项目默认优先保证“拿到就能跑”。如果没有配置模型密钥,页面和 `/chat` 接口仍然可以完整返回结果。\n\n## 页面预览\n\n### 独立 Web 页面\n\n当前仓库默认运行的是独立 Web 页面,不需要打开钉钉即可访问和体验。\n\n![Web 页面预览](docs/assets/11-web-demo.png)\n\n### 钉钉接入场景示意\n\n下面两张图保留为钉钉平台接入场景示意,用于说明项目后续可以如何落到企业协同平台中。\n\n![平台界面示意](docs/assets/09-platform-overview.png)\n\n![对话界面示意](docs/assets/10-chat-demo.png)\n\n## 技术栈\n\n- Python 3.13\n- FastAPI\n- OpenAI Python SDK\n- Pydantic\n- python-dotenv\n- Pytest\n- GitHub Actions\n\n## 架构图\n\n![技术架构图](docs/assets/07-technical-architecture.png)\n\n## 快速启动\n\n推荐使用 Python 3.13,以保持与当前本地开发和 CI 环境一致。\n\n### 1. 安装依赖\n\n```bash\npython -m venv .venv\n.venv\\Scripts\\activate\npython -m pip install -r requirements.txt -r requirements-dev.txt\n```\n\n### 2. 配置环境变量\n\n```powershell\nCopy-Item .env.example .env\n```\n\n在 `.env` 中配置:\n\n- `OPENAI_API_KEY`:可留空,留空时自动进入本地演示模式\n- `DEEPSEEK_API_KEY`:可作为 DeepSeek 的密钥变量使用\n- `OPENAI_BASE_URL`\n- `MODEL_NAME`\n- `MODEL_PROVIDER`\n- `MODEL_TEMPERATURE`\n- `DEMO_MODE`:可选,设置为 `true` 时强制使用本地演示模式\n\n### 3. 启动服务\n\n```bash\npython -m uvicorn app:app --reload\n```\n\n如果你的系统 Python 没装项目依赖,最稳的方式是直接使用仓库自带虚拟环境:\n\n```powershell\n.\\.venv\\Scripts\\python -m uvicorn app:app --reload\n```\n\n也可以直接运行仓库根目录下的一键脚本:\n\n```powershell\n.\\start-web.ps1\n```\n\n或双击:\n\n```text\nstart-web.bat\n```\n\n启动后可访问:\n\n- `http://127.0.0.1:8000/`\n- `http://127.0.0.1:8000/api/meta`\n- `http://127.0.0.1:8000/health`\n- `http://127.0.0.1:8000/docs`\n- `http://127.0.0.1:8000/project-docs/usage-guide.md`\n\n### 4. 运行测试\n\n```bash\npython -m pytest -vv\n```\n\n## 接口概览\n\n- `GET /`:Web 页面入口\n- `POST /chat`:对话接口\n- `GET /health`:服务健康检查\n- `GET /api/meta`:服务元信息与当前运行模式\n- `GET /docs`:Swagger 文档\n- `GET /project-docs/...`:项目补充文档\n\n### `POST /chat`\n\n请求示例:\n\n```json\n{\n \"message\": \"这周压力很大,感觉完全学不进去。\",\n \"system_hint\": \"给出温和且可执行的建议\"\n}\n```\n\n返回示例:\n\n```json\n{\n \"reply\": \"当前状态里明显存在压力堆积,可以先不追求一次解决整周问题,而是把任务缩小到今天最容易开始的一步,比如先完成 20 分钟复习。\",\n \"note\": \"当前为模型调用模式。回复由配置的 OpenAI 兼容接口生成。\",\n \"mode\": \"openai\"\n}\n```\n\n## 文档入口\n\n- [docs/project-report.md](docs/project-report.md):完整项目报告与方案背景\n- [docs/usage-guide.md](docs/usage-guide.md):运行模式、环境变量和常见问题说明\n- [docs/model-integration.md](docs/model-integration.md):不同大模型的接入方式与 `.env` 配置示例\n- [docs/dingtalk-integration.md](docs/dingtalk-integration.md):钉钉权限模型与集成边界说明\n\n## 接入不同大模型\n\n当前项目后端使用的是 OpenAI 兼容接口,因此可以通过修改 `.env` 切换不同模型提供商。\n\n- 切到 OpenAI:修改 `OPENAI_API_KEY`、`OPENAI_BASE_URL`、`MODEL_NAME`\n- 切到 DeepSeek:修改 `DEEPSEEK_API_KEY`、`OPENAI_BASE_URL=https://api.deepseek.com`、`MODEL_NAME=deepseek-chat` 或 `deepseek-reasoner`\n- Web 页面右侧会直接显示当前提供商、当前模型和 API 地址,便于确认是否接对\n\n如果要接 `DeepSeek-R1`,当前代码已经处理了 `deepseek-reasoner` 的参数兼容问题,不会再强行传不适合的 `temperature` 参数。\n\n## 安全边界\n\n- 项目定位是情绪支持和学习辅助,不替代专业心理诊断或治疗。\n- 当前实现强调温和、具体、避免危险引导的回复风格。\n- 如果用户出现持续失眠、严重低落或自伤相关表达,实际产品应优先引导线下求助与转介。\n\n## 钉钉接入说明\n\n- Web 页面是默认入口,便于直接访问和继续开发。\n- 钉钉是可选的真实业务接入场景,不影响项目本身独立运行。\n- 如果接入钉钉,需要根据企业内部应用、多组织分发或用户授权模式处理权限问题。\n\n## 测试与持续集成\n\n- 本地测试命令:`python -m pytest -vv`\n- 仓库已配置 GitHub Actions,在推送后自动运行基础测试\n"}, "d55a58f4bc5f6a6b21368bee3ad465e5d1543926": {"t": 1785765015.0260725, "n": 3343, "h": "87353b60ef6961bb", "c": "# 知愈星 AI Assistant\n\n![Python 3.13](https://img.shields.io/badge/Python-3.13-3776AB?logo=python&logoColor=white)\n![FastAPI](https://img.shields.io/badge/FastAPI-Service-009688?logo=fastapi&logoColor=white)\n![CI](https://github.com/1420079678-ctrl/zhiyuxing-ai-assistant/actions/workflows/ci.yml/badge.svg)\n\n面向大学生场景的 AI 情绪支持与学习辅助服务,围绕学业压力、拖延内耗、考试与面试焦虑等高频问题,提供温和、具体、可执行的支持性建议。\n\n这个仓库的目标不是单纯展示方案,而是提供一个可以直接运行、便于继续开发、也能逐步接入钉钉等平台的完整项目基础。\n\n## 项目价值\n\n- 聚焦真实且高频的大学生使用场景,而不是泛化聊天。\n- 把“情绪支持”和“学习行动建议”放进同一轮对话,形成更完整的支持闭环。\n- 支持无密钥运行的本地演示模式,拿到仓库后可以直接启动和体验。\n- 预留模型调用和钉钉集成空间,便于后续继续做成更完整的产品。\n\n## 核心能力\n\n- `情绪支持对话`:识别压力、焦虑、拖延等常见表达,给出温和回应。\n- `学习行动建议`:把大问题拆成可立刻执行的小步骤,降低启动门槛。\n- `双运行模式`:未配置模型密钥时使用本地演示模式;配置后切换到 OpenAI 兼容模型调用模式。\n- `Web 服务化`:提供可直接访问的页面、健康检查、接口元信息和 Swagger 文档。\n- `工程基础`:包含测试、CI、环境变量说明和补充文档。\n\n## 使用场景\n\n- 学业压力大,任务很多,不知道从哪里开始\n- 长期拖延,明知道该做但迟迟启动不了\n- 考试、答辩、面试前持续紧张,难以进入准备状态\n- 情绪混乱导致学习节奏失序,需要先稳定状态再恢复行动\n\n## 运行模式\n\n| 模式 | 说明 | 需要的配置 |\n| --- | --- | --- |\n| 本地演示模式 | 使用内置规则生成支持性回复,适合本地启动、调试界面和展示流程 | 无需 API Key |\n| 模型调用模式 | 调用 OpenAI 兼容接口生成回复,适合继续做真实能力验证 | `OPENAI_API_KEY` |\n\n项目默认优先保证“拿到就能跑”。如果没有配置模型密钥,页面和 `/chat` 接口仍然可以完整返回结果。\n\n## 页面预览\n\n### 独立 Web 页面\n\n当前仓库默认运行的是独立 Web 页面,不需要打开钉钉即可访问和体验。\n\n![Web 页面预览](docs/assets/11-web-demo.png)\n\n### 钉钉接入场景示意\n\n下面两张图保留为钉钉平台接入场景示意,用于说明项目后续可以如何落到企业协同平台中。\n\n![平台界面示意](docs/assets/09-platform-overview.png)\n\n![对话界面示意](docs/assets/10-chat-demo.png)\n\n## 技术栈\n\n- Python 3.13\n- FastAPI\n- OpenAI Python SDK\n- Pydantic\n- python-dotenv\n- Pytest\n- GitHub Actions\n\n## 架构图\n\n![技术架构图](docs/assets/07-technical-architecture.png)\n\n## 快速启动\n\n推荐使用 Python 3.13,以保持与当前本地开发和 CI 环境一致。\n\n### 1. 安装依赖\n\n```bash\npython -m venv .venv\n.venv\\Scripts\\activate\npython -m pip install -r requirements.txt -r requirements-dev.txt\n```\n\n### 2. 配置环境变量\n\n```powershell\nCopy-Item .env.example .env\n```\n\n在 `.env` 中配置:\n\n- `OPENAI_API_KEY`:可留空,留空时自动进入本地演示模式\n- `OPENAI_BASE_URL`\n- `MODEL_NAME`\n- `DEMO_MODE`:可选,设置为 `true` 时强制使用本地演示模式\n\n### 3. 启动服务\n\n```bash\npython -m uvicorn app:app --reload\n```\n\n如果你的系统 Python 没装项目依赖,最稳的方式是直接使用仓库自带虚拟环境:\n\n```powershell\n.\\.venv\\Scripts\\python -m uvicorn app:app --reload\n```\n\n也可以直接运行仓库根目录下的一键脚本:\n\n```powershell\n.\\start-web.ps1\n```\n\n或双击:\n\n```text\nstart-web.bat\n```\n\n启动后可访问:\n\n- `http://127.0.0.1:8000/`\n- `http://127.0.0.1:8000/api/meta`\n- `http://127.0.0.1:8000/health`\n- `http://127.0.0.1:8000/docs`\n- `http://127.0.0.1:8000/project-docs/usage-guide.md`\n\n### 4. 运行测试\n\n```bash\npython -m pytest -vv\n```\n\n## 接口概览\n\n- `GET /`:Web 页面入口\n- `POST /chat`:对话接口\n- `GET /health`:服务健康检查\n- `GET /api/meta`:服务元信息与当前运行模式\n- `GET /docs`:Swagger 文档\n- `GET /project-docs/...`:项目补充文档\n\n### `POST /chat`\n\n请求示例:\n\n```json\n{\n \"message\": \"这周压力很大,感觉完全学不进去。\",\n \"system_hint\": \"给出温和且可执行的建议\"\n}\n```\n\n返回示例:\n\n```json\n{\n \"reply\": \"当前状态里明显存在压力堆积,可以先不追求一次解决整周问题,而是把任务缩小到今天最容易开始的一步,比如先完成 20 分钟复习。\",\n \"note\": \"当前为模型调用模式。回复由配置的 OpenAI 兼容接口生成。\",\n \"mode\": \"openai\"\n}\n```\n\n## 文档入口\n\n- [docs/project-report.md](docs/project-report.md):完整项目报告与方案背景\n- [docs/usage-guide.md](docs/usage-guide.md):运行模式、环境变量和常见问题说明\n- [docs/dingtalk-integration.md](docs/dingtalk-integration.md):钉钉权限模型与集成边界说明\n\n## 安全边界\n\n- 项目定位是情绪支持和学习辅助,不替代专业心理诊断或治疗。\n- 当前实现强调温和、具体、避免危险引导的回复风格。\n- 如果用户出现持续失眠、严重低落或自伤相关表达,实际产品应优先引导线下求助与转介。\n\n## 钉钉接入说明\n\n- Web 页面是默认入口,便于直接访问和继续开发。\n- 钉钉是可选的真实业务接入场景,不影响项目本身独立运行。\n- 如果接入钉钉,需要根据企业内部应用、多组织分发或用户授权模式处理权限问题。\n\n## 测试与持续集成\n\n- 本地测试命令:`python -m pytest -vv`\n- 仓库已配置 GitHub Actions,在推送后自动运行基础测试\n"}, "bb44466ced6eefc4892faf299bca95a614301f9a": {"t": 1785765016.24262, "n": 3142, "h": "080418d1fa3f9c80", "c": "# 知愈星 AI Assistant\n\n![Python 3.13](https://img.shields.io/badge/Python-3.13-3776AB?logo=python&logoColor=white)\n![FastAPI](https://img.shields.io/badge/FastAPI-Service-009688?logo=fastapi&logoColor=white)\n![CI](https://github.com/1420079678-ctrl/zhiyuxing-ai-assistant/actions/workflows/ci.yml/badge.svg)\n\n面向大学生场景的 AI 情绪支持与学习辅助服务,围绕学业压力、拖延内耗、考试与面试焦虑等高频问题,提供温和、具体、可执行的支持性建议。\n\n这个仓库的目标不是单纯展示方案,而是提供一个可以直接运行、便于继续开发、也能逐步接入钉钉等平台的完整项目基础。\n\n## 项目价值\n\n- 聚焦真实且高频的大学生使用场景,而不是泛化聊天。\n- 把“情绪支持”和“学习行动建议”放进同一轮对话,形成更完整的支持闭环。\n- 支持无密钥运行的本地演示模式,拿到仓库后可以直接启动和体验。\n- 预留模型调用和钉钉集成空间,便于后续继续做成更完整的产品。\n\n## 核心能力\n\n- `情绪支持对话`:识别压力、焦虑、拖延等常见表达,给出温和回应。\n- `学习行动建议`:把大问题拆成可立刻执行的小步骤,降低启动门槛。\n- `双运行模式`:未配置模型密钥时使用本地演示模式;配置后切换到 OpenAI 兼容模型调用模式。\n- `Web 服务化`:提供可直接访问的页面、健康检查、接口元信息和 Swagger 文档。\n- `工程基础`:包含测试、CI、环境变量说明和补充文档。\n\n## 使用场景\n\n- 学业压力大,任务很多,不知道从哪里开始\n- 长期拖延,明知道该做但迟迟启动不了\n- 考试、答辩、面试前持续紧张,难以进入准备状态\n- 情绪混乱导致学习节奏失序,需要先稳定状态再恢复行动\n\n## 运行模式\n\n| 模式 | 说明 | 需要的配置 |\n| --- | --- | --- |\n| 本地演示模式 | 使用内置规则生成支持性回复,适合本地启动、调试界面和展示流程 | 无需 API Key |\n| 模型调用模式 | 调用 OpenAI 兼容接口生成回复,适合继续做真实能力验证 | `OPENAI_API_KEY` |\n\n项目默认优先保证“拿到就能跑”。如果没有配置模型密钥,页面和 `/chat` 接口仍然可以完整返回结果。\n\n## 页面预览\n\n### 独立 Web 页面\n\n当前仓库默认运行的是独立 Web 页面,不需要打开钉钉即可访问和体验。\n\n![Web 页面预览](docs/assets/11-web-demo.png)\n\n### 钉钉接入场景示意\n\n下面两张图保留为钉钉平台接入场景示意,用于说明项目后续可以如何落到企业协同平台中。\n\n![平台界面示意](docs/assets/09-platform-overview.png)\n\n![对话界面示意](docs/assets/10-chat-demo.png)\n\n## 技术栈\n\n- Python 3.13\n- FastAPI\n- OpenAI Python SDK\n- Pydantic\n- python-dotenv\n- Pytest\n- GitHub Actions\n\n## 架构图\n\n![技术架构图](docs/assets/07-technical-architecture.png)\n\n## 快速启动\n\n推荐使用 Python 3.13,以保持与当前本地开发和 CI 环境一致。\n\n### 1. 安装依赖\n\n```bash\npython -m venv .venv\n.venv\\Scripts\\activate\npython -m pip install -r requirements.txt -r requirements-dev.txt\n```\n\n### 2. 配置环境变量\n\n```powershell\nCopy-Item .env.example .env\n```\n\n在 `.env` 中配置:\n\n- `OPENAI_API_KEY`:可留空,留空时自动进入本地演示模式\n- `OPENAI_BASE_URL`\n- `MODEL_NAME`\n- `DEMO_MODE`:可选,设置为 `true` 时强制使用本地演示模式\n\n### 3. 启动服务\n\n```bash\npython -m uvicorn app:app --reload\n```\n\n启动后可访问:\n\n- `http://127.0.0.1:8000/`\n- `http://127.0.0.1:8000/api/meta`\n- `http://127.0.0.1:8000/health`\n- `http://127.0.0.1:8000/docs`\n- `http://127.0.0.1:8000/project-docs/usage-guide.md`\n\n### 4. 运行测试\n\n```bash\npython -m pytest -vv\n```\n\n## 接口概览\n\n- `GET /`:Web 页面入口\n- `POST /chat`:对话接口\n- `GET /health`:服务健康检查\n- `GET /api/meta`:服务元信息与当前运行模式\n- `GET /docs`:Swagger 文档\n- `GET /project-docs/...`:项目补充文档\n\n### `POST /chat`\n\n请求示例:\n\n```json\n{\n \"message\": \"这周压力很大,感觉完全学不进去。\",\n \"system_hint\": \"给出温和且可执行的建议\"\n}\n```\n\n返回示例:\n\n```json\n{\n \"reply\": \"当前状态里明显存在压力堆积,可以先不追求一次解决整周问题,而是把任务缩小到今天最容易开始的一步,比如先完成 20 分钟复习。\",\n \"note\": \"当前为模型调用模式。回复由配置的 OpenAI 兼容接口生成。\",\n \"mode\": \"openai\"\n}\n```\n\n## 文档入口\n\n- [docs/project-report.md](docs/project-report.md):完整项目报告与方案背景\n- [docs/usage-guide.md](docs/usage-guide.md):运行模式、环境变量和常见问题说明\n- [docs/dingtalk-integration.md](docs/dingtalk-integration.md):钉钉权限模型与集成边界说明\n\n## 安全边界\n\n- 项目定位是情绪支持和学习辅助,不替代专业心理诊断或治疗。\n- 当前实现强调温和、具体、避免危险引导的回复风格。\n- 如果用户出现持续失眠、严重低落或自伤相关表达,实际产品应优先引导线下求助与转介。\n\n## 钉钉接入说明\n\n- Web 页面是默认入口,便于直接访问和继续开发。\n- 钉钉是可选的真实业务接入场景,不影响项目本身独立运行。\n- 如果接入钉钉,需要根据企业内部应用、多组织分发或用户授权模式处理权限问题。\n\n## 测试与持续集成\n\n- 本地测试命令:`python -m pytest -vv`\n- 仓库已配置 GitHub Actions,在推送后自动运行基础测试\n"}, "4664b04ffbb37b67021899c06388c391dd338e29": {"t": 1785765017.5602515, "n": 3011, "h": "1439afe146583c61", "c": "# 知愈星 AI Assistant\n\n![Python 3.13](https://img.shields.io/badge/Python-3.13-3776AB?logo=python&logoColor=white)\n![FastAPI](https://img.shields.io/badge/FastAPI-Service-009688?logo=fastapi&logoColor=white)\n![CI](https://github.com/1420079678-ctrl/zhiyuxing-ai-assistant/actions/workflows/ci.yml/badge.svg)\n\n面向大学生场景的 AI 情绪支持与学习辅助服务,围绕学业压力、拖延内耗、考试与面试焦虑等高频问题,提供温和、具体、可执行的支持性建议。\n\n这个仓库的目标不是单纯展示方案,而是提供一个可以直接运行、便于继续开发、也能逐步接入钉钉等平台的完整项目基础。\n\n## 项目价值\n\n- 聚焦真实且高频的大学生使用场景,而不是泛化聊天。\n- 把“情绪支持”和“学习行动建议”放进同一轮对话,形成更完整的支持闭环。\n- 支持无密钥运行的本地演示模式,拿到仓库后可以直接启动和体验。\n- 预留模型调用和钉钉集成空间,便于后续继续做成更完整的产品。\n\n## 核心能力\n\n- `情绪支持对话`:识别压力、焦虑、拖延等常见表达,给出温和回应。\n- `学习行动建议`:把大问题拆成可立刻执行的小步骤,降低启动门槛。\n- `双运行模式`:未配置模型密钥时使用本地演示模式;配置后切换到 OpenAI 兼容模型调用模式。\n- `Web 服务化`:提供可直接访问的页面、健康检查、接口元信息和 Swagger 文档。\n- `工程基础`:包含测试、CI、环境变量说明和补充文档。\n\n## 使用场景\n\n- 学业压力大,任务很多,不知道从哪里开始\n- 长期拖延,明知道该做但迟迟启动不了\n- 考试、答辩、面试前持续紧张,难以进入准备状态\n- 情绪混乱导致学习节奏失序,需要先稳定状态再恢复行动\n\n## 运行模式\n\n| 模式 | 说明 | 需要的配置 |\n| --- | --- | --- |\n| 本地演示模式 | 使用内置规则生成支持性回复,适合本地启动、调试界面和展示流程 | 无需 API Key |\n| 模型调用模式 | 调用 OpenAI 兼容接口生成回复,适合继续做真实能力验证 | `OPENAI_API_KEY` |\n\n项目默认优先保证“拿到就能跑”。如果没有配置模型密钥,页面和 `/chat` 接口仍然可以完整返回结果。\n\n## 页面预览\n\n### 平台界面\n\n![平台界面示意](docs/assets/09-platform-overview.png)\n\n### 对话演示\n\n![对话界面示意](docs/assets/10-chat-demo.png)\n\n## 技术栈\n\n- Python 3.13\n- FastAPI\n- OpenAI Python SDK\n- Pydantic\n- python-dotenv\n- Pytest\n- GitHub Actions\n\n## 架构图\n\n![技术架构图](docs/assets/07-technical-architecture.png)\n\n## 快速启动\n\n推荐使用 Python 3.13,以保持与当前本地开发和 CI 环境一致。\n\n### 1. 安装依赖\n\n```bash\npython -m venv .venv\n.venv\\Scripts\\activate\npython -m pip install -r requirements.txt -r requirements-dev.txt\n```\n\n### 2. 配置环境变量\n\n```powershell\nCopy-Item .env.example .env\n```\n\n在 `.env` 中配置:\n\n- `OPENAI_API_KEY`:可留空,留空时自动进入本地演示模式\n- `OPENAI_BASE_URL`\n- `MODEL_NAME`\n- `DEMO_MODE`:可选,设置为 `true` 时强制使用本地演示模式\n\n### 3. 启动服务\n\n```bash\npython -m uvicorn app:app --reload\n```\n\n启动后可访问:\n\n- `http://127.0.0.1:8000/`\n- `http://127.0.0.1:8000/api/meta`\n- `http://127.0.0.1:8000/health`\n- `http://127.0.0.1:8000/docs`\n- `http://127.0.0.1:8000/project-docs/usage-guide.md`\n\n### 4. 运行测试\n\n```bash\npython -m pytest -vv\n```\n\n## 接口概览\n\n- `GET /`:Web 页面入口\n- `POST /chat`:对话接口\n- `GET /health`:服务健康检查\n- `GET /api/meta`:服务元信息与当前运行模式\n- `GET /docs`:Swagger 文档\n- `GET /project-docs/...`:项目补充文档\n\n### `POST /chat`\n\n请求示例:\n\n```json\n{\n \"message\": \"这周压力很大,感觉完全学不进去。\",\n \"system_hint\": \"给出温和且可执行的建议\"\n}\n```\n\n返回示例:\n\n```json\n{\n \"reply\": \"当前状态里明显存在压力堆积,可以先不追求一次解决整周问题,而是把任务缩小到今天最容易开始的一步,比如先完成 20 分钟复习。\",\n \"note\": \"当前为模型调用模式。回复由配置的 OpenAI 兼容接口生成。\",\n \"mode\": \"openai\"\n}\n```\n\n## 文档入口\n\n- [docs/project-report.md](docs/project-report.md):完整项目报告与方案背景\n- [docs/usage-guide.md](docs/usage-guide.md):运行模式、环境变量和常见问题说明\n- [docs/dingtalk-integration.md](docs/dingtalk-integration.md):钉钉权限模型与集成边界说明\n\n## 安全边界\n\n- 项目定位是情绪支持和学习辅助,不替代专业心理诊断或治疗。\n- 当前实现强调温和、具体、避免危险引导的回复风格。\n- 如果用户出现持续失眠、严重低落或自伤相关表达,实际产品应优先引导线下求助与转介。\n\n## 钉钉接入说明\n\n- Web 页面是默认入口,便于直接访问和继续开发。\n- 钉钉是可选的真实业务接入场景,不影响项目本身独立运行。\n- 如果接入钉钉,需要根据企业内部应用、多组织分发或用户授权模式处理权限问题。\n\n## 测试与持续集成\n\n- 本地测试命令:`python -m pytest -vv`\n- 仓库已配置 GitHub Actions,在推送后自动运行基础测试\n"}, "afc56bf4f691b9cf70c9a980ffa75f108fa22ba9": {"t": 1785765019.0392504, "n": 3121, "h": "fd2002bad6bf73e0", "c": "# 知愈星 AI Assistant\n\n![Python 3.13](https://img.shields.io/badge/Python-3.13-3776AB?logo=python&logoColor=white)\n![FastAPI](https://img.shields.io/badge/FastAPI-Demo-009688?logo=fastapi&logoColor=white)\n![CI](https://github.com/1420079678-ctrl/zhiyuxing-ai-assistant/actions/workflows/ci.yml/badge.svg)\n\n面向大学生场景的 AI 情绪支持与学习辅助原型项目,采用“可运行 Web Demo + FastAPI 后端 + 文档化方案说明”的方式组织,适合作为实习投递时展示 AI 应用落地、后端开发和工程化整理能力的 GitHub 项目。\n\n`技术关键词:Python / FastAPI / OpenAI SDK / Prompt Engineering / Pydantic / Pytest / GitHub Actions / DingTalk Integration Design`\n\n## 适合投递的岗位方向\n\n- Python 后端开发实习\n- AI 应用 / LLM 应用开发实习\n- 偏产品理解的技术实习\n\n## 1 分钟看点\n\n- 可以直接本地启动独立 Web Demo,不依赖钉钉组织权限。\n- 提供 `/chat`、`/health`、`/api/meta` 等接口,能快速体现后端结构。\n- 通过系统提示词约束输出风格与安全边界,体现基础 Prompt 设计意识。\n- 补充了 `pytest` 和 GitHub Actions CI,不只是“方案展示”,而是最小可运行交付。\n- 单独说明钉钉接入的权限边界,避免把平台型方案误写成“任何人都可直接使用”。\n\n## 项目定位\n\n很多大学生面临的并不只是“不会学”,而是“在焦虑、拖延、自我怀疑的状态下很难重新开始”。这个项目尝试把“情绪支持”和“学习建议”放进同一个对话闭环中,用 AI 先帮助用户稳定状态,再给出可执行的小步行动建议。\n\n当前 GitHub 版本强调的是可展示、可验证、可说明边界,而不是把作品集 Demo 包装成完整线上产品。\n\n## 这个仓库能证明什么\n\n| 能力维度 | 仓库证据 | 面试中可说明的点 |\n| --- | --- | --- |\n| AI 应用原型设计 | `/chat` 接口、系统提示词约束 | 不只是调用模型,还考虑场景、语气和边界 |\n| 后端服务开发 | `app.py`、Pydantic 请求响应模型 | 具备基础 API 设计和服务封装能力 |\n| 演示与交付意识 | `static/` 独立 Web Demo、根路由页面 | 外部评审可以直接体验,不被平台权限卡住 |\n| 工程质量 | `tests/test_app.py`、`.github/workflows/ci.yml` | 具备最小测试和持续集成意识 |\n| 平台集成边界表达 | `docs/dingtalk-integration.md` | 清楚区分“真实落地场景”和“作品集演示入口” |\n\n## 已实现与规划中\n\n| 状态 | 内容 |\n| --- | --- |\n| 已实现 | FastAPI 服务、Web Demo、`/chat` `/health` `/api/meta` 接口、基础 Prompt 约束、测试、CI、项目文档整理 |\n| 规划中 | 知识库检索、风险词识别与转介流程、对话记录存储、真实钉钉授权接入 |\n\n这种写法更适合实习投递,因为它既展示能力,也避免过度承诺。\n\n## 页面预览\n\n### 平台界面\n\n![平台界面示意](docs/assets/09-platform-overview.png)\n\n### 对话演示\n\n![对话界面示意](docs/assets/10-chat-demo.png)\n\n## 技术栈\n\n- Python 3.13\n- FastAPI\n- OpenAI Python SDK\n- Pydantic\n- python-dotenv\n- Pytest\n- GitHub Actions\n\n## 架构图\n\n![技术架构图](docs/assets/07-technical-architecture.png)\n\n## 快速启动\n\n推荐使用 Python 3.13,以保持与当前本地开发和 CI 环境一致。\n\n### 1. 安装依赖\n\n```bash\npython -m venv .venv\n.venv\\Scripts\\activate\npython -m pip install -r requirements.txt -r requirements-dev.txt\n```\n\n### 2. 配置环境变量\n\n```powershell\nCopy-Item .env.example .env\n```\n\n在 `.env` 中配置:\n\n- `OPENAI_API_KEY`\n- `OPENAI_BASE_URL`\n- `MODEL_NAME`\n\n### 3. 启动服务\n\n```bash\npython -m uvicorn app:app --reload\n```\n\n启动后可访问:\n\n- `http://127.0.0.1:8000/`\n- `http://127.0.0.1:8000/api/meta`\n- `http://127.0.0.1:8000/health`\n- `http://127.0.0.1:8000/docs`\n\n### 4. 运行测试\n\n```bash\npython -m pytest -vv\n```\n\n## 接口示例\n\n### `POST /chat`\n\n```json\n{\n \"message\": \"这周压力很大,感觉完全学不进去。\",\n \"system_hint\": \"给出温和且可执行的建议\"\n}\n```\n\n```json\n{\n \"reply\": \"当前状态里明显存在压力堆积,可以先不追求一次解决整周问题,而是把任务缩小到今天最容易开始的一步,比如先完成 20 分钟复习。\",\n \"note\": \"这是作品集仓库中的最小可运行 Demo,用于展示项目方向与接口能力。\"\n}\n```\n\n## 文档入口\n\n- [docs/project-report.md](docs/project-report.md):完整项目报告与方案背景\n- [docs/resume-interview-guide.md](docs/resume-interview-guide.md):简历描述、自我介绍和投递表达\n- [docs/interview-qa.md](docs/interview-qa.md):面试高频追问速答\n- [docs/dingtalk-integration.md](docs/dingtalk-integration.md):钉钉权限模型与集成边界说明\n\n## 钉钉相关说明\n\n- 这个仓库默认以独立 Web Demo 作为演示入口,外部评审不需要使用个人账号权限。\n- 如果项目以钉钉企业内部应用形态部署,访问能力会受到组织、管理员授权和应用类型限制。\n- 因此钉钉更适合作为真实业务落地场景说明,而不是唯一 Demo 入口。\n"}, "9a8e295c98b319fa18b0e69ad513ff617b800870": {"t": 1785765020.462509, "n": 2974, "h": "19143fc135f71fd9", "c": "# 知愈星 AI Assistant\n\n面向大学生场景的 AI 心理支持与学习辅助助手作品集项目,聚焦“情绪支持 + 学习建议”的联动式对话体验。\n\n这个仓库的目标不是只展示一个想法,而是展示一套更适合实习投递的能力组合:\n\n- AI 应用原型设计\n- FastAPI 后端接口实现\n- Prompt 约束与安全边界设计\n- 独立 Web Demo 产品化\n- 测试与 GitHub Actions 持续集成\n\n## 项目概览\n\n很多大学生面临的问题并不只是“不会学”,而是“在焦虑、拖延、自我怀疑的状态下无法进入学习”。知愈星尝试把情绪支持与学习建议放进同一个对话闭环里,而不是把二者拆成割裂的功能模块。\n\n当前 GitHub 版本采用“可运行 Demo + 方案展示”的方式组织,既能直接运行,也能清晰体现项目思路、技术路径和工程边界。\n\n## 为什么这个仓库适合投实习\n\n### 能体现的工程能力\n\n- `AI 应用落地`:基于 OpenAI Python SDK 实现对话接口,组织系统提示词、用户输入和补充要求。\n- `后端开发`:使用 FastAPI 和 Pydantic 封装接口、请求体和响应体,具备基本服务化结构。\n- `前端演示`:补充独立 Web Demo 页面,避免项目演示被平台权限绑死。\n- `工程质量`:增加 pytest 测试和 GitHub Actions,保证基础功能可验证。\n- `方案表达`:保留项目报告、架构图、流程图和集成边界说明,适合面试展开讲述。\n\n### 能体现的产品思考\n\n- 场景聚焦在大学生高频问题,而不是泛化聊天。\n- 将“情绪识别 -> 学习建议 -> 行动拆解”作为核心闭环。\n- 明确 AI 不是专业医疗替代,保留安全边界和转介意识。\n- 区分“作品集演示入口”和“钉钉真实落地场景”,降低外部体验门槛。\n\n## 当前已实现内容\n\n- 一个可本地运行的 FastAPI 服务\n- 一个独立 Web Demo 页面\n- `/chat`、`/health`、`/api/meta` 等接口\n- 适用于大学生场景的基础系统提示词约束\n- 项目报告、流程图、架构图和钉钉权限说明文档\n- `pytest` 测试\n- GitHub Actions CI\n\n## 当前边界\n\n当前版本是作品集版本,不是完整线上产品。已经实现的部分和规划中的部分做了明确区分:\n\n- 已实现:Demo 对话流程、接口、静态页面、文档整理、测试与 CI。\n- 规划中:知识库检索、风险词识别与转介流程、对话记录存储、真实钉钉授权接入。\n\n这种表达方式更适合实习投递,因为它既展示能力,也避免过度承诺。\n\n## 页面预览\n\n### 平台界面\n\n![平台界面示意](docs/assets/09-platform-overview.png)\n\n### 对话演示\n\n![对话界面示意](docs/assets/10-chat-demo.png)\n\n## 技术栈\n\n- Python 3.13\n- FastAPI\n- OpenAI Python SDK\n- Pydantic\n- python-dotenv\n- Pytest\n- GitHub Actions\n\n## 架构与目录\n\n技术架构图:\n\n![技术架构图](docs/assets/07-technical-architecture.png)\n\n项目目录:\n\n```text\nzhiyuxing-ai-assistant/\n├── app.py\n├── requirements.txt\n├── requirements-dev.txt\n├── .python-version\n├── .env.example\n├── static/\n│ ├── app.js\n│ ├── index.html\n│ └── style.css\n├── tests/\n│ └── test_app.py\n└── docs/\n ├── dingtalk-integration.md\n ├── project-report.md\n ├── resume-interview-guide.md\n └── assets/\n```\n\n## 快速启动\n\n推荐使用 Python 3.13 运行本项目,以保持与当前本地开发和 CI 环境一致。\n\n### 1. 安装依赖\n\n```bash\npython -m venv .venv\n.venv\\Scripts\\activate\npython -m pip install -r requirements.txt -r requirements-dev.txt\n```\n\n### 2. 配置环境变量\n\n```powershell\nCopy-Item .env.example .env\n```\n\n在 `.env` 中配置以下内容:\n\n- `OPENAI_API_KEY`\n- `OPENAI_BASE_URL`\n- `MODEL_NAME`\n\n### 3. 启动服务\n\n```bash\nuvicorn app:app --reload\n```\n\n启动后可以访问:\n\n- `http://127.0.0.1:8000/`\n- `http://127.0.0.1:8000/api/meta`\n- `http://127.0.0.1:8000/health`\n- `http://127.0.0.1:8000/docs`\n\n## 接口示例\n\n### `POST /chat`\n\n请求体:\n\n```json\n{\n \"message\": \"这周压力很大,感觉完全学不进去。\",\n \"system_hint\": \"给出温和且可执行的建议\"\n}\n```\n\n返回示例:\n\n```json\n{\n \"reply\": \"当前状态里明显存在压力堆积,可以先不追求一次解决整周问题,而是把任务缩小到今天最容易开始的一步,比如先完成 20 分钟复习。\",\n \"note\": \"这是作品集仓库中的最小可运行 Demo,用于展示项目方向与接口能力。\"\n}\n```\n\n## 实习投递辅助文档\n\n- 项目报告:[docs/project-report.md](docs/project-report.md)\n- 钉钉集成边界:[docs/dingtalk-integration.md](docs/dingtalk-integration.md)\n- 简历与面试说明:[docs/resume-interview-guide.md](docs/resume-interview-guide.md)\n\n## 钉钉集成边界\n\n- 如果项目以钉钉企业内部应用形态部署,外部评审通常无法直接进入所属组织体验。\n- 因此仓库默认提供独立 Web Demo 作为展示入口,钉钉版本作为业务落地场景保留在文档中说明。\n- 这种拆分更适合作品集展示,也更便于说明平台集成与权限隔离问题。\n\n## 测试与持续集成\n\n```bash\npython -m pytest -vv\n```\n\n仓库已配置 GitHub Actions,在推送后自动运行基础测试。\n"}, "9442197681ef3cf36a48c757b78bb7037fb6938c": {"t": 1785765022.06133, "n": 2974, "h": "6a507f979fc66f90", "c": "# 知愈星 AI Assistant\n\n知愈星是一个面向大学生场景的 AI 心理支持与学习辅助助手,围绕“情绪支持 + 学习指导”两条主线,尝试把共情式对话、行动建议和校园使用场景结合起来。\n\n这个仓库适合用作实习作品集展示,因为它同时保留了两个层面:\n\n- 一个可以本地运行、独立访问的 Web Demo;\n- 一份完整整理过的项目方案文档、流程图和界面示意;\n- 清晰体现了产品思考、接口设计、提示工程和安全边界意识。\n\n## 项目亮点\n\n- 场景聚焦:针对大学生常见的学业压力、社交焦虑、拖延和学习内耗设计对话方向。\n- 双线联动:不是只做“心理安慰”,而是把情绪支持和学习建议做成一个连续闭环。\n- 可运行展示:仓库提供 FastAPI + 原生前端页面,可直接接入 OpenAI 兼容模型进行对话测试。\n- 伦理边界明确:回复中避免诊断化表达,对高风险场景保留转介意识,不把 AI 包装成专业医疗替代。\n- 展示路径清晰:独立 Web Demo 无需进入特定钉钉组织即可体验。\n\n## 当前仓库包含什么\n\n- `app.py`:最小可运行服务,提供 Web Demo、健康检查和对话接口。\n- `static/`:独立演示页的静态前端资源。\n- `docs/project-report.md`:完整项目报告,包含定位、功能设计、创新点和技术方案。\n- `docs/dingtalk-integration.md`:钉钉集成与权限边界说明。\n- `docs/assets/`:流程图、架构图和界面示意图。\n- `requirements.txt`:运行 Demo 所需依赖。\n- `requirements-dev.txt`:测试和 CI 所需依赖。\n\n## 技术栈\n\n- Python\n- FastAPI\n- OpenAI Python SDK\n- Pydantic\n- python-dotenv\n- Pytest\n- GitHub Actions\n\n## 页面预览\n\n### 平台界面\n\n![平台界面示意](docs/assets/09-platform-overview.png)\n\n### 对话演示\n\n![对话界面示意](docs/assets/10-chat-demo.png)\n\n## 项目结构\n\n```text\nzhiyuxing-ai-assistant/\n├── app.py\n├── requirements.txt\n├── requirements-dev.txt\n├── .env.example\n├── static/\n│ ├── app.js\n│ ├── index.html\n│ └── style.css\n├── tests/\n│ └── test_app.py\n└── docs/\n ├── dingtalk-integration.md\n ├── project-report.md\n └── assets/\n ├── 02-project-goals-flow.png\n ├── 03-core-features-flow.png\n ├── 04-innovation-workflow.png\n ├── 05-heart-learning-loop.png\n ├── 06-practicality-flow.png\n ├── 07-technical-architecture.png\n ├── 08-service-closed-loop.png\n ├── 09-platform-overview.png\n └── 10-chat-demo.png\n```\n\n## 快速启动\n\n推荐使用 Python 3.13 运行本项目,以保持与当前本地开发和 CI 环境一致。\n\n### 1. 安装依赖\n\n```bash\npython -m venv .venv\n.venv\\Scripts\\activate\npip install -r requirements.txt -r requirements-dev.txt\n```\n\n### 2. 配置环境变量\n\n```powershell\nCopy-Item .env.example .env\n```\n\n在 `.env` 中配置以下内容:\n\n- `OPENAI_API_KEY`\n- `OPENAI_BASE_URL`\n- `MODEL_NAME`\n\n### 3. 启动服务\n\n```bash\nuvicorn app:app --reload\n```\n\n启动后可以访问:\n\n- `http://127.0.0.1:8000/`\n- `http://127.0.0.1:8000/api/meta`\n- `http://127.0.0.1:8000/health`\n- `http://127.0.0.1:8000/docs`\n\n## 接口示例\n\n### `POST /chat`\n\n请求体:\n\n```json\n{\n \"message\": \"这周压力很大,感觉完全学不进去。\",\n \"system_hint\": \"给出温和且可执行的建议\"\n}\n```\n\n返回示例:\n\n```json\n{\n \"reply\": \"当前状态里明显存在压力堆积,可以先不追求一次解决整周问题,而是把任务缩小到今天最容易开始的一步,比如先完成 20 分钟复习。\",\n \"note\": \"这是作品集仓库中的最小可运行 Demo,用于展示项目方向与接口能力。\"\n}\n```\n\n## 文档入口\n\n- 完整项目报告见 [docs/project-report.md](docs/project-report.md)\n- 钉钉集成与权限说明见 [docs/dingtalk-integration.md](docs/dingtalk-integration.md)\n- 技术架构图见 [docs/assets/07-technical-architecture.png](docs/assets/07-technical-architecture.png)\n\n## 钉钉权限边界\n\n- 如果项目以钉钉企业内部应用形态部署,外部评审通常无法直接进入所属组织体验。\n- 因此这个仓库默认提供独立 Web Demo 作为展示入口,钉钉版本作为业务落地场景保留在文档中说明。\n- 这套展示策略强调了平台集成、权限隔离和作品集可访问性的平衡,而不是把演示绑定在单一租户环境里。\n\n## 测试与持续集成\n\n```bash\npytest\n```\n\n仓库已经补充了 `.github/workflows/ci.yml`,推送后会自动执行基础测试。\n\n## 当前边界\n\n- 这个仓库不是完整线上产品,而是“可运行 Demo + 方案展示”的作品集版本。\n- 钉钉集成、知识库检索、风险词转介流程目前仍停留在方案设计或可继续扩展阶段。\n- 如果继续打磨到更强的实习投递版本,下一步最值得补的是对话记录存储、风险识别逻辑和真实钉钉授权接入。\n"}, "8c0a7bdde5bdf68860d54a9360413c8e2f419c70": {"t": 1785765023.4431534, "n": 2929, "h": "94104875ed41096b", "c": "# 知愈星 AI Assistant\n\n知愈星是一个面向大学生场景的 AI 心理支持与学习辅助助手,围绕“情绪支持 + 学习指导”两条主线,尝试把共情式对话、行动建议和校园使用场景结合起来。\n\n这个仓库适合用作实习作品集展示,因为它同时保留了两个层面:\n\n- 一个可以本地运行、独立访问的 Web Demo;\n- 一份完整整理过的项目方案文档、流程图和界面示意;\n- 清晰体现了产品思考、接口设计、提示工程和安全边界意识。\n\n## 项目亮点\n\n- 场景聚焦:针对大学生常见的学业压力、社交焦虑、拖延和学习内耗设计对话方向。\n- 双线联动:不是只做“心理安慰”,而是把情绪支持和学习建议做成一个连续闭环。\n- 可运行展示:仓库提供 FastAPI + 原生前端页面,可直接接入 OpenAI 兼容模型进行对话测试。\n- 伦理边界明确:回复中避免诊断化表达,对高风险场景保留转介意识,不把 AI 包装成专业医疗替代。\n- 展示路径清晰:独立 Web Demo 无需进入特定钉钉组织即可体验。\n\n## 当前仓库包含什么\n\n- `app.py`:最小可运行服务,提供 Web Demo、健康检查和对话接口。\n- `static/`:独立演示页的静态前端资源。\n- `docs/project-report.md`:完整项目报告,包含定位、功能设计、创新点和技术方案。\n- `docs/dingtalk-integration.md`:钉钉集成与权限边界说明。\n- `docs/assets/`:流程图、架构图和界面示意图。\n- `requirements.txt`:运行 Demo 所需依赖。\n- `requirements-dev.txt`:测试和 CI 所需依赖。\n\n## 技术栈\n\n- Python\n- FastAPI\n- OpenAI Python SDK\n- Pydantic\n- python-dotenv\n- Pytest\n- GitHub Actions\n\n## 页面预览\n\n### 平台界面\n\n![平台界面示意](docs/assets/09-platform-overview.png)\n\n### 对话演示\n\n![对话界面示意](docs/assets/10-chat-demo.png)\n\n## 项目结构\n\n```text\nzhiyuxing-ai-assistant/\n├── app.py\n├── requirements.txt\n├── requirements-dev.txt\n├── .env.example\n├── static/\n│ ├── app.js\n│ ├── index.html\n│ └── style.css\n├── tests/\n│ └── test_app.py\n└── docs/\n ├── dingtalk-integration.md\n ├── project-report.md\n └── assets/\n ├── 02-project-goals-flow.png\n ├── 03-core-features-flow.png\n ├── 04-innovation-workflow.png\n ├── 05-heart-learning-loop.png\n ├── 06-practicality-flow.png\n ├── 07-technical-architecture.png\n ├── 08-service-closed-loop.png\n ├── 09-platform-overview.png\n └── 10-chat-demo.png\n```\n\n## 快速启动\n\n### 1. 安装依赖\n\n```bash\npython -m venv .venv\n.venv\\Scripts\\activate\npip install -r requirements.txt -r requirements-dev.txt\n```\n\n### 2. 配置环境变量\n\n```powershell\nCopy-Item .env.example .env\n```\n\n在 `.env` 中配置以下内容:\n\n- `OPENAI_API_KEY`\n- `OPENAI_BASE_URL`\n- `MODEL_NAME`\n\n### 3. 启动服务\n\n```bash\nuvicorn app:app --reload\n```\n\n启动后可以访问:\n\n- `http://127.0.0.1:8000/`\n- `http://127.0.0.1:8000/api/meta`\n- `http://127.0.0.1:8000/health`\n- `http://127.0.0.1:8000/docs`\n\n## 接口示例\n\n### `POST /chat`\n\n请求体:\n\n```json\n{\n \"message\": \"这周压力很大,感觉完全学不进去。\",\n \"system_hint\": \"给出温和且可执行的建议\"\n}\n```\n\n返回示例:\n\n```json\n{\n \"reply\": \"当前状态里明显存在压力堆积,可以先不追求一次解决整周问题,而是把任务缩小到今天最容易开始的一步,比如先完成 20 分钟复习。\",\n \"note\": \"这是作品集仓库中的最小可运行 Demo,用于展示项目方向与接口能力。\"\n}\n```\n\n## 文档入口\n\n- 完整项目报告见 [docs/project-report.md](docs/project-report.md)\n- 钉钉集成与权限说明见 [docs/dingtalk-integration.md](docs/dingtalk-integration.md)\n- 技术架构图见 [docs/assets/07-technical-architecture.png](docs/assets/07-technical-architecture.png)\n\n## 钉钉权限边界\n\n- 如果项目以钉钉企业内部应用形态部署,外部评审通常无法直接进入所属组织体验。\n- 因此这个仓库默认提供独立 Web Demo 作为展示入口,钉钉版本作为业务落地场景保留在文档中说明。\n- 这套展示策略强调了平台集成、权限隔离和作品集可访问性的平衡,而不是把演示绑定在单一租户环境里。\n\n## 测试与持续集成\n\n```bash\npytest\n```\n\n仓库已经补充了 `.github/workflows/ci.yml`,推送后会自动执行基础测试。\n\n## 当前边界\n\n- 这个仓库不是完整线上产品,而是“可运行 Demo + 方案展示”的作品集版本。\n- 钉钉集成、知识库检索、风险词转介流程目前仍停留在方案设计或可继续扩展阶段。\n- 如果继续打磨到更强的实习投递版本,下一步最值得补的是对话记录存储、风险识别逻辑和真实钉钉授权接入。\n"}, "0b4480218512582a8f7166295b21fadb3f6b4710": {"t": 1785765024.8363643, "n": 2935, "h": "424c5dc64fcd5909", "c": "# 知愈星 AI Assistant\n\n知愈星是一个面向大学生场景的 AI 心理支持与学习辅助助手,围绕“情绪支持 + 学习指导”两条主线,尝试把共情式对话、行动建议和校园使用场景结合起来。\n\n这个仓库适合用作实习作品集展示,因为它同时保留了两个层面:\n\n- 一个可以本地运行、独立访问的 Web Demo;\n- 一份完整整理过的项目方案文档、流程图和界面示意;\n- 清晰体现了产品思考、接口设计、提示工程和安全边界意识。\n\n## 项目亮点\n\n- 场景聚焦:针对大学生常见的学业压力、社交焦虑、拖延和学习内耗设计对话方向。\n- 双线联动:不是只做“心理安慰”,而是把情绪支持和学习建议做成一个连续闭环。\n- 可运行展示:仓库提供 FastAPI + 原生前端页面,可直接接入 OpenAI 兼容模型进行对话测试。\n- 伦理边界明确:回复中避免诊断化表达,对高风险场景保留转介意识,不把 AI 包装成专业医疗替代。\n- 展示路径清晰:独立 Web Demo 不依赖评审进入你的钉钉组织即可体验。\n\n## 当前仓库包含什么\n\n- `app.py`:最小可运行服务,提供 Web Demo、健康检查和对话接口。\n- `static/`:独立演示页的静态前端资源。\n- `docs/project-report.md`:完整项目报告,包含定位、功能设计、创新点和技术方案。\n- `docs/dingtalk-integration.md`:钉钉集成与权限边界说明。\n- `docs/assets/`:流程图、架构图和界面示意图。\n- `requirements.txt`:运行 Demo 所需依赖。\n- `requirements-dev.txt`:测试和 CI 所需依赖。\n\n## 技术栈\n\n- Python\n- FastAPI\n- OpenAI Python SDK\n- Pydantic\n- python-dotenv\n- Pytest\n- GitHub Actions\n\n## 页面预览\n\n### 平台界面\n\n![平台界面示意](docs/assets/09-platform-overview.png)\n\n### 对话演示\n\n![对话界面示意](docs/assets/10-chat-demo.png)\n\n## 项目结构\n\n```text\nzhiyuxing-ai-assistant/\n├── app.py\n├── requirements.txt\n├── requirements-dev.txt\n├── .env.example\n├── static/\n│ ├── app.js\n│ ├── index.html\n│ └── style.css\n├── tests/\n│ └── test_app.py\n└── docs/\n ├── dingtalk-integration.md\n ├── project-report.md\n └── assets/\n ├── 02-project-goals-flow.png\n ├── 03-core-features-flow.png\n ├── 04-innovation-workflow.png\n ├── 05-heart-learning-loop.png\n ├── 06-practicality-flow.png\n ├── 07-technical-architecture.png\n ├── 08-service-closed-loop.png\n ├── 09-platform-overview.png\n └── 10-chat-demo.png\n```\n\n## 快速启动\n\n### 1. 安装依赖\n\n```bash\npython -m venv .venv\n.venv\\Scripts\\activate\npip install -r requirements.txt -r requirements-dev.txt\n```\n\n### 2. 配置环境变量\n\n```powershell\nCopy-Item .env.example .env\n```\n\n在 `.env` 中配置以下内容:\n\n- `OPENAI_API_KEY`\n- `OPENAI_BASE_URL`\n- `MODEL_NAME`\n\n### 3. 启动服务\n\n```bash\nuvicorn app:app --reload\n```\n\n启动后可以访问:\n\n- `http://127.0.0.1:8000/`\n- `http://127.0.0.1:8000/api/meta`\n- `http://127.0.0.1:8000/health`\n- `http://127.0.0.1:8000/docs`\n\n## 接口示例\n\n### `POST /chat`\n\n请求体:\n\n```json\n{\n \"message\": \"这周压力很大,感觉完全学不进去。\",\n \"system_hint\": \"给出温和且可执行的建议\"\n}\n```\n\n返回示例:\n\n```json\n{\n \"reply\": \"我能感觉到你现在有点被压力压住了。我们先不要急着把一整周的问题一次解决,可以先挑今天最小的一件事开始,比如只完成 20 分钟复习...\",\n \"note\": \"这是作品集仓库中的最小可运行 Demo,用于展示项目方向与接口能力。\"\n}\n```\n\n## 文档入口\n\n- 完整项目报告见 [docs/project-report.md](docs/project-report.md)\n- 钉钉集成与权限说明见 [docs/dingtalk-integration.md](docs/dingtalk-integration.md)\n- 技术架构图见 [docs/assets/07-technical-architecture.png](docs/assets/07-technical-architecture.png)\n\n## 钉钉权限边界\n\n- 如果项目以钉钉企业内部应用形态部署,外部评审通常不能直接进入你的组织体验。\n- 因此这个仓库默认提供独立 Web Demo 作为展示入口,钉钉版本作为业务落地场景保留在文档中说明。\n- 面试时可以强调:你考虑了平台集成、权限隔离和作品集可访问性,而不是把演示绑死在个人租户里。\n\n## 测试与持续集成\n\n```bash\npytest\n```\n\n仓库已经补充了 `.github/workflows/ci.yml`,推送后会自动执行基础测试。\n\n## 当前边界\n\n- 这个仓库不是完整线上产品,而是“可运行 Demo + 方案展示”的作品集版本。\n- 钉钉集成、知识库检索、风险词转介流程目前仍停留在方案设计或可继续扩展阶段。\n- 如果继续打磨到更强的实习投递版本,下一步最值得补的是对话记录存储、风险识别逻辑和真实钉钉授权接入。\n"}, "12d3eba28be566a12caf9fb3a687171aca5f2824": {"t": 1785765035.1491416, "n": 439, "h": "4776824d49d8d13b", "c": "# src 目录说明\n\n当前仓库是 **展示版(showcase repo)**,暂未包含完整业务源码。\n\n如果你后续要把这个仓库升级成“可运行版”,建议从下面这个结构开始:\n\n```text\nsrc/\n├── app.py # 最小可运行入口\n├── prompts/ # Prompt 模板\n├── services/ # LLM 调用、心理引导、学习建议等服务\n├── routers/ # 接口路由\n├── schemas/ # 请求/响应结构\n└── utils/ # 工具函数\n```\n\n## 最低可运行建议\n你至少可以先补一个最简单的 demo:\n- 用户输入一句话\n- 调用大模型 API\n- 返回心理支持/学习建议回复\n\n这样 GitHub 仓库就会从“作品展示”升级为“有演示能力的项目仓库”。\n"}}}}