diff --git a/internal/adapter/openai/message_normalize.go b/internal/adapter/openai/message_normalize.go index bbc5800..724cb9f 100644 --- a/internal/adapter/openai/message_normalize.go +++ b/internal/adapter/openai/message_normalize.go @@ -6,6 +6,7 @@ import ( "strings" "ds2api/internal/config" + "ds2api/internal/prompt" ) func normalizeOpenAIMessagesForPrompt(raw []any, traceID string) []map[string]any { @@ -132,35 +133,7 @@ func formatToolResultForPrompt(msg map[string]any) string { } func normalizeOpenAIContentForPrompt(v any) string { - if v == nil { - return "" - } - switch x := v.(type) { - case string: - return x - case []any: - parts := make([]string, 0, len(x)) - for _, item := range x { - m, ok := item.(map[string]any) - if !ok { - continue - } - t := strings.ToLower(strings.TrimSpace(asString(m["type"]))) - if t != "text" && t != "output_text" && t != "input_text" { - continue - } - if text := asString(m["text"]); text != "" { - parts = append(parts, text) - continue - } - if text := asString(m["content"]); text != "" { - parts = append(parts, text) - } - } - return strings.Join(parts, "\n") - default: - return marshalToPromptString(v) - } + return prompt.NormalizeContent(v) } func normalizeOpenAIArgumentsForPrompt(v any) string { diff --git a/internal/prompt/messages.go b/internal/prompt/messages.go index 69cfe5a..5e124b4 100644 --- a/internal/prompt/messages.go +++ b/internal/prompt/messages.go @@ -51,6 +51,9 @@ func MessagesPrepare(messages []map[string]any) string { } func NormalizeContent(v any) string { + if v == nil { + return "" + } switch x := v.(type) { case string: return x diff --git a/internal/prompt/messages_test.go b/internal/prompt/messages_test.go new file mode 100644 index 0000000..0407552 --- /dev/null +++ b/internal/prompt/messages_test.go @@ -0,0 +1,23 @@ +package prompt + +import "testing" + +func TestNormalizeContentNilReturnsEmpty(t *testing.T) { + if got := NormalizeContent(nil); got != "" { + t.Fatalf("expected empty string for nil content, got %q", got) + } +} + +func TestMessagesPrepareNilContentNoNullLiteral(t *testing.T) { + messages := []map[string]any{ + {"role": "assistant", "content": nil}, + {"role": "user", "content": "ok"}, + } + got := MessagesPrepare(messages) + if got == "" { + t.Fatalf("expected non-empty output") + } + if got == "null" { + t.Fatalf("expected no null literal output, got %q", got) + } +}