render_qwen3_test.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package chat
  2. import (
  3. "encoding/json"
  4. "strings"
  5. "testing"
  6. )
  7. func TestQwen3Renderer_ToolsAndToolCalls(t *testing.T) {
  8. r := &Qwen3Renderer{}
  9. toolSchema := map[string]any{
  10. "name": "get_weather",
  11. "description": "Get current weather",
  12. "parameters": map[string]any{
  13. "type": "object",
  14. "properties": map[string]any{
  15. "city": map[string]any{"type": "string"},
  16. },
  17. },
  18. }
  19. args, err := json.Marshal(map[string]any{"city": "Istanbul"})
  20. if err != nil {
  21. t.Fatal(err)
  22. }
  23. out, err := r.Render(
  24. []Message{
  25. {Role: "user", Content: "Weather?"},
  26. {Role: "assistant", Content: "", ToolCalls: []ToolCall{{Name: "get_weather", Arguments: args}}},
  27. },
  28. Options{AddGenerationPrompt: false, EnableThinking: true, Tools: []any{toolSchema}},
  29. )
  30. if err != nil {
  31. t.Fatalf("render failed: %v", err)
  32. }
  33. if !strings.Contains(out, "# Tools") {
  34. t.Fatalf("missing tools header")
  35. }
  36. if !strings.Contains(out, "<tools>") || !strings.Contains(out, "</tools>") {
  37. t.Fatalf("missing <tools> wrapper")
  38. }
  39. if !strings.Contains(out, "<tool_call>") || !strings.Contains(out, "\"name\": \"get_weather\"") {
  40. t.Fatalf("missing tool_call encoding: %q", out)
  41. }
  42. }
  43. func TestQwen3Renderer_ToolResponseGroup(t *testing.T) {
  44. r := &Qwen3Renderer{}
  45. out, err := r.Render(
  46. []Message{
  47. {Role: "user", Content: "Do thing"},
  48. {Role: "tool", Content: "{\"ok\":true}"},
  49. {Role: "assistant", Content: "Done"},
  50. },
  51. Options{AddGenerationPrompt: false, EnableThinking: true},
  52. )
  53. if err != nil {
  54. t.Fatalf("render failed: %v", err)
  55. }
  56. if !strings.Contains(out, "<tool_response>") || !strings.Contains(out, "</tool_response>") {
  57. t.Fatalf("missing tool_response wrapper: %q", out)
  58. }
  59. if !strings.Contains(out, "<|im_start|>user\n<tool_response>") {
  60. t.Fatalf("tool response not wrapped as user group: %q", out)
  61. }
  62. }