mirror of
https://github.com/CJackHwang/ds2api.git
synced 2026-05-05 00:45:29 +08:00
73 lines
3.4 KiB
Go
73 lines
3.4 KiB
Go
package translatorcliproxy
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
|
|
sdktranslator "github.com/router-for-me/CLIProxyAPI/v6/sdk/translator"
|
|
)
|
|
|
|
func TestToOpenAIClaude(t *testing.T) {
|
|
raw := []byte(`{"model":"claude-sonnet-4-5","messages":[{"role":"user","content":"hi"}],"stream":false}`)
|
|
got := ToOpenAI(sdktranslator.FormatClaude, "claude-sonnet-4-5", raw, false)
|
|
s := string(got)
|
|
if !strings.Contains(s, `"messages"`) || !strings.Contains(s, `"model"`) {
|
|
t.Fatalf("unexpected translated request: %s", s)
|
|
}
|
|
}
|
|
|
|
func TestFromOpenAINonStreamClaude(t *testing.T) {
|
|
original := []byte(`{"model":"claude-sonnet-4-5","messages":[{"role":"user","content":"hi"}],"stream":false}`)
|
|
translatedReq := []byte(`{"model":"claude-sonnet-4-5","messages":[{"role":"user","content":"hi"}],"stream":false}`)
|
|
openaibody := []byte(`{"id":"chatcmpl_1","object":"chat.completion","created":1,"model":"claude-sonnet-4-5","choices":[{"index":0,"message":{"role":"assistant","content":"hello"},"finish_reason":"stop"}],"usage":{"prompt_tokens":1,"completion_tokens":1,"total_tokens":2}}`)
|
|
got := FromOpenAINonStream(sdktranslator.FormatClaude, "claude-sonnet-4-5", original, translatedReq, openaibody)
|
|
if !strings.Contains(string(got), `"type":"message"`) {
|
|
t.Fatalf("expected claude response format, got: %s", string(got))
|
|
}
|
|
}
|
|
|
|
func TestParseFormatAliases(t *testing.T) {
|
|
cases := map[string]sdktranslator.Format{
|
|
"responses": sdktranslator.FormatOpenAIResponse,
|
|
"anthropic": sdktranslator.FormatClaude,
|
|
"geminicli": sdktranslator.FormatGeminiCLI,
|
|
"openai-codex": sdktranslator.FormatCodex,
|
|
"antigravity": sdktranslator.FormatAntigravity,
|
|
"chat-completions": sdktranslator.FormatOpenAI,
|
|
}
|
|
for in, want := range cases {
|
|
if got := ParseFormat(in); got != want {
|
|
t.Fatalf("ParseFormat(%q)=%q want %q", in, got, want)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestToOpenAIByNameAllSupportedFormats(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
format string
|
|
model string
|
|
body string
|
|
}{
|
|
{name: "openai", format: "openai", model: "gpt-4.1", body: `{"model":"gpt-4.1","messages":[{"role":"user","content":"hi"}],"stream":false}`},
|
|
{name: "responses", format: "responses", model: "gpt-4.1", body: `{"model":"gpt-4.1","input":"hello","stream":false}`},
|
|
{name: "claude", format: "claude", model: "claude-sonnet-4-5", body: `{"model":"claude-sonnet-4-5","messages":[{"role":"user","content":"hello"}],"stream":false}`},
|
|
{name: "gemini", format: "gemini", model: "gemini-2.5-pro", body: `{"contents":[{"role":"user","parts":[{"text":"hello"}]}]}`},
|
|
{name: "gemini-cli", format: "gemini-cli", model: "gemini-2.5-pro", body: `{"model":"gemini-2.5-pro","messages":[{"role":"user","content":"hello"}],"stream":false}`},
|
|
{name: "codex", format: "codex", model: "gpt-5-codex", body: `{"model":"gpt-5-codex","messages":[{"role":"user","content":"hello"}],"stream":false}`},
|
|
{name: "antigravity", format: "antigravity", model: "gpt-4.1", body: `{"model":"gpt-4.1","messages":[{"role":"user","content":"hello"}],"stream":false}`},
|
|
}
|
|
|
|
for _, tc := range tests {
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
got := ToOpenAIByName(tc.format, tc.model, []byte(tc.body), false)
|
|
if len(got) == 0 {
|
|
t.Fatalf("expected non-empty conversion result for format=%s", tc.format)
|
|
}
|
|
if !strings.Contains(string(got), `"model"`) {
|
|
t.Fatalf("expected model field in converted payload, got=%s", string(got))
|
|
}
|
|
})
|
|
}
|
|
}
|