package lua import ( "encoding/json" "path/filepath" "strings" "testing" ) func TestAnthropicSerializerShape(t *testing.T) { vm := NewVM(filepath.Join(t.TempDir(), "adapters")) if err := vm.Start(); err != nil { t.Fatal(err) } defer vm.Stop() if !vm.HasFn("anthropic", "serialize_response") { t.Fatal("anthropic 未声明 serialize_response") } out, err := vm.Transform("anthropic", "serialize_response", `{"model":"claude-x","id":"msg_1","content":"hello","finish_reason":"stop","token_usage":{"prompt":10,"completion":5,"total":15}}`) if err != nil { t.Fatal(err) } var m map[string]interface{} if err := json.Unmarshal([]byte(out), &m); err != nil { t.Fatalf("not JSON: %s", out) } if m["type"] != "message" || m["role"] != "assistant" { t.Errorf("Anthropic 形状不对: %s", out) } if m["stop_reason"] != "end_turn" { t.Errorf("stop_reason = %v, want end_turn", m["stop_reason"]) } blocks, _ := m["content"].([]interface{}) if len(blocks) != 1 { t.Fatalf("blocks = %v", m["content"]) } b0 := blocks[0].(map[string]interface{}) if b0["type"] != "text" || b0["text"] != "hello" { t.Errorf("首个块应为 text/hello: %v", b0) } u := m["usage"].(map[string]interface{}) if u["input_tokens"] != float64(10) || u["output_tokens"] != float64(5) { t.Errorf("usage 字段名/值不对: %v", u) } // 内核不得混入 OpenAI 字段 for _, k := range []string{"object", "choices", "usage.prompt_tokens"} { if strings.Contains(out, `"`+k+`"`) { t.Errorf("OpenAI 字段 %q 混入 Anthropic 输出: %s", k, out) } } }