package httpapi import "strings" func extractPartThoughtSignature(thoughtSignature string, thoughtSignatureSnake string) string { if thoughtSignature != "" { return thoughtSignature } if thoughtSignatureSnake != "" { return thoughtSignatureSnake } return "" } var geminiUnsupportedKeywords = map[string]bool{ "patternProperties": true, "additionalProperties": true, "$schema": true, "$id": true, "$ref": true, "$defs": true, "definitions": true, "examples": true, "minLength": true, "maxLength": true, "minimum": true, "maximum": true, "multipleOf": true, "pattern": true, "format": true, "minItems": true, "maxItems": true, "uniqueItems": true, "minProperties": true, "maxProperties": true, } func sanitizeSchemaForGemini(schema map[string]any) map[string]any { if schema == nil { return nil } result := make(map[string]any) for k, v := range schema { if geminiUnsupportedKeywords[k] { continue } switch val := v.(type) { case map[string]any: result[k] = sanitizeSchemaForGemini(val) case []any: sanitized := make([]any, len(val)) for i, item := range val { if m, ok := item.(map[string]any); ok { sanitized[i] = sanitizeSchemaForGemini(m) } else { sanitized[i] = item } } result[k] = sanitized default: result[k] = v } } if _, hasProps := result["properties"]; hasProps { if _, hasType := result["type"]; !hasType { result["type"] = "object" } } return result } func extractProtocol(model string) (protocol, modelID string) { model = strings.TrimSpace(model) protocol, modelID, found := strings.Cut(model, "/") if !found { return "openai", model } return protocol, modelID }