@@ -17,13 +17,16 @@ public protocol ChatGPTServiceType: ObservableObject {
1717public enum ChatGPTServiceError : Error , LocalizedError {
1818 case endpointIncorrect
1919 case responseInvalid
20+ case otherError( String )
2021
2122 public var errorDescription : String ? {
2223 switch self {
2324 case . endpointIncorrect:
2425 return " ChatGPT endpoint is incorrect "
2526 case . responseInvalid:
2627 return " Response is invalid "
28+ case let . otherError( content) :
29+ return content
2730 }
2831 }
2932}
@@ -59,7 +62,7 @@ public actor ChatGPTService: ChatGPTServiceType {
5962 public var defaultTemperature : Double {
6063 min ( max ( 0 , UserDefaults . shared. value ( for: \. chatGPTTemperature) ) , 2 )
6164 }
62-
65+
6366 var temperature : Double ?
6467
6568 public var model : String {
@@ -68,14 +71,30 @@ public actor ChatGPTService: ChatGPTServiceType {
6871 return value
6972 }
7073
74+ var designatedProvider : ChatFeatureProvider ?
75+
7176 public var endpoint : String {
72- var baseURL = UserDefaults . shared. value ( for: \. openAIBaseURL)
73- if baseURL. isEmpty { return " https://api.openai.com/v1/chat/completions " }
74- return " \( baseURL) /v1/chat/completions "
77+ switch designatedProvider ?? UserDefaults . shared. value ( for: \. chatFeatureProvider) {
78+ case . openAI:
79+ let baseURL = UserDefaults . shared. value ( for: \. openAIBaseURL)
80+ if baseURL. isEmpty { return " https://api.openai.com/v1/chat/completions " }
81+ return " \( baseURL) /v1/chat/completions "
82+ case . azureOpenAI:
83+ let baseURL = UserDefaults . shared. value ( for: \. azureOpenAIBaseURL)
84+ let deployment = UserDefaults . shared. value ( for: \. azureChatGPTDeployment)
85+ let version = " 2023-05-15 "
86+ if baseURL. isEmpty { return " " }
87+ return " \( baseURL) /openai/deployments/ \( deployment) /chat/completions?api-version= \( version) "
88+ }
7589 }
7690
7791 public var apiKey : String {
78- UserDefaults . shared. value ( for: \. openAIAPIKey)
92+ switch designatedProvider ?? UserDefaults . shared. value ( for: \. chatFeatureProvider) {
93+ case . openAI:
94+ return UserDefaults . shared. value ( for: \. openAIAPIKey)
95+ case . azureOpenAI:
96+ return UserDefaults . shared. value ( for: \. azureOpenAIAPIKey)
97+ }
7998 }
8099
81100 public var maxToken : Int {
@@ -97,10 +116,12 @@ public actor ChatGPTService: ChatGPTServiceType {
97116
98117 public init (
99118 systemPrompt: String = " " ,
100- temperature: Double ? = nil
119+ temperature: Double ? = nil ,
120+ designatedProvider: ChatFeatureProvider ? = nil
101121 ) {
102122 self . systemPrompt = systemPrompt
103123 self . temperature = temperature
124+ self . designatedProvider = designatedProvider
104125 }
105126
106127 public func send(
@@ -129,7 +150,12 @@ public actor ChatGPTService: ChatGPTServiceType {
129150
130151 isReceivingMessage = true
131152
132- let api = buildCompletionStreamAPI ( apiKey, url, requestBody)
153+ let api = buildCompletionStreamAPI (
154+ apiKey,
155+ designatedProvider ?? UserDefaults . shared. value ( for: \. chatFeatureProvider) ,
156+ url,
157+ requestBody
158+ )
133159
134160 return AsyncThrowingStream < String , Error > { continuation in
135161 Task {
@@ -210,7 +236,12 @@ public actor ChatGPTService: ChatGPTServiceType {
210236 isReceivingMessage = true
211237 defer { isReceivingMessage = false }
212238
213- let api = buildCompletionAPI ( apiKey, url, requestBody)
239+ let api = buildCompletionAPI (
240+ apiKey,
241+ designatedProvider ?? UserDefaults . shared. value ( for: \. chatFeatureProvider) ,
242+ url,
243+ requestBody
244+ )
214245 let response = try await api ( )
215246
216247 if let choice = response. choices. first {
@@ -296,3 +327,4 @@ func maxTokenForReply(model: String, remainingTokens: Int) -> Int {
296327 guard let model = ChatGPTModel ( rawValue: model) else { return remainingTokens }
297328 return min ( model. maxToken / 2 , remainingTokens)
298329}
330+
0 commit comments