小追加
Browse files- src/utils/utils.js +34 -28
- test/test-get-ip.js +17 -9
src/utils/utils.js
CHANGED
|
@@ -39,7 +39,7 @@ function extractImagesFromContent(content) {
|
|
| 39 |
|
| 40 |
return result;
|
| 41 |
}
|
| 42 |
-
function handleUserMessage(extracted, antigravityMessages){
|
| 43 |
antigravityMessages.push({
|
| 44 |
role: "user",
|
| 45 |
parts: [
|
|
@@ -50,11 +50,11 @@ function handleUserMessage(extracted, antigravityMessages){
|
|
| 50 |
]
|
| 51 |
})
|
| 52 |
}
|
| 53 |
-
function handleAssistantMessage(message, antigravityMessages){
|
| 54 |
const lastMessage = antigravityMessages[antigravityMessages.length - 1];
|
| 55 |
const hasToolCalls = message.tool_calls && message.tool_calls.length > 0;
|
| 56 |
const hasContent = message.content && message.content.trim() !== '';
|
| 57 |
-
|
| 58 |
const antigravityTools = hasToolCalls ? message.tool_calls.map(toolCall => ({
|
| 59 |
functionCall: {
|
| 60 |
id: toolCall.id,
|
|
@@ -64,21 +64,21 @@ function handleAssistantMessage(message, antigravityMessages){
|
|
| 64 |
}
|
| 65 |
}
|
| 66 |
})) : [];
|
| 67 |
-
|
| 68 |
-
if (lastMessage?.role === "model" && hasToolCalls && !hasContent){
|
| 69 |
lastMessage.parts.push(...antigravityTools)
|
| 70 |
-
}else{
|
| 71 |
const parts = [];
|
| 72 |
if (hasContent) parts.push({ text: message.content });
|
| 73 |
parts.push(...antigravityTools);
|
| 74 |
-
|
| 75 |
antigravityMessages.push({
|
| 76 |
role: "model",
|
| 77 |
parts
|
| 78 |
})
|
| 79 |
}
|
| 80 |
}
|
| 81 |
-
function handleToolCall(message, antigravityMessages){
|
| 82 |
// 从之前的 model 消息中找到对应的 functionCall name
|
| 83 |
let functionName = '';
|
| 84 |
for (let i = antigravityMessages.length - 1; i >= 0; i--) {
|
|
@@ -93,7 +93,7 @@ function handleToolCall(message, antigravityMessages){
|
|
| 93 |
if (functionName) break;
|
| 94 |
}
|
| 95 |
}
|
| 96 |
-
|
| 97 |
const lastMessage = antigravityMessages[antigravityMessages.length - 1];
|
| 98 |
const functionResponse = {
|
| 99 |
functionResponse: {
|
|
@@ -104,7 +104,7 @@ function handleToolCall(message, antigravityMessages){
|
|
| 104 |
}
|
| 105 |
}
|
| 106 |
};
|
| 107 |
-
|
| 108 |
// 如果上一条消息是 user 且包含 functionResponse,则合并
|
| 109 |
if (lastMessage?.role === "user" && lastMessage.parts.some(p => p.functionResponse)) {
|
| 110 |
lastMessage.parts.push(functionResponse);
|
|
@@ -115,7 +115,7 @@ function handleToolCall(message, antigravityMessages){
|
|
| 115 |
});
|
| 116 |
}
|
| 117 |
}
|
| 118 |
-
function openaiMessageToAntigravity(openaiMessages){
|
| 119 |
const antigravityMessages = [];
|
| 120 |
for (const message of openaiMessages) {
|
| 121 |
if (message.role === "user" || message.role === "system") {
|
|
@@ -127,10 +127,10 @@ function openaiMessageToAntigravity(openaiMessages){
|
|
| 127 |
handleToolCall(message, antigravityMessages);
|
| 128 |
}
|
| 129 |
}
|
| 130 |
-
|
| 131 |
return antigravityMessages;
|
| 132 |
}
|
| 133 |
-
function generateGenerationConfig(parameters, enableThinking, actualModelName){
|
| 134 |
const generationConfig = {
|
| 135 |
topP: parameters.top_p ?? config.defaults.top_p,
|
| 136 |
topK: parameters.top_k ?? config.defaults.top_k,
|
|
@@ -149,14 +149,14 @@ function generateGenerationConfig(parameters, enableThinking, actualModelName){
|
|
| 149 |
thinkingBudget: enableThinking ? 1024 : 0
|
| 150 |
}
|
| 151 |
}
|
| 152 |
-
if (enableThinking && actualModelName.includes("claude")){
|
| 153 |
delete generationConfig.topP;
|
| 154 |
}
|
| 155 |
return generationConfig
|
| 156 |
}
|
| 157 |
-
function convertOpenAIToolsToAntigravity(openaiTools){
|
| 158 |
if (!openaiTools || openaiTools.length === 0) return [];
|
| 159 |
-
return openaiTools.map((tool)=>{
|
| 160 |
delete tool.function.parameters.$schema;
|
| 161 |
return {
|
| 162 |
functionDeclarations: [
|
|
@@ -169,16 +169,16 @@ function convertOpenAIToolsToAntigravity(openaiTools){
|
|
| 169 |
}
|
| 170 |
})
|
| 171 |
}
|
| 172 |
-
function generateRequestBody(openaiMessages,modelName,parameters,openaiTools,token){
|
| 173 |
-
|
| 174 |
-
const enableThinking = modelName.endsWith('-thinking') ||
|
| 175 |
-
modelName === 'gemini-2.5-pro' ||
|
| 176 |
modelName.startsWith('gemini-3-pro-') ||
|
| 177 |
modelName === "rev19-uic3-1p" ||
|
| 178 |
modelName === "gpt-oss-120b-medium"
|
| 179 |
const actualModelName = modelName.endsWith('-thinking') ? modelName.slice(0, -9) : modelName;
|
| 180 |
-
|
| 181 |
-
return{
|
| 182 |
project: token.projectId,
|
| 183 |
requestId: generateRequestId(),
|
| 184 |
request: {
|
|
@@ -200,18 +200,24 @@ function generateRequestBody(openaiMessages,modelName,parameters,openaiTools,tok
|
|
| 200 |
userAgent: "antigravity"
|
| 201 |
}
|
| 202 |
}
|
| 203 |
-
function getDefaultIp(){
|
| 204 |
const interfaces = os.networkInterfaces();
|
| 205 |
-
if (interfaces.WLAN){
|
| 206 |
-
for (const inter of interfaces.WLAN){
|
| 207 |
-
if (inter.family === 'IPv4' && !inter.internal){
|
| 208 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 209 |
}
|
| 210 |
}
|
| 211 |
}
|
| 212 |
return '127.0.0.1';
|
| 213 |
}
|
| 214 |
-
export{
|
| 215 |
generateRequestId,
|
| 216 |
generateRequestBody,
|
| 217 |
getDefaultIp
|
|
|
|
| 39 |
|
| 40 |
return result;
|
| 41 |
}
|
| 42 |
+
function handleUserMessage(extracted, antigravityMessages) {
|
| 43 |
antigravityMessages.push({
|
| 44 |
role: "user",
|
| 45 |
parts: [
|
|
|
|
| 50 |
]
|
| 51 |
})
|
| 52 |
}
|
| 53 |
+
function handleAssistantMessage(message, antigravityMessages) {
|
| 54 |
const lastMessage = antigravityMessages[antigravityMessages.length - 1];
|
| 55 |
const hasToolCalls = message.tool_calls && message.tool_calls.length > 0;
|
| 56 |
const hasContent = message.content && message.content.trim() !== '';
|
| 57 |
+
|
| 58 |
const antigravityTools = hasToolCalls ? message.tool_calls.map(toolCall => ({
|
| 59 |
functionCall: {
|
| 60 |
id: toolCall.id,
|
|
|
|
| 64 |
}
|
| 65 |
}
|
| 66 |
})) : [];
|
| 67 |
+
|
| 68 |
+
if (lastMessage?.role === "model" && hasToolCalls && !hasContent) {
|
| 69 |
lastMessage.parts.push(...antigravityTools)
|
| 70 |
+
} else {
|
| 71 |
const parts = [];
|
| 72 |
if (hasContent) parts.push({ text: message.content });
|
| 73 |
parts.push(...antigravityTools);
|
| 74 |
+
|
| 75 |
antigravityMessages.push({
|
| 76 |
role: "model",
|
| 77 |
parts
|
| 78 |
})
|
| 79 |
}
|
| 80 |
}
|
| 81 |
+
function handleToolCall(message, antigravityMessages) {
|
| 82 |
// 从之前的 model 消息中找到对应的 functionCall name
|
| 83 |
let functionName = '';
|
| 84 |
for (let i = antigravityMessages.length - 1; i >= 0; i--) {
|
|
|
|
| 93 |
if (functionName) break;
|
| 94 |
}
|
| 95 |
}
|
| 96 |
+
|
| 97 |
const lastMessage = antigravityMessages[antigravityMessages.length - 1];
|
| 98 |
const functionResponse = {
|
| 99 |
functionResponse: {
|
|
|
|
| 104 |
}
|
| 105 |
}
|
| 106 |
};
|
| 107 |
+
|
| 108 |
// 如果上一条消息是 user 且包含 functionResponse,则合并
|
| 109 |
if (lastMessage?.role === "user" && lastMessage.parts.some(p => p.functionResponse)) {
|
| 110 |
lastMessage.parts.push(functionResponse);
|
|
|
|
| 115 |
});
|
| 116 |
}
|
| 117 |
}
|
| 118 |
+
function openaiMessageToAntigravity(openaiMessages) {
|
| 119 |
const antigravityMessages = [];
|
| 120 |
for (const message of openaiMessages) {
|
| 121 |
if (message.role === "user" || message.role === "system") {
|
|
|
|
| 127 |
handleToolCall(message, antigravityMessages);
|
| 128 |
}
|
| 129 |
}
|
| 130 |
+
|
| 131 |
return antigravityMessages;
|
| 132 |
}
|
| 133 |
+
function generateGenerationConfig(parameters, enableThinking, actualModelName) {
|
| 134 |
const generationConfig = {
|
| 135 |
topP: parameters.top_p ?? config.defaults.top_p,
|
| 136 |
topK: parameters.top_k ?? config.defaults.top_k,
|
|
|
|
| 149 |
thinkingBudget: enableThinking ? 1024 : 0
|
| 150 |
}
|
| 151 |
}
|
| 152 |
+
if (enableThinking && actualModelName.includes("claude")) {
|
| 153 |
delete generationConfig.topP;
|
| 154 |
}
|
| 155 |
return generationConfig
|
| 156 |
}
|
| 157 |
+
function convertOpenAIToolsToAntigravity(openaiTools) {
|
| 158 |
if (!openaiTools || openaiTools.length === 0) return [];
|
| 159 |
+
return openaiTools.map((tool) => {
|
| 160 |
delete tool.function.parameters.$schema;
|
| 161 |
return {
|
| 162 |
functionDeclarations: [
|
|
|
|
| 169 |
}
|
| 170 |
})
|
| 171 |
}
|
| 172 |
+
function generateRequestBody(openaiMessages, modelName, parameters, openaiTools, token) {
|
| 173 |
+
|
| 174 |
+
const enableThinking = modelName.endsWith('-thinking') ||
|
| 175 |
+
modelName === 'gemini-2.5-pro' ||
|
| 176 |
modelName.startsWith('gemini-3-pro-') ||
|
| 177 |
modelName === "rev19-uic3-1p" ||
|
| 178 |
modelName === "gpt-oss-120b-medium"
|
| 179 |
const actualModelName = modelName.endsWith('-thinking') ? modelName.slice(0, -9) : modelName;
|
| 180 |
+
|
| 181 |
+
return {
|
| 182 |
project: token.projectId,
|
| 183 |
requestId: generateRequestId(),
|
| 184 |
request: {
|
|
|
|
| 200 |
userAgent: "antigravity"
|
| 201 |
}
|
| 202 |
}
|
| 203 |
+
function getDefaultIp() {
|
| 204 |
const interfaces = os.networkInterfaces();
|
| 205 |
+
if (interfaces.WLAN) {
|
| 206 |
+
for (const inter of interfaces.WLAN) {
|
| 207 |
+
if (inter.family === 'IPv4' && !inter.internal) {
|
| 208 |
+
return inter.address;
|
| 209 |
+
}
|
| 210 |
+
}
|
| 211 |
+
} else if (interfaces.wlan2) {
|
| 212 |
+
for (const inter of interfaces.wlan2) {
|
| 213 |
+
if (inter.family === 'IPv4' && !inter.internal) {
|
| 214 |
+
return inter.address;
|
| 215 |
}
|
| 216 |
}
|
| 217 |
}
|
| 218 |
return '127.0.0.1';
|
| 219 |
}
|
| 220 |
+
export {
|
| 221 |
generateRequestId,
|
| 222 |
generateRequestBody,
|
| 223 |
getDefaultIp
|
test/test-get-ip.js
CHANGED
|
@@ -1,13 +1,21 @@
|
|
| 1 |
import os from 'os';
|
| 2 |
-
function getLocalIp(){
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 10 |
}
|
| 11 |
return '127.0.0.1';
|
|
|
|
| 12 |
}
|
| 13 |
-
|
|
|
|
|
|
| 1 |
import os from 'os';
|
| 2 |
+
function getLocalIp() {
|
| 3 |
+
const interfaces = os.networkInterfaces();
|
| 4 |
+
console.log(JSON.stringify(interfaces, null, 2))
|
| 5 |
+
if (interfaces.WLAN) {
|
| 6 |
+
for (const inter of interfaces.WLAN) {
|
| 7 |
+
if (inter.family === 'IPv4' && !inter.internal) {
|
| 8 |
+
return inter.address;
|
| 9 |
+
}
|
| 10 |
+
}
|
| 11 |
+
} else if (interfaces.wlan2) {
|
| 12 |
+
for (const inter of interfaces.wlan2) {
|
| 13 |
+
if (inter.family === 'IPv4' && !inter.internal) {
|
| 14 |
+
return inter.address;
|
| 15 |
+
}
|
| 16 |
}
|
| 17 |
return '127.0.0.1';
|
| 18 |
+
}
|
| 19 |
}
|
| 20 |
+
|
| 21 |
+
console.log(getLocalIp());
|