File size: 4,626 Bytes
a86303a
59731a8
5217381
 
 
 
 
59731a8
5217381
c0139c7
5217381
59731a8
5217381
59731a8
 
c0139c7
 
 
 
 
 
 
 
 
 
 
 
 
59731a8
 
 
c0139c7
59731a8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5217381
 
c0139c7
 
 
59731a8
 
 
 
 
5217381
 
 
 
 
 
 
59731a8
 
c0139c7
 
 
 
 
 
5217381
 
 
 
c0139c7
 
 
 
 
 
 
59731a8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5217381
 
 
59731a8
 
5217381
59731a8
 
 
5217381
59731a8
5217381
 
59731a8
 
 
 
5217381
59731a8
5217381
c0139c7
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
---

title: NVIDIA NIM 响应网关
sdk: docker
app_port: 7860
pinned: false
---


# NVIDIA NIM 响应网关

这是一个面向公开使用的 NVIDIA NIM 兼容网关,同时支持 OpenAI `/v1/responses` 和 Anthropic `/v1/messages` 风格请求。

它不在本地保存任何用户的 NIM API Key。用户调用本项目时,需要自己通过请求头携带 NIM Key,网关只负责协议转换、性能优化、聚合统计和官方模型目录展示。

## 主要能力

- 将 NVIDIA 官方 `POST /v1/chat/completions` 转换为 OpenAI 风格的 `POST /v1/responses`
- 将 NVIDIA 官方 `POST /v1/chat/completions` 转换为 Anthropic 风格的 `POST /v1/messages`
- 支持 tool calling / function calling
- 支持 Anthropic `tools` / `tool_choice` / `tool_result` 以及 Claude Code 常见的客户端工具调用形态
- 支持 `function_call_output` 回灌
- 支持 `previous_response_id` 对话续写
-`/v1/responses``/v1/responses/{response_id}` 使用用户自带的 NIM Key 做鉴权与上游转发
-`/v1/messages` 使用用户自带的 NIM Key 做鉴权与上游转发,并支持 Anthropic SSE 风格流式事件
- `/v1/models` 直接返回来自 NVIDIA 官方 `/v1/models` 的同步结果,保持 OpenAI 风格结构
- `/` 为白色主题的模型健康度页面,按 10 分钟成功率矩阵展示 MODEL_LIST 中的模型
- `/model_list` 为独立的白色主题官方模型列表页面,支持按提供商筛选模型
- 模型提供商卡片为固定高度,避免模型较多时卡片过长
- 使用共享 HTTP 连接池、SQLite WAL 和异步线程化落库来增强高并发场景下的转发性能

## 用户如何调用

对于 `POST /v1/responses``POST /v1/messages`,请通过下面任意一种方式传入你自己的 NVIDIA NIM Key:

- `Authorization: Bearer <你的 NIM Key>`
- `X-API-Key: <你的 NIM Key>`

网关不会把原始 Key 持久化到数据库中,只会在内存中用于当前请求,并对响应链路使用 Key 哈希做隔离。

## 官方模型目录同步

项目会定时从官方接口拉取模型列表:




`https://integrate.api.nvidia.com/v1/models`

同步后的模型目录同时用于:


- `GET /v1/models`
- `GET /models`
- `GET /api/catalog`

## 页面与接口












页面:

- `GET /`:模型健康度页面
- `GET /model_list`:官方模型列表页面

前端数据接口:

- `GET /api/dashboard`
- `GET /api/catalog`

兼容接口:

- `POST /v1/responses`
- `POST /v1/messages`
- `GET /v1/responses/{response_id}`
- `GET /v1/models`
- `GET /models`

## 环境变量

- `NVIDIA_API_BASE`:默认 `https://integrate.api.nvidia.com/v1`
- `MODEL_LIST`:健康度页面监控模型列表,逗号分隔
- `MODEL_SYNC_INTERVAL_MINUTES`:官方模型目录同步周期,默认 `30`
- `PUBLIC_HISTORY_BUCKETS`:健康页展示最近多少个 10 分钟时间片,默认 `6`
- `REQUEST_TIMEOUT_SECONDS`:上游请求超时,默认 `90`
- `MAX_UPSTREAM_CONNECTIONS`:共享连接池最大连接数,默认 `512`
- `MAX_KEEPALIVE_CONNECTIONS`:共享连接池最大 keep-alive 连接数,默认 `128`
- `DATABASE_PATH`:默认 `./data.sqlite3`

## 本地验证

我已经完成两层本地联调:









1. Mock 联调:
   - 通过 `scripts/local_smoke_test.py` 验证了协议转换、官方模型同步、用户 Key 鉴权、`previous_response_id`、tool call、健康页数据接口、模型页数据接口和两个独立页面路由。

2. 真实上游联调:
   - 通过 `scripts/live_e2e_validation.py` 使用提供的测试 NIM Key,真实调用了 NVIDIA 官方模型目录和实际模型响应。
   - 实测结果:`live_gateway_ok`,并成功通过 `z-ai/glm5` 得到 `OK`## 部署到 Hugging Face Space


1. 新建 Hugging Face Space,SDK 选择 `Docker`
2.`hf_space` 目录内的内容作为 Space 根目录上传
3. 按需配置 `MODEL_LIST` 等环境变量
4. 启动后即可直接公开使用

## 参考资料

- OpenAI Responses API: https://platform.openai.com/docs/guides/responses-vs-chat-completions
- OpenAI Function Calling: https://platform.openai.com/docs/guides/function-calling
- Anthropic Messages API: https://docs.anthropic.com/en/api/messages
- Anthropic Tool Use: https://docs.anthropic.com/en/docs/agents-and-tools/tool-use/overview
- NVIDIA Build: https://build.nvidia.com/
- NVIDIA NIM API 文档: https://docs.api.nvidia.com/
- NVIDIA NIM + Claude Code 集成: https://docs.nvidia.com/nim/large-language-models/latest/ai-assistant-integrations/claude-code.html