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