chatcompletions_reasoning_alias_test.go 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. package apicompat
  2. import (
  3. "encoding/json"
  4. "os"
  5. "path/filepath"
  6. "testing"
  7. "github.com/stretchr/testify/require"
  8. )
  9. func readIssue5302Fixture(t *testing.T, name string, dst any) {
  10. t.Helper()
  11. payload, err := os.ReadFile(filepath.Join("testdata", "issue5302", name))
  12. require.NoError(t, err)
  13. require.NoError(t, json.Unmarshal(payload, dst))
  14. }
  15. func TestChatReasoningAlias_AnthropicNonStreaming(t *testing.T) {
  16. var response ChatCompletionsResponse
  17. readIssue5302Fixture(t, "nonstream_reasoning.json", &response)
  18. out := ChatCompletionsResponseToAnthropic(&response, "claude-sonnet-4-20250514")
  19. require.Len(t, out.Content, 2)
  20. require.Equal(t, "thinking", out.Content[0].Type)
  21. require.Equal(t, "fallback reasoning", out.Content[0].Thinking)
  22. require.Equal(t, "final answer", out.Content[1].Text)
  23. }
  24. func TestChatReasoningAlias_AnthropicStreaming(t *testing.T) {
  25. var chunk ChatCompletionsChunk
  26. readIssue5302Fixture(t, "stream_reasoning.json", &chunk)
  27. events := ChatCompletionsChunkToAnthropicEvents(&chunk, NewChatCompletionsToAnthropicStreamState("reasoning-model"))
  28. var thinking string
  29. for _, event := range events {
  30. if event.Delta != nil && event.Delta.Type == "thinking_delta" {
  31. thinking += event.Delta.Thinking
  32. }
  33. }
  34. require.Equal(t, "streamed fallback", thinking)
  35. }
  36. func TestChatReasoningAlias_ResponsesSharedPaths(t *testing.T) {
  37. var response ChatCompletionsResponse
  38. readIssue5302Fixture(t, "nonstream_reasoning.json", &response)
  39. nonStream := ChatCompletionsResponseToResponses(&response, "reasoning-model", nil, nil, false, nil)
  40. require.Len(t, nonStream.Output, 2)
  41. require.Equal(t, "reasoning", nonStream.Output[0].Type)
  42. require.Equal(t, "fallback reasoning", nonStream.Output[0].Summary[0].Text)
  43. var chunk ChatCompletionsChunk
  44. readIssue5302Fixture(t, "stream_reasoning.json", &chunk)
  45. events := ChatCompletionsChunkToResponsesEvents(&chunk, NewChatCompletionsToResponsesStreamState("reasoning-model"))
  46. var deltas []string
  47. for _, event := range events {
  48. if event.Type == "response.reasoning_summary_text.delta" {
  49. deltas = append(deltas, event.Delta)
  50. }
  51. }
  52. require.Equal(t, []string{"streamed fallback"}, deltas)
  53. }
  54. func TestChatReasoningAlias_ReasoningContentTakesPrecedence(t *testing.T) {
  55. var chunk ChatCompletionsChunk
  56. readIssue5302Fixture(t, "reasoning_content_precedence.json", &chunk)
  57. events := ChatCompletionsChunkToResponsesEvents(&chunk, NewChatCompletionsToResponsesStreamState("reasoning-model"))
  58. var deltas []string
  59. for _, event := range events {
  60. if event.Type == "response.reasoning_summary_text.delta" {
  61. deltas = append(deltas, event.Delta)
  62. }
  63. }
  64. require.Equal(t, []string{"preferred reasoning"}, deltas)
  65. }