liuw15 commited on
Commit
3e88acd
·
1 Parent(s): eea4d8a

更新README.md

Browse files
Files changed (2) hide show
  1. README.md +157 -78
  2. test-conversion.js +0 -122
README.md CHANGED
@@ -1,27 +1,33 @@
1
  # Antigravity to OpenAI API 代理服务
2
 
3
- 将 Google Antigravity API 转换为 OpenAI 兼容格式的代理服务,支持流式和非流式响应。
4
 
5
  ## 功能特性
6
 
7
  - ✅ OpenAI API 兼容格式
8
- - ✅ 支持流式和非流式响应
9
- - ✅ 自动 Token 管理和刷新
10
- - ✅ 多账户支持
11
- - ✅ 思维链输出(thinking)
12
- - ✅ 完整的日志记录
 
 
 
 
 
 
13
 
14
  ## 快速开始
15
 
16
- ### 安装依赖
17
 
18
  ```bash
19
  npm install
20
  ```
21
 
22
- ### 配置
23
 
24
- 编辑 `config.json` 配置文件:
25
 
26
  ```json
27
  {
@@ -29,127 +35,200 @@ npm install
29
  "port": 8045,
30
  "host": "0.0.0.0"
31
  },
32
- "api": {
33
- "url": "https://daily-cloudcode-pa.sandbox.googleapis.com/v1internal:streamGenerateContent?alt=sse",
34
- "modelsUrl": "https://daily-cloudcode-pa.sandbox.googleapis.com/v1internal:fetchAvailableModels",
35
- "host": "daily-cloudcode-pa.sandbox.googleapis.com",
36
- "userAgent": "antigravity/1.11.3 windows/amd64"
37
- },
38
- "defaults": {
39
- "temperature": 1,
40
- "top_p": 0.85,
41
- "top_k": 100,
42
- "max_tokens": 8096
43
- },
44
  "security": {
45
- "maxRequestSize": "50mb",
46
- "apiKey": "your-api-key-here"
47
  }
48
  }
49
  ```
50
 
51
- 配置说明:
52
- - `apiKey`: 设置 API Key 以保护 /v1 端点,留空或设为 null 则不启用验证
53
-
54
- ### 账户登录
55
-
56
- 运行 OAuth 服务器进行账户授权:
57
 
58
  ```bash
59
  npm run login
60
  ```
61
 
62
- 按照提示完成 Google 账户授权,账户信息将保存在 `accounts.json`。
63
 
64
- ### 启动服务
65
 
66
  ```bash
67
  npm start
68
  ```
69
 
70
- 开发模式(自动重启):
 
 
 
 
71
 
72
  ```bash
73
- npm run dev
 
74
  ```
75
 
76
- ## API 端点
77
-
78
- ### 获取可用模型
79
 
80
  ```bash
81
- GET http://localhost:8045/v1/models
 
 
 
 
 
 
 
82
  ```
83
 
84
- ### 聊天补全
85
 
86
  ```bash
87
- POST http://localhost:8045/v1/chat/completions
88
- Content-Type: application/json
 
 
 
 
 
 
 
89
 
90
- {
91
- "model": "claude-sonnet-4-5-thinking",
92
- "messages": [
93
- {"role": "user", "content": "Hello"}
94
- ],
95
- "stream": true
96
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
97
  ```
98
 
99
- ## 使用示例
100
 
101
- ### cURL
102
 
103
  ```bash
104
  curl http://localhost:8045/v1/chat/completions \
105
  -H "Content-Type: application/json" \
106
- -H "Authorization: Bearer your-api-key-here" \
107
  -d '{
108
- "model": "claude-sonnet-4-5-thinking",
109
- "messages": [{"role": "user", "content": "你好"}],
 
 
 
 
 
 
 
 
 
 
 
110
  "stream": true
111
  }'
112
  ```
113
 
114
- ### Python
 
 
 
 
 
 
115
 
116
- ```python
117
- import openai
118
 
119
- client = openai.OpenAI(
120
- base_url="http://localhost:8045/v1",
121
- api_key="your-api-key-here"
122
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
123
 
124
- response = client.chat.completions.create(
125
- model="claude-sonnet-4-5-thinking",
126
- messages=[{"role": "user", "content": "你好"}],
127
- stream=True
128
- )
129
 
130
- for chunk in response:
131
- print(chunk.choices[0].delta.content, end="")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
132
  ```
