You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
2.7 KiB
99 lines
2.7 KiB
package openaichat
|
|
|
|
import (
|
|
"encoding/base64"
|
|
"encoding/json"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestEffectiveModelDropsSpark(t *testing.T) {
|
|
if EffectiveModel("") != "gpt-5.3-chat" || EffectiveModel("generalv3.5") != "gpt-5.3-chat" {
|
|
t.Fatal(EffectiveModel("generalv3.5"))
|
|
}
|
|
if EffectiveModel("gpt-5.4") != "gpt-5.4" {
|
|
t.Fatal(EffectiveModel("gpt-5.4"))
|
|
}
|
|
}
|
|
|
|
func TestEnvelopeUsesOpenAIModelNotSpark(t *testing.T) {
|
|
c, err := New("app", "key", "secret", "spark-api.xf-yun.com", "generalv3.5")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if c.Host != defaultHost {
|
|
t.Fatalf("星火主机必须丢掉,得到 %s", c.Host)
|
|
}
|
|
if c.Model != defaultModel {
|
|
t.Fatalf("星火 domain 不能当模型,得到 %s", c.Model)
|
|
}
|
|
raw, err := c.envelope([]Message{{Role: "user", Content: "1+1等于几"}})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
var outer struct {
|
|
Header struct {
|
|
AppID string `json:"app_id"`
|
|
Status int `json:"status"`
|
|
} `json:"header"`
|
|
Payload struct {
|
|
Input struct {
|
|
Status int `json:"status"`
|
|
Text string `json:"text"`
|
|
} `json:"input"`
|
|
} `json:"payload"`
|
|
}
|
|
if err := json.Unmarshal(raw, &outer); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if outer.Header.AppID != "app" || outer.Header.Status != 3 || outer.Payload.Input.Status != 3 {
|
|
t.Fatalf("信封不对: %+v", outer.Header)
|
|
}
|
|
inner, err := base64.StdEncoding.DecodeString(outer.Payload.Input.Text)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if strings.Contains(string(inner), "generalv3") || strings.Contains(string(inner), "spark") {
|
|
t.Fatalf("内层还带着星火: %s", inner)
|
|
}
|
|
var chat struct {
|
|
Model string `json:"model"`
|
|
Stream bool `json:"stream"`
|
|
Messages []Message `json:"messages"`
|
|
}
|
|
if err := json.Unmarshal(inner, &chat); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if chat.Model != "gpt-5.3-chat" || chat.Stream || chat.Messages[0].Content != "1+1等于几" {
|
|
t.Fatalf("内层不对: %+v", chat)
|
|
}
|
|
}
|
|
|
|
func TestParseChatCompletion(t *testing.T) {
|
|
inner, _ := json.Marshal(map[string]any{
|
|
"object": "chat.completion",
|
|
"choices": []any{
|
|
map[string]any{"message": map[string]any{"content": "1+1等于2。"}},
|
|
},
|
|
})
|
|
outer, _ := json.Marshal(map[string]any{
|
|
"header": map[string]any{"code": 0, "message": "success"},
|
|
"payload": map[string]any{
|
|
"output": map[string]any{"text": base64.StdEncoding.EncodeToString(inner)},
|
|
},
|
|
})
|
|
got, err := parseOuter(outer)
|
|
if err != nil || got != "1+1等于2。" {
|
|
t.Fatalf("got %q err %v", got, err)
|
|
}
|
|
}
|
|
|
|
func TestParseGatewayError(t *testing.T) {
|
|
outer, _ := json.Marshal(map[string]any{
|
|
"header": map[string]any{"code": 11200, "message": "授权错误"},
|
|
})
|
|
_, err := parseOuter(outer)
|
|
if err == nil || !strings.Contains(err.Error(), "11200") {
|
|
t.Fatalf("err=%v", err)
|
|
}
|
|
}
|
|
|