Skip to content

Commit 20b1903

Browse files
authored
Merge pull request intitni#436 from gewill/main
Modify baseURL to full path
2 parents ec58971 + 519f0ae commit 20b1903

File tree

9 files changed

+76
-16
lines changed

9 files changed

+76
-16
lines changed

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ struct ChatModelEdit: ReducerProtocol {
1616
@BindingState var modelName: String = ""
1717
var apiKeyName: String { apiKeySelection.apiKeyName }
1818
var baseURL: String { baseURLSelection.baseURL }
19+
var isFullURL: Bool { baseURLSelection.isFullURL }
1920
var availableModelNames: [String] = []
2021
var availableAPIKeys: [String] = []
2122
var isTesting = false
@@ -76,6 +77,7 @@ struct ChatModelEdit: ReducerProtocol {
7677
info: .init(
7778
apiKeyName: state.apiKeyName,
7879
baseURL: state.baseURL,
80+
isFullURL: state.isFullURL,
7981
maxTokens: state.maxTokens,
8082
supportsFunctionCalling: state.supportsFunctionCalling,
8183
modelName: state.modelName
@@ -171,7 +173,7 @@ extension ChatModelEdit.State {
171173
apiKeyName: model.info.apiKeyName,
172174
apiKeyManagement: .init(availableAPIKeyNames: [model.info.apiKeyName])
173175
),
174-
baseURLSelection: .init(baseURL: model.info.baseURL)
176+
baseURLSelection: .init(baseURL: model.info.baseURL, isFullURL: model.info.isFullURL)
175177
)
176178
}
177179
}
@@ -185,6 +187,7 @@ extension ChatModel {
185187
info: .init(
186188
apiKeyName: state.apiKeyName,
187189
baseURL: state.baseURL.trimmingCharacters(in: .whitespacesAndNewlines),
190+
isFullURL: state.isFullURL,
188191
maxTokens: state.maxTokens,
189192
supportsFunctionCalling: {
190193
if case .googleAI = state.format {

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,9 +101,10 @@ struct ChatModelEditView: View {
101101
}
102102
}
103103

104-
func baseURLTextField(prompt: Text?) -> some View {
104+
func baseURLTextField(prompt: Text?, showIsFullURL: Bool = false) -> some View {
105105
BaseURLPicker(
106106
prompt: prompt,
107+
showIsFullURL: showIsFullURL,
107108
store: store.scope(
108109
state: \.baseURLSelection,
109110
action: ChatModelEdit.Action.baseURLSelection
@@ -260,7 +261,10 @@ struct ChatModelEditView: View {
260261

261262
@ViewBuilder
262263
var openAICompatible: some View {
263-
baseURLTextField(prompt: Text("https://"))
264+
baseURLTextField(
265+
prompt: Text("https://"),
266+
showIsFullURL: true
267+
)
264268
apiKeyNamePicker
265269

266270
WithViewStore(
@@ -334,6 +338,7 @@ struct ChatModelEditView: View {
334338
info: .init(
335339
apiKeyName: "key",
336340
baseURL: "apple.com",
341+
isFullURL: false,
337342
maxTokens: 3000,
338343
supportsFunctionCalling: false,
339344
modelName: "gpt-3.5-turbo"

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ struct EmbeddingModelEdit: ReducerProtocol {
1515
@BindingState var modelName: String = ""
1616
var apiKeyName: String { apiKeySelection.apiKeyName }
1717
var baseURL: String { baseURLSelection.baseURL }
18+
var isFullURL: Bool { baseURLSelection.isFullURL }
1819
var availableModelNames: [String] = []
1920
var availableAPIKeys: [String] = []
2021
var isTesting = false
@@ -75,6 +76,7 @@ struct EmbeddingModelEdit: ReducerProtocol {
7576
info: .init(
7677
apiKeyName: state.apiKeyName,
7778
baseURL: state.baseURL,
79+
isFullURL: state.isFullURL,
7880
maxTokens: state.maxTokens,
7981
modelName: state.modelName
8082
)
@@ -157,7 +159,7 @@ extension EmbeddingModelEdit.State {
157159
apiKeyName: model.info.apiKeyName,
158160
apiKeyManagement: .init(availableAPIKeyNames: [model.info.apiKeyName])
159161
),
160-
baseURLSelection: .init(baseURL: model.info.baseURL)
162+
baseURLSelection: .init(baseURL: model.info.baseURL, isFullURL: model.info.isFullURL)
161163
)
162164
}
163165
}
@@ -171,6 +173,7 @@ extension EmbeddingModel {
171173
info: .init(
172174
apiKeyName: state.apiKeyName,
173175
baseURL: state.baseURL.trimmingCharacters(in: .whitespacesAndNewlines),
176+
isFullURL: state.isFullURL,
174177
maxTokens: state.maxTokens,
175178
modelName: state.modelName.trimmingCharacters(in: .whitespacesAndNewlines)
176179
)

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,10 @@ struct EmbeddingModelEditView: View {
9696
}
9797
}
9898

99-
func baseURLTextField(prompt: Text?) -> some View {
99+
func baseURLTextField(prompt: Text?, showIsFullURL: Bool = false) -> some View {
100100
BaseURLPicker(
101101
prompt: prompt,
102+
showIsFullURL: showIsFullURL,
102103
store: store.scope(
103104
state: \.baseURLSelection,
104105
action: EmbeddingModelEdit.Action.baseURLSelection
@@ -223,7 +224,10 @@ struct EmbeddingModelEditView: View {
223224

224225
@ViewBuilder
225226
var openAICompatible: some View {
226-
baseURLTextField(prompt: Text("https://"))
227+
baseURLTextField(
228+
prompt: Text("https://"),
229+
showIsFullURL: true
230+
)
227231
apiKeyNamePicker
228232

229233
WithViewStore(

Core/Sources/HostApp/AccountSettings/SharedModelManagement/BaseURLPicker.swift

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,35 +3,59 @@ import SwiftUI
33

44
struct BaseURLPicker: View {
55
let prompt: Text?
6+
let showIsFullURL: Bool
67
let store: StoreOf<BaseURLSelection>
7-
8+
89
var body: some View {
910
WithViewStore(store) { viewStore in
10-
TextField("Base URL", text: viewStore.$baseURL, prompt: prompt)
11+
Group {
12+
if showIsFullURL {
13+
Picker(
14+
selection: viewStore.$isFullURL,
15+
content: {
16+
Text("Base URL").tag(false)
17+
Text("Full URL").tag(true)
18+
},
19+
label: { Text("URL") }
20+
)
21+
.pickerStyle(.segmented)
22+
}
23+
HStack {
24+
TextField(
25+
showIsFullURL ? "" : "Base URL",
26+
text: viewStore.$baseURL,
27+
prompt: prompt
28+
)
29+
if viewStore.isFullURL == false {
30+
Text("/v1/chat/completions")
31+
}
32+
}
33+
.padding(.trailing)
1134
.overlay(alignment: .trailing) {
1235
Picker(
1336
"",
1437
selection: viewStore.$baseURL,
1538
content: {
1639
if !viewStore.state.availableBaseURLs
1740
.contains(viewStore.state.baseURL),
18-
!viewStore.state.baseURL.isEmpty
41+
!viewStore.state.baseURL.isEmpty
1942
{
2043
Text("Custom Value").tag(viewStore.state.baseURL)
2144
}
22-
45+
2346
Text("Empty (Default Value)").tag("")
24-
47+
2548
ForEach(viewStore.state.availableBaseURLs, id: \.self) { baseURL in
2649
Text(baseURL).tag(baseURL)
2750
}
2851
}
2952
)
3053
.frame(width: 20)
3154
}
32-
.onAppear {
33-
viewStore.send(.appear)
34-
}
55+
}
56+
.onAppear {
57+
viewStore.send(.appear)
58+
}
3559
}
3660
}
3761
}

Core/Sources/HostApp/AccountSettings/SharedModelManagement/BaseURLSelection.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import SwiftUI
66
struct BaseURLSelection: ReducerProtocol {
77
struct State: Equatable {
88
@BindingState var baseURL: String = ""
9+
@BindingState var isFullURL: Bool = false
910
var availableBaseURLs: [String] = []
1011
}
1112

Tool/Sources/AIModel/ChatModel.swift

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ public struct ChatModel: Codable, Equatable, Identifiable {
2828
public var apiKeyName: String
2929
@FallbackDecoding<EmptyString>
3030
public var baseURL: String
31+
@FallbackDecoding<EmptyBool>
32+
public var isFullURL: Bool
3133
@FallbackDecoding<EmptyInt>
3234
public var maxTokens: Int
3335
@FallbackDecoding<EmptyBool>
@@ -44,13 +46,15 @@ public struct ChatModel: Codable, Equatable, Identifiable {
4446
public init(
4547
apiKeyName: String = "",
4648
baseURL: String = "",
49+
isFullURL: Bool = false,
4750
maxTokens: Int = 4000,
4851
supportsFunctionCalling: Bool = true,
4952
supportsOpenAIAPI2023_11: Bool = false,
5053
modelName: String = ""
5154
) {
5255
self.apiKeyName = apiKeyName
5356
self.baseURL = baseURL
57+
self.isFullURL = isFullURL
5458
self.maxTokens = maxTokens
5559
self.supportsFunctionCalling = supportsFunctionCalling
5660
self.supportsOpenAIAPI2023_11 = supportsOpenAIAPI2023_11
@@ -60,9 +64,14 @@ public struct ChatModel: Codable, Equatable, Identifiable {
6064

6165
public var endpoint: String {
6266
switch format {
63-
case .openAI, .openAICompatible:
67+
case .openAI:
68+
let baseURL = info.baseURL
69+
if baseURL.isEmpty { return "https://api.openai.com/v1/chat/completions" }
70+
return "\(baseURL)/v1/chat/completions"
71+
case .openAICompatible:
6472
let baseURL = info.baseURL
6573
if baseURL.isEmpty { return "https://api.openai.com/v1/chat/completions" }
74+
if info.isFullURL { return baseURL }
6675
return "\(baseURL)/v1/chat/completions"
6776
case .azureOpenAI:
6877
let baseURL = info.baseURL

Tool/Sources/AIModel/EmbeddingModel.swift

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ public struct EmbeddingModel: Codable, Equatable, Identifiable {
2727
public var apiKeyName: String
2828
@FallbackDecoding<EmptyString>
2929
public var baseURL: String
30+
@FallbackDecoding<EmptyBool>
31+
public var isFullURL: Bool
3032
@FallbackDecoding<EmptyInt>
3133
public var maxTokens: Int
3234
@FallbackDecoding<EmptyInt>
@@ -41,12 +43,14 @@ public struct EmbeddingModel: Codable, Equatable, Identifiable {
4143
public init(
4244
apiKeyName: String = "",
4345
baseURL: String = "",
46+
isFullURL: Bool = false,
4447
maxTokens: Int = 8192,
4548
dimensions: Int = 1536,
4649
modelName: String = ""
4750
) {
4851
self.apiKeyName = apiKeyName
4952
self.baseURL = baseURL
53+
self.isFullURL = isFullURL
5054
self.maxTokens = maxTokens
5155
self.dimensions = dimensions
5256
self.modelName = modelName
@@ -55,10 +59,15 @@ public struct EmbeddingModel: Codable, Equatable, Identifiable {
5559

5660
public var endpoint: String {
5761
switch format {
58-
case .openAI, .openAICompatible:
62+
case .openAI:
5963
let baseURL = info.baseURL
6064
if baseURL.isEmpty { return "https://api.openai.com/v1/embeddings" }
6165
return "\(baseURL)/v1/embeddings"
66+
case .openAICompatible:
67+
let baseURL = info.baseURL
68+
if baseURL.isEmpty { return "https://api.openai.com/v1/embeddings" }
69+
if info.isFullURL { return baseURL }
70+
return "\(baseURL)/v1/embeddings"
6271
case .azureOpenAI:
6372
let baseURL = info.baseURL
6473
let deployment = info.azureOpenAIDeploymentName

Tool/Sources/Preferences/Keys.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,7 @@ public extension UserDefaultPreferenceKeys {
221221
info: .init(
222222
apiKeyName: "",
223223
baseURL: "",
224+
isFullURL: false,
224225
maxTokens: ChatGPTModel.gpt35Turbo.maxToken,
225226
supportsFunctionCalling: true,
226227
modelName: ChatGPTModel.gpt35Turbo.rawValue
@@ -254,6 +255,7 @@ public extension UserDefaultPreferenceKeys {
254255
info: .init(
255256
apiKeyName: "",
256257
baseURL: "",
258+
isFullURL: false,
257259
maxTokens: OpenAIEmbeddingModel.textEmbeddingAda002.maxToken,
258260
modelName: OpenAIEmbeddingModel.textEmbeddingAda002.rawValue
259261
)

0 commit comments

Comments
 (0)