133
 
134
  ## 项目结构
135
 
136
  ```
137
  .
138
- ├── server.js # 主服务器
139
- ├── api.js # API 调用逻辑
140
- ├── oauth-server.js # OAuth 授权服务器
141
- ├── token_manager.js # Token 管理
142
- ├── utils.js # 工具函数
143
- ├── logger.js # 日志模块
144
- ├── config.json # 配置文件
145
- ├── accounts.json # 账户信息(自动生成)
146
- └── package.json # 项目配置
 
147
  ```
148
 
149
- ## 环境要求
150
 
151
- - Node.js >= 18.0.0
 
 
 
 
152
 
153
- ## 许可证
154
 
155
  MIT
 
1
  # Antigravity to OpenAI API 代理服务
2
 
3
+ 将 Google Antigravity API 转换为 OpenAI 兼容格式的代理服务,支持流式响应、工具调用和多账号管理。
4
 
5
  ## 功能特性
6
 
7
  - ✅ OpenAI API 兼容格式
8
+ - ✅ 流式和非流式响应
9
+ - ✅ 工具调用(Function Calling)支持
10
+ - ✅ 多账号自动轮换
11
+ - ✅ Token 自动刷新
12
+ - ✅ API Key 认证
13
+ - ✅ 思维链(Thinking)输出
14
+ - ✅ 图片输入支持(Base64 编码)
15
+
16
+ ## 环境要求
17
+
18
+ - Node.js >= 18.0.0
19
 
20
  ## 快速开始
21
 
22
+ ### 1. 安装依赖
23
 
24
  ```bash
25
  npm install
26
  ```
27
 
28
+ ### 2. 配置文件
29
 
30
+ 编辑 `config.json` 配置服务器和 API 参数:
31
 
32
  ```json
33
  {
 
35
  "port": 8045,
36
  "host": "0.0.0.0"
37
  },
 
 
 
 
 
 
 
 
 
 
 
 
38
  "security": {
39
+ "apiKey": "sk-text"
 
40
  }
41
  }
42
  ```
43
 
44
+ ### 3. 登录获取 Token
 
 
 
 
 
45
 
46
  ```bash
47
  npm run login
48
  ```
49
 
50
+ 浏览器会自动打开 Google 授权页面,授权后 Token 会保存到 `accounts.json`。
51
 
52
+ ### 4. 启动服务
53
 
54
  ```bash
55
  npm start
56
  ```
57
 
58
+ 服务将在 `http://localhost:8045` 启动。
59
+
60
+ ## API 使用
61
+
62
+ ### 获取模型列表
63
 
64
  ```bash
65
+ curl http://localhost:8045/v1/models \
66
+ -H "Authorization: Bearer sk-text"
67
  ```
68
 
69
+ ### 聊天补全(流式)
 
 
70
 
71
  ```bash
72
+ curl http://localhost:8045/v1/chat/completions \
73
+ -H "Content-Type: application/json" \
74
+ -H "Authorization: Bearer sk-text" \
75
+ -d '{
76
+ "model": "gemini-2.0-flash-exp",
77
+ "messages": [{"role": "user", "content": "你好"}],
78
+ "stream": true
79
+ }'
80
  ```
81
 
82
+ ### 聊天补全(非流式)
83
 
84
  ```bash
85
+ curl http://localhost:8045/v1/chat/completions \
86
+ -H "Content-Type: application/json" \
87
+ -H "Authorization: Bearer sk-text" \
88
+ -d '{
89
+ "model": "gemini-2.0-flash-exp",
90
+ "messages": [{"role": "user", "content": "你好"}],
91
+ "stream": false
92
+ }'
93
+ ```
94
 
95
+ ### 工具调用示例
96
+
97
+ ```bash
98
+ curl http://localhost:8045/v1/chat/completions \
99
+ -H "Content-Type: application/json" \
100
+ -H "Authorization: Bearer sk-text" \
101
+ -d '{
102
+ "model": "gemini-2.0-flash-exp",
103
+ "messages": [{"role": "user", "content": "北京天气怎么样"}],
104
+ "tools": [{
105
+ "type": "function",
106
+ "function": {
107
+ "name": "get_weather",
108
+ "description": "获取天气信息",
109
+ "parameters": {
110
+ "type": "object",
111
+ "properties": {
112
+ "location": {"type": "string", "description": "城市名称"}
113
+ }
114
+ }
115
+ }
116
+ }]
117
+ }'
118
  ```
