(messages []dto.ClaudeMessage, model string, stream bool)
| 218 | } |
| 219 | |
| 220 | func CountTokenClaudeMessages(messages []dto.ClaudeMessage, model string, stream bool) (int, error) { |
| 221 | tokenEncoder := getTokenEncoder(model) |
| 222 | tokenNum := 0 |
| 223 | |
| 224 | for _, message := range messages { |
| 225 | // Count tokens for role |
| 226 | tokenNum += getTokenNum(tokenEncoder, message.Role) |
| 227 | if message.IsStringContent() { |
| 228 | tokenNum += getTokenNum(tokenEncoder, message.GetStringContent()) |
| 229 | } else { |
| 230 | content, err := message.ParseContent() |
| 231 | if err != nil { |
| 232 | return 0, err |
| 233 | } |
| 234 | for _, mediaMessage := range content { |
| 235 | switch mediaMessage.Type { |
| 236 | case "text": |
| 237 | tokenNum += getTokenNum(tokenEncoder, mediaMessage.GetText()) |
| 238 | case "image": |
| 239 | //imageTokenNum, err := getClaudeImageToken(mediaMsg.Source, model, stream) |
| 240 | //if err != nil { |
| 241 | // return 0, err |
| 242 | //} |
| 243 | tokenNum += 1000 |
| 244 | case "tool_use": |
| 245 | if mediaMessage.Input != nil { |
| 246 | tokenNum += getTokenNum(tokenEncoder, mediaMessage.Name) |
| 247 | inputJSON, _ := json.Marshal(mediaMessage.Input) |
| 248 | tokenNum += getTokenNum(tokenEncoder, string(inputJSON)) |
| 249 | } |
| 250 | case "tool_result": |
| 251 | if mediaMessage.Content != nil { |
| 252 | contentJSON, _ := json.Marshal(mediaMessage.Content) |
| 253 | tokenNum += getTokenNum(tokenEncoder, string(contentJSON)) |
| 254 | } |
| 255 | } |
| 256 | } |
| 257 | } |
| 258 | } |
| 259 | |
| 260 | // Add a constant for message formatting (this may need adjustment based on Claude's exact formatting) |
| 261 | tokenNum += len(messages) * 2 // Assuming 2 tokens per message for formatting |
| 262 | |
| 263 | return tokenNum, nil |
| 264 | } |
| 265 | |
| 266 | func CountTokenClaudeTools(tools []dto.Tool, model string) (int, error) { |
| 267 | tokenEncoder := getTokenEncoder(model) |
no test coverage detected