返回 DeepSeek-Reasonix
attachment_wire_compat_test.go
根目录 / internal / control / attachment_wire_compat_test.go
1 package control
2
3 import (
4 "bytes"
5 "io"
6 "net/http"
7 "net/http/httptest"
8 "testing"
9
10 "reasonix/internal/config"
11 "reasonix/internal/provider"
12 "reasonix/internal/provider/anthropic"
13 "reasonix/internal/provider/openai"
14 "reasonix/internal/provider/responses"
15 )
16
17 func TestLegacyImageResolverPreservesSerializedProtocolBytes(t *testing.T) {
18 for _, protocol := range []string{"openai", "responses", "anthropic"} {
19 t.Run(protocol, func(t *testing.T) {
20 bodies := make(chan []byte, 2)
21 server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
22 body, err := io.ReadAll(r.Body)
23 if err != nil {
24 t.Error(err)
25 }
26 bodies <- body
27 // A terminal client error avoids synthetic stream differences and
28 // retries; the real adapter has already serialized the request.
29 w.WriteHeader(http.StatusBadRequest)
30 _, _ = w.Write([]byte(`{"error":{"message":"fixture captured","type":"invalid_request_error"}}`))
31 }))
32 defer server.Close()
33 info := &provider.ModelInfo{ID: "vision", InputModalities: []provider.ModelModality{provider.ModalityText, provider.ModalityImage}}
34 cfg := provider.Config{Name: "fixture", Model: "vision", BaseURL: server.URL, APIKey: "fixture-only", ModelInfo: info}
35 var p provider.Provider
36 var err error
37 switch protocol {
38 case "openai":
39 p, err = openai.New(cfg)
40 case "anthropic":
41 p, err = anthropic.New(cfg)
42 case "responses":
43 p = responses.New(responses.Config{Name: "fixture", Model: "vision", BaseURL: server.URL, APIKey: "fixture-only", ModelInfo: info})
44 }
45 if err != nil {
46 t.Fatal(err)
47 }
48 messages := []provider.Message{{Role: provider.RoleSystem, Content: "unchanged system"}, {Role: provider.RoleUser, Content: "legacy image", Images: []string{"data:image/png;base64," + tinyPNG}}, {Role: provider.RoleAssistant, Content: "unchanged history"}, {Role: provider.RoleUser, Content: "next turn"}}
49 c := newOwnedTestController(t, Options{WorkspaceRoot: t.TempDir(), ImageRouteConfig: config.Default()})
50 resolved, err := c.ResolveRequestImagesForModel(t.Context(), messages, "fixture/vision", true)
51 if err != nil {
52 t.Fatal(err)
53 }
54 for _, input := range [][]provider.Message{messages, resolved} {
55 ch, _ := p.Stream(t.Context(), provider.Request{Messages: input})
56 if ch != nil {
57 for range ch {
58 }
59 }
60 }
61 if len(bodies) != 2 {
62 t.Fatalf("adapter sent %d requests, want 2", len(bodies))
63 }
64 before, after := <-bodies, <-bodies
65 if !bytes.Equal(before, after) {
66 t.Fatalf("legacy protocol bytes changed:\nbefore %s\nafter %s", before, after)
67 }
68 if !bytes.Contains(after, []byte(tinyPNG)) {
69 t.Fatal("fixture did not exercise image serialization")
70 }
71 })
72 }
73 }
74
74 lines GO