-
Notifications
You must be signed in to change notification settings - Fork 17
/
Copy pathtokens.go
70 lines (59 loc) · 2.13 KB
/
tokens.go
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
package deepseek
import (
"unicode"
)
// TokenEstimate represents an estimated token count
type TokenEstimate struct {
EstimatedTokens int `json:"estimated_tokens"` //the total estimated prompt tokens. These are different form total tokens used.
}
// EstimateTokenCount estimates the number of tokens in a text based on character type ratios
func EstimateTokenCount(text string) *TokenEstimate {
var total float64
for _, r := range text {
if unicode.Is(unicode.Han, r) {
// Chinese character ≈ 0.6 token
total += 0.6
} else if unicode.IsLetter(r) || unicode.IsNumber(r) || unicode.IsPunct(r) || unicode.IsSymbol(r) {
// English character/number/symbol ≈ 0.3 token
total += 0.3
}
// Skip whitespace and other characters
}
// Round up to nearest integer
estimatedTokens := int(total + 0.5)
if estimatedTokens < 1 {
estimatedTokens = 1
}
return &TokenEstimate{
EstimatedTokens: estimatedTokens,
}
}
// EstimateTokensFromMessages estimates the number of tokens in a list of chat messages
func EstimateTokensFromMessages(messages *ChatCompletionRequest) *TokenEstimate {
var totalTokens int
for _, msg := range messages.Messages {
// Add tokens for role (system/user/assistant)
totalTokens += 2 // Approximate tokens for role
// Add tokens for content
totalTokens += EstimateTokenCount(msg.Content).EstimatedTokens
}
for _, tool := range messages.Tools {
// Add tokens for function name and description
totalTokens += EstimateTokenCount(tool.Function.Name).EstimatedTokens
totalTokens += EstimateTokenCount(tool.Function.Description).EstimatedTokens
// Add tokens for function parameters if present
if tool.Function.Parameters != nil {
totalTokens += EstimateTokenCount(tool.Function.Parameters.Type).EstimatedTokens
for key, value := range tool.Function.Parameters.Properties {
totalTokens += EstimateTokenCount(key).EstimatedTokens
totalTokens += EstimateTokenCount(value.(string)).EstimatedTokens
}
for _, req := range tool.Function.Parameters.Required {
totalTokens += EstimateTokenCount(req).EstimatedTokens
}
}
}
return &TokenEstimate{
EstimatedTokens: totalTokens,
}
}