@@ -2,6 +2,7 @@ import SwiftUI
2
2
import ChatService
3
3
import Persist
4
4
import ComposableArchitecture
5
+ import GitHubCopilotService
5
6
6
7
public let SELECTED_LLM_KEY = " selectedLLM "
7
8
@@ -27,6 +28,18 @@ extension AppState {
27
28
}
28
29
}
29
30
31
+ extension CopilotModelManager {
32
+ static func getAvailableChatLLMs( ) -> [ LLMModel ] {
33
+ let LLMs = CopilotModelManager . getAvailableLLMs ( )
34
+ let availableModels = LLMs . filter (
35
+ { $0. scopes. contains ( . chatPanel) }
36
+ ) . map {
37
+ LLMModel ( modelName: $0. modelName, modelFamily: $0. modelFamily)
38
+ }
39
+ return availableModels. isEmpty ? [ defaultModel] : availableModels
40
+ }
41
+ }
42
+
30
43
struct LLMModel : Codable , Hashable {
31
44
let modelName : String
32
45
let modelFamily : String
@@ -35,12 +48,15 @@ struct LLMModel: Codable, Hashable {
35
48
let defaultModel = LLMModel ( modelName: " GPT-4o " , modelFamily: " gpt-4o " )
36
49
struct ModelPicker : View {
37
50
@State private var selectedModel = defaultModel. modelName
38
- @State private var models : [ LLMModel ] = [ defaultModel ]
39
51
@State private var isHovered = false
40
52
@State private var isPressed = false
41
53
42
54
init ( ) {
43
- self . updateCurrentModel ( )
55
+ self . updateCurrentModel ( )
56
+ }
57
+
58
+ var models : [ LLMModel ] {
59
+ CopilotModelManager . getAvailableChatLLMs ( )
44
60
}
45
61
46
62
func updateCurrentModel( ) {
@@ -74,13 +90,9 @@ struct ModelPicker: View {
74
90
isHovered = hovering
75
91
}
76
92
. onAppear ( ) {
93
+ updateCurrentModel ( )
77
94
Task {
78
- updateCurrentModel ( )
79
- self . models = await ChatService . shared. copilotModels ( ) . filter (
80
- { $0. scopes. contains ( . chatPanel) }
81
- ) . map {
82
- LLMModel ( modelName: $0. modelName, modelFamily: $0. modelFamily)
83
- }
95
+ await refreshModels ( )
84
96
}
85
97
}
86
98
. help ( " Pick Model " )
@@ -93,6 +105,14 @@ struct ModelPicker: View {
93
105
let width = selectedModel. size ( withAttributes: attributes) . width
94
106
return CGFloat ( width + 20 )
95
107
}
108
+
109
+ @MainActor
110
+ func refreshModels( ) async {
111
+ let copilotModels = await ChatService . shared. copilotModels ( )
112
+ if !copilotModels. isEmpty {
113
+ CopilotModelManager . updateLLMs ( copilotModels)
114
+ }
115
+ }
96
116
}
97
117
98
118
struct ModelPicker_Previews : PreviewProvider {
0 commit comments