package llm import "unicode/utf8" // EstimateTokens 是兜底估算:按 rune 数 / 4 向上取整。 // 真正的 tiktoken/远程精确计数由各 provider 的 CountTokens 实现。 func EstimateTokens(s string) int { if s == "" { return 0 } runes := utf8.RuneCountInString(s) if runes == 0 { return 0 } return (runes + 3) / 4 } // EstimateRequestTokens 累加 system prompt + 所有 messages 的 text block。 // image/document block 暂按 0 计(多模态 token 估算各家差异大,热路径不依赖)。 func EstimateRequestTokens(req Request) int { total := EstimateTokens(req.SystemPrompt) for _, m := range req.Messages { for _, b := range m.Blocks { if b.Type == "text" { total += EstimateTokens(b.Text) } } } return total }