返回 DeepSeek-Reasonix
summary_content.go
根目录 / internal / imageinput / summary_content.go
1 package imageinput
2
3 import (
4 "crypto/sha256"
5 "encoding/base64"
6 "encoding/hex"
7 "fmt"
8 "strings"
9 "unicode/utf8"
10
11 "reasonix/internal/provider"
12 )
13
14 func ImageDigest(ref string) string {
15 ref = strings.TrimSpace(ref)
16 if media, payload, ok := provider.ParseImageDataURL(ref); ok {
17 if raw, err := base64.StdEncoding.DecodeString(payload); err == nil {
18 h := sha256.New()
19 h.Write([]byte(media))
20 h.Write(raw)
21 return hex.EncodeToString(h.Sum(nil))
22 }
23 }
24 sum := sha256.Sum256([]byte(ref))
25 return hex.EncodeToString(sum[:])
26 }
27
28 func visionSummaryContext(summary *provider.VisionSummary) string {
29 if summary == nil || strings.TrimSpace(summary.Summary) == "" {
30 return ""
31 }
32 return fmt.Sprintf("<reasonix-image-context version=\"%d\" untrusted=\"true\">\n%s\n</reasonix-image-context>", summary.Version, "Image understanding summary from "+summary.ModelRef+":\n"+strings.TrimSpace(summary.Summary))
33 }
34
35 func AppendSummary(input string, summary *provider.VisionSummary) string {
36 block := visionSummaryContext(summary)
37 if block == "" {
38 return input
39 }
40 return strings.TrimRight(input, "\n") + "\n\n" + block
41 }
42
43 func sameImageDigests(a, b []string) bool {
44 if len(a) != len(b) {
45 return false
46 }
47 for i := range a {
48 if a[i] != b[i] {
49 return false
50 }
51 }
52 return true
53 }
54
55 func boundedVisionSummary(text string) string {
56 text = strings.TrimSpace(text)
57 if len(text) <= visionSummaryMaxBytes {
58 return text
59 }
60 limit := visionSummaryMaxBytes - len("\n[summary truncated]")
61 cut := text[:limit]
62 for !utf8.ValidString(cut) {
63 cut = cut[:len(cut)-1]
64 }
65 return cut + "\n[summary truncated]"
66 }
67
67 lines GO