Skip to content

Commit be47c9a

Browse files
committed
Add custom header filed for Ollama APIs
1 parent 94bfdd5 commit be47c9a

4 files changed

Lines changed: 43 additions & 15 deletions

File tree

Core/Sources/HostApp/AccountSettings/ChatModelManagement/ChatModelEditView.swift

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ struct ChatModelEditView: View {
243243

244244
MaxTokensTextField(store: store)
245245
SupportsFunctionCallingToggle(store: store)
246-
246+
247247
TextField(text: $store.openAIOrganizationID, prompt: Text("Optional")) {
248248
Text("Organization ID")
249249
}
@@ -321,11 +321,11 @@ struct ChatModelEditView: View {
321321
Toggle(isOn: $store.enforceMessageOrder) {
322322
Text("Enforce message order to be user/assistant alternated")
323323
}
324-
324+
325325
Toggle(isOn: $store.openAICompatibleSupportsMultipartMessageContent) {
326326
Text("Support multi-part message content")
327327
}
328-
328+
329329
Button("Custom Headers") {
330330
isEditingCustomHeader.toggle()
331331
}
@@ -375,13 +375,15 @@ struct ChatModelEditView: View {
375375

376376
struct OllamaForm: View {
377377
@Perception.Bindable var store: StoreOf<ChatModelEdit>
378+
@State var isEditingCustomHeader = false
379+
378380
var body: some View {
379381
WithPerceptionTracking {
380382
BaseURLTextField(store: store, prompt: Text("http://127.0.0.1:11434")) {
381383
Text("/api/chat")
382384
}
383-
384-
ApiKeyNamePicker(store: store)
385+
386+
ApiKeyNamePicker(store: store)
385387

386388
TextField("Model Name", text: $store.modelName)
387389

@@ -397,6 +399,12 @@ struct ChatModelEditView: View {
397399
)
398400
}
399401
.padding(.vertical)
402+
403+
Button("Custom Headers") {
404+
isEditingCustomHeader.toggle()
405+
}
406+
}.sheet(isPresented: $isEditingCustomHeader) {
407+
CustomHeaderSettingsView(headers: $store.customHeaders)
400408
}
401409
}
402410
}

Core/Sources/HostApp/AccountSettings/EmbeddingModelManagement/EmbeddingModelEditView.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,8 @@ struct EmbeddingModelEditView: View {
339339

340340
struct OllamaForm: View {
341341
@Perception.Bindable var store: StoreOf<EmbeddingModelEdit>
342+
@State var isEditingCustomHeader = false
343+
342344
var body: some View {
343345
WithPerceptionTracking {
344346
BaseURLTextField(store: store, prompt: Text("http://127.0.0.1:11434")) {
@@ -364,6 +366,12 @@ struct EmbeddingModelEditView: View {
364366
)
365367
}
366368
.padding(.vertical)
369+
370+
Button("Custom Headers") {
371+
isEditingCustomHeader.toggle()
372+
}
373+
}.sheet(isPresented: $isEditingCustomHeader) {
374+
CustomHeaderSettingsView(headers: $store.customHeaders)
367375
}
368376
}
369377
}

Tool/Sources/OpenAIService/APIs/OlamaChatCompletionsService.swift

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,15 @@ extension OllamaChatCompletionsService: ChatCompletionsAPI {
5959
let encoder = JSONEncoder()
6060
request.httpBody = try encoder.encode(requestBody)
6161
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
62-
63-
if !apiKey.isEmpty {
64-
request.setValue("Bearer \(apiKey)", forHTTPHeaderField: "Authorization")
65-
}
66-
62+
63+
if !apiKey.isEmpty {
64+
request.setValue("Bearer \(apiKey)", forHTTPHeaderField: "Authorization")
65+
}
66+
67+
for field in model.info.customHeaderInfo.headers where !field.key.isEmpty {
68+
request.setValue(field.value, forHTTPHeaderField: field.key)
69+
}
70+
6771
let (result, response) = try await URLSession.shared.data(for: request)
6872

6973
guard let response = response as? HTTPURLResponse else {
@@ -140,11 +144,15 @@ extension OllamaChatCompletionsService: ChatCompletionsStreamAPI {
140144
let encoder = JSONEncoder()
141145
request.httpBody = try encoder.encode(requestBody)
142146
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
143-
144-
if !apiKey.isEmpty {
145-
request.setValue("Bearer \(apiKey)", forHTTPHeaderField: "Authorization")
146-
}
147-
147+
148+
if !apiKey.isEmpty {
149+
request.setValue("Bearer \(apiKey)", forHTTPHeaderField: "Authorization")
150+
}
151+
152+
for field in model.info.customHeaderInfo.headers where !field.key.isEmpty {
153+
request.setValue(field.value, forHTTPHeaderField: field.key)
154+
}
155+
148156
let (result, response) = try await URLSession.shared.bytes(for: request)
149157

150158
guard let response = response as? HTTPURLResponse else {

Tool/Sources/OpenAIService/APIs/OllamaEmbeddingService.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ struct OllamaEmbeddingService: EmbeddingAPI {
3030
if !apiKey.isEmpty {
3131
request.setValue("Bearer \(apiKey)", forHTTPHeaderField: "Authorization")
3232
}
33+
34+
for field in model.info.customHeaderInfo.headers where !field.key.isEmpty {
35+
request.setValue(field.value, forHTTPHeaderField: field.key)
36+
}
3337

3438
let (result, response) = try await URLSession.shared.data(for: request)
3539
guard let response = response as? HTTPURLResponse else {

0 commit comments

Comments
 (0)