119
 
120
+ ### 图片输入示例
121
 
122
+ 支持 Base64 编码的图片输入,兼容 OpenAI 的多模态格式:
123
 
124
  ```bash
125
  curl http://localhost:8045/v1/chat/completions \
126
  -H "Content-Type: application/json" \
127
+ -H "Authorization: Bearer sk-text" \
128
  -d '{
129
+ "model": "gemini-2.0-flash-exp",
130
+ "messages": [{
131
+ "role": "user",
132
+ "content": [
133
+ {"type": "text", "text": "这张图片里有什么?"},
134
+ {
135
+ "type": "image_url",
136
+ "image_url": {
137
+ "url": "data:image/jpeg;base64,/9j/4AAQSkZJRg..."
138
+ }
139
+ }
140
+ ]
141
+ }],
142
  "stream": true
143
  }'
144
  ```
145
 
146
+ 支持的图片格式:
147
+ - JPEG/JPG (`data:image/jpeg;base64,...`)
148
+ - PNG (`data:image/png;base64,...`)
149
+ - GIF (`data:image/gif;base64,...`)
150
+ - WebP (`data:image/webp;base64,...`)
151
+
152
+ ## 多账号管理
153
 
154
+ `accounts.json` 支持多个账号,服务会自动轮换使用:
 
155
 
156
+ ```json
157
+ [
158
+ {
159
+ "access_token": "ya29.xxx",
160
+ "refresh_token": "1//xxx",
161
+ "expires_in": 3599,
162
+ "timestamp": 1234567890000,
163
+ "enable": true
164
+ },
165
+ {
166
+ "access_token": "ya29.yyy",
167
+ "refresh_token": "1//yyy",
168
+ "expires_in": 3599,
169
+ "timestamp": 1234567890000,
170
+ "enable": true
171
+ }
172
+ ]
173
+ ```
174
 
175
+ - `enable: false` 可禁用某个账号
176
+ - Token 过期会自动刷新
177
+ - 刷新失败(403)会自动禁用并切换下一个账号
 
 
178
 
179
+ ## 配置说明
180
+
181
+ ### config.json
182
+
183
+ | 配置项 | 说明 | 默认值 |
184
+ |--------|------|--------|
185
+ | `server.port` | 服务端口 | 8045 |
186
+ | `server.host` | 监听地址 | 0.0.0.0 |
187
+ | `security.apiKey` | API 认证密钥 | sk-text |
188
+ | `security.maxRequestSize` | 最大请求体大小 | 50mb |
189
+ | `defaults.temperature` | 默认温度参数 | 1 |
190
+ | `defaults.top_p` | 默认 top_p | 0.85 |
191
+ | `defaults.top_k` | 默认 top_k | 50 |
192
+ | `defaults.max_tokens` | 默认最大 token 数 | 8096 |
193
+ | `systemInstruction` | 系统提示词 | - |
194
+
195
+ ## 开发命令
196
+
197
+ ```bash
198
+ # 启动服务
199
+ npm start
200
+
201
+ # 开发模式(自动重启)
202
+ npm run dev
203
+
204
+ # 登录获取 Token
205
+ npm run login
206
  ```
207
 
208
  ## 项目结构
209
 
210
  ```
211
  .
212
+ ├── server.js # 主服务器
213
+ ├── api.js # API 调用逻辑
214
+ ├── oauth-server.js # OAuth 登录服务
215
+ ├── token_manager.js # Token 管理
216
+ ├── utils.js # 工具函数
217
+ ├── logger.js # 日志模块
218
+ ├── config.js # 配置加载
219
+ ├── config.json # 配置文件
220
+ ├── accounts.json # Token 存储(自动生成)
221
+ └── package.json # 项目配置
222
  ```
223
 
224
+ ## 注意事项
225
 
226
+ 1. 首次使用需要运行 `npm run login` 获取 Token
227
+ 2. `accounts.json` 包含敏感信息,请勿泄露
228
+ 3. API Key 可在 `config.json` 中自定义
229
+ 4. 支持多账号轮换,提高可用性
230
+ 5. Token 会自动刷新,无需手动维护
231
 
232
+ ## License
233
 
234
  MIT
test-conversion.js DELETED
@@ -1,122 +0,0 @@
1
- import { randomUUID } from 'crypto';
2
-
3
- function handleUserMessage(message, antigravityMessages){
4
- antigravityMessages.push({
5
- role: "user",
6
- parts: [
7
- {
8
- text: message
9
- }
10
- ]
11
- })
12
- }
13
-
14
- function handleAssistantMessage(message, antigravityMessages){
15
- const lastMessage = antigravityMessages[antigravityMessages.length - 1];
16
- const hasToolCalls = message.tool_calls && message.tool_calls.length > 0;
17
- const hasContent = message.content && message.content.trim() !== '';
18
- let antigravityTool = {}
19
-
20
- if (hasToolCalls){
21
- antigravityTool = {
22
- functionCall: {
23
- id: message.tool_calls[0].id,
24
- name: message.tool_calls[0].function.name,
25
- args: {
26
- query: message.tool_calls[0].function.arguments
27
- }
28
- }
29
- }
30
- }
31
-
32
- if (lastMessage && lastMessage.role === "model" && hasToolCalls && !hasContent){
33
- lastMessage.parts.push(antigravityTool)
34
- }else{
35
- if (hasToolCalls){
36
- antigravityMessages.push({
37
- role: "model",
38
- parts: [
39
- {
40
- text: message.content
41
- },
42
- antigravityTool
43
- ]
44
- })
45
- }else{
46
- antigravityMessages.push({
47
- role: "model",
48
- parts: [
49
- {
50
- text: message.content
51
- }
52
- ]
53
- })
54
- }
55
- }
56
- }
57
-
58
- function handleToolCall(message, antigravityMessages){
59
- let functionName = '';
60
- for (let i = antigravityMessages.length - 1; i >= 0; i--) {
61
- if (antigravityMessages[i].role === 'model') {
62
- const parts = antigravityMessages[i].parts;
63
- for (const part of parts) {
64
- if (part.functionCall && part.functionCall.id === message.tool_call_id) {
65
- functionName = part.functionCall.name;
66
- break;
67
- }
68
- }
69
- if (functionName) break;
70
- }
71
- }
72
-
73
- antigravityMessages.push({
74
- role: "user",
75
- parts: [
76
- {
77
- functionResponse: {
78
- id: message.tool_call_id,
79
- name: functionName,
80
- reponse: {
81
- output: message.content
82
- }
83
- }
84
- }
85
- ]
86
- })
87
- }
88
-
89
- function openaiMessageToAntigravity(openaiMessages){
90
- const antigravityMessages = [];
91
-
92
- for (const message of openaiMessages) {
93
- if (message.role === "user" || message.role === "system") {
94
- handleUserMessage(message.content, antigravityMessages);
95
- } else if (message.role === "assistant") {
96
- handleAssistantMessage(message, antigravityMessages);
97
- } else if (message.role === "tool") {
98
- handleToolCall(message, antigravityMessages);
99
- }
100
- }
101
-
102
- return antigravityMessages;
103
- }
104
-
105
- // 测试数据
106
- const testMessages = [
107
- { role: "user", content: "查询天气" },
108
- { role: "assistant", content: "", tool_calls: [{ id: "call_1", function: { name: "get_weather", arguments: '{"city":"北京"}' } }] },
109
- { role: "tool", tool_call_id: "call_1", content: "北京今天晴天,25度" },
110
- { role: "assistant", content: "北京今天天气不错,晴天25度" },
111
- { role: "user", content: "搜索用户信息" },
112
- { role: "assistant", content: "好的,让我搜索一下" },
113
- { role: "assistant", content: "", tool_calls: [{ id: "call_2", function: { name: "search_database", arguments: '{"query":"user_info","limit":10}' } }] },
114
- { role: "tool", tool_call_id: "call_2", content: "找到3条用户记录" }
115
- ];
116
-
117
- console.log("OpenAI 格式消息:");
118
- console.log(JSON.stringify(testMessages, null, 2));
119
-
120
- console.log("\n转换后的 Antigravity 格式:");
121
- const result = openaiMessageToAntigravity(testMessages);
122
- console.log(JSON.stringify(result, null, 2));