File size: 3,120 Bytes
8d3471e | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | package rawsample
import (
"encoding/json"
"strings"
)
//nolint:unused // retained for raw-sample processing entrypoints.
func extractProcessedVisibleText(raw []byte, kind, contentType string) string {
if len(raw) == 0 {
return ""
}
switch strings.ToLower(strings.TrimSpace(kind)) {
case "json":
return parseOpenAIJSONText(string(raw))
case "stream":
return parseOpenAIStreamText(string(raw))
}
ct := strings.ToLower(strings.TrimSpace(contentType))
if strings.Contains(ct, "application/json") {
return parseOpenAIJSONText(string(raw))
}
return parseOpenAIStreamText(string(raw))
}
//nolint:unused // retained for raw-sample processing entrypoints.
func parseOpenAIStreamText(raw string) string {
if strings.TrimSpace(raw) == "" {
return ""
}
var out strings.Builder
for _, block := range strings.Split(raw, "\n\n") {
if strings.TrimSpace(block) == "" {
continue
}
dataLines := make([]string, 0, 2)
for _, line := range strings.Split(block, "\n") {
if !strings.HasPrefix(line, "data:") {
continue
}
dataLines = append(dataLines, strings.TrimSpace(strings.TrimPrefix(line, "data:")))
}
if len(dataLines) == 0 {
continue
}
payload := strings.TrimSpace(strings.Join(dataLines, "\n"))
if payload == "" || payload == "[DONE]" || !strings.HasPrefix(payload, "{") {
continue
}
var decoded any
if err := json.Unmarshal([]byte(payload), &decoded); err != nil {
continue
}
out.WriteString(extractOpenAIVisibleTextValue(decoded))
}
return out.String()
}
//nolint:unused // retained for raw-sample processing entrypoints.
func parseOpenAIJSONText(raw string) string {
if strings.TrimSpace(raw) == "" {
return ""
}
var decoded any
if err := json.Unmarshal([]byte(raw), &decoded); err != nil {
return ""
}
return extractOpenAIVisibleTextValue(decoded)
}
//nolint:unused // retained for raw-sample processing entrypoints.
func extractOpenAIVisibleTextValue(v any) string {
switch x := v.(type) {
case nil:
return ""
case string:
return x
case []any:
var out strings.Builder
for _, item := range x {
out.WriteString(extractOpenAIVisibleTextValue(item))
}
return out.String()
case map[string]any:
var out strings.Builder
if s, ok := x["output_text"].(string); ok {
out.WriteString(s)
}
if arr, ok := x["output"].([]any); ok {
for _, item := range arr {
out.WriteString(extractOpenAIVisibleTextValue(item))
}
}
if arr, ok := x["choices"].([]any); ok {
for _, item := range arr {
out.WriteString(extractOpenAIVisibleTextValue(item))
}
}
if msg, ok := x["message"]; ok {
out.WriteString(extractOpenAIVisibleTextValue(msg))
}
if delta, ok := x["delta"]; ok {
out.WriteString(extractOpenAIVisibleTextValue(delta))
}
if content, ok := x["content"]; ok {
out.WriteString(extractOpenAIVisibleTextValue(content))
}
if reasoning, ok := x["reasoning_content"]; ok {
out.WriteString(extractOpenAIVisibleTextValue(reasoning))
}
if text, ok := x["text"]; ok {
out.WriteString(extractOpenAIVisibleTextValue(text))
}
return out.String()
default:
return ""
}
}
|