feat(thinking): add xAI provider support with reasoning.effort implementation
- Implemented `xAI` provider for thinking configurations with support for reasoning.effort levels. - Registered `xAI` in available providers and updated relevant APIs for compatibility. - Added unit tests for `xAI` provider functionality, including fallback logic for unsupported levels. - Integrated `xAI` with executor handling and ensured conformance with OpenAI-compatible standards.
This commit is contained in:
@@ -0,0 +1,26 @@
|
||||
// Package xai implements thinking configuration for xAI Grok Responses API models.
|
||||
//
|
||||
// xAI models use the OpenAI Responses API compatible reasoning.effort format
|
||||
// with discrete levels.
|
||||
package xai
|
||||
|
||||
import (
|
||||
"github.com/router-for-me/CLIProxyAPI/v7/internal/thinking"
|
||||
"github.com/router-for-me/CLIProxyAPI/v7/internal/thinking/provider/codex"
|
||||
)
|
||||
|
||||
// Applier implements thinking.ProviderApplier for xAI models.
|
||||
type Applier struct {
|
||||
codex.Applier
|
||||
}
|
||||
|
||||
var _ thinking.ProviderApplier = (*Applier)(nil)
|
||||
|
||||
// NewApplier creates a new xAI thinking applier.
|
||||
func NewApplier() *Applier {
|
||||
return &Applier{}
|
||||
}
|
||||
|
||||
func init() {
|
||||
thinking.RegisterProvider("xai", NewApplier())
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package xai
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/router-for-me/CLIProxyAPI/v7/internal/registry"
|
||||
"github.com/router-for-me/CLIProxyAPI/v7/internal/thinking"
|
||||
"github.com/tidwall/gjson"
|
||||
)
|
||||
|
||||
func TestApplySetsReasoningEffort(t *testing.T) {
|
||||
applier := NewApplier()
|
||||
modelInfo := ®istry.ModelInfo{
|
||||
ID: "grok-4.3",
|
||||
Thinking: ®istry.ThinkingSupport{
|
||||
ZeroAllowed: true,
|
||||
Levels: []string{"none", "low", "medium", "high"},
|
||||
},
|
||||
}
|
||||
|
||||
out, err := applier.Apply([]byte(`{"input":"hello"}`), thinking.ThinkingConfig{
|
||||
Mode: thinking.ModeLevel,
|
||||
Level: thinking.LevelHigh,
|
||||
}, modelInfo)
|
||||
if err != nil {
|
||||
t.Fatalf("Apply() error = %v", err)
|
||||
}
|
||||
if got := gjson.GetBytes(out, "reasoning.effort").String(); got != "high" {
|
||||
t.Fatalf("reasoning.effort = %q, want high; body=%s", got, string(out))
|
||||
}
|
||||
}
|
||||
|
||||
func TestApplyNoneFallsBackToLowestLevelWhenDisableUnsupported(t *testing.T) {
|
||||
applier := NewApplier()
|
||||
modelInfo := ®istry.ModelInfo{
|
||||
ID: "grok-3-mini",
|
||||
Thinking: ®istry.ThinkingSupport{
|
||||
Levels: []string{"low", "medium", "high"},
|
||||
},
|
||||
}
|
||||
|
||||
out, err := applier.Apply([]byte(`{"input":"hello"}`), thinking.ThinkingConfig{
|
||||
Mode: thinking.ModeNone,
|
||||
}, modelInfo)
|
||||
if err != nil {
|
||||
t.Fatalf("Apply() error = %v", err)
|
||||
}
|
||||
if got := gjson.GetBytes(out, "reasoning.effort").String(); got != "low" {
|
||||
t.Fatalf("reasoning.effort = %q, want low; body=%s", got, string(out))
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user