@@ -86,27 +86,35 @@ struct ChatModelEdit: ReducerProtocol {
8686 )
8787 return . run { send in
8888 do {
89- let reply =
90- try await ChatGPTService (
91- configuration: UserPreferenceChatGPTConfiguration ( )
92- . overriding {
93- $0. model = model
94- }
95- ) . sendAndWait ( content: " Hello " )
89+ let service = ChatGPTService (
90+ configuration: UserPreferenceChatGPTConfiguration ( )
91+ . overriding {
92+ $0. model = model
93+ }
94+ )
95+ let reply = try await service
96+ . sendAndWait ( content: " Respond with \" Test succeeded \" " )
9697 await send ( . testSucceeded( reply ?? " No Message " ) )
98+ let stream = try await service
99+ . send ( content: " Respond with \" Stream response is working \" " )
100+ var streamReply = " "
101+ for try await chunk in stream {
102+ streamReply += chunk
103+ }
104+ await send ( . testSucceeded( streamReply) )
97105 } catch {
98106 await send ( . testFailed( error. localizedDescription) )
99107 }
100108 }
101109
102110 case let . testSucceeded( message) :
103111 state. isTesting = false
104- toast ( message, . info)
112+ toast ( message. trimmingCharacters ( in : . whitespacesAndNewlines ) , . info)
105113 return . none
106114
107115 case let . testFailed( message) :
108116 state. isTesting = false
109- toast ( message, . error)
117+ toast ( message. trimmingCharacters ( in : . whitespacesAndNewlines ) , . error)
110118 return . none
111119
112120 case . refreshAvailableModelNames:
@@ -132,6 +140,15 @@ struct ChatModelEdit: ReducerProtocol {
132140 state. suggestedMaxTokens = nil
133141 }
134142 return . none
143+ case . claude:
144+ if let knownModel = ClaudeChatCompletionsService
145+ . KnownModel ( rawValue: state. modelName)
146+ {
147+ state. suggestedMaxTokens = knownModel. contextWindow
148+ } else {
149+ state. suggestedMaxTokens = nil
150+ }
151+ return . none
135152 default :
136153 state. suggestedMaxTokens = nil
137154 return . none
@@ -192,13 +209,12 @@ extension ChatModel {
192209 isFullURL: state. isFullURL,
193210 maxTokens: state. maxTokens,
194211 supportsFunctionCalling: {
195- if case . googleAI = state. format {
196- return false
197- }
198- if case . ollama = state. format {
212+ switch state. format {
213+ case . googleAI, . ollama, . claude:
199214 return false
215+ case . azureOpenAI, . openAI, . openAICompatible:
216+ return state. supportsFunctionCalling
200217 }
201- return state. supportsFunctionCalling
202218 } ( ) ,
203219 modelName: state. modelName. trimmingCharacters ( in: . whitespacesAndNewlines) ,
204220 ollamaInfo: . init( keepAlive: state. ollamaKeepAlive)
0 commit comments