| package promptcompat |
|
|
| import ( |
| "fmt" |
| "strings" |
| ) |
|
|
| const CurrentInputContextFilename = "context_context.txt" |
|
|
| const historyTranscriptTitle = "# context_context.txt" |
|
|
| func BuildOpenAIHistoryTranscript(messages []any) string { |
| return buildOpenAIHistoryTranscript(messages) |
| } |
|
|
| func BuildOpenAICurrentUserInputTranscript(text string) string { |
| if strings.TrimSpace(text) == "" { |
| return "" |
| } |
| return buildOpenAIHistoryTranscript([]any{ |
| map[string]any{"role": "user", "content": text}, |
| }) |
| } |
|
|
| func BuildOpenAICurrentInputContextTranscript(messages []any) string { |
| return buildOpenAIHistoryTranscript(messages) |
| } |
|
|
| func buildOpenAIHistoryTranscript(messages []any) string { |
| if len(messages) == 0 { |
| return "" |
| } |
| var b strings.Builder |
| b.WriteString(historyTranscriptTitle) |
| b.WriteString("\n\n") |
|
|
| entry := 0 |
| for _, raw := range messages { |
| msg, ok := raw.(map[string]any) |
| if !ok { |
| continue |
| } |
| role := normalizeOpenAIRoleForPrompt(strings.ToLower(strings.TrimSpace(asString(msg["role"])))) |
| content := strings.TrimSpace(buildOpenAIHistoryEntry(role, msg)) |
| if content == "" { |
| continue |
| } |
| entry++ |
| fmt.Fprintf(&b, "=== %d ===\n[r=%d]\n%s\n\n", entry, roleCodeForHistory(role), content) |
| } |
|
|
| transcript := strings.TrimSpace(b.String()) |
| if transcript == "" { |
| return "" |
| } |
| return transcript + "\n" |
| } |
|
|
| func buildOpenAIHistoryEntry(role string, msg map[string]any) string { |
| switch role { |
| case "assistant": |
| return strings.TrimSpace(buildAssistantContentForPrompt(msg)) |
| case "tool", "function": |
| return strings.TrimSpace(buildToolHistoryContent(msg)) |
| case "system", "user": |
| return strings.TrimSpace(NormalizeOpenAIContentForPrompt(msg["content"])) |
| default: |
| return strings.TrimSpace(NormalizeOpenAIContentForPrompt(msg["content"])) |
| } |
| } |
|
|
| func buildToolHistoryContent(msg map[string]any) string { |
| content := strings.TrimSpace(NormalizeOpenAIContentForPrompt(msg["content"])) |
| parts := make([]string, 0, 2) |
| if name := strings.TrimSpace(asString(msg["name"])); name != "" { |
| parts = append(parts, "name="+name) |
| } |
| if callID := strings.TrimSpace(asString(msg["tool_call_id"])); callID != "" { |
| parts = append(parts, "tool_call_id="+callID) |
| } |
| header := "" |
| if len(parts) > 0 { |
| header = "[" + strings.Join(parts, " ") + "]" |
| } |
| switch { |
| case header != "" && content != "": |
| return header + "\n" + content |
| case header != "": |
| return header |
| default: |
| return content |
| } |
| } |
|
|
| func roleLabelForHistory(role string) string { |
| role = strings.ToLower(strings.TrimSpace(role)) |
| switch role { |
| case "function": |
| return "tool" |
| case "": |
| return "unknown" |
| default: |
| return role |
| } |
| } |
|
|
| func roleCodeForHistory(role string) int { |
| role = strings.ToLower(strings.TrimSpace(role)) |
| switch role { |
| case "system": |
| return 0 |
| case "user": |
| return 1 |
| case "assistant": |
| return 2 |
| case "tool", "function": |
| return 3 |
| default: |
| return 9 |
| } |
| } |
|
|