Skip to content

Commit d085169

Browse files
committed
Add UI form Ollama models
1 parent df23c0f commit d085169

8 files changed

Lines changed: 70 additions & 11 deletions

File tree

Core/Sources/CodeCompletionService/CodeCompletionService.swift

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,9 @@ public struct CodeCompletionService {
120120
url: model.endpoint,
121121
endpoint: .chatCompletion,
122122
modelName: model.info.modelName,
123-
stopWords: prompt.stopWords
123+
stopWords: prompt.stopWords,
124+
keepAlive: model.info.ollamaKeepAlive,
125+
format: .none
124126
)
125127
let result = try await service.getCompletions(prompt, count: count)
126128
try Task.checkCancellation()
@@ -165,7 +167,9 @@ public struct CodeCompletionService {
165167
url: model.endpoint,
166168
endpoint: .completion,
167169
modelName: model.info.modelName,
168-
stopWords: prompt.stopWords
170+
stopWords: prompt.stopWords,
171+
keepAlive: model.info.ollamaKeepAlive,
172+
format: .none
169173
)
170174
let result = try await service.getCompletions(prompt, count: count)
171175
try Task.checkCancellation()

Core/Sources/CodeCompletionService/OllamaService.swift

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,13 @@ public actor OllamaService {
99
let maxToken: Int
1010
let temperature: Double
1111
let stopWords: [String]
12+
let keepAlive: String
13+
let format: ResponseFormat
14+
15+
public enum ResponseFormat: String {
16+
case none = ""
17+
case json = "json"
18+
}
1219

1320
public enum Endpoint {
1421
case completion
@@ -21,7 +28,9 @@ public actor OllamaService {
2128
modelName: String,
2229
maxToken: Int? = nil,
2330
temperature: Double = 0.2,
24-
stopWords: [String] = []
31+
stopWords: [String] = [],
32+
keepAlive: String = "",
33+
format: ResponseFormat = .none
2534
) {
2635
self.url = url.flatMap(URL.init(string:)) ?? {
2736
switch endpoint {
@@ -37,6 +46,8 @@ public actor OllamaService {
3746
self.maxToken = maxToken ?? 4096
3847
self.temperature = temperature
3948
self.stopWords = stopWords
49+
self.keepAlive = keepAlive
50+
self.format = format
4051
}
4152
}
4253

@@ -112,6 +123,8 @@ extension OllamaService {
112123
var messages: [Message]
113124
var stream: Bool
114125
var options: Options
126+
var keep_alive: String?
127+
var format: String?
115128
}
116129

117130
struct ChatCompletionResponseChunk: Decodable {
@@ -156,7 +169,9 @@ extension OllamaService {
156169
temperature: temperature,
157170
stop: stopWords,
158171
num_predict: 300
159-
)
172+
),
173+
keep_alive: keepAlive.isEmpty ? nil : keepAlive,
174+
format: format == .none ? nil : format.rawValue
160175
)
161176

162177
var request = URLRequest(url: url)
@@ -189,6 +204,8 @@ extension OllamaService {
189204
var prompt: String
190205
var stream: Bool
191206
var options: ChatCompletionRequestBody.Options
207+
var keep_alive: String?
208+
var format: String?
192209
}
193210

194211
func createPrompt(from request: PromptStrategy) -> String {
@@ -209,7 +226,9 @@ extension OllamaService {
209226
temperature: temperature,
210227
stop: stopWords,
211228
num_predict: 300
212-
)
229+
),
230+
keep_alive: keepAlive.isEmpty ? nil : keepAlive,
231+
format: format == .none ? nil : format.rawValue
213232
)
214233

215234
var request = URLRequest(url: url)

Core/Sources/Fundamental/Models/ChatModel.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ public struct ChatModel: Codable, Equatable, Identifiable {
4646
get { modelName }
4747
set { modelName = newValue }
4848
}
49+
@FallbackDecoding<EmptyString>
50+
public var ollamaKeepAlive: String
4951

5052
public init(
5153
apiKeyName: String = "",
@@ -54,7 +56,8 @@ public struct ChatModel: Codable, Equatable, Identifiable {
5456
maxTokens: Int = 4000,
5557
supportsFunctionCalling: Bool = true,
5658
supportsOpenAIAPI2023_11: Bool = false,
57-
modelName: String = ""
59+
modelName: String = "",
60+
ollamaKeepAlive: String = ""
5861
) {
5962
self.apiKeyName = apiKeyName
6063
self.baseURL = baseURL
@@ -63,6 +66,7 @@ public struct ChatModel: Codable, Equatable, Identifiable {
6366
self.supportsFunctionCalling = supportsFunctionCalling
6467
self.supportsOpenAIAPI2023_11 = supportsOpenAIAPI2023_11
6568
self.modelName = modelName
69+
self.ollamaKeepAlive = ollamaKeepAlive
6670
}
6771
}
6872

Core/Sources/Fundamental/Models/CompletionModel.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,19 +41,23 @@ public struct CompletionModel: Codable, Equatable, Identifiable {
4141
get { modelName }
4242
set { modelName = newValue }
4343
}
44+
@FallbackDecoding<EmptyString>
45+
public var ollamaKeepAlive: String
4446

4547
public init(
4648
apiKeyName: String = "",
4749
baseURL: String = "",
4850
isFullURL: Bool = false,
4951
maxTokens: Int = 4000,
50-
modelName: String = ""
52+
modelName: String = "",
53+
ollamaKeepAlive: String = ""
5154
) {
5255
self.apiKeyName = apiKeyName
5356
self.baseURL = baseURL
5457
self.isFullURL = isFullURL
5558
self.maxTokens = maxTokens
5659
self.modelName = modelName
60+
self.ollamaKeepAlive = ollamaKeepAlive
5761
}
5862
}
5963

CustomSuggestionService/ChatModelManagement/ChatModelEdit.swift

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ struct ChatModelEdit {
2020
var suggestedMaxTokens: Int?
2121
var apiKeySelection: APIKeySelection.State = .init()
2222
var baseURLSelection: BaseURLSelection.State = .init()
23+
var ollamaKeepAlive: String = ""
2324
}
2425

2526
enum Action: Equatable, BindableAction {
@@ -152,7 +153,8 @@ extension ChatModel {
152153
apiKeyName: info.apiKeyName,
153154
apiKeyManagement: .init(availableAPIKeyNames: [info.apiKeyName])
154155
),
155-
baseURLSelection: .init(baseURL: info.baseURL)
156+
baseURLSelection: .init(baseURL: info.baseURL),
157+
ollamaKeepAlive: info.ollamaKeepAlive
156158
)
157159
}
158160

@@ -166,7 +168,8 @@ extension ChatModel {
166168
baseURL: state.baseURL.trimmingCharacters(in: .whitespacesAndNewlines),
167169
maxTokens: state.maxTokens,
168170
supportsFunctionCalling: false,
169-
modelName: state.modelName.trimmingCharacters(in: .whitespacesAndNewlines)
171+
modelName: state.modelName.trimmingCharacters(in: .whitespacesAndNewlines),
172+
ollamaKeepAlive: state.ollamaKeepAlive
170173
)
171174
)
172175
}

CustomSuggestionService/ChatModelManagement/ChatModelEditView.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,17 @@ struct ChatModelEditView: View {
277277
TextField("Model Name", text: $store.modelName)
278278

279279
maxTokensTextField
280+
281+
TextField(text: $store.ollamaKeepAlive, prompt: Text("Default Value")) {
282+
Text("Keep Alive")
283+
}
284+
285+
VStack(alignment: .leading, spacing: 8) {
286+
Text(Image(systemName: "exclamationmark.triangle.fill")) + Text(
287+
" For more details, please visit [https://ollama.com](https://ollama.com)"
288+
)
289+
}
290+
.padding(.vertical)
280291
}
281292
}
282293

CustomSuggestionService/ChatModelManagement/CompletionModelEdit.swift

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ struct CompletionModelEdit {
2020
var suggestedMaxTokens: Int?
2121
var apiKeySelection: APIKeySelection.State = .init()
2222
var baseURLSelection: BaseURLSelection.State = .init()
23+
var ollamaKeepAlive: String = ""
2324
}
2425

2526
enum Action: Equatable, BindableAction {
@@ -143,7 +144,8 @@ extension CompletionModel {
143144
apiKeyName: info.apiKeyName,
144145
apiKeyManagement: .init(availableAPIKeyNames: [info.apiKeyName])
145146
),
146-
baseURLSelection: .init(baseURL: info.baseURL)
147+
baseURLSelection: .init(baseURL: info.baseURL),
148+
ollamaKeepAlive: info.ollamaKeepAlive
147149
)
148150
}
149151

@@ -156,7 +158,8 @@ extension CompletionModel {
156158
apiKeyName: state.apiKeyName,
157159
baseURL: state.baseURL.trimmingCharacters(in: .whitespacesAndNewlines),
158160
maxTokens: state.maxTokens,
159-
modelName: state.modelName.trimmingCharacters(in: .whitespacesAndNewlines)
161+
modelName: state.modelName.trimmingCharacters(in: .whitespacesAndNewlines),
162+
ollamaKeepAlive: state.ollamaKeepAlive
160163
)
161164
)
162165
}

CustomSuggestionService/ChatModelManagement/CompletionModelEditView.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,17 @@ struct CompletionModelEditView: View {
269269
TextField("Model Name", text: $store.modelName)
270270

271271
maxTokensTextField
272+
273+
TextField(text: $store.ollamaKeepAlive, prompt: Text("Default Value")) {
274+
Text("Keep Alive")
275+
}
276+
277+
VStack(alignment: .leading, spacing: 8) {
278+
Text(Image(systemName: "exclamationmark.triangle.fill")) + Text(
279+
" For more details, please visit [https://ollama.com](https://ollama.com)"
280+
)
281+
}
282+
.padding(.vertical)
272283
}
273284
}
274285

0 commit comments

Comments
 (0)