diff --git a/README.md b/README.md index 8392253..fd3c67d 100644 --- a/README.md +++ b/README.md @@ -88,8 +88,6 @@ Start the gateway with default settings: | `-socks` | `""` | SOCKS5 proxy URL (e.g. `socks5://127.0.0.1:1080`) | | `-user-agent` | *(Chrome UA)* | Custom User-Agent string | -*(Note: legacy flags `-browser`, `-xvfb`, and `-headless` are retained for backward compatibility but are ignored, as groqqer operates completely headless via direct WebSocket).* - ## API usage examples ### 1. List available models diff --git a/bin/groqqer b/bin/groqqer index 210e75a..91dd79e 100755 Binary files a/bin/groqqer and b/bin/groqqer differ diff --git a/groqqer.go b/groqqer.go index 4796d6f..bc036a7 100644 --- a/groqqer.go +++ b/groqqer.go @@ -107,14 +107,11 @@ func (m *ChatMessage) GetContentString() string { } type ChatCompletionRequest struct { - Model string `json:"model"` - Messages []ChatMessage `json:"messages"` - Tools []Tool `json:"tools,omitempty"` - ToolChoice interface{} `json:"tool_choice,omitempty"` - Stream bool `json:"stream"` - MaxTokens int `json:"max_tokens"` - MaxCompletionTokens int `json:"max_completion_tokens"` - ReasoningEffort string `json:"reasoning_effort,omitempty"` + Model string `json:"model"` + Messages []ChatMessage `json:"messages"` + Tools []Tool `json:"tools,omitempty"` + ToolChoice interface{} `json:"tool_choice,omitempty"` + Stream bool `json:"stream"` } type ChatCompletionResponseChoice struct { @@ -1609,12 +1606,8 @@ func parseToolCallsFromText(input string) ([]ToolCall, bool) { func parseXMLToolCall(block string) ([]ToolCall, bool) { inner := strings.TrimSpace(block) - if strings.HasPrefix(inner, "") { - inner = strings.TrimPrefix(inner, "") - } - if strings.HasSuffix(inner, "") { - inner = strings.TrimSuffix(inner, "") - } + inner = strings.TrimPrefix(inner, "") + inner = strings.TrimSuffix(inner, "") inner = cleanJSONBlock(inner) if calls, ok := parseToolCallsFromText(inner); ok { @@ -1658,51 +1651,6 @@ func parseXMLToolCall(block string) ([]ToolCall, bool) { return nil, false } -func ExtractToolCallBlocks(content string) (blocks []string, remaining string) { - var b []string - s := content - searchOffset := 0 - var remainingBuilder strings.Builder - lastPos := 0 - - for { - relStart := strings.Index(s[searchOffset:], "") - if relStart == -1 { - break - } - startIdx := searchOffset + relStart - afterStart := startIdx + len("") - - relEnd := strings.Index(s[afterStart:], "") - if relEnd == -1 { - // Unclosed , do not treat as block - searchOffset = afterStart - continue - } - - if innerNext := strings.Index(s[afterStart:afterStart+relEnd], ""); innerNext != -1 { - searchOffset = afterStart + innerNext - continue - } - - endIdx := afterStart + relEnd + len("") - blockText := s[startIdx:endIdx] - b = append(b, blockText) - - if startIdx > lastPos { - remainingBuilder.WriteString(s[lastPos:startIdx]) - } - lastPos = endIdx - searchOffset = endIdx - } - - if lastPos < len(s) { - remainingBuilder.WriteString(s[lastPos:]) - } - - return b, strings.TrimSpace(remainingBuilder.String()) -} - func DetectToolCalls(content string, allowedTools map[string]bool) ([]ToolCall, string, bool) { if len(allowedTools) == 0 { return nil, content, false @@ -2200,10 +2148,9 @@ func WriteCompletionResponse(w http.ResponseWriter, completionID string, created } type APIErrorDetail struct { - Message string `json:"message"` - Type string `json:"type"` - Param *string `json:"param"` - Code int `json:"code"` + Message string `json:"message"` + Type string `json:"type"` + Code int `json:"code"` } type APIErrorResponse struct { @@ -2232,7 +2179,6 @@ type GroqqerGateway struct { proxyURL string userAgent string defaultModel string - port int models []ModelItem modelsMu sync.RWMutex } @@ -2664,12 +2610,6 @@ func main() { flag.StringVar(socksProxy, "proxy", "", "Proxy address alias") flag.StringVar(socksProxy, "socks5", "", "SOCKS5 proxy alias") - // Retain flags for backward compatibility (browser/Xvfb are no longer required) - _ = flag.String("browser", "", "Ignored: browser is no longer required (headless WebSocket mode)") - _ = flag.Bool("xvfb", false, "Ignored: Xvfb is no longer required") - _ = flag.Bool("no-xvfb", false, "Ignored: Xvfb is no longer required") - _ = flag.Bool("headless", true, "Ignored: always runs headless via direct WebSocket") - flag.Parse() effectiveProxy := *socksProxy @@ -2689,7 +2629,6 @@ func main() { proxyURL: effectiveProxy, userAgent: *userAgent, defaultModel: *defaultModel, - port: *port, } // Initial discovery of live models in background