fix:feature-parity
This commit is contained in:
1 parent
6c0a6eb498
commit
c33d87b06e
8 files changed
+196
-33
No files matched your search
@@ -8,16 +8,42 @@ enum TranscriptionError: LocalizedError {
|
||||
case invalidEndpoint
|
||||
case invalidResponse
|
||||
case http(Int)
|
||||
case allEndpointsFailed([String])
|
||||
|
||||
var errorDescription: String? {
|
||||
switch self {
|
||||
case .invalidEndpoint: "The transcription endpoint is invalid."
|
||||
case .invalidResponse: "The server response did not contain a transcript."
|
||||
case .http(let status): "The server returned HTTP \(status)."
|
||||
case .allEndpointsFailed(let failures): failures.joined(separator: " ")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct TranscriptionEndpoint: Equatable {
|
||||
let label: String
|
||||
let endpoint: String
|
||||
let model: String
|
||||
let key: String
|
||||
|
||||
var isConfigured: Bool {
|
||||
!endpoint.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty
|
||||
}
|
||||
}
|
||||
|
||||
struct TranscriptionPlan {
|
||||
let hosted: TranscriptionEndpoint
|
||||
let local: TranscriptionEndpoint
|
||||
let hostedFirst: Bool
|
||||
|
||||
var endpoints: [TranscriptionEndpoint] {
|
||||
var result: [TranscriptionEndpoint] = []
|
||||
if hostedFirst, hosted.isConfigured { result.append(hosted) }
|
||||
if local.isConfigured { result.append(local) }
|
||||
return result
|
||||
}
|
||||
}
|
||||
|
||||
struct TranscriptionClient {
|
||||
static func endpointURL(from value: String) -> URL? {
|
||||
var endpoint = value.trimmingCharacters(in: .whitespacesAndNewlines)
|
||||
@@ -34,6 +60,31 @@ struct TranscriptionClient {
|
||||
}
|
||||
|
||||
func transcribe(
|
||||
recording: URL,
|
||||
plan: TranscriptionPlan,
|
||||
prompt: String
|
||||
) async throws -> String {
|
||||
let endpoints = plan.endpoints
|
||||
guard !endpoints.isEmpty else { throw TranscriptionError.invalidEndpoint }
|
||||
|
||||
var failures: [String] = []
|
||||
for endpoint in endpoints {
|
||||
do {
|
||||
return try await transcribe(
|
||||
recording: recording,
|
||||
endpoint: endpoint.endpoint,
|
||||
model: endpoint.model,
|
||||
key: endpoint.key,
|
||||
prompt: prompt
|
||||
)
|
||||
} catch {
|
||||
failures.append("\(endpoint.label): \(error.localizedDescription)")
|
||||
}
|
||||
}
|
||||
throw TranscriptionError.allEndpointsFailed(failures)
|
||||
}
|
||||
|
||||
private func transcribe(
|
||||
recording: URL,
|
||||
endpoint: String,
|
||||
model: String,
|
||||
|
||||
Reference in new issue
Block a user