| package promptcompat |
|
|
| import ( |
| "fmt" |
| "strings" |
| ) |
|
|
| func ResponsesMessagesFromRequest(req map[string]any) []any { |
| if msgs, ok := req["messages"].([]any); ok && len(msgs) > 0 { |
| return prependInstructionMessage(msgs, req["instructions"]) |
| } |
| if rawInput, ok := req["input"]; ok { |
| if msgs := NormalizeResponsesInputAsMessages(rawInput); len(msgs) > 0 { |
| return prependInstructionMessage(msgs, req["instructions"]) |
| } |
| } |
| return nil |
| } |
|
|
| func prependInstructionMessage(messages []any, instructions any) []any { |
| sys, _ := instructions.(string) |
| sys = strings.TrimSpace(sys) |
| if sys == "" { |
| return messages |
| } |
| out := make([]any, 0, len(messages)+1) |
| out = append(out, map[string]any{"role": "system", "content": sys}) |
| out = append(out, messages...) |
| return out |
| } |
|
|
| func NormalizeResponsesInputAsMessages(input any) []any { |
| switch v := input.(type) { |
| case string: |
| if strings.TrimSpace(v) == "" { |
| return nil |
| } |
| return []any{map[string]any{"role": "user", "content": v}} |
| case []any: |
| return normalizeResponsesInputArray(v) |
| case map[string]any: |
| if msg := normalizeResponsesInputItem(v); msg != nil { |
| return []any{msg} |
| } |
| if txt, _ := v["text"].(string); strings.TrimSpace(txt) != "" { |
| return []any{map[string]any{"role": "user", "content": txt}} |
| } |
| if content, ok := v["content"]; ok { |
| if strings.TrimSpace(NormalizeOpenAIContentForPrompt(content)) != "" { |
| return []any{map[string]any{"role": "user", "content": content}} |
| } |
| } |
| } |
| return nil |
| } |
|
|
| func normalizeResponsesInputArray(items []any) []any { |
| if len(items) == 0 { |
| return nil |
| } |
| out := make([]any, 0, len(items)) |
| callNameByID := map[string]string{} |
| fallbackParts := make([]string, 0, len(items)) |
| flushFallback := func() { |
| if len(fallbackParts) == 0 { |
| return |
| } |
| out = append(out, map[string]any{"role": "user", "content": strings.Join(fallbackParts, "\n")}) |
| fallbackParts = fallbackParts[:0] |
| } |
|
|
| for _, item := range items { |
| switch x := item.(type) { |
| case map[string]any: |
| if msg := normalizeResponsesInputItemWithState(x, callNameByID); msg != nil { |
| flushFallback() |
| out = append(out, msg) |
| continue |
| } |
| if s := normalizeResponsesFallbackPart(x); s != "" { |
| fallbackParts = append(fallbackParts, s) |
| } |
| default: |
| if s := strings.TrimSpace(fmt.Sprintf("%v", item)); s != "" { |
| fallbackParts = append(fallbackParts, s) |
| } |
| } |
| } |
| flushFallback() |
| if len(out) == 0 { |
| return nil |
| } |
| return out |
| } |
|
|