Files
hack/tools/scripts/llm-key-hunter/results/_cache/content/airflowshu_flexboot4.json
T

1 line
17 KiB
JSON
Raw 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": "airflowshu/flexboot4", "files": {"docs/ai-provider-models.md": {"ed50e722f0c6203bde6bf4c0c9d89c352f033c35": {"t": 1785746560.8521621, "n": 5813, "h": "9376b76b3aa6eef5", "c": "# AI 厂商模型接入指南\n\n本文说明 `flexboot4-ai` 如何接入 DeepSeek V4、OpenAI-compatible 云厂商模型或内部模型网关。当前方案保持直接、可控:\n\n- 不引入 Spring AI。\n- 不新增 `ChatProvider` 适配层。\n- 由 `LlmProxyClient` 使用 `WebClient` 转发 OpenAI-compatible Chat Completions 请求。\n- 厂商 API Key 只配置在后端环境变量中,前端不得持有。\n\n## 1. 接入边界\n\n`flexboot4-ai` 当前拆成两个明确入口:\n\n| 使用场景 | 前端页面 | 后端接口 | 上游调用 |\n| --- | --- | --- | --- |\n| AI 对话 | `运维管理 / AI 对话` | `POST /api/ai/chat`、`POST /api/ai/chat/stream` | 直接调用第三方或官方模型,不做 embedding 和知识库检索 |\n| 知识库问答 | `知识库 / 知识库问答` | `POST /api/ai/rag/chat`、`POST /api/ai/rag/chat/stream` | 先 embedding + 向量检索,再把知识库片段拼入 Chat Completions |\n\n因此,接入 DeepSeek、OpenAI-compatible 厂商或 APISIX 时,只需要调整 `llm-proxy` 指向。纯 AI 对话和 RAG 问答共用同一个上游模型出口,但业务流程不同。\n\n## 2. 配置项\n\n`flexboot4-ai/src/main/resources/application.yml` 已支持以下环境变量:\n\n| 环境变量 | 说明 | DeepSeek V4 示例 |\n| --- | --- | --- |\n| `LLM_PROXY_URL` | OpenAI-compatible base URL | `https://api.deepseek.com` |\n| `LLM_PROXY_CHAT_PATH` | Chat Completions 路径 | `/chat/completions` |\n| `LLM_PROXY_API_KEY` | 厂商官方 API Key。非空时后端转发会注入 `Authorization: Bearer ...` | `sk-...` |\n| `LLM_PROXY_DEFAULT_MODEL` | 纯 AI 对话未传 `model` 时使用的默认模型 | `deepseek-v4-flash` |\n| `AI_PRIMARY_MODEL` | RAG 问答未传 `model` 时使用的主模型 | `deepseek-v4-flash` |\n| `AI_FALLBACK_MODEL` | RAG 问答配额耗尽或路由兜底时使用的模型 | `deepseek-v4-flash` |\n\n注意区分两类 Key:\n\n- `LLM_PROXY_API_KEY` 是 DeepSeek、OpenAI 等厂商密钥,只能放在后端。\n- `X-AI-API-KEY` 是 FlexBoot4 自己的用户 API Key,用于用户授权、配额和审计。直连厂商官方 API 且配置了 `LLM_PROXY_API_KEY` 时,`LlmProxyClient` 不会把 `X-AI-API-KEY` 或前端传入的 `Authorization` 透传给厂商。\n\n## 3. 直连 DeepSeek V4\n\n截至 2026-06-09,DeepSeek 官方 API 文档给出的 OpenAI 兼容参数为:\n\n| 参数 | 值 |\n| --- | --- |\n| base URL | `https://api.deepseek.com` |\n| Chat Completions | `/chat/completions` |\n| V4 Flash | `deepseek-v4-flash` |\n| V4 Pro | `deepseek-v4-pro` |\n\n`deepseek-v4-flash` 适合作为默认模型;`deepseek-v4-pro` 适合更复杂的推理、编码和高质量问答。官方文档同时说明旧模型名 `deepseek-chat` 与 `deepseek-reasoner` 将在 2026-07-24 15:59 UTC 停用,因此新配置应直接使用 V4 模型名。\n\nWindows PowerShell:\n\n```powershell\n$env:LLM_PROXY_URL = \"https://api.deepseek.com\"\n$env:LLM_PROXY_CHAT_PATH = \"/chat/completions\"\n$env:LLM_PROXY_API_KEY = \"sk-...\"\n$env:LLM_PROXY_DEFAULT_MODEL = \"deepseek-v4-flash\"\n$env:AI_PRIMARY_MODEL = \"deepseek-v4-flash\"\n$env:AI_FALLBACK_MODEL = \"deepseek-v4-flash\"\n\n.\\gradlew.bat :flexboot4-ai:bootRun\n```\n\nLinux/macOS:\n\n```bash\nexport LLM_PROXY_URL=https://api.deepseek.com\nexport LLM_PROXY_CHAT_PATH=/chat/completions\nexport LLM_PROXY_API_KEY=sk-...\nexport LLM_PROXY_DEFAULT_MODEL=deepseek-v4-flash\nexport AI_PRIMARY_MODEL=deepseek-v4-flash\nexport AI_FALLBACK_MODEL=deepseek-v4-flash\n\n./gradlew :flexboot4-ai:bootRun\n```\n\n如果需要在纯 AI 对话中显式使用 V4 Pro 或开启 DeepSeek 特定参数,可以在请求体里传 OpenAI-compatible 字段。`/api/ai/chat` 会保留额外字段并原样转发:\n\n```json\n{\n \"model\": \"deepseek-v4-pro\",\n \"messages\": [\n { \"role\": \"system\", \"content\": \"你是企业 AI 助手。\" },\n { \"role\": \"user\", \"content\": \"请解释 FlexBoot4 的模块边界。\" }\n ],\n \"thinking\": { \"type\": \"enabled\" },\n \"reasoning_effort\": \"high\"\n}\n```\n\nRAG 问答接口当前只接收 `RagChatRequest` 中定义的字段,不透传任意厂商私有参数。需要控制 DeepSeek thinking mode 时,优先使用模型默认行为;如果业务确实需要在知识库问答里暴露这些参数,应明确扩展 `RagChatRequest` 和 RAG 组装逻辑。\n\n## 4. 接口验证\n\n启动 `flexboot4-ai` 后,可以先验证纯 AI 对话。下面示例需要替换为当前登录用户的 `access_token` 和 FlexBoot4 内部 `X-AI-API-KEY`:\n\n```bash\ncurl -N \"http://localhost:8081/api/ai/chat/stream\" \\\n -H \"Content-Type: application/json\" \\\n -H \"Cookie: access_token=<登录后的 JWT>\" \\\n -H \"X-AI-API-KEY: <FlexBoot4 用户 API Key>\" \\\n -d '{\n \"model\": \"deepseek-v4-flash\",\n \"messages\": [\n { \"role\": \"user\", \"content\": \"你好,请用一句话介绍 FlexBoot4。\" }\n ]\n }'\n```\n\n知识库问答需要已有知识库和向量数据,并且请求体必须带 `kbId`:\n\n```bash\ncurl -N \"http://localhost:8081/api/ai/rag/chat/stream\" \\\n -H \"Content-Type: application/json\" \\\n -H \"Cookie: access_token=<登录后的 JWT>\" \\\n -H \"X-AI-API-KEY: <FlexBoot4 用户 API Key>\" \\\n -d '{\n \"kbId\": \"<知识库 ID>\",\n \"query\": \"请根据知识库说明项目如何接入 DeepSeek V4。\",\n \"model\": \"deepseek-v4-flash\",\n \"topK\": 5\n }'\n```\n\n## 5. 通过 APISIX 汇聚多厂商\n\n如果需要统一管理多个模型、做限流、熔断、fallback 或观测,推荐让 `flexboot4-ai` 指向 APISIX:\n\n```powershell\n$env:LLM_PROXY_URL = \"http://127.0.0.1:9080\"\n$env:LLM_PROXY_CHAT_PATH = \"/v1/chat/completions\"\n$env:LLM_PROXY_API_KEY = \"\"\n$env:LLM_PROXY_DEFAULT_MODEL = \"deepseek-v4-flash\"\n```\n\n这种模式下:\n\n- `flexboot4-ai` 仍负责 JWT、用户 API Key、权限、配额和业务审计。\n- APISIX 负责上游模型实例、厂商密钥、路由、限流和 fallback。\n- `X-AI-API-KEY` 可以作为 APISIX consumer key 使用。\n- DeepSeek 官方密钥应配置在 APISIX 的上游插件或服务配置中,而不是前端。\n\nAPISIX 示例见 [APISIX AI Gateway 对接](https://github.com/airflowshu/flexboot4/blob/master/flexboot4-ai/docs/apisix-ai.md)。\n\n## 6. 接入其它 OpenAI-compatible 厂商\n\n接入其它厂商时按同一流程处理:\n\n1. 确认厂商是否支持 Chat Completions 兼容接口。\n2. 设置 `LLM_PROXY_URL` 为厂商 base URL。\n3. 设置 `LLM_PROXY_CHAT_PATH` 为厂商 Chat Completions 路径,例如 `/v1/chat/completions` 或 `/chat/completions`。\n4. 设置 `LLM_PROXY_API_KEY`,让后端统一注入 `Authorization: Bearer ...`。\n5. 设置 `LLM_PROXY_DEFAULT_MODEL`、`AI_PRIMARY_MODEL`、`AI_FALLBACK_MODEL`。\n6. 用 `/api/ai/chat/stream` 验证纯 AI 对话,再用 `/api/ai/rag/chat/stream` 验证知识库问答。\n\n如果厂商不是 OpenAI-compatible Chat Completions 形态,再考虑单独适配;当前不为未发生的差异提前引入 Spring AI 或 Provider 抽象。\n\n## 7. 常见问题\n\n### 返回 401 或 403\n\n先确认请求携带了登录态和 FlexBoot4 内部 API Key。`LLM_PROXY_API_KEY` 只能解决上游厂商鉴权,不能替代 FlexBoot4 的用户授权。\n\n### DeepSeek 返回 401\n\n通常是 `LLM_PROXY_API_KEY` 无效、未充值、环境变量未生效,或 APISIX 上游插件没有正确注入 `Authorization`。\n\n### DeepSeek 返回 404\n\n优先检查 `LLM_PROXY_CHAT_PATH`。直连 DeepSeek V4 推荐使用 `/chat/completions`;如果使用 `/v1/chat/completions`,需要确认当前官方接口是否仍兼容。\n\n### 模型不存在\n\n确认 `model` 为 `deepseek-v4-flash` 或 `deepseek-v4-pro`。不要在新配置中继续使用即将停用的 `deepseek-chat`、`deepseek-reasoner`。\n\n### AI 对话能用,知识库问答不能用\n\nRAG 还依赖 embedding 服务、向量库、知识库文件切片和 `kbId`。DeepSeek V4 只负责最终回答,不替代 embedding 和检索链路。\n\n## 8. 官方参考\n\n- [DeepSeek API: Your First API Call](https://api-docs.deepseek.com/)\n- [DeepSeek API: Models & Pricing](https://api-docs.deepseek.com/quick_start/pricing)\n- [DeepSeek V4 Preview Release](https://api-docs.deepseek.com/news/news260424)\n"}, "0af1197f3f2b1fa9fd166455cc291f0ce3225b60": {"t": 1785765701.086812, "n": 5813, "h": "9376b76b3aa6eef5", "c": "# AI 厂商模型接入指南\n\n本文说明 `flexboot4-ai` 如何接入 DeepSeek V4、OpenAI-compatible 云厂商模型或内部模型网关。当前方案保持直接、可控:\n\n- 不引入 Spring AI。\n- 不新增 `ChatProvider` 适配层。\n- 由 `LlmProxyClient` 使用 `WebClient` 转发 OpenAI-compatible Chat Completions 请求。\n- 厂商 API Key 只配置在后端环境变量中,前端不得持有。\n\n## 1. 接入边界\n\n`flexboot4-ai` 当前拆成两个明确入口:\n\n| 使用场景 | 前端页面 | 后端接口 | 上游调用 |\n| --- | --- | --- | --- |\n| AI 对话 | `运维管理 / AI 对话` | `POST /api/ai/chat`、`POST /api/ai/chat/stream` | 直接调用第三方或官方模型,不做 embedding 和知识库检索 |\n| 知识库问答 | `知识库 / 知识库问答` | `POST /api/ai/rag/chat`、`POST /api/ai/rag/chat/stream` | 先 embedding + 向量检索,再把知识库片段拼入 Chat Completions |\n\n因此,接入 DeepSeek、OpenAI-compatible 厂商或 APISIX 时,只需要调整 `llm-proxy` 指向。纯 AI 对话和 RAG 问答共用同一个上游模型出口,但业务流程不同。\n\n## 2. 配置项\n\n`flexboot4-ai/src/main/resources/application.yml` 已支持以下环境变量:\n\n| 环境变量 | 说明 | DeepSeek V4 示例 |\n| --- | --- | --- |\n| `LLM_PROXY_URL` | OpenAI-compatible base URL | `https://api.deepseek.com` |\n| `LLM_PROXY_CHAT_PATH` | Chat Completions 路径 | `/chat/completions` |\n| `LLM_PROXY_API_KEY` | 厂商官方 API Key。非空时后端转发会注入 `Authorization: Bearer ...` | `sk-...` |\n| `LLM_PROXY_DEFAULT_MODEL` | 纯 AI 对话未传 `model` 时使用的默认模型 | `deepseek-v4-flash` |\n| `AI_PRIMARY_MODEL` | RAG 问答未传 `model` 时使用的主模型 | `deepseek-v4-flash` |\n| `AI_FALLBACK_MODEL` | RAG 问答配额耗尽或路由兜底时使用的模型 | `deepseek-v4-flash` |\n\n注意区分两类 Key:\n\n- `LLM_PROXY_API_KEY` 是 DeepSeek、OpenAI 等厂商密钥,只能放在后端。\n- `X-AI-API-KEY` 是 FlexBoot4 自己的用户 API Key,用于用户授权、配额和审计。直连厂商官方 API 且配置了 `LLM_PROXY_API_KEY` 时,`LlmProxyClient` 不会把 `X-AI-API-KEY` 或前端传入的 `Authorization` 透传给厂商。\n\n## 3. 直连 DeepSeek V4\n\n截至 2026-06-09,DeepSeek 官方 API 文档给出的 OpenAI 兼容参数为:\n\n| 参数 | 值 |\n| --- | --- |\n| base URL | `https://api.deepseek.com` |\n| Chat Completions | `/chat/completions` |\n| V4 Flash | `deepseek-v4-flash` |\n| V4 Pro | `deepseek-v4-pro` |\n\n`deepseek-v4-flash` 适合作为默认模型;`deepseek-v4-pro` 适合更复杂的推理、编码和高质量问答。官方文档同时说明旧模型名 `deepseek-chat` 与 `deepseek-reasoner` 将在 2026-07-24 15:59 UTC 停用,因此新配置应直接使用 V4 模型名。\n\nWindows PowerShell:\n\n```powershell\n$env:LLM_PROXY_URL = \"https://api.deepseek.com\"\n$env:LLM_PROXY_CHAT_PATH = \"/chat/completions\"\n$env:LLM_PROXY_API_KEY = \"sk-...\"\n$env:LLM_PROXY_DEFAULT_MODEL = \"deepseek-v4-flash\"\n$env:AI_PRIMARY_MODEL = \"deepseek-v4-flash\"\n$env:AI_FALLBACK_MODEL = \"deepseek-v4-flash\"\n\n.\\gradlew.bat :flexboot4-ai:bootRun\n```\n\nLinux/macOS:\n\n```bash\nexport LLM_PROXY_URL=https://api.deepseek.com\nexport LLM_PROXY_CHAT_PATH=/chat/completions\nexport LLM_PROXY_API_KEY=sk-...\nexport LLM_PROXY_DEFAULT_MODEL=deepseek-v4-flash\nexport AI_PRIMARY_MODEL=deepseek-v4-flash\nexport AI_FALLBACK_MODEL=deepseek-v4-flash\n\n./gradlew :flexboot4-ai:bootRun\n```\n\n如果需要在纯 AI 对话中显式使用 V4 Pro 或开启 DeepSeek 特定参数,可以在请求体里传 OpenAI-compatible 字段。`/api/ai/chat` 会保留额外字段并原样转发:\n\n```json\n{\n \"model\": \"deepseek-v4-pro\",\n \"messages\": [\n { \"role\": \"system\", \"content\": \"你是企业 AI 助手。\" },\n { \"role\": \"user\", \"content\": \"请解释 FlexBoot4 的模块边界。\" }\n ],\n \"thinking\": { \"type\": \"enabled\" },\n \"reasoning_effort\": \"high\"\n}\n```\n\nRAG 问答接口当前只接收 `RagChatRequest` 中定义的字段,不透传任意厂商私有参数。需要控制 DeepSeek thinking mode 时,优先使用模型默认行为;如果业务确实需要在知识库问答里暴露这些参数,应明确扩展 `RagChatRequest` 和 RAG 组装逻辑。\n\n## 4. 接口验证\n\n启动 `flexboot4-ai` 后,可以先验证纯 AI 对话。下面示例需要替换为当前登录用户的 `access_token` 和 FlexBoot4 内部 `X-AI-API-KEY`:\n\n```bash\ncurl -N \"http://localhost:8081/api/ai/chat/stream\" \\\n -H \"Content-Type: application/json\" \\\n -H \"Cookie: access_token=<登录后的 JWT>\" \\\n -H \"X-AI-API-KEY: <FlexBoot4 用户 API Key>\" \\\n -d '{\n \"model\": \"deepseek-v4-flash\",\n \"messages\": [\n { \"role\": \"user\", \"content\": \"你好,请用一句话介绍 FlexBoot4。\" }\n ]\n }'\n```\n\n知识库问答需要已有知识库和向量数据,并且请求体必须带 `kbId`:\n\n```bash\ncurl -N \"http://localhost:8081/api/ai/rag/chat/stream\" \\\n -H \"Content-Type: application/json\" \\\n -H \"Cookie: access_token=<登录后的 JWT>\" \\\n -H \"X-AI-API-KEY: <FlexBoot4 用户 API Key>\" \\\n -d '{\n \"kbId\": \"<知识库 ID>\",\n \"query\": \"请根据知识库说明项目如何接入 DeepSeek V4。\",\n \"model\": \"deepseek-v4-flash\",\n \"topK\": 5\n }'\n```\n\n## 5. 通过 APISIX 汇聚多厂商\n\n如果需要统一管理多个模型、做限流、熔断、fallback 或观测,推荐让 `flexboot4-ai` 指向 APISIX:\n\n```powershell\n$env:LLM_PROXY_URL = \"http://127.0.0.1:9080\"\n$env:LLM_PROXY_CHAT_PATH = \"/v1/chat/completions\"\n$env:LLM_PROXY_API_KEY = \"\"\n$env:LLM_PROXY_DEFAULT_MODEL = \"deepseek-v4-flash\"\n```\n\n这种模式下:\n\n- `flexboot4-ai` 仍负责 JWT、用户 API Key、权限、配额和业务审计。\n- APISIX 负责上游模型实例、厂商密钥、路由、限流和 fallback。\n- `X-AI-API-KEY` 可以作为 APISIX consumer key 使用。\n- DeepSeek 官方密钥应配置在 APISIX 的上游插件或服务配置中,而不是前端。\n\nAPISIX 示例见 [APISIX AI Gateway 对接](https://github.com/airflowshu/flexboot4/blob/master/flexboot4-ai/docs/apisix-ai.md)。\n\n## 6. 接入其它 OpenAI-compatible 厂商\n\n接入其它厂商时按同一流程处理:\n\n1. 确认厂商是否支持 Chat Completions 兼容接口。\n2. 设置 `LLM_PROXY_URL` 为厂商 base URL。\n3. 设置 `LLM_PROXY_CHAT_PATH` 为厂商 Chat Completions 路径,例如 `/v1/chat/completions` 或 `/chat/completions`。\n4. 设置 `LLM_PROXY_API_KEY`,让后端统一注入 `Authorization: Bearer ...`。\n5. 设置 `LLM_PROXY_DEFAULT_MODEL`、`AI_PRIMARY_MODEL`、`AI_FALLBACK_MODEL`。\n6. 用 `/api/ai/chat/stream` 验证纯 AI 对话,再用 `/api/ai/rag/chat/stream` 验证知识库问答。\n\n如果厂商不是 OpenAI-compatible Chat Completions 形态,再考虑单独适配;当前不为未发生的差异提前引入 Spring AI 或 Provider 抽象。\n\n## 7. 常见问题\n\n### 返回 401 或 403\n\n先确认请求携带了登录态和 FlexBoot4 内部 API Key。`LLM_PROXY_API_KEY` 只能解决上游厂商鉴权,不能替代 FlexBoot4 的用户授权。\n\n### DeepSeek 返回 401\n\n通常是 `LLM_PROXY_API_KEY` 无效、未充值、环境变量未生效,或 APISIX 上游插件没有正确注入 `Authorization`。\n\n### DeepSeek 返回 404\n\n优先检查 `LLM_PROXY_CHAT_PATH`。直连 DeepSeek V4 推荐使用 `/chat/completions`;如果使用 `/v1/chat/completions`,需要确认当前官方接口是否仍兼容。\n\n### 模型不存在\n\n确认 `model` 为 `deepseek-v4-flash` 或 `deepseek-v4-pro`。不要在新配置中继续使用即将停用的 `deepseek-chat`、`deepseek-reasoner`。\n\n### AI 对话能用,知识库问答不能用\n\nRAG 还依赖 embedding 服务、向量库、知识库文件切片和 `kbId`。DeepSeek V4 只负责最终回答,不替代 embedding 和检索链路。\n\n## 8. 官方参考\n\n- [DeepSeek API: Your First API Call](https://api-docs.deepseek.com/)\n- [DeepSeek API: Models & Pricing](https://api-docs.deepseek.com/quick_start/pricing)\n- [DeepSeek V4 Preview Release](https://api-docs.deepseek.com/news/news260424)\n"}}}}