import Foundation public enum ProviderTokenSource: String, Sendable { case environment case authFile} public struct ProviderTokenResolution: Sendable { public let token: String public let source: ProviderTokenSource public init(token: String, source: ProviderTokenSource) { self.token = token self.source = source }} public enum ProviderTokenResolver { public static func ampToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.ampResolution(environment: environment)?.token } public static func zaiToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.zaiResolution(environment: environment)?.token } public static func syntheticToken( environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.syntheticResolution(environment: environment)?.token } public static func openAIAPIToken( environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.openAIAPIResolution(environment: environment)?.token } public static func azureOpenAIToken( environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.azureOpenAIResolution(environment: environment)?.token } public static func claudeAdminAPIToken( environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.claudeAdminAPIResolution(environment: environment)?.token } public static func copilotToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.copilotResolution(environment: environment)?.token } public static func minimaxToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.minimaxTokenResolution(environment: environment)?.token } public static func alibabaToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.alibabaTokenResolution(environment: environment)?.token } public static func minimaxCookie(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.minimaxCookieResolution(environment: environment)?.token } public static func kimiAuthToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.kimiAuthResolution(environment: environment)?.token } public static func kimiAPIToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.kimiAPIResolution(environment: environment)?.token } public static func kimiK2Token(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.kimiK2Resolution(environment: environment)?.token } public static func moonshotToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.moonshotResolution(environment: environment)?.token } public static func ollamaToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.ollamaResolution(environment: environment)?.token } public static func kiloToken( environment: [String: String] = ProcessInfo.processInfo.environment, authFileURL: URL? = nil) -> String? { self.kiloResolution(environment: environment, authFileURL: authFileURL)?.token } public static func warpToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.warpResolution(environment: environment)?.token } public static func openRouterToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.openRouterResolution(environment: environment)?.token } public static func elevenLabsToken( environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.elevenLabsResolution(environment: environment)?.token } public static func groqToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.groqResolution(environment: environment)?.token } public static func llmProxyToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.llmProxyResolution(environment: environment)?.token } public static func liteLLMToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.liteLLMResolution(environment: environment)?.token } public static func perplexitySessionToken( environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.perplexityResolution(environment: environment)?.token } public static func deepseekToken( environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.deepseekResolution(environment: environment)?.token } public static func poeToken( environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.poeResolution(environment: environment)?.token } public static func crofToken( environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.crofResolution(environment: environment)?.token } public static func veniceToken( environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.veniceResolution(environment: environment)?.token } public static func stepfunToken( environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.stepfunResolution(environment: environment)?.token } public static func doubaoToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.doubaoResolution(environment: environment)?.token } public static func bedrockAccessKeyID( environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.bedrockResolution(environment: environment)?.token } public static func bedrockResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(BedrockSettingsReader.accessKeyID(environment: environment)) } public static func ampResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(AmpSettingsReader.apiToken(environment: environment)) } public static func deepseekResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(DeepSeekSettingsReader.apiKey(environment: environment)) } public static func poeResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(PoeSettingsReader.apiKey(environment: environment)) } public static func crofResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(CrofSettingsReader.apiKey(environment: environment)) } public static func veniceResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(VeniceSettingsReader.apiKey(environment: environment)) } public static func codebuffToken( environment: [String: String] = ProcessInfo.processInfo.environment, authFileURL: URL? = nil) -> String? { self.codebuffResolution(environment: environment, authFileURL: authFileURL)?.token } public static func stepfunResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(StepFunSettingsReader.token(environment: environment)) } public static func doubaoResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(DoubaoSettingsReader.apiKey(environment: environment)) } public static func zaiResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(ZaiSettingsReader.apiToken(environment: environment)) } public static func syntheticResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(SyntheticSettingsReader.apiKey(environment: environment)) } public static func openAIAPIResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(OpenAIAPISettingsReader.apiKey(environment: environment)) } public static func azureOpenAIResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(AzureOpenAISettingsReader.apiKey(environment: environment)) } public static func claudeAdminAPIResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(ClaudeAdminAPISettingsReader.apiKey(environment: environment)) } public static func copilotResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(self.cleaned(environment["COPILOT_API_TOKEN"])) } public static func minimaxTokenResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(MiniMaxAPISettingsReader.apiToken(environment: environment)) } public static func alibabaTokenResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(AlibabaCodingPlanSettingsReader.apiToken(environment: environment)) } public static func minimaxCookieResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(MiniMaxSettingsReader.cookieHeader(environment: environment)) } public static func kimiAuthResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { if let resolution = self.resolveEnv(KimiSettingsReader.authToken(environment: environment)) { return resolution } #if os(macOS) do { let session = try KimiCookieImporter.importSession() if let token = session.authToken { return ProviderTokenResolution(token: token, source: .environment) } } catch { // No browser cookies found, continue to fallback } #endif return nil } public static func kimiAPIResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(KimiSettingsReader.apiKey(environment: environment)) } public static func kimiK2Resolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(KimiK2SettingsReader.apiKey(environment: environment)) } public static func moonshotResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(MoonshotSettingsReader.apiKey(environment: environment)) } public static func ollamaResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(OllamaAPISettingsReader.apiKey(environment: environment)) } public static func kiloResolution( environment: [String: String] = ProcessInfo.processInfo.environment, authFileURL: URL? = nil) -> ProviderTokenResolution? { if let resolution = self.resolveEnv(KiloSettingsReader.apiKey(environment: environment)) { return resolution } if let token = KiloSettingsReader.authToken(authFileURL: authFileURL) { return ProviderTokenResolution(token: token, source: .authFile) } return nil } public static func warpResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(WarpSettingsReader.apiKey(environment: environment)) } public static func openRouterResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(OpenRouterSettingsReader.apiToken(environment: environment)) } public static func elevenLabsResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(ElevenLabsSettingsReader.apiKey(environment: environment)) } public static func groqResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(GroqSettingsReader.apiKey(environment: environment)) } public static func llmProxyResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(LLMProxySettingsReader.apiKey(environment: environment)) } public static func liteLLMResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(LiteLLMSettingsReader.apiKey(environment: environment)) } public enum DeepgramCredentialKind: Sendable { case apiKey case projectID } public static func deepgramResolution( type: DeepgramCredentialKind, environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { switch type { case .apiKey: self.resolveEnv(DeepgramSettingsReader.apiKey(environment: environment))?.token case .projectID: self.resolveEnv(DeepgramSettingsReader.projectID(environment: environment))?.token } } public static func codebuffResolution( environment: [String: String] = ProcessInfo.processInfo.environment, authFileURL: URL? = nil) -> ProviderTokenResolution? { if let resolution = self.resolveEnv(CodebuffSettingsReader.apiKey(environment: environment)) { return resolution } if let token = CodebuffSettingsReader.authToken(authFileURL: authFileURL) { return ProviderTokenResolution(token: token, source: .authFile) } return nil } public static func perplexityResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { if let resolution = self.resolveEnv(PerplexitySettingsReader.sessionToken(environment: environment)) { return resolution } #if os(macOS) do { let session = try PerplexityCookieImporter.importSession() if let token = session.sessionToken { return ProviderTokenResolution(token: token, source: .environment) } } catch { // No browser cookies found, continue to fallback } #endif return nil } private static func cleaned(_ raw: String?) -> String? { guard var value = raw?.trimmingCharacters(in: .whitespacesAndNewlines), !value.isEmpty else { return nil } if (value.hasPrefix("\"") && value.hasSuffix("\"")) || (value.hasPrefix("'") && value.hasSuffix("'")) { value = String(value.dropFirst().dropLast()) } value = value.trimmingCharacters(in: .whitespacesAndNewlines) return value.isEmpty ? nil : value } private static func resolveEnv(_ token: String?) -> ProviderTokenResolution? { guard let token else { return nil } return ProviderTokenResolution(token: token, source: .environment) }}
import Foundation
public enum ProviderTokenSource: String, Sendable {
case environment
case authFile
}
public struct ProviderTokenResolution: Sendable {
public let token: String
public let source: ProviderTokenSource
public init(token: String, source: ProviderTokenSource) {
self.token = token
self.source = source
}
}
public enum ProviderTokenResolver {
public static func ampToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? {
self.ampResolution(environment: environment)?.token
}
public static func zaiToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? {
self.zaiResolution(environment: environment)?.token
}
public static func syntheticToken(
environment: [String: String] = ProcessInfo.processInfo.environment) -> String?
{
self.syntheticResolution(environment: environment)?.token
}
public static func openAIAPIToken(
environment: [String: String] = ProcessInfo.processInfo.environment) -> String?
{
self.openAIAPIResolution(environment: environment)?.token
}
public static func azureOpenAIToken(
environment: [String: String] = ProcessInfo.processInfo.environment) -> String?
{
self.azureOpenAIResolution(environment: environment)?.token
}
public static func claudeAdminAPIToken(
environment: [String: String] = ProcessInfo.processInfo.environment) -> String?
{
self.claudeAdminAPIResolution(environment: environment)?.token
}
public static func copilotToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? {
self.copilotResolution(environment: environment)?.token
}
public static func minimaxToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? {
self.minimaxTokenResolution(environment: environment)?.token
}
public static func alibabaToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? {
self.alibabaTokenResolution(environment: environment)?.token
}
public static func minimaxCookie(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? {
self.minimaxCookieResolution(environment: environment)?.token
}
public static func kimiAuthToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? {
self.kimiAuthResolution(environment: environment)?.token
}
public static func kimiAPIToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? {
self.kimiAPIResolution(environment: environment)?.token
}
public static func kimiK2Token(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? {
self.kimiK2Resolution(environment: environment)?.token
}
public static func moonshotToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? {
self.moonshotResolution(environment: environment)?.token
}
public static func ollamaToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? {
self.ollamaResolution(environment: environment)?.token
}
public static func kiloToken(
environment: [String: String] = ProcessInfo.processInfo.environment,
authFileURL: URL? = nil) -> String?
{
self.kiloResolution(environment: environment, authFileURL: authFileURL)?.token
}
public static func warpToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? {
self.warpResolution(environment: environment)?.token
}
public static func openRouterToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? {
self.openRouterResolution(environment: environment)?.token
}
public static func elevenLabsToken(
environment: [String: String] = ProcessInfo.processInfo.environment) -> String?
{
self.elevenLabsResolution(environment: environment)?.token
}
public static func groqToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? {
self.groqResolution(environment: environment)?.token
}
public static func llmProxyToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? {
self.llmProxyResolution(environment: environment)?.token
}
public static func liteLLMToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? {
self.liteLLMResolution(environment: environment)?.token
}
public static func perplexitySessionToken(
environment: [String: String] = ProcessInfo.processInfo.environment) -> String?
{
self.perplexityResolution(environment: environment)?.token
}
public static func deepseekToken(
environment: [String: String] = ProcessInfo.processInfo.environment) -> String?
{
self.deepseekResolution(environment: environment)?.token
}
public static func poeToken(
environment: [String: String] = ProcessInfo.processInfo.environment) -> String?
{
self.poeResolution(environment: environment)?.token
}
public static func crofToken(
environment: [String: String] = ProcessInfo.processInfo.environment) -> String?
{
self.crofResolution(environment: environment)?.token
}
public static func veniceToken(
environment: [String: String] = ProcessInfo.processInfo.environment) -> String?
{
self.veniceResolution(environment: environment)?.token
}
public static func stepfunToken(
environment: [String: String] = ProcessInfo.processInfo.environment) -> String?
{
self.stepfunResolution(environment: environment)?.token
}
public static func doubaoToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? {
self.doubaoResolution(environment: environment)?.token
}
public static func bedrockAccessKeyID(
environment: [String: String] = ProcessInfo.processInfo.environment) -> String?
{
self.bedrockResolution(environment: environment)?.token
}
public static func bedrockResolution(
environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution?
{
self.resolveEnv(BedrockSettingsReader.accessKeyID(environment: environment))
}
public static func ampResolution(
environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution?
{
self.resolveEnv(AmpSettingsReader.apiToken(environment: environment))
}
public static func deepseekResolution(
environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution?
{
self.resolveEnv(DeepSeekSettingsReader.apiKey(environment: environment))
}
public static func poeResolution(
environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution?
{
self.resolveEnv(PoeSettingsReader.apiKey(environment: environment))
}
public static func crofResolution(
environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution?
{
self.resolveEnv(CrofSettingsReader.apiKey(environment: environment))
}
public static func veniceResolution(
environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution?
{
self.resolveEnv(VeniceSettingsReader.apiKey(environment: environment))
}
public static func codebuffToken(
environment: [String: String] = ProcessInfo.processInfo.environment,
authFileURL: URL? = nil) -> String?
{
self.codebuffResolution(environment: environment, authFileURL: authFileURL)?.token
}
public static func stepfunResolution(
environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution?
{
self.resolveEnv(StepFunSettingsReader.token(environment: environment))
}
public static func doubaoResolution(
environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution?
{
self.resolveEnv(DoubaoSettingsReader.apiKey(environment: environment))
}
public static func zaiResolution(
environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution?
{
self.resolveEnv(ZaiSettingsReader.apiToken(environment: environment))
}
public static func syntheticResolution(
environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution?
{
self.resolveEnv(SyntheticSettingsReader.apiKey(environment: environment))
}
public static func openAIAPIResolution(
environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution?
{
self.resolveEnv(OpenAIAPISettingsReader.apiKey(environment: environment))
}
public static func azureOpenAIResolution(
environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution?
{
self.resolveEnv(AzureOpenAISettingsReader.apiKey(environment: environment))
}
public static func claudeAdminAPIResolution(
environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution?
{
self.resolveEnv(ClaudeAdminAPISettingsReader.apiKey(environment: environment))
}
public static func copilotResolution(
environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution?
{
self.resolveEnv(self.cleaned(environment["COPILOT_API_TOKEN"]))
}
public static func minimaxTokenResolution(
environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution?
{
self.resolveEnv(MiniMaxAPISettingsReader.apiToken(environment: environment))
}
public static func alibabaTokenResolution(
environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution?
{
self.resolveEnv(AlibabaCodingPlanSettingsReader.apiToken(environment: environment))
}
public static func minimaxCookieResolution(
environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution?
{
self.resolveEnv(MiniMaxSettingsReader.cookieHeader(environment: environment))
}
public static func kimiAuthResolution(
environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution?
{
if let resolution = self.resolveEnv(KimiSettingsReader.authToken(environment: environment)) {
return resolution
}
#if os(macOS)
do {
let session = try KimiCookieImporter.importSession()
if let token = session.authToken {
return ProviderTokenResolution(token: token, source: .environment)
}
} catch {
// No browser cookies found, continue to fallback
}
#endif
return nil
}
public static func kimiAPIResolution(
environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution?
{
self.resolveEnv(KimiSettingsReader.apiKey(environment: environment))
}
public static func kimiK2Resolution(
environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution?
{
self.resolveEnv(KimiK2SettingsReader.apiKey(environment: environment))
}
public static func moonshotResolution(
environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution?
{
self.resolveEnv(MoonshotSettingsReader.apiKey(environment: environment))
}
public static func ollamaResolution(
environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution?
{
self.resolveEnv(OllamaAPISettingsReader.apiKey(environment: environment))
}
public static func kiloResolution(
environment: [String: String] = ProcessInfo.processInfo.environment,
authFileURL: URL? = nil) -> ProviderTokenResolution?
{
if let resolution = self.resolveEnv(KiloSettingsReader.apiKey(environment: environment)) {
return resolution
}
if let token = KiloSettingsReader.authToken(authFileURL: authFileURL) {
return ProviderTokenResolution(token: token, source: .authFile)
}
return nil
}
public static func warpResolution(
environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution?
{
self.resolveEnv(WarpSettingsReader.apiKey(environment: environment))
}
public static func openRouterResolution(
environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution?
{
self.resolveEnv(OpenRouterSettingsReader.apiToken(environment: environment))
}
public static func elevenLabsResolution(
environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution?
{
self.resolveEnv(ElevenLabsSettingsReader.apiKey(environment: environment))
}
public static func groqResolution(
environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution?
{
self.resolveEnv(GroqSettingsReader.apiKey(environment: environment))
}
public static func llmProxyResolution(
environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution?
{
self.resolveEnv(LLMProxySettingsReader.apiKey(environment: environment))
}
public static func liteLLMResolution(
environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution?
{
self.resolveEnv(LiteLLMSettingsReader.apiKey(environment: environment))
}
public enum DeepgramCredentialKind: Sendable {
case apiKey
case projectID
}
public static func deepgramResolution(
type: DeepgramCredentialKind,
environment: [String: String] = ProcessInfo.processInfo.environment) -> String?
{
switch type {
case .apiKey:
self.resolveEnv(DeepgramSettingsReader.apiKey(environment: environment))?.token
case .projectID:
self.resolveEnv(DeepgramSettingsReader.projectID(environment: environment))?.token
}
}
public static func codebuffResolution(
environment: [String: String] = ProcessInfo.processInfo.environment,
authFileURL: URL? = nil) -> ProviderTokenResolution?
{
if let resolution = self.resolveEnv(CodebuffSettingsReader.apiKey(environment: environment)) {
return resolution
}
if let token = CodebuffSettingsReader.authToken(authFileURL: authFileURL) {
return ProviderTokenResolution(token: token, source: .authFile)
}
return nil
}
public static func perplexityResolution(
environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution?
{
if let resolution = self.resolveEnv(PerplexitySettingsReader.sessionToken(environment: environment)) {
return resolution
}
#if os(macOS)
do {
let session = try PerplexityCookieImporter.importSession()
if let token = session.sessionToken {
return ProviderTokenResolution(token: token, source: .environment)
}
} catch {
// No browser cookies found, continue to fallback
}
#endif
return nil
}
private static func cleaned(_ raw: String?) -> String? {
guard var value = raw?.trimmingCharacters(in: .whitespacesAndNewlines), !value.isEmpty else {
return nil
}
if (value.hasPrefix("\"") && value.hasSuffix("\"")) ||
(value.hasPrefix("'") && value.hasSuffix("'"))
{
value = String(value.dropFirst().dropLast())
}
value = value.trimmingCharacters(in: .whitespacesAndNewlines)
return value.isEmpty ? nil : value
}
private static func resolveEnv(_ token: String?) -> ProviderTokenResolution? {
guard let token else { return nil }
return ProviderTokenResolution(token: token, source: .environment)
}
}