@@ -30,6 +30,7 @@ public protocol ChatServiceType {
3030 references: [ ConversationAttachedReference ] ,
3131 model: String ? ,
3232 modelProviderName: String ? ,
33+ reasoningEffort: String ? ,
3334 agentMode: Bool ,
3435 customChatModeId: String ? ,
3536 userLanguage: String ? ,
@@ -363,6 +364,7 @@ public final class ChatService: ChatServiceType, ObservableObject {
363364 references: [ ConversationAttachedReference ] ,
364365 model: String ? = nil ,
365366 modelProviderName: String ? = nil ,
367+ reasoningEffort: String ? = nil ,
366368 agentMode: Bool = false ,
367369 customChatModeId: String ? = nil ,
368370 userLanguage: String ? = nil ,
@@ -469,6 +471,7 @@ public final class ChatService: ChatServiceType, ObservableObject {
469471 references: references,
470472 model: model,
471473 modelProviderName: modelProviderName,
474+ reasoningEffort: reasoningEffort,
472475 agentMode: agentMode,
473476 customChatModeId: customChatModeId,
474477 userLanguage: userLanguage,
@@ -500,6 +503,7 @@ public final class ChatService: ChatServiceType, ObservableObject {
500503 references: [ ConversationAttachedReference ] ,
501504 model: String ? = nil ,
502505 modelProviderName: String ? = nil ,
506+ reasoningEffort: String ? = nil ,
503507 agentMode: Bool = false ,
504508 customChatModeId: String ? = nil ,
505509 userLanguage: String ? = nil ,
@@ -526,6 +530,7 @@ public final class ChatService: ChatServiceType, ObservableObject {
526530 references: references,
527531 model: model,
528532 modelProviderName: modelProviderName,
533+ reasoningEffort: reasoningEffort,
529534 agentMode: agentMode,
530535 customChatModeId: customChatModeId,
531536 userLanguage: userLanguage,
@@ -537,7 +542,10 @@ public final class ChatService: ChatServiceType, ObservableObject {
537542 await memory. mutateHistory { history in
538543 if let index = history. firstIndex ( where: { $0. id == response. turnId && $0. role. isAssistant } ) {
539544 history [ index] . modelName = response. modelName
545+ let modelProviderName = response. modelInfo? . providerName ?? response. modelProviderName
546+ history [ index] . modelProviderName = modelProviderName
540547 history [ index] . billingMultiplier = response. billingMultiplier
548+ history [ index] . reasoningEffort = response. modelInfo? . reasoningEffort
541549
542550 self . saveChatMessageToStorage ( history [ index] )
543551 }
@@ -998,6 +1006,16 @@ public final class ChatService: ChatServiceType, ObservableObject {
9981006 }
9991007 }
10001008
1009+ private func strippingRequestIDs( from message: String ) -> String {
1010+ // "Request ID:" always appears before "GitHub Request ID:", so cutting at the first
1011+ // occurrence removes both along with the preceding separator (". " or " | ")
1012+ guard let range = message. range ( of: " Request ID: " , options: . caseInsensitive) else {
1013+ return message
1014+ }
1015+ return String ( message [ ..< range. lowerBound] )
1016+ . trimmingCharacters ( in: CharacterSet ( charactersIn: " | \t \n \r " ) )
1017+ }
1018+
10011019 private func handleProgressEnd( token: String , progress: ConversationProgressEnd ) {
10021020 guard let workDoneToken = activeRequestId, workDoneToken == token else { return }
10031021
@@ -1011,12 +1029,13 @@ public final class ChatService: ChatServiceType, ObservableObject {
10111029 Task {
10121030 let selectedModel = lastUserRequest? . model
10131031 let selectedModelProviderName = lastUserRequest? . modelProviderName
1014-
1032+ let isBYOK = selectedModel != nil && selectedModelProviderName != nil
1033+
10151034 var errorMessageText : String
10161035 if let selectedModel = selectedModel, let selectedModelProviderName = selectedModelProviderName {
10171036 errorMessageText = " You've reached your quota limit for your BYOK model \( selectedModel) . Please check with \( selectedModelProviderName) for more information. "
10181037 } else {
1019- errorMessageText = CLSError . message
1038+ errorMessageText = strippingRequestIDs ( from : CLSError . message)
10201039 }
10211040
10221041 await Status . shared
@@ -1026,10 +1045,12 @@ public final class ChatService: ChatServiceType, ObservableObject {
10261045 chatTabID: chatTabInfo. id,
10271046 panelMessages: [ . init( type: . error, title: String ( CLSError . code ?? 0 ) , message: errorMessageText, location: . Panel) ]
10281047 )
1029- // will persist in resetongoingRequest()
10301048 await memory. appendMessage ( errorMessage)
1031-
1032- if let lastUserRequest,
1049+
1050+ // TBB messages mention "AI Credits" or "additional overages" — no fallback for TBB
1051+ let isTBB = !isBYOK && ( CLSError . message. contains ( " AI Credits " ) || CLSError . message. contains ( " additional overages " ) )
1052+ if !isTBB,
1053+ let lastUserRequest,
10331054 let currentUserPlan = await Status . shared. currentUserPlan ( ) ,
10341055 currentUserPlan != " free " {
10351056 guard let fallbackModel = CopilotModelManager . getFallbackLLM (
@@ -1051,6 +1072,7 @@ public final class ChatService: ChatServiceType, ObservableObject {
10511072 }
10521073 return
10531074 }
1075+ resetOngoingRequest ( with: . error)
10541076 }
10551077 } else if CLSError . code == 400 && CLSError . message. contains ( " model is not supported " ) {
10561078 Task {
0 commit comments