@templmf/temp-solf-lmf 0.0.43 → 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.
- package/ai-gateway/.env +42 -0
- package/ai-gateway/README.md +295 -0
- package/ai-gateway/package-lock.json +1370 -0
- package/ai-gateway/package.json +18 -0
- package/ai-gateway/src/index.js +132 -0
- package/ai-gateway/src/middleware/auth.js +45 -0
- package/ai-gateway/src/middleware/rateLimit.js +87 -0
- package/ai-gateway/src/routes/chat.js +657 -0
- package/ai-gateway/src/skills/detector.js +145 -0
- package/ai-gateway/src/skills/html.md +18 -0
- package/ai-gateway/src/skills/markdown.md +18 -0
- package/ai-gateway/src/skills/react.md +27 -0
- package/ai-gateway/src/skills/registry.js +441 -0
- package/ai-gateway/src/skills/skill-creator/LICENSE.txt +202 -0
- package/ai-gateway/src/skills/skill-creator/SKILL.md +485 -0
- package/ai-gateway/src/skills/skill-creator/agents/analyzer.md +274 -0
- package/ai-gateway/src/skills/skill-creator/agents/comparator.md +202 -0
- package/ai-gateway/src/skills/skill-creator/agents/grader.md +223 -0
- package/ai-gateway/src/skills/skill-creator/assets/eval_review.html +146 -0
- package/ai-gateway/src/skills/skill-creator/eval-viewer/generate_review.py +471 -0
- package/ai-gateway/src/skills/skill-creator/eval-viewer/viewer.html +1325 -0
- package/ai-gateway/src/skills/skill-creator/references/schemas.md +430 -0
- package/ai-gateway/src/skills/skill-creator/scripts/__init__.py +0 -0
- package/ai-gateway/src/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
- package/ai-gateway/src/skills/skill-creator/scripts/generate_report.py +326 -0
- package/ai-gateway/src/skills/skill-creator/scripts/improve_description.py +247 -0
- package/ai-gateway/src/skills/skill-creator/scripts/package_skill.py +136 -0
- package/ai-gateway/src/skills/skill-creator/scripts/quick_validate.py +103 -0
- package/ai-gateway/src/skills/skill-creator/scripts/run_eval.py +310 -0
- package/ai-gateway/src/skills/skill-creator/scripts/run_loop.py +328 -0
- package/ai-gateway/src/skills/skill-creator/scripts/utils.py +47 -0
- package/ai-gateway/src/skills/skill-creator/skill-creator.skill +0 -0
- package/ai-gateway/src/skills/ticket.md +36 -0
- package/ai-gateway/src/skills/vue.md +31 -0
- package/ai-gateway/src/utils/logger.js +21 -0
- package/ai-gateway/src/utils/retry.js +90 -0
- package/ai-gateway/src/utils/sessionManager.js +159 -0
- package/ai-gateway/src/utils/structuredResponse.js +144 -0
- package/ai-gateway/src/utils/toolAdapter.js +151 -0
- package/package.json +1 -1
- package//345/216/213/347/274/251/345/220/216/347/232/204/346/226/207/344/273/266.7z +0 -0
- package/skill-mcp/README.md +0 -74
- package/skill-mcp/index.ts +0 -336
- package/skill-mcp/package (1).json +0 -19
- package/skill-mcp/tsconfig.json +0 -16
- package//347/247/273/345/212/250/345/272/224/347/224/250/345/217/260/350/264/246/347/247/273/344/272/244/346/270/205/345/215/225.xlsx +0 -0
package/ai-gateway/.env
ADDED
|
@@ -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
|
+
```
|