Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 14 additions & 10 deletions macOS/WritingTools/Models/Providers/OpenAIProvider.swift
Original file line number Diff line number Diff line change
Expand Up @@ -44,15 +44,15 @@ final class OpenAIProvider: AIProvider {
isProcessing = false
}

guard !config.apiKey.isEmpty else {
throw NSError(domain: "OpenAIAPI", code: -1, userInfo: [NSLocalizedDescriptionKey: "API key is missing."])
}

// Check for custom Base URL
if !config.baseURL.isEmpty && config.baseURL != OpenAIConfig.defaultBaseURL {
return try await Self.performCustomOpenAIRequest(config: config, systemPrompt: systemPrompt, userPrompt: userPrompt, images: images)
}

guard !config.apiKey.isEmpty else {
throw NSError(domain: "OpenAIAPI", code: -1, userInfo: [NSLocalizedDescriptionKey: "API key is missing."])
}

let baseURL = config.baseURL.isEmpty ? OpenAIConfig.defaultBaseURL : config.baseURL
let openAIService = AIProxy.openAIDirectService(
unprotectedAPIKey: config.apiKey,
Expand Down Expand Up @@ -141,7 +141,9 @@ final class OpenAIProvider: AIProvider {

var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("Bearer \(config.apiKey)", forHTTPHeaderField: "Authorization")
if !config.apiKey.isEmpty {
request.setValue("Bearer \(config.apiKey)", forHTTPHeaderField: "Authorization")
}
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.timeoutInterval = 60

Expand Down Expand Up @@ -236,7 +238,9 @@ final class OpenAIProvider: AIProvider {

var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("Bearer \(config.apiKey)", forHTTPHeaderField: "Authorization")
if !config.apiKey.isEmpty {
request.setValue("Bearer \(config.apiKey)", forHTTPHeaderField: "Authorization")
}
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.timeoutInterval = 60

Expand Down Expand Up @@ -318,10 +322,6 @@ final class OpenAIProvider: AIProvider {
activeTask = nil
}

guard !config.apiKey.isEmpty else {
throw NSError(domain: "OpenAIAPI", code: -1, userInfo: [NSLocalizedDescriptionKey: "API key is missing."])
}

// For custom base URLs, use manual SSE streaming
if !config.baseURL.isEmpty && config.baseURL != OpenAIConfig.defaultBaseURL {
let config = self.config
Expand All @@ -338,6 +338,10 @@ final class OpenAIProvider: AIProvider {
try await streamTask.value
return
}

guard !config.apiKey.isEmpty else {
throw NSError(domain: "OpenAIAPI", code: -1, userInfo: [NSLocalizedDescriptionKey: "API key is missing."])
}

let baseURL = config.baseURL.isEmpty ? OpenAIConfig.defaultBaseURL : config.baseURL
let openAIService = AIProxy.openAIDirectService(
Expand Down
5 changes: 4 additions & 1 deletion macOS/WritingTools/Views/Settings/SettingsView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -260,7 +260,10 @@ struct SettingsView: View {
return "Custom OpenRouter model name is required."
}
case "openai":
if settings.openAIApiKey.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty {
let trimmedOpenAIBaseURL = settings.openAIBaseURL.trimmingCharacters(in: .whitespacesAndNewlines)
let isUsingDefaultOpenAIEndpoint = trimmedOpenAIBaseURL.isEmpty || trimmedOpenAIBaseURL == OpenAIConfig.defaultBaseURL
if isUsingDefaultOpenAIEndpoint &&
settings.openAIApiKey.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty {
return "OpenAI API key is required."
}
if settings.openAIModel.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty {
Expand Down