@templmf/temp-solf-lmf 0.0.44 → 0.0.45

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/ai-gateway/.env +42 -0
  2. package/ai-gateway/README.md +295 -0
  3. package/ai-gateway/package-lock.json +1370 -0
  4. package/ai-gateway/package.json +18 -0
  5. package/ai-gateway/src/index.js +132 -0
  6. package/ai-gateway/src/middleware/auth.js +45 -0
  7. package/ai-gateway/src/middleware/rateLimit.js +87 -0
  8. package/ai-gateway/src/routes/chat.js +657 -0
  9. package/ai-gateway/src/skills/detector.js +145 -0
  10. package/ai-gateway/src/skills/html.md +18 -0
  11. package/ai-gateway/src/skills/markdown.md +18 -0
  12. package/ai-gateway/src/skills/react.md +27 -0
  13. package/ai-gateway/src/skills/registry.js +441 -0
  14. package/ai-gateway/src/skills/skill-creator/LICENSE.txt +202 -0
  15. package/ai-gateway/src/skills/skill-creator/SKILL.md +485 -0
  16. package/ai-gateway/src/skills/skill-creator/agents/analyzer.md +274 -0
  17. package/ai-gateway/src/skills/skill-creator/agents/comparator.md +202 -0
  18. package/ai-gateway/src/skills/skill-creator/agents/grader.md +223 -0
  19. package/ai-gateway/src/skills/skill-creator/assets/eval_review.html +146 -0
  20. package/ai-gateway/src/skills/skill-creator/eval-viewer/generate_review.py +471 -0
  21. package/ai-gateway/src/skills/skill-creator/eval-viewer/viewer.html +1325 -0
  22. package/ai-gateway/src/skills/skill-creator/references/schemas.md +430 -0
  23. package/ai-gateway/src/skills/skill-creator/scripts/__init__.py +0 -0
  24. package/ai-gateway/src/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
  25. package/ai-gateway/src/skills/skill-creator/scripts/generate_report.py +326 -0
  26. package/ai-gateway/src/skills/skill-creator/scripts/improve_description.py +247 -0
  27. package/ai-gateway/src/skills/skill-creator/scripts/package_skill.py +136 -0
  28. package/ai-gateway/src/skills/skill-creator/scripts/quick_validate.py +103 -0
  29. package/ai-gateway/src/skills/skill-creator/scripts/run_eval.py +310 -0
  30. package/ai-gateway/src/skills/skill-creator/scripts/run_loop.py +328 -0
  31. package/ai-gateway/src/skills/skill-creator/scripts/utils.py +47 -0
  32. package/ai-gateway/src/skills/skill-creator/skill-creator.skill +0 -0
  33. package/ai-gateway/src/skills/ticket.md +36 -0
  34. package/ai-gateway/src/skills/vue.md +31 -0
  35. package/ai-gateway/src/utils/logger.js +21 -0
  36. package/ai-gateway/src/utils/retry.js +90 -0
  37. package/ai-gateway/src/utils/sessionManager.js +159 -0
  38. package/ai-gateway/src/utils/structuredResponse.js +144 -0
  39. package/ai-gateway/src/utils/toolAdapter.js +151 -0
  40. package/package.json +1 -1
@@ -0,0 +1,42 @@
1
+ # ════════════════════════════════════════════
2
+ # AI Gateway 配置文件
3
+ # 复制为 .env 后填写实际值
4
+ # ════════════════════════════════════════════
5
+
6
+ # ── 上游模型服务(内网 Qwen)────────────────
7
+ UPSTREAM_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1
8
+ UPSTREAM_API_KEY=sk-d88521262e58456384f6a4af78f6afcc
9
+ UPSTREAM_TIMEOUT_MS=120000
10
+
11
+ # 默认模型(请求未指定 model 时使用)
12
+ DEFAULT_MODEL=qwen3-coder-30b-a3b-instruct
13
+
14
+ # 所有可用模型(逗号分隔,用于 /v1/models 接口)
15
+ AVAILABLE_MODELS=qwen3-coder-30b-a3b-instruct,
16
+
17
+ # ── 网关自身配置 ─────────────────────────────
18
+ PORT=3000
19
+
20
+ # 客户端调用网关时需要携带的 Key(逗号分隔)
21
+ # 留空则跳过鉴权(仅开发环境)
22
+ # 生成示例: node -e "console.log('gw-' + require('crypto').randomBytes(16).toString('hex'))"
23
+ GATEWAY_API_KEYS=gw-4c0a15b223a012b8e5d85763def024af
24
+
25
+ # ── 限流配置 ─────────────────────────────────
26
+ RATE_LIMIT_WINDOW_MS=60000
27
+ RATE_LIMIT_MAX_PER_CLIENT=100
28
+ RATE_LIMIT_MAX_PER_IP=200
29
+
30
+ # ── 会话配置 ─────────────────────────────────
31
+ SESSION_TTL_MS=86400000
32
+ MAX_HISTORY_MESSAGES=50
33
+ MAX_CONTEXT_TOKENS=6000
34
+
35
+ # ── Skill 配置 ────────────────────────────────
36
+ SKILLS_DIR=./src/skills
37
+
38
+ # ── 日志 ─────────────────────────────────────
39
+ LOG_LEVEL=info
40
+
41
+ # ── 开启 AI 筛选 ───────────────────────────────────
42
+ USE_AI_SKILL_DETECTION=true
@@ -0,0 +1,295 @@
1
+ # AI Gateway
2
+
3
+ 内网 AI API 网关服务,兼容 OpenAI 格式,对接 Qwen 等内网模型。
4
+
5
+ ## 功能特性
6
+
7
+ - **单一接口**:`POST /v1/chat/completions`,完全兼容 OpenAI 格式
8
+ - **Skill 自动加载**:根据对话内容自动检测并注入对应操作规范
9
+ - **结构化响应**:支持 JSON、Markdown、HTML、React/Vue 组件、提单表单等结构化输出
10
+ - **Tool Use 适配**:自动处理不同模型的 function calling 差异(含 qwen3-coder)
11
+ - **Streaming**:SSE 流式输出透传,自动过滤 qwen3 thinking block
12
+ - **VSCode Roo 兼容**:提供 `/v1/models` 接口,可直接配置为 Roo 的 AI Provider
13
+
14
+ ---
15
+
16
+ ## 快速开始
17
+
18
+ ```bash
19
+ # 1. 安装依赖
20
+ npm install
21
+
22
+ # 2. 配置环境变量
23
+ cp .env.example .env
24
+ # 编辑 .env,填写内网 Qwen 服务地址和 Key
25
+
26
+ # 3. 启动
27
+ npm start
28
+
29
+ # 开发模式(文件变更自动重启)
30
+ npm run dev
31
+ ```
32
+
33
+ ---
34
+
35
+ ## 环境变量说明
36
+
37
+ | 变量名 | 必填 | 说明 |
38
+ |--------|------|------|
39
+ | `UPSTREAM_BASE_URL` | ✅ | 内网 Qwen 服务地址,如 `http://192.168.1.100:8000/v1` |
40
+ | `UPSTREAM_API_KEY` | ✅ | 内网 Qwen 服务的 API Key |
41
+ | `DEFAULT_MODEL` | ✅ | 默认模型名,如 `qwen2.5-72b-instruct` |
42
+ | `GATEWAY_API_KEYS` | 推荐 | 客户端调用网关时需要的 Key,逗号分隔,留空则跳过鉴权 |
43
+ | `AVAILABLE_MODELS` | 否 | 模型列表,逗号分隔,用于 `/v1/models` 接口 |
44
+ | `PORT` | 否 | 监听端口,默认 `3000` |
45
+ | `SKILLS_DIR` | 否 | Skill 文件目录,默认 `./src/skills` |
46
+
47
+ ---
48
+
49
+ ## 接口说明
50
+
51
+ ### POST /v1/chat/completions
52
+
53
+ 标准 OpenAI 格式,额外支持以下网关扩展字段:
54
+
55
+ #### 网关扩展字段
56
+
57
+ | 字段 | 类型 | 说明 |
58
+ |------|------|------|
59
+ | `response_format` | object/string | 结构化输出格式(见下方) |
60
+ | `x_skill_override` | string/array | 手动指定加载哪些 Skill,跳过自动检测 |
61
+ | `x_keep_thinking` | boolean | 是否保留 qwen3-coder 的 thinking block,默认 false |
62
+
63
+ #### response_format 支持的类型
64
+
65
+ | type | 说明 |
66
+ |------|------|
67
+ | `json_object` | 通用 JSON 对象 |
68
+ | `json_schema` | 按指定 Schema 返回,需同时传 `schema` 字段 |
69
+ | `markdown` | Markdown 文档 |
70
+ | `html` | HTML 片段 |
71
+ | `ticket_form` | 提单助手专用,返回 `{reply, form_draft, missing_fields, is_complete}` |
72
+ | `react_component` | React JSX 组件代码 |
73
+ | `vue_component` | Vue 3 SFC 代码 |
74
+
75
+ #### 响应中的额外字段
76
+
77
+ 网关在响应体中追加 `_gateway` 字段:
78
+ ```json
79
+ {
80
+ "_gateway": {
81
+ "request_id": "uuid",
82
+ "skills_loaded": ["ticket", "markdown"],
83
+ "model_caps": { "toolSupport": "native" },
84
+ "latency_ms": 320
85
+ }
86
+ }
87
+ ```
88
+
89
+ 对于 JSON 类 `response_format`,每个 choice 额外包含:
90
+ - `message.parsed`:已解析的 JSON 对象(直接可用,无需再 JSON.parse)
91
+ - `message.parse_error`:解析失败时的错误信息
92
+
93
+ ---
94
+
95
+ ## 使用示例
96
+
97
+ ### 基础对话
98
+
99
+ ```bash
100
+ curl http://localhost:3000/v1/chat/completions \
101
+ -H "Authorization: Bearer gw-key-abc123" \
102
+ -H "Content-Type: application/json" \
103
+ -d '{
104
+ "model": "qwen2.5-72b-instruct",
105
+ "messages": [{"role": "user", "content": "你好"}]
106
+ }'
107
+ ```
108
+
109
+ ### 提单助手(自动加载 ticket skill)
110
+
111
+ ```bash
112
+ curl http://localhost:3000/v1/chat/completions \
113
+ -H "Authorization: Bearer gw-key-abc123" \
114
+ -H "Content-Type: application/json" \
115
+ -d '{
116
+ "messages": [{"role": "user", "content": "我要提一个生产环境数据库连接超时的故障单"}],
117
+ "response_format": { "type": "ticket_form" }
118
+ }'
119
+ ```
120
+
121
+ 响应示例:
122
+ ```json
123
+ {
124
+ "choices": [{
125
+ "message": {
126
+ "content": "{\"reply\":\"好的,这是一个故障单。严重程度是 P1 还是 P2?\",\"form_draft\":{\"title\":\"生产环境数据库连接超时\",\"type\":\"incident\",\"affected_system\":\"数据库\"},\"missing_fields\":[\"severity\",\"description\"],\"is_complete\":false}",
127
+ "parsed": {
128
+ "reply": "好的,这是一个故障单。严重程度是 P1 还是 P2?",
129
+ "form_draft": { "title": "生产环境数据库连接超时", "type": "incident" },
130
+ "missing_fields": ["severity", "description"],
131
+ "is_complete": false
132
+ }
133
+ }
134
+ }],
135
+ "_gateway": { "skills_loaded": ["ticket"], "latency_ms": 450 }
136
+ }
137
+ ```
138
+
139
+ ### Markdown 文档生成
140
+
141
+ ```bash
142
+ curl http://localhost:3000/v1/chat/completions \
143
+ -H "Authorization: Bearer gw-key-abc123" \
144
+ -H "Content-Type: application/json" \
145
+ -d '{
146
+ "messages": [{"role": "user", "content": "写一份 Redis 缓存设计规范文档"}],
147
+ "response_format": { "type": "markdown" }
148
+ }'
149
+ ```
150
+
151
+ ### JSON Schema 结构化输出
152
+
153
+ ```bash
154
+ curl http://localhost:3000/v1/chat/completions \
155
+ -H "Authorization: Bearer gw-key-abc123" \
156
+ -H "Content-Type: application/json" \
157
+ -d '{
158
+ "messages": [{"role": "user", "content": "提取以下文本中的人名和职位:张三是产品经理,李四是工程师"}],
159
+ "response_format": {
160
+ "type": "json_schema",
161
+ "schema": {
162
+ "type": "object",
163
+ "properties": {
164
+ "people": {
165
+ "type": "array",
166
+ "items": {
167
+ "type": "object",
168
+ "properties": {
169
+ "name": { "type": "string" },
170
+ "role": { "type": "string" }
171
+ }
172
+ }
173
+ }
174
+ }
175
+ }
176
+ }
177
+ }'
178
+ ```
179
+
180
+ ### qwen3-coder Tool Use
181
+
182
+ ```bash
183
+ curl http://localhost:3000/v1/chat/completions \
184
+ -H "Authorization: Bearer gw-key-abc123" \
185
+ -H "Content-Type: application/json" \
186
+ -d '{
187
+ "model": "qwen3-coder",
188
+ "messages": [{"role": "user", "content": "查询用户 ID 为 123 的订单"}],
189
+ "tools": [{
190
+ "type": "function",
191
+ "function": {
192
+ "name": "get_orders",
193
+ "description": "查询用户订单",
194
+ "parameters": {
195
+ "type": "object",
196
+ "properties": {
197
+ "user_id": { "type": "string" }
198
+ },
199
+ "required": ["user_id"]
200
+ }
201
+ }
202
+ }]
203
+ }'
204
+ ```
205
+
206
+ ### 手动指定 Skill(跳过自动检测)
207
+
208
+ ```bash
209
+ curl http://localhost:3000/v1/chat/completions \
210
+ -H "Authorization: Bearer gw-key-abc123" \
211
+ -H "Content-Type: application/json" \
212
+ -d '{
213
+ "messages": [{"role": "user", "content": "帮我写一个登录表单"}],
214
+ "x_skill_override": ["react", "html"],
215
+ "response_format": { "type": "react_component" }
216
+ }'
217
+ ```
218
+
219
+ ### Streaming
220
+
221
+ ```bash
222
+ curl http://localhost:3000/v1/chat/completions \
223
+ -H "Authorization: Bearer gw-key-abc123" \
224
+ -H "Content-Type: application/json" \
225
+ -d '{
226
+ "messages": [{"role": "user", "content": "写一篇关于微服务架构的技术博客"}],
227
+ "stream": true
228
+ }'
229
+ ```
230
+
231
+ ---
232
+
233
+ ## VSCode Roo 配置
234
+
235
+ 在 Roo 的 AI Provider 配置中填写:
236
+
237
+ ```
238
+ API Provider: OpenAI Compatible
239
+ Base URL: http://localhost:3000/v1
240
+ API Key: gw-key-abc123 (GATEWAY_API_KEYS 中配置的任意一个)
241
+ Model: qwen2.5-72b-instruct
242
+ ```
243
+
244
+ Roo 会自动请求 `/v1/models` 获取模型列表。
245
+
246
+ ---
247
+
248
+ ## Skill 文件管理
249
+
250
+ 在 `src/skills/` 目录下放置 `.md` 文件,文件名对应 `registry.js` 中的定义:
251
+
252
+ ```
253
+ src/skills/
254
+ ticket.md 提单助手规范
255
+ markdown.md Markdown 生成规范
256
+ html.md HTML 生成规范
257
+ react.md React 组件规范
258
+ vue.md Vue 组件规范
259
+ docx.md Word 文档生成规范(可从 docx skill 复制)
260
+ pptx.md PPT 生成规范
261
+ xlsx.md Excel 生成规范
262
+ ```
263
+
264
+ 添加新 Skill:
265
+ 1. 在 `src/skills/` 放入 `.md` 文件
266
+ 2. 在 `src/skills/registry.js` 的 `SKILL_DEFINITIONS` 中添加对应条目
267
+ 3. 重启服务,`/health` 接口会显示新 Skill 的加载状态
268
+
269
+ ---
270
+
271
+ ## 项目结构
272
+
273
+ ```
274
+ ai-gateway/
275
+ ├── src/
276
+ │ ├── index.js 入口,路由注册,服务启动
277
+ │ ├── middleware/
278
+ │ │ └── auth.js API Key 鉴权
279
+ │ ├── routes/
280
+ │ │ └── chat.js POST /v1/chat/completions 核心逻辑
281
+ │ ├── skills/
282
+ │ │ ├── registry.js Skill 注册表、加载器、自动检测
283
+ │ │ ├── ticket.md 提单助手 Skill
284
+ │ │ ├── markdown.md Markdown Skill
285
+ │ │ ├── html.md HTML Skill
286
+ │ │ ├── react.md React Skill
287
+ │ │ └── vue.md Vue Skill
288
+ │ └── utils/
289
+ │ ├── toolAdapter.js Tool Use 多模型适配
290
+ │ ├── structuredResponse.js 结构化响应协议
291
+ │ └── logger.js 日志
292
+ ├── .env.example
293
+ ├── package.json
294
+ └── README.md
295
+ ```