package digest import ( "context" "encoding/json" "io" "net/http" "net/http/httptest" "strings" "sync" "sync/atomic" "testing" "time" ) func sseHandler(t *testing.T, reply string, saw *atomic.Pointer[chatReq], disconnected *atomic.Bool) http.Handler { t.Helper() return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { b, _ := io.ReadAll(r.Body) var req chatReq _ = json.Unmarshal(b, &req) saw.Store(&req) fl, _ := w.(http.Flusher) w.Header().Set("Content-Type", "text/event-stream") w.WriteHeader(200) notify := r.Context().Done() for _, ch := range strings.Split(reply, " ") { select { case <-notify: disconnected.Store(true) return default: } chunk, _ := json.Marshal(map[string]any{ "choices": []map[string]any{{"delta": map[string]string{"content": ch + " "}}}, }) _, _ = w.Write([]byte("data: " + string(chunk) + "\n\n")) if fl != nil { fl.Flush() } time.Sleep(20 * time.Millisecond) } _, _ = w.Write([]byte("data: [DONE]\n\n")) if fl != nil { fl.Flush() } }) } func TestPromptFramingAndThinkingOff(t *testing.T) { var saw atomic.Pointer[chatReq] var disc atomic.Bool ts := httptest.NewServer(sseHandler(t, "hello from doc", &saw, &disc)) defer ts.Close() e := &Engine{ChatURL: ts.URL, Model: "ornith-1.5-9b-uncensored", Gate: NewGate(2, 8, time.Second), Client: ts.Client()} r := e.Run(context.Background(), "Section A\nThe wafer share is 42 percent.", "what share?", "https://ex.test/a") if r.Fallback != "" { t.Fatalf("fallback %s text %q", r.Fallback, r.Text) } req := saw.Load() if req == nil { t.Fatal("no request") } if req.MaxTokens != 700 { t.Fatalf("max_tokens %d", req.MaxTokens) } if req.Stream != true { t.Fatal("stream") } th, _ := req.ChatTemplateKwargs["enable_thinking"].(bool) if th { t.Fatal("thinking should be off") } if len(req.Messages) != 2 || req.Messages[0].Role != "system" { t.Fatalf("messages %+v", req.Messages) } if !strings.Contains(req.Messages[0].Content, "untrusted web document") { t.Fatal("system prompt") } if !strings.Contains(req.Messages[1].Content, "