mirror of
https://github.com/router-for-me/CLIProxyAPI.git
synced 2026-02-03 04:50:52 +08:00
feat(translator): support image size and googleSearch tools
This commit is contained in:
@@ -131,6 +131,9 @@ func ConvertOpenAIRequestToAntigravity(modelName string, inputRawJSON []byte, _
|
|||||||
if ar := imgCfg.Get("aspect_ratio"); ar.Exists() && ar.Type == gjson.String {
|
if ar := imgCfg.Get("aspect_ratio"); ar.Exists() && ar.Type == gjson.String {
|
||||||
out, _ = sjson.SetBytes(out, "request.generationConfig.imageConfig.aspectRatio", ar.Str)
|
out, _ = sjson.SetBytes(out, "request.generationConfig.imageConfig.aspectRatio", ar.Str)
|
||||||
}
|
}
|
||||||
|
if size := imgCfg.Get("image_size"); size.Exists() && size.Type == gjson.String {
|
||||||
|
out, _ = sjson.SetBytes(out, "request.generationConfig.imageConfig.imageSize", size.Str)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// messages -> systemInstruction + contents
|
// messages -> systemInstruction + contents
|
||||||
@@ -281,11 +284,12 @@ func ConvertOpenAIRequestToAntigravity(modelName string, inputRawJSON []byte, _
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// tools -> request.tools[0].functionDeclarations
|
// tools -> request.tools[0].functionDeclarations + request.tools[0].googleSearch passthrough
|
||||||
tools := gjson.GetBytes(rawJSON, "tools")
|
tools := gjson.GetBytes(rawJSON, "tools")
|
||||||
if tools.IsArray() && len(tools.Array()) > 0 {
|
if tools.IsArray() && len(tools.Array()) > 0 {
|
||||||
out, _ = sjson.SetRawBytes(out, "request.tools", []byte(`[{"functionDeclarations":[]}]`))
|
toolNode := []byte(`{}`)
|
||||||
fdPath := "request.tools.0.functionDeclarations"
|
hasTool := false
|
||||||
|
hasFunction := false
|
||||||
for _, t := range tools.Array() {
|
for _, t := range tools.Array() {
|
||||||
if t.Get("type").String() == "function" {
|
if t.Get("type").String() == "function" {
|
||||||
fn := t.Get("function")
|
fn := t.Get("function")
|
||||||
@@ -323,14 +327,32 @@ func ConvertOpenAIRequestToAntigravity(modelName string, inputRawJSON []byte, _
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
fnRaw, _ = sjson.Delete(fnRaw, "strict")
|
fnRaw, _ = sjson.Delete(fnRaw, "strict")
|
||||||
tmp, errSet := sjson.SetRawBytes(out, fdPath+".-1", []byte(fnRaw))
|
if !hasFunction {
|
||||||
|
toolNode, _ = sjson.SetRawBytes(toolNode, "functionDeclarations", []byte("[]"))
|
||||||
|
}
|
||||||
|
tmp, errSet := sjson.SetRawBytes(toolNode, "functionDeclarations.-1", []byte(fnRaw))
|
||||||
if errSet != nil {
|
if errSet != nil {
|
||||||
log.Warnf("Failed to append tool declaration for '%s': %v", fn.Get("name").String(), errSet)
|
log.Warnf("Failed to append tool declaration for '%s': %v", fn.Get("name").String(), errSet)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
out = tmp
|
toolNode = tmp
|
||||||
|
hasFunction = true
|
||||||
|
hasTool = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if gs := t.Get("google_search"); gs.Exists() {
|
||||||
|
var errSet error
|
||||||
|
toolNode, errSet = sjson.SetRawBytes(toolNode, "googleSearch", []byte(gs.Raw))
|
||||||
|
if errSet != nil {
|
||||||
|
log.Warnf("Failed to set googleSearch tool: %v", errSet)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
hasTool = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if hasTool {
|
||||||
|
out, _ = sjson.SetRawBytes(out, "request.tools", []byte("[]"))
|
||||||
|
out, _ = sjson.SetRawBytes(out, "request.tools.0", toolNode)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -131,6 +131,9 @@ func ConvertOpenAIRequestToGeminiCLI(modelName string, inputRawJSON []byte, _ bo
|
|||||||
if ar := imgCfg.Get("aspect_ratio"); ar.Exists() && ar.Type == gjson.String {
|
if ar := imgCfg.Get("aspect_ratio"); ar.Exists() && ar.Type == gjson.String {
|
||||||
out, _ = sjson.SetBytes(out, "request.generationConfig.imageConfig.aspectRatio", ar.Str)
|
out, _ = sjson.SetBytes(out, "request.generationConfig.imageConfig.aspectRatio", ar.Str)
|
||||||
}
|
}
|
||||||
|
if size := imgCfg.Get("image_size"); size.Exists() && size.Type == gjson.String {
|
||||||
|
out, _ = sjson.SetBytes(out, "request.generationConfig.imageConfig.imageSize", size.Str)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// messages -> systemInstruction + contents
|
// messages -> systemInstruction + contents
|
||||||
@@ -281,11 +284,12 @@ func ConvertOpenAIRequestToGeminiCLI(modelName string, inputRawJSON []byte, _ bo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// tools -> request.tools[0].functionDeclarations
|
// tools -> request.tools[0].functionDeclarations + request.tools[0].googleSearch passthrough
|
||||||
tools := gjson.GetBytes(rawJSON, "tools")
|
tools := gjson.GetBytes(rawJSON, "tools")
|
||||||
if tools.IsArray() && len(tools.Array()) > 0 {
|
if tools.IsArray() && len(tools.Array()) > 0 {
|
||||||
out, _ = sjson.SetRawBytes(out, "request.tools", []byte(`[{"functionDeclarations":[]}]`))
|
toolNode := []byte(`{}`)
|
||||||
fdPath := "request.tools.0.functionDeclarations"
|
hasTool := false
|
||||||
|
hasFunction := false
|
||||||
for _, t := range tools.Array() {
|
for _, t := range tools.Array() {
|
||||||
if t.Get("type").String() == "function" {
|
if t.Get("type").String() == "function" {
|
||||||
fn := t.Get("function")
|
fn := t.Get("function")
|
||||||
@@ -323,14 +327,32 @@ func ConvertOpenAIRequestToGeminiCLI(modelName string, inputRawJSON []byte, _ bo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
fnRaw, _ = sjson.Delete(fnRaw, "strict")
|
fnRaw, _ = sjson.Delete(fnRaw, "strict")
|
||||||
tmp, errSet := sjson.SetRawBytes(out, fdPath+".-1", []byte(fnRaw))
|
if !hasFunction {
|
||||||
|
toolNode, _ = sjson.SetRawBytes(toolNode, "functionDeclarations", []byte("[]"))
|
||||||
|
}
|
||||||
|
tmp, errSet := sjson.SetRawBytes(toolNode, "functionDeclarations.-1", []byte(fnRaw))
|
||||||
if errSet != nil {
|
if errSet != nil {
|
||||||
log.Warnf("Failed to append tool declaration for '%s': %v", fn.Get("name").String(), errSet)
|
log.Warnf("Failed to append tool declaration for '%s': %v", fn.Get("name").String(), errSet)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
out = tmp
|
toolNode = tmp
|
||||||
|
hasFunction = true
|
||||||
|
hasTool = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if gs := t.Get("google_search"); gs.Exists() {
|
||||||
|
var errSet error
|
||||||
|
toolNode, errSet = sjson.SetRawBytes(toolNode, "googleSearch", []byte(gs.Raw))
|
||||||
|
if errSet != nil {
|
||||||
|
log.Warnf("Failed to set googleSearch tool: %v", errSet)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
hasTool = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if hasTool {
|
||||||
|
out, _ = sjson.SetRawBytes(out, "request.tools", []byte("[]"))
|
||||||
|
out, _ = sjson.SetRawBytes(out, "request.tools.0", toolNode)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -122,6 +122,9 @@ func ConvertOpenAIRequestToGemini(modelName string, inputRawJSON []byte, _ bool)
|
|||||||
if ar := imgCfg.Get("aspect_ratio"); ar.Exists() && ar.Type == gjson.String {
|
if ar := imgCfg.Get("aspect_ratio"); ar.Exists() && ar.Type == gjson.String {
|
||||||
out, _ = sjson.SetBytes(out, "generationConfig.imageConfig.aspectRatio", ar.Str)
|
out, _ = sjson.SetBytes(out, "generationConfig.imageConfig.aspectRatio", ar.Str)
|
||||||
}
|
}
|
||||||
|
if size := imgCfg.Get("image_size"); size.Exists() && size.Type == gjson.String {
|
||||||
|
out, _ = sjson.SetBytes(out, "generationConfig.imageConfig.imageSize", size.Str)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// messages -> systemInstruction + contents
|
// messages -> systemInstruction + contents
|
||||||
@@ -297,11 +300,12 @@ func ConvertOpenAIRequestToGemini(modelName string, inputRawJSON []byte, _ bool)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// tools -> tools[0].functionDeclarations
|
// tools -> tools[0].functionDeclarations + tools[0].googleSearch passthrough
|
||||||
tools := gjson.GetBytes(rawJSON, "tools")
|
tools := gjson.GetBytes(rawJSON, "tools")
|
||||||
if tools.IsArray() && len(tools.Array()) > 0 {
|
if tools.IsArray() && len(tools.Array()) > 0 {
|
||||||
out, _ = sjson.SetRawBytes(out, "tools", []byte(`[{"functionDeclarations":[]}]`))
|
toolNode := []byte(`{}`)
|
||||||
fdPath := "tools.0.functionDeclarations"
|
hasTool := false
|
||||||
|
hasFunction := false
|
||||||
for _, t := range tools.Array() {
|
for _, t := range tools.Array() {
|
||||||
if t.Get("type").String() == "function" {
|
if t.Get("type").String() == "function" {
|
||||||
fn := t.Get("function")
|
fn := t.Get("function")
|
||||||
@@ -311,6 +315,17 @@ func ConvertOpenAIRequestToGemini(modelName string, inputRawJSON []byte, _ bool)
|
|||||||
renamed, errRename := util.RenameKey(fnRaw, "parameters", "parametersJsonSchema")
|
renamed, errRename := util.RenameKey(fnRaw, "parameters", "parametersJsonSchema")
|
||||||
if errRename != nil {
|
if errRename != nil {
|
||||||
log.Warnf("Failed to rename parameters for tool '%s': %v", fn.Get("name").String(), errRename)
|
log.Warnf("Failed to rename parameters for tool '%s': %v", fn.Get("name").String(), errRename)
|
||||||
|
var errSet error
|
||||||
|
fnRaw, errSet = sjson.Set(fnRaw, "parametersJsonSchema.type", "object")
|
||||||
|
if errSet != nil {
|
||||||
|
log.Warnf("Failed to set default schema type for tool '%s': %v", fn.Get("name").String(), errSet)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
fnRaw, errSet = sjson.Set(fnRaw, "parametersJsonSchema.properties", map[string]interface{}{})
|
||||||
|
if errSet != nil {
|
||||||
|
log.Warnf("Failed to set default schema properties for tool '%s': %v", fn.Get("name").String(), errSet)
|
||||||
|
continue
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
fnRaw = renamed
|
fnRaw = renamed
|
||||||
}
|
}
|
||||||
@@ -328,14 +343,32 @@ func ConvertOpenAIRequestToGemini(modelName string, inputRawJSON []byte, _ bool)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
fnRaw, _ = sjson.Delete(fnRaw, "strict")
|
fnRaw, _ = sjson.Delete(fnRaw, "strict")
|
||||||
tmp, errSet := sjson.SetRawBytes(out, fdPath+".-1", []byte(fnRaw))
|
if !hasFunction {
|
||||||
|
toolNode, _ = sjson.SetRawBytes(toolNode, "functionDeclarations", []byte("[]"))
|
||||||
|
}
|
||||||
|
tmp, errSet := sjson.SetRawBytes(toolNode, "functionDeclarations.-1", []byte(fnRaw))
|
||||||
if errSet != nil {
|
if errSet != nil {
|
||||||
log.Warnf("Failed to append tool declaration for '%s': %v", fn.Get("name").String(), errSet)
|
log.Warnf("Failed to append tool declaration for '%s': %v", fn.Get("name").String(), errSet)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
out = tmp
|
toolNode = tmp
|
||||||
|
hasFunction = true
|
||||||
|
hasTool = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if gs := t.Get("google_search"); gs.Exists() {
|
||||||
|
var errSet error
|
||||||
|
toolNode, errSet = sjson.SetRawBytes(toolNode, "googleSearch", []byte(gs.Raw))
|
||||||
|
if errSet != nil {
|
||||||
|
log.Warnf("Failed to set googleSearch tool: %v", errSet)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
hasTool = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if hasTool {
|
||||||
|
out, _ = sjson.SetRawBytes(out, "tools", []byte("[]"))
|
||||||
|
out, _ = sjson.SetRawBytes(out, "tools.0", toolNode)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user