Skip to content

Commit 2e88f83

Browse files
committed
Count functions tokens
1 parent 324b918 commit 2e88f83

File tree

7 files changed

+39
-11
lines changed

7 files changed

+39
-11
lines changed

Core/Sources/ChatPlugin/AskChatGPT.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,11 @@ public func askChatGPT(
99
) async throws -> String? {
1010
let configuration = UserPreferenceChatGPTConfiguration()
1111
.overriding(.init(temperature: temperature))
12-
let memory = AutoManagedChatGPTMemory(systemPrompt: systemPrompt, configuration: configuration)
12+
let memory = AutoManagedChatGPTMemory(
13+
systemPrompt: systemPrompt,
14+
configuration: configuration,
15+
functionProvider: NoChatGPTFunctionProvider()
16+
)
1317
let service = ChatGPTService(
1418
memory: memory,
1519
configuration: configuration

Core/Sources/ChatPlugin/CallAIFunction.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ func callAIFunction(
2121
let service = ChatGPTService(
2222
memory: AutoManagedChatGPTMemory(
2323
systemPrompt: "You are now the following python function: ```# \(description)\n\(function)```\n\nOnly respond with your `return` value.",
24-
configuration: configuration
24+
configuration: configuration,
25+
functionProvider: NoChatGPTFunctionProvider()
2526
),
2627
configuration: configuration
2728
)

Core/Sources/PromptToCodeService/OpenAIPromptToCodeAPI.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,8 @@ final class OpenAIPromptToCodeAPI: PromptToCodeAPI {
151151
.overriding(.init(temperature: 0))
152152
let memory = AutoManagedChatGPTMemory(
153153
systemPrompt: systemPrompt,
154-
configuration: configuration
154+
configuration: configuration,
155+
functionProvider: NoChatGPTFunctionProvider()
155156
)
156157
let chatGPTService = ChatGPTService(
157158
memory: memory,

Tool/Sources/LangChain/ChatModel/OpenAIChat.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,11 @@ public struct OpenAIChat: ChatModel {
2222
temperature: temperature,
2323
stop: stops
2424
))
25-
let memory = AutoManagedChatGPTMemory(systemPrompt: "", configuration: configuration)
25+
let memory = AutoManagedChatGPTMemory(
26+
systemPrompt: "",
27+
configuration: configuration,
28+
functionProvider: NoChatGPTFunctionProvider()
29+
)
2630
let service = ChatGPTService(memory: memory, configuration: configuration)
2731
for message in prompt {
2832
let role: OpenAIService.ChatMessage.Role = {

Tool/Sources/OpenAIService/ChatGPTService.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,8 @@ public class ChatGPTService: ChatGPTServiceType {
6565
public init(
6666
memory: ChatGPTMemory = AutoManagedChatGPTMemory(
6767
systemPrompt: "",
68-
configuration: UserPreferenceChatGPTConfiguration()
68+
configuration: UserPreferenceChatGPTConfiguration(),
69+
functionProvider: NoChatGPTFunctionProvider()
6970
),
7071
configuration: ChatGPTConfiguration = UserPreferenceChatGPTConfiguration(),
7172
functionProvider: ChatGPTFunctionProvider = NoChatGPTFunctionProvider()

Tool/Sources/OpenAIService/Memory/AutoManagedChatGPTMemory.swift

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,20 @@ public actor AutoManagedChatGPTMemory: ChatGPTMemory {
1313
}
1414

1515
public var configuration: ChatGPTConfiguration
16+
public var functionProvider: ChatGPTFunctionProvider
1617

1718
static let encoder: TokenEncoder = GPTEncoder()
1819

1920
var onHistoryChange: () -> Void = {}
2021

21-
public init(systemPrompt: String, configuration: ChatGPTConfiguration) {
22+
public init(
23+
systemPrompt: String,
24+
configuration: ChatGPTConfiguration,
25+
functionProvider: ChatGPTFunctionProvider
26+
) {
2227
self.systemPrompt = .init(role: .system, content: systemPrompt)
2328
self.configuration = configuration
29+
self.functionProvider = functionProvider
2430
}
2531

2632
public func mutateHistory(_ update: (inout [ChatMessage]) -> Void) {
@@ -48,11 +54,22 @@ public actor AutoManagedChatGPTMemory: ChatGPTMemory {
4854
message.tokensCount = count
4955
return count
5056
}
51-
57+
5258
var all: [ChatMessage] = []
5359
let systemMessageTokenCount = countToken(&systemPrompt)
54-
var allTokensCount = systemPrompt.isEmpty ? 0 : systemMessageTokenCount
55-
60+
let functionTokenCount = functionProvider.functions.reduce(into: 0) { partial, function in
61+
var count = encoder.countToken(text: function.name)
62+
+ encoder.countToken(text: function.description)
63+
if let data = try? JSONEncoder().encode(function.argumentSchema),
64+
let string = String(data: data, encoding: .utf8)
65+
{
66+
count += encoder.countToken(text: string)
67+
}
68+
partial += count
69+
}
70+
var allTokensCount = functionTokenCount
71+
allTokensCount += systemPrompt.isEmpty ? 0 : systemMessageTokenCount
72+
5673
for (index, message) in history.enumerated().reversed() {
5774
if maxNumberOfMessages > 0, all.count >= maxNumberOfMessages { break }
5875
if message.isEmpty { continue }

Tool/Sources/OpenAIService/Tokenizer.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ extension TokenEncoder {
2323
return total
2424
}
2525

26-
func countToken(functionJSONSchema: String) -> Int {
27-
encode(text: functionJSONSchema).count
26+
func countToken(text: String) -> Int {
27+
encode(text: text).count
2828
}
2929
}
3030

0 commit comments

Comments
 (0)