From 88a4c19f7d2810fa0536641bd82a4b0268555147 Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Mon, 18 Nov 2024 14:52:02 -0700 Subject: [PATCH 001/271] Initial --- .../Intramodular/ElevenLabs.Client.swift | 500 ++++++++---------- 1 file changed, 235 insertions(+), 265 deletions(-) diff --git a/Sources/ElevenLabs/Intramodular/ElevenLabs.Client.swift b/Sources/ElevenLabs/Intramodular/ElevenLabs.Client.swift index dd59c3eb..acd45418 100644 --- a/Sources/ElevenLabs/Intramodular/ElevenLabs.Client.swift +++ b/Sources/ElevenLabs/Intramodular/ElevenLabs.Client.swift @@ -7,299 +7,269 @@ import CorePersistence import Foundation import NetworkKit -extension ElevenLabs { - @RuntimeDiscoverable - public final class Client: ObservableObject { - public static var persistentTypeRepresentation: some IdentityRepresentation { - _MIServiceTypeIdentifier._ElevenLabs - } - - public struct Configuration { - public var apiKey: String? - } - - public let configuration: Configuration - public let apiSpecification = APISpecification() - - public required init( - configuration: Configuration - ) { - self.configuration = configuration - } - - public convenience init( - apiKey: String? - ) { - self.init(configuration: .init(apiKey: apiKey)) - } +public struct ElevenLabsAPI: RESTAPISpecification { + public var apiKey: String + public var host = URL(string: "https://api.elevenlabs.io")! + + public init(apiKey: String) { + self.apiKey = apiKey } -} - -extension ElevenLabs.Client: _MIService { - public convenience init( - account: (any _MIServiceAccount)? - ) async throws { - let account = try account.unwrap() - - guard account.serviceIdentifier == _MIServiceTypeIdentifier._ElevenLabs else { - throw _MIServiceError.serviceTypeIncompatible(account.serviceIdentifier) - } - - guard let credential = account.credential as? _MIServiceAPIKeyCredential else { - throw _MIServiceError.invalidCredentials(account.credential) - } - - self.init(apiKey: credential.apiKey) + + public var baseURL: URL { + host.appendingPathComponent("/v1") + } + + public var id: some Hashable { + apiKey } + + // List Voices endpoint + @Path("voices") + @GET + var listVoices = Endpoint() + + // Text to Speech endpoint + @Path("text-to-speech/{voiceId}") + @POST + @Body({ context in + RequestBodies.SpeechRequest( + text: context.input.text, + voiceSettings: context.input.voiceSettings, + model: context.input.model + ) + }) + var textToSpeech = Endpoint() + + // Speech to Speech endpoint + @Path("speech-to-speech/{voiceId}/stream") + @POST + var speechToSpeech = MultipartEndpoint() + + // Add Voice endpoint + @Path("voices/add") + @POST + var addVoice = MultipartEndpoint() + + // Edit Voice endpoint + @Path("voices/{voiceId}/edit") + @POST + var editVoice = MultipartEndpoint() + + // Delete Voice endpoint + @Path("voices/{voiceId}") + @DELETE + var deleteVoice = Endpoint() } -extension ElevenLabs.Client { - public func availableVoices() async throws -> [ElevenLabs.Voice] { - let request = HTTPRequest(url: URL(string: "\(apiSpecification.host)/v1/voices")!) - .method(.get) - .header("xi-api-key", configuration.apiKey) - .header(.contentType(.json)) - - let response = try await HTTPSession.shared.data(for: request) - - try response.validate() +extension ElevenLabsAPI { + public final class Endpoint: BaseHTTPEndpoint { + override public func buildRequestBase( + from input: Input, + context: BuildRequestContext + ) throws -> Request { + let request = try super.buildRequestBase(from: input, context: context) + .header("xi-api-key", context.root.apiKey) + .header(.contentType(.json)) + + return request + } - return try response.decode( - ElevenLabs.APISpecification.ResponseBodies.Voices.self, - keyDecodingStrategy: .convertFromSnakeCase - ) - .voices - } - - @discardableResult - public func speech( - for text: String, - voiceID: String, - voiceSettings: ElevenLabs.VoiceSettings, - model: ElevenLabs.Model - ) async throws -> Data { - let request = try HTTPRequest(url: URL(string: "\(apiSpecification.host)/v1/text-to-speech/\(voiceID)")!) - .method(.post) - .header("xi-api-key", configuration.apiKey) - .header(.contentType(.json)) - .header(.accept(.mpeg)) - .jsonBody( - ElevenLabs.APISpecification.RequestBodies.SpeechRequest( - text: text, - voiceSettings: voiceSettings, - model: model - ), - keyEncodingStrategy: .convertToSnakeCase + override public func decodeOutputBase( + from response: Request.Response, + context: DecodeOutputContext + ) throws -> Output { + try response.validate() + + if Output.self == Data.self { + return response.data as! Output + } + + return try response.decode( + Output.self, + keyDecodingStrategy: .convertFromSnakeCase ) - - let response = try await HTTPSession.shared.data(for: request) - - try response.validate() - - return response.data + } } - public func speechToSpeech( - inputAudioURL: URL, - voiceID: String, - voiceSettings: ElevenLabs.VoiceSettings, - model: ElevenLabs.Model - ) async throws -> Data { - let boundary = UUID().uuidString - - var request = try URLRequest(url: URL(string: "\(apiSpecification.host)/v1/speech-to-speech/\(voiceID)/stream").unwrap()) - - request.httpMethod = "POST" - request.setValue("audio/mpeg", forHTTPHeaderField: "accept") - request.setValue(configuration.apiKey, forHTTPHeaderField: "xi-api-key") - request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type") - - var data = Data() - - // Add model_id - data.append("--\(boundary)\r\n".data(using: .utf8)!) - data.append("Content-Disposition: form-data; name=\"model_id\"\r\n\r\n".data(using: .utf8)!) - data.append("\(model.rawValue)\r\n".data(using: .utf8)!) - - // Add voice settings - let encoder = JSONEncoder() - encoder.keyEncodingStrategy = .convertToSnakeCase - let voiceSettingsData = try encoder.encode(voiceSettings) - let voiceSettingsString = String(data: voiceSettingsData, encoding: .utf8)! - - data.append("--\(boundary)\r\n".data(using: .utf8)!) - data.append("Content-Disposition: form-data; name=\"voice_settings\"\r\n\r\n".data(using: .utf8)!) - data.append("\(voiceSettingsString)\r\n".data(using: .utf8)!) - - // Add audio file - if let fileData = createMultipartData(boundary: boundary, name: "audio", fileURL: inputAudioURL, fileType: "audio/mpeg") { - data.append(fileData) + public final class MultipartEndpoint: BaseHTTPEndpoint { + override public func buildRequestBase( + from input: Input, + context: BuildRequestContext + ) throws -> Request { + let boundary = UUID().uuidString + var request = try super.buildRequestBase(from: input, context: context) + .header("xi-api-key", context.root.apiKey) + .header(.contentType(.multipartFormData(boundary: boundary))) + + var data = Data() + + switch input { + case let input as RequestBodies.SpeechToSpeechInput: + data.append(input.createMultipartFormData(boundary: boundary)) + case let input as RequestBodies.AddVoiceInput: + data.append(input.createMultipartFormData(boundary: boundary)) + case let input as RequestBodies.EditVoiceInput: + data.append(input.createMultipartFormData(boundary: boundary)) + default: + throw Never.Reason.unexpected + } + + request.httpBody = data + + return request } - data.append("--\(boundary)--\r\n".data(using: .utf8)!) - - request.httpBody = data - - return try await withUnsafeThrowingContinuation { continuation in - let task = URLSession.shared.dataTask(with: request) { (data, response, error) in - if let error = error { - continuation.resume(throwing: error) - } else if let data = data { - if let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 { - continuation.resume(returning: data) - } else { - continuation.resume(throwing: _PlaceholderError()) - } - } + override public func decodeOutputBase( + from response: Request.Response, + context: DecodeOutputContext + ) throws -> Output { + try response.validate() + + if Output.self == Data.self { + return response.data as! Output } - task.resume() + return try response.decode( + Output.self, + keyDecodingStrategy: .convertFromSnakeCase + ) } } - - public func upload( - voiceWithName name: String, - description: String, - fileURL: URL - ) async throws -> ElevenLabs.Voice.ID { - let boundary = UUID().uuidString - - var request = try URLRequest(url: URL(string: "\(apiSpecification.host)/v1/voices/add").unwrap()) - - request.httpMethod = "POST" - request.setValue("application/json", forHTTPHeaderField: "accept") - request.setValue(configuration.apiKey, forHTTPHeaderField: "xi-api-key") - request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type") - - var data = Data() - let parameters = [ - ("name", name), - ("description", description), - ("labels", "") - ] - - for (key, value) in parameters { - data.append("--\(boundary)\r\n".data(using: .utf8)!) - data.append("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n".data(using: .utf8)!) - data.append("\(value)\r\n".data(using: .utf8)!) +} + +// Request and Response Bodies +extension ElevenLabsAPI { + public enum RequestBodies { + public struct SpeechRequest: Codable { + let text: String + let voiceSettings: ElevenLabs.VoiceSettings + let model: ElevenLabs.Model } - if let fileData = createMultipartData(boundary: boundary, name: "files", fileURL: fileURL, fileType: "audio/x-wav") { - data.append(fileData) + public struct TextToSpeechInput { + let voiceId: String + let text: String + let voiceSettings: ElevenLabs.VoiceSettings + let model: ElevenLabs.Model } - data.append("--\(boundary)--\r\n".data(using: .utf8)!) - - request.httpBody = data - - let voiceID: String? = try await withUnsafeThrowingContinuation { (continuation: UnsafeContinuation) in - let task = URLSession.shared.dataTask(with: request) { (data, response, error) in - if let error = error { - continuation.resume(throwing: error) - } else if let data = data { - if let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 { - do { - if let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] { - guard let voiceID: String = json["voice_id"] as? String else { return } - continuation.resume(returning: voiceID) - } else { - continuation.resume(returning: nil) - } - } catch { - continuation.resume(throwing: _PlaceholderError()) - } - } else { - continuation.resume(throwing: _PlaceholderError()) - } + public struct SpeechToSpeechInput { + let voiceId: String + let audioURL: URL + let voiceSettings: ElevenLabs.VoiceSettings + let model: ElevenLabs.Model + + func createMultipartFormData(boundary: String) -> Data { + var data = Data() + + // Add model_id + data.append("--\(boundary)\r\n".data(using: .utf8)!) + data.append("Content-Disposition: form-data; name=\"model_id\"\r\n\r\n".data(using: .utf8)!) + data.append("\(model.rawValue)\r\n".data(using: .utf8)!) + + // Add voice settings + let encoder = JSONEncoder() + encoder.keyEncodingStrategy = .convertToSnakeCase + if let voiceSettingsData = try? encoder.encode(voiceSettings), + let voiceSettingsString = String(data: voiceSettingsData, encoding: .utf8) { + data.append("--\(boundary)\r\n".data(using: .utf8)!) + data.append("Content-Disposition: form-data; name=\"voice_settings\"\r\n\r\n".data(using: .utf8)!) + data.append("\(voiceSettingsString)\r\n".data(using: .utf8)!) + } + + // Add audio file + if let fileData = try? Data(contentsOf: audioURL) { + data.append("--\(boundary)\r\n".data(using: .utf8)!) + data.append("Content-Disposition: form-data; name=\"audio\"; filename=\"\(audioURL.lastPathComponent)\"\r\n".data(using: .utf8)!) + data.append("Content-Type: audio/mpeg\r\n\r\n".data(using: .utf8)!) + data.append(fileData) + data.append("\r\n".data(using: .utf8)!) } + + data.append("--\(boundary)--\r\n".data(using: .utf8)!) + return data } - - task.resume() } - return try .init(rawValue: voiceID.unwrap()) - } - - public func edit( - voice: ElevenLabs.Voice.ID, - name: String, - description: String, - fileURL: URL - ) async throws -> Bool { - let url = URL(string: "\(apiSpecification.host)/v1/voices/\(voice.rawValue)/edit")! - - let boundary = UUID().uuidString - var request = URLRequest(url: url) - - request.httpMethod = "POST" - request.setValue("application/json", forHTTPHeaderField: "accept") - request.setValue(configuration.apiKey, forHTTPHeaderField: "xi-api-key") - request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type") - - var data = Data() - let parameters = [ - ("name", name), - ("description", description), - ("labels", "") - ] - - for (key, value) in parameters { - data.append("--\(boundary)\r\n".data(using: .utf8)!) - data.append("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n".data(using: .utf8)!) - data.append("\(value)\r\n".data(using: .utf8)!) + public struct AddVoiceInput { + let name: String + let description: String + let fileURL: URL + + func createMultipartFormData(boundary: String) -> Data { + var data = Data() + + // Add name and description + let parameters = [ + ("name", name), + ("description", description), + ("labels", "") + ] + + for (key, value) in parameters { + data.append("--\(boundary)\r\n".data(using: .utf8)!) + data.append("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n".data(using: .utf8)!) + data.append("\(value)\r\n".data(using: .utf8)!) + } + + // Add audio file + if let fileData = try? Data(contentsOf: fileURL) { + data.append("--\(boundary)\r\n".data(using: .utf8)!) + data.append("Content-Disposition: form-data; name=\"files\"; filename=\"\(fileURL.lastPathComponent)\"\r\n".data(using: .utf8)!) + data.append("Content-Type: audio/x-wav\r\n\r\n".data(using: .utf8)!) + data.append(fileData) + data.append("\r\n".data(using: .utf8)!) + } + + data.append("--\(boundary)--\r\n".data(using: .utf8)!) + return data + } } - if let fileData = createMultipartData(boundary: boundary, name: "files", fileURL: fileURL, fileType: "audio/x-wav") { - data.append(fileData) + public struct EditVoiceInput { + let voiceId: String + let name: String + let description: String + let fileURL: URL + + func createMultipartFormData(boundary: String) -> Data { + var data = Data() + + // Add name and description + let parameters = [ + ("name", name), + ("description", description), + ("labels", "") + ] + + for (key, value) in parameters { + data.append("--\(boundary)\r\n".data(using: .utf8)!) + data.append("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n".data(using: .utf8)!) + data.append("\(value)\r\n".data(using: .utf8)!) + } + + // Add audio file + if let fileData = try? Data(contentsOf: fileURL) { + data.append("--\(boundary)\r\n".data(using: .utf8)!) + data.append("Content-Disposition: form-data; name=\"files\"; filename=\"\(fileURL.lastPathComponent)\"\r\n".data(using: .utf8)!) + data.append("Content-Type: audio/x-wav\r\n\r\n".data(using: .utf8)!) + data.append(fileData) + data.append("\r\n".data(using: .utf8)!) + } + + data.append("--\(boundary)--\r\n".data(using: .utf8)!) + return data + } } - - data.append("--\(boundary)--\r\n".data(using: .utf8)!) - - request.httpBody = data - - let response = try await HTTPSession.shared.data(for: request) - - try response.validate() - - return true - } - - public func delete( - voice: ElevenLabs.Voice.ID - ) async throws { - let url = try URL(string: "\(apiSpecification.host)/v1/voices/\(voice.rawValue)").unwrap() - - var request = URLRequest(url: url) - - request.httpMethod = "DELETE" - request.setValue("application/json", forHTTPHeaderField: "accept") - request.setValue(configuration.apiKey, forHTTPHeaderField: "xi-api-key") - - let response = try await HTTPSession.shared.data(for: request) - - try response.validate() } - private func createMultipartData( - boundary: String, - name: String, - fileURL: URL, - fileType: String - ) -> Data? { - var result = Data() - let fileName = fileURL.lastPathComponent - - result.append("--\(boundary)\r\n".data(using: .utf8)!) - result.append("Content-Disposition: form-data; name=\"\(name)\"; filename=\"\(fileName)\"\r\n".data(using: .utf8)!) - result.append("Content-Type: \(fileType)\r\n\r\n".data(using: .utf8)!) - - guard let fileData = try? Data(contentsOf: fileURL) else { - return nil + public enum ResponseBodies { + public struct Voices: Codable { + public let voices: [ElevenLabs.Voice] } - result.append(fileData) - result.append("\r\n".data(using: .utf8)!) - - return result + public struct VoiceID: Codable { + public let voiceId: String + } } } From 504d5067b78cd9d6c0eee86b0b3c1a0782c6c141 Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Mon, 18 Nov 2024 15:59:50 -0700 Subject: [PATCH 002/271] Updates to Endpoints & RequestBodies --- .../ElevenLabs.APISpecification.swift | 185 ++++++-- .../Intramodular/ElevenLabs.Client.swift | 428 +++++++++--------- .../ElevenLabs.VoiceSettings.swift | 10 +- 3 files changed, 375 insertions(+), 248 deletions(-) diff --git a/Sources/ElevenLabs/Intramodular/ElevenLabs.APISpecification.swift b/Sources/ElevenLabs/Intramodular/ElevenLabs.APISpecification.swift index 9e0c2a26..4b55c824 100644 --- a/Sources/ElevenLabs/Intramodular/ElevenLabs.APISpecification.swift +++ b/Sources/ElevenLabs/Intramodular/ElevenLabs.APISpecification.swift @@ -3,50 +3,183 @@ // import CorePersistence -import Swallow +import Diagnostics +import NetworkKit +import Swift +import SwiftAPI extension ElevenLabs { - public struct APISpecification { + public enum APIError: APIErrorProtocol { + public typealias API = ElevenLabs.APISpecification + + case apiKeyMissing + case incorrectAPIKeyProvided + case rateLimitExceeded + case invalidContentType + case badRequest(request: API.Request?, error: API.Request.Error) + case unknown(message: String) + case runtime(AnyError) + + public var traits: ErrorTraits { + [.domain(.networking)] + } + } + + public struct APISpecification: RESTAPISpecification { + public typealias Error = APIError + + public struct Configuration: Codable, Hashable { + public var host: URL + public var apiKey: String? + + public init( + host: URL = URL(string: "https://api.elevenlabs.io")!, + apiKey: String? = nil + ) { + self.host = host + self.apiKey = apiKey + } + } + + public let configuration: Configuration + public var host: URL { - URL(string: "https://api.elevenlabs.io")! + configuration.host + } + + public var id: some Hashable { + configuration + } + + public init(configuration: Configuration) { + self.configuration = configuration } + + // Voices endpoints + @GET + @Path("/v1/voices") + var listVoices = Endpoint() + + // Text to speech + @POST + @Path({ context -> String in + "/v1/text-to-speech/\(context.input.voiceId)" + }) + @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) + var textToSpeech = Endpoint() + + // Speech to speech + @POST + @Path({ context -> String in + "/v1/speech-to-speech/\(context.input.voiceId)/stream" + }) + @Body(multipart: .input) + var speechToSpeech = Endpoint() + + // Voice management + @POST + @Path("/v1/voices/add") + @Body(multipart: .input) + var addVoice = Endpoint() + + @POST + @Path({ context -> String in + "/v1/voices/\(context.input.voiceId)/edit" + }) + @Body(multipart: .input) + var editVoice = Endpoint() + + @DELETE + @Path({ context -> String in + "/v1/voices/\(context.input)" + }) + var deleteVoice = Endpoint() } } extension ElevenLabs.APISpecification { - enum RequestBodies { - public struct SpeechRequest: Codable { - public enum CodingKeys: String, CodingKey { - case text - case voiceSettings - case model - } + public final class Endpoint: BaseHTTPEndpoint { + override public func buildRequestBase( + from input: Input, + context: BuildRequestContext + ) throws -> Request { + var request = try super.buildRequestBase( + from: input, + context: context + ) - let text: String - let voiceSettings: ElevenLabs.VoiceSettings - let model: ElevenLabs.Model + request = request.header("xi-api-key", context.root.configuration.apiKey) + .header(.contentType(.json)) - init( - text: String, - voiceSettings: ElevenLabs.VoiceSettings, - model: ElevenLabs.Model - ) { - self.text = text - self.voiceSettings = voiceSettings - self.model = model + return request + } + + struct _ErrorWrapper: Codable, Hashable { + let detail: ErrorDetail + + struct ErrorDetail: Codable, Hashable { + let status: String + let message: String + } + } + + override public func decodeOutputBase( + from response: Request.Response, + context: DecodeOutputContext + ) throws -> Output { + do { + try response.validate() + } catch { + let apiError: Error + + if let error = error as? HTTPRequest.Error { + let errorWrapper = try? response.decode( + _ErrorWrapper.self, + keyDecodingStrategy: .convertFromSnakeCase + ) + + if let message = errorWrapper?.detail.message { + if message.contains("API key is missing") { + throw Error.apiKeyMissing + } else if message.contains("Invalid API key") { + throw Error.incorrectAPIKeyProvided + } else { + throw Error.unknown(message: message) + } + } + + if response.statusCode.rawValue == 429 { + apiError = .rateLimitExceeded + } else { + apiError = .badRequest(error) + } + } else { + apiError = .runtime(error) + } + + throw apiError + } + + if Output.self == Data.self { + return response.data as! Output } + + return try response.decode( + Output.self, + keyDecodingStrategy: .convertFromSnakeCase + ) } } } extension ElevenLabs.APISpecification { public enum ResponseBodies { - public struct Voices: Codable, Hashable, Sendable { + public struct Voices: Codable { public let voices: [ElevenLabs.Voice] - - public init(voices: [ElevenLabs.Voice]) { - self.voices = voices - } + } + + public struct VoiceID: Codable { + public let voiceId: String } } } diff --git a/Sources/ElevenLabs/Intramodular/ElevenLabs.Client.swift b/Sources/ElevenLabs/Intramodular/ElevenLabs.Client.swift index acd45418..c1a722df 100644 --- a/Sources/ElevenLabs/Intramodular/ElevenLabs.Client.swift +++ b/Sources/ElevenLabs/Intramodular/ElevenLabs.Client.swift @@ -2,274 +2,268 @@ // Copyright (c) Vatsal Manot // -import CoreMI import CorePersistence -import Foundation +import Diagnostics import NetworkKit +import Foundation +import SwiftAPI +import Merge +import FoundationX +import Swallow -public struct ElevenLabsAPI: RESTAPISpecification { - public var apiKey: String - public var host = URL(string: "https://api.elevenlabs.io")! - - public init(apiKey: String) { - self.apiKey = apiKey - } - - public var baseURL: URL { - host.appendingPathComponent("/v1") - } - - public var id: some Hashable { - apiKey - } - - // List Voices endpoint - @Path("voices") - @GET - var listVoices = Endpoint() - - // Text to Speech endpoint - @Path("text-to-speech/{voiceId}") - @POST - @Body({ context in - RequestBodies.SpeechRequest( - text: context.input.text, - voiceSettings: context.input.voiceSettings, - model: context.input.model - ) - }) - var textToSpeech = Endpoint() - - // Speech to Speech endpoint - @Path("speech-to-speech/{voiceId}/stream") - @POST - var speechToSpeech = MultipartEndpoint() - - // Add Voice endpoint - @Path("voices/add") - @POST - var addVoice = MultipartEndpoint() - - // Edit Voice endpoint - @Path("voices/{voiceId}/edit") - @POST - var editVoice = MultipartEndpoint() - - // Delete Voice endpoint - @Path("voices/{voiceId}") - @DELETE - var deleteVoice = Endpoint() -} - -extension ElevenLabsAPI { - public final class Endpoint: BaseHTTPEndpoint { - override public func buildRequestBase( - from input: Input, - context: BuildRequestContext - ) throws -> Request { - let request = try super.buildRequestBase(from: input, context: context) - .header("xi-api-key", context.root.apiKey) - .header(.contentType(.json)) - - return request +extension ElevenLabs { + @RuntimeDiscoverable + public final class Client: SwiftAPI.Client, ObservableObject { + public typealias API = ElevenLabs.APISpecification + public typealias Session = HTTPSession + + public let interface: API + public let session: Session + public var sessionCache: EmptyKeyedCache + + public required init(configuration: API.Configuration) { + self.interface = API(configuration: configuration) + self.session = HTTPSession.shared + self.sessionCache = .init() } - override public func decodeOutputBase( - from response: Request.Response, - context: DecodeOutputContext - ) throws -> Output { - try response.validate() - - if Output.self == Data.self { - return response.data as! Output - } - - return try response.decode( - Output.self, - keyDecodingStrategy: .convertFromSnakeCase - ) + public convenience init(apiKey: String?) { + self.init(configuration: .init(apiKey: apiKey)) } } +} + +extension ElevenLabs.APISpecification { - public final class MultipartEndpoint: BaseHTTPEndpoint { - override public func buildRequestBase( - from input: Input, - context: BuildRequestContext - ) throws -> Request { - let boundary = UUID().uuidString - var request = try super.buildRequestBase(from: input, context: context) - .header("xi-api-key", context.root.apiKey) - .header(.contentType(.multipartFormData(boundary: boundary))) + enum RequestBodies { + public struct SpeechRequest: Codable, Hashable, Equatable { + public let text: String + public let voiceSettings: ElevenLabs.VoiceSettings + public let model: ElevenLabs.Model - var data = Data() - - switch input { - case let input as RequestBodies.SpeechToSpeechInput: - data.append(input.createMultipartFormData(boundary: boundary)) - case let input as RequestBodies.AddVoiceInput: - data.append(input.createMultipartFormData(boundary: boundary)) - case let input as RequestBodies.EditVoiceInput: - data.append(input.createMultipartFormData(boundary: boundary)) - default: - throw Never.Reason.unexpected + public init( + text: String, + voiceSettings: ElevenLabs.VoiceSettings, + model: ElevenLabs.Model + ) { + self.text = text + self.voiceSettings = voiceSettings + self.model = model } - request.httpBody = data - - return request + public static func == (lhs: SpeechRequest, rhs: SpeechRequest) -> Bool { + return lhs.text == rhs.text && + lhs.voiceSettings == rhs.voiceSettings && + lhs.model == rhs.model + } } - override public func decodeOutputBase( - from response: Request.Response, - context: DecodeOutputContext - ) throws -> Output { - try response.validate() + public struct TextToSpeechInput: Codable, Hashable { + public let voiceId: String + public let requestBody: SpeechRequest - if Output.self == Data.self { - return response.data as! Output + public init(voiceId: String, requestBody: SpeechRequest) { + self.voiceId = voiceId + self.requestBody = requestBody } - - return try response.decode( - Output.self, - keyDecodingStrategy: .convertFromSnakeCase - ) - } - } -} - -// Request and Response Bodies -extension ElevenLabsAPI { - public enum RequestBodies { - public struct SpeechRequest: Codable { - let text: String - let voiceSettings: ElevenLabs.VoiceSettings - let model: ElevenLabs.Model } - public struct TextToSpeechInput { - let voiceId: String - let text: String - let voiceSettings: ElevenLabs.VoiceSettings - let model: ElevenLabs.Model - } - - public struct SpeechToSpeechInput { - let voiceId: String - let audioURL: URL - let voiceSettings: ElevenLabs.VoiceSettings - let model: ElevenLabs.Model + public struct SpeechToSpeechInput: Codable, Hashable, HTTPRequest.Multipart.ContentConvertible, Equatable { + public let voiceId: String + public let audioURL: URL + public let model: ElevenLabs.Model + public let voiceSettings: ElevenLabs.VoiceSettings - func createMultipartFormData(boundary: String) -> Data { - var data = Data() + public init( + voiceId: String, + audioURL: URL, + model: ElevenLabs.Model, + voiceSettings: ElevenLabs.VoiceSettings + ) { + self.voiceId = voiceId + self.audioURL = audioURL + self.model = model + self.voiceSettings = voiceSettings + } + + public func __conversion() throws -> HTTPRequest.Multipart.Content { + var result = HTTPRequest.Multipart.Content() - // Add model_id - data.append("--\(boundary)\r\n".data(using: .utf8)!) - data.append("Content-Disposition: form-data; name=\"model_id\"\r\n\r\n".data(using: .utf8)!) - data.append("\(model.rawValue)\r\n".data(using: .utf8)!) + result.append(.text(named: "model_id", value: model.rawValue)) - // Add voice settings let encoder = JSONEncoder() encoder.keyEncodingStrategy = .convertToSnakeCase if let voiceSettingsData = try? encoder.encode(voiceSettings), let voiceSettingsString = String(data: voiceSettingsData, encoding: .utf8) { - data.append("--\(boundary)\r\n".data(using: .utf8)!) - data.append("Content-Disposition: form-data; name=\"voice_settings\"\r\n\r\n".data(using: .utf8)!) - data.append("\(voiceSettingsString)\r\n".data(using: .utf8)!) + result.append(.text(named: "voice_settings", value: voiceSettingsString)) } - // Add audio file if let fileData = try? Data(contentsOf: audioURL) { - data.append("--\(boundary)\r\n".data(using: .utf8)!) - data.append("Content-Disposition: form-data; name=\"audio\"; filename=\"\(audioURL.lastPathComponent)\"\r\n".data(using: .utf8)!) - data.append("Content-Type: audio/mpeg\r\n\r\n".data(using: .utf8)!) - data.append(fileData) - data.append("\r\n".data(using: .utf8)!) + result.append( + .file( + named: "audio", + data: fileData, + filename: audioURL.lastPathComponent, + contentType: .mpeg + ) + ) } - data.append("--\(boundary)--\r\n".data(using: .utf8)!) - return data + return result } } - public struct AddVoiceInput { - let name: String - let description: String - let fileURL: URL + public struct AddVoiceInput: Codable, Hashable, HTTPRequest.Multipart.ContentConvertible, Equatable { + public let name: String + public let description: String + public let fileURL: URL - func createMultipartFormData(boundary: String) -> Data { - var data = Data() - - // Add name and description - let parameters = [ - ("name", name), - ("description", description), - ("labels", "") - ] + public init( + name: String, + description: String, + fileURL: URL + ) { + self.name = name + self.description = description + self.fileURL = fileURL + } + + public func __conversion() throws -> HTTPRequest.Multipart.Content { + var result = HTTPRequest.Multipart.Content() - for (key, value) in parameters { - data.append("--\(boundary)\r\n".data(using: .utf8)!) - data.append("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n".data(using: .utf8)!) - data.append("\(value)\r\n".data(using: .utf8)!) - } + result.append(.text(named: "name", value: name)) + result.append(.text(named: "description", value: description)) + result.append(.text(named: "labels", value: "")) - // Add audio file if let fileData = try? Data(contentsOf: fileURL) { - data.append("--\(boundary)\r\n".data(using: .utf8)!) - data.append("Content-Disposition: form-data; name=\"files\"; filename=\"\(fileURL.lastPathComponent)\"\r\n".data(using: .utf8)!) - data.append("Content-Type: audio/x-wav\r\n\r\n".data(using: .utf8)!) - data.append(fileData) - data.append("\r\n".data(using: .utf8)!) + result.append( + .file( + named: "files", + data: fileData, + filename: fileURL.lastPathComponent, + contentType: .wav + ) + ) } - data.append("--\(boundary)--\r\n".data(using: .utf8)!) - return data + return result } } - public struct EditVoiceInput { - let voiceId: String - let name: String - let description: String - let fileURL: URL + public struct EditVoiceInput: Codable, Hashable, HTTPRequest.Multipart.ContentConvertible, Equatable { + public let voiceId: String + public let name: String + public let description: String + public let fileURL: URL - func createMultipartFormData(boundary: String) -> Data { - var data = Data() - - // Add name and description - let parameters = [ - ("name", name), - ("description", description), - ("labels", "") - ] + public init( + voiceId: String, + name: String, + description: String, + fileURL: URL + ) { + self.voiceId = voiceId + self.name = name + self.description = description + self.fileURL = fileURL + } + + public func __conversion() throws -> HTTPRequest.Multipart.Content { + var result = HTTPRequest.Multipart.Content() - for (key, value) in parameters { - data.append("--\(boundary)\r\n".data(using: .utf8)!) - data.append("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n".data(using: .utf8)!) - data.append("\(value)\r\n".data(using: .utf8)!) - } + result.append(.text(named: "name", value: name)) + result.append(.text(named: "description", value: description)) + result.append(.text(named: "labels", value: "")) - // Add audio file if let fileData = try? Data(contentsOf: fileURL) { - data.append("--\(boundary)\r\n".data(using: .utf8)!) - data.append("Content-Disposition: form-data; name=\"files\"; filename=\"\(fileURL.lastPathComponent)\"\r\n".data(using: .utf8)!) - data.append("Content-Type: audio/x-wav\r\n\r\n".data(using: .utf8)!) - data.append(fileData) - data.append("\r\n".data(using: .utf8)!) + result.append( + .file( + named: "files", + data: fileData, + filename: fileURL.lastPathComponent, + contentType: .wav + ) + ) } - data.append("--\(boundary)--\r\n".data(using: .utf8)!) - return data + return result } } } +} + +// Client API Methods +extension ElevenLabs.Client { + public func availableVoices() async throws -> [ElevenLabs.Voice] { + try await run(\.listVoices).voices + } - public enum ResponseBodies { - public struct Voices: Codable { - public let voices: [ElevenLabs.Voice] - } + @discardableResult + public func speech( + for text: String, + voiceID: String, + voiceSettings: ElevenLabs.VoiceSettings, + model: ElevenLabs.Model + ) async throws -> Data { + let requestBody = ElevenLabs.APISpecification.RequestBodies.SpeechRequest( + text: text, + voiceSettings: voiceSettings, + model: model + ) - public struct VoiceID: Codable { - public let voiceId: String - } + return try await run(\.textToSpeech, with: .init(voiceId: voiceID, requestBody: requestBody)) + } + + public func speechToSpeech( + inputAudioURL: URL, + voiceID: String, + voiceSettings: ElevenLabs.VoiceSettings, + model: ElevenLabs.Model + ) async throws -> Data { + let input = ElevenLabs.APISpecification.RequestBodies.SpeechToSpeechInput( + voiceId: voiceID, + audioURL: inputAudioURL, + model: model, + voiceSettings: voiceSettings + ) + + return try await run(\.speechToSpeech, with: input) + } + + public func upload( + voiceWithName name: String, + description: String, + fileURL: URL + ) async throws -> ElevenLabs.Voice.ID { + let input = ElevenLabs.APISpecification.RequestBodies.AddVoiceInput( + name: name, + description: description, + fileURL: fileURL + ) + + let response = try await run(\.addVoice, with: input) + return try .init(rawValue: response.voiceId) + } + + public func edit( + voice: ElevenLabs.Voice.ID, + name: String, + description: String, + fileURL: URL + ) async throws -> Bool { + let input = ElevenLabs.APISpecification.RequestBodies.EditVoiceInput( + voiceId: voice.rawValue, + name: name, + description: description, + fileURL: fileURL + ) + + return try await run(\.editVoice, with: input) + } + + public func delete( + voice: ElevenLabs.Voice.ID + ) async throws { + try await run(\.deleteVoice, with: voice.rawValue) } } diff --git a/Sources/ElevenLabs/Intramodular/ElevenLabs.VoiceSettings.swift b/Sources/ElevenLabs/Intramodular/ElevenLabs.VoiceSettings.swift index 67b45da1..1c5bd481 100644 --- a/Sources/ElevenLabs/Intramodular/ElevenLabs.VoiceSettings.swift +++ b/Sources/ElevenLabs/Intramodular/ElevenLabs.VoiceSettings.swift @@ -5,7 +5,7 @@ import Foundation extension ElevenLabs { - public final class VoiceSettings: Codable, Sendable { + public struct VoiceSettings: Codable, Sendable, Hashable { public enum Setting: String, Codable, Sendable { case stability @@ -54,7 +54,7 @@ extension ElevenLabs { self.removeBackgroundNoise = removeBackgroundNoise ?? false } - public convenience init(stability: Double) { + public init(stability: Double) { self.init( stability: stability, similarityBoost: 0.75, @@ -64,7 +64,7 @@ extension ElevenLabs { ) } - public convenience init(similarityBoost: Double) { + public init(similarityBoost: Double) { self.init( stability: 0.5, similarityBoost: similarityBoost, @@ -74,7 +74,7 @@ extension ElevenLabs { ) } - public convenience init(styleExaggeration: Double) { + public init(styleExaggeration: Double) { self.init( stability: 0.5, similarityBoost: 0.75, @@ -84,7 +84,7 @@ extension ElevenLabs { ) } - public convenience init(speakerBoost: Bool) { + public init(speakerBoost: Bool) { self.init( stability: 0.5, similarityBoost: 0.75, From 8d5d0d31dbef8da2eede9fd02d7a0f8f5d47ec49 Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Mon, 18 Nov 2024 16:35:30 -0700 Subject: [PATCH 003/271] fixes --- .../ElevenLabs.APISpecification.swift | 2 +- .../Intramodular/ElevenLabs.Client.swift | 86 ++++++++++++++----- 2 files changed, 64 insertions(+), 24 deletions(-) diff --git a/Sources/ElevenLabs/Intramodular/ElevenLabs.APISpecification.swift b/Sources/ElevenLabs/Intramodular/ElevenLabs.APISpecification.swift index 4b55c824..4f9a1031 100644 --- a/Sources/ElevenLabs/Intramodular/ElevenLabs.APISpecification.swift +++ b/Sources/ElevenLabs/Intramodular/ElevenLabs.APISpecification.swift @@ -65,7 +65,7 @@ extension ElevenLabs { @Path({ context -> String in "/v1/text-to-speech/\(context.input.voiceId)" }) - @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) + @Body(json: \.requestBody, keyEncodingStrategy: .convertToSnakeCase) var textToSpeech = Endpoint() // Speech to speech diff --git a/Sources/ElevenLabs/Intramodular/ElevenLabs.Client.swift b/Sources/ElevenLabs/Intramodular/ElevenLabs.Client.swift index c1a722df..c7da2841 100644 --- a/Sources/ElevenLabs/Intramodular/ElevenLabs.Client.swift +++ b/Sources/ElevenLabs/Intramodular/ElevenLabs.Client.swift @@ -41,6 +41,12 @@ extension ElevenLabs.APISpecification { public let voiceSettings: ElevenLabs.VoiceSettings public let model: ElevenLabs.Model + private enum CodingKeys: String, CodingKey { + case text + case voiceSettings = "voice_settings" + case model = "model_id" + } + public init( text: String, voiceSettings: ElevenLabs.VoiceSettings, @@ -50,12 +56,6 @@ extension ElevenLabs.APISpecification { self.voiceSettings = voiceSettings self.model = model } - - public static func == (lhs: SpeechRequest, rhs: SpeechRequest) -> Bool { - return lhs.text == rhs.text && - lhs.voiceSettings == rhs.voiceSettings && - lhs.model == rhs.model - } } public struct TextToSpeechInput: Codable, Hashable { @@ -89,13 +89,26 @@ extension ElevenLabs.APISpecification { public func __conversion() throws -> HTTPRequest.Multipart.Content { var result = HTTPRequest.Multipart.Content() - result.append(.text(named: "model_id", value: model.rawValue)) + result.append( + .text( + named: "model_id", + value: model.rawValue + ) + ) let encoder = JSONEncoder() encoder.keyEncodingStrategy = .convertToSnakeCase if let voiceSettingsData = try? encoder.encode(voiceSettings), - let voiceSettingsString = String(data: voiceSettingsData, encoding: .utf8) { - result.append(.text(named: "voice_settings", value: voiceSettingsString)) + let voiceSettingsString = String( + data: voiceSettingsData, + encoding: .utf8 + ) { + result.append( + .text( + named: "voice_settings", + value: voiceSettingsString + ) + ) } if let fileData = try? Data(contentsOf: audioURL) { @@ -131,9 +144,26 @@ extension ElevenLabs.APISpecification { public func __conversion() throws -> HTTPRequest.Multipart.Content { var result = HTTPRequest.Multipart.Content() - result.append(.text(named: "name", value: name)) - result.append(.text(named: "description", value: description)) - result.append(.text(named: "labels", value: "")) + result.append( + .text( + named: "name", + value: name + ) + ) + + result.append( + .text( + named: "description", + value: description + ) + ) + + result.append( + .text( + named: "labels", + value: "" + ) + ) if let fileData = try? Data(contentsOf: fileURL) { result.append( @@ -153,35 +183,43 @@ extension ElevenLabs.APISpecification { public struct EditVoiceInput: Codable, Hashable, HTTPRequest.Multipart.ContentConvertible, Equatable { public let voiceId: String public let name: String - public let description: String - public let fileURL: URL + public let description: String? + public let fileURL: URL? + public let removeBackgroundNoise: Bool public init( voiceId: String, name: String, - description: String, - fileURL: URL + description: String? = nil, + fileURL: URL? = nil, + removeBackgroundNoise: Bool = false ) { self.voiceId = voiceId self.name = name self.description = description self.fileURL = fileURL + self.removeBackgroundNoise = removeBackgroundNoise } public func __conversion() throws -> HTTPRequest.Multipart.Content { var result = HTTPRequest.Multipart.Content() result.append(.text(named: "name", value: name)) - result.append(.text(named: "description", value: description)) - result.append(.text(named: "labels", value: "")) - if let fileData = try? Data(contentsOf: fileURL) { + if let description = description { + result.append(.text(named: "description", value: description)) + } + + result.append(.text(named: "remove_background_noise", value: removeBackgroundNoise ? "true" : "false")) + + if let fileURL = fileURL, + let fileData = try? Data(contentsOf: fileURL) { result.append( .file( named: "files", data: fileData, filename: fileURL.lastPathComponent, - contentType: .wav + contentType: .m4a ) ) } @@ -242,20 +280,22 @@ extension ElevenLabs.Client { ) let response = try await run(\.addVoice, with: input) - return try .init(rawValue: response.voiceId) + return .init(rawValue: response.voiceId) } public func edit( voice: ElevenLabs.Voice.ID, name: String, description: String, - fileURL: URL + fileURL: URL, + removeBackgroundNoise: Bool = false ) async throws -> Bool { let input = ElevenLabs.APISpecification.RequestBodies.EditVoiceInput( voiceId: voice.rawValue, name: name, description: description, - fileURL: fileURL + fileURL: fileURL, + removeBackgroundNoise: removeBackgroundNoise ) return try await run(\.editVoice, with: input) From 7f4bbbb9b4a42ae780602646054fb28bba502844 Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Mon, 18 Nov 2024 18:06:29 -0700 Subject: [PATCH 004/271] Updated Client --- .../ElevenLabs.APISpecification.swift | 7 ++++ .../Intramodular/ElevenLabs.Client.swift | 34 ++++++++----------- 2 files changed, 22 insertions(+), 19 deletions(-) diff --git a/Sources/ElevenLabs/Intramodular/ElevenLabs.APISpecification.swift b/Sources/ElevenLabs/Intramodular/ElevenLabs.APISpecification.swift index 4f9a1031..d100dfcc 100644 --- a/Sources/ElevenLabs/Intramodular/ElevenLabs.APISpecification.swift +++ b/Sources/ElevenLabs/Intramodular/ElevenLabs.APISpecification.swift @@ -128,6 +128,9 @@ extension ElevenLabs.APISpecification { context: DecodeOutputContext ) throws -> Output { do { + if Input.self == RequestBodies.EditVoiceInput.self { + print("TEsts") + } try response.validate() } catch { let apiError: Error @@ -164,6 +167,10 @@ extension ElevenLabs.APISpecification { return response.data as! Output } + if Input.self == RequestBodies.EditVoiceInput.self { + print(response) + } + return try response.decode( Output.self, keyDecodingStrategy: .convertFromSnakeCase diff --git a/Sources/ElevenLabs/Intramodular/ElevenLabs.Client.swift b/Sources/ElevenLabs/Intramodular/ElevenLabs.Client.swift index c7da2841..ae34fa55 100644 --- a/Sources/ElevenLabs/Intramodular/ElevenLabs.Client.swift +++ b/Sources/ElevenLabs/Intramodular/ElevenLabs.Client.swift @@ -158,13 +158,6 @@ extension ElevenLabs.APISpecification { ) ) - result.append( - .text( - named: "labels", - value: "" - ) - ) - if let fileData = try? Data(contentsOf: fileURL) { result.append( .file( @@ -185,33 +178,38 @@ extension ElevenLabs.APISpecification { public let name: String public let description: String? public let fileURL: URL? - public let removeBackgroundNoise: Bool public init( voiceId: String, name: String, description: String? = nil, - fileURL: URL? = nil, - removeBackgroundNoise: Bool = false + fileURL: URL? = nil ) { self.voiceId = voiceId self.name = name self.description = description self.fileURL = fileURL - self.removeBackgroundNoise = removeBackgroundNoise } public func __conversion() throws -> HTTPRequest.Multipart.Content { var result = HTTPRequest.Multipart.Content() - result.append(.text(named: "name", value: name)) + result.append( + .text( + named: "name", + value: name + ) + ) if let description = description { - result.append(.text(named: "description", value: description)) + result.append( + .text( + named: "description", + value: description + ) + ) } - result.append(.text(named: "remove_background_noise", value: removeBackgroundNoise ? "true" : "false")) - if let fileURL = fileURL, let fileData = try? Data(contentsOf: fileURL) { result.append( @@ -287,15 +285,13 @@ extension ElevenLabs.Client { voice: ElevenLabs.Voice.ID, name: String, description: String, - fileURL: URL, - removeBackgroundNoise: Bool = false + fileURL: URL? ) async throws -> Bool { let input = ElevenLabs.APISpecification.RequestBodies.EditVoiceInput( voiceId: voice.rawValue, name: name, description: description, - fileURL: fileURL, - removeBackgroundNoise: removeBackgroundNoise + fileURL: fileURL ) return try await run(\.editVoice, with: input) From 3428d0d14d148e7cb797c0d7211aa6b607b5d94b Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Mon, 18 Nov 2024 19:26:23 -0700 Subject: [PATCH 005/271] Reorganization --- ...nLabs.APISpecification.RequestBodies.swift | 205 ++++++++++++++++++ ...Labs.APISpecification.ResponseBodies.swift | 20 ++ .../ElevenLabs.APISpecification.swift | 12 - .../Intramodular/ElevenLabs.Client.swift | 196 ----------------- 4 files changed, 225 insertions(+), 208 deletions(-) create mode 100644 Sources/ElevenLabs/Intramodular/API/ElevenLabs.APISpecification.RequestBodies.swift create mode 100644 Sources/ElevenLabs/Intramodular/API/ElevenLabs.APISpecification.ResponseBodies.swift rename Sources/ElevenLabs/Intramodular/{ => API}/ElevenLabs.APISpecification.swift (95%) diff --git a/Sources/ElevenLabs/Intramodular/API/ElevenLabs.APISpecification.RequestBodies.swift b/Sources/ElevenLabs/Intramodular/API/ElevenLabs.APISpecification.RequestBodies.swift new file mode 100644 index 00000000..6acaeaa0 --- /dev/null +++ b/Sources/ElevenLabs/Intramodular/API/ElevenLabs.APISpecification.RequestBodies.swift @@ -0,0 +1,205 @@ +// +// ElevenLabs.RequestTypes.swift +// AI +// +// Created by Jared Davidson on 11/18/24. +// + +import NetworkKit +import SwiftAPI +import Merge + +extension ElevenLabs.APISpecification { + + enum RequestBodies { + public struct SpeechRequest: Codable, Hashable, Equatable { + public let text: String + public let voiceSettings: ElevenLabs.VoiceSettings + public let model: ElevenLabs.Model + + private enum CodingKeys: String, CodingKey { + case text + case voiceSettings = "voice_settings" + case model = "model_id" + } + + public init( + text: String, + voiceSettings: ElevenLabs.VoiceSettings, + model: ElevenLabs.Model + ) { + self.text = text + self.voiceSettings = voiceSettings + self.model = model + } + } + + public struct TextToSpeechInput: Codable, Hashable { + public let voiceId: String + public let requestBody: SpeechRequest + + public init(voiceId: String, requestBody: SpeechRequest) { + self.voiceId = voiceId + self.requestBody = requestBody + } + } + + public struct SpeechToSpeechInput: Codable, Hashable, HTTPRequest.Multipart.ContentConvertible, Equatable { + public let voiceId: String + public let audioURL: URL + public let model: ElevenLabs.Model + public let voiceSettings: ElevenLabs.VoiceSettings + + public init( + voiceId: String, + audioURL: URL, + model: ElevenLabs.Model, + voiceSettings: ElevenLabs.VoiceSettings + ) { + self.voiceId = voiceId + self.audioURL = audioURL + self.model = model + self.voiceSettings = voiceSettings + } + + public func __conversion() throws -> HTTPRequest.Multipart.Content { + var result = HTTPRequest.Multipart.Content() + + result.append( + .text( + named: "model_id", + value: model.rawValue + ) + ) + + let encoder = JSONEncoder() + encoder.keyEncodingStrategy = .convertToSnakeCase + if let voiceSettingsData = try? encoder.encode(voiceSettings), + let voiceSettingsString = String( + data: voiceSettingsData, + encoding: .utf8 + ) { + result.append( + .text( + named: "voice_settings", + value: voiceSettingsString + ) + ) + } + + if let fileData = try? Data(contentsOf: audioURL) { + result.append( + .file( + named: "audio", + data: fileData, + filename: audioURL.lastPathComponent, + contentType: .mpeg + ) + ) + } + + return result + } + } + + public struct AddVoiceInput: Codable, Hashable, HTTPRequest.Multipart.ContentConvertible, Equatable { + public let name: String + public let description: String + public let fileURL: URL + + public init( + name: String, + description: String, + fileURL: URL + ) { + self.name = name + self.description = description + self.fileURL = fileURL + } + + public func __conversion() throws -> HTTPRequest.Multipart.Content { + var result = HTTPRequest.Multipart.Content() + + result.append( + .text( + named: "name", + value: name + ) + ) + + result.append( + .text( + named: "description", + value: description + ) + ) + + if let fileData = try? Data(contentsOf: fileURL) { + result.append( + .file( + named: "files", + data: fileData, + filename: fileURL.lastPathComponent, + contentType: .wav + ) + ) + } + + return result + } + } + + public struct EditVoiceInput: Codable, Hashable, HTTPRequest.Multipart.ContentConvertible, Equatable { + public let voiceId: String + public let name: String + public let description: String? + public let fileURL: URL? + + public init( + voiceId: String, + name: String, + description: String? = nil, + fileURL: URL? = nil + ) { + self.voiceId = voiceId + self.name = name + self.description = description + self.fileURL = fileURL + } + + public func __conversion() throws -> HTTPRequest.Multipart.Content { + var result = HTTPRequest.Multipart.Content() + + result.append( + .text( + named: "name", + value: name + ) + ) + + if let description = description { + result.append( + .text( + named: "description", + value: description + ) + ) + } + + if let fileURL = fileURL, + let fileData = try? Data(contentsOf: fileURL) { + result.append( + .file( + named: "files", + data: fileData, + filename: fileURL.lastPathComponent, + contentType: .m4a + ) + ) + } + + return result + } + } + } +} diff --git a/Sources/ElevenLabs/Intramodular/API/ElevenLabs.APISpecification.ResponseBodies.swift b/Sources/ElevenLabs/Intramodular/API/ElevenLabs.APISpecification.ResponseBodies.swift new file mode 100644 index 00000000..b80abbd5 --- /dev/null +++ b/Sources/ElevenLabs/Intramodular/API/ElevenLabs.APISpecification.ResponseBodies.swift @@ -0,0 +1,20 @@ +// +// ElevenLabs.APISpecification.ResponseBodies.swift +// AI +// +// Created by Jared Davidson on 11/18/24. +// + +import Foundation + +extension ElevenLabs.APISpecification { + public enum ResponseBodies { + public struct Voices: Codable { + public let voices: [ElevenLabs.Voice] + } + + public struct VoiceID: Codable { + public let voiceId: String + } + } +} diff --git a/Sources/ElevenLabs/Intramodular/ElevenLabs.APISpecification.swift b/Sources/ElevenLabs/Intramodular/API/ElevenLabs.APISpecification.swift similarity index 95% rename from Sources/ElevenLabs/Intramodular/ElevenLabs.APISpecification.swift rename to Sources/ElevenLabs/Intramodular/API/ElevenLabs.APISpecification.swift index d100dfcc..ce9e2742 100644 --- a/Sources/ElevenLabs/Intramodular/ElevenLabs.APISpecification.swift +++ b/Sources/ElevenLabs/Intramodular/API/ElevenLabs.APISpecification.swift @@ -178,15 +178,3 @@ extension ElevenLabs.APISpecification { } } } - -extension ElevenLabs.APISpecification { - public enum ResponseBodies { - public struct Voices: Codable { - public let voices: [ElevenLabs.Voice] - } - - public struct VoiceID: Codable { - public let voiceId: String - } - } -} diff --git a/Sources/ElevenLabs/Intramodular/ElevenLabs.Client.swift b/Sources/ElevenLabs/Intramodular/ElevenLabs.Client.swift index ae34fa55..2093a3ea 100644 --- a/Sources/ElevenLabs/Intramodular/ElevenLabs.Client.swift +++ b/Sources/ElevenLabs/Intramodular/ElevenLabs.Client.swift @@ -33,202 +33,6 @@ extension ElevenLabs { } } -extension ElevenLabs.APISpecification { - - enum RequestBodies { - public struct SpeechRequest: Codable, Hashable, Equatable { - public let text: String - public let voiceSettings: ElevenLabs.VoiceSettings - public let model: ElevenLabs.Model - - private enum CodingKeys: String, CodingKey { - case text - case voiceSettings = "voice_settings" - case model = "model_id" - } - - public init( - text: String, - voiceSettings: ElevenLabs.VoiceSettings, - model: ElevenLabs.Model - ) { - self.text = text - self.voiceSettings = voiceSettings - self.model = model - } - } - - public struct TextToSpeechInput: Codable, Hashable { - public let voiceId: String - public let requestBody: SpeechRequest - - public init(voiceId: String, requestBody: SpeechRequest) { - self.voiceId = voiceId - self.requestBody = requestBody - } - } - - public struct SpeechToSpeechInput: Codable, Hashable, HTTPRequest.Multipart.ContentConvertible, Equatable { - public let voiceId: String - public let audioURL: URL - public let model: ElevenLabs.Model - public let voiceSettings: ElevenLabs.VoiceSettings - - public init( - voiceId: String, - audioURL: URL, - model: ElevenLabs.Model, - voiceSettings: ElevenLabs.VoiceSettings - ) { - self.voiceId = voiceId - self.audioURL = audioURL - self.model = model - self.voiceSettings = voiceSettings - } - - public func __conversion() throws -> HTTPRequest.Multipart.Content { - var result = HTTPRequest.Multipart.Content() - - result.append( - .text( - named: "model_id", - value: model.rawValue - ) - ) - - let encoder = JSONEncoder() - encoder.keyEncodingStrategy = .convertToSnakeCase - if let voiceSettingsData = try? encoder.encode(voiceSettings), - let voiceSettingsString = String( - data: voiceSettingsData, - encoding: .utf8 - ) { - result.append( - .text( - named: "voice_settings", - value: voiceSettingsString - ) - ) - } - - if let fileData = try? Data(contentsOf: audioURL) { - result.append( - .file( - named: "audio", - data: fileData, - filename: audioURL.lastPathComponent, - contentType: .mpeg - ) - ) - } - - return result - } - } - - public struct AddVoiceInput: Codable, Hashable, HTTPRequest.Multipart.ContentConvertible, Equatable { - public let name: String - public let description: String - public let fileURL: URL - - public init( - name: String, - description: String, - fileURL: URL - ) { - self.name = name - self.description = description - self.fileURL = fileURL - } - - public func __conversion() throws -> HTTPRequest.Multipart.Content { - var result = HTTPRequest.Multipart.Content() - - result.append( - .text( - named: "name", - value: name - ) - ) - - result.append( - .text( - named: "description", - value: description - ) - ) - - if let fileData = try? Data(contentsOf: fileURL) { - result.append( - .file( - named: "files", - data: fileData, - filename: fileURL.lastPathComponent, - contentType: .wav - ) - ) - } - - return result - } - } - - public struct EditVoiceInput: Codable, Hashable, HTTPRequest.Multipart.ContentConvertible, Equatable { - public let voiceId: String - public let name: String - public let description: String? - public let fileURL: URL? - - public init( - voiceId: String, - name: String, - description: String? = nil, - fileURL: URL? = nil - ) { - self.voiceId = voiceId - self.name = name - self.description = description - self.fileURL = fileURL - } - - public func __conversion() throws -> HTTPRequest.Multipart.Content { - var result = HTTPRequest.Multipart.Content() - - result.append( - .text( - named: "name", - value: name - ) - ) - - if let description = description { - result.append( - .text( - named: "description", - value: description - ) - ) - } - - if let fileURL = fileURL, - let fileData = try? Data(contentsOf: fileURL) { - result.append( - .file( - named: "files", - data: fileData, - filename: fileURL.lastPathComponent, - contentType: .m4a - ) - ) - } - - return result - } - } - } -} - -// Client API Methods extension ElevenLabs.Client { public func availableVoices() async throws -> [ElevenLabs.Voice] { try await run(\.listVoices).voices From 4e412285c307c6ffc149b89a252b7a40dec0141b Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Mon, 18 Nov 2024 19:32:01 -0700 Subject: [PATCH 006/271] m4a --- .../API/ElevenLabs.APISpecification.RequestBodies.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/ElevenLabs/Intramodular/API/ElevenLabs.APISpecification.RequestBodies.swift b/Sources/ElevenLabs/Intramodular/API/ElevenLabs.APISpecification.RequestBodies.swift index 6acaeaa0..3404e48e 100644 --- a/Sources/ElevenLabs/Intramodular/API/ElevenLabs.APISpecification.RequestBodies.swift +++ b/Sources/ElevenLabs/Intramodular/API/ElevenLabs.APISpecification.RequestBodies.swift @@ -140,7 +140,7 @@ extension ElevenLabs.APISpecification { named: "files", data: fileData, filename: fileURL.lastPathComponent, - contentType: .wav + contentType: .m4a ) ) } From 335bcd35f7d14c0e8c2ff6751b4a7006aac68605 Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Wed, 20 Nov 2024 09:35:49 -0700 Subject: [PATCH 007/271] Inital --- .../Intramodular/API/PlayHT.Client.swift | 22 +++++++++++++++++++ .../Intramodular/API/PlayHT.Model.swift | 7 ++++++ Sources/PlayHT/Intramodular/API/PlayHT.swift | 12 ++++++++++ Sources/PlayHT/module.swift | 6 +++++ 4 files changed, 47 insertions(+) create mode 100644 Sources/PlayHT/Intramodular/API/PlayHT.Client.swift create mode 100644 Sources/PlayHT/Intramodular/API/PlayHT.Model.swift create mode 100644 Sources/PlayHT/Intramodular/API/PlayHT.swift create mode 100644 Sources/PlayHT/module.swift diff --git a/Sources/PlayHT/Intramodular/API/PlayHT.Client.swift b/Sources/PlayHT/Intramodular/API/PlayHT.Client.swift new file mode 100644 index 00000000..a6571657 --- /dev/null +++ b/Sources/PlayHT/Intramodular/API/PlayHT.Client.swift @@ -0,0 +1,22 @@ +// +// PlayHT.Client.swift +// AI +// +// Created by Jared Davidson on 11/20/24. +// + +import CorePersistence +import Diagnostics +import NetworkKit +import Foundation +import SwiftAPI +import Merge +import FoundationX +import Swallow + +extension PlayHT { + @RuntimeDiscoverable + public final class Client: SwiftAPI.Client, ObservableObject { + + } +} diff --git a/Sources/PlayHT/Intramodular/API/PlayHT.Model.swift b/Sources/PlayHT/Intramodular/API/PlayHT.Model.swift new file mode 100644 index 00000000..3f61f1e0 --- /dev/null +++ b/Sources/PlayHT/Intramodular/API/PlayHT.Model.swift @@ -0,0 +1,7 @@ +// +// PlayHT.Model.swift +// AI +// +// Created by Jared Davidson on 11/20/24. +// + diff --git a/Sources/PlayHT/Intramodular/API/PlayHT.swift b/Sources/PlayHT/Intramodular/API/PlayHT.swift new file mode 100644 index 00000000..19f94203 --- /dev/null +++ b/Sources/PlayHT/Intramodular/API/PlayHT.swift @@ -0,0 +1,12 @@ +// +// PlayHT.swift +// AI +// +// Created by Jared Davidson on 11/20/24. +// + +import Swift + +public enum PlayHT { + +} diff --git a/Sources/PlayHT/module.swift b/Sources/PlayHT/module.swift new file mode 100644 index 00000000..1fa9fa48 --- /dev/null +++ b/Sources/PlayHT/module.swift @@ -0,0 +1,6 @@ +// +// Copyright (c) Vatsal Manot +// + +@_exported import Swallow +@_exported import SwallowMacrosClient From 02bb57a63eda524ac3e0bc89b9d1e847da902e0c Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Wed, 20 Nov 2024 09:54:02 -0700 Subject: [PATCH 008/271] Initial runthrough --- ...layHT.APISpecification.RequestBodies.swift | 90 ++++++++++++++++ ...el.swift => PlayHT.APISpecification.swift} | 2 +- ...yHT.APISpeicification.ResponseBodies.swift | 27 +++++ .../Intramodular/API/PlayHT.Client.swift | 22 ---- .../PlayHT/Intramodular/PlayHT.Client.swift | 102 ++++++++++++++++++ .../PlayHT/Intramodular/PlayHT.Model.swift | 35 ++++++ .../Intramodular/{API => }/PlayHT.swift | 0 7 files changed, 255 insertions(+), 23 deletions(-) create mode 100644 Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.RequestBodies.swift rename Sources/PlayHT/Intramodular/API/{PlayHT.Model.swift => PlayHT.APISpecification.swift} (63%) create mode 100644 Sources/PlayHT/Intramodular/API/PlayHT.APISpeicification.ResponseBodies.swift delete mode 100644 Sources/PlayHT/Intramodular/API/PlayHT.Client.swift create mode 100644 Sources/PlayHT/Intramodular/PlayHT.Client.swift create mode 100644 Sources/PlayHT/Intramodular/PlayHT.Model.swift rename Sources/PlayHT/Intramodular/{API => }/PlayHT.swift (100%) diff --git a/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.RequestBodies.swift b/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.RequestBodies.swift new file mode 100644 index 00000000..f9c1f2ec --- /dev/null +++ b/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.RequestBodies.swift @@ -0,0 +1,90 @@ +// +// PlayHT.APISpecification.RequestBodies.swift +// AI +// +// Created by Jared Davidson on 11/20/24. +// + +import NetworkKit +import SwiftAPI +import Merge + +extension PlayHT.APISpecification { + enum RequestBodies { + public struct TextToSpeechInput: Codable, Hashable { + public let text: String + public let voiceId: String + public let quality: String + public let outputFormat: String + public let speed: Double? + public let sampleRate: Int? + + public init( + text: String, + voiceId: String, + quality: String = "medium", + outputFormat: String = "mp3", + speed: Double? = nil, + sampleRate: Int? = nil + ) { + self.text = text + self.voiceId = voiceId + self.quality = quality + self.outputFormat = outputFormat + self.speed = speed + self.sampleRate = sampleRate + } + } + + public struct CloneVoiceInput: Codable, Hashable, HTTPRequest.Multipart.ContentConvertible { + public let name: String + public let description: String? + public let fileURLs: [URL] + + public init( + name: String, + description: String? = nil, + fileURLs: [URL] + ) { + self.name = name + self.description = description + self.fileURLs = fileURLs + } + + public func __conversion() throws -> HTTPRequest.Multipart.Content { + var result = HTTPRequest.Multipart.Content() + + result.append( + .text( + named: "name", + value: name + ) + ) + + if let description = description { + result.append( + .text( + named: "description", + value: description + ) + ) + } + + for (index, fileURL) in fileURLs.enumerated() { + if let fileData = try? Data(contentsOf: fileURL) { + result.append( + .file( + named: "files[\(index)]", + data: fileData, + filename: fileURL.lastPathComponent, + contentType: .wav + ) + ) + } + } + + return result + } + } + } +} diff --git a/Sources/PlayHT/Intramodular/API/PlayHT.Model.swift b/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.swift similarity index 63% rename from Sources/PlayHT/Intramodular/API/PlayHT.Model.swift rename to Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.swift index 3f61f1e0..f48b54d0 100644 --- a/Sources/PlayHT/Intramodular/API/PlayHT.Model.swift +++ b/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.swift @@ -1,5 +1,5 @@ // -// PlayHT.Model.swift +// PlayHT.APISpecification.swift // AI // // Created by Jared Davidson on 11/20/24. diff --git a/Sources/PlayHT/Intramodular/API/PlayHT.APISpeicification.ResponseBodies.swift b/Sources/PlayHT/Intramodular/API/PlayHT.APISpeicification.ResponseBodies.swift new file mode 100644 index 00000000..d462768c --- /dev/null +++ b/Sources/PlayHT/Intramodular/API/PlayHT.APISpeicification.ResponseBodies.swift @@ -0,0 +1,27 @@ +// +// PlayHT.APISpeicification.ResponseBodies.swift +// AI +// +// Created by Jared Davidson on 11/20/24. +// + +import Foundation + +extension PlayHT.APISpecification { + public enum ResponseBodies { + public struct Voices: Codable { + public let voices: [PlayHT.Voice] + } + + public struct TextToSpeechOutput: Codable { + public let transcriptionId: String + public let audioUrl: String? + } + + public struct ClonedVoiceOutput: Codable { + public let id: String + public let name: String + public let status: String + } + } +} diff --git a/Sources/PlayHT/Intramodular/API/PlayHT.Client.swift b/Sources/PlayHT/Intramodular/API/PlayHT.Client.swift deleted file mode 100644 index a6571657..00000000 --- a/Sources/PlayHT/Intramodular/API/PlayHT.Client.swift +++ /dev/null @@ -1,22 +0,0 @@ -// -// PlayHT.Client.swift -// AI -// -// Created by Jared Davidson on 11/20/24. -// - -import CorePersistence -import Diagnostics -import NetworkKit -import Foundation -import SwiftAPI -import Merge -import FoundationX -import Swallow - -extension PlayHT { - @RuntimeDiscoverable - public final class Client: SwiftAPI.Client, ObservableObject { - - } -} diff --git a/Sources/PlayHT/Intramodular/PlayHT.Client.swift b/Sources/PlayHT/Intramodular/PlayHT.Client.swift new file mode 100644 index 00000000..fb9f6380 --- /dev/null +++ b/Sources/PlayHT/Intramodular/PlayHT.Client.swift @@ -0,0 +1,102 @@ +// +// PlayHT.Client.swift +// AI +// +// Created by Jared Davidson on 11/20/24. +// + +import CorePersistence +import LargeLanguageModels +import Merge +import NetworkKit +import Swallow + +extension PlayHT { + @RuntimeDiscoverable + public final class Client: SwiftAPI.Client, ObservableObject { + public typealias API = PlayHT.APISpecification + public typealias Session = HTTPSession + + public let interface: API + public let session: Session + public var sessionCache: EmptyKeyedCache + + public required init(configuration: API.Configuration) { + self.interface = API(configuration: configuration) + self.session = HTTPSession.shared + self.sessionCache = .init() + } + + public convenience init(apiKey: String?, userId: String?) { + self.init(configuration: .init(apiKey: apiKey, userId: userId)) + } + } +} + +extension PlayHT.Client { + public func availableVoices() async throws -> [PlayHT.Voice] { + try await run(\.listVoices).voices + } + + public func generateSpeech( + text: String, + voiceId: String, + quality: String = "medium", + outputFormat: String = "mp3", + speed: Double? = nil, + sampleRate: Int? = nil + ) async throws -> String? { + let input = PlayHT.APISpecification.RequestBodies.TextToSpeechInput( + text: text, + voiceId: voiceId, + quality: quality, + outputFormat: outputFormat, + speed: speed, + sampleRate: sampleRate + ) + + let response = try await run(\.textToSpeech, with: input) + return response.audioUrl + } + + public func streamSpeech( + text: String, + voiceId: String, + quality: String = "medium", + outputFormat: String = "mp3", + speed: Double? = nil, + sampleRate: Int? = nil + ) async throws -> Data { + let input = PlayHT.APISpecification.RequestBodies.TextToSpeechInput( + text: text, + voiceId: voiceId, + quality: quality, + outputFormat: outputFormat, + speed: speed, + sampleRate: sampleRate + ) + + return try await run(\.streamTextToSpeech, with: input) + } + + public func cloneVoice( + name: String, + description: String? = nil, + fileURLs: [URL] + ) async throws -> (id: String, name: String, status: String) { + let input = PlayHT.APISpecification.RequestBodies.CloneVoiceInput( + name: name, + description: description, + fileURLs: fileURLs + ) + + let response = try await run(\.cloneVoice, with: input) + return (response.id, response.name, response.status) + } + + public func deleteClonedVoice( + id: String + ) async throws { + try await run(\.deleteClonedVoice, with: id) + } +} diff --git a/Sources/PlayHT/Intramodular/PlayHT.Model.swift b/Sources/PlayHT/Intramodular/PlayHT.Model.swift new file mode 100644 index 00000000..83e615c8 --- /dev/null +++ b/Sources/PlayHT/Intramodular/PlayHT.Model.swift @@ -0,0 +1,35 @@ +// +// PlayHT.Model.swift +// AI +// +// Created by Jared Davidson on 11/20/24. +// + +import CoreMI +import CorePersistence +import Foundation +import Swift + +extension PlayHT { + public struct Voice: Codable, Hashable, Identifiable { + public let id: String + public let name: String + public let category: String? + public let language: String + public let gender: String? + public let isCloned: Bool + public let isPreview: Bool + public let previewUrl: String? + + enum CodingKeys: String, CodingKey { + case id + case name + case category + case language + case gender + case isCloned = "cloned" + case isPreview = "preview" + case previewUrl + } + } +} diff --git a/Sources/PlayHT/Intramodular/API/PlayHT.swift b/Sources/PlayHT/Intramodular/PlayHT.swift similarity index 100% rename from Sources/PlayHT/Intramodular/API/PlayHT.swift rename to Sources/PlayHT/Intramodular/PlayHT.swift From 0c8bc0219410aa2950373ce158298bc660697429 Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Wed, 20 Nov 2024 10:09:17 -0700 Subject: [PATCH 009/271] MIService --- .../ModelIdentifier.Provider.swift | 187 +++++++++--------- .../Service/_MIServiceTypeIdentifier.swift | 1 + .../PlayHT/Intramodular/PlayHT.Client.swift | 19 ++ 3 files changed, 119 insertions(+), 88 deletions(-) diff --git a/Sources/CoreMI/Intramodular/Model Identifier/ModelIdentifier.Provider.swift b/Sources/CoreMI/Intramodular/Model Identifier/ModelIdentifier.Provider.swift index fbdc91cc..6917b038 100644 --- a/Sources/CoreMI/Intramodular/Model Identifier/ModelIdentifier.Provider.swift +++ b/Sources/CoreMI/Intramodular/Model Identifier/ModelIdentifier.Provider.swift @@ -24,6 +24,7 @@ extension ModelIdentifier { case _Cohere case _ElevenLabs case _TogetherAI + case _PlayHT case unknown(String) @@ -74,6 +75,10 @@ extension ModelIdentifier { public static var togetherAI: Self { Self._TogetherAI } + + public static var playHT: Self { + Self._PlayHT + } } } @@ -82,36 +87,38 @@ extension ModelIdentifier { extension ModelIdentifier.Provider: CustomStringConvertible { public var description: String { switch self { - case ._Anthropic: - return "Anthropic" - case ._Apple: - return "Apple" - case ._Fal: - return "Fal" - case ._Mistral: - return "Mistral" - case ._Groq: - return "Groq" - case ._Ollama: - return "Ollama" - case ._OpenAI: - return "OpenAI" - case ._Gemini: - return "Gemini" - case ._Perplexity: - return "Perplexity" - case ._Jina: - return "Perplexity" - case ._VoyageAI: - return "VoyageAI" - case ._Cohere: - return "Cohere" - case ._ElevenLabs: - return "ElevenLabs" - case ._TogetherAI: - return "TogetherAI" - case .unknown(let provider): - return provider + case ._Anthropic: + return "Anthropic" + case ._Apple: + return "Apple" + case ._Fal: + return "Fal" + case ._Mistral: + return "Mistral" + case ._Groq: + return "Groq" + case ._Ollama: + return "Ollama" + case ._OpenAI: + return "OpenAI" + case ._Gemini: + return "Gemini" + case ._Perplexity: + return "Perplexity" + case ._Jina: + return "Perplexity" + case ._VoyageAI: + return "VoyageAI" + case ._Cohere: + return "Cohere" + case ._ElevenLabs: + return "ElevenLabs" + case ._TogetherAI: + return "TogetherAI" + case ._PlayHT: + return "PlayHT" + case .unknown(let provider): + return provider } } } @@ -119,69 +126,73 @@ extension ModelIdentifier.Provider: CustomStringConvertible { extension ModelIdentifier.Provider: RawRepresentable { public var rawValue: String { switch self { - case ._Anthropic: - return "anthropic" - case ._Apple: - return "apple" - case ._Fal: - return "fal" - case ._Mistral: - return "mistral" - case ._Groq: - return "groq" - case ._Ollama: - return "ollama" - case ._OpenAI: - return "openai" - case ._Gemini: - return "gemini" - case ._Perplexity: - return "perplexity" - case ._Jina: - return "jina" - case ._VoyageAI: - return "voyageai" - case ._Cohere: - return "cohere" - case ._ElevenLabs: - return "elevenlabs" - case ._TogetherAI: - return "togetherai" - case .unknown(let provider): - return provider + case ._Anthropic: + return "anthropic" + case ._Apple: + return "apple" + case ._Fal: + return "fal" + case ._Mistral: + return "mistral" + case ._Groq: + return "groq" + case ._Ollama: + return "ollama" + case ._OpenAI: + return "openai" + case ._Gemini: + return "gemini" + case ._Perplexity: + return "perplexity" + case ._Jina: + return "jina" + case ._VoyageAI: + return "voyageai" + case ._Cohere: + return "cohere" + case ._ElevenLabs: + return "elevenlabs" + case ._TogetherAI: + return "togetherai" + case ._PlayHT: + return "playht" + case .unknown(let provider): + return provider } } public init(rawValue: String) { switch rawValue { - case Self._Anthropic.rawValue: - self = ._Anthropic - case Self._Apple.rawValue: - self = ._Apple - case Self._Fal.rawValue: - self = ._Fal - case Self._Mistral.rawValue: - self = ._Mistral - case Self._Groq.rawValue: - self = ._Groq - case Self._OpenAI.rawValue: - self = ._OpenAI - case Self._Gemini.rawValue: - self = ._Gemini - case Self._Perplexity.rawValue: - self = ._Perplexity - case Self._Jina.rawValue: - self = ._Jina - case Self._VoyageAI.rawValue: - self = ._VoyageAI - case Self._Cohere.rawValue: - self = ._Cohere - case Self._ElevenLabs.rawValue: - self = ._ElevenLabs - case Self._TogetherAI.rawValue: - self = ._TogetherAI - default: - self = .unknown(rawValue) + case Self._Anthropic.rawValue: + self = ._Anthropic + case Self._Apple.rawValue: + self = ._Apple + case Self._Fal.rawValue: + self = ._Fal + case Self._Mistral.rawValue: + self = ._Mistral + case Self._Groq.rawValue: + self = ._Groq + case Self._OpenAI.rawValue: + self = ._OpenAI + case Self._Gemini.rawValue: + self = ._Gemini + case Self._Perplexity.rawValue: + self = ._Perplexity + case Self._Jina.rawValue: + self = ._Jina + case Self._VoyageAI.rawValue: + self = ._VoyageAI + case Self._Cohere.rawValue: + self = ._Cohere + case Self._ElevenLabs.rawValue: + self = ._ElevenLabs + case Self._TogetherAI.rawValue: + self = ._TogetherAI + case Self._PlayHT.rawValue: + self = ._PlayHT + default: + self = .unknown(rawValue) } } } diff --git a/Sources/CoreMI/Intramodular/Service/_MIServiceTypeIdentifier.swift b/Sources/CoreMI/Intramodular/Service/_MIServiceTypeIdentifier.swift index 00fe0f99..e7ffab25 100644 --- a/Sources/CoreMI/Intramodular/Service/_MIServiceTypeIdentifier.swift +++ b/Sources/CoreMI/Intramodular/Service/_MIServiceTypeIdentifier.swift @@ -38,4 +38,5 @@ extension _MIServiceTypeIdentifier { public static let _VoyageAI = _MIServiceTypeIdentifier(rawValue: "hajat-fufoh-janaf-disam") public static let _Cohere = _MIServiceTypeIdentifier(rawValue: "guzob-fipin-navij-duvon") public static let _TogetherAI = _MIServiceTypeIdentifier(rawValue: "pafob-vopoj-lurig-zilur") + public static let _PlayHT = _MIServiceTypeIdentifier(rawValue: "foluv-jufuk-zuhok-hofid") } diff --git a/Sources/PlayHT/Intramodular/PlayHT.Client.swift b/Sources/PlayHT/Intramodular/PlayHT.Client.swift index fb9f6380..73e2fe37 100644 --- a/Sources/PlayHT/Intramodular/PlayHT.Client.swift +++ b/Sources/PlayHT/Intramodular/PlayHT.Client.swift @@ -33,6 +33,25 @@ extension PlayHT { } } +extension PlayHT.Client: _MIService { + public convenience init( + account: (any _MIServiceAccount)? + ) async throws { + let account: any _MIServiceAccount = try account.unwrap() + let serviceIdentifier: _MIServiceTypeIdentifier = account.serviceIdentifier + + guard serviceIdentifier == _MIServiceTypeIdentifier._PlayHT else { + throw _MIServiceError.serviceTypeIncompatible(serviceIdentifier) + } + + guard let credential = account.credential as? _MIServiceAPIKeyCredential else { + throw _MIServiceError.invalidCredentials(account.credential) + } + + self.init(apiKey: credential.apiKey) + } +} + extension PlayHT.Client { public func availableVoices() async throws -> [PlayHT.Voice] { try await run(\.listVoices).voices From 665b898a909a8e6c6227088bc72a90be49c0f5c9 Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Wed, 20 Nov 2024 11:25:04 -0700 Subject: [PATCH 010/271] Updates & Tests --- Package.swift | 27 ++++ ...layHT.APISpecification.RequestBodies.swift | 92 ++++++----- .../API/PlayHT.APISpecification.swift | 148 ++++++++++++++++++ .../Models/PlayHT.OutputSettings.swift | 28 ++++ .../Intramodular/Models/PlayHT.Voice.swift | 74 +++++++++ .../Models/PlayHT.VoiceSettings.swift | 30 ++++ .../PlayHT/Intramodular/PlayHT.Client.swift | 90 ++++++----- .../PlayHT/Intramodular/PlayHT.Model.swift | 57 ++++--- Tests/PlayHT/Intramodular/SpeechTests.swift | 74 +++++++++ Tests/PlayHT/module.swift | 15 ++ 10 files changed, 544 insertions(+), 91 deletions(-) create mode 100644 Sources/PlayHT/Intramodular/Models/PlayHT.OutputSettings.swift create mode 100644 Sources/PlayHT/Intramodular/Models/PlayHT.Voice.swift create mode 100644 Sources/PlayHT/Intramodular/Models/PlayHT.VoiceSettings.swift create mode 100644 Tests/PlayHT/Intramodular/SpeechTests.swift create mode 100644 Tests/PlayHT/module.swift diff --git a/Package.swift b/Package.swift index e4abb826..6c3f83ab 100644 --- a/Package.swift +++ b/Package.swift @@ -105,6 +105,21 @@ let package = Package( .enableExperimentalFeature("AccessLevelOnImport") ] ), + .target( + name: "PlayHT", + dependencies: [ + "CorePersistence", + "CoreMI", + "LargeLanguageModels", + "Merge", + "NetworkKit", + "Swallow" + ], + path: "Sources/PlayHT", + swiftSettings: [ + .enableExperimentalFeature("AccessLevelOnImport") + ] + ), .target( name: "_Gemini", dependencies: [ @@ -278,6 +293,7 @@ let package = Package( "Ollama", "OpenAI", "Perplexity", + "PlayHT", "Swallow", "Jina", "VoyageAI", @@ -367,6 +383,17 @@ let package = Package( .enableExperimentalFeature("AccessLevelOnImport") ] ), + .testTarget( + name: "PlayHTTests", + dependencies: [ + "AI", + "Swallow" + ], + path: "Tests/PlayHT", + swiftSettings: [ + .enableExperimentalFeature("AccessLevelOnImport") + ] + ), .testTarget( name: "JinaTests", dependencies: [ diff --git a/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.RequestBodies.swift b/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.RequestBodies.swift index f9c1f2ec..c568651d 100644 --- a/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.RequestBodies.swift +++ b/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.RequestBodies.swift @@ -13,42 +13,73 @@ extension PlayHT.APISpecification { enum RequestBodies { public struct TextToSpeechInput: Codable, Hashable { public let text: String - public let voiceId: String + public let voice: String + public let voiceEngine: PlayHT.Model public let quality: String public let outputFormat: String public let speed: Double? public let sampleRate: Int? + public let seed: Int? + public let temperature: Double? + public let emotion: String? + public let voiceGuidance: Double? + public let styleGuidance: Double? + public let textGuidance: Double? + public let language: String? + + private enum CodingKeys: String, CodingKey { + case text, voice, quality + case voiceEngine = "voice_engine" + case outputFormat = "output_format" + case speed + case sampleRate = "sample_rate" + case seed, temperature, emotion + case voiceGuidance = "voice_guidance" + case styleGuidance = "style_guidance" + case textGuidance = "text_guidance" + case language + } public init( text: String, - voiceId: String, + voice: String, + voiceEngine: PlayHT.Model = .play3Mini, quality: String = "medium", outputFormat: String = "mp3", speed: Double? = nil, - sampleRate: Int? = nil + sampleRate: Int? = 48000, + seed: Int? = nil, + temperature: Double? = nil, + emotion: String? = nil, + voiceGuidance: Double? = nil, + styleGuidance: Double? = nil, + textGuidance: Double? = nil, + language: String? = nil ) { self.text = text - self.voiceId = voiceId + self.voice = voice + self.voiceEngine = voiceEngine self.quality = quality self.outputFormat = outputFormat self.speed = speed self.sampleRate = sampleRate + self.seed = seed + self.temperature = temperature + self.emotion = emotion + self.voiceGuidance = voiceGuidance + self.styleGuidance = styleGuidance + self.textGuidance = textGuidance + self.language = language } } - public struct CloneVoiceInput: Codable, Hashable, HTTPRequest.Multipart.ContentConvertible { - public let name: String - public let description: String? - public let fileURLs: [URL] + public struct InstantCloneVoiceInput: Codable, Hashable, HTTPRequest.Multipart.ContentConvertible { + public let sampleFileURL: String + public let voiceName: String - public init( - name: String, - description: String? = nil, - fileURLs: [URL] - ) { - self.name = name - self.description = description - self.fileURLs = fileURLs + public init(sampleFileURL: String, voiceName: String) { + self.sampleFileURL = sampleFileURL + self.voiceName = voiceName } public func __conversion() throws -> HTTPRequest.Multipart.Content { @@ -56,32 +87,17 @@ extension PlayHT.APISpecification { result.append( .text( - named: "name", - value: name + named: "sample_file_url", + value: sampleFileURL ) ) - if let description = description { - result.append( - .text( - named: "description", - value: description - ) + result.append( + .text( + named: "voice_name", + value: voiceName ) - } - - for (index, fileURL) in fileURLs.enumerated() { - if let fileData = try? Data(contentsOf: fileURL) { - result.append( - .file( - named: "files[\(index)]", - data: fileData, - filename: fileURL.lastPathComponent, - contentType: .wav - ) - ) - } - } + ) return result } diff --git a/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.swift b/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.swift index f48b54d0..dddaa30d 100644 --- a/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.swift +++ b/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.swift @@ -5,3 +5,151 @@ // Created by Jared Davidson on 11/20/24. // +import CorePersistence +import Diagnostics +import NetworkKit +import Swift +import SwiftAPI + +extension PlayHT { + public enum APIError: APIErrorProtocol { + public typealias API = PlayHT.APISpecification + + case apiKeyMissing + case userIdMissing + case incorrectAPIKeyProvided + case rateLimitExceeded + case invalidContentType + case badRequest(request: API.Request?, error: API.Request.Error) + case unknown(message: String) + case runtime(AnyError) + + public var traits: ErrorTraits { + [.domain(.networking)] + } + } + + public struct APISpecification: RESTAPISpecification { + public typealias Error = APIError + + public struct Configuration: Codable, Hashable { + public var host: URL + public var apiKey: String? + public var userId: String? + + public init( + host: URL = URL(string: "https://api.play.ht/api/v2")!, + apiKey: String? = nil, + userId: String? = nil + ) { + self.host = host + self.apiKey = apiKey + self.userId = userId + } + } + + public let configuration: Configuration + + public var host: URL { + configuration.host + } + + public var id: some Hashable { + configuration + } + + public init(configuration: Configuration) { + self.configuration = configuration + } + + // Voices endpoints + @GET + @Path("/voices") + var listVoices = Endpoint() + + // Text to speech + @POST + @Path("/tts") + @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) + var textToSpeech = Endpoint() + + // Stream text to speech + @POST + @Path("/tts/stream") + @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) + var streamTextToSpeech = Endpoint() + + // Clone Voice + @POST + @Path("/cloned-voices") + var listClonedVoices = Endpoint() + + @POST + @Path("/cloned-voices/instant") + @Body(multipart: .input) + var instantCloneVoice = Endpoint() + + // Delete cloned voice + @DELETE + @Path({ context -> String in + "/cloned-voices/\(context.input)" + }) + var deleteClonedVoice = Endpoint() + } +} + +extension PlayHT.APISpecification { + public final class Endpoint: BaseHTTPEndpoint { + override public func buildRequestBase( + from input: Input, + context: BuildRequestContext + ) throws -> Request { + var request = try super.buildRequestBase( + from: input, + context: context + ) + + request = request + .header("x-api-key", context.root.configuration.apiKey) + .header("accept", "application/json") + .header("AUTHORIZATION", context.root.configuration.userId) + .header(.contentType(.json)) + + return request + } + + override public func decodeOutputBase( + from response: Request.Response, + context: DecodeOutputContext + ) throws -> Output { + do { + try response.validate() + } catch { + let apiError: Error + + if let error = error as? HTTPRequest.Error { + if response.statusCode.rawValue == 401 { + apiError = .incorrectAPIKeyProvided + } else if response.statusCode.rawValue == 429 { + apiError = .rateLimitExceeded + } else { + apiError = .badRequest(error) + } + } else { + apiError = .runtime(error) + } + + throw apiError + } + + if Output.self == Data.self { + return response.data as! Output + } + + return try response.decode( + Output.self, + keyDecodingStrategy: .convertFromSnakeCase + ) + } + } +} diff --git a/Sources/PlayHT/Intramodular/Models/PlayHT.OutputSettings.swift b/Sources/PlayHT/Intramodular/Models/PlayHT.OutputSettings.swift new file mode 100644 index 00000000..88b520c6 --- /dev/null +++ b/Sources/PlayHT/Intramodular/Models/PlayHT.OutputSettings.swift @@ -0,0 +1,28 @@ +// +// PlayHT.OutputSettings.swift +// AI +// +// Created by Jared Davidson on 11/20/24. +// + +import Swift + +extension PlayHT { + public struct OutputSettings: Codable, Hashable { + public let quality: Quality + public let format: OutputFormat + public let sampleRate: Int + + public init( + quality: Quality = .medium, + format: OutputFormat = .mp3, + sampleRate: Int = 48000 + ) { + self.quality = quality + self.format = format + self.sampleRate = sampleRate + } + + public static let `default` = OutputSettings() + } +} diff --git a/Sources/PlayHT/Intramodular/Models/PlayHT.Voice.swift b/Sources/PlayHT/Intramodular/Models/PlayHT.Voice.swift new file mode 100644 index 00000000..6fc6c91f --- /dev/null +++ b/Sources/PlayHT/Intramodular/Models/PlayHT.Voice.swift @@ -0,0 +1,74 @@ +// +// PlayHT.Voice.swift +// AI +// +// Created by Jared Davidson on 11/20/24. +// + +import Foundation +import ElevenLabs + +extension PlayHT { + public struct Voice: Codable, Hashable, Identifiable { + public typealias ID = _TypeAssociatedID + + public let id: ID + public let name: String + public let language: String + public let voiceEngine: Model + public let isCloned: Bool + public let gender: String? + public let accent: String? + public let age: String? + public let style: String? + public let useCase: String? + + private enum CodingKeys: String, CodingKey { + case id, name, language, gender, accent, age, style + case voiceEngine = "voice_engine" + case isCloned = "cloned" + case useCase = "use_case" + } + } + + public enum Quality: String, Codable { + case draft = "draft" + case low = "low" + case medium = "medium" + case high = "high" + case premium = "premium" + } + + public enum OutputFormat: String, Codable { + case mp3 = "mp3" + case wav = "wav" + case ogg = "ogg" + case mulaw = "mulaw" + case flac = "flac" + } +} + +#warning("This is only a temporary fix. Remove these & replace with Abstract (@jared)") + +extension PlayHT.Voice { + public func toElevenLabsVoice() -> ElevenLabs.Voice { + ElevenLabs.Voice( + voiceID: id.rawValue, + name: name, + description: style, + isOwner: isCloned + ) + } +} + +extension PlayHT.VoiceSettings { + public static func fromElevenLabs(_ settings: ElevenLabs.VoiceSettings) -> Self { + PlayHT.VoiceSettings( + speed: 1.0, + temperature: settings.stability, + voiceGuidance: settings.similarityBoost * 6.0, + styleGuidance: settings.styleExaggeration * 30.0, + textGuidance: 1.0 + settings.similarityBoost + ) + } +} diff --git a/Sources/PlayHT/Intramodular/Models/PlayHT.VoiceSettings.swift b/Sources/PlayHT/Intramodular/Models/PlayHT.VoiceSettings.swift new file mode 100644 index 00000000..ea90cdeb --- /dev/null +++ b/Sources/PlayHT/Intramodular/Models/PlayHT.VoiceSettings.swift @@ -0,0 +1,30 @@ +// +// PlayHT.VoiceSettings.swift +// AI +// +// Created by Jared Davidson on 11/20/24. +// + +extension PlayHT { + public struct VoiceSettings: Codable, Hashable { + public var speed: Double + public var temperature: Double + public var voiceGuidance: Double + public var styleGuidance: Double + public var textGuidance: Double + + public init( + speed: Double = 1.0, + temperature: Double = 1.0, + voiceGuidance: Double = 3.0, + styleGuidance: Double = 15.0, + textGuidance: Double = 1.5 + ) { + self.speed = max(0.1, min(5.0, speed)) + self.temperature = max(0, min(2.0, temperature)) + self.voiceGuidance = max(1, min(6.0, voiceGuidance)) + self.styleGuidance = max(1, min(30.0, styleGuidance)) + self.textGuidance = max(1, min(2.0, textGuidance)) + } + } +} diff --git a/Sources/PlayHT/Intramodular/PlayHT.Client.swift b/Sources/PlayHT/Intramodular/PlayHT.Client.swift index 73e2fe37..1ee76dc5 100644 --- a/Sources/PlayHT/Intramodular/PlayHT.Client.swift +++ b/Sources/PlayHT/Intramodular/PlayHT.Client.swift @@ -14,6 +14,10 @@ import Swallow extension PlayHT { @RuntimeDiscoverable public final class Client: SwiftAPI.Client, ObservableObject { + public static var persistentTypeRepresentation: some IdentityRepresentation { + _MIServiceTypeIdentifier._PlayHT + } + public typealias API = PlayHT.APISpecification public typealias Session = HTTPSession @@ -27,8 +31,8 @@ extension PlayHT { self.sessionCache = .init() } - public convenience init(apiKey: String?, userId: String?) { - self.init(configuration: .init(apiKey: apiKey, userId: userId)) + public convenience init(apiKey: String) { + self.init(configuration: .init(apiKey: apiKey)) } } } @@ -57,21 +61,29 @@ extension PlayHT.Client { try await run(\.listVoices).voices } + public func clonedVoices() async throws -> [PlayHT.Voice] { + try await run(\.listClonedVoices).voices + } + public func generateSpeech( text: String, - voiceId: String, - quality: String = "medium", - outputFormat: String = "mp3", - speed: Double? = nil, - sampleRate: Int? = nil + voice: PlayHT.Voice, + settings: PlayHT.VoiceSettings, + outputSettings: PlayHT.OutputSettings = .default ) async throws -> String? { let input = PlayHT.APISpecification.RequestBodies.TextToSpeechInput( text: text, - voiceId: voiceId, - quality: quality, - outputFormat: outputFormat, - speed: speed, - sampleRate: sampleRate + voice: voice.id.rawValue, + voiceEngine: voice.voiceEngine, + quality: outputSettings.quality.rawValue, + outputFormat: outputSettings.format.rawValue, + speed: settings.speed, + sampleRate: outputSettings.sampleRate, + temperature: settings.temperature, + voiceGuidance: settings.voiceGuidance, + styleGuidance: settings.styleGuidance, + textGuidance: settings.textGuidance, + language: voice.language ) let response = try await run(\.textToSpeech, with: input) @@ -80,42 +92,50 @@ extension PlayHT.Client { public func streamSpeech( text: String, - voiceId: String, - quality: String = "medium", - outputFormat: String = "mp3", - speed: Double? = nil, - sampleRate: Int? = nil + voice: PlayHT.Voice, + settings: PlayHT.VoiceSettings, + outputSettings: PlayHT.OutputSettings = .default ) async throws -> Data { let input = PlayHT.APISpecification.RequestBodies.TextToSpeechInput( text: text, - voiceId: voiceId, - quality: quality, - outputFormat: outputFormat, - speed: speed, - sampleRate: sampleRate + voice: voice.id.rawValue, + voiceEngine: voice.voiceEngine, + quality: outputSettings.quality.rawValue, + outputFormat: outputSettings.format.rawValue, + speed: settings.speed, + sampleRate: outputSettings.sampleRate, + temperature: settings.temperature, + voiceGuidance: settings.voiceGuidance, + styleGuidance: settings.styleGuidance, + textGuidance: settings.textGuidance, + language: voice.language ) return try await run(\.streamTextToSpeech, with: input) } - public func cloneVoice( - name: String, - description: String? = nil, - fileURLs: [URL] - ) async throws -> (id: String, name: String, status: String) { - let input = PlayHT.APISpecification.RequestBodies.CloneVoiceInput( - name: name, - description: description, - fileURLs: fileURLs + public func instantCloneVoice( + sampleFileURL: String, + name: String + ) async throws -> PlayHT.Voice.ID { + let input = PlayHT.APISpecification.RequestBodies.InstantCloneVoiceInput( + sampleFileURL: sampleFileURL, + voiceName: name ) - let response = try await run(\.cloneVoice, with: input) - return (response.id, response.name, response.status) + let response = try await run(\.instantCloneVoice, with: input) + return .init(rawValue: response.id) } public func deleteClonedVoice( - id: String + voice: PlayHT.Voice.ID ) async throws { - try await run(\.deleteClonedVoice, with: id) + try await run(\.deleteClonedVoice, with: voice.rawValue) + } + + private func findVoice(id: String) async throws -> PlayHT.Voice? { + let allVoices = try await availableVoices() + let clonedVoices = try await clonedVoices() + return (allVoices + clonedVoices).first { $0.id.rawValue == id } } } diff --git a/Sources/PlayHT/Intramodular/PlayHT.Model.swift b/Sources/PlayHT/Intramodular/PlayHT.Model.swift index 83e615c8..560f7643 100644 --- a/Sources/PlayHT/Intramodular/PlayHT.Model.swift +++ b/Sources/PlayHT/Intramodular/PlayHT.Model.swift @@ -11,25 +11,46 @@ import Foundation import Swift extension PlayHT { - public struct Voice: Codable, Hashable, Identifiable { - public let id: String - public let name: String - public let category: String? - public let language: String - public let gender: String? - public let isCloned: Bool - public let isPreview: Bool - public let previewUrl: String? + public enum Model: String, Codable, Sendable { + /// Latest speech model optimized for realtime use. Features include: + /// - Multilingual support (36 languages) + /// - Reduced hallucinations + /// - <200ms streaming latency + /// - 48kHz sampling + /// - 20k character limit per stream + case play3Mini = "Play3.0-mini" - enum CodingKeys: String, CodingKey { - case id - case name - case category - case language - case gender - case isCloned = "cloned" - case isPreview = "preview" - case previewUrl + /// Legacy voice model with basic TTS capabilities + case playHT2Turbo = "PlayHT2.0-turbo" + } +} + +// MARK: - Conformances + +extension PlayHT.Model: CustomStringConvertible { + public var description: String { + rawValue + } +} + +extension PlayHT.Model: ModelIdentifierRepresentable { + public init(from identifier: ModelIdentifier) throws { + guard identifier.provider == ._PlayHT, identifier.revision == nil else { + throw Never.Reason.illegal + } + + guard let model = Self(rawValue: identifier.name) else { + throw Never.Reason.unexpected } + + self = model + } + + public func __conversion() -> ModelIdentifier { + ModelIdentifier( + provider: ._PlayHT, + name: rawValue, + revision: nil + ) } } diff --git a/Tests/PlayHT/Intramodular/SpeechTests.swift b/Tests/PlayHT/Intramodular/SpeechTests.swift new file mode 100644 index 00000000..e4b58291 --- /dev/null +++ b/Tests/PlayHT/Intramodular/SpeechTests.swift @@ -0,0 +1,74 @@ +// +// SpeechTests.swift +// AI +// +// Created by Jared Davidson on 11/20/24. +// + +import PlayHT +import XCTest + +final class PlayHTTests: XCTestCase { + + let sampleText = "In a quiet, unassuming village nestled deep in a lush, verdant valley, young Elara leads a simple life, dreaming of adventure beyond the horizon. Her village is filled with ancient folklore and tales of mystical relics, but none capture her imagination like the legend of the Enchanted Amuletβ€”a powerful artifact said to grant its bearer the ability to control time." + + func testListVoices() async throws { + let voices = try await client.availableVoices() + XCTAssertFalse(voices.isEmpty) + } + + func testCreateSpeech() async throws { + let voices = try await client.availableVoices() + let voice = try XCTUnwrap(voices.first) + + let voiceSettings = PlayHT.VoiceSettings( + speed: 1.0, + temperature: 0.7, + voiceGuidance: 3.0, + styleGuidance: 15.0, + textGuidance: 1.5 + ) + + let outputSettings = PlayHT.OutputSettings( + quality: .high, + format: .mp3, + sampleRate: 48000 + ) + + let audioURL = try await client.generateSpeech( + text: sampleText, + voice: voice, + settings: voiceSettings, + outputSettings: outputSettings + ) + + XCTAssertNotNil(audioURL) + } + + func testStreamSpeech() async throws { + let voices = try await client.availableVoices() + let voice = try XCTUnwrap(voices.first) + + let voiceSettings = PlayHT.VoiceSettings() + let outputSettings = PlayHT.OutputSettings() + + let data = try await client.streamSpeech( + text: sampleText, + voice: voice, + settings: voiceSettings, + outputSettings: outputSettings + ) + + XCTAssertFalse(data.isEmpty) + } + + func testInstantCloneVoice() async throws { + let sampleURL = "https://example.com/sample.mp3" + let voiceID = try await client.instantCloneVoice( + sampleFileURL: sampleURL, + name: "Test Clone" + ) + + XCTAssertNotNil(voiceID) + } +} diff --git a/Tests/PlayHT/module.swift b/Tests/PlayHT/module.swift new file mode 100644 index 00000000..c217577d --- /dev/null +++ b/Tests/PlayHT/module.swift @@ -0,0 +1,15 @@ +// +// Copyright (c) Vatsal Manot +// + +import ElevenLabs + +public var PLAYHT_API_KEY: String { + "0dea648f8b5c9497b647902ae00e6903" +} + +public var client: PlayHT.Client { + let client = PlayHT.Client(apiKey: PLAYHT_API_KEY) + + return client +} From 8c232591d1ec7eb293e909042d3527132f095103 Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Wed, 20 Nov 2024 14:08:42 -0700 Subject: [PATCH 011/271] Updated models and endpoints --- .../Service/_MIServiceCredential.swift | 18 +++++ ...layHT.APISpecification.RequestBodies.swift | 71 ++++++++++--------- .../API/PlayHT.APISpecification.swift | 16 +++-- ...yHT.APISpeicification.ResponseBodies.swift | 56 ++++++++++++++- .../Intramodular/Models/PlayHT.Voice.swift | 63 ++++++++-------- .../PlayHT/Intramodular/PlayHT.Client.swift | 59 ++++++--------- .../PlayHT/Intramodular/PlayHT.Model.swift | 3 + 7 files changed, 171 insertions(+), 115 deletions(-) diff --git a/Sources/CoreMI/Intramodular/Service/_MIServiceCredential.swift b/Sources/CoreMI/Intramodular/Service/_MIServiceCredential.swift index bbb2ae3a..8873349c 100644 --- a/Sources/CoreMI/Intramodular/Service/_MIServiceCredential.swift +++ b/Sources/CoreMI/Intramodular/Service/_MIServiceCredential.swift @@ -7,6 +7,7 @@ import Swift public enum _MIServiceCredentialType: String, PersistentIdentifier { case apiKey = "apiKey" + case userIDAndAPIKey = "userIDAndAPIKey" } public protocol _MIServiceCredential: Codable, Hashable, Sendable { @@ -24,3 +25,20 @@ public struct _MIServiceAPIKeyCredential: _MIServiceCredential { self.apiKey = apiKey } } + +public struct _MIServiceUserIDAndAPIKeyCredential: _MIServiceCredential { + public var credentialType: _MIServiceCredentialType { + _MIServiceCredentialType.userIDAndAPIKey + } + + public let userID: String + public let apiKey: String + + public init( + userID: String, + apiKey: String + ) { + self.userID = userID + self.apiKey = apiKey + } +} diff --git a/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.RequestBodies.swift b/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.RequestBodies.swift index c568651d..11bf53a3 100644 --- a/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.RequestBodies.swift +++ b/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.RequestBodies.swift @@ -17,27 +17,28 @@ extension PlayHT.APISpecification { public let voiceEngine: PlayHT.Model public let quality: String public let outputFormat: String - public let speed: Double? - public let sampleRate: Int? - public let seed: Int? - public let temperature: Double? - public let emotion: String? - public let voiceGuidance: Double? - public let styleGuidance: Double? - public let textGuidance: Double? - public let language: String? +// public let speed: Double? +// public let sampleRate: Int? +// public let seed: Int? +// public let temperature: Double? +// public let emotion: String? +// public let voiceGuidance: Double? +// public let styleGuidance: Double? +// public let textGuidance: Double? +// public let language: String? +// private enum CodingKeys: String, CodingKey { case text, voice, quality case voiceEngine = "voice_engine" case outputFormat = "output_format" - case speed - case sampleRate = "sample_rate" - case seed, temperature, emotion - case voiceGuidance = "voice_guidance" - case styleGuidance = "style_guidance" - case textGuidance = "text_guidance" - case language +// case speed +// case sampleRate = "sample_rate" +// case seed, temperature, emotion +// case voiceGuidance = "voice_guidance" +// case styleGuidance = "style_guidance" +// case textGuidance = "text_guidance" +// case language } public init( @@ -45,31 +46,31 @@ extension PlayHT.APISpecification { voice: String, voiceEngine: PlayHT.Model = .play3Mini, quality: String = "medium", - outputFormat: String = "mp3", - speed: Double? = nil, - sampleRate: Int? = 48000, - seed: Int? = nil, - temperature: Double? = nil, - emotion: String? = nil, - voiceGuidance: Double? = nil, - styleGuidance: Double? = nil, - textGuidance: Double? = nil, - language: String? = nil + outputFormat: String = "mp3" +// speed: Double? = nil, +// sampleRate: Int? = 48000, +// seed: Int? = nil, +// temperature: Double? = nil, +// emotion: String? = nil, +// voiceGuidance: Double? = nil, +// styleGuidance: Double? = nil, +// textGuidance: Double? = nil, +// language: String? = nil ) { self.text = text self.voice = voice self.voiceEngine = voiceEngine self.quality = quality self.outputFormat = outputFormat - self.speed = speed - self.sampleRate = sampleRate - self.seed = seed - self.temperature = temperature - self.emotion = emotion - self.voiceGuidance = voiceGuidance - self.styleGuidance = styleGuidance - self.textGuidance = textGuidance - self.language = language +// self.speed = speed +// self.sampleRate = sampleRate +// self.seed = seed +// self.temperature = temperature +// self.emotion = emotion +// self.voiceGuidance = voiceGuidance +// self.styleGuidance = styleGuidance +// self.textGuidance = textGuidance +// self.language = language } } diff --git a/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.swift b/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.swift index dddaa30d..a7b247d2 100644 --- a/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.swift +++ b/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.swift @@ -67,11 +67,11 @@ extension PlayHT { @Path("/voices") var listVoices = Endpoint() - // Text to speech - @POST - @Path("/tts") - @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) - var textToSpeech = Endpoint() + @GET + @Path({ context -> String in + "/tts/\(context.input)" + }) + var checkJobStatus = Endpoint() // Stream text to speech @POST @@ -110,9 +110,9 @@ extension PlayHT.APISpecification { ) request = request - .header("x-api-key", context.root.configuration.apiKey) + .header("X-USER-ID", context.root.configuration.userId) .header("accept", "application/json") - .header("AUTHORIZATION", context.root.configuration.userId) + .header("AUTHORIZATION", context.root.configuration.apiKey) .header(.contentType(.json)) return request @@ -122,6 +122,8 @@ extension PlayHT.APISpecification { from response: Request.Response, context: DecodeOutputContext ) throws -> Output { + print(response) + do { try response.validate() } catch { diff --git a/Sources/PlayHT/Intramodular/API/PlayHT.APISpeicification.ResponseBodies.swift b/Sources/PlayHT/Intramodular/API/PlayHT.APISpeicification.ResponseBodies.swift index d462768c..62a099aa 100644 --- a/Sources/PlayHT/Intramodular/API/PlayHT.APISpeicification.ResponseBodies.swift +++ b/Sources/PlayHT/Intramodular/API/PlayHT.APISpeicification.ResponseBodies.swift @@ -11,11 +11,63 @@ extension PlayHT.APISpecification { public enum ResponseBodies { public struct Voices: Codable { public let voices: [PlayHT.Voice] + + // Add custom decoding if the response structure is different + public init(from decoder: Decoder) throws { + // If the response is an array directly + if let container = try? decoder.singleValueContainer(), + let voices = try? container.decode([PlayHT.Voice].self) { + self.voices = voices + } else { + // Try decoding as an object with a voices key + let container = try decoder.container(keyedBy: CodingKeys.self) + self.voices = try container.decode([PlayHT.Voice].self, forKey: .voices) + } + } + + private enum CodingKeys: String, CodingKey { + case voices + } } public struct TextToSpeechOutput: Codable { - public let transcriptionId: String - public let audioUrl: String? + public let id: String + public let status: String + public let created: String + public let input: TextToSpeechInput + public let output: String? + public let links: [Link] + + private enum CodingKeys: String, CodingKey { + case id, status, created, input, output + case links = "_links" + } + + public struct TextToSpeechInput: Codable { + public let speed: Double + public let outputFormat: String + public let sampleRate: Int + public let seed: Int? + public let temperature: Double? + public let text: String + public let voice: String + public let quality: String + + private enum CodingKeys: String, CodingKey { + case speed + case outputFormat = "output_format" + case sampleRate = "sample_rate" + case seed, temperature, text, voice, quality + } + } + + public struct Link: Codable { + public let rel: String + public let method: String + public let contentType: String + public let description: String + public let href: String + } } public struct ClonedVoiceOutput: Codable { diff --git a/Sources/PlayHT/Intramodular/Models/PlayHT.Voice.swift b/Sources/PlayHT/Intramodular/Models/PlayHT.Voice.swift index 6fc6c91f..aa84909f 100644 --- a/Sources/PlayHT/Intramodular/Models/PlayHT.Voice.swift +++ b/Sources/PlayHT/Intramodular/Models/PlayHT.Voice.swift @@ -6,7 +6,7 @@ // import Foundation -import ElevenLabs +import Swallow extension PlayHT { public struct Voice: Codable, Hashable, Identifiable { @@ -15,19 +15,41 @@ extension PlayHT { public let id: ID public let name: String public let language: String - public let voiceEngine: Model + public let languageCode: String // Add this to store the language code separately + public let voiceEngine: String // Changed from Model to String since it's consistently "PlayHT2.0" public let isCloned: Bool public let gender: String? public let accent: String? public let age: String? public let style: String? - public let useCase: String? - + public let sample: String? // Add this for the sample URL + public let texture: String? // Add these additional fields that appear in the response + public let loudness: String? + public let tempo: String? + private enum CodingKeys: String, CodingKey { - case id, name, language, gender, accent, age, style - case voiceEngine = "voice_engine" - case isCloned = "cloned" - case useCase = "use_case" + case id, name, language, languageCode, voiceEngine, isCloned + case gender, accent, age, style, sample, texture, loudness, tempo + } + + // Add custom decoding if needed to handle any special cases + public init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + + self.id = try ID(rawValue: container.decode(String.self, forKey: .id)) + self.name = try container.decode(String.self, forKey: .name) + self.language = try container.decode(String.self, forKey: .language) + self.languageCode = try container.decode(String.self, forKey: .languageCode) + self.voiceEngine = try container.decode(String.self, forKey: .voiceEngine) + self.isCloned = try container.decode(Bool.self, forKey: .isCloned) + self.gender = try container.decodeIfPresent(String.self, forKey: .gender) + self.accent = try container.decodeIfPresent(String.self, forKey: .accent) + self.age = try container.decodeIfPresent(String.self, forKey: .age) + self.style = try container.decodeIfPresent(String.self, forKey: .style) + self.sample = try container.decodeIfPresent(String.self, forKey: .sample) + self.texture = try container.decodeIfPresent(String.self, forKey: .texture) + self.loudness = try container.decodeIfPresent(String.self, forKey: .loudness) + self.tempo = try container.decodeIfPresent(String.self, forKey: .tempo) } } @@ -47,28 +69,3 @@ extension PlayHT { case flac = "flac" } } - -#warning("This is only a temporary fix. Remove these & replace with Abstract (@jared)") - -extension PlayHT.Voice { - public func toElevenLabsVoice() -> ElevenLabs.Voice { - ElevenLabs.Voice( - voiceID: id.rawValue, - name: name, - description: style, - isOwner: isCloned - ) - } -} - -extension PlayHT.VoiceSettings { - public static func fromElevenLabs(_ settings: ElevenLabs.VoiceSettings) -> Self { - PlayHT.VoiceSettings( - speed: 1.0, - temperature: settings.stability, - voiceGuidance: settings.similarityBoost * 6.0, - styleGuidance: settings.styleExaggeration * 30.0, - textGuidance: 1.0 + settings.similarityBoost - ) - } -} diff --git a/Sources/PlayHT/Intramodular/PlayHT.Client.swift b/Sources/PlayHT/Intramodular/PlayHT.Client.swift index 1ee76dc5..e2944714 100644 --- a/Sources/PlayHT/Intramodular/PlayHT.Client.swift +++ b/Sources/PlayHT/Intramodular/PlayHT.Client.swift @@ -31,8 +31,8 @@ extension PlayHT { self.sessionCache = .init() } - public convenience init(apiKey: String) { - self.init(configuration: .init(apiKey: apiKey)) + public convenience init(apiKey: String, userID: String) { + self.init(configuration: .init(apiKey: apiKey, userId: userID)) } } } @@ -48,16 +48,16 @@ extension PlayHT.Client: _MIService { throw _MIServiceError.serviceTypeIncompatible(serviceIdentifier) } - guard let credential = account.credential as? _MIServiceAPIKeyCredential else { + guard let credential = account.credential as? _MIServiceUserIDAndAPIKeyCredential else { throw _MIServiceError.invalidCredentials(account.credential) } - self.init(apiKey: credential.apiKey) + self.init(apiKey: credential.apiKey, userID: credential.userID) } } extension PlayHT.Client { - public func availableVoices() async throws -> [PlayHT.Voice] { + public func playHTAvailableVoices() async throws -> [PlayHT.Voice] { try await run(\.listVoices).voices } @@ -67,48 +67,37 @@ extension PlayHT.Client { public func generateSpeech( text: String, - voice: PlayHT.Voice, + voice: String, settings: PlayHT.VoiceSettings, - outputSettings: PlayHT.OutputSettings = .default - ) async throws -> String? { + outputSettings: PlayHT.OutputSettings = .default, + model: PlayHT.Model + ) async throws -> Data { let input = PlayHT.APISpecification.RequestBodies.TextToSpeechInput( text: text, - voice: voice.id.rawValue, - voiceEngine: voice.voiceEngine, + voice: voice, + voiceEngine: model, quality: outputSettings.quality.rawValue, - outputFormat: outputSettings.format.rawValue, - speed: settings.speed, - sampleRate: outputSettings.sampleRate, - temperature: settings.temperature, - voiceGuidance: settings.voiceGuidance, - styleGuidance: settings.styleGuidance, - textGuidance: settings.textGuidance, - language: voice.language + outputFormat: outputSettings.format.rawValue ) - let response = try await run(\.textToSpeech, with: input) - return response.audioUrl + let response = try await run(\.streamTextToSpeech, with: input) + print(response) + return response } public func streamSpeech( text: String, - voice: PlayHT.Voice, + voice: String, settings: PlayHT.VoiceSettings, - outputSettings: PlayHT.OutputSettings = .default + outputSettings: PlayHT.OutputSettings = .default, + model: PlayHT.Model ) async throws -> Data { let input = PlayHT.APISpecification.RequestBodies.TextToSpeechInput( text: text, - voice: voice.id.rawValue, - voiceEngine: voice.voiceEngine, + voice: voice, + voiceEngine: model, quality: outputSettings.quality.rawValue, - outputFormat: outputSettings.format.rawValue, - speed: settings.speed, - sampleRate: outputSettings.sampleRate, - temperature: settings.temperature, - voiceGuidance: settings.voiceGuidance, - styleGuidance: settings.styleGuidance, - textGuidance: settings.textGuidance, - language: voice.language + outputFormat: outputSettings.format.rawValue ) return try await run(\.streamTextToSpeech, with: input) @@ -132,10 +121,4 @@ extension PlayHT.Client { ) async throws { try await run(\.deleteClonedVoice, with: voice.rawValue) } - - private func findVoice(id: String) async throws -> PlayHT.Voice? { - let allVoices = try await availableVoices() - let clonedVoices = try await clonedVoices() - return (allVoices + clonedVoices).first { $0.id.rawValue == id } - } } diff --git a/Sources/PlayHT/Intramodular/PlayHT.Model.swift b/Sources/PlayHT/Intramodular/PlayHT.Model.swift index 560f7643..c8427959 100644 --- a/Sources/PlayHT/Intramodular/PlayHT.Model.swift +++ b/Sources/PlayHT/Intramodular/PlayHT.Model.swift @@ -20,6 +20,9 @@ extension PlayHT { /// - 20k character limit per stream case play3Mini = "Play3.0-mini" + case playHT2 = "PlayHT2.0" + case playHT1 = "PlayHT1.0" + /// Legacy voice model with basic TTS capabilities case playHT2Turbo = "PlayHT2.0-turbo" } From 445485a1ddfece6edb99a03232c51aa64e237e83 Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Wed, 20 Nov 2024 15:07:43 -0700 Subject: [PATCH 012/271] updated client --- .../PlayHT/Intramodular/PlayHT.Client.swift | 76 ++++++++++++++----- 1 file changed, 55 insertions(+), 21 deletions(-) diff --git a/Sources/PlayHT/Intramodular/PlayHT.Client.swift b/Sources/PlayHT/Intramodular/PlayHT.Client.swift index e2944714..462bbfd0 100644 --- a/Sources/PlayHT/Intramodular/PlayHT.Client.swift +++ b/Sources/PlayHT/Intramodular/PlayHT.Client.swift @@ -65,13 +65,14 @@ extension PlayHT.Client { try await run(\.listClonedVoices).voices } - public func generateSpeech( + public func streamTextToSpeech( text: String, voice: String, settings: PlayHT.VoiceSettings, outputSettings: PlayHT.OutputSettings = .default, model: PlayHT.Model ) async throws -> Data { + // Construct the input for the API let input = PlayHT.APISpecification.RequestBodies.TextToSpeechInput( text: text, voice: voice, @@ -80,29 +81,37 @@ extension PlayHT.Client { outputFormat: outputSettings.format.rawValue ) - let response = try await run(\.streamTextToSpeech, with: input) - print(response) - return response - } - - public func streamSpeech( - text: String, - voice: String, - settings: PlayHT.VoiceSettings, - outputSettings: PlayHT.OutputSettings = .default, - model: PlayHT.Model - ) async throws -> Data { - let input = PlayHT.APISpecification.RequestBodies.TextToSpeechInput( - text: text, - voice: voice, - voiceEngine: model, - quality: outputSettings.quality.rawValue, - outputFormat: outputSettings.format.rawValue - ) + // Fetch the initial JSON response + let responseData = try await run(\.streamTextToSpeech, with: input) + + // Decode the response to extract the audio URL + let audioResponse = try JSONDecoder().decode(PlayHT.Client.AudioResponse.self, from: responseData) + + guard let audioUrl = URL(string: audioResponse.href) else { + throw PlayHTError.invalidURL + } + + #warning("This should be cleaned up @jared") + var request = URLRequest(url: audioUrl) + request.httpMethod = "GET" + request.addValue("application/json", forHTTPHeaderField: "Content-Type") + request.addValue(interface.configuration.userId ?? "", forHTTPHeaderField: "X-USER-ID") + request.addValue(interface.configuration.apiKey ?? "", forHTTPHeaderField: "AUTHORIZATION") + + let (audioData, response) = try await URLSession.shared.data(for: request) + + guard let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 else { + throw PlayHTError.audioFetchFailed + } - return try await run(\.streamTextToSpeech, with: input) + guard !audioData.isEmpty else { + throw PlayHTError.audioFetchFailed + } + + return audioData } + public func instantCloneVoice( sampleFileURL: String, name: String @@ -122,3 +131,28 @@ extension PlayHT.Client { try await run(\.deleteClonedVoice, with: voice.rawValue) } } + +extension PlayHT.Client { + enum PlayHTError: LocalizedError { + case invalidURL + case audioFetchFailed + + var errorDescription: String? { + switch self { + case .invalidURL: + return "Invalid audio URL received from PlayHT" + case .audioFetchFailed: + return "Failed to fetch audio data from PlayHT" + } + } + } +} +extension PlayHT.Client { + public struct AudioResponse: Codable { + public let description: String + public let method: String + public let href: String + public let contentType: String + public let rel: String + } +} From 6cb09e1b473db2d258cbea569f2ea1ae4289bd40 Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Wed, 20 Nov 2024 17:20:26 -0700 Subject: [PATCH 013/271] Deleting Voice --- .../API/ElevenLabs.APISpecification.swift | 4 ---- ...layHT.APISpecification.RequestBodies.swift | 24 +++++++++++++++---- .../API/PlayHT.APISpecification.swift | 19 ++++----------- .../Intramodular/Models/PlayHT.Voice.swift | 21 +++++++++------- .../PlayHT/Intramodular/PlayHT.Client.swift | 11 ++++++++- 5 files changed, 46 insertions(+), 33 deletions(-) diff --git a/Sources/ElevenLabs/Intramodular/API/ElevenLabs.APISpecification.swift b/Sources/ElevenLabs/Intramodular/API/ElevenLabs.APISpecification.swift index ce9e2742..fa442c34 100644 --- a/Sources/ElevenLabs/Intramodular/API/ElevenLabs.APISpecification.swift +++ b/Sources/ElevenLabs/Intramodular/API/ElevenLabs.APISpecification.swift @@ -167,10 +167,6 @@ extension ElevenLabs.APISpecification { return response.data as! Output } - if Input.self == RequestBodies.EditVoiceInput.self { - print(response) - } - return try response.decode( Output.self, keyDecodingStrategy: .convertFromSnakeCase diff --git a/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.RequestBodies.swift b/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.RequestBodies.swift index 11bf53a3..d668c773 100644 --- a/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.RequestBodies.swift +++ b/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.RequestBodies.swift @@ -74,6 +74,14 @@ extension PlayHT.APISpecification { } } + public struct DeleteVoiceInput: Codable, Hashable { + var voiceID: String + + enum CodingKeys: String, CodingKey { + case voiceID = "voice_id" + } + } + public struct InstantCloneVoiceInput: Codable, Hashable, HTTPRequest.Multipart.ContentConvertible { public let sampleFileURL: String public let voiceName: String @@ -86,12 +94,18 @@ extension PlayHT.APISpecification { public func __conversion() throws -> HTTPRequest.Multipart.Content { var result = HTTPRequest.Multipart.Content() - result.append( - .text( - named: "sample_file_url", - value: sampleFileURL + if let url = URL(string: sampleFileURL), + let fileData = try? Data(contentsOf: url) { + print(fileData) + result.append( + .file( + named: "sample_file", + data: fileData, + filename: url.lastPathComponent, + contentType: .mp4 + ) ) - ) + } result.append( .text( diff --git a/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.swift b/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.swift index a7b247d2..8012abbd 100644 --- a/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.swift +++ b/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.swift @@ -66,13 +66,7 @@ extension PlayHT { @GET @Path("/voices") var listVoices = Endpoint() - - @GET - @Path({ context -> String in - "/tts/\(context.input)" - }) - var checkJobStatus = Endpoint() - + // Stream text to speech @POST @Path("/tts/stream") @@ -80,7 +74,7 @@ extension PlayHT { var streamTextToSpeech = Endpoint() // Clone Voice - @POST + @GET @Path("/cloned-voices") var listClonedVoices = Endpoint() @@ -91,10 +85,9 @@ extension PlayHT { // Delete cloned voice @DELETE - @Path({ context -> String in - "/cloned-voices/\(context.input)" - }) - var deleteClonedVoice = Endpoint() + @Path("/cloned-voices") + @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) + var deleteClonedVoice = Endpoint() } } @@ -122,8 +115,6 @@ extension PlayHT.APISpecification { from response: Request.Response, context: DecodeOutputContext ) throws -> Output { - print(response) - do { try response.validate() } catch { diff --git a/Sources/PlayHT/Intramodular/Models/PlayHT.Voice.swift b/Sources/PlayHT/Intramodular/Models/PlayHT.Voice.swift index aa84909f..3ac8907f 100644 --- a/Sources/PlayHT/Intramodular/Models/PlayHT.Voice.swift +++ b/Sources/PlayHT/Intramodular/Models/PlayHT.Voice.swift @@ -14,16 +14,16 @@ extension PlayHT { public let id: ID public let name: String - public let language: String - public let languageCode: String // Add this to store the language code separately - public let voiceEngine: String // Changed from Model to String since it's consistently "PlayHT2.0" - public let isCloned: Bool + public let language: String? + public let languageCode: String? + public let voiceEngine: String + public let isCloned: Bool? public let gender: String? public let accent: String? public let age: String? public let style: String? - public let sample: String? // Add this for the sample URL - public let texture: String? // Add these additional fields that appear in the response + public let sample: String? + public let texture: String? public let loudness: String? public let tempo: String? @@ -38,10 +38,13 @@ extension PlayHT { self.id = try ID(rawValue: container.decode(String.self, forKey: .id)) self.name = try container.decode(String.self, forKey: .name) - self.language = try container.decode(String.self, forKey: .language) - self.languageCode = try container.decode(String.self, forKey: .languageCode) + self.language = try container.decodeIfPresent(String.self, forKey: .language) + self.languageCode = try container.decodeIfPresent(String.self, forKey: .languageCode) self.voiceEngine = try container.decode(String.self, forKey: .voiceEngine) - self.isCloned = try container.decode(Bool.self, forKey: .isCloned) + + self.isCloned = try container.decodeIfPresent(Bool.self, forKey: .isCloned) ?? true + // isCloned is always false if not created by user. Otherwise doesn't exist so we set to true + self.gender = try container.decodeIfPresent(String.self, forKey: .gender) self.accent = try container.decodeIfPresent(String.self, forKey: .accent) self.age = try container.decodeIfPresent(String.self, forKey: .age) diff --git a/Sources/PlayHT/Intramodular/PlayHT.Client.swift b/Sources/PlayHT/Intramodular/PlayHT.Client.swift index 462bbfd0..5568bc92 100644 --- a/Sources/PlayHT/Intramodular/PlayHT.Client.swift +++ b/Sources/PlayHT/Intramodular/PlayHT.Client.swift @@ -57,6 +57,15 @@ extension PlayHT.Client: _MIService { } extension PlayHT.Client { + + public func getAllAvailableVoices() async throws -> [PlayHT.Voice] { + async let htVoices = playHTAvailableVoices() + async let clonedVoices = clonedVoices() + + let (available, cloned) = try await (htVoices, clonedVoices) + return available + cloned + } + public func playHTAvailableVoices() async throws -> [PlayHT.Voice] { try await run(\.listVoices).voices } @@ -128,7 +137,7 @@ extension PlayHT.Client { public func deleteClonedVoice( voice: PlayHT.Voice.ID ) async throws { - try await run(\.deleteClonedVoice, with: voice.rawValue) + try await run(\.deleteClonedVoice, with: .init(voiceID: voice.rawValue)) } } From 3240a4c366c76d44cb12fabe2ab54b39732a9c48 Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Wed, 20 Nov 2024 17:55:52 -0700 Subject: [PATCH 014/271] cleanup --- ...layHT.APISpecification.RequestBodies.swift | 77 +++++++++---------- .../API/PlayHT.APISpecification.swift | 6 +- ...yHT.APISpeicification.ResponseBodies.swift | 55 +++---------- .../PlayHT/Intramodular/PlayHT.Client.swift | 20 +---- .../PlayHT/Intramodular/PlayHT.Model.swift | 9 +-- 5 files changed, 55 insertions(+), 112 deletions(-) diff --git a/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.RequestBodies.swift b/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.RequestBodies.swift index d668c773..8aa73eda 100644 --- a/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.RequestBodies.swift +++ b/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.RequestBodies.swift @@ -18,59 +18,59 @@ extension PlayHT.APISpecification { public let quality: String public let outputFormat: String -// public let speed: Double? -// public let sampleRate: Int? -// public let seed: Int? -// public let temperature: Double? -// public let emotion: String? -// public let voiceGuidance: Double? -// public let styleGuidance: Double? -// public let textGuidance: Double? -// public let language: String? -// + // public let speed: Double? + // public let sampleRate: Int? + // public let seed: Int? + // public let temperature: Double? + // public let emotion: String? + // public let voiceGuidance: Double? + // public let styleGuidance: Double? + // public let textGuidance: Double? + // public let language: String? + // private enum CodingKeys: String, CodingKey { case text, voice, quality case voiceEngine = "voice_engine" case outputFormat = "output_format" -// case speed -// case sampleRate = "sample_rate" -// case seed, temperature, emotion -// case voiceGuidance = "voice_guidance" -// case styleGuidance = "style_guidance" -// case textGuidance = "text_guidance" -// case language + // case speed + // case sampleRate = "sample_rate" + // case seed, temperature, emotion + // case voiceGuidance = "voice_guidance" + // case styleGuidance = "style_guidance" + // case textGuidance = "text_guidance" + // case language } public init( text: String, voice: String, - voiceEngine: PlayHT.Model = .play3Mini, + voiceEngine: PlayHT.Model = .playHT2, quality: String = "medium", outputFormat: String = "mp3" -// speed: Double? = nil, -// sampleRate: Int? = 48000, -// seed: Int? = nil, -// temperature: Double? = nil, -// emotion: String? = nil, -// voiceGuidance: Double? = nil, -// styleGuidance: Double? = nil, -// textGuidance: Double? = nil, -// language: String? = nil + // speed: Double? = nil, + // sampleRate: Int? = 48000, + // seed: Int? = nil, + // temperature: Double? = nil, + // emotion: String? = nil, + // voiceGuidance: Double? = nil, + // styleGuidance: Double? = nil, + // textGuidance: Double? = nil, + // language: String? = nil ) { self.text = text self.voice = voice self.voiceEngine = voiceEngine self.quality = quality self.outputFormat = outputFormat -// self.speed = speed -// self.sampleRate = sampleRate -// self.seed = seed -// self.temperature = temperature -// self.emotion = emotion -// self.voiceGuidance = voiceGuidance -// self.styleGuidance = styleGuidance -// self.textGuidance = textGuidance -// self.language = language + // self.speed = speed + // self.sampleRate = sampleRate + // self.seed = seed + // self.temperature = temperature + // self.emotion = emotion + // self.voiceGuidance = voiceGuidance + // self.styleGuidance = styleGuidance + // self.textGuidance = textGuidance + // self.language = language } } @@ -92,11 +92,10 @@ extension PlayHT.APISpecification { } public func __conversion() throws -> HTTPRequest.Multipart.Content { - var result = HTTPRequest.Multipart.Content() + var result: HTTPRequest.Multipart.Content = .init() - if let url = URL(string: sampleFileURL), + if let url: URL = URL(string: sampleFileURL), let fileData = try? Data(contentsOf: url) { - print(fileData) result.append( .file( named: "sample_file", diff --git a/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.swift b/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.swift index 8012abbd..f478bd72 100644 --- a/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.swift +++ b/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.swift @@ -71,13 +71,13 @@ extension PlayHT { @POST @Path("/tts/stream") @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) - var streamTextToSpeech = Endpoint() + var streamTextToSpeech = Endpoint() - // Clone Voice @GET @Path("/cloned-voices") var listClonedVoices = Endpoint() + // Clone Voice @POST @Path("/cloned-voices/instant") @Body(multipart: .input) @@ -97,7 +97,7 @@ extension PlayHT.APISpecification { from input: Input, context: BuildRequestContext ) throws -> Request { - var request = try super.buildRequestBase( + var request: HTTPRequest = try super.buildRequestBase( from: input, context: context ) diff --git a/Sources/PlayHT/Intramodular/API/PlayHT.APISpeicification.ResponseBodies.swift b/Sources/PlayHT/Intramodular/API/PlayHT.APISpeicification.ResponseBodies.swift index 62a099aa..12b2b8b1 100644 --- a/Sources/PlayHT/Intramodular/API/PlayHT.APISpeicification.ResponseBodies.swift +++ b/Sources/PlayHT/Intramodular/API/PlayHT.APISpeicification.ResponseBodies.swift @@ -12,14 +12,11 @@ extension PlayHT.APISpecification { public struct Voices: Codable { public let voices: [PlayHT.Voice] - // Add custom decoding if the response structure is different public init(from decoder: Decoder) throws { - // If the response is an array directly - if let container = try? decoder.singleValueContainer(), - let voices = try? container.decode([PlayHT.Voice].self) { + if let container: SingleValueDecodingContainer = try? decoder.singleValueContainer(), + let voices: [PlayHT.Voice] = try? container.decode([PlayHT.Voice].self) { self.voices = voices } else { - // Try decoding as an object with a voices key let container = try decoder.container(keyedBy: CodingKeys.self) self.voices = try container.decode([PlayHT.Voice].self, forKey: .voices) } @@ -30,50 +27,18 @@ extension PlayHT.APISpecification { } } - public struct TextToSpeechOutput: Codable { - public let id: String - public let status: String - public let created: String - public let input: TextToSpeechInput - public let output: String? - public let links: [Link] - - private enum CodingKeys: String, CodingKey { - case id, status, created, input, output - case links = "_links" - } - - public struct TextToSpeechInput: Codable { - public let speed: Double - public let outputFormat: String - public let sampleRate: Int - public let seed: Int? - public let temperature: Double? - public let text: String - public let voice: String - public let quality: String - - private enum CodingKeys: String, CodingKey { - case speed - case outputFormat = "output_format" - case sampleRate = "sample_rate" - case seed, temperature, text, voice, quality - } - } - - public struct Link: Codable { - public let rel: String - public let method: String - public let contentType: String - public let description: String - public let href: String - } - } - public struct ClonedVoiceOutput: Codable { public let id: String public let name: String public let status: String } + + public struct TextToSpeechResponse: Codable { + public let description: String + public let method: String + public let href: String + public let contentType: String + public let rel: String + } } } diff --git a/Sources/PlayHT/Intramodular/PlayHT.Client.swift b/Sources/PlayHT/Intramodular/PlayHT.Client.swift index 5568bc92..f074c9d0 100644 --- a/Sources/PlayHT/Intramodular/PlayHT.Client.swift +++ b/Sources/PlayHT/Intramodular/PlayHT.Client.swift @@ -81,7 +81,7 @@ extension PlayHT.Client { outputSettings: PlayHT.OutputSettings = .default, model: PlayHT.Model ) async throws -> Data { - // Construct the input for the API + let input = PlayHT.APISpecification.RequestBodies.TextToSpeechInput( text: text, voice: voice, @@ -90,18 +90,13 @@ extension PlayHT.Client { outputFormat: outputSettings.format.rawValue ) - // Fetch the initial JSON response let responseData = try await run(\.streamTextToSpeech, with: input) - // Decode the response to extract the audio URL - let audioResponse = try JSONDecoder().decode(PlayHT.Client.AudioResponse.self, from: responseData) - - guard let audioUrl = URL(string: audioResponse.href) else { + guard let url = URL(string: responseData.href) else { throw PlayHTError.invalidURL } - #warning("This should be cleaned up @jared") - var request = URLRequest(url: audioUrl) + var request = URLRequest(url: url) request.httpMethod = "GET" request.addValue("application/json", forHTTPHeaderField: "Content-Type") request.addValue(interface.configuration.userId ?? "", forHTTPHeaderField: "X-USER-ID") @@ -156,12 +151,3 @@ extension PlayHT.Client { } } } -extension PlayHT.Client { - public struct AudioResponse: Codable { - public let description: String - public let method: String - public let href: String - public let contentType: String - public let rel: String - } -} diff --git a/Sources/PlayHT/Intramodular/PlayHT.Model.swift b/Sources/PlayHT/Intramodular/PlayHT.Model.swift index c8427959..9eeb0a28 100644 --- a/Sources/PlayHT/Intramodular/PlayHT.Model.swift +++ b/Sources/PlayHT/Intramodular/PlayHT.Model.swift @@ -12,18 +12,11 @@ import Swift extension PlayHT { public enum Model: String, Codable, Sendable { - /// Latest speech model optimized for realtime use. Features include: - /// - Multilingual support (36 languages) - /// - Reduced hallucinations - /// - <200ms streaming latency - /// - 48kHz sampling - /// - 20k character limit per stream - case play3Mini = "Play3.0-mini" case playHT2 = "PlayHT2.0" + case playHT1 = "PlayHT1.0" - /// Legacy voice model with basic TTS capabilities case playHT2Turbo = "PlayHT2.0-turbo" } } From 94f67d80e0c6e1bdec3d6b770f092bc88bde78ac Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Wed, 20 Nov 2024 18:14:50 -0700 Subject: [PATCH 015/271] removed tests --- Tests/PlayHT/Intramodular/SpeechTests.swift | 61 --------------------- Tests/PlayHT/module.swift | 13 ++++- 2 files changed, 10 insertions(+), 64 deletions(-) diff --git a/Tests/PlayHT/Intramodular/SpeechTests.swift b/Tests/PlayHT/Intramodular/SpeechTests.swift index e4b58291..8647aad5 100644 --- a/Tests/PlayHT/Intramodular/SpeechTests.swift +++ b/Tests/PlayHT/Intramodular/SpeechTests.swift @@ -10,65 +10,4 @@ import XCTest final class PlayHTTests: XCTestCase { - let sampleText = "In a quiet, unassuming village nestled deep in a lush, verdant valley, young Elara leads a simple life, dreaming of adventure beyond the horizon. Her village is filled with ancient folklore and tales of mystical relics, but none capture her imagination like the legend of the Enchanted Amuletβ€”a powerful artifact said to grant its bearer the ability to control time." - - func testListVoices() async throws { - let voices = try await client.availableVoices() - XCTAssertFalse(voices.isEmpty) - } - - func testCreateSpeech() async throws { - let voices = try await client.availableVoices() - let voice = try XCTUnwrap(voices.first) - - let voiceSettings = PlayHT.VoiceSettings( - speed: 1.0, - temperature: 0.7, - voiceGuidance: 3.0, - styleGuidance: 15.0, - textGuidance: 1.5 - ) - - let outputSettings = PlayHT.OutputSettings( - quality: .high, - format: .mp3, - sampleRate: 48000 - ) - - let audioURL = try await client.generateSpeech( - text: sampleText, - voice: voice, - settings: voiceSettings, - outputSettings: outputSettings - ) - - XCTAssertNotNil(audioURL) - } - - func testStreamSpeech() async throws { - let voices = try await client.availableVoices() - let voice = try XCTUnwrap(voices.first) - - let voiceSettings = PlayHT.VoiceSettings() - let outputSettings = PlayHT.OutputSettings() - - let data = try await client.streamSpeech( - text: sampleText, - voice: voice, - settings: voiceSettings, - outputSettings: outputSettings - ) - - XCTAssertFalse(data.isEmpty) - } - - func testInstantCloneVoice() async throws { - let sampleURL = "https://example.com/sample.mp3" - let voiceID = try await client.instantCloneVoice( - sampleFileURL: sampleURL, - name: "Test Clone" - ) - - XCTAssertNotNil(voiceID) - } } diff --git a/Tests/PlayHT/module.swift b/Tests/PlayHT/module.swift index c217577d..182cfdab 100644 --- a/Tests/PlayHT/module.swift +++ b/Tests/PlayHT/module.swift @@ -2,14 +2,21 @@ // Copyright (c) Vatsal Manot // -import ElevenLabs +import PlayHT public var PLAYHT_API_KEY: String { - "0dea648f8b5c9497b647902ae00e6903" + "fcfc923b8bd44fc383c9d23e409d52b1" +} + +public var PLAYHT_USER_ID: String { + "gze0b6x9kbXPVPOINZTAB09TsZ63" } public var client: PlayHT.Client { - let client = PlayHT.Client(apiKey: PLAYHT_API_KEY) + let client = PlayHT.Client( + apiKey: PLAYHT_API_KEY, + userID: PLAYHT_USER_ID + ) return client } From c88a31b62b29f32819a427993ac7b288859e626d Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Thu, 21 Nov 2024 13:43:19 -0700 Subject: [PATCH 016/271] initial --- .../Model Identifier/ModelIdentifier.Provider.swift | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Sources/CoreMI/Intramodular/Model Identifier/ModelIdentifier.Provider.swift b/Sources/CoreMI/Intramodular/Model Identifier/ModelIdentifier.Provider.swift index 6917b038..b8594f73 100644 --- a/Sources/CoreMI/Intramodular/Model Identifier/ModelIdentifier.Provider.swift +++ b/Sources/CoreMI/Intramodular/Model Identifier/ModelIdentifier.Provider.swift @@ -25,6 +25,7 @@ extension ModelIdentifier { case _ElevenLabs case _TogetherAI case _PlayHT + case _Rime case unknown(String) @@ -79,6 +80,10 @@ extension ModelIdentifier { public static var playHT: Self { Self._PlayHT } + + public static var rime: Self { + Self._Rime + } } } @@ -117,6 +122,8 @@ extension ModelIdentifier.Provider: CustomStringConvertible { return "TogetherAI" case ._PlayHT: return "PlayHT" + case ._Rime: + return "Rime" case .unknown(let provider): return provider } From f5dc921e71842e8022b9d10efd8a6a207b494d69 Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Thu, 21 Nov 2024 13:58:06 -0700 Subject: [PATCH 017/271] Added identifiers --- .../Model Identifier/ModelIdentifier.Provider.swift | 4 ++++ .../Intramodular/Service/_MIServiceTypeIdentifier.swift | 1 + 2 files changed, 5 insertions(+) diff --git a/Sources/CoreMI/Intramodular/Model Identifier/ModelIdentifier.Provider.swift b/Sources/CoreMI/Intramodular/Model Identifier/ModelIdentifier.Provider.swift index b8594f73..126ac3ad 100644 --- a/Sources/CoreMI/Intramodular/Model Identifier/ModelIdentifier.Provider.swift +++ b/Sources/CoreMI/Intramodular/Model Identifier/ModelIdentifier.Provider.swift @@ -163,6 +163,8 @@ extension ModelIdentifier.Provider: RawRepresentable { return "togetherai" case ._PlayHT: return "playht" + case ._Rime: + return "rime" case .unknown(let provider): return provider } @@ -198,6 +200,8 @@ extension ModelIdentifier.Provider: RawRepresentable { self = ._TogetherAI case Self._PlayHT.rawValue: self = ._PlayHT + case Self._Rime.rawValue: + self = ._Rime default: self = .unknown(rawValue) } diff --git a/Sources/CoreMI/Intramodular/Service/_MIServiceTypeIdentifier.swift b/Sources/CoreMI/Intramodular/Service/_MIServiceTypeIdentifier.swift index e7ffab25..babec233 100644 --- a/Sources/CoreMI/Intramodular/Service/_MIServiceTypeIdentifier.swift +++ b/Sources/CoreMI/Intramodular/Service/_MIServiceTypeIdentifier.swift @@ -39,4 +39,5 @@ extension _MIServiceTypeIdentifier { public static let _Cohere = _MIServiceTypeIdentifier(rawValue: "guzob-fipin-navij-duvon") public static let _TogetherAI = _MIServiceTypeIdentifier(rawValue: "pafob-vopoj-lurig-zilur") public static let _PlayHT = _MIServiceTypeIdentifier(rawValue: "foluv-jufuk-zuhok-hofid") + public static let _Rime = _MIServiceTypeIdentifier(rawValue: "tohaz-zivir-bosov-minog") } From ac86273939a4647de74f1e9636f24d77069f5898 Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Thu, 21 Nov 2024 14:08:48 -0700 Subject: [PATCH 018/271] Files --- .../Rime.APISpecification.RequestBodies.swift | 7 +++++++ ...Rime.APISpecification.ResponseBodies.swift | 7 +++++++ .../API/Rime.APISpecification.swift | 7 +++++++ Sources/Rime/Intramodular/Rime.Client.swift | 19 +++++++++++++++++++ Sources/Rime/Intramodular/Rime.Model.swift | 7 +++++++ Sources/Rime/Intramodular/Rime.swift | 12 ++++++++++++ Sources/Rime/module.swift | 7 +++++++ 7 files changed, 66 insertions(+) create mode 100644 Sources/Rime/Intramodular/API/Rime.APISpecification.RequestBodies.swift create mode 100644 Sources/Rime/Intramodular/API/Rime.APISpecification.ResponseBodies.swift create mode 100644 Sources/Rime/Intramodular/API/Rime.APISpecification.swift create mode 100644 Sources/Rime/Intramodular/Rime.Client.swift create mode 100644 Sources/Rime/Intramodular/Rime.Model.swift create mode 100644 Sources/Rime/Intramodular/Rime.swift create mode 100644 Sources/Rime/module.swift diff --git a/Sources/Rime/Intramodular/API/Rime.APISpecification.RequestBodies.swift b/Sources/Rime/Intramodular/API/Rime.APISpecification.RequestBodies.swift new file mode 100644 index 00000000..e01779af --- /dev/null +++ b/Sources/Rime/Intramodular/API/Rime.APISpecification.RequestBodies.swift @@ -0,0 +1,7 @@ +// +// Rime.APISpecification.RequestBodies.swift +// AI +// +// Created by Jared Davidson on 11/21/24. +// + diff --git a/Sources/Rime/Intramodular/API/Rime.APISpecification.ResponseBodies.swift b/Sources/Rime/Intramodular/API/Rime.APISpecification.ResponseBodies.swift new file mode 100644 index 00000000..3283d02f --- /dev/null +++ b/Sources/Rime/Intramodular/API/Rime.APISpecification.ResponseBodies.swift @@ -0,0 +1,7 @@ +// +// Rime.APISpecification.ResponseBodies.swift +// AI +// +// Created by Jared Davidson on 11/21/24. +// + diff --git a/Sources/Rime/Intramodular/API/Rime.APISpecification.swift b/Sources/Rime/Intramodular/API/Rime.APISpecification.swift new file mode 100644 index 00000000..a685f4c3 --- /dev/null +++ b/Sources/Rime/Intramodular/API/Rime.APISpecification.swift @@ -0,0 +1,7 @@ +// +// Rime.APISpecification.swift +// AI +// +// Created by Jared Davidson on 11/21/24. +// + diff --git a/Sources/Rime/Intramodular/Rime.Client.swift b/Sources/Rime/Intramodular/Rime.Client.swift new file mode 100644 index 00000000..16295a6d --- /dev/null +++ b/Sources/Rime/Intramodular/Rime.Client.swift @@ -0,0 +1,19 @@ +// +// Rime.Client.swift +// AI +// +// Created by Jared Davidson on 11/21/24. +// + +import CorePersistence +import LargeLanguageModels +import Merge +import NetworkKit +import Swallow + +extension Rime { + @RuntimeDiscoverable + public final class Client: HTTPClient, _StaticSwift.Namespace { + + } +} diff --git a/Sources/Rime/Intramodular/Rime.Model.swift b/Sources/Rime/Intramodular/Rime.Model.swift new file mode 100644 index 00000000..e1c418ca --- /dev/null +++ b/Sources/Rime/Intramodular/Rime.Model.swift @@ -0,0 +1,7 @@ +// +// Rime.Model.swift +// AI +// +// Created by Jared Davidson on 11/21/24. +// + diff --git a/Sources/Rime/Intramodular/Rime.swift b/Sources/Rime/Intramodular/Rime.swift new file mode 100644 index 00000000..ad0ae787 --- /dev/null +++ b/Sources/Rime/Intramodular/Rime.swift @@ -0,0 +1,12 @@ +// +// Rime.swift +// AI +// +// Created by Jared Davidson on 11/21/24. +// + +import Swift + +public enum Rime { + +} diff --git a/Sources/Rime/module.swift b/Sources/Rime/module.swift new file mode 100644 index 00000000..c7efeae6 --- /dev/null +++ b/Sources/Rime/module.swift @@ -0,0 +1,7 @@ +// +// module.swift +// AI +// +// Created by Jared Davidson on 11/21/24. +// + From 54bccbda8d745d027ae6d639ca94479cade8a89f Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Thu, 21 Nov 2024 14:09:43 -0700 Subject: [PATCH 019/271] HTTPClient --- Sources/PlayHT/Intramodular/PlayHT.Client.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/PlayHT/Intramodular/PlayHT.Client.swift b/Sources/PlayHT/Intramodular/PlayHT.Client.swift index f074c9d0..41a370bf 100644 --- a/Sources/PlayHT/Intramodular/PlayHT.Client.swift +++ b/Sources/PlayHT/Intramodular/PlayHT.Client.swift @@ -13,7 +13,7 @@ import Swallow extension PlayHT { @RuntimeDiscoverable - public final class Client: SwiftAPI.Client, ObservableObject { + public final class Client: HTTPClient, _StaticSwift.Namespace { public static var persistentTypeRepresentation: some IdentityRepresentation { _MIServiceTypeIdentifier._PlayHT } From e907dd2b99ea0243f929810b3ae0625b1eadce57 Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Thu, 21 Nov 2024 14:53:37 -0700 Subject: [PATCH 020/271] get all voices --- Package.swift | 18 ++- .../Rime.APISpecification.RequestBodies.swift | 9 ++ ...Rime.APISpecification.ResponseBodies.swift | 25 ++++ .../API/Rime.APISpecification.swift | 114 ++++++++++++++++++ .../Rime/Intramodular/Models/Rime.Voice.swift | 56 +++++++++ Sources/Rime/Intramodular/Rime.Client.swift | 44 +++++++ 6 files changed, 265 insertions(+), 1 deletion(-) create mode 100644 Sources/Rime/Intramodular/Models/Rime.Voice.swift diff --git a/Package.swift b/Package.swift index 6c3f83ab..1cb9aa05 100644 --- a/Package.swift +++ b/Package.swift @@ -120,6 +120,21 @@ let package = Package( .enableExperimentalFeature("AccessLevelOnImport") ] ), + .target( + name: "Rime", + dependencies: [ + "CorePersistence", + "CoreMI", + "LargeLanguageModels", + "Merge", + "NetworkKit", + "Swallow" + ], + path: "Sources/Rime", + swiftSettings: [ + .enableExperimentalFeature("AccessLevelOnImport") + ] + ), .target( name: "_Gemini", dependencies: [ @@ -294,12 +309,13 @@ let package = Package( "OpenAI", "Perplexity", "PlayHT", + "Rime", "Swallow", "Jina", "VoyageAI", "Cohere", "TogetherAI", - "HuggingFace" + "HuggingFace", ], path: "Sources/AI", swiftSettings: [ diff --git a/Sources/Rime/Intramodular/API/Rime.APISpecification.RequestBodies.swift b/Sources/Rime/Intramodular/API/Rime.APISpecification.RequestBodies.swift index e01779af..be467c69 100644 --- a/Sources/Rime/Intramodular/API/Rime.APISpecification.RequestBodies.swift +++ b/Sources/Rime/Intramodular/API/Rime.APISpecification.RequestBodies.swift @@ -5,3 +5,12 @@ // Created by Jared Davidson on 11/21/24. // +import NetworkKit +import SwiftAPI +import Merge + +extension Rime.APISpecification { + enum RequestBodies { + + } +} diff --git a/Sources/Rime/Intramodular/API/Rime.APISpecification.ResponseBodies.swift b/Sources/Rime/Intramodular/API/Rime.APISpecification.ResponseBodies.swift index 3283d02f..f3371845 100644 --- a/Sources/Rime/Intramodular/API/Rime.APISpecification.ResponseBodies.swift +++ b/Sources/Rime/Intramodular/API/Rime.APISpecification.ResponseBodies.swift @@ -5,3 +5,28 @@ // Created by Jared Davidson on 11/21/24. // +import NetworkKit +import SwiftAPI +import Merge + +extension Rime.APISpecification { + enum ResponseBodies { + public struct Voices: Codable { + public let voices: [Rime.Voice] + + public init(voices: [Rime.Voice]) { + self.voices = voices + } + + public init(from decoder: any Decoder) throws { + let container = try decoder.singleValueContainer() + self.voices = try container.decode([Rime.Voice].self) + } + + public func encode(to encoder: any Encoder) throws { + var container = encoder.singleValueContainer() + try container.encode(voices) + } + } + } +} diff --git a/Sources/Rime/Intramodular/API/Rime.APISpecification.swift b/Sources/Rime/Intramodular/API/Rime.APISpecification.swift index a685f4c3..c689a252 100644 --- a/Sources/Rime/Intramodular/API/Rime.APISpecification.swift +++ b/Sources/Rime/Intramodular/API/Rime.APISpecification.swift @@ -5,3 +5,117 @@ // Created by Jared Davidson on 11/21/24. // +import CorePersistence +import Diagnostics +import NetworkKit +import Swift +import SwiftAPI + +extension Rime { + public enum APIError: APIErrorProtocol { + public typealias API = Rime.APISpecification + + case apiKeyMissing + case userIdMissing + case incorrectAPIKeyProvided + case rateLimitExceeded + case invalidContentType + case badRequest(request: API.Request?, error: API.Request.Error) + case unknown(message: String) + case runtime(AnyError) + + public var traits: ErrorTraits { + [.domain(.networking)] + } + } + + public struct APISpecification: RESTAPISpecification { + public typealias Error = APIError + + public struct Configuration: Codable, Hashable { + public var host: URL + public var apiKey: String? + + public init( + host: URL = URL(string: "https://users.rime.ai/")!, + apiKey: String? = nil + ) { + self.host = host + self.apiKey = apiKey + } + } + + public let configuration: Configuration + + public var host: URL { + configuration.host + } + + public var id: some Hashable { + configuration + } + + public init(configuration: Configuration) { + self.configuration = configuration + } + + @GET + @Path("/data/voices/voice_details.json") + var listVoices = Endpoint() + } +} + +extension Rime.APISpecification { + public final class Endpoint: BaseHTTPEndpoint { + public override func buildRequestBase( + from input: Input, + context: BuildRequestContext + ) throws -> Request { + var request: HTTPRequest = try super.buildRequestBase( + from: input, + context: context + ) + + request = request + .header("Accept", "application/json") + .header("Authorization", "Bearer \(context.root.configuration.apiKey ?? "")") + .header(.contentType(.json)) + + return request + } + + public override func decodeOutputBase( + from response: HTTPResponse, + context: DecodeOutputContext + ) throws -> Output { + do { + try response.validate() + } catch { + let apiError: Error + + if let error = error as? HTTPRequest.Error { + if response.statusCode.rawValue == 401 { + apiError = .incorrectAPIKeyProvided + } else if response.statusCode.rawValue == 429 { + apiError = .rateLimitExceeded + } else { + apiError = .badRequest(error) + } + } else { + apiError = .runtime(error) + } + + throw apiError + } + + if Output.self == Data.self { + return response.data as! Output + } + + return try response.decode( + Output.self, + keyDecodingStrategy: .convertFromSnakeCase + ) + } + } +} diff --git a/Sources/Rime/Intramodular/Models/Rime.Voice.swift b/Sources/Rime/Intramodular/Models/Rime.Voice.swift new file mode 100644 index 00000000..13ae4e43 --- /dev/null +++ b/Sources/Rime/Intramodular/Models/Rime.Voice.swift @@ -0,0 +1,56 @@ +// +// Rime.Voice.swift +// AI +// +// Created by Jared Davidson on 11/21/24. +// + +import Foundation +import Swallow + +extension Rime { + public struct Voice: Codable, Hashable, Identifiable { + public typealias ID = _TypeAssociatedID + + public let id: ID + public let name: String + public let age: String + public let country: String + public let region: String + public let demographic: String + public let genre: [String] + + enum CodingKeys: CodingKey { + case id + case name + case age + case country + case region + case demographic + case genre + } + + public init(from decoder: any Decoder) throws { + let container: KeyedDecodingContainer = try decoder.container(keyedBy: Rime.Voice.CodingKeys.self) + self.id = try container.decode(Rime.Voice.ID.self, forKey: Rime.Voice.CodingKeys.id) + self.name = try container.decode(String.self, forKey: Rime.Voice.CodingKeys.name) + self.age = try container.decode(String.self, forKey: Rime.Voice.CodingKeys.age) + self.country = try container.decode(String.self, forKey: Rime.Voice.CodingKeys.country) + self.region = try container.decode(String.self, forKey: Rime.Voice.CodingKeys.region) + self.demographic = try container.decode(String.self, forKey: Rime.Voice.CodingKeys.demographic) + self.genre = try container.decode([String].self, forKey: Rime.Voice.CodingKeys.genre) + } + + public func encode(to encoder: any Encoder) throws { + var container = encoder.container(keyedBy: Rime.Voice.CodingKeys.self) + try container.encode(self.id, forKey: Rime.Voice.CodingKeys.id) + try container.encode(self.name, forKey: Rime.Voice.CodingKeys.name) + try container.encode(self.age, forKey: Rime.Voice.CodingKeys.age) + try container.encode(self.country, forKey: Rime.Voice.CodingKeys.country) + try container.encode(self.region, forKey: Rime.Voice.CodingKeys.region) + try container.encode(self.demographic, forKey: Rime.Voice.CodingKeys.demographic) + try container.encode(self.genre, forKey: Rime.Voice.CodingKeys.genre) + } + + } +} diff --git a/Sources/Rime/Intramodular/Rime.Client.swift b/Sources/Rime/Intramodular/Rime.Client.swift index 16295a6d..ee0cbb51 100644 --- a/Sources/Rime/Intramodular/Rime.Client.swift +++ b/Sources/Rime/Intramodular/Rime.Client.swift @@ -14,6 +14,50 @@ import Swallow extension Rime { @RuntimeDiscoverable public final class Client: HTTPClient, _StaticSwift.Namespace { + public static var persistentTypeRepresentation: some IdentityRepresentation { + _MIServiceTypeIdentifier._Rime + } + public typealias API = Rime.APISpecification + public typealias Session = HTTPSession + + public let interface: API + public let session: Session + public var sessionCache: EmptyKeyedCache + + public required init(configuration: API.Configuration) { + self.interface = API(configuration: configuration) + self.session = HTTPSession.shared + self.sessionCache = .init() + } + + public convenience init(apiKey: String) { + self.init(configuration: .init(apiKey: apiKey)) + } + } +} + +extension Rime.Client: _MIService { + public convenience init( + account: (any _MIServiceAccount)? + ) async throws { + let account: any _MIServiceAccount = try account.unwrap() + let serviceIdentifier: _MIServiceTypeIdentifier = account.serviceIdentifier + + guard serviceIdentifier == _MIServiceTypeIdentifier._PlayHT else { + throw _MIServiceError.serviceTypeIncompatible(serviceIdentifier) + } + + guard let credential = account.credential as? _MIServiceAPIKeyCredential else { + throw _MIServiceError.invalidCredentials(account.credential) + } + + self.init(apiKey: credential.apiKey) + } +} + +extension Rime.Client { + public func getAllAvailableVoices() async throws -> [Rime.Voice] { + async let voice } } From 338ee59887dcef18b52181aafea9e53cb8281ebb Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Thu, 21 Nov 2024 15:02:16 -0700 Subject: [PATCH 021/271] Model --- Sources/Rime/Intramodular/Rime.Client.swift | 2 +- Sources/Rime/Intramodular/Rime.Model.swift | 41 +++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/Sources/Rime/Intramodular/Rime.Client.swift b/Sources/Rime/Intramodular/Rime.Client.swift index ee0cbb51..1ccc3f10 100644 --- a/Sources/Rime/Intramodular/Rime.Client.swift +++ b/Sources/Rime/Intramodular/Rime.Client.swift @@ -58,6 +58,6 @@ extension Rime.Client: _MIService { extension Rime.Client { public func getAllAvailableVoices() async throws -> [Rime.Voice] { - async let voice + try await run(\.listVoices).voices } } diff --git a/Sources/Rime/Intramodular/Rime.Model.swift b/Sources/Rime/Intramodular/Rime.Model.swift index e1c418ca..cc6e1f24 100644 --- a/Sources/Rime/Intramodular/Rime.Model.swift +++ b/Sources/Rime/Intramodular/Rime.Model.swift @@ -5,3 +5,44 @@ // Created by Jared Davidson on 11/21/24. // +import CoreMI +import CorePersistence +import Foundation +import Swift + +extension Rime { + public enum Model: String, Codable, Sendable { + case mist = "mist" + case v1 = "v1" + } +} + +// MARK: - Conformances + +extension Rime.Model: CustomStringConvertible { + public var description: String { + rawValue + } +} + +extension Rime.Model: ModelIdentifierRepresentable { + public init(from identifier: ModelIdentifier) throws { + guard identifier.provider == ._Rime, identifier.revision == nil else { + throw Never.Reason.illegal + } + + guard let model = Self(rawValue: identifier.name) else { + throw Never.Reason.unexpected + } + + self = model + } + + public func __conversion() throws -> ModelIdentifier { + ModelIdentifier( + provider: ._Rime, + name: rawValue, + revision: nil + ) + } +} From 8337564e109324af3b50d288de90f0d07e0cea97 Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Thu, 21 Nov 2024 15:11:38 -0700 Subject: [PATCH 022/271] text tp speech --- .../Rime.APISpecification.RequestBodies.swift | 17 ++++++++++++++++- .../Rime.APISpecification.ResponseBodies.swift | 18 ++++++++++++++++++ .../API/Rime.APISpecification.swift | 4 ++++ Sources/Rime/Intramodular/Rime.Client.swift | 17 +++++++++++++++++ 4 files changed, 55 insertions(+), 1 deletion(-) diff --git a/Sources/Rime/Intramodular/API/Rime.APISpecification.RequestBodies.swift b/Sources/Rime/Intramodular/API/Rime.APISpecification.RequestBodies.swift index be467c69..2d39e1e7 100644 --- a/Sources/Rime/Intramodular/API/Rime.APISpecification.RequestBodies.swift +++ b/Sources/Rime/Intramodular/API/Rime.APISpecification.RequestBodies.swift @@ -11,6 +11,21 @@ import Merge extension Rime.APISpecification { enum RequestBodies { - + public struct TextToSpeechInput: Codable { + + public let speaker: String + public let text: String + public let modelId: String + + public init( + speaker: String, + text: String, + modelId: String + ) { + self.speaker = speaker + self.text = text + self.modelId = modelId + } + } } } diff --git a/Sources/Rime/Intramodular/API/Rime.APISpecification.ResponseBodies.swift b/Sources/Rime/Intramodular/API/Rime.APISpecification.ResponseBodies.swift index f3371845..86a038d4 100644 --- a/Sources/Rime/Intramodular/API/Rime.APISpecification.ResponseBodies.swift +++ b/Sources/Rime/Intramodular/API/Rime.APISpecification.ResponseBodies.swift @@ -28,5 +28,23 @@ extension Rime.APISpecification { try container.encode(voices) } } + + public struct TextToSpeechOutput: Codable { + public let audioData: Data + + public init(audioData: Data) { + self.audioData = audioData + } + + public init(from decoder: Decoder) throws { + let container = try decoder.singleValueContainer() + self.audioData = try container.decode(Data.self) + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.singleValueContainer() + try container.encode(audioData) + } + } } } diff --git a/Sources/Rime/Intramodular/API/Rime.APISpecification.swift b/Sources/Rime/Intramodular/API/Rime.APISpecification.swift index c689a252..d041c381 100644 --- a/Sources/Rime/Intramodular/API/Rime.APISpecification.swift +++ b/Sources/Rime/Intramodular/API/Rime.APISpecification.swift @@ -62,6 +62,10 @@ extension Rime { @GET @Path("/data/voices/voice_details.json") var listVoices = Endpoint() + + @POST + @Path("/v1/rime-tts") + var textToSpeech = Endpoint() } } diff --git a/Sources/Rime/Intramodular/Rime.Client.swift b/Sources/Rime/Intramodular/Rime.Client.swift index 1ccc3f10..f579382c 100644 --- a/Sources/Rime/Intramodular/Rime.Client.swift +++ b/Sources/Rime/Intramodular/Rime.Client.swift @@ -60,4 +60,21 @@ extension Rime.Client { public func getAllAvailableVoices() async throws -> [Rime.Voice] { try await run(\.listVoices).voices } + + public func streamTextToSpeech( + text: String, + voice: String, + model: Rime.Model + ) async throws -> Data { + + let input = Rime.APISpecification.RequestBodies.TextToSpeechInput( + speaker: voice, + text: text, + modelId: model.rawValue + ) + + let responseData = try await run(\.textToSpeech, with: input) + + return responseData.audioData + } } From 39302c2e854674090193311a33146942bb56e122 Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Thu, 21 Nov 2024 16:20:09 -0700 Subject: [PATCH 023/271] Text to Speech --- .../Rime.APISpecification.RequestBodies.swift | 6 ++++ ...Rime.APISpecification.ResponseBodies.swift | 32 +++++++++++++---- .../API/Rime.APISpecification.swift | 9 +++-- .../Rime/Intramodular/Models/Rime.Voice.swift | 36 +++++++------------ Sources/Rime/Intramodular/Rime.Client.swift | 2 +- 5 files changed, 52 insertions(+), 33 deletions(-) diff --git a/Sources/Rime/Intramodular/API/Rime.APISpecification.RequestBodies.swift b/Sources/Rime/Intramodular/API/Rime.APISpecification.RequestBodies.swift index 2d39e1e7..f0348302 100644 --- a/Sources/Rime/Intramodular/API/Rime.APISpecification.RequestBodies.swift +++ b/Sources/Rime/Intramodular/API/Rime.APISpecification.RequestBodies.swift @@ -17,6 +17,12 @@ extension Rime.APISpecification { public let text: String public let modelId: String + enum CodingKeys: CodingKey { + case speaker + case text + case modelId + } + public init( speaker: String, text: String, diff --git a/Sources/Rime/Intramodular/API/Rime.APISpecification.ResponseBodies.swift b/Sources/Rime/Intramodular/API/Rime.APISpecification.ResponseBodies.swift index 86a038d4..1d053d23 100644 --- a/Sources/Rime/Intramodular/API/Rime.APISpecification.ResponseBodies.swift +++ b/Sources/Rime/Intramodular/API/Rime.APISpecification.ResponseBodies.swift @@ -30,20 +30,38 @@ extension Rime.APISpecification { } public struct TextToSpeechOutput: Codable { - public let audioData: Data + public let audioContent: Data - public init(audioData: Data) { - self.audioData = audioData + public init(audioContent: Data) { + self.audioContent = audioContent + } + + enum CodingKeys: String, CodingKey { + case audioContent } public init(from decoder: Decoder) throws { - let container = try decoder.singleValueContainer() - self.audioData = try container.decode(Data.self) + let container = try decoder.container(keyedBy: CodingKeys.self) + + let base64String = try container.decode(String.self, forKey: .audioContent) + + guard let audioData = Data(base64Encoded: base64String) else { + throw DecodingError.dataCorrupted( + DecodingError.Context( + codingPath: [CodingKeys.audioContent], + debugDescription: "Invalid base64 encoded string" + ) + ) + } + + self.audioContent = audioData } public func encode(to encoder: Encoder) throws { - var container = encoder.singleValueContainer() - try container.encode(audioData) + var container = encoder.container(keyedBy: CodingKeys.self) + + let base64String = audioContent.base64EncodedString() + try container.encode(base64String, forKey: .audioContent) } } } diff --git a/Sources/Rime/Intramodular/API/Rime.APISpecification.swift b/Sources/Rime/Intramodular/API/Rime.APISpecification.swift index d041c381..5bd75dc2 100644 --- a/Sources/Rime/Intramodular/API/Rime.APISpecification.swift +++ b/Sources/Rime/Intramodular/API/Rime.APISpecification.swift @@ -37,7 +37,7 @@ extension Rime { public var apiKey: String? public init( - host: URL = URL(string: "https://users.rime.ai/")!, + host: URL = URL(string: "https://users.rime.ai")!, apiKey: String? = nil ) { self.host = host @@ -65,6 +65,7 @@ extension Rime { @POST @Path("/v1/rime-tts") + @Body(json: \.input) var textToSpeech = Endpoint() } } @@ -80,9 +81,13 @@ extension Rime.APISpecification { context: context ) + guard let apiKey = context.root.configuration.apiKey, !apiKey.isEmpty else { + throw Rime.APIError.apiKeyMissing + } + request = request .header("Accept", "application/json") - .header("Authorization", "Bearer \(context.root.configuration.apiKey ?? "")") + .header(.authorization(.bearer, apiKey)) .header(.contentType(.json)) return request diff --git a/Sources/Rime/Intramodular/Models/Rime.Voice.swift b/Sources/Rime/Intramodular/Models/Rime.Voice.swift index 13ae4e43..9f6d7402 100644 --- a/Sources/Rime/Intramodular/Models/Rime.Voice.swift +++ b/Sources/Rime/Intramodular/Models/Rime.Voice.swift @@ -14,11 +14,11 @@ extension Rime { public let id: ID public let name: String - public let age: String - public let country: String - public let region: String - public let demographic: String - public let genre: [String] + public let age: String? + public let country: String? + public let region: String? + public let demographic: String? + public let genre: [String]? enum CodingKeys: CodingKey { case id @@ -32,25 +32,15 @@ extension Rime { public init(from decoder: any Decoder) throws { let container: KeyedDecodingContainer = try decoder.container(keyedBy: Rime.Voice.CodingKeys.self) - self.id = try container.decode(Rime.Voice.ID.self, forKey: Rime.Voice.CodingKeys.id) self.name = try container.decode(String.self, forKey: Rime.Voice.CodingKeys.name) - self.age = try container.decode(String.self, forKey: Rime.Voice.CodingKeys.age) - self.country = try container.decode(String.self, forKey: Rime.Voice.CodingKeys.country) - self.region = try container.decode(String.self, forKey: Rime.Voice.CodingKeys.region) - self.demographic = try container.decode(String.self, forKey: Rime.Voice.CodingKeys.demographic) - self.genre = try container.decode([String].self, forKey: Rime.Voice.CodingKeys.genre) - } - - public func encode(to encoder: any Encoder) throws { - var container = encoder.container(keyedBy: Rime.Voice.CodingKeys.self) - try container.encode(self.id, forKey: Rime.Voice.CodingKeys.id) - try container.encode(self.name, forKey: Rime.Voice.CodingKeys.name) - try container.encode(self.age, forKey: Rime.Voice.CodingKeys.age) - try container.encode(self.country, forKey: Rime.Voice.CodingKeys.country) - try container.encode(self.region, forKey: Rime.Voice.CodingKeys.region) - try container.encode(self.demographic, forKey: Rime.Voice.CodingKeys.demographic) - try container.encode(self.genre, forKey: Rime.Voice.CodingKeys.genre) + + self.id = .init(rawValue: self.name) + + self.age = try container.decodeIfPresent(String.self, forKey: Rime.Voice.CodingKeys.age) + self.country = try container.decodeIfPresent(String.self, forKey: Rime.Voice.CodingKeys.country) + self.region = try container.decodeIfPresent(String.self, forKey: Rime.Voice.CodingKeys.region) + self.demographic = try container.decodeIfPresent(String.self, forKey: Rime.Voice.CodingKeys.demographic) + self.genre = try container.decodeIfPresent([String].self, forKey: Rime.Voice.CodingKeys.genre) } - } } diff --git a/Sources/Rime/Intramodular/Rime.Client.swift b/Sources/Rime/Intramodular/Rime.Client.swift index f579382c..5afd9057 100644 --- a/Sources/Rime/Intramodular/Rime.Client.swift +++ b/Sources/Rime/Intramodular/Rime.Client.swift @@ -75,6 +75,6 @@ extension Rime.Client { let responseData = try await run(\.textToSpeech, with: input) - return responseData.audioData + return responseData.audioContent } } From 626c646925dc6b3695f75ab6594641c279036ed0 Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Fri, 22 Nov 2024 11:16:03 -0700 Subject: [PATCH 024/271] clean voice with url --- ...layHT.APISpecification.RequestBodies.swift | 33 +++++++++++++++++++ .../API/PlayHT.APISpecification.swift | 6 ++++ .../PlayHT/Intramodular/PlayHT.Client.swift | 17 ++++++++-- 3 files changed, 54 insertions(+), 2 deletions(-) diff --git a/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.RequestBodies.swift b/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.RequestBodies.swift index 8aa73eda..79ddf26e 100644 --- a/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.RequestBodies.swift +++ b/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.RequestBodies.swift @@ -116,5 +116,38 @@ extension PlayHT.APISpecification { return result } } + + public struct InstantCloneVoiceWithURLInput: Codable, Hashable, HTTPRequest.Multipart.ContentConvertible { + public let url: String + public let voiceName: String + + public init( + url: String, + voiceName: String + ) { + self.url = url + self.voiceName = voiceName + } + + public func __conversion() throws -> HTTPRequest.Multipart.Content { + var result: HTTPRequest.Multipart.Content = .init() + + result.append( + .string( + named: "sample_file_url", + value: url + ) + ) + + result.append( + .text( + named: "voice_name", + value: voiceName + ) + ) + + return result + } + } } } diff --git a/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.swift b/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.swift index f478bd72..525ef06d 100644 --- a/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.swift +++ b/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.swift @@ -83,6 +83,12 @@ extension PlayHT { @Body(multipart: .input) var instantCloneVoice = Endpoint() + // Clone Voice + @POST + @Path("/cloned-voices/instant") + @Body(multipart: .input) + var instantCloneVoiceWithURL = Endpoint() + // Delete cloned voice @DELETE @Path("/cloned-voices") diff --git a/Sources/PlayHT/Intramodular/PlayHT.Client.swift b/Sources/PlayHT/Intramodular/PlayHT.Client.swift index 41a370bf..e5ad9453 100644 --- a/Sources/PlayHT/Intramodular/PlayHT.Client.swift +++ b/Sources/PlayHT/Intramodular/PlayHT.Client.swift @@ -59,14 +59,14 @@ extension PlayHT.Client: _MIService { extension PlayHT.Client { public func getAllAvailableVoices() async throws -> [PlayHT.Voice] { - async let htVoices = playHTAvailableVoices() + async let htVoices = availableVoices() async let clonedVoices = clonedVoices() let (available, cloned) = try await (htVoices, clonedVoices) return available + cloned } - public func playHTAvailableVoices() async throws -> [PlayHT.Voice] { + public func availableVoices() async throws -> [PlayHT.Voice] { try await run(\.listVoices).voices } @@ -129,6 +129,19 @@ extension PlayHT.Client { return .init(rawValue: response.id) } + public func instantCloneVoice( + url: String, + name: String + ) async throws -> PlayHT.Voice.ID { + let input = PlayHT.APISpecification.RequestBodies.InstantCloneVoiceWithURLInput( + url: url, + voiceName: name + ) + + let response = try await run(\.instantCloneVoiceWithURL, with: input) + return .init(rawValue: response.id) + } + public func deleteClonedVoice( voice: PlayHT.Voice.ID ) async throws { From 1b8454b801f2e98d24486cef83a8c125f49fe1d6 Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Fri, 22 Nov 2024 13:41:56 -0700 Subject: [PATCH 025/271] update --- ...Rime.APISpecification.ResponseBodies.swift | 7 +- .../API/Rime.APISpecification.swift | 40 +++++++++++- .../Rime.Client.OutputAudioType.swift | 23 +++++++ Sources/Rime/Intramodular/Rime.Client.swift | 64 +++++++++++++++++-- 4 files changed, 128 insertions(+), 6 deletions(-) create mode 100644 Sources/Rime/Intramodular/Rime.Client.OutputAudioType.swift diff --git a/Sources/Rime/Intramodular/API/Rime.APISpecification.ResponseBodies.swift b/Sources/Rime/Intramodular/API/Rime.APISpecification.ResponseBodies.swift index 1d053d23..4e3d9ace 100644 --- a/Sources/Rime/Intramodular/API/Rime.APISpecification.ResponseBodies.swift +++ b/Sources/Rime/Intramodular/API/Rime.APISpecification.ResponseBodies.swift @@ -11,7 +11,7 @@ import Merge extension Rime.APISpecification { enum ResponseBodies { - public struct Voices: Codable { + public struct VoiceDetails: Codable { public let voices: [Rime.Voice] public init(voices: [Rime.Voice]) { @@ -29,6 +29,11 @@ extension Rime.APISpecification { } } + struct Voices: Codable { + let v1: [String] + let mist: [String] + } + public struct TextToSpeechOutput: Codable { public let audioContent: Data diff --git a/Sources/Rime/Intramodular/API/Rime.APISpecification.swift b/Sources/Rime/Intramodular/API/Rime.APISpecification.swift index 5bd75dc2..f376be10 100644 --- a/Sources/Rime/Intramodular/API/Rime.APISpecification.swift +++ b/Sources/Rime/Intramodular/API/Rime.APISpecification.swift @@ -61,12 +61,50 @@ extension Rime { @GET @Path("/data/voices/voice_details.json") + var listVoiceDetails = Endpoint() + + @GET + @Path("/data/voices/voices/all.json") var listVoices = Endpoint() + // Streaming Audio + @POST + @Path("/v1/rime-tts") + @Body(json: \.input) + var streamTextToSpeechMP3 = Endpoint() + + // TODO: - Fix below + + @POST + @Path("/v1/rime-tts") + @Body(json: \.input) + var streamTextToSpeechPCM = Endpoint() + + @POST + @Path("/v1/rime-tts") + @Body(json: \.input) + var streamTextToSpeechMULAW = Endpoint() + + // Non-Streaming Audio + @POST + @Path("/v1/rime-tts") + @Body(json: \.input) + var textToSpeechMP3 = Endpoint() + + @POST + @Path("/v1/rime-tts") + @Body(json: \.input) + var textToSpeechWAV = Endpoint() + + @POST + @Path("/v1/rime-tts") + @Body(json: \.input) + var textToSpeechOGG = Endpoint() + @POST @Path("/v1/rime-tts") @Body(json: \.input) - var textToSpeech = Endpoint() + var textToSpeechMULAW = Endpoint() } } diff --git a/Sources/Rime/Intramodular/Rime.Client.OutputAudioType.swift b/Sources/Rime/Intramodular/Rime.Client.OutputAudioType.swift new file mode 100644 index 00000000..ca92c513 --- /dev/null +++ b/Sources/Rime/Intramodular/Rime.Client.OutputAudioType.swift @@ -0,0 +1,23 @@ +// +// Rime.OutputAudioType.swift +// AI +// +// Created by Jared Davidson on 11/22/24. +// + +import Swift + +extension Rime.Client { + public enum StreamOutputAudioType { + case MP3 + case PCM + case MULAW + } + + public enum OutputAudioType { + case MP3 + case WAV + case OGG + case MULAW + } +} diff --git a/Sources/Rime/Intramodular/Rime.Client.swift b/Sources/Rime/Intramodular/Rime.Client.swift index 5afd9057..cbb8d388 100644 --- a/Sources/Rime/Intramodular/Rime.Client.swift +++ b/Sources/Rime/Intramodular/Rime.Client.swift @@ -57,13 +57,25 @@ extension Rime.Client: _MIService { } extension Rime.Client { - public func getAllAvailableVoices() async throws -> [Rime.Voice] { - try await run(\.listVoices).voices + public func getAllAvailableVoiceDetails() async throws -> [Rime.Voice] { + try await run(\.listVoiceDetails).voices + } + + public func getAllAvailableVoices( + model: Rime.Model + ) async throws -> [String] { + switch model { + case .mist: + return try await run(\.listVoices).mist + case .v1: + return try await run(\.listVoices).v1 + } } public func streamTextToSpeech( text: String, voice: String, + outputAudio: StreamOutputAudioType, model: Rime.Model ) async throws -> Data { @@ -73,8 +85,52 @@ extension Rime.Client { modelId: model.rawValue ) - let responseData = try await run(\.textToSpeech, with: input) + switch outputAudio { + case .MP3: + let responseData = try await run(\.streamTextToSpeechMP3, with: input) + + return responseData.audioContent + case .PCM: + let responseData = try await run(\.streamTextToSpeechPCM, with: input) + + return responseData.audioContent + case .MULAW: + let responseData = try await run(\.streamTextToSpeechMULAW, with: input) + + return responseData.audioContent + } + } + + public func textToSpeech( + text: String, + voice: String, + outputAudio: OutputAudioType, + model: Rime.Model + ) async throws -> Data { + + let input = Rime.APISpecification.RequestBodies.TextToSpeechInput( + speaker: voice, + text: text, + modelId: model.rawValue + ) - return responseData.audioContent + switch outputAudio { + case .MP3: + let responseData = try await run(\.textToSpeechMP3, with: input) + + return responseData.audioContent + case .WAV: + let responseData = try await run(\.textToSpeechWAV, with: input) + + return responseData.audioContent + case .OGG: + let responseData = try await run(\.textToSpeechOGG, with: input) + + return responseData.audioContent + case .MULAW: + let responseData = try await run(\.textToSpeechMULAW, with: input) + + return responseData.audioContent + } } } From 67a5485a37b27ff1499729cbc71315de709fc3e9 Mon Sep 17 00:00:00 2001 From: Vatsal Manot Date: Sat, 23 Nov 2024 04:00:46 +0530 Subject: [PATCH 026/271] Update package --- .../Anthropic.Client+CoreMI.swift | 14 +-- .../Intramodular/Anthropic.Client.swift | 2 +- .../Cohere/Intramodular/Cohere.Client.swift | 16 +-- .../Foundation/CoreMI.Context.swift | 32 +++++ ...ing.swift => CoreMI.RequestHandling.swift} | 0 .../Intramodular/Foundation/MIContext.swift | 30 ----- .../CoreMI._ServiceAccountProtocol.swift | 35 ++++++ .../CoreMI._ServiceClientProtocol.swift | 29 +++++ .../CoreMI._ServiceCredentialProtocol.swift | 53 +++++++++ .../CoreMI._ServiceCredentialTypes.swift | 58 +++++++++ .../CoreMI._ServiceVendorIdentifier.swift | 52 +++++++++ .../Intramodular/Service/_MIService.swift | 16 --- .../Service/_MIServiceAccount.swift | 26 ----- .../Service/_MIServiceCredential.swift | 44 ------- .../Service/_MIServiceTypeIdentifier.swift | 43 ------- .../Intramodular/TTS/SpeechSynthesizers.swift | 25 ++++ Sources/CoreMI/module.swift | 4 + .../Intramodular/ElevenLabs.Voice.swift | 25 ++-- .../ElevenLabs.VoiceSettings.swift | 110 ++++++++---------- Sources/Groq/Intramodular/Groq.Client.swift | 16 +-- Sources/Jina/Intramodular/Jina.Client.swift | 16 +-- .../LLMs/AbstractLLM.Capability.swift | 5 +- .../AbstractLLM.ChatCompletionDecodable.swift | 2 +- .../LLMs/Chat/AbstractLLM.ChatPrompt.swift | 2 +- .../PromptLiteralConvertible.swift | 2 +- .../Text Embeddings/_RawTextEmbedding.swift | 2 +- .../Mistral/Intramodular/Mistral.Client.swift | 16 +-- Sources/Ollama/Intramodular/Ollama.swift | 12 +- .../Intramodular/OpenAI.Client+CoreMI.swift | 14 +-- .../OpenAI/Intramodular/OpenAI.Client.swift | 2 +- .../Intramodular/Perplexity.Client.swift | 16 +-- .../PlayHT/Intramodular/PlayHT.Client.swift | 16 +-- .../Rime.APISpecification.RequestBodies.swift | 43 +++---- ...Rime.APISpecification.ResponseBodies.swift | 27 ++--- .../Rime/Intramodular/Models/Rime.Voice.swift | 52 ++++----- Sources/Rime/Intramodular/Rime.Client.swift | 53 +++++---- .../Intramodular/TogetherAI.Client.swift | 16 +-- .../Intramodular/VoyageAI.Client.swift | 16 +-- 38 files changed, 535 insertions(+), 407 deletions(-) create mode 100644 Sources/CoreMI/Intramodular/Foundation/CoreMI.Context.swift rename Sources/CoreMI/Intramodular/Foundation/{_MIRequestHandling.swift => CoreMI.RequestHandling.swift} (100%) delete mode 100644 Sources/CoreMI/Intramodular/Foundation/MIContext.swift create mode 100644 Sources/CoreMI/Intramodular/Service/CoreMI._ServiceAccountProtocol.swift create mode 100644 Sources/CoreMI/Intramodular/Service/CoreMI._ServiceClientProtocol.swift create mode 100644 Sources/CoreMI/Intramodular/Service/CoreMI._ServiceCredentialProtocol.swift create mode 100644 Sources/CoreMI/Intramodular/Service/CoreMI._ServiceCredentialTypes.swift create mode 100644 Sources/CoreMI/Intramodular/Service/CoreMI._ServiceVendorIdentifier.swift delete mode 100644 Sources/CoreMI/Intramodular/Service/_MIService.swift delete mode 100644 Sources/CoreMI/Intramodular/Service/_MIServiceAccount.swift delete mode 100644 Sources/CoreMI/Intramodular/Service/_MIServiceCredential.swift delete mode 100644 Sources/CoreMI/Intramodular/Service/_MIServiceTypeIdentifier.swift create mode 100644 Sources/CoreMI/Intramodular/TTS/SpeechSynthesizers.swift diff --git a/Sources/Anthropic/Intramodular/Anthropic.Client+CoreMI.swift b/Sources/Anthropic/Intramodular/Anthropic.Client+CoreMI.swift index a9b176ab..07eed3bd 100644 --- a/Sources/Anthropic/Intramodular/Anthropic.Client+CoreMI.swift +++ b/Sources/Anthropic/Intramodular/Anthropic.Client+CoreMI.swift @@ -8,17 +8,17 @@ import Swallow extension Anthropic.Client: _MIService { public convenience init( - account: (any _MIServiceAccount)? + account: (any CoreMI._ServiceAccountProtocol)? ) async throws { - let account: any _MIServiceAccount = try account.unwrap() - let serviceIdentifier: _MIServiceTypeIdentifier = account.serviceIdentifier + let account: any CoreMI._ServiceAccountProtocol = try account.unwrap() + let serviceVendorIdentifier: CoreMI._ServiceVendorIdentifier = try account.serviceVendorIdentifier.unwrap() - guard serviceIdentifier == _MIServiceTypeIdentifier._Anthropic else { - throw _MIServiceError.serviceTypeIncompatible(serviceIdentifier) + guard serviceVendorIdentifier == CoreMI._ServiceVendorIdentifier._Anthropic else { + throw CoreMI._ServiceClientError.incompatibleVendor(serviceVendorIdentifier) } - guard let credential = account.credential as? _MIServiceAPIKeyCredential else { - throw _MIServiceError.invalidCredentials(account.credential) + guard let credential = try account.credential as? CoreMI._ServiceCredentialTypes.APIKeyCredential else { + throw CoreMI._ServiceClientError.invalidCredential(try account.credential) } self.init(apiKey: credential.apiKey) diff --git a/Sources/Anthropic/Intramodular/Anthropic.Client.swift b/Sources/Anthropic/Intramodular/Anthropic.Client.swift index 73b2a514..89345627 100644 --- a/Sources/Anthropic/Intramodular/Anthropic.Client.swift +++ b/Sources/Anthropic/Intramodular/Anthropic.Client.swift @@ -11,7 +11,7 @@ extension Anthropic { @RuntimeDiscoverable public final class Client: HTTPClient, PersistentlyRepresentableType, _StaticSwift.Namespace { public static var persistentTypeRepresentation: some IdentityRepresentation { - _MIServiceTypeIdentifier._Anthropic + CoreMI._ServiceVendorIdentifier._Anthropic } public let interface: API diff --git a/Sources/Cohere/Intramodular/Cohere.Client.swift b/Sources/Cohere/Intramodular/Cohere.Client.swift index aa6e9d98..06d0f5c8 100644 --- a/Sources/Cohere/Intramodular/Cohere.Client.swift +++ b/Sources/Cohere/Intramodular/Cohere.Client.swift @@ -12,7 +12,7 @@ extension Cohere { @RuntimeDiscoverable public final class Client: HTTPClient, _StaticSwift.Namespace { public static var persistentTypeRepresentation: some IdentityRepresentation { - _MIServiceTypeIdentifier._Cohere + CoreMI._ServiceVendorIdentifier._Cohere } public let interface: APISpecification @@ -34,17 +34,17 @@ extension Cohere { extension Cohere.Client: _MIService { public convenience init( - account: (any _MIServiceAccount)? + account: (any CoreMI._ServiceAccountProtocol)? ) async throws { - let account: any _MIServiceAccount = try account.unwrap() - let serviceIdentifier: _MIServiceTypeIdentifier = account.serviceIdentifier + let account: any CoreMI._ServiceAccountProtocol = try account.unwrap() + let serviceVendorIdentifier: CoreMI._ServiceVendorIdentifier = try account.serviceVendorIdentifier.unwrap() - guard serviceIdentifier == _MIServiceTypeIdentifier._Cohere else { - throw _MIServiceError.serviceTypeIncompatible(serviceIdentifier) + guard serviceVendorIdentifier == CoreMI._ServiceVendorIdentifier._Cohere else { + throw CoreMI._ServiceClientError.incompatibleVendor(serviceVendorIdentifier) } - guard let credential = account.credential as? _MIServiceAPIKeyCredential else { - throw _MIServiceError.invalidCredentials(account.credential) + guard let credential = try account.credential as? CoreMI._ServiceCredentialTypes.APIKeyCredential else { + throw CoreMI._ServiceClientError.invalidCredential(try account.credential) } self.init(apiKey: credential.apiKey) diff --git a/Sources/CoreMI/Intramodular/Foundation/CoreMI.Context.swift b/Sources/CoreMI/Intramodular/Foundation/CoreMI.Context.swift new file mode 100644 index 00000000..60058ae8 --- /dev/null +++ b/Sources/CoreMI/Intramodular/Foundation/CoreMI.Context.swift @@ -0,0 +1,32 @@ +// +// Copyright (c) Vatsal Manot +// + +import Combine +import Swallow +import SwiftDI + +extension CoreMI { + /// A context for machine intelligence. + public final class Context: ObservableObject { + @Published public var handlers: [any CoreMI.RequestHandling] = [] + + public func add(_ x: T) { + handlers.append(x) + } + + public func _firstHandler(ofType type: T.Type) async throws -> T { + try handlers.first(byUnwrapping: { try? cast($0, to: type) }).unwrap() + } + } +} + +public enum CoreMI { + public protocol Request { + + } + + public protocol RequestResult { + + } +} diff --git a/Sources/CoreMI/Intramodular/Foundation/_MIRequestHandling.swift b/Sources/CoreMI/Intramodular/Foundation/CoreMI.RequestHandling.swift similarity index 100% rename from Sources/CoreMI/Intramodular/Foundation/_MIRequestHandling.swift rename to Sources/CoreMI/Intramodular/Foundation/CoreMI.RequestHandling.swift diff --git a/Sources/CoreMI/Intramodular/Foundation/MIContext.swift b/Sources/CoreMI/Intramodular/Foundation/MIContext.swift deleted file mode 100644 index a3137b17..00000000 --- a/Sources/CoreMI/Intramodular/Foundation/MIContext.swift +++ /dev/null @@ -1,30 +0,0 @@ -// -// Copyright (c) Vatsal Manot -// - -import Combine -import Swallow -import SwiftDI - -/// A context for machine intelligence. -public final class MIContext: ObservableObject { - @Published public var handlers: [any CoreMI.RequestHandling] = [] - - public func add(_ x: T) { - handlers.append(x) - } - - public func _firstHandler(ofType type: T.Type) async throws -> T { - try handlers.first(byUnwrapping: { try? cast($0, to: type) }).unwrap() - } -} - -public enum CoreMI { - public protocol Request { - - } - - public protocol RequestResult { - - } -} diff --git a/Sources/CoreMI/Intramodular/Service/CoreMI._ServiceAccountProtocol.swift b/Sources/CoreMI/Intramodular/Service/CoreMI._ServiceAccountProtocol.swift new file mode 100644 index 00000000..5d8280e8 --- /dev/null +++ b/Sources/CoreMI/Intramodular/Service/CoreMI._ServiceAccountProtocol.swift @@ -0,0 +1,35 @@ +// +// Copyright (c) Vatsal Manot +// + +import CorePersistence +import Swallow + +extension CoreMI { + /// An account used to authenticate access to a service. + public protocol _ServiceAccountProtocol: Hashable { + var serviceVendorIdentifier: CoreMI._ServiceVendorIdentifier? { get throws } + var credential: (any CoreMI._ServiceCredentialProtocol)? { get throws } + } + + public struct _AnyServiceAccount: _MIServiceAccount { + public let serviceVendorIdentifier: CoreMI._ServiceVendorIdentifier? + @_HashableExistential + public var credential: (any CoreMI._ServiceCredentialProtocol)? + + public init( + serviceVendorIdentifier: CoreMI._ServiceVendorIdentifier?, + credential: (any CoreMI._ServiceCredentialProtocol)? + ) { + self.serviceVendorIdentifier = serviceVendorIdentifier + self.credential = credential + } + } +} + +// MARK: - Deprecated + +@available(*, deprecated) +public typealias _MIServiceAccount = CoreMI._ServiceAccountProtocol +@available(*, deprecated) +public typealias _AnyMIServiceAccount = CoreMI._AnyServiceAccount diff --git a/Sources/CoreMI/Intramodular/Service/CoreMI._ServiceClientProtocol.swift b/Sources/CoreMI/Intramodular/Service/CoreMI._ServiceClientProtocol.swift new file mode 100644 index 00000000..9fd23037 --- /dev/null +++ b/Sources/CoreMI/Intramodular/Service/CoreMI._ServiceClientProtocol.swift @@ -0,0 +1,29 @@ +// +// Copyright (c) Vatsal Manot +// + +import CorePersistence +import Swallow + +extension CoreMI { + /// A client for an AI/ML service. + public protocol _ServiceClientProtocol: PersistentlyRepresentableType { + init(account: (any CoreMI._ServiceAccountProtocol)?) async throws + } + + public enum _ServiceClientError: Error { + case incompatibleVendor(CoreMI._ServiceVendorIdentifier) + case invalidCredential((any CoreMI._ServiceCredentialProtocol)?) + + public static var invalidCredential: Self { + Self.invalidCredential(nil) + } + } +} + +// MARK: - Deprecated + +@available(*, deprecated) +public typealias _MIService = CoreMI._ServiceClientProtocol +@available(*, deprecated) +public typealias _MIServiceError = CoreMI._ServiceClientError diff --git a/Sources/CoreMI/Intramodular/Service/CoreMI._ServiceCredentialProtocol.swift b/Sources/CoreMI/Intramodular/Service/CoreMI._ServiceCredentialProtocol.swift new file mode 100644 index 00000000..399e8c21 --- /dev/null +++ b/Sources/CoreMI/Intramodular/Service/CoreMI._ServiceCredentialProtocol.swift @@ -0,0 +1,53 @@ +// +// Copyright (c) Vatsal Manot +// + +import CorePersistence +import Swift + +extension CoreMI { + public protocol _ServiceCredentialProtocol: Codable, Hashable, Sendable { + var credentialType: CoreMI._ServiceCredentialTypeIdentifier { get } + } +} + +// MARK: - Conformees + +extension CoreMI._ServiceCredentialTypes { + public struct APIKeyCredential: CoreMI._ServiceCredentialProtocol { + public var credentialType: CoreMI._ServiceCredentialTypeIdentifier { + CoreMI._ServiceCredentialTypeIdentifier.apiKey + } + + public let apiKey: String + + public init(apiKey: String) { + self.apiKey = apiKey + } + } +} + +extension CoreMI._ServiceCredentialTypes { + @HadeanIdentifier("jikok-fafan-nadij-javub") + public struct PlayHTCredential: CoreMI._ServiceCredentialProtocol { + public var credentialType: CoreMI._ServiceCredentialTypeIdentifier { + .custom(Self.self) + } + + public let userID: String + public let apiKey: String + + public init( + userID: String, + apiKey: String + ) { + self.userID = userID + self.apiKey = apiKey + } + } +} + +// MARK: - Deprecated + +@available(*, deprecated, renamed: "CoreMI._ServiceCredentialTypes.APIKeyCredential") +public typealias _MIServiceAPIKeyCredential = CoreMI._ServiceCredentialTypes.APIKeyCredential diff --git a/Sources/CoreMI/Intramodular/Service/CoreMI._ServiceCredentialTypes.swift b/Sources/CoreMI/Intramodular/Service/CoreMI._ServiceCredentialTypes.swift new file mode 100644 index 00000000..dbe90c8b --- /dev/null +++ b/Sources/CoreMI/Intramodular/Service/CoreMI._ServiceCredentialTypes.swift @@ -0,0 +1,58 @@ +// +// Copyright (c) Vatsal Manot +// + +import CorePersistence +import Swift + +extension CoreMI { + public enum _ServiceCredentialTypes { + + } +} + +extension CoreMI { + public enum _ServiceCredentialTypeIdentifier: Codable, Hashable, RawRepresentable, Sendable { + case apiKey + case custom(HadeanIdentifier) + + public var rawValue: String { + switch self { + case .apiKey: + return "apiKey" + case .custom(let id): + return id.description + } + } + + public init?(rawValue: String) { + switch rawValue { + case CoreMI._ServiceCredentialTypeIdentifier.apiKey.rawValue: + self = .apiKey + default: + if let identifier = HadeanIdentifier(rawValue) { + self = .custom(identifier) + } else { + return nil + } + } + } + + public static func custom(_ type: T.Type) -> Self { + return .custom(type.hadeanIdentifier) + } + + public func encode(to encoder: any Encoder) throws { + try rawValue.encode(to: encoder) + } + + public init(from decoder: any Decoder) throws { + self = try Self(rawValue: String(from: decoder)).unwrap() + } + } +} + +// MARK: - Deprecated + +@available(*, deprecated, renamed: "CoreMI._ServiceCredentialTypeIdentifier") +public typealias _MIServiceCredentialType = CoreMI._ServiceCredentialTypeIdentifier diff --git a/Sources/CoreMI/Intramodular/Service/CoreMI._ServiceVendorIdentifier.swift b/Sources/CoreMI/Intramodular/Service/CoreMI._ServiceVendorIdentifier.swift new file mode 100644 index 00000000..02d956ba --- /dev/null +++ b/Sources/CoreMI/Intramodular/Service/CoreMI._ServiceVendorIdentifier.swift @@ -0,0 +1,52 @@ +// +// Copyright (c) Vatsal Manot +// + +import CorePersistence +import Swift + +extension CoreMI { + public struct _ServiceVendorIdentifier: Codable, Hashable, RawRepresentable, Sendable { + public let rawValue: HadeanIdentifier + + public init(rawValue: HadeanIdentifier) { + self.rawValue = rawValue + } + } + + public protocol _ServiceVendorIdentifierConvertible { + func __conversion() throws -> CoreMI._ServiceVendorIdentifier + } +} + +extension CoreMI._ServiceVendorIdentifier: PersistentIdentifier { + public var body: some IdentityRepresentation { + rawValue + } +} + +extension CoreMI._ServiceVendorIdentifier { + public static let _Anthropic = CoreMI._ServiceVendorIdentifier(rawValue: "puhif-pudav-gujir-nubup") + public static let _Cohere = CoreMI._ServiceVendorIdentifier(rawValue: "guzob-fipin-navij-duvon") + public static let _ElevenLabs = CoreMI._ServiceVendorIdentifier(rawValue: "jatap-jogaz-ritiz-vibok") + public static let _Fal = CoreMI._ServiceVendorIdentifier(rawValue: "povar-firul-milij-jopat") + public static let _Groq = CoreMI._ServiceVendorIdentifier(rawValue: "jabub-potuv-juniv-nodik") + public static let _HuggingFace = CoreMI._ServiceVendorIdentifier(rawValue: "jutot-gugal-luzoh-vorig") + public static let _Mistral = CoreMI._ServiceVendorIdentifier(rawValue: "vogas-fohig-mokij-titun") + public static let _Ollama = CoreMI._ServiceVendorIdentifier(rawValue: "sotap-boris-navam-mitoh") + public static let _OpenAI = CoreMI._ServiceVendorIdentifier(rawValue: "vodih-vakam-hiduz-tosob") + public static let _Perplexity = CoreMI._ServiceVendorIdentifier(rawValue: "dohug-muboz-bopuz-kasar") + public static let _PlayHT = CoreMI._ServiceVendorIdentifier(rawValue: "foluv-jufuk-zuhok-hofid") + public static let _Replicate = CoreMI._ServiceVendorIdentifier(rawValue: "dovon-vatig-posov-luvis") + public static let _Rime = CoreMI._ServiceVendorIdentifier(rawValue: "tohaz-zivir-bosov-minog") + public static let _Jina = CoreMI._ServiceVendorIdentifier(rawValue: "bozud-sipup-natin-bizif") + public static let _TogetherAI = CoreMI._ServiceVendorIdentifier(rawValue: "pafob-vopoj-lurig-zilur") + public static let _VoyageAI = CoreMI._ServiceVendorIdentifier(rawValue: "hajat-fufoh-janaf-disam") +} + +// MARK: - Deprecated + +@available(*, deprecated) +public typealias _MIServiceTypeIdentifier = CoreMI._ServiceVendorIdentifier +@available(*, deprecated) +public typealias _MIServiceTypeIdentifierConvertible = CoreMI._ServiceVendorIdentifierConvertible diff --git a/Sources/CoreMI/Intramodular/Service/_MIService.swift b/Sources/CoreMI/Intramodular/Service/_MIService.swift deleted file mode 100644 index 7dcf937d..00000000 --- a/Sources/CoreMI/Intramodular/Service/_MIService.swift +++ /dev/null @@ -1,16 +0,0 @@ -// -// Copyright (c) Vatsal Manot -// - -import CorePersistence -import Swallow - -/// A machine intelligence service. -public protocol _MIService: PersistentlyRepresentableType { - init(account: (any _MIServiceAccount)?) async throws -} - -public enum _MIServiceError: Error { - case serviceTypeIncompatible(_MIServiceTypeIdentifier) - case invalidCredentials((any _MIServiceCredential)?) -} diff --git a/Sources/CoreMI/Intramodular/Service/_MIServiceAccount.swift b/Sources/CoreMI/Intramodular/Service/_MIServiceAccount.swift deleted file mode 100644 index 0a32b59c..00000000 --- a/Sources/CoreMI/Intramodular/Service/_MIServiceAccount.swift +++ /dev/null @@ -1,26 +0,0 @@ -// -// Copyright (c) Vatsal Manot -// - -import CorePersistence -import Swallow - -/// An account used to authenticate access to a service. -public protocol _MIServiceAccount: Hashable { - var serviceIdentifier: _MIServiceTypeIdentifier { get } - var credential: (any _MIServiceCredential)? { get } -} - -public struct _AnyMIServiceAccount: _MIServiceAccount { - public let serviceIdentifier: _MIServiceTypeIdentifier - @_HashableExistential - public var credential: (any _MIServiceCredential)? - - public init( - serviceIdentifier: _MIServiceTypeIdentifier, - credential: (any _MIServiceCredential)? - ) { - self.serviceIdentifier = serviceIdentifier - self.credential = credential - } -} diff --git a/Sources/CoreMI/Intramodular/Service/_MIServiceCredential.swift b/Sources/CoreMI/Intramodular/Service/_MIServiceCredential.swift deleted file mode 100644 index 8873349c..00000000 --- a/Sources/CoreMI/Intramodular/Service/_MIServiceCredential.swift +++ /dev/null @@ -1,44 +0,0 @@ -// -// Copyright (c) Vatsal Manot -// - -import CorePersistence -import Swift - -public enum _MIServiceCredentialType: String, PersistentIdentifier { - case apiKey = "apiKey" - case userIDAndAPIKey = "userIDAndAPIKey" -} - -public protocol _MIServiceCredential: Codable, Hashable, Sendable { - var credentialType: _MIServiceCredentialType { get } -} - -public struct _MIServiceAPIKeyCredential: _MIServiceCredential { - public var credentialType: _MIServiceCredentialType { - _MIServiceCredentialType.apiKey - } - - public let apiKey: String - - public init(apiKey: String) { - self.apiKey = apiKey - } -} - -public struct _MIServiceUserIDAndAPIKeyCredential: _MIServiceCredential { - public var credentialType: _MIServiceCredentialType { - _MIServiceCredentialType.userIDAndAPIKey - } - - public let userID: String - public let apiKey: String - - public init( - userID: String, - apiKey: String - ) { - self.userID = userID - self.apiKey = apiKey - } -} diff --git a/Sources/CoreMI/Intramodular/Service/_MIServiceTypeIdentifier.swift b/Sources/CoreMI/Intramodular/Service/_MIServiceTypeIdentifier.swift deleted file mode 100644 index babec233..00000000 --- a/Sources/CoreMI/Intramodular/Service/_MIServiceTypeIdentifier.swift +++ /dev/null @@ -1,43 +0,0 @@ -// -// Copyright (c) Vatsal Manot -// - -import CorePersistence -import Swift - -public struct _MIServiceTypeIdentifier: Codable, Hashable, RawRepresentable, Sendable { - public let rawValue: HadeanIdentifier - - public init(rawValue: HadeanIdentifier) { - self.rawValue = rawValue - } -} - -public protocol _MIServiceTypeIdentifierConvertible { - func __conversion() throws -> _MIServiceTypeIdentifier -} - -extension _MIServiceTypeIdentifier: PersistentIdentifier { - public var body: some IdentityRepresentation { - rawValue - } -} - -extension _MIServiceTypeIdentifier { - public static let _Anthropic = _MIServiceTypeIdentifier(rawValue: "puhif-pudav-gujir-nubup") - public static let _Fal = _MIServiceTypeIdentifier(rawValue: "povar-firul-milij-jopat") - public static let _HuggingFace = _MIServiceTypeIdentifier(rawValue: "jutot-gugal-luzoh-vorig") - public static let _Mistral = _MIServiceTypeIdentifier(rawValue: "vogas-fohig-mokij-titun") - public static let _Groq = _MIServiceTypeIdentifier(rawValue: "jabub-potuv-juniv-nodik") - public static let _Ollama = _MIServiceTypeIdentifier(rawValue: "sotap-boris-navam-mitoh") - public static let _OpenAI = _MIServiceTypeIdentifier(rawValue: "vodih-vakam-hiduz-tosob") - public static let _Perplexity = _MIServiceTypeIdentifier(rawValue: "dohug-muboz-bopuz-kasar") - public static let _Replicate = _MIServiceTypeIdentifier(rawValue: "dovon-vatig-posov-luvis") - public static let _ElevenLabs = _MIServiceTypeIdentifier(rawValue: "jatap-jogaz-ritiz-vibok") - public static let _Jina = _MIServiceTypeIdentifier(rawValue: "bozud-sipup-natin-bizif") - public static let _VoyageAI = _MIServiceTypeIdentifier(rawValue: "hajat-fufoh-janaf-disam") - public static let _Cohere = _MIServiceTypeIdentifier(rawValue: "guzob-fipin-navij-duvon") - public static let _TogetherAI = _MIServiceTypeIdentifier(rawValue: "pafob-vopoj-lurig-zilur") - public static let _PlayHT = _MIServiceTypeIdentifier(rawValue: "foluv-jufuk-zuhok-hofid") - public static let _Rime = _MIServiceTypeIdentifier(rawValue: "tohaz-zivir-bosov-minog") -} diff --git a/Sources/CoreMI/Intramodular/TTS/SpeechSynthesizers.swift b/Sources/CoreMI/Intramodular/TTS/SpeechSynthesizers.swift new file mode 100644 index 00000000..1a9f944f --- /dev/null +++ b/Sources/CoreMI/Intramodular/TTS/SpeechSynthesizers.swift @@ -0,0 +1,25 @@ +// +// Copyright (c) Vatsal Manot +// + +import CorePersistence +import Swift + +public enum SpeechSynthesizers { + +} + +extension SpeechSynthesizers { + public protocol VoiceName: Codable, Hashable, Identifiable { + + } +} + +extension SpeechSynthesizers { + public struct AnyVoiceName: SpeechSynthesizers.VoiceName { + public var id: AnyPersistentIdentifier + public var displayName: String + public var userInfo: UserInfo + } +} + diff --git a/Sources/CoreMI/module.swift b/Sources/CoreMI/module.swift index 58f26b20..a52c526d 100644 --- a/Sources/CoreMI/module.swift +++ b/Sources/CoreMI/module.swift @@ -11,9 +11,13 @@ public enum _module { // MARK: - Deprecated +@available(*, deprecated, renamed: "CoreMI.Context") +public typealias MIContext = CoreMI.Context @available(*, deprecated, renamed: "ModelIdentifier") public typealias _MLModelIdentifier = ModelIdentifier @available(*, deprecated, renamed: "ModelIdentifierConvertible") public typealias _MLModelIdentifierConvertible = ModelIdentifierConvertible @available(*, deprecated, renamed: "ModelIdentifier.Provider") public typealias MLModelProvider = ModelIdentifier.Provider +@available(*, deprecated, renamed: "CoreMI._ServiceCredentialProtocol") +public typealias _MIServiceCredential = CoreMI._ServiceCredentialProtocol diff --git a/Sources/ElevenLabs/Intramodular/ElevenLabs.Voice.swift b/Sources/ElevenLabs/Intramodular/ElevenLabs.Voice.swift index 6c9b83fc..3a54532f 100644 --- a/Sources/ElevenLabs/Intramodular/ElevenLabs.Voice.swift +++ b/Sources/ElevenLabs/Intramodular/ElevenLabs.Voice.swift @@ -6,14 +6,13 @@ import Foundation import Swift extension ElevenLabs { - // MARK: - Voice Model - public struct Voice: Codable, Hashable, Identifiable, Sendable { + public struct Voice: Hashable, Identifiable, Sendable { public typealias ID = _TypeAssociatedID public let voiceID: String public let name: String public let description: String? - public let isOwner: Bool + public let isOwner: Bool? public var id: ID { ID(rawValue: voiceID) @@ -23,19 +22,23 @@ extension ElevenLabs { voiceID: String, name: String, description: String?, - isOwner: Bool + isOwner: Bool? ) { self.voiceID = voiceID self.name = name self.description = description self.isOwner = isOwner } - - enum CodingKeys: String, CodingKey { - case voiceID = "voiceId" - case name - case description - case isOwner - } + } +} + +// MARK: - Conformances + +extension ElevenLabs.Voice: Codable { + enum CodingKeys: String, CodingKey { + case voiceID = "voiceId" + case name + case description + case isOwner } } diff --git a/Sources/ElevenLabs/Intramodular/ElevenLabs.VoiceSettings.swift b/Sources/ElevenLabs/Intramodular/ElevenLabs.VoiceSettings.swift index 1c5bd481..1ffb7947 100644 --- a/Sources/ElevenLabs/Intramodular/ElevenLabs.VoiceSettings.swift +++ b/Sources/ElevenLabs/Intramodular/ElevenLabs.VoiceSettings.swift @@ -6,7 +6,6 @@ import Foundation extension ElevenLabs { public struct VoiceSettings: Codable, Sendable, Hashable { - public enum Setting: String, Codable, Sendable { case stability case similarityBoost = "similarity_boost" @@ -30,70 +29,20 @@ extension ElevenLabs { public var removeBackgroundNoise: Bool - public init(stability: Double, - similarityBoost: Double, - styleExaggeration: Double, - speakerBoost: Bool, - removeBackgroundNoise: Bool) { - self.stability = max(0, min(1, stability)) - self.similarityBoost = max(0, min(1, similarityBoost)) - self.styleExaggeration = max(0, min(1, styleExaggeration)) - self.speakerBoost = speakerBoost - self.removeBackgroundNoise = removeBackgroundNoise - } - - public init(stability: Double? = nil, - similarityBoost: Double? = nil, - styleExaggeration: Double? = nil, - speakerBoost: Bool? = nil, - removeBackgroundNoise: Bool? = nil) { + public init( + stability: Double? = nil, + similarityBoost: Double? = nil, + styleExaggeration: Double? = nil, + speakerBoost: Bool? = nil, + removeBackgroundNoise: Bool? = nil + ) { self.stability = stability.map { max(0, min(1, $0)) } ?? 0.5 self.similarityBoost = similarityBoost.map { max(0, min(1, $0)) } ?? 0.75 self.styleExaggeration = styleExaggeration.map { max(0, min(1, $0)) } ?? 0 self.speakerBoost = speakerBoost ?? true self.removeBackgroundNoise = removeBackgroundNoise ?? false } - - public init(stability: Double) { - self.init( - stability: stability, - similarityBoost: 0.75, - styleExaggeration: 0, - speakerBoost: true, - removeBackgroundNoise: false - ) - } - - public init(similarityBoost: Double) { - self.init( - stability: 0.5, - similarityBoost: similarityBoost, - styleExaggeration: 0, - speakerBoost: true, - removeBackgroundNoise: false - ) - } - - public init(styleExaggeration: Double) { - self.init( - stability: 0.5, - similarityBoost: 0.75, - styleExaggeration: styleExaggeration, - speakerBoost: true, - removeBackgroundNoise: false - ) - } - - public init(speakerBoost: Bool) { - self.init( - stability: 0.5, - similarityBoost: 0.75, - styleExaggeration: 0, - speakerBoost: speakerBoost, - removeBackgroundNoise: false - ) - } - + public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) @@ -106,3 +55,46 @@ extension ElevenLabs { } } +// MARK: - Initializers + +extension ElevenLabs.VoiceSettings { + public init(stability: Double) { + self.init( + stability: stability, + similarityBoost: nil, + styleExaggeration: nil, + speakerBoost: nil, + removeBackgroundNoise: nil + ) + } + + public init(similarityBoost: Double) { + self.init( + stability: nil, + similarityBoost: similarityBoost, + styleExaggeration: nil, + speakerBoost: nil, + removeBackgroundNoise: nil + ) + } + + public init(styleExaggeration: Double) { + self.init( + stability: nil, + similarityBoost: nil, + styleExaggeration: styleExaggeration, + speakerBoost: true, + removeBackgroundNoise: nil + ) + } + + public init(speakerBoost: Bool) { + self.init( + stability: nil, + similarityBoost: nil, + styleExaggeration: nil, + speakerBoost: speakerBoost, + removeBackgroundNoise: nil + ) + } +} diff --git a/Sources/Groq/Intramodular/Groq.Client.swift b/Sources/Groq/Intramodular/Groq.Client.swift index 4ad01e41..8679de76 100644 --- a/Sources/Groq/Intramodular/Groq.Client.swift +++ b/Sources/Groq/Intramodular/Groq.Client.swift @@ -12,7 +12,7 @@ extension Groq { @RuntimeDiscoverable public final class Client: HTTPClient, _StaticSwift.Namespace { public static var persistentTypeRepresentation: some IdentityRepresentation { - _MIServiceTypeIdentifier._Groq + CoreMI._ServiceVendorIdentifier._Groq } public let interface: APISpecification @@ -34,17 +34,17 @@ extension Groq { extension Groq.Client: _MIService { public convenience init( - account: (any _MIServiceAccount)? + account: (any CoreMI._ServiceAccountProtocol)? ) async throws { - let account: any _MIServiceAccount = try account.unwrap() - let serviceIdentifier: _MIServiceTypeIdentifier = account.serviceIdentifier + let account: any CoreMI._ServiceAccountProtocol = try account.unwrap() + let serviceVendorIdentifier: CoreMI._ServiceVendorIdentifier = try account.serviceVendorIdentifier.unwrap() - guard serviceIdentifier == _MIServiceTypeIdentifier._Groq else { - throw _MIServiceError.serviceTypeIncompatible(serviceIdentifier) + guard serviceVendorIdentifier == CoreMI._ServiceVendorIdentifier._Groq else { + throw CoreMI._ServiceClientError.incompatibleVendor(serviceVendorIdentifier) } - guard let credential = account.credential as? _MIServiceAPIKeyCredential else { - throw _MIServiceError.invalidCredentials(account.credential) + guard let credential = try account.credential as? CoreMI._ServiceCredentialTypes.APIKeyCredential else { + throw CoreMI._ServiceClientError.invalidCredential(try account.credential) } self.init(apiKey: credential.apiKey) diff --git a/Sources/Jina/Intramodular/Jina.Client.swift b/Sources/Jina/Intramodular/Jina.Client.swift index 6f50b710..c52d9d80 100644 --- a/Sources/Jina/Intramodular/Jina.Client.swift +++ b/Sources/Jina/Intramodular/Jina.Client.swift @@ -12,7 +12,7 @@ extension Jina { @RuntimeDiscoverable public final class Client: HTTPClient, _StaticSwift.Namespace { public static var persistentTypeRepresentation: some IdentityRepresentation { - _MIServiceTypeIdentifier._Jina + CoreMI._ServiceVendorIdentifier._Jina } public let interface: APISpecification @@ -34,17 +34,17 @@ extension Jina { extension Jina.Client: _MIService { public convenience init( - account: (any _MIServiceAccount)? + account: (any CoreMI._ServiceAccountProtocol)? ) async throws { - let account: any _MIServiceAccount = try account.unwrap() - let serviceIdentifier: _MIServiceTypeIdentifier = account.serviceIdentifier + let account: any CoreMI._ServiceAccountProtocol = try account.unwrap() + let serviceVendorIdentifier: CoreMI._ServiceVendorIdentifier = try account.serviceVendorIdentifier.unwrap() - guard serviceIdentifier == _MIServiceTypeIdentifier._Jina else { - throw _MIServiceError.serviceTypeIncompatible(serviceIdentifier) + guard serviceVendorIdentifier == CoreMI._ServiceVendorIdentifier._Jina else { + throw CoreMI._ServiceClientError.incompatibleVendor(serviceVendorIdentifier) } - guard let credential = account.credential as? _MIServiceAPIKeyCredential else { - throw _MIServiceError.invalidCredentials(account.credential) + guard let credential = try account.credential as? CoreMI._ServiceCredentialTypes.APIKeyCredential else { + throw CoreMI._ServiceClientError.invalidCredential(try account.credential) } self.init(apiKey: credential.apiKey) diff --git a/Sources/LargeLanguageModels/Intramodular/LLMs/AbstractLLM.Capability.swift b/Sources/LargeLanguageModels/Intramodular/LLMs/AbstractLLM.Capability.swift index 736c3e06..3ccc3696 100644 --- a/Sources/LargeLanguageModels/Intramodular/LLMs/AbstractLLM.Capability.swift +++ b/Sources/LargeLanguageModels/Intramodular/LLMs/AbstractLLM.Capability.swift @@ -5,5 +5,8 @@ import SwiftUIX extension AbstractLLM { - + public enum Capability { + case functionCalling + case vision + } } diff --git a/Sources/LargeLanguageModels/Intramodular/LLMs/AbstractLLM.ChatCompletionDecodable.swift b/Sources/LargeLanguageModels/Intramodular/LLMs/AbstractLLM.ChatCompletionDecodable.swift index ac45184e..ca505c17 100644 --- a/Sources/LargeLanguageModels/Intramodular/LLMs/AbstractLLM.ChatCompletionDecodable.swift +++ b/Sources/LargeLanguageModels/Intramodular/LLMs/AbstractLLM.ChatCompletionDecodable.swift @@ -45,7 +45,7 @@ extension AbstractLLM.ChatCompletion { } } -// MARK: - Implemented Conformances +// MARK: - Conformees extension AbstractLLM.ChatFunctionCall: AbstractLLM.ChatCompletionDecodable { public static func decode( diff --git a/Sources/LargeLanguageModels/Intramodular/LLMs/Chat/AbstractLLM.ChatPrompt.swift b/Sources/LargeLanguageModels/Intramodular/LLMs/Chat/AbstractLLM.ChatPrompt.swift index 54e31443..60654d65 100644 --- a/Sources/LargeLanguageModels/Intramodular/LLMs/Chat/AbstractLLM.ChatPrompt.swift +++ b/Sources/LargeLanguageModels/Intramodular/LLMs/Chat/AbstractLLM.ChatPrompt.swift @@ -1,5 +1,5 @@ // -// Copyright (c) Vatsal Manot +// Copyright (c) Vatsal Manot // import CorePersistence diff --git a/Sources/LargeLanguageModels/Intramodular/Prompt Literal/PromptLiteralConvertible.swift b/Sources/LargeLanguageModels/Intramodular/Prompt Literal/PromptLiteralConvertible.swift index c47f626e..2a8d65cb 100644 --- a/Sources/LargeLanguageModels/Intramodular/Prompt Literal/PromptLiteralConvertible.swift +++ b/Sources/LargeLanguageModels/Intramodular/Prompt Literal/PromptLiteralConvertible.swift @@ -20,7 +20,7 @@ extension PromptLiteralConvertible { } } -// MARK: - Implemented Conformances +// MARK: - Conformees extension String: _PromptLiteralConvertible { public func _toPromptLiteral() throws -> PromptLiteral { diff --git a/Sources/LargeLanguageModels/Intramodular/Text Embeddings/_RawTextEmbedding.swift b/Sources/LargeLanguageModels/Intramodular/Text Embeddings/_RawTextEmbedding.swift index 910c7719..49917001 100644 --- a/Sources/LargeLanguageModels/Intramodular/Text Embeddings/_RawTextEmbedding.swift +++ b/Sources/LargeLanguageModels/Intramodular/Text Embeddings/_RawTextEmbedding.swift @@ -21,7 +21,7 @@ public struct _RawTextEmbedding: Hashable, Sendable { } } -// MARK: - Implemented Conformances +// MARK: - Conformees extension _RawTextEmbedding: Codable { @inlinable diff --git a/Sources/Mistral/Intramodular/Mistral.Client.swift b/Sources/Mistral/Intramodular/Mistral.Client.swift index 563baca7..3647e1b3 100644 --- a/Sources/Mistral/Intramodular/Mistral.Client.swift +++ b/Sources/Mistral/Intramodular/Mistral.Client.swift @@ -12,7 +12,7 @@ extension Mistral { @RuntimeDiscoverable public final class Client: HTTPClient, _StaticSwift.Namespace { public static var persistentTypeRepresentation: some IdentityRepresentation { - _MIServiceTypeIdentifier._Mistral + CoreMI._ServiceVendorIdentifier._Mistral } public let interface: APISpecification @@ -34,17 +34,17 @@ extension Mistral { extension Mistral.Client: _MIService { public convenience init( - account: (any _MIServiceAccount)? + account: (any CoreMI._ServiceAccountProtocol)? ) async throws { - let account: any _MIServiceAccount = try account.unwrap() - let serviceIdentifier: _MIServiceTypeIdentifier = account.serviceIdentifier + let account: any CoreMI._ServiceAccountProtocol = try account.unwrap() + let serviceVendorIdentifier: CoreMI._ServiceVendorIdentifier = try account.serviceVendorIdentifier.unwrap() - guard serviceIdentifier == _MIServiceTypeIdentifier._Mistral else { - throw _MIServiceError.serviceTypeIncompatible(serviceIdentifier) + guard serviceVendorIdentifier == CoreMI._ServiceVendorIdentifier._Mistral else { + throw CoreMI._ServiceClientError.incompatibleVendor(serviceVendorIdentifier) } - guard let credential = account.credential as? _MIServiceAPIKeyCredential else { - throw _MIServiceError.invalidCredentials(account.credential) + guard let credential = try account.credential as? CoreMI._ServiceCredentialTypes.APIKeyCredential else { + throw CoreMI._ServiceClientError.invalidCredential(try account.credential) } self.init(apiKey: credential.apiKey) diff --git a/Sources/Ollama/Intramodular/Ollama.swift b/Sources/Ollama/Intramodular/Ollama.swift index 2b3046c3..77e3ad27 100644 --- a/Sources/Ollama/Intramodular/Ollama.swift +++ b/Sources/Ollama/Intramodular/Ollama.swift @@ -78,7 +78,7 @@ extension Ollama { extension Ollama: PersistentlyRepresentableType { public static var persistentTypeRepresentation: some IdentityRepresentation { - _MIServiceTypeIdentifier._Ollama + CoreMI._ServiceVendorIdentifier._Ollama } } @@ -88,13 +88,13 @@ extension Ollama: _MIService { extension _MIService where Self == Ollama { public init( - account: (any _MIServiceAccount)? + account: (any CoreMI._ServiceAccountProtocol)? ) async throws { - let account: any _MIServiceAccount = try account.unwrap() - let serviceIdentifier: _MIServiceTypeIdentifier = account.serviceIdentifier + let account: any CoreMI._ServiceAccountProtocol = try account.unwrap() + let serviceVendorIdentifier: CoreMI._ServiceVendorIdentifier = try account.serviceVendorIdentifier.unwrap() - guard serviceIdentifier == _MIServiceTypeIdentifier._Ollama else { - throw _MIServiceError.serviceTypeIncompatible(serviceIdentifier) + guard serviceVendorIdentifier == CoreMI._ServiceVendorIdentifier._Ollama else { + throw CoreMI._ServiceClientError.incompatibleVendor(serviceVendorIdentifier) } self = .shared diff --git a/Sources/OpenAI/Intramodular/OpenAI.Client+CoreMI.swift b/Sources/OpenAI/Intramodular/OpenAI.Client+CoreMI.swift index 778281ec..32fceea4 100644 --- a/Sources/OpenAI/Intramodular/OpenAI.Client+CoreMI.swift +++ b/Sources/OpenAI/Intramodular/OpenAI.Client+CoreMI.swift @@ -7,17 +7,17 @@ import CorePersistence extension OpenAI.Client: _MIService { public convenience init( - account: (any _MIServiceAccount)? + account: (any CoreMI._ServiceAccountProtocol)? ) async throws { - let account: any _MIServiceAccount = try account.unwrap() - let serviceIdentifier: _MIServiceTypeIdentifier = account.serviceIdentifier + let account: any CoreMI._ServiceAccountProtocol = try account.unwrap() + let serviceVendorIdentifier: CoreMI._ServiceVendorIdentifier = try account.serviceVendorIdentifier.unwrap() - guard serviceIdentifier == _MIServiceTypeIdentifier._OpenAI else { - throw _MIServiceError.serviceTypeIncompatible(serviceIdentifier) + guard serviceVendorIdentifier == CoreMI._ServiceVendorIdentifier._OpenAI else { + throw CoreMI._ServiceClientError.incompatibleVendor(serviceVendorIdentifier) } - guard let credential = account.credential as? _MIServiceAPIKeyCredential else { - throw _MIServiceError.invalidCredentials(account.credential) + guard let credential = try account.credential as? CoreMI._ServiceCredentialTypes.APIKeyCredential else { + throw CoreMI._ServiceClientError.invalidCredential(try account.credential) } self.init(apiKey: credential.apiKey) diff --git a/Sources/OpenAI/Intramodular/OpenAI.Client.swift b/Sources/OpenAI/Intramodular/OpenAI.Client.swift index 581022f7..a128059c 100644 --- a/Sources/OpenAI/Intramodular/OpenAI.Client.swift +++ b/Sources/OpenAI/Intramodular/OpenAI.Client.swift @@ -206,7 +206,7 @@ extension OpenAI.Client: _MaybeAsyncProtocol { extension OpenAI.Client: PersistentlyRepresentableType { public static var persistentTypeRepresentation: some IdentityRepresentation { - _MIServiceTypeIdentifier._OpenAI + CoreMI._ServiceVendorIdentifier._OpenAI } } diff --git a/Sources/Perplexity/Intramodular/Perplexity.Client.swift b/Sources/Perplexity/Intramodular/Perplexity.Client.swift index 8816d702..aac5a6a5 100644 --- a/Sources/Perplexity/Intramodular/Perplexity.Client.swift +++ b/Sources/Perplexity/Intramodular/Perplexity.Client.swift @@ -12,7 +12,7 @@ extension Perplexity { @RuntimeDiscoverable public final class Client: HTTPClient, _StaticSwift.Namespace { public static var persistentTypeRepresentation: some IdentityRepresentation { - _MIServiceTypeIdentifier._Perplexity + CoreMI._ServiceVendorIdentifier._Perplexity } public let interface: APISpecification @@ -34,17 +34,17 @@ extension Perplexity { extension Perplexity.Client: _MIService { public convenience init( - account: (any _MIServiceAccount)? + account: (any CoreMI._ServiceAccountProtocol)? ) async throws { - let account: any _MIServiceAccount = try account.unwrap() - let serviceIdentifier: _MIServiceTypeIdentifier = account.serviceIdentifier + let account: any CoreMI._ServiceAccountProtocol = try account.unwrap() + let serviceVendorIdentifier: CoreMI._ServiceVendorIdentifier = try account.serviceVendorIdentifier.unwrap() - guard serviceIdentifier == _MIServiceTypeIdentifier._Perplexity else { - throw _MIServiceError.serviceTypeIncompatible(serviceIdentifier) + guard serviceVendorIdentifier == CoreMI._ServiceVendorIdentifier._Perplexity else { + throw CoreMI._ServiceClientError.incompatibleVendor(serviceVendorIdentifier) } - guard let credential = account.credential as? _MIServiceAPIKeyCredential else { - throw _MIServiceError.invalidCredentials(account.credential) + guard let credential = try account.credential as? CoreMI._ServiceCredentialTypes.APIKeyCredential else { + throw CoreMI._ServiceClientError.invalidCredential(try account.credential) } self.init(apiKey: credential.apiKey) diff --git a/Sources/PlayHT/Intramodular/PlayHT.Client.swift b/Sources/PlayHT/Intramodular/PlayHT.Client.swift index e5ad9453..22fed003 100644 --- a/Sources/PlayHT/Intramodular/PlayHT.Client.swift +++ b/Sources/PlayHT/Intramodular/PlayHT.Client.swift @@ -15,7 +15,7 @@ extension PlayHT { @RuntimeDiscoverable public final class Client: HTTPClient, _StaticSwift.Namespace { public static var persistentTypeRepresentation: some IdentityRepresentation { - _MIServiceTypeIdentifier._PlayHT + CoreMI._ServiceVendorIdentifier._PlayHT } public typealias API = PlayHT.APISpecification @@ -39,17 +39,17 @@ extension PlayHT { extension PlayHT.Client: _MIService { public convenience init( - account: (any _MIServiceAccount)? + account: (any CoreMI._ServiceAccountProtocol)? ) async throws { - let account: any _MIServiceAccount = try account.unwrap() - let serviceIdentifier: _MIServiceTypeIdentifier = account.serviceIdentifier + let account: any CoreMI._ServiceAccountProtocol = try account.unwrap() + let serviceVendorIdentifier: CoreMI._ServiceVendorIdentifier = try account.serviceVendorIdentifier.unwrap() - guard serviceIdentifier == _MIServiceTypeIdentifier._PlayHT else { - throw _MIServiceError.serviceTypeIncompatible(serviceIdentifier) + guard serviceVendorIdentifier == CoreMI._ServiceVendorIdentifier._PlayHT else { + throw CoreMI._ServiceClientError.incompatibleVendor(serviceVendorIdentifier) } - guard let credential = account.credential as? _MIServiceUserIDAndAPIKeyCredential else { - throw _MIServiceError.invalidCredentials(account.credential) + guard let credential = try account.credential as? CoreMI._ServiceCredentialTypes.PlayHTCredential else { + throw CoreMI._ServiceClientError.invalidCredential(try account.credential) } self.init(apiKey: credential.apiKey, userID: credential.userID) diff --git a/Sources/Rime/Intramodular/API/Rime.APISpecification.RequestBodies.swift b/Sources/Rime/Intramodular/API/Rime.APISpecification.RequestBodies.swift index f0348302..6aa5a1c6 100644 --- a/Sources/Rime/Intramodular/API/Rime.APISpecification.RequestBodies.swift +++ b/Sources/Rime/Intramodular/API/Rime.APISpecification.RequestBodies.swift @@ -11,27 +11,30 @@ import Merge extension Rime.APISpecification { enum RequestBodies { - public struct TextToSpeechInput: Codable { + + } +} - public let speaker: String - public let text: String - public let modelId: String - - enum CodingKeys: CodingKey { - case speaker - case text - case modelId - } - - public init( - speaker: String, - text: String, - modelId: String - ) { - self.speaker = speaker - self.text = text - self.modelId = modelId - } +extension Rime.APISpecification.RequestBodies { + struct TextToSpeechInput: Codable { + fileprivate enum CodingKeys: String, CodingKey { + case speaker + case text + case modelID = "modelId" + } + + let speaker: String + let text: String + let modelID: String + + init( + speaker: String, + text: String, + modelID: String + ) { + self.speaker = speaker + self.text = text + self.modelID = modelID } } } diff --git a/Sources/Rime/Intramodular/API/Rime.APISpecification.ResponseBodies.swift b/Sources/Rime/Intramodular/API/Rime.APISpecification.ResponseBodies.swift index 1d053d23..a1889a49 100644 --- a/Sources/Rime/Intramodular/API/Rime.APISpecification.ResponseBodies.swift +++ b/Sources/Rime/Intramodular/API/Rime.APISpecification.ResponseBodies.swift @@ -14,7 +14,9 @@ extension Rime.APISpecification { public struct Voices: Codable { public let voices: [Rime.Voice] - public init(voices: [Rime.Voice]) { + public init( + voices: [Rime.Voice] + ) { self.voices = voices } @@ -30,37 +32,28 @@ extension Rime.APISpecification { } public struct TextToSpeechOutput: Codable { + fileprivate enum CodingKeys: String, CodingKey { + case audioContent + } + public let audioContent: Data public init(audioContent: Data) { self.audioContent = audioContent } - - enum CodingKeys: String, CodingKey { - case audioContent - } - + public init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) - let base64String = try container.decode(String.self, forKey: .audioContent) - guard let audioData = Data(base64Encoded: base64String) else { - throw DecodingError.dataCorrupted( - DecodingError.Context( - codingPath: [CodingKeys.audioContent], - debugDescription: "Invalid base64 encoded string" - ) - ) - } - - self.audioContent = audioData + self.audioContent = try Data(base64Encoded: base64String).unwrap() } public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) let base64String = audioContent.base64EncodedString() + try container.encode(base64String, forKey: .audioContent) } } diff --git a/Sources/Rime/Intramodular/Models/Rime.Voice.swift b/Sources/Rime/Intramodular/Models/Rime.Voice.swift index 9f6d7402..1a341b41 100644 --- a/Sources/Rime/Intramodular/Models/Rime.Voice.swift +++ b/Sources/Rime/Intramodular/Models/Rime.Voice.swift @@ -9,38 +9,38 @@ import Foundation import Swallow extension Rime { - public struct Voice: Codable, Hashable, Identifiable { - public typealias ID = _TypeAssociatedID - - public let id: ID + public struct Voice: Hashable { public let name: String public let age: String? public let country: String? public let region: String? public let demographic: String? public let genre: [String]? - - enum CodingKeys: CodingKey { - case id - case name - case age - case country - case region - case demographic - case genre - } - - public init(from decoder: any Decoder) throws { - let container: KeyedDecodingContainer = try decoder.container(keyedBy: Rime.Voice.CodingKeys.self) - self.name = try container.decode(String.self, forKey: Rime.Voice.CodingKeys.name) - - self.id = .init(rawValue: self.name) + } +} + +// MARK: - Conformances - self.age = try container.decodeIfPresent(String.self, forKey: Rime.Voice.CodingKeys.age) - self.country = try container.decodeIfPresent(String.self, forKey: Rime.Voice.CodingKeys.country) - self.region = try container.decodeIfPresent(String.self, forKey: Rime.Voice.CodingKeys.region) - self.demographic = try container.decodeIfPresent(String.self, forKey: Rime.Voice.CodingKeys.demographic) - self.genre = try container.decodeIfPresent([String].self, forKey: Rime.Voice.CodingKeys.genre) - } +extension Rime.Voice: Codable { + enum CodingKeys: CodingKey { + case name + case age + case country + case region + case demographic + case genre + } + + public init( + from decoder: any Decoder + ) throws { + let container: KeyedDecodingContainer = try decoder.container(keyedBy: Rime.Voice.CodingKeys.self) + + self.name = try container.decode(String.self, forKey: Rime.Voice.CodingKeys.name) + self.age = try container.decodeIfPresent(String.self, forKey: Rime.Voice.CodingKeys.age) + self.country = try container.decodeIfPresent(String.self, forKey: Rime.Voice.CodingKeys.country) + self.region = try container.decodeIfPresent(String.self, forKey: Rime.Voice.CodingKeys.region) + self.demographic = try container.decodeIfPresent(String.self, forKey: Rime.Voice.CodingKeys.demographic) + self.genre = try container.decodeIfPresent([String].self, forKey: Rime.Voice.CodingKeys.genre) } } diff --git a/Sources/Rime/Intramodular/Rime.Client.swift b/Sources/Rime/Intramodular/Rime.Client.swift index 5afd9057..15994d26 100644 --- a/Sources/Rime/Intramodular/Rime.Client.swift +++ b/Sources/Rime/Intramodular/Rime.Client.swift @@ -15,7 +15,7 @@ extension Rime { @RuntimeDiscoverable public final class Client: HTTPClient, _StaticSwift.Namespace { public static var persistentTypeRepresentation: some IdentityRepresentation { - _MIServiceTypeIdentifier._Rime + CoreMI._ServiceVendorIdentifier._Rime } public typealias API = Rime.APISpecification @@ -25,37 +25,22 @@ extension Rime { public let session: Session public var sessionCache: EmptyKeyedCache - public required init(configuration: API.Configuration) { + public required init( + configuration: API.Configuration + ) { self.interface = API(configuration: configuration) self.session = HTTPSession.shared self.sessionCache = .init() } - public convenience init(apiKey: String) { + public convenience init( + apiKey: String + ) { self.init(configuration: .init(apiKey: apiKey)) } } } -extension Rime.Client: _MIService { - public convenience init( - account: (any _MIServiceAccount)? - ) async throws { - let account: any _MIServiceAccount = try account.unwrap() - let serviceIdentifier: _MIServiceTypeIdentifier = account.serviceIdentifier - - guard serviceIdentifier == _MIServiceTypeIdentifier._PlayHT else { - throw _MIServiceError.serviceTypeIncompatible(serviceIdentifier) - } - - guard let credential = account.credential as? _MIServiceAPIKeyCredential else { - throw _MIServiceError.invalidCredentials(account.credential) - } - - self.init(apiKey: credential.apiKey) - } -} - extension Rime.Client { public func getAllAvailableVoices() async throws -> [Rime.Voice] { try await run(\.listVoices).voices @@ -66,11 +51,10 @@ extension Rime.Client { voice: String, model: Rime.Model ) async throws -> Data { - let input = Rime.APISpecification.RequestBodies.TextToSpeechInput( speaker: voice, text: text, - modelId: model.rawValue + modelID: model.rawValue ) let responseData = try await run(\.textToSpeech, with: input) @@ -78,3 +62,24 @@ extension Rime.Client { return responseData.audioContent } } + +// MARK: - Conformances + +extension Rime.Client: _MIService { + public convenience init( + account: (any CoreMI._ServiceAccountProtocol)? + ) async throws { + let account: any CoreMI._ServiceAccountProtocol = try account.unwrap() + let serviceVendorIdentifier: CoreMI._ServiceVendorIdentifier = try account.serviceVendorIdentifier.unwrap() + + guard serviceVendorIdentifier == CoreMI._ServiceVendorIdentifier._PlayHT else { + throw CoreMI._ServiceClientError.incompatibleVendor(serviceVendorIdentifier) + } + + guard let credential = try account.credential as? CoreMI._ServiceCredentialTypes.APIKeyCredential else { + throw CoreMI._ServiceClientError.invalidCredential(try account.credential) + } + + self.init(apiKey: credential.apiKey) + } +} diff --git a/Sources/TogetherAI/Intramodular/TogetherAI.Client.swift b/Sources/TogetherAI/Intramodular/TogetherAI.Client.swift index 972f62a9..1a0e8b5f 100644 --- a/Sources/TogetherAI/Intramodular/TogetherAI.Client.swift +++ b/Sources/TogetherAI/Intramodular/TogetherAI.Client.swift @@ -12,7 +12,7 @@ extension TogetherAI { @RuntimeDiscoverable public final class Client: HTTPClient, _StaticSwift.Namespace { public static var persistentTypeRepresentation: some IdentityRepresentation { - _MIServiceTypeIdentifier._TogetherAI + CoreMI._ServiceVendorIdentifier._TogetherAI } public let interface: APISpecification @@ -34,17 +34,17 @@ extension TogetherAI { extension TogetherAI.Client: _MIService { public convenience init( - account: (any _MIServiceAccount)? + account: (any CoreMI._ServiceAccountProtocol)? ) async throws { - let account: any _MIServiceAccount = try account.unwrap() - let serviceIdentifier: _MIServiceTypeIdentifier = account.serviceIdentifier + let account: any CoreMI._ServiceAccountProtocol = try account.unwrap() + let serviceVendorIdentifier: CoreMI._ServiceVendorIdentifier = try account.serviceVendorIdentifier.unwrap() - guard serviceIdentifier == _MIServiceTypeIdentifier._TogetherAI else { - throw _MIServiceError.serviceTypeIncompatible(serviceIdentifier) + guard serviceVendorIdentifier == CoreMI._ServiceVendorIdentifier._TogetherAI else { + throw CoreMI._ServiceClientError.incompatibleVendor(serviceVendorIdentifier) } - guard let credential = account.credential as? _MIServiceAPIKeyCredential else { - throw _MIServiceError.invalidCredentials(account.credential) + guard let credential = try account.credential as? CoreMI._ServiceCredentialTypes.APIKeyCredential else { + throw CoreMI._ServiceClientError.invalidCredential(try account.credential) } self.init(apiKey: credential.apiKey) diff --git a/Sources/VoyageAI/Intramodular/VoyageAI.Client.swift b/Sources/VoyageAI/Intramodular/VoyageAI.Client.swift index b77111a1..e0ffaf1e 100644 --- a/Sources/VoyageAI/Intramodular/VoyageAI.Client.swift +++ b/Sources/VoyageAI/Intramodular/VoyageAI.Client.swift @@ -12,7 +12,7 @@ extension VoyageAI { @RuntimeDiscoverable public final class Client: HTTPClient, _StaticSwift.Namespace { public static var persistentTypeRepresentation: some IdentityRepresentation { - _MIServiceTypeIdentifier._VoyageAI + CoreMI._ServiceVendorIdentifier._VoyageAI } public let interface: APISpecification @@ -34,17 +34,17 @@ extension VoyageAI { extension VoyageAI.Client: _MIService { public convenience init( - account: (any _MIServiceAccount)? + account: (any CoreMI._ServiceAccountProtocol)? ) async throws { - let account: any _MIServiceAccount = try account.unwrap() - let serviceIdentifier: _MIServiceTypeIdentifier = account.serviceIdentifier + let account: any CoreMI._ServiceAccountProtocol = try account.unwrap() + let serviceVendorIdentifier: CoreMI._ServiceVendorIdentifier = try account.serviceVendorIdentifier.unwrap() - guard serviceIdentifier == _MIServiceTypeIdentifier._VoyageAI else { - throw _MIServiceError.serviceTypeIncompatible(serviceIdentifier) + guard serviceVendorIdentifier == CoreMI._ServiceVendorIdentifier._VoyageAI else { + throw CoreMI._ServiceClientError.incompatibleVendor(serviceVendorIdentifier) } - guard let credential = account.credential as? _MIServiceAPIKeyCredential else { - throw _MIServiceError.invalidCredentials(account.credential) + guard let credential = try account.credential as? CoreMI._ServiceCredentialTypes.APIKeyCredential else { + throw CoreMI._ServiceClientError.invalidCredential(try account.credential) } self.init(apiKey: credential.apiKey) From cf8952a265c58acca9d8f11502c3a072bcd28c69 Mon Sep 17 00:00:00 2001 From: Vatsal Manot Date: Sat, 23 Nov 2024 04:07:20 +0530 Subject: [PATCH 027/271] Update package --- .../TTS/SpeechSynthesizers.VoiceName.swift | 28 +++++++++++++++++++ .../Intramodular/TTS/SpeechSynthesizers.swift | 15 ---------- 2 files changed, 28 insertions(+), 15 deletions(-) create mode 100644 Sources/CoreMI/Intramodular/TTS/SpeechSynthesizers.VoiceName.swift diff --git a/Sources/CoreMI/Intramodular/TTS/SpeechSynthesizers.VoiceName.swift b/Sources/CoreMI/Intramodular/TTS/SpeechSynthesizers.VoiceName.swift new file mode 100644 index 00000000..a33239d2 --- /dev/null +++ b/Sources/CoreMI/Intramodular/TTS/SpeechSynthesizers.VoiceName.swift @@ -0,0 +1,28 @@ +// +// Copyright (c) Vatsal Manot +// + +import CorePersistence +import Swift + +extension SpeechSynthesizers { + public protocol VoiceName: Codable, Hashable, Identifiable { + + } +} + +extension SpeechSynthesizers { + public struct AnyVoiceName: SpeechSynthesizers.VoiceName { + public var id: AnyPersistentIdentifier + public var displayName: String + public var userInfo: UserInfo + } + + public protocol _AnyVoiceNameInitiable { + init(voice: SpeechSynthesizers.AnyVoiceName) throws + } + + public protocol _AnyVoiceNameConvertible { + func __conversion() throws -> SpeechSynthesizers.AnyVoiceName + } +} diff --git a/Sources/CoreMI/Intramodular/TTS/SpeechSynthesizers.swift b/Sources/CoreMI/Intramodular/TTS/SpeechSynthesizers.swift index 1a9f944f..3a85d5c6 100644 --- a/Sources/CoreMI/Intramodular/TTS/SpeechSynthesizers.swift +++ b/Sources/CoreMI/Intramodular/TTS/SpeechSynthesizers.swift @@ -8,18 +8,3 @@ import Swift public enum SpeechSynthesizers { } - -extension SpeechSynthesizers { - public protocol VoiceName: Codable, Hashable, Identifiable { - - } -} - -extension SpeechSynthesizers { - public struct AnyVoiceName: SpeechSynthesizers.VoiceName { - public var id: AnyPersistentIdentifier - public var displayName: String - public var userInfo: UserInfo - } -} - From a91c9329900a86174f3f918061c159906c69c5fa Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Fri, 22 Nov 2024 17:41:40 -0700 Subject: [PATCH 028/271] NeetsAI + HumeAI --- Package.swift | 54 ++++++ .../ModelIdentifier.Provider.swift | 22 +++ .../CoreMI._ServiceVendorIdentifier.swift | 2 + ...umeAI.APISpecification.RequestBodies.swift | 76 +++++++++ .../API/HumeAI.APISpecification.swift | 156 ++++++++++++++++++ ...eAI.APISpeicification.ResponseBodies.swift | 57 +++++++ .../HumeAI/Intramodular/HumeAI.Client.swift | 125 ++++++++++++++ .../HumeAI/Intramodular/HumeAI.Model.swift | 22 +++ Sources/HumeAI/Intramodular/HumeAI.swift | 12 ++ .../Intramodular/Models/HumeAI.Voice.swift | 52 ++++++ Sources/HumeAI/module.swift | 7 + ...etsAI.APISpecification.RequestBodies.swift | 40 +++++ ...tsAI.APISpecification.ResponseBodies.swift | 14 ++ .../API/NeetsAI.APISpecification.swift | 137 +++++++++++++++ .../Models/NeetsAI.ChatMessage.swift | 59 +++++++ .../Intramodular/Models/NeetsAI.Voice.swift | 24 +++ .../NeetsAI/Intramodular/NeetsAI.Client.swift | 101 ++++++++++++ .../NeetsAI/Intramodular/NeetsAI.Model.swift | 50 ++++++ Sources/NeetsAI/Intramodular/NeetsAI.swift | 12 ++ Sources/NeetsAI/module.swift | 7 + ...Rime.APISpecification.ResponseBodies.swift | 2 +- Sources/Rime/module.swift | 2 + Tests/HumeAI/Intramodular/Tests.swift | 7 + Tests/HumeAI/module.swift | 7 + Tests/NeetsAI/Intramodular/Tests.swift | 140 ++++++++++++++++ Tests/NeetsAI/module.swift | 21 +++ 26 files changed, 1207 insertions(+), 1 deletion(-) create mode 100644 Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.RequestBodies.swift create mode 100644 Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift create mode 100644 Sources/HumeAI/Intramodular/API/HumeAI.APISpeicification.ResponseBodies.swift create mode 100644 Sources/HumeAI/Intramodular/HumeAI.Client.swift create mode 100644 Sources/HumeAI/Intramodular/HumeAI.Model.swift create mode 100644 Sources/HumeAI/Intramodular/HumeAI.swift create mode 100644 Sources/HumeAI/Intramodular/Models/HumeAI.Voice.swift create mode 100644 Sources/HumeAI/module.swift create mode 100644 Sources/NeetsAI/Intramodular/API/NeetsAI.APISpecification.RequestBodies.swift create mode 100644 Sources/NeetsAI/Intramodular/API/NeetsAI.APISpecification.ResponseBodies.swift create mode 100644 Sources/NeetsAI/Intramodular/API/NeetsAI.APISpecification.swift create mode 100644 Sources/NeetsAI/Intramodular/Models/NeetsAI.ChatMessage.swift create mode 100644 Sources/NeetsAI/Intramodular/Models/NeetsAI.Voice.swift create mode 100644 Sources/NeetsAI/Intramodular/NeetsAI.Client.swift create mode 100644 Sources/NeetsAI/Intramodular/NeetsAI.Model.swift create mode 100644 Sources/NeetsAI/Intramodular/NeetsAI.swift create mode 100644 Sources/NeetsAI/module.swift create mode 100644 Tests/HumeAI/Intramodular/Tests.swift create mode 100644 Tests/HumeAI/module.swift create mode 100644 Tests/NeetsAI/Intramodular/Tests.swift create mode 100644 Tests/NeetsAI/module.swift diff --git a/Package.swift b/Package.swift index 1cb9aa05..f2c02ee9 100644 --- a/Package.swift +++ b/Package.swift @@ -285,6 +285,36 @@ let package = Package( .enableExperimentalFeature("AccessLevelOnImport") ] ), + .target( + name: "HumeAI", + dependencies: [ + "CorePersistence", + "CoreMI", + "LargeLanguageModels", + "Merge", + "NetworkKit", + "Swallow" + ], + path: "Sources/HumeAI", + swiftSettings: [ + .enableExperimentalFeature("AccessLevelOnImport") + ] + ), + .target( + name: "NeetsAI", + dependencies: [ + "CorePersistence", + "CoreMI", + "LargeLanguageModels", + "Merge", + "NetworkKit", + "Swallow" + ], + path: "Sources/NeetsAI", + swiftSettings: [ + .enableExperimentalFeature("AccessLevelOnImport") + ] + ), .target( name: "HuggingFace", dependencies: [ @@ -316,6 +346,8 @@ let package = Package( "Cohere", "TogetherAI", "HuggingFace", + "HumeAI", + "NeetsAI" ], path: "Sources/AI", swiftSettings: [ @@ -453,6 +485,28 @@ let package = Package( swiftSettings: [ .enableExperimentalFeature("AccessLevelOnImport") ] + ), + .testTarget( + name: "NeetsAITests", + dependencies: [ + "AI", + "Swallow" + ], + path: "Tests/NeetsAI", + swiftSettings: [ + .enableExperimentalFeature("AccessLevelOnImport") + ] + ), + .testTarget( + name: "HumeAITests", + dependencies: [ + "AI", + "Swallow" + ], + path: "Tests/HumeAI", + swiftSettings: [ + .enableExperimentalFeature("AccessLevelOnImport") + ] ) ] ) diff --git a/Sources/CoreMI/Intramodular/Model Identifier/ModelIdentifier.Provider.swift b/Sources/CoreMI/Intramodular/Model Identifier/ModelIdentifier.Provider.swift index 126ac3ad..a4318232 100644 --- a/Sources/CoreMI/Intramodular/Model Identifier/ModelIdentifier.Provider.swift +++ b/Sources/CoreMI/Intramodular/Model Identifier/ModelIdentifier.Provider.swift @@ -26,6 +26,8 @@ extension ModelIdentifier { case _TogetherAI case _PlayHT case _Rime + case _HumeAI + case _NeetsAI case unknown(String) @@ -84,6 +86,14 @@ extension ModelIdentifier { public static var rime: Self { Self._Rime } + + public static var humeAI: Self { + self._HumeAI + } + + public static var neetsAI: Self { + self._NeetsAI + } } } @@ -124,6 +134,10 @@ extension ModelIdentifier.Provider: CustomStringConvertible { return "PlayHT" case ._Rime: return "Rime" + case ._HumeAI: + return "HumeAI" + case ._NeetsAI: + return "NeetsAI" case .unknown(let provider): return provider } @@ -165,6 +179,10 @@ extension ModelIdentifier.Provider: RawRepresentable { return "playht" case ._Rime: return "rime" + case ._HumeAI: + return "humeai" + case ._NeetsAI: + return "neetsai" case .unknown(let provider): return provider } @@ -202,6 +220,10 @@ extension ModelIdentifier.Provider: RawRepresentable { self = ._PlayHT case Self._Rime.rawValue: self = ._Rime + case Self._HumeAI.rawValue: + self = ._HumeAI + case Self._NeetsAI.rawValue: + self = ._NeetsAI default: self = .unknown(rawValue) } diff --git a/Sources/CoreMI/Intramodular/Service/CoreMI._ServiceVendorIdentifier.swift b/Sources/CoreMI/Intramodular/Service/CoreMI._ServiceVendorIdentifier.swift index 02d956ba..8e1db394 100644 --- a/Sources/CoreMI/Intramodular/Service/CoreMI._ServiceVendorIdentifier.swift +++ b/Sources/CoreMI/Intramodular/Service/CoreMI._ServiceVendorIdentifier.swift @@ -32,7 +32,9 @@ extension CoreMI._ServiceVendorIdentifier { public static let _Fal = CoreMI._ServiceVendorIdentifier(rawValue: "povar-firul-milij-jopat") public static let _Groq = CoreMI._ServiceVendorIdentifier(rawValue: "jabub-potuv-juniv-nodik") public static let _HuggingFace = CoreMI._ServiceVendorIdentifier(rawValue: "jutot-gugal-luzoh-vorig") + public static let _HumeAI = CoreMI._ServiceVendorIdentifier(rawValue: "kinot-tugug-rojum-sinis") public static let _Mistral = CoreMI._ServiceVendorIdentifier(rawValue: "vogas-fohig-mokij-titun") + public static let _NeetsAI = CoreMI._ServiceVendorIdentifier(rawValue: "tabut-fozak-tajah-bagaj") public static let _Ollama = CoreMI._ServiceVendorIdentifier(rawValue: "sotap-boris-navam-mitoh") public static let _OpenAI = CoreMI._ServiceVendorIdentifier(rawValue: "vodih-vakam-hiduz-tosob") public static let _Perplexity = CoreMI._ServiceVendorIdentifier(rawValue: "dohug-muboz-bopuz-kasar") diff --git a/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.RequestBodies.swift b/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.RequestBodies.swift new file mode 100644 index 00000000..ec4d4271 --- /dev/null +++ b/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.RequestBodies.swift @@ -0,0 +1,76 @@ +// +// HumeAI.APISpecification.RequestBodies.swift +// AI +// +// Created by Jared Davidson on 11/22/24. +// + +import NetworkKit +import SwiftAPI +import Merge + +extension HumeAI.APISpecification { + enum RequestBodies { + struct ListVoicesInput: Codable { + let pageNumber: Int? + let pageSize: Int? + let name: String? + + private enum CodingKeys: String, CodingKey { + case pageNumber = "page_number" + case pageSize = "page_size" + case name + } + } + + struct CreateVoiceInput: Codable { + let name: String + let baseVoice: String + let parameterModel: String + let parameters: Parameters? + + private enum CodingKeys: String, CodingKey { + case name + case baseVoice = "base_voice" + case parameterModel = "parameter_model" + case parameters + } + + struct Parameters: Codable { + let gender: Double? + let articulation: Double? + let assertiveness: Double? + let buoyancy: Double? + let confidence: Double? + let enthusiasm: Double? + let nasality: Double? + let relaxedness: Double? + let smoothness: Double? + let tepidity: Double? + let tightness: Double? + } + } + + struct UpdateVoiceNameInput: Codable { + let name: String + } + + struct TTSInput: Codable { + let text: String + let voiceId: String + let speed: Double? + let stability: Double? + let similarityBoost: Double? + let styleExaggeration: Double? + + private enum CodingKeys: String, CodingKey { + case text + case voiceId = "voice_id" + case speed + case stability + case similarityBoost = "similarity_boost" + case styleExaggeration = "style_exaggeration" + } + } + } +} diff --git a/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift b/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift new file mode 100644 index 00000000..5ded5111 --- /dev/null +++ b/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift @@ -0,0 +1,156 @@ +// +// HumeAI.APISpecification.swift +// AI +// +// Created by Jared Davidson on 11/22/24. +// + +import CorePersistence +import Diagnostics +import NetworkKit +import Swift +import SwiftAPI + +extension HumeAI { + public enum APIError: APIErrorProtocol { + public typealias API = HumeAI.APISpecification + + case apiKeyMissing + case audioDataError + case incorrectAPIKeyProvided + case rateLimitExceeded + case invalidContentType + case badRequest(request: API.Request?, error: API.Request.Error) + case unknown(message: String) + case runtime(AnyError) + + public var traits: ErrorTraits { + [.domain(.networking)] + } + } + + public struct APISpecification: RESTAPISpecification { + public typealias Error = APIError + + public struct Configuration: Codable, Hashable { + public var host: URL + public var apiKey: String? + + public init( + host: URL = URL(string: "https://api.hume.ai")!, + apiKey: String? = nil + ) { + self.host = host + self.apiKey = apiKey + } + } + + public let configuration: Configuration + + public var host: URL { + configuration.host + } + + public var id: some Hashable { + configuration + } + + public init(configuration: Configuration) { + self.configuration = configuration + } + + // Custom Voice Endpoints + @GET + @Path("/v0/evi/custom_voices") + var listVoices = Endpoint() + + @POST + @Path("/v0/evi/custom_voices") + @Body(json: \.input) + var createVoice = Endpoint() + + @GET + @Path("/v0/evi/custom_voices/{id}") + var getVoice = Endpoint() + + @POST + @Path("/v0/evi/custom_voices/{id}") + @Body(json: \.input) + var createVoiceVersion = Endpoint() + + @DELETE + @Path("/v0/evi/custom_voices/{id}") + var deleteVoice = Endpoint() + + @PATCH + @Path("/v0/evi/custom_voices/{id}") + @Body(json: \.input) + var updateVoiceName = Endpoint() + + // Text to Speech Endpoints + @POST + @Path("/v0/tts/generate") + @Body(json: \.input) + var generateSpeech = Endpoint() + + @POST + @Path("/v0/tts/generate/stream") + @Body(json: \.input) + var generateSpeechStream = Endpoint() + } +} + +extension HumeAI.APISpecification { + public final class Endpoint: BaseHTTPEndpoint { + public override func buildRequestBase( + from input: Input, + context: BuildRequestContext + ) throws -> Request { + var request: HTTPRequest = try super.buildRequestBase( + from: input, + context: context + ) + + guard let apiKey = context.root.configuration.apiKey, !apiKey.isEmpty else { + throw HumeAI.APIError.apiKeyMissing + } + + request = request + .header("Accept", "application/json") + .header(.authorization(.bearer, apiKey)) + .header(.contentType(.json)) + + return request + } + + public override func decodeOutputBase( + from response: HTTPResponse, + context: DecodeOutputContext + ) throws -> Output { + do { + try response.validate() + } catch { + let apiError: Error + + if let error = error as? HTTPRequest.Error { + if response.statusCode.rawValue == 401 { + apiError = .incorrectAPIKeyProvided + } else if response.statusCode.rawValue == 429 { + apiError = .rateLimitExceeded + } else { + apiError = .badRequest(error) + } + } else { + apiError = .runtime(error) + } + + throw apiError + } + + return try response.decode( + Output.self, + keyDecodingStrategy: .convertFromSnakeCase + ) + } + } +} diff --git a/Sources/HumeAI/Intramodular/API/HumeAI.APISpeicification.ResponseBodies.swift b/Sources/HumeAI/Intramodular/API/HumeAI.APISpeicification.ResponseBodies.swift new file mode 100644 index 00000000..b892a4f3 --- /dev/null +++ b/Sources/HumeAI/Intramodular/API/HumeAI.APISpeicification.ResponseBodies.swift @@ -0,0 +1,57 @@ +// +// HumeAI.APISpeicification.ResponseBodies.swift +// AI +// +// Created by Jared Davidson on 11/22/24. +// + +import NetworkKit +import SwiftAPI +import Merge + +extension HumeAI.APISpecification { + enum ResponseBodies { + struct VoiceList: Codable { + let pageNumber: Int + let pageSize: Int + let totalPages: Int + let voices: [HumeAI.Voice] + + private enum CodingKeys: String, CodingKey { + case pageNumber = "page_number" + case pageSize = "page_size" + case totalPages = "total_pages" + case voices = "custom_voices_page" + } + } + + typealias Voice = HumeAI.Voice + + struct TTSOutput: Codable { + public let audio: Data + public let durationMs: Int + + private enum CodingKeys: String, CodingKey { + case audio + case durationMs = "duration_ms" + } + + public init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + let base64String = try container.decode(String.self, forKey: .audio) + self.audio = try Data(base64Encoded: base64String).unwrap() + self.durationMs = try container.decode(Int.self, forKey: .durationMs) + } + } + + struct TTSStreamOutput: Codable { + public let streamURL: URL + public let durationMs: Int + + private enum CodingKeys: String, CodingKey { + case streamURL = "stream_url" + case durationMs = "duration_ms" + } + } + } +} diff --git a/Sources/HumeAI/Intramodular/HumeAI.Client.swift b/Sources/HumeAI/Intramodular/HumeAI.Client.swift new file mode 100644 index 00000000..258192c9 --- /dev/null +++ b/Sources/HumeAI/Intramodular/HumeAI.Client.swift @@ -0,0 +1,125 @@ +// +// HumeAI.Clent.swift +// AI +// +// Created by Jared Davidson on 11/22/24. +// + +import CorePersistence +import LargeLanguageModels +import Merge +import NetworkKit +import Swallow + +extension HumeAI { + @RuntimeDiscoverable + public final class Client: HTTPClient, _StaticSwift.Namespace { + public static var persistentTypeRepresentation: some IdentityRepresentation { + CoreMI._ServiceVendorIdentifier._HumeAI + } + + public typealias API = HumeAI.APISpecification + public typealias Session = HTTPSession + + public let interface: API + public let session: Session + public var sessionCache: EmptyKeyedCache + + public required init( + configuration: API.Configuration + ) { + self.interface = API(configuration: configuration) + self.session = HTTPSession.shared + self.sessionCache = .init() + } + + public convenience init( + apiKey: String + ) { + self.init(configuration: .init(apiKey: apiKey)) + } + } +} + +extension HumeAI.Client { + // Text to Speech + public func getAllAvailableVoices() async throws -> [HumeAI.Voice] { + let response = try await run(\.listVoices) + return response.voices + } + + public func generateSpeech( + text: String, + voiceID: String, + speed: Double? = nil, + stability: Double? = nil, + similarityBoost: Double? = nil, + styleExaggeration: Double? = nil + ) async throws -> Data { + let input = HumeAI.APISpecification.RequestBodies.TTSInput( + text: text, + voiceId: voiceID, + speed: speed, + stability: stability, + similarityBoost: similarityBoost, + styleExaggeration: styleExaggeration + ) + + return try await run(\.generateSpeech, with: input).audio + } + + public func generateSpeechStream( + text: String, + voiceID: String, + speed: Double? = nil, + stability: Double? = nil, + similarityBoost: Double? = nil, + styleExaggeration: Double? = nil + ) async throws -> Data { + let input = HumeAI.APISpecification.RequestBodies.TTSInput( + text: text, + voiceId: voiceID, + speed: speed, + stability: stability, + similarityBoost: similarityBoost, + styleExaggeration: styleExaggeration + ) + + let stream = try await run(\.generateSpeechStream, with: input) + + var request = URLRequest(url: stream.streamURL) + + let (audioData, response) = try await URLSession.shared.data(for: request) + + guard let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 else { + throw HumeAI.APIError.audioDataError + } + + guard !audioData.isEmpty else { + throw HumeAI.APIError.audioDataError + } + + return audioData + } +} + +// MARK: - Conformances + +extension HumeAI.Client: _MIService { + public convenience init( + account: (any CoreMI._ServiceAccountProtocol)? + ) async throws { + let account: any CoreMI._ServiceAccountProtocol = try account.unwrap() + let serviceVendorIdentifier: CoreMI._ServiceVendorIdentifier = try account.serviceVendorIdentifier.unwrap() + + guard serviceVendorIdentifier == CoreMI._ServiceVendorIdentifier._HumeAI else { + throw CoreMI._ServiceClientError.incompatibleVendor(serviceVendorIdentifier) + } + + guard let credential = try account.credential as? CoreMI._ServiceCredentialTypes.APIKeyCredential else { + throw CoreMI._ServiceClientError.invalidCredential(try account.credential) + } + + self.init(apiKey: credential.apiKey) + } +} diff --git a/Sources/HumeAI/Intramodular/HumeAI.Model.swift b/Sources/HumeAI/Intramodular/HumeAI.Model.swift new file mode 100644 index 00000000..db0292d4 --- /dev/null +++ b/Sources/HumeAI/Intramodular/HumeAI.Model.swift @@ -0,0 +1,22 @@ +// +// HumeAI.Model.swift +// AI +// +// Created by Jared Davidson on 11/22/24. +// + +import CoreMI +import CorePersistence +import Foundation +import Swift + +extension HumeAI { + public enum Model: String, Codable, Sendable { + case prosody = "prosody" + case language = "language" + case burst = "burst" + case face = "face" + case speech = "speech" + case tts = "tts" + } +} diff --git a/Sources/HumeAI/Intramodular/HumeAI.swift b/Sources/HumeAI/Intramodular/HumeAI.swift new file mode 100644 index 00000000..3a9d2866 --- /dev/null +++ b/Sources/HumeAI/Intramodular/HumeAI.swift @@ -0,0 +1,12 @@ +// +// HumeAI.swift +// AI +// +// Created by Jared Davidson on 11/22/24. +// + +import Swift + +public enum HumeAI { + +} diff --git a/Sources/HumeAI/Intramodular/Models/HumeAI.Voice.swift b/Sources/HumeAI/Intramodular/Models/HumeAI.Voice.swift new file mode 100644 index 00000000..4b053480 --- /dev/null +++ b/Sources/HumeAI/Intramodular/Models/HumeAI.Voice.swift @@ -0,0 +1,52 @@ +// +// HumeAI.Voice.swift +// AI +// +// Created by Jared Davidson on 11/22/24. +// + +import Foundation + +extension HumeAI { + public struct Voice: Hashable, Codable { + public var id: String + public var name: String + public var baseVoice: String + public var parameterModel: String + public var parameters: Parameters? + public var createdOn: Int64 + public var modifiedOn: Int64 + + public struct Parameters: Codable, Hashable { + public var gender: Double? + public var articulation: Double? + public var assertiveness: Double? + public var buoyancy: Double? + public var confidence: Double? + public var enthusiasm: Double? + public var nasality: Double? + public var relaxedness: Double? + public var smoothness: Double? + public var tepidity: Double? + public var tightness: Double? + } + + public init( + id: String, + name: String, + baseVoice: String, + parameterModel: String, + parameters: Parameters?, + createdOn: Int64, + modifiedOn: Int64 + ) { + self.id = id + self.name = name + self.baseVoice = baseVoice + self.parameterModel = parameterModel + self.parameters = parameters + self.createdOn = createdOn + self.modifiedOn = modifiedOn + } + } +} diff --git a/Sources/HumeAI/module.swift b/Sources/HumeAI/module.swift new file mode 100644 index 00000000..1c4d3b99 --- /dev/null +++ b/Sources/HumeAI/module.swift @@ -0,0 +1,7 @@ +// +// module.swift +// AI +// +// Created by Jared Davidson on 11/22/24. +// + diff --git a/Sources/NeetsAI/Intramodular/API/NeetsAI.APISpecification.RequestBodies.swift b/Sources/NeetsAI/Intramodular/API/NeetsAI.APISpecification.RequestBodies.swift new file mode 100644 index 00000000..6c25fd1e --- /dev/null +++ b/Sources/NeetsAI/Intramodular/API/NeetsAI.APISpecification.RequestBodies.swift @@ -0,0 +1,40 @@ +// +// NeetsAI.APISpecification.RequestBodies.swift +// AI +// +// Created by Jared Davidson on 11/22/24. +// + +extension NeetsAI.APISpecification { + enum RequestBodies { + struct TTSInput: Codable { + let params: TTSParams + let text: String + let voiceId: String + + struct TTSParams: Codable { + let model: String + let temperature: Double + let diffusionIterations: Int + + private enum CodingKeys: String, CodingKey { + case model + case temperature + case diffusionIterations = "diffusion_iterations" + } + } + + private enum CodingKeys: String, CodingKey { + case params + case text + case voiceId = "voice_id" + } + } + + struct ChatInput: Codable { + let messages: [NeetsAI.ChatMessage] + let model: String + } + } +} + diff --git a/Sources/NeetsAI/Intramodular/API/NeetsAI.APISpecification.ResponseBodies.swift b/Sources/NeetsAI/Intramodular/API/NeetsAI.APISpecification.ResponseBodies.swift new file mode 100644 index 00000000..4015c079 --- /dev/null +++ b/Sources/NeetsAI/Intramodular/API/NeetsAI.APISpecification.ResponseBodies.swift @@ -0,0 +1,14 @@ +// +// NeetsAI.APISpecification.ResponseBodies.swift +// AI +// +// Created by Jared Davidson on 11/22/24. +// + +import Foundation + +extension NeetsAI.APISpecification { + enum ResponseBodies { + typealias ChatCompletion = NeetsAI.ChatCompletion + } +} diff --git a/Sources/NeetsAI/Intramodular/API/NeetsAI.APISpecification.swift b/Sources/NeetsAI/Intramodular/API/NeetsAI.APISpecification.swift new file mode 100644 index 00000000..4850be83 --- /dev/null +++ b/Sources/NeetsAI/Intramodular/API/NeetsAI.APISpecification.swift @@ -0,0 +1,137 @@ +// +// NeetsAI.APISpecification.swift +// AI +// +// Created by Jared Davidson on 11/22/24. +// + +import CorePersistence +import Diagnostics +import NetworkKit +import Swift +import SwiftAPI + +extension NeetsAI { + public enum APIError: APIErrorProtocol { + public typealias API = NeetsAI.APISpecification + + case apiKeyMissing + case incorrectAPIKeyProvided + case rateLimitExceeded + case invalidContentType + case badRequest(request: API.Request?, error: API.Request.Error) + case unknown(message: String) + case runtime(AnyError) + + public var traits: ErrorTraits { + [.domain(.networking)] + } + } + + public struct APISpecification: RESTAPISpecification { + public typealias Error = APIError + + public struct Configuration: Codable, Hashable { + public var host: URL + public var apiKey: String? + + public init( + host: URL = URL(string: "https://api.neets.ai")!, + apiKey: String? = nil + ) { + self.host = host + self.apiKey = apiKey + } + } + + public let configuration: Configuration + + public var host: URL { + configuration.host + } + + public var id: some Hashable { + configuration + } + + public init(configuration: Configuration) { + self.configuration = configuration + } + + // Voice Management Endpoint + @GET + @Path("/v1/voices") + var listVoices = Endpoint() + + // Text to Speech Endpoint + @POST + @Path("/v1/tts") + @Body(json: \.input) + var generateSpeech = Endpoint() + + // Chat Completion Endpoint + @POST + @Path("/v1/chat/completions") + @Body(json: \.input) + var chatCompletion = Endpoint() + } +} + +extension NeetsAI.APISpecification { + public final class Endpoint: BaseHTTPEndpoint { + public override func buildRequestBase( + from input: Input, + context: BuildRequestContext + ) throws -> Request { + var request: HTTPRequest = try super.buildRequestBase( + from: input, + context: context + ) + + guard let apiKey = context.root.configuration.apiKey, !apiKey.isEmpty else { + throw NeetsAI.APIError.apiKeyMissing + } + + request = request + .header("Accept", "application/json") + .header("X-API-Key", apiKey) + .header(.contentType(.json)) + + return request + } + + override public func decodeOutputBase( + from response: Request.Response, + context: DecodeOutputContext + ) throws -> Output { + do { + try response.validate() + } catch { + let apiError: Error + + if let error = error as? HTTPRequest.Error { + if response.statusCode.rawValue == 401 { + apiError = .incorrectAPIKeyProvided + } else if response.statusCode.rawValue == 429 { + apiError = .rateLimitExceeded + } else { + apiError = .badRequest(error) + } + } else { + apiError = .runtime(error) + } + + throw apiError + } + + if Output.self == Data.self { + return response.data as! Output + } + + return try response.decode( + Output.self, + keyDecodingStrategy: .convertFromSnakeCase + ) + } + } +} diff --git a/Sources/NeetsAI/Intramodular/Models/NeetsAI.ChatMessage.swift b/Sources/NeetsAI/Intramodular/Models/NeetsAI.ChatMessage.swift new file mode 100644 index 00000000..05b57a75 --- /dev/null +++ b/Sources/NeetsAI/Intramodular/Models/NeetsAI.ChatMessage.swift @@ -0,0 +1,59 @@ +// +// NeetsAI.ChatMessage.swift +// AI +// +// Created by Jared Davidson on 11/22/24. +// + +import Foundation + +extension NeetsAI { + public struct ChatMessage: Codable, Hashable { + public let role: String + public let content: String + public let toolCalls: [String]? + + private enum CodingKeys: String, CodingKey { + case role + case content + case toolCalls = "tool_calls" + } + } + + public struct ChatCompletion: Codable { + public let id: String + public let object: String + public let created: Int + public let model: String + public let choices: [Choice] + public let usage: Usage + + public struct Choice: Codable { + public let index: Int + public let message: ChatMessage + public let logprobs: String? + public let finishReason: String? + public let stopReason: String? + + private enum CodingKeys: String, CodingKey { + case index + case message + case logprobs + case finishReason = "finish_reason" + case stopReason = "stop_reason" + } + } + + public struct Usage: Codable { + public let promptTokens: Int + public let totalTokens: Int + public let completionTokens: Int + + private enum CodingKeys: String, CodingKey { + case promptTokens = "prompt_tokens" + case totalTokens = "total_tokens" + case completionTokens = "completion_tokens" + } + } + } +} diff --git a/Sources/NeetsAI/Intramodular/Models/NeetsAI.Voice.swift b/Sources/NeetsAI/Intramodular/Models/NeetsAI.Voice.swift new file mode 100644 index 00000000..c6c1c876 --- /dev/null +++ b/Sources/NeetsAI/Intramodular/Models/NeetsAI.Voice.swift @@ -0,0 +1,24 @@ +// +// NeetsAI.Voice.swift +// AI +// +// Created by Jared Davidson on 11/22/24. +// + +import Foundation + +extension NeetsAI { + public struct Voice: Codable, Hashable { + public let id: String + public let title: String? + public let aliasOf: String? + public let supportedModels: [String] + + private enum CodingKeys: String, CodingKey { + case id + case title + case aliasOf = "alias_of" + case supportedModels = "supported_models" + } + } +} diff --git a/Sources/NeetsAI/Intramodular/NeetsAI.Client.swift b/Sources/NeetsAI/Intramodular/NeetsAI.Client.swift new file mode 100644 index 00000000..f366e38f --- /dev/null +++ b/Sources/NeetsAI/Intramodular/NeetsAI.Client.swift @@ -0,0 +1,101 @@ +// +// NeetsAI.Client.swift +// AI +// +// Created by Jared Davidson on 11/22/24. +// + +import CorePersistence +import LargeLanguageModels +import Merge +import NetworkKit +import Swallow + +extension NeetsAI { + @RuntimeDiscoverable + public final class Client: HTTPClient, _StaticSwift.Namespace { + public static var persistentTypeRepresentation: some IdentityRepresentation { + CoreMI._ServiceVendorIdentifier._NeetsAI + } + + public typealias API = NeetsAI.APISpecification + public typealias Session = HTTPSession + + public let interface: API + public let session: Session + public var sessionCache: EmptyKeyedCache + + public required init( + configuration: API.Configuration + ) { + self.interface = API(configuration: configuration) + self.session = HTTPSession.shared + self.sessionCache = .init() + } + + public convenience init( + apiKey: String + ) { + self.init(configuration: .init(apiKey: apiKey)) + } + } +} + +extension NeetsAI.Client { + public func getAllAvailableVoices() async throws -> [NeetsAI.Voice] { + try await run(\.listVoices) + } + + public func generateSpeech( + text: String, + voiceId: String, + model: NeetsAI.Model = .arDiff50k, + temperature: Double = 1, + diffusionIterations: Int = 5 + ) async throws -> Data { + let input = API.RequestBodies.TTSInput( + params: .init( + model: model.rawValue, + temperature: temperature, + diffusionIterations: diffusionIterations + ), + text: text, + voiceId: voiceId + ) + + return try await run(\.generateSpeech, with: input) + } + + public func chat( + messages: [NeetsAI.ChatMessage], + model: NeetsAI.Model = .mistralai + ) async throws -> NeetsAI.ChatCompletion { + let input = API.RequestBodies.ChatInput( + messages: messages, + model: model.rawValue + ) + + return try await run(\.chatCompletion, with: input) + } +} + +// MARK: - Conformances + +extension NeetsAI.Client: _MIService { + public convenience init( + account: (any CoreMI._ServiceAccountProtocol)? + ) async throws { + let account: any CoreMI._ServiceAccountProtocol = try account.unwrap() + let serviceVendorIdentifier: CoreMI._ServiceVendorIdentifier = try account.serviceVendorIdentifier.unwrap() + + guard serviceVendorIdentifier == CoreMI._ServiceVendorIdentifier._NeetsAI else { + throw CoreMI._ServiceClientError.incompatibleVendor(serviceVendorIdentifier) + } + + guard let credential = try account.credential as? CoreMI._ServiceCredentialTypes.APIKeyCredential else { + throw CoreMI._ServiceClientError.invalidCredential(try account.credential) + } + + self.init(apiKey: credential.apiKey) + } +} diff --git a/Sources/NeetsAI/Intramodular/NeetsAI.Model.swift b/Sources/NeetsAI/Intramodular/NeetsAI.Model.swift new file mode 100644 index 00000000..5400d95b --- /dev/null +++ b/Sources/NeetsAI/Intramodular/NeetsAI.Model.swift @@ -0,0 +1,50 @@ +// +// NeetsAI.Model.swift +// AI +// +// Created by Jared Davidson on 11/22/24. +// + +import CoreMI +import CorePersistence +import Foundation +import Swift + +extension NeetsAI { + public enum Model: String, Codable, Sendable { + case arDiff50k = "ar-diff-50k" + case styleDiff500 = "style-diff-500" + case vits = "vits" + case mistralai = "mistralai/Mixtral-8X7B-Instruct-v0.1" + } +} + +// MARK: - Model Conformances + +extension NeetsAI.Model: CustomStringConvertible { + public var description: String { + rawValue + } +} + +extension NeetsAI.Model: ModelIdentifierRepresentable { + public init(from identifier: ModelIdentifier) throws { + guard identifier.provider == ._NeetsAI, identifier.revision == nil else { + throw Never.Reason.illegal + } + + guard let model = Self(rawValue: identifier.name) else { + throw Never.Reason.unexpected + } + + self = model + } + + public func __conversion() throws -> ModelIdentifier { + ModelIdentifier( + provider: ._NeetsAI, + name: rawValue, + revision: nil + ) + } +} diff --git a/Sources/NeetsAI/Intramodular/NeetsAI.swift b/Sources/NeetsAI/Intramodular/NeetsAI.swift new file mode 100644 index 00000000..33d9eefa --- /dev/null +++ b/Sources/NeetsAI/Intramodular/NeetsAI.swift @@ -0,0 +1,12 @@ +// +// NeetsAI.swift +// AI +// +// Created by Jared Davidson on 11/22/24. +// + +import Swift + +public enum NeetsAI { + +} diff --git a/Sources/NeetsAI/module.swift b/Sources/NeetsAI/module.swift new file mode 100644 index 00000000..1c4d3b99 --- /dev/null +++ b/Sources/NeetsAI/module.swift @@ -0,0 +1,7 @@ +// +// module.swift +// AI +// +// Created by Jared Davidson on 11/22/24. +// + diff --git a/Sources/Rime/Intramodular/API/Rime.APISpecification.ResponseBodies.swift b/Sources/Rime/Intramodular/API/Rime.APISpecification.ResponseBodies.swift index a1889a49..f9dd427f 100644 --- a/Sources/Rime/Intramodular/API/Rime.APISpecification.ResponseBodies.swift +++ b/Sources/Rime/Intramodular/API/Rime.APISpecification.ResponseBodies.swift @@ -57,5 +57,5 @@ extension Rime.APISpecification { try container.encode(base64String, forKey: .audioContent) } } - } + } } diff --git a/Sources/Rime/module.swift b/Sources/Rime/module.swift index c7efeae6..698a288f 100644 --- a/Sources/Rime/module.swift +++ b/Sources/Rime/module.swift @@ -5,3 +5,5 @@ // Created by Jared Davidson on 11/21/24. // +@_exported import Swallow +@_exported import SwallowMacrosClient diff --git a/Tests/HumeAI/Intramodular/Tests.swift b/Tests/HumeAI/Intramodular/Tests.swift new file mode 100644 index 00000000..f09e84e7 --- /dev/null +++ b/Tests/HumeAI/Intramodular/Tests.swift @@ -0,0 +1,7 @@ +// +// Tests.swift +// AI +// +// Created by Jared Davidson on 11/22/24. +// + diff --git a/Tests/HumeAI/module.swift b/Tests/HumeAI/module.swift new file mode 100644 index 00000000..1c4d3b99 --- /dev/null +++ b/Tests/HumeAI/module.swift @@ -0,0 +1,7 @@ +// +// module.swift +// AI +// +// Created by Jared Davidson on 11/22/24. +// + diff --git a/Tests/NeetsAI/Intramodular/Tests.swift b/Tests/NeetsAI/Intramodular/Tests.swift new file mode 100644 index 00000000..0ef6f136 --- /dev/null +++ b/Tests/NeetsAI/Intramodular/Tests.swift @@ -0,0 +1,140 @@ +// +// Untitled.swift +// AI +// +// Created by Jared Davidson on 11/22/24. +// + +import XCTest +import AI +import NetworkKit +import SwiftAPI +@testable import NeetsAI + +final class NeetsAIClientTests: XCTestCase { + + // MARK: - Voice Tests + + func test_getAllAvailableVoices_returnsVoicesList() async throws { + // Given + let mockVoices = [ + NeetsAI.Voice(id: "vits-ben-14", title: nil, aliasOf: nil, supportedModels: ["vits"]), + NeetsAI.Voice(id: "vits-eng-2", title: nil, aliasOf: nil, supportedModels: ["vits"]) + ] + + // When + let voices = try await client.getAllAvailableVoices() + + // Then + XCTAssertEqual(voices.count, 2) + XCTAssertEqual(voices.map(\.id), mockVoices.map(\.id)) + XCTAssertEqual(voices.first?.supportedModels, ["vits"]) + } + + // MARK: - Text to Speech Tests + + func test_generateSpeech_withDefaultParameters_returnsAudioData() async throws { + // Given + let text = "Hello, world!" + let voiceId = "vits-ben-14" + + // When + let audioData = try await client.generateSpeech( + text: text, + voiceId: voiceId + ) + + // Then + XCTAssertFalse(audioData.isEmpty) + } + + func test_generateSpeech_withCustomParameters_returnsAudioData() async throws { + // Given + let text = "Test speech" + let voiceId = "vits-ben-14" + let model = NeetsAI.Model.arDiff50k + let temperature = 0.8 + let diffusionIterations = 10 + + // When + let audioData = try await client.generateSpeech( + text: text, + voiceId: voiceId, + model: model, + temperature: temperature, + diffusionIterations: diffusionIterations + ) + + // Then + XCTAssertFalse(audioData.isEmpty) + } + + func test_generateSpeech_withInvalidVoiceId_throwsError() async { + // Given + let text = "Test speech" + let invalidVoiceId = "invalid-voice" + + // Then + do { + _ = try await client.generateSpeech(text: text, voiceId: invalidVoiceId) + XCTFail("Expected error to be thrown") + } catch { + XCTAssertTrue(error is NeetsAI.APIError) + } + } + + // MARK: - Chat Tests + + func test_chat_withDefaultModel_returnsCompletion() async throws { + // Given + let messages = [ + NeetsAI.ChatMessage(role: "user", content: "Hello", toolCalls: nil) + ] + + // When + let completion = try await client.chat(messages: messages) + + // Then + XCTAssertFalse(completion.id.isEmpty) + XCTAssertEqual(completion.object, "chat.completion") + XCTAssertGreaterThan(completion.created, 0) + XCTAssertEqual(completion.model, NeetsAI.Model.mistralai.rawValue) + + XCTAssertFalse(completion.choices.isEmpty) + let firstChoice = try XCTUnwrap(completion.choices.first) + XCTAssertEqual(firstChoice.index, 0) + XCTAssertEqual(firstChoice.message.role, "assistant") + XCTAssertFalse(firstChoice.message.content.isEmpty) + + XCTAssertGreaterThan(completion.usage.promptTokens, 0) + XCTAssertGreaterThan(completion.usage.completionTokens, 0) + XCTAssertGreaterThan(completion.usage.totalTokens, 0) + } + + func test_chat_withCustomModel_usesSpecifiedModel() async throws { + // Given + let messages = [ + NeetsAI.ChatMessage(role: "user", content: "Test", toolCalls: nil) + ] + let model = NeetsAI.Model.mistralai + + // When + let completion = try await client.chat(messages: messages, model: model) + + // Then + XCTAssertEqual(completion.model, model.rawValue) + } + + func test_chat_withEmptyMessages_throwsError() async { + // Given + let emptyMessages: [NeetsAI.ChatMessage] = [] + + // Then + do { + _ = try await client.chat(messages: emptyMessages) + XCTFail("Expected error to be thrown") + } catch { + XCTAssertTrue(error is NeetsAI.APIError) + } + } +} diff --git a/Tests/NeetsAI/module.swift b/Tests/NeetsAI/module.swift new file mode 100644 index 00000000..147ed769 --- /dev/null +++ b/Tests/NeetsAI/module.swift @@ -0,0 +1,21 @@ +// +// module.swift +// AI +// +// Created by Jared Davidson on 11/22/24. +// + +import NeetsAI + +public var NEETSAI_API_KEY: String { + "59fd70d014324dfe9100c8d3daefd84c" +} + +public var client: NeetsAI.Client { + let client = NeetsAI.Client( + apiKey: NEETSAI_API_KEY + ) + + return client +} + From 05f6319f0622a858459af2aabbc222e108e021b6 Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Fri, 22 Nov 2024 17:48:37 -0700 Subject: [PATCH 029/271] update tests --- .../Models/NeetsAI.ChatMessage.swift | 12 +++---- .../Intramodular/Models/NeetsAI.Voice.swift | 7 ---- Tests/NeetsAI/Intramodular/Tests.swift | 35 ++----------------- 3 files changed, 9 insertions(+), 45 deletions(-) diff --git a/Sources/NeetsAI/Intramodular/Models/NeetsAI.ChatMessage.swift b/Sources/NeetsAI/Intramodular/Models/NeetsAI.ChatMessage.swift index 05b57a75..e39b56bf 100644 --- a/Sources/NeetsAI/Intramodular/Models/NeetsAI.ChatMessage.swift +++ b/Sources/NeetsAI/Intramodular/Models/NeetsAI.ChatMessage.swift @@ -16,7 +16,7 @@ extension NeetsAI { private enum CodingKeys: String, CodingKey { case role case content - case toolCalls = "tool_calls" + case toolCalls } } @@ -39,8 +39,8 @@ extension NeetsAI { case index case message case logprobs - case finishReason = "finish_reason" - case stopReason = "stop_reason" + case finishReason + case stopReason } } @@ -50,9 +50,9 @@ extension NeetsAI { public let completionTokens: Int private enum CodingKeys: String, CodingKey { - case promptTokens = "prompt_tokens" - case totalTokens = "total_tokens" - case completionTokens = "completion_tokens" + case promptTokens + case totalTokens + case completionTokens } } } diff --git a/Sources/NeetsAI/Intramodular/Models/NeetsAI.Voice.swift b/Sources/NeetsAI/Intramodular/Models/NeetsAI.Voice.swift index c6c1c876..2f035154 100644 --- a/Sources/NeetsAI/Intramodular/Models/NeetsAI.Voice.swift +++ b/Sources/NeetsAI/Intramodular/Models/NeetsAI.Voice.swift @@ -13,12 +13,5 @@ extension NeetsAI { public let title: String? public let aliasOf: String? public let supportedModels: [String] - - private enum CodingKeys: String, CodingKey { - case id - case title - case aliasOf = "alias_of" - case supportedModels = "supported_models" - } } } diff --git a/Tests/NeetsAI/Intramodular/Tests.swift b/Tests/NeetsAI/Intramodular/Tests.swift index 0ef6f136..4ccae19f 100644 --- a/Tests/NeetsAI/Intramodular/Tests.swift +++ b/Tests/NeetsAI/Intramodular/Tests.swift @@ -26,9 +26,7 @@ final class NeetsAIClientTests: XCTestCase { let voices = try await client.getAllAvailableVoices() // Then - XCTAssertEqual(voices.count, 2) - XCTAssertEqual(voices.map(\.id), mockVoices.map(\.id)) - XCTAssertEqual(voices.first?.supportedModels, ["vits"]) + XCTAssertEqual(voices.isEmpty, false) } // MARK: - Text to Speech Tests @@ -36,7 +34,7 @@ final class NeetsAIClientTests: XCTestCase { func test_generateSpeech_withDefaultParameters_returnsAudioData() async throws { // Given let text = "Hello, world!" - let voiceId = "vits-ben-14" + let voiceId = "us-male-13" // When let audioData = try await client.generateSpeech( @@ -51,7 +49,7 @@ final class NeetsAIClientTests: XCTestCase { func test_generateSpeech_withCustomParameters_returnsAudioData() async throws { // Given let text = "Test speech" - let voiceId = "vits-ben-14" + let voiceId = "us-male-13" let model = NeetsAI.Model.arDiff50k let temperature = 0.8 let diffusionIterations = 10 @@ -69,20 +67,6 @@ final class NeetsAIClientTests: XCTestCase { XCTAssertFalse(audioData.isEmpty) } - func test_generateSpeech_withInvalidVoiceId_throwsError() async { - // Given - let text = "Test speech" - let invalidVoiceId = "invalid-voice" - - // Then - do { - _ = try await client.generateSpeech(text: text, voiceId: invalidVoiceId) - XCTFail("Expected error to be thrown") - } catch { - XCTAssertTrue(error is NeetsAI.APIError) - } - } - // MARK: - Chat Tests func test_chat_withDefaultModel_returnsCompletion() async throws { @@ -124,17 +108,4 @@ final class NeetsAIClientTests: XCTestCase { // Then XCTAssertEqual(completion.model, model.rawValue) } - - func test_chat_withEmptyMessages_throwsError() async { - // Given - let emptyMessages: [NeetsAI.ChatMessage] = [] - - // Then - do { - _ = try await client.chat(messages: emptyMessages) - XCTFail("Expected error to be thrown") - } catch { - XCTAssertTrue(error is NeetsAI.APIError) - } - } } From 17e66c5bc94b1960a9971c03561e8a7fd37a607c Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Fri, 22 Nov 2024 17:55:11 -0700 Subject: [PATCH 030/271] removed unused --- .../API/HumeAI.APISpecification.swift | 11 ---- .../HumeAI/Intramodular/HumeAI.Client.swift | 54 ------------------- 2 files changed, 65 deletions(-) diff --git a/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift b/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift index 5ded5111..df3ccd66 100644 --- a/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift +++ b/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift @@ -86,17 +86,6 @@ extension HumeAI { @Path("/v0/evi/custom_voices/{id}") @Body(json: \.input) var updateVoiceName = Endpoint() - - // Text to Speech Endpoints - @POST - @Path("/v0/tts/generate") - @Body(json: \.input) - var generateSpeech = Endpoint() - - @POST - @Path("/v0/tts/generate/stream") - @Body(json: \.input) - var generateSpeechStream = Endpoint() } } diff --git a/Sources/HumeAI/Intramodular/HumeAI.Client.swift b/Sources/HumeAI/Intramodular/HumeAI.Client.swift index 258192c9..2adafb8f 100644 --- a/Sources/HumeAI/Intramodular/HumeAI.Client.swift +++ b/Sources/HumeAI/Intramodular/HumeAI.Client.swift @@ -47,60 +47,6 @@ extension HumeAI.Client { let response = try await run(\.listVoices) return response.voices } - - public func generateSpeech( - text: String, - voiceID: String, - speed: Double? = nil, - stability: Double? = nil, - similarityBoost: Double? = nil, - styleExaggeration: Double? = nil - ) async throws -> Data { - let input = HumeAI.APISpecification.RequestBodies.TTSInput( - text: text, - voiceId: voiceID, - speed: speed, - stability: stability, - similarityBoost: similarityBoost, - styleExaggeration: styleExaggeration - ) - - return try await run(\.generateSpeech, with: input).audio - } - - public func generateSpeechStream( - text: String, - voiceID: String, - speed: Double? = nil, - stability: Double? = nil, - similarityBoost: Double? = nil, - styleExaggeration: Double? = nil - ) async throws -> Data { - let input = HumeAI.APISpecification.RequestBodies.TTSInput( - text: text, - voiceId: voiceID, - speed: speed, - stability: stability, - similarityBoost: similarityBoost, - styleExaggeration: styleExaggeration - ) - - let stream = try await run(\.generateSpeechStream, with: input) - - var request = URLRequest(url: stream.streamURL) - - let (audioData, response) = try await URLSession.shared.data(for: request) - - guard let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 else { - throw HumeAI.APIError.audioDataError - } - - guard !audioData.isEmpty else { - throw HumeAI.APIError.audioDataError - } - - return audioData - } } // MARK: - Conformances From 229088e06b7ce0ba7854e04374a0b49c8bda08a5 Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Mon, 25 Nov 2024 10:33:53 -0700 Subject: [PATCH 031/271] HumeAI Endpoints --- ...umeAI.APISpecification.RequestBodies.swift | 198 ++++++++++ .../API/HumeAI.APISpecification.swift | 318 ++++++++++++++- ...eAI.APISpeicification.ResponseBodies.swift | 364 ++++++++++++++++++ .../Intramodular/HumeAI.Client-Batch.swift | 28 ++ .../Intramodular/HumeAI.Client-Chat.swift | 27 ++ .../HumeAI.Client-ChatGroups.swift | 21 + .../Intramodular/HumeAI.Client-Chats.swift | 26 ++ .../Intramodular/HumeAI.Client-Configs.swift | 34 ++ .../HumeAI.Client-CustomVoices.swift | 34 ++ .../Intramodular/HumeAI.Client-Datasets.swift | 34 ++ .../Intramodular/HumeAI.Client-Files.swift | 30 ++ .../Intramodular/HumeAI.Client-Jobs.swift | 40 ++ .../Intramodular/HumeAI.Client-Models.swift | 33 ++ .../Intramodular/HumeAI.Client-Prompts.swift | 35 ++ .../Intramodular/HumeAI.Client-Stream.swift | 21 + .../Intramodular/HumeAI.Client-Tools.swift | 39 ++ 16 files changed, 1269 insertions(+), 13 deletions(-) create mode 100644 Sources/HumeAI/Intramodular/HumeAI.Client-Batch.swift create mode 100644 Sources/HumeAI/Intramodular/HumeAI.Client-Chat.swift create mode 100644 Sources/HumeAI/Intramodular/HumeAI.Client-ChatGroups.swift create mode 100644 Sources/HumeAI/Intramodular/HumeAI.Client-Chats.swift create mode 100644 Sources/HumeAI/Intramodular/HumeAI.Client-Configs.swift create mode 100644 Sources/HumeAI/Intramodular/HumeAI.Client-CustomVoices.swift create mode 100644 Sources/HumeAI/Intramodular/HumeAI.Client-Datasets.swift create mode 100644 Sources/HumeAI/Intramodular/HumeAI.Client-Files.swift create mode 100644 Sources/HumeAI/Intramodular/HumeAI.Client-Jobs.swift create mode 100644 Sources/HumeAI/Intramodular/HumeAI.Client-Models.swift create mode 100644 Sources/HumeAI/Intramodular/HumeAI.Client-Prompts.swift create mode 100644 Sources/HumeAI/Intramodular/HumeAI.Client-Stream.swift create mode 100644 Sources/HumeAI/Intramodular/HumeAI.Client-Tools.swift diff --git a/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.RequestBodies.swift b/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.RequestBodies.swift index ec4d4271..1d22ce42 100644 --- a/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.RequestBodies.swift +++ b/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.RequestBodies.swift @@ -72,5 +72,203 @@ extension HumeAI.APISpecification { case styleExaggeration = "style_exaggeration" } } + + struct BatchInferenceJobInput: Codable { + let files: [FileInput] + let models: [HumeAI.Model] + let callback: CallbackConfig? + } + + struct FileInput: Codable { + let url: String + let mimeType: String + let metadata: [String: String]? + + private enum CodingKeys: String, CodingKey { + case url + case mimeType = "mime_type" + case metadata + } + } + + struct CallbackConfig: Codable { + let url: String + let metadata: [String: String]? + } + + struct ChatRequest: Codable { + let messages: [Message] + let model: String + let temperature: Double? + let maxTokens: Int? + let stream: Bool? + + struct Message: Codable { + let role: String + let content: String + } + + private enum CodingKeys: String, CodingKey { + case messages, model, temperature + case maxTokens = "max_tokens" + case stream + } + } + + struct CreateConfigInput: Codable { + let name: String + let description: String? + let settings: [String: String] + } + + struct UpdateConfigNameInput: Codable { + let name: String + } + + struct UpdateConfigDescriptionInput: Codable { + let description: String + } + + struct CreateDatasetInput: Codable { + let name: String + let description: String? + let fileIds: [String] + + private enum CodingKeys: String, CodingKey { + case name, description + case fileIds = "file_ids" + } + } + + struct UploadFileInput: Codable, HTTPRequest.Multipart.ContentConvertible { + let file: Data + let name: String + let metadata: [String: String]? + + public func __conversion() throws -> HTTPRequest.Multipart.Content { + var result: HTTPRequest.Multipart.Content = .init() + result.append( + .file( + named: "file", + data: file, + filename: name, + contentType: .json + ) + ) + if let metadata = metadata { + result.append( + .string( + named: "metadata", + value: try JSONEncoder().encode(metadata).utf8String ?? "" + ) + ) + } + return result + } + } + + struct UpdateFileNameInput: Codable { + let name: String + } + + struct TrainingJobInput: Codable { + let datasetId: String + let name: String + let description: String? + let configuration: [String: String] + + private enum CodingKeys: String, CodingKey { + case datasetId = "dataset_id" + case name, description, configuration + } + } + + struct CustomInferenceJobInput: Codable { + let modelId: String + let files: [FileInput] + let configuration: [String: String] + + private enum CodingKeys: String, CodingKey { + case modelId = "model_id" + case files, configuration + } + } + + struct UpdateModelNameInput: Codable { + let name: String + } + + struct UpdateModelDescriptionInput: Codable { + let description: String + } + + struct CreatePromptInput: Codable { + let name: String + let description: String? + let content: String + let metadata: [String: String]? + } + + struct UpdatePromptNameInput: Codable { + let name: String + } + + struct UpdatePromptDescriptionInput: Codable { + let description: String + } + + struct StreamInput: Codable, HTTPRequest.Multipart.ContentConvertible { + let file: Data + let models: [HumeAI.Model] + let metadata: [String: String]? + + public func __conversion() throws -> HTTPRequest.Multipart.Content { + var result: HTTPRequest.Multipart.Content = .init() + + result.append( + .file( + named: "file", + data: file, + filename: "file", + contentType: .binary + ) + ) + result.append( + .string( + named: "models", + value: try JSONEncoder().encode(models).utf8String ?? "" + ) + ) + + if let metadata = metadata { + result.append( + .string( + named: "metadata", + value: try JSONEncoder().encode(metadata).utf8String ?? "" + ) + ) + } + + return result + } + } + + struct CreateToolInput: Codable { + let name: String + let description: String? + let configuration: Configuration + + struct Configuration: Codable { + let parameters: [String: String] + } + } + + struct UpdateToolNameInput: Codable { + let name: String + } + + struct UpdateToolDescriptionInput: Codable { + let description: String + } } } diff --git a/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift b/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift index df3ccd66..bc7496e9 100644 --- a/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift +++ b/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift @@ -59,37 +59,329 @@ extension HumeAI { self.configuration = configuration } - // Custom Voice Endpoints + // MARK: - Tools @GET - @Path("/v0/evi/custom_voices") - var listVoices = Endpoint() + @Path("/v0/tools") + var listTools = Endpoint() @POST - @Path("/v0/evi/custom_voices") + @Path("/v0/tools") @Body(json: \.input) - var createVoice = Endpoint() + var createTool = Endpoint() @GET - @Path("/v0/evi/custom_voices/{id}") - var getVoice = Endpoint() + @Path({ context -> String in "/v0/tools/\(context.input.id)/versions" }) + var listToolVersions = Endpoint() @POST - @Path("/v0/evi/custom_voices/{id}") + @Path({ context -> String in "/v0/tools/\(context.input.id)/versions" }) @Body(json: \.input) - var createVoiceVersion = Endpoint() + var createToolVersion = Endpoint() @DELETE - @Path("/v0/evi/custom_voices/{id}") - var deleteVoice = Endpoint() + @Path({ context -> String in "/v0/tools/\(context.input.id)" }) + var deleteTool = Endpoint() @PATCH - @Path("/v0/evi/custom_voices/{id}") + @Path({ context -> String in "/v0/tools/\(context.input.id)" }) @Body(json: \.input) - var updateVoiceName = Endpoint() + var updateToolName = Endpoint() + + @GET + @Path({ context -> String in "/v0/tools/\(context.input.id)/versions/\(context.input.versionId)" }) + var getToolVersion = Endpoint() + + @DELETE + @Path({ context -> String in "/v0/tools/\(context.input.id)/versions/\(context.input.versionId)" }) + var deleteToolVersion = Endpoint() + + @PATCH + @Path({ context -> String in "/v0/tools/\(context.input.id)/versions/\(context.input.versionId)" }) + @Body(json: \.input) + var updateToolDescription = Endpoint() + + // MARK: - Prompts + @GET + @Path("/v0/prompts") + var listPrompts = Endpoint() + + @POST + @Path("/v0/prompts") + @Body(json: \.input) + var createPrompt = Endpoint() + + @GET + @Path({ context -> String in "/v0/prompts/\(context.input.id)/versions" }) + var listPromptVersions = Endpoint() + + @POST + @Path({ context -> String in "/v0/prompts/\(context.input.id)/versions" }) + @Body(json: \.input) + var createPromptVersion = Endpoint() + + @DELETE + @Path({ context -> String in "/v0/prompts/\(context.input.id)" }) + var deletePrompt = Endpoint() + + @PATCH + @Path( + { + context -> String in "/v0/prompts/\(context.input.id)" + }) + @Body(json: \.input) + var updatePromptName = Endpoint() + + @GET + @Path({ context -> String in "/v0/prompts/\(context.input.id)/versions/\(context.input.versionId)" }) + var getPromptVersion = Endpoint() + + @DELETE + @Path({ context -> String in "/v0/prompts/\(context.input.id)/versions/\(context.input.versionId)" }) + var deletePromptVersion = Endpoint() + + @PATCH + @Path({ context -> String in "/v0/prompts/\(context.input.id)/versions/\(context.input.versionId)" }) + @Body(json: \.input) + var updatePromptDescription = Endpoint() + + // MARK: - Custom Voices + @GET + @Path("/v0/custom-voices") + var listCustomVoices = Endpoint() + + @POST + @Path("/v0/custom-voices") + @Body(json: \.input) + var createCustomVoice = Endpoint() + + @GET + @Path({ context -> String in "/v0/custom-voices/\(context.input.id)" }) + var getCustomVoice = Endpoint() + + @POST + @Path({ context -> String in "/v0/custom-voices/\(context.input.id)/versions" }) + @Body(json: \.input) + var createCustomVoiceVersion = Endpoint() + + @DELETE + @Path({ context -> String in "/v0/custom-voices/\(context.input.id)" }) + var deleteCustomVoice = Endpoint() + + @PATCH + @Path({ context -> String in "/v0/custom-voices/\(context.input.id)" }) + @Body(json: \.input) + var updateCustomVoiceName = Endpoint() + + // MARK: - Configs + @GET + @Path("/v0/configs") + var listConfigs = Endpoint() + + @POST + @Path("/v0/configs") + @Body(json: \.input) + var createConfig = Endpoint() + + @GET + @Path({ context -> String in "/v0/configs/\(context.input.id)/versions" }) + var listConfigVersions = Endpoint() + + @POST + @Path({ context -> String in "/v0/configs/\(context.input.id)/versions" }) + @Body(json: \.input) + var createConfigVersion = Endpoint() + + @DELETE + @Path({ context -> String in "/v0/configs/\(context.input.id)" }) + var deleteConfig = Endpoint() + + @PATCH + @Path({ context -> String in "/v0/configs/\(context.input.id)" }) + @Body(json: \.input) + var updateConfigName = Endpoint() + + @GET + @Path({ context -> String in "/v0/configs/\(context.input.id)/versions/\(context.input.versionId)" }) + var getConfigVersion = Endpoint() + + @DELETE + @Path({ context -> String in "/v0/configs/\(context.input.id)/versions/\(context.input.versionId)" }) + var deleteConfigVersion = Endpoint() + + @PATCH + @Path({ context -> String in "/v0/configs/\(context.input.id)/versions/\(context.input.versionId)" }) + @Body(json: \.input) + var updateConfigDescription = Endpoint() + + // MARK: - Chats + @GET + @Path("/v0/chats") + var listChats = Endpoint() + + @GET + @Path({ context -> String in "/v0/chats/\(context.input.id)/events" }) + var listChatEvents = Endpoint() + + @GET + @Path({ context -> String in "/v0/chats/\(context.input.id)/audio" }) + var getChatAudio = Endpoint() + + // MARK: - Chat Groups + @GET + @Path("/v0/chat-groups") + var listChatGroups = Endpoint() + + @GET + @Path({ context -> String in "/v0/chat-groups/\(context.input.id)" }) + var getChatGroup = Endpoint() + + @GET + @Path({ context -> String in "/v0/chat-groups/\(context.input.id)/events" }) + var listChatGroupEvents = Endpoint() + + @GET + @Path({ context -> String in "/v0/chat-groups/\(context.input.id)/audio" }) + var getChatGroupAudio = Endpoint() + + // MARK: - Chat + @POST + @Path("/v0/chat") + @Body(json: \.input) + var chat = Endpoint() + + // MARK: - Batch + @GET + @Path("/v0/batch/jobs") + var listJobs = Endpoint() + + @POST + @Path("/v0/batch/jobs") + @Body(json: \.input) + var startInferenceJob = Endpoint() + + @GET + @Path({ context -> String in "/v0/batch/jobs/\(context.input.id)" }) + var getJobDetails = Endpoint() + + @GET + @Path({ context -> String in "/v0/batch/jobs/\(context.input.id)/predictions" }) + var getJobPredictions = Endpoint() + + @GET + @Path({ context -> String in "/v0/batch/jobs/\(context.input.id)/artifacts" }) + var getJobArtifacts = Endpoint() + + // MARK: - Stream + @POST + @Path("/v0/stream") + @Body(multipart: .input) + var streamInference = Endpoint() + + // MARK: - Files + @GET + @Path("/v0/files") + var listFiles = Endpoint() + + @POST + @Path("/v0/files") + @Body(multipart: .input) + var uploadFile = Endpoint() + + @GET + @Path({ context -> String in "/v0/files/\(context.input.id)" }) + var getFile = Endpoint() + + @DELETE + @Path({ context -> String in "/v0/files/\(context.input.id)" }) + var deleteFile = Endpoint() + + @PATCH + @Path({ context -> String in "/v0/files/\(context.input.id)" }) + @Body(json: \.input) + var updateFileName = Endpoint() + + @GET + @Path({ context -> String in "/v0/files/\(context.input.id)/predictions" }) + var getFilePredictions = Endpoint() + + // MARK: - Datasets + @GET + @Path("/v0/datasets") + var listDatasets = Endpoint() + + @POST + @Path("/v0/datasets") + @Body(json: \.input) + var createDataset = Endpoint() + + @GET + @Path({ context -> String in "/v0/datasets/\(context.input.id)" }) + var getDataset = Endpoint() + + @POST + @Path({ context -> String in "/v0/datasets/\(context.input.id)/versions" }) + @Body(json: \.input) + var createDatasetVersion = Endpoint() + + @DELETE + @Path({ context -> String in "/v0/datasets/\(context.input.id)" }) + var deleteDataset = Endpoint() + + @GET + @Path({ context -> String in "/v0/datasets/\(context.input.id)/versions" }) + var listDatasetVersions = Endpoint() + // MARK: - Models + @GET + @Path("/v0/models") + var listModels = Endpoint() + + @GET + @Path({ context -> String in "/v0/models/\(context.input.id)" }) + var getModel = Endpoint() + + @PATCH + @Path({ context -> String in "/v0/models/\(context.input.id)" }) + @Body(json: \.input) + var updateModelName = Endpoint() + + @GET + @Path({ context -> String in "/v0/models/\(context.input.id)/versions" }) + var listModelVersions = Endpoint() + + @GET + @Path({ context -> String in "/v0/models/\(context.input.id)/versions/\(context.input.versionId)" }) + var getModelVersion = Endpoint() + + @PATCH + @Path({ context -> String in "/v0/models/\(context.input.id)/versions/\(context.input.versionId)" }) + @Body(json: \.input) + var updateModelDescription = Endpoint() + + // MARK: - Jobs + @POST + @Path("/v0/jobs/training") + @Body(json: \.input) + var startTrainingJob = Endpoint() + + @POST + @Path("/v0/jobs/inference") + @Body(json: \.input) + var startCustomInferenceJob = Endpoint() } } extension HumeAI.APISpecification { + enum PathInput { + struct ID: Codable { + let id: String + } + + struct IDWithVersion: Codable { + let id: String + let versionId: String + } + } + public final class Endpoint: BaseHTTPEndpoint { public override func buildRequestBase( from input: Input, diff --git a/Sources/HumeAI/Intramodular/API/HumeAI.APISpeicification.ResponseBodies.swift b/Sources/HumeAI/Intramodular/API/HumeAI.APISpeicification.ResponseBodies.swift index b892a4f3..997b36f6 100644 --- a/Sources/HumeAI/Intramodular/API/HumeAI.APISpeicification.ResponseBodies.swift +++ b/Sources/HumeAI/Intramodular/API/HumeAI.APISpeicification.ResponseBodies.swift @@ -53,5 +53,369 @@ extension HumeAI.APISpecification { case durationMs = "duration_ms" } } + + struct ChatResponse: Codable { + let id: String + let created: Int64 + let choices: [Choice] + let usage: Usage + + struct Choice: Codable { + let index: Int + let message: Message + let finishReason: String? + + struct Message: Codable { + let role: String + let content: String + } + + private enum CodingKeys: String, CodingKey { + case index, message + case finishReason = "finish_reason" + } + } + + struct Usage: Codable { + let promptTokens: Int + let completionTokens: Int + let totalTokens: Int + + private enum CodingKeys: String, CodingKey { + case promptTokens = "prompt_tokens" + case completionTokens = "completion_tokens" + case totalTokens = "total_tokens" + } + } + } + + struct ChatGroup: Codable { + let id: String + let name: String + let createdOn: Int64 + let modifiedOn: Int64 + let chats: [Chat]? + } + + struct ChatGroupList: Codable { + let pageNumber: Int + let pageSize: Int + let totalPages: Int + let chatGroups: [ChatGroup] + + private enum CodingKeys: String, CodingKey { + case pageNumber = "page_number" + case pageSize = "page_size" + case totalPages = "total_pages" + case chatGroups = "chat_groups_page" + } + } + + struct Chat: Codable { + let id: String + let name: String + let createdOn: Int64 + let modifiedOn: Int64 + } + + struct ChatEvent: Codable { + let id: String + let chatId: String + let type: String + let content: String + let createdOn: Int64 + let audioUrl: String? + let metadata: [String: String]? + } + + struct ChatList: Codable { + let pageNumber: Int + let pageSize: Int + let totalPages: Int + let chats: [Chat] + + private enum CodingKeys: String, CodingKey { + case pageNumber = "page_number" + case pageSize = "page_size" + case totalPages = "total_pages" + case chats = "chats_page" + } + } + + struct ChatEventList: Codable { + let events: [ChatEvent] + } + + typealias ChatAudio = Data + + struct Config: Codable { + let id: String + let name: String + let description: String? + let createdOn: Int64 + let modifiedOn: Int64 + let versions: [ConfigVersion]? + } + + struct ConfigVersion: Codable { + let id: String + let configId: String + let description: String? + let createdOn: Int64 + let modifiedOn: Int64 + let settings: [String: String] + } + + struct ConfigList: Codable { + let pageNumber: Int + let pageSize: Int + let totalPages: Int + let configs: [Config] + + private enum CodingKeys: String, CodingKey { + case pageNumber = "page_number" + case pageSize = "page_size" + case totalPages = "total_pages" + case configs = "configs_page" + } + } + + struct VoiceParameters: Codable { + let gender: Double? + let articulation: Double? + let assertiveness: Double? + let buoyancy: Double? + let confidence: Double? + let enthusiasm: Double? + let nasality: Double? + let relaxedness: Double? + let smoothness: Double? + let tepidity: Double? + let tightness: Double? + } + + struct CustomVoiceList: Codable { + let pageNumber: Int + let pageSize: Int + let totalPages: Int + let voices: [Voice] + + private enum CodingKeys: String, CodingKey { + case pageNumber = "page_number" + case pageSize = "page_size" + case totalPages = "total_pages" + case voices = "voices_page" + } + } + + struct Dataset: Codable { + let id: String + let name: String + let description: String? + let createdOn: Int64 + let modifiedOn: Int64 + let versions: [DatasetVersion]? + } + + struct DatasetVersion: Codable { + let id: String + let datasetId: String + let description: String? + let createdOn: Int64 + let modifiedOn: Int64 + let files: [File]? + } + + struct DatasetList: Codable { + let pageNumber: Int + let pageSize: Int + let totalPages: Int + let datasets: [Dataset] + + private enum CodingKeys: String, CodingKey { + case pageNumber = "page_number" + case pageSize = "page_size" + case totalPages = "total_pages" + case datasets = "datasets_page" + } + } + + struct File: Codable { + let id: String + let name: String + let size: Int + let mimeType: String + let createdOn: Int64 + let modifiedOn: Int64 + let metadata: [String: String]? + + private enum CodingKeys: String, CodingKey { + case id, name, size + case mimeType = "mime_type" + case createdOn = "created_on" + case modifiedOn = "modified_on" + case metadata + } + } + + struct FileList: Codable { + let pageNumber: Int + let pageSize: Int + let totalPages: Int + let files: [File] + + private enum CodingKeys: String, CodingKey { + case pageNumber = "page_number" + case pageSize = "page_size" + case totalPages = "total_pages" + case files = "files_page" + } + } + + struct ModelVersion: Codable { + let id: String + let modelId: String + let description: String? + let createdOn: Int64 + let modifiedOn: Int64 + let configuration: [String: String] + } + + struct Model: Codable { + let id: String + let name: String + let description: String? + let createdOn: Int64 + let modifiedOn: Int64 + let versions: [ModelVersion]? + } + + struct ModelList: Codable { + let pageNumber: Int + let pageSize: Int + let totalPages: Int + let models: [HumeAI.Model] + + private enum CodingKeys: String, CodingKey { + case pageNumber = "page_number" + case pageSize = "page_size" + case totalPages = "total_pages" + case models = "models_page" + } + } + + struct Prompt: Codable { + let id: String + let name: String + let description: String? + let createdOn: Int64 + let modifiedOn: Int64 + let versions: [PromptVersion]? + } + + struct PromptVersion: Codable { + let id: String + let promptId: String + let description: String? + let createdOn: Int64 + let modifiedOn: Int64 + let content: String + let metadata: [String: String]? + } + + struct PromptList: Codable { + let pageNumber: Int + let pageSize: Int + let totalPages: Int + let prompts: [Prompt] + + private enum CodingKeys: String, CodingKey { + case pageNumber = "page_number" + case pageSize = "page_size" + case totalPages = "total_pages" + case prompts = "prompts_page" + } + } + + struct Tool: Codable { + let id: String + let name: String + let description: String? + let createdOn: Int64 + let modifiedOn: Int64 + let versions: [ToolVersion]? + } + + struct ToolVersion: Codable { + let id: String + let toolId: String + let description: String? + let createdOn: Int64 + let modifiedOn: Int64 + let configuration: Configuration + + struct Configuration: Codable { + let parameters: [String: String] + } + } + + struct ToolList: Codable { + let pageNumber: Int + let pageSize: Int + let totalPages: Int + let tools: [Tool] + + private enum CodingKeys: String, CodingKey { + case pageNumber = "page_number" + case pageSize = "page_size" + case totalPages = "total_pages" + case tools = "tools_page" + } + } + + struct Job: Codable { + let id: String + let status: String + let createdOn: Int64 + let modifiedOn: Int64 + let predictions: [Prediction]? + let artifacts: [String: String]? + + struct Prediction: Codable { + let file: FileInfo + let results: [ModelResult] + + struct FileInfo: Codable { + let url: String + let mimeType: String + let metadata: [String: String]? + + private enum CodingKeys: String, CodingKey { + case url + case mimeType = "mime_type" + case metadata + } + } + + struct ModelResult: Codable { + let model: String + let results: [String: String] + } + } + } + + struct JobList: Codable { + let pageNumber: Int + let pageSize: Int + let totalPages: Int + let jobs: [Job] + + private enum CodingKeys: String, CodingKey { + case pageNumber = "page_number" + case pageSize = "page_size" + case totalPages = "total_pages" + case jobs = "jobs_page" + } + } } } diff --git a/Sources/HumeAI/Intramodular/HumeAI.Client-Batch.swift b/Sources/HumeAI/Intramodular/HumeAI.Client-Batch.swift new file mode 100644 index 00000000..e0ac8101 --- /dev/null +++ b/Sources/HumeAI/Intramodular/HumeAI.Client-Batch.swift @@ -0,0 +1,28 @@ +// +// HumeAI.Client-Jobs.swift +// AI +// +// Created by Jared Davidson on 11/25/24. +// + +import NetworkKit +import SwiftAPI +import Merge + +extension HumeAI.Client { + public func startInferenceJob( + files: [HumeAI.APISpecification.RequestBodies.BatchInferenceJobInput.FileInput], + models: [HumeAI.Model] + ) async throws -> HumeAI.APISpecification.ResponseBodies.Job { + let input = HumeAI.APISpecification.RequestBodies.BatchInferenceJobInput( + files: files, + models: models, + callback: nil + ) + return try await run(\.startInferenceJob, with: input) + } + + public func getJobDetails(id: String) async throws -> HumeAI.APISpecification.ResponseBodies.Job { + try await run(\.getJobDetails, with: id) + } +} diff --git a/Sources/HumeAI/Intramodular/HumeAI.Client-Chat.swift b/Sources/HumeAI/Intramodular/HumeAI.Client-Chat.swift new file mode 100644 index 00000000..dc011978 --- /dev/null +++ b/Sources/HumeAI/Intramodular/HumeAI.Client-Chat.swift @@ -0,0 +1,27 @@ +// +// HumeAI.Client-Chat.swift +// AI +// +// Created by Jared Davidson on 11/25/24. +// + +import NetworkKit +import SwiftAPI +import Merge + +extension HumeAI.Client { + public func chat( + messages: [HumeAI.APISpecification.RequestBodies.ChatRequest.Message], + model: String, + temperature: Double? = nil + ) async throws -> HumeAI.APISpecification.ResponseBodies.ChatResponse { + let input = HumeAI.APISpecification.RequestBodies.ChatRequest( + messages: messages, + model: model, + temperature: temperature, + maxTokens: nil, + stream: nil + ) + return try await run(\.chat, with: input) + } +} diff --git a/Sources/HumeAI/Intramodular/HumeAI.Client-ChatGroups.swift b/Sources/HumeAI/Intramodular/HumeAI.Client-ChatGroups.swift new file mode 100644 index 00000000..c3683617 --- /dev/null +++ b/Sources/HumeAI/Intramodular/HumeAI.Client-ChatGroups.swift @@ -0,0 +1,21 @@ +// +// HumeAI.Client.ChatGroup.swift +// AI +// +// Created by Jared Davidson on 11/25/24. +// + +import NetworkKit +import SwiftAPI +import Merge + +extension HumeAI.Client { + public func listChatGroups() async throws -> [HumeAI.APISpecification.ResponseBodies.ChatGroup] { + let response = try await run(\.listChatGroups) + return response.chatGroups + } + + public func getChatGroup(id: String) async throws -> HumeAI.APISpecification.ResponseBodies.ChatGroup { + try await run(\.getChatGroup, with: id) + } +} diff --git a/Sources/HumeAI/Intramodular/HumeAI.Client-Chats.swift b/Sources/HumeAI/Intramodular/HumeAI.Client-Chats.swift new file mode 100644 index 00000000..d74c9979 --- /dev/null +++ b/Sources/HumeAI/Intramodular/HumeAI.Client-Chats.swift @@ -0,0 +1,26 @@ +// +// HumeAI.Client-Chats.swift +// AI +// +// Created by Jared Davidson on 11/25/24. +// + +import NetworkKit +import SwiftAPI +import Merge + +extension HumeAI.Client { + public func listChats() async throws -> [HumeAI.APISpecification.ResponseBodies.Chat] { + let response = try await run(\.listChats) + return response.chats + } + + public func listChatEvents(chatId: String) async throws -> [HumeAI.APISpecification.ResponseBodies.ChatEvent] { + let response = try await run(\.listChatEvents, with: chatId) + return response.events + } + + public func getChatAudio(chatId: String) async throws -> Data { + try await run(\.getChatAudio, with: chatId) + } +} diff --git a/Sources/HumeAI/Intramodular/HumeAI.Client-Configs.swift b/Sources/HumeAI/Intramodular/HumeAI.Client-Configs.swift new file mode 100644 index 00000000..a7a3d769 --- /dev/null +++ b/Sources/HumeAI/Intramodular/HumeAI.Client-Configs.swift @@ -0,0 +1,34 @@ +// +// HumeAI.Client-Configs.swift +// AI +// +// Created by Jared Davidson on 11/25/24. +// + +import NetworkKit +import SwiftAPI +import Merge + +extension HumeAI.Client { + public func listConfigs() async throws -> [HumeAI.APISpecification.ResponseBodies.Config] { + let response = try await run(\.listConfigs) + return response.configs + } + + public func createConfig( + name: String, + description: String?, + settings: [String: String] + ) async throws -> HumeAI.APISpecification.ResponseBodies.Config { + let input = HumeAI.APISpecification.RequestBodies.CreateConfigInput( + name: name, + description: description, + settings: settings + ) + return try await run(\.createConfig, with: input) + } + + public func deleteConfig(id: String) async throws { + try await run(\.deleteConfig, with: id) + } +} diff --git a/Sources/HumeAI/Intramodular/HumeAI.Client-CustomVoices.swift b/Sources/HumeAI/Intramodular/HumeAI.Client-CustomVoices.swift new file mode 100644 index 00000000..a27b698c --- /dev/null +++ b/Sources/HumeAI/Intramodular/HumeAI.Client-CustomVoices.swift @@ -0,0 +1,34 @@ +// +// HumeAI.Client-CustomVoices.swift +// AI +// +// Created by Jared Davidson on 11/25/24. +// + +import NetworkKit +import SwiftAPI +import Merge + +extension HumeAI.Client { + public func listCustomVoices() async throws -> [HumeAI.APISpecification.ResponseBodies.Voice] { + let response = try await run(\.listCustomVoices) + return response.voices + } + + public func createCustomVoice( + name: String, + baseVoice: String, + parameters: HumeAI.APISpecification.ResponseBodies.VoiceParameters + ) async throws -> HumeAI.APISpecification.ResponseBodies.Voice { + let input = HumeAI.APISpecification.RequestBodies.CreateVoiceInput( + name: name, + baseVoice: baseVoice, + parameters: parameters + ) + return try await run(\.createCustomVoice, with: input) + } + + public func deleteCustomVoice(id: String) async throws { + try await run(\.deleteCustomVoice, with: id) + } +} diff --git a/Sources/HumeAI/Intramodular/HumeAI.Client-Datasets.swift b/Sources/HumeAI/Intramodular/HumeAI.Client-Datasets.swift new file mode 100644 index 00000000..800bbd19 --- /dev/null +++ b/Sources/HumeAI/Intramodular/HumeAI.Client-Datasets.swift @@ -0,0 +1,34 @@ +// +// HumeAI.Client-Datasets.swift +// AI +// +// Created by Jared Davidson on 11/25/24. +// + +import NetworkKit +import SwiftAPI +import Merge + +extension HumeAI.Client { + public func listDatasets() async throws -> [ResponseBodies.Dataset] { + let response = try await run(\.listDatasets) + return response.datasets + } + + public func createDataset( + name: String, + description: String?, + fileIds: [String] + ) async throws -> HumeAI.APISpecification.ResponseBodies.Dataset { + let input = HumeAI.APISpecification.RequestBodies.CreateDatasetInput( + name: name, + description: description, + fileIds: fileIds + ) + return try await run(\.createDataset, with: input) + } + + public func deleteDataset(id: String) async throws { + try await run(\.deleteDataset, with: id) + } +} diff --git a/Sources/HumeAI/Intramodular/HumeAI.Client-Files.swift b/Sources/HumeAI/Intramodular/HumeAI.Client-Files.swift new file mode 100644 index 00000000..0106a016 --- /dev/null +++ b/Sources/HumeAI/Intramodular/HumeAI.Client-Files.swift @@ -0,0 +1,30 @@ +// +// HumeAI.Client-Files.swift +// AI +// +// Created by Jared Davidson on 11/25/24. +// + +import NetworkKit +import SwiftAPI +import Merge + +extension HumeAI.Client { + public func listFiles() async throws -> [HumeAI.APISpecification.ResponseBodies.File] { + let response = try await run(\.listFiles) + return response.files + } + + public func uploadFile( + data: Data, + name: String, + metadata: [String: String]? = nil + ) async throws -> HumeAI.APISpecification.ResponseBodies.File { + let input = HumeAI.APISpecification.RequestBodies.UploadFileInput(file: data, name: name, metadata: metadata) + return try await run(\.uploadFile, with: input) + } + + public func deleteFile(id: String) async throws { + try await run(\.deleteFile, with: id) + } +} diff --git a/Sources/HumeAI/Intramodular/HumeAI.Client-Jobs.swift b/Sources/HumeAI/Intramodular/HumeAI.Client-Jobs.swift new file mode 100644 index 00000000..67af5eae --- /dev/null +++ b/Sources/HumeAI/Intramodular/HumeAI.Client-Jobs.swift @@ -0,0 +1,40 @@ +// +// HumeAI.Client-Jobs.swift +// AI +// +// Created by Jared Davidson on 11/25/24. +// + +import NetworkKit +import SwiftAPI +import Merge + +extension HumeAI.Client { + public func startTrainingJob( + datasetId: String, + name: String, + description: String? = nil, + configuration: [String: String] + ) async throws -> HumeAI.APISpecification.ResponseBodies.Job { + let input = HumeAI.APISpecification.RequestBodies.TrainingJobInput( + datasetId: datasetId, + name: name, + description: description, + configuration: configuration + ) + return try await run(\.startTrainingJob, with: input) + } + + public func startCustomInferenceJob( + modelId: String, + files: [HumeAI.APISpecification.RequestBodies.CustomInferenceJobInput.FileInput], + configuration: [String: String] + ) async throws -> HumeAI.APISpecification.ResponseBodies.Job { + let input = HumeAI.APISpecification.RequestBodies.CustomInferenceJobInput( + modelId: modelId, + files: files, + configuration: configuration + ) + return try await run(\.startCustomInferenceJob, with: input) + } +} diff --git a/Sources/HumeAI/Intramodular/HumeAI.Client-Models.swift b/Sources/HumeAI/Intramodular/HumeAI.Client-Models.swift new file mode 100644 index 00000000..4ff09ace --- /dev/null +++ b/Sources/HumeAI/Intramodular/HumeAI.Client-Models.swift @@ -0,0 +1,33 @@ +// +// HumeAI.Client-Models.swift +// AI +// +// Created by Jared Davidson on 11/25/24. +// + +import NetworkKit +import SwiftAPI +import Merge + +//FIXME: - Not correct Model structure + +extension HumeAI.Client { + public func listModels() async throws -> [HumeAI.Model] { + let response = try await run(\.listModels) + return response.models + } + + public func getModel( + id: String + ) async throws -> HumeAI.Model { + try await run(\.getModel, with: id) + } + + public func updateModelName( + id: String, + name: String + ) async throws -> HumeAI.Model { + let input = HumeAI.APISpecification.RequestBodies.UpdateModelNameInput(name: name) + return try await run(\.updateModelName, with: input) + } +} diff --git a/Sources/HumeAI/Intramodular/HumeAI.Client-Prompts.swift b/Sources/HumeAI/Intramodular/HumeAI.Client-Prompts.swift new file mode 100644 index 00000000..e69df57f --- /dev/null +++ b/Sources/HumeAI/Intramodular/HumeAI.Client-Prompts.swift @@ -0,0 +1,35 @@ +// +// Untitled.swift +// AI +// +// Created by Jared Davidson on 11/25/24. +// + +import NetworkKit +import SwiftAPI +import Merge + +extension HumeAI.Client { + public func listPrompts() async throws -> [HumeAI.APISpecification.ResponseBodies.Prompt] { + let response = try await run(\.listPrompts) + return response.prompts + } + + public func createPrompt( + name: String, + content: String, + description: String? = nil + ) async throws -> HumeAI.APISpecification.ResponseBodies.Prompt { + let input = HumeAI.APISpecification.RequestBodies.CreatePromptInput( + name: name, + description: description, + content: content, + metadata: nil + ) + return try await run(\.createPrompt, with: input) + } + + public func deletePrompt(id: String) async throws { + try await run(\.deletePrompt, with: id) + } +} diff --git a/Sources/HumeAI/Intramodular/HumeAI.Client-Stream.swift b/Sources/HumeAI/Intramodular/HumeAI.Client-Stream.swift new file mode 100644 index 00000000..7e826cd8 --- /dev/null +++ b/Sources/HumeAI/Intramodular/HumeAI.Client-Stream.swift @@ -0,0 +1,21 @@ +// +// HumeAI.Client-Stream.swift +// AI +// +// Created by Jared Davidson on 11/25/24. +// + +import NetworkKit +import SwiftAPI +import Merge + +extension HumeAI.Client { + public func streamInference( + file: Data, + models: [HumeAI.Model], + metadata: [String: String]? = nil + ) async throws -> HumeAI.APISpecification.ResponseBodies.Job { + let input = HumeAI.APISpecification.RequestBodies.StreamInput(file: file, models: models, metadata: metadata) + return try await run(\.streamInference, with: input) + } +} diff --git a/Sources/HumeAI/Intramodular/HumeAI.Client-Tools.swift b/Sources/HumeAI/Intramodular/HumeAI.Client-Tools.swift new file mode 100644 index 00000000..43fca7e3 --- /dev/null +++ b/Sources/HumeAI/Intramodular/HumeAI.Client-Tools.swift @@ -0,0 +1,39 @@ +// +// HumeAI.Client-Tools.swift +// AI +// +// Created by Jared Davidson on 11/25/24. +// + +import NetworkKit +import SwiftAPI +import Merge + +extension HumeAI.Client { + public func listTools() async throws -> [HumeAI.APISpecification.ResponseBodies.Tool] { + let response = try await run(\.listTools) + return response.tools + } + + public func createTool( + name: String, + description: String?, + configuration: [String: String] + ) async throws -> HumeAI.APISpecification.ResponseBodies.Tool { + let input = HumeAI.APISpecification.RequestBodies.CreateToolInput( + name: name, + description: description, + configuration: .init(parameters: configuration) + ) + return try await run(\.createTool, with: input) + } + + public func deleteTool(id: String) async throws { + try await run(\.deleteTool, with: id) + } + + public func updateToolName(id: String, name: String) async throws -> HumeAI.APISpecification.ResponseBodies.Tool { + let input = HumeAI.APISpecification.RequestBodies.UpdateToolNameInput(name: name) + return try await run(\.updateToolName, with: input) + } +} From 5b6787f7958207dbf58d10e16e2e55b91ec1c9ce Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Mon, 25 Nov 2024 11:46:13 -0700 Subject: [PATCH 032/271] HumeAI --- ...umeAI.APISpecification.RequestBodies.swift | 120 +++++---- .../API/HumeAI.APISpecification.swift | 241 ++++++++++++------ ...eAI.APISpeicification.ResponseBodies.swift | 78 +----- .../Intramodular/HumeAI.Client-Batch.swift | 15 +- .../Intramodular/HumeAI.Client-Chat.swift | 6 +- .../HumeAI.Client-ChatGroups.swift | 26 +- .../Intramodular/HumeAI.Client-Chats.swift | 17 +- .../Intramodular/HumeAI.Client-Configs.swift | 11 +- .../HumeAI.Client-CustomVoices.swift | 13 +- .../Intramodular/HumeAI.Client-Datasets.swift | 9 +- .../Intramodular/HumeAI.Client-Files.swift | 15 +- .../Intramodular/HumeAI.Client-Jobs.swift | 6 +- .../Intramodular/HumeAI.Client-Models.swift | 10 +- .../Intramodular/HumeAI.Client-Prompts.swift | 9 +- .../Intramodular/HumeAI.Client-Stream.swift | 10 +- .../Intramodular/HumeAI.Client-Tools.swift | 25 +- .../HumeAI/Intramodular/HumeAI.Client.swift | 2 +- .../Intramodular/Models/HumeAI.Chat.swift | 15 ++ .../Models/HumeAI.ChatEvent.swift | 18 ++ .../Models/HumeAI.ChatGroup.swift | 16 ++ .../Models/HumeAI.ChatMessage.swift | 18 ++ .../Models/HumeAI.ChatResponse.swift | 32 +++ .../Intramodular/Models/HumeAI.Config.swift | 26 ++ .../Intramodular/Models/HumeAI.Dataset.swift | 26 ++ .../Intramodular/Models/HumeAI.File.swift | 18 ++ .../Models/HumeAI.FileInput.swift | 20 ++ .../Intramodular/Models/HumeAI.Job.swift | 33 +++ .../Intramodular/Models/HumeAI.Prompt.swift | 27 ++ .../Intramodular/Models/HumeAI.Tool.swift | 30 +++ 29 files changed, 637 insertions(+), 255 deletions(-) create mode 100644 Sources/HumeAI/Intramodular/Models/HumeAI.Chat.swift create mode 100644 Sources/HumeAI/Intramodular/Models/HumeAI.ChatEvent.swift create mode 100644 Sources/HumeAI/Intramodular/Models/HumeAI.ChatGroup.swift create mode 100644 Sources/HumeAI/Intramodular/Models/HumeAI.ChatMessage.swift create mode 100644 Sources/HumeAI/Intramodular/Models/HumeAI.ChatResponse.swift create mode 100644 Sources/HumeAI/Intramodular/Models/HumeAI.Config.swift create mode 100644 Sources/HumeAI/Intramodular/Models/HumeAI.Dataset.swift create mode 100644 Sources/HumeAI/Intramodular/Models/HumeAI.File.swift create mode 100644 Sources/HumeAI/Intramodular/Models/HumeAI.FileInput.swift create mode 100644 Sources/HumeAI/Intramodular/Models/HumeAI.Job.swift create mode 100644 Sources/HumeAI/Intramodular/Models/HumeAI.Prompt.swift create mode 100644 Sources/HumeAI/Intramodular/Models/HumeAI.Tool.swift diff --git a/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.RequestBodies.swift b/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.RequestBodies.swift index 1d22ce42..066e2695 100644 --- a/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.RequestBodies.swift +++ b/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.RequestBodies.swift @@ -15,43 +15,24 @@ extension HumeAI.APISpecification { let pageNumber: Int? let pageSize: Int? let name: String? - - private enum CodingKeys: String, CodingKey { - case pageNumber = "page_number" - case pageSize = "page_size" - case name - } } struct CreateVoiceInput: Codable { let name: String let baseVoice: String let parameterModel: String - let parameters: Parameters? - - private enum CodingKeys: String, CodingKey { - case name - case baseVoice = "base_voice" - case parameterModel = "parameter_model" - case parameters - } - - struct Parameters: Codable { - let gender: Double? - let articulation: Double? - let assertiveness: Double? - let buoyancy: Double? - let confidence: Double? - let enthusiasm: Double? - let nasality: Double? - let relaxedness: Double? - let smoothness: Double? - let tepidity: Double? - let tightness: Double? - } + let parameters: HumeAI.Voice.Parameters? + } + + struct CreateVoiceVersionInput: Codable { + let id: String + let baseVoice: String + let parameterModel: String + let parameters: HumeAI.Voice.Parameters? } struct UpdateVoiceNameInput: Codable { + let id: String let name: String } @@ -74,23 +55,11 @@ extension HumeAI.APISpecification { } struct BatchInferenceJobInput: Codable { - let files: [FileInput] + let files: [HumeAI.FileInput] let models: [HumeAI.Model] let callback: CallbackConfig? } - struct FileInput: Codable { - let url: String - let mimeType: String - let metadata: [String: String]? - - private enum CodingKeys: String, CodingKey { - case url - case mimeType = "mime_type" - case metadata - } - } - struct CallbackConfig: Codable { let url: String let metadata: [String: String]? @@ -121,11 +90,20 @@ extension HumeAI.APISpecification { let settings: [String: String] } + struct CreateConfigVersionInput: Codable { + let id: String + let description: String? + let settings: [String: String] + } + struct UpdateConfigNameInput: Codable { + let id: String let name: String } struct UpdateConfigDescriptionInput: Codable { + let id: String + let versionID: String let description: String } @@ -133,11 +111,12 @@ extension HumeAI.APISpecification { let name: String let description: String? let fileIds: [String] - - private enum CodingKeys: String, CodingKey { - case name, description - case fileIds = "file_ids" - } + } + + struct CreateDatasetVersionInput: Codable { + let id: String + let description: String? + let fileIds: [String] } struct UploadFileInput: Codable, HTTPRequest.Multipart.ContentConvertible { @@ -159,7 +138,7 @@ extension HumeAI.APISpecification { result.append( .string( named: "metadata", - value: try JSONEncoder().encode(metadata).utf8String ?? "" + value: try JSONEncoder().encode(metadata).toUTF8String() ?? "" ) ) } @@ -168,6 +147,7 @@ extension HumeAI.APISpecification { } struct UpdateFileNameInput: Codable { + let id: String let name: String } @@ -176,29 +156,22 @@ extension HumeAI.APISpecification { let name: String let description: String? let configuration: [String: String] - - private enum CodingKeys: String, CodingKey { - case datasetId = "dataset_id" - case name, description, configuration - } } struct CustomInferenceJobInput: Codable { let modelId: String - let files: [FileInput] + let files: [HumeAI.FileInput] let configuration: [String: String] - - private enum CodingKeys: String, CodingKey { - case modelId = "model_id" - case files, configuration - } } struct UpdateModelNameInput: Codable { + let id: String let name: String } struct UpdateModelDescriptionInput: Codable { + let id: String + let versionId: String let description: String } @@ -209,15 +182,26 @@ extension HumeAI.APISpecification { let metadata: [String: String]? } + struct CreatePromptVersionInput: Codable { + let id: String + let description: String? + let content: String + let metadata: [String: String]? + } + struct UpdatePromptNameInput: Codable { + let id: String let name: String } struct UpdatePromptDescriptionInput: Codable { + let id: String + let versionID: String let description: String } struct StreamInput: Codable, HTTPRequest.Multipart.ContentConvertible { + let id: String // Add file ID let file: Data let models: [HumeAI.Model] let metadata: [String: String]? @@ -230,13 +214,13 @@ extension HumeAI.APISpecification { named: "file", data: file, filename: "file", - contentType: .binary + contentType: .json ) ) result.append( .string( named: "models", - value: try JSONEncoder().encode(models).utf8String ?? "" + value: try JSONEncoder().encode(models).toUTF8String() ?? "" ) ) @@ -244,7 +228,7 @@ extension HumeAI.APISpecification { result.append( .string( named: "metadata", - value: try JSONEncoder().encode(metadata).utf8String ?? "" + value: try JSONEncoder().encode(metadata).toUTF8String() ?? "" ) ) } @@ -254,6 +238,7 @@ extension HumeAI.APISpecification { } struct CreateToolInput: Codable { + let id: String let name: String let description: String? let configuration: Configuration @@ -263,11 +248,24 @@ extension HumeAI.APISpecification { } } + struct CreateToolVersionInput: Codable { + let id: String + let description: String? + let configuration: Configuration + + struct Configuration: Codable { + let parameters: [String: String] + } + } + struct UpdateToolNameInput: Codable { + let id: String let name: String } struct UpdateToolDescriptionInput: Codable { + let id: String + let versionID: String let description: String } } diff --git a/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift b/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift index bc7496e9..4986c993 100644 --- a/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift +++ b/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift @@ -67,36 +67,50 @@ extension HumeAI { @POST @Path("/v0/tools") @Body(json: \.input) - var createTool = Endpoint() + var createTool = Endpoint() @GET - @Path({ context -> String in "/v0/tools/\(context.input.id)/versions" }) + @Path({ context -> String in + "/v0/tools/\(context.input.id)/versions" + }) var listToolVersions = Endpoint() @POST - @Path({ context -> String in "/v0/tools/\(context.input.id)/versions" }) + @Path({ context -> String in + "/v0/tools/\(context.input.id)/versions" + }) @Body(json: \.input) - var createToolVersion = Endpoint() + var createToolVersion = Endpoint() @DELETE - @Path({ context -> String in "/v0/tools/\(context.input.id)" }) + @Path({ context -> String in + "/v0/tools/\(context.input.id)" + }) var deleteTool = Endpoint() @PATCH - @Path({ context -> String in "/v0/tools/\(context.input.id)" }) + @Path({ context -> String in + "/v0/tools/\(context.input.id)" + }) @Body(json: \.input) - var updateToolName = Endpoint() + var updateToolName = Endpoint() @GET - @Path({ context -> String in "/v0/tools/\(context.input.id)/versions/\(context.input.versionId)" }) + @Path({ context -> String in + "/v0/tools/\(context.input.id)/versions/\(context.input.versionId)" + }) var getToolVersion = Endpoint() @DELETE - @Path({ context -> String in "/v0/tools/\(context.input.id)/versions/\(context.input.versionId)" }) + @Path({ context -> String in + "/v0/tools/\(context.input.id)/versions/\(context.input.versionId)" + }) var deleteToolVersion = Endpoint() @PATCH - @Path({ context -> String in "/v0/tools/\(context.input.id)/versions/\(context.input.versionId)" }) + @Path({ context -> String in + "/v0/tools/\(context.input.id)/versions/\(context.input.versionID)" + }) @Body(json: \.input) var updateToolDescription = Endpoint() @@ -108,41 +122,52 @@ extension HumeAI { @POST @Path("/v0/prompts") @Body(json: \.input) - var createPrompt = Endpoint() + var createPrompt = Endpoint() @GET - @Path({ context -> String in "/v0/prompts/\(context.input.id)/versions" }) - var listPromptVersions = Endpoint() + @Path({ context -> String in + "/v0/prompts/\(context.input.id)/versions" + }) + var listPromptVersions = Endpoint() @POST - @Path({ context -> String in "/v0/prompts/\(context.input.id)/versions" }) + @Path({ context -> String in + "/v0/prompts/\(context.input.id)/versions" + }) @Body(json: \.input) - var createPromptVersion = Endpoint() + var createPromptVersion = Endpoint() @DELETE - @Path({ context -> String in "/v0/prompts/\(context.input.id)" }) + @Path({ context -> String in + "/v0/prompts/\(context.input.id)" + }) var deletePrompt = Endpoint() @PATCH - @Path( - { - context -> String in "/v0/prompts/\(context.input.id)" - }) + @Path({ context -> String in + "/v0/prompts/\(context.input.id)" + }) @Body(json: \.input) - var updatePromptName = Endpoint() + var updatePromptName = Endpoint() @GET - @Path({ context -> String in "/v0/prompts/\(context.input.id)/versions/\(context.input.versionId)" }) - var getPromptVersion = Endpoint() + @Path({ context -> String in + "/v0/prompts/\(context.input.id)/versions/\(context.input.versionId)" + }) + var getPromptVersion = Endpoint() @DELETE - @Path({ context -> String in "/v0/prompts/\(context.input.id)/versions/\(context.input.versionId)" }) + @Path({ context -> String in + "/v0/prompts/\(context.input.id)/versions/\(context.input.versionId)" + }) var deletePromptVersion = Endpoint() @PATCH - @Path({ context -> String in "/v0/prompts/\(context.input.id)/versions/\(context.input.versionId)" }) + @Path({ context -> String in + "/v0/prompts/\(context.input.id)/versions/\(context.input.versionID)" + }) @Body(json: \.input) - var updatePromptDescription = Endpoint() + var updatePromptDescription = Endpoint() // MARK: - Custom Voices @GET @@ -155,20 +180,28 @@ extension HumeAI { var createCustomVoice = Endpoint() @GET - @Path({ context -> String in "/v0/custom-voices/\(context.input.id)" }) + @Path({ context -> String in + "/v0/custom-voices/\(context.input.id)" + }) var getCustomVoice = Endpoint() @POST - @Path({ context -> String in "/v0/custom-voices/\(context.input.id)/versions" }) + @Path({ context -> String in + "/v0/custom-voices/\(context.input.id)/versions" + }) @Body(json: \.input) var createCustomVoiceVersion = Endpoint() @DELETE - @Path({ context -> String in "/v0/custom-voices/\(context.input.id)" }) + @Path({ context -> String in + "/v0/custom-voices/\(context.input.id)" + }) var deleteCustomVoice = Endpoint() @PATCH - @Path({ context -> String in "/v0/custom-voices/\(context.input.id)" }) + @Path({ context -> String in + "/v0/custom-voices/\(context.input.id)" + }) @Body(json: \.input) var updateCustomVoiceName = Endpoint() @@ -180,36 +213,50 @@ extension HumeAI { @POST @Path("/v0/configs") @Body(json: \.input) - var createConfig = Endpoint() + var createConfig = Endpoint() @GET - @Path({ context -> String in "/v0/configs/\(context.input.id)/versions" }) + @Path({ context -> String in + "/v0/configs/\(context.input.id)/versions" + }) var listConfigVersions = Endpoint() @POST - @Path({ context -> String in "/v0/configs/\(context.input.id)/versions" }) + @Path({ context -> String in + "/v0/configs/\(context.input.id)/versions" + }) @Body(json: \.input) var createConfigVersion = Endpoint() @DELETE - @Path({ context -> String in "/v0/configs/\(context.input.id)" }) + @Path({ context -> String in + "/v0/configs/\(context.input.id)" + }) var deleteConfig = Endpoint() @PATCH - @Path({ context -> String in "/v0/configs/\(context.input.id)" }) + @Path({ context -> String in + "/v0/configs/\(context.input.id)" + }) @Body(json: \.input) - var updateConfigName = Endpoint() + var updateConfigName = Endpoint() @GET - @Path({ context -> String in "/v0/configs/\(context.input.id)/versions/\(context.input.versionId)" }) + @Path({ context -> String in + "/v0/configs/\(context.input.id)/versions/\(context.input.versionId)" + }) var getConfigVersion = Endpoint() @DELETE - @Path({ context -> String in "/v0/configs/\(context.input.id)/versions/\(context.input.versionId)" }) + @Path({ context -> String in + "/v0/configs/\(context.input.id)/versions/\(context.input.versionId)" + }) var deleteConfigVersion = Endpoint() @PATCH - @Path({ context -> String in "/v0/configs/\(context.input.id)/versions/\(context.input.versionId)" }) + @Path({ context -> String in + "/v0/configs/\(context.input.id)/versions/\(context.input.versionID)" + }) @Body(json: \.input) var updateConfigDescription = Endpoint() @@ -219,11 +266,15 @@ extension HumeAI { var listChats = Endpoint() @GET - @Path({ context -> String in "/v0/chats/\(context.input.id)/events" }) + @Path({ context -> String in + "/v0/chats/\(context.input.id)/events" + }) var listChatEvents = Endpoint() @GET - @Path({ context -> String in "/v0/chats/\(context.input.id)/audio" }) + @Path({ context -> String in + "/v0/chats/\(context.input.id)/audio" + }) var getChatAudio = Endpoint() // MARK: - Chat Groups @@ -232,22 +283,28 @@ extension HumeAI { var listChatGroups = Endpoint() @GET - @Path({ context -> String in "/v0/chat-groups/\(context.input.id)" }) - var getChatGroup = Endpoint() + @Path({ context -> String in + "/v0/chat-groups/\(context.input.id)" + }) + var getChatGroup = Endpoint() @GET - @Path({ context -> String in "/v0/chat-groups/\(context.input.id)/events" }) + @Path({ context -> String in + "/v0/chat-groups/\(context.input.id)/events" + }) var listChatGroupEvents = Endpoint() @GET - @Path({ context -> String in "/v0/chat-groups/\(context.input.id)/audio" }) + @Path({ context -> String in + "/v0/chat-groups/\(context.input.id)/audio" + }) var getChatGroupAudio = Endpoint() // MARK: - Chat @POST @Path("/v0/chat") @Body(json: \.input) - var chat = Endpoint() + var chat = Endpoint() // MARK: - Batch @GET @@ -257,25 +314,31 @@ extension HumeAI { @POST @Path("/v0/batch/jobs") @Body(json: \.input) - var startInferenceJob = Endpoint() + var startInferenceJob = Endpoint() @GET - @Path({ context -> String in "/v0/batch/jobs/\(context.input.id)" }) - var getJobDetails = Endpoint() + @Path({ context -> String in + "/v0/batch/jobs/\(context.input.id)" + }) + var getJobDetails = Endpoint() @GET - @Path({ context -> String in "/v0/batch/jobs/\(context.input.id)/predictions" }) - var getJobPredictions = Endpoint() + @Path({ context -> String in + "/v0/batch/jobs/\(context.input.id)/predictions" + }) + var getJobPredictions = Endpoint() @GET - @Path({ context -> String in "/v0/batch/jobs/\(context.input.id)/artifacts" }) + @Path({ context -> String in + "/v0/batch/jobs/\(context.input.id)/artifacts" + }) var getJobArtifacts = Endpoint() // MARK: - Stream @POST @Path("/v0/stream") @Body(multipart: .input) - var streamInference = Endpoint() + var streamInference = Endpoint() // MARK: - Files @GET @@ -285,24 +348,32 @@ extension HumeAI { @POST @Path("/v0/files") @Body(multipart: .input) - var uploadFile = Endpoint() + var uploadFile = Endpoint() @GET - @Path({ context -> String in "/v0/files/\(context.input.id)" }) - var getFile = Endpoint() + @Path({ context -> String in + "/v0/files/\(context.input.id)" + }) + var getFile = Endpoint() @DELETE - @Path({ context -> String in "/v0/files/\(context.input.id)" }) + @Path({ context -> String in + "/v0/files/\(context.input.id)" + }) var deleteFile = Endpoint() @PATCH - @Path({ context -> String in "/v0/files/\(context.input.id)" }) + @Path({ context -> String in + "/v0/files/\(context.input.id)" + }) @Body(json: \.input) - var updateFileName = Endpoint() + var updateFileName = Endpoint() @GET - @Path({ context -> String in "/v0/files/\(context.input.id)/predictions" }) - var getFilePredictions = Endpoint() + @Path({ context -> String in + "/v0/files/\(context.input.id)/predictions" + }) + var getFilePredictions = Endpoint() // MARK: - Datasets @GET @@ -312,23 +383,31 @@ extension HumeAI { @POST @Path("/v0/datasets") @Body(json: \.input) - var createDataset = Endpoint() + var createDataset = Endpoint() @GET - @Path({ context -> String in "/v0/datasets/\(context.input.id)" }) - var getDataset = Endpoint() + @Path({ context -> String in + "/v0/datasets/\(context.input.id)" + }) + var getDataset = Endpoint() @POST - @Path({ context -> String in "/v0/datasets/\(context.input.id)/versions" }) + @Path({ context -> String in + "/v0/datasets/\(context.input.id)/versions" + }) @Body(json: \.input) var createDatasetVersion = Endpoint() @DELETE - @Path({ context -> String in "/v0/datasets/\(context.input.id)" }) + @Path({ context -> String in + "/v0/datasets/\(context.input.id)" + }) var deleteDataset = Endpoint() @GET - @Path({ context -> String in "/v0/datasets/\(context.input.id)/versions" }) + @Path({ context -> String in + "/v0/datasets/\(context.input.id)/versions" + }) var listDatasetVersions = Endpoint() // MARK: - Models @GET @@ -336,24 +415,34 @@ extension HumeAI { var listModels = Endpoint() @GET - @Path({ context -> String in "/v0/models/\(context.input.id)" }) - var getModel = Endpoint() + @Path({ context -> String in + "/v0/models/\(context.input.id)" + }) + var getModel = Endpoint() @PATCH - @Path({ context -> String in "/v0/models/\(context.input.id)" }) + @Path({ context -> String in + "/v0/models/\(context.input.id)" + }) @Body(json: \.input) - var updateModelName = Endpoint() + var updateModelName = Endpoint() @GET - @Path({ context -> String in "/v0/models/\(context.input.id)/versions" }) + @Path({ context -> String in + "/v0/models/\(context.input.id)/versions" + }) var listModelVersions = Endpoint() @GET - @Path({ context -> String in "/v0/models/\(context.input.id)/versions/\(context.input.versionId)" }) + @Path({ context -> String in + "/v0/models/\(context.input.id)/versions/\(context.input.versionId)" + }) var getModelVersion = Endpoint() @PATCH - @Path({ context -> String in "/v0/models/\(context.input.id)/versions/\(context.input.versionId)" }) + @Path({ context -> String in + "/v0/models/\(context.input.id)/versions/\(context.input.versionId)" + }) @Body(json: \.input) var updateModelDescription = Endpoint() @@ -361,12 +450,12 @@ extension HumeAI { @POST @Path("/v0/jobs/training") @Body(json: \.input) - var startTrainingJob = Endpoint() + var startTrainingJob = Endpoint() @POST @Path("/v0/jobs/inference") @Body(json: \.input) - var startCustomInferenceJob = Endpoint() + var startCustomInferenceJob = Endpoint() } } diff --git a/Sources/HumeAI/Intramodular/API/HumeAI.APISpeicification.ResponseBodies.swift b/Sources/HumeAI/Intramodular/API/HumeAI.APISpeicification.ResponseBodies.swift index 997b36f6..a4ad60d3 100644 --- a/Sources/HumeAI/Intramodular/API/HumeAI.APISpeicification.ResponseBodies.swift +++ b/Sources/HumeAI/Intramodular/API/HumeAI.APISpeicification.ResponseBodies.swift @@ -132,7 +132,7 @@ extension HumeAI.APISpecification { let pageNumber: Int let pageSize: Int let totalPages: Int - let chats: [Chat] + let chats: [HumeAI.Chat] private enum CodingKeys: String, CodingKey { case pageNumber = "page_number" @@ -143,20 +143,11 @@ extension HumeAI.APISpecification { } struct ChatEventList: Codable { - let events: [ChatEvent] + let events: [HumeAI.ChatEvent] } typealias ChatAudio = Data - struct Config: Codable { - let id: String - let name: String - let description: String? - let createdOn: Int64 - let modifiedOn: Int64 - let versions: [ConfigVersion]? - } - struct ConfigVersion: Codable { let id: String let configId: String @@ -170,7 +161,7 @@ extension HumeAI.APISpecification { let pageNumber: Int let pageSize: Int let totalPages: Int - let configs: [Config] + let configs: [HumeAI.Config] private enum CodingKeys: String, CodingKey { case pageNumber = "page_number" @@ -208,29 +199,11 @@ extension HumeAI.APISpecification { } } - struct Dataset: Codable { - let id: String - let name: String - let description: String? - let createdOn: Int64 - let modifiedOn: Int64 - let versions: [DatasetVersion]? - } - - struct DatasetVersion: Codable { - let id: String - let datasetId: String - let description: String? - let createdOn: Int64 - let modifiedOn: Int64 - let files: [File]? - } - struct DatasetList: Codable { let pageNumber: Int let pageSize: Int let totalPages: Int - let datasets: [Dataset] + let datasets: [HumeAI.Dataset] private enum CodingKeys: String, CodingKey { case pageNumber = "page_number" @@ -240,29 +213,11 @@ extension HumeAI.APISpecification { } } - struct File: Codable { - let id: String - let name: String - let size: Int - let mimeType: String - let createdOn: Int64 - let modifiedOn: Int64 - let metadata: [String: String]? - - private enum CodingKeys: String, CodingKey { - case id, name, size - case mimeType = "mime_type" - case createdOn = "created_on" - case modifiedOn = "modified_on" - case metadata - } - } - struct FileList: Codable { let pageNumber: Int let pageSize: Int let totalPages: Int - let files: [File] + let files: [HumeAI.File] private enum CodingKeys: String, CodingKey { case pageNumber = "page_number" @@ -304,30 +259,11 @@ extension HumeAI.APISpecification { } } - struct Prompt: Codable { - let id: String - let name: String - let description: String? - let createdOn: Int64 - let modifiedOn: Int64 - let versions: [PromptVersion]? - } - - struct PromptVersion: Codable { - let id: String - let promptId: String - let description: String? - let createdOn: Int64 - let modifiedOn: Int64 - let content: String - let metadata: [String: String]? - } - struct PromptList: Codable { let pageNumber: Int let pageSize: Int let totalPages: Int - let prompts: [Prompt] + let prompts: [HumeAI.Prompt] private enum CodingKeys: String, CodingKey { case pageNumber = "page_number" @@ -363,7 +299,7 @@ extension HumeAI.APISpecification { let pageNumber: Int let pageSize: Int let totalPages: Int - let tools: [Tool] + let tools: [HumeAI.Tool] private enum CodingKeys: String, CodingKey { case pageNumber = "page_number" diff --git a/Sources/HumeAI/Intramodular/HumeAI.Client-Batch.swift b/Sources/HumeAI/Intramodular/HumeAI.Client-Batch.swift index e0ac8101..f8eba3b7 100644 --- a/Sources/HumeAI/Intramodular/HumeAI.Client-Batch.swift +++ b/Sources/HumeAI/Intramodular/HumeAI.Client-Batch.swift @@ -11,18 +11,23 @@ import Merge extension HumeAI.Client { public func startInferenceJob( - files: [HumeAI.APISpecification.RequestBodies.BatchInferenceJobInput.FileInput], + files: [HumeAI.FileInput], models: [HumeAI.Model] - ) async throws -> HumeAI.APISpecification.ResponseBodies.Job { + ) async throws -> HumeAI.Job { let input = HumeAI.APISpecification.RequestBodies.BatchInferenceJobInput( - files: files, + files: files.map { .init(url: $0.url, mimeType: $0.mimeType, metadata: $0.metadata) }, models: models, callback: nil ) return try await run(\.startInferenceJob, with: input) } - public func getJobDetails(id: String) async throws -> HumeAI.APISpecification.ResponseBodies.Job { - try await run(\.getJobDetails, with: id) + public func getJobDetails( + id: String + ) async throws -> HumeAI.Job { + let input = HumeAI.APISpecification.PathInput.ID( + id: id + ) + return try await run(\.getJobDetails, with: input) } } diff --git a/Sources/HumeAI/Intramodular/HumeAI.Client-Chat.swift b/Sources/HumeAI/Intramodular/HumeAI.Client-Chat.swift index dc011978..8907a823 100644 --- a/Sources/HumeAI/Intramodular/HumeAI.Client-Chat.swift +++ b/Sources/HumeAI/Intramodular/HumeAI.Client-Chat.swift @@ -11,12 +11,12 @@ import Merge extension HumeAI.Client { public func chat( - messages: [HumeAI.APISpecification.RequestBodies.ChatRequest.Message], + messages: [HumeAI.ChatMessage], model: String, temperature: Double? = nil - ) async throws -> HumeAI.APISpecification.ResponseBodies.ChatResponse { + ) async throws -> HumeAI.ChatResponse { let input = HumeAI.APISpecification.RequestBodies.ChatRequest( - messages: messages, + messages: messages.map { .init(role: $0.role, content: $0.content) }, model: model, temperature: temperature, maxTokens: nil, diff --git a/Sources/HumeAI/Intramodular/HumeAI.Client-ChatGroups.swift b/Sources/HumeAI/Intramodular/HumeAI.Client-ChatGroups.swift index c3683617..8951cd10 100644 --- a/Sources/HumeAI/Intramodular/HumeAI.Client-ChatGroups.swift +++ b/Sources/HumeAI/Intramodular/HumeAI.Client-ChatGroups.swift @@ -10,12 +10,30 @@ import SwiftAPI import Merge extension HumeAI.Client { - public func listChatGroups() async throws -> [HumeAI.APISpecification.ResponseBodies.ChatGroup] { + public func listChatGroups() async throws -> [HumeAI.ChatGroup] { let response = try await run(\.listChatGroups) - return response.chatGroups + return response.chatGroups.map { chatGroup in + HumeAI.ChatGroup( + id: chatGroup.id, + name: chatGroup.name, + createdOn: chatGroup.createdOn, + modifiedOn: chatGroup.modifiedOn, + chats: chatGroup.chats?.compactMap { chat in + HumeAI.Chat( + id: chat.id, + name: chat.name, + createdOn: chat.createdOn, + modifiedOn: chat.modifiedOn + ) + } + ) + } } - public func getChatGroup(id: String) async throws -> HumeAI.APISpecification.ResponseBodies.ChatGroup { - try await run(\.getChatGroup, with: id) + public func getChatGroup(id: String) async throws -> HumeAI.ChatGroup { + let input = HumeAI.APISpecification.PathInput.ID( + id: id + ) + return try await run(\.getChatGroup, with: input) } } diff --git a/Sources/HumeAI/Intramodular/HumeAI.Client-Chats.swift b/Sources/HumeAI/Intramodular/HumeAI.Client-Chats.swift index d74c9979..d78e7efa 100644 --- a/Sources/HumeAI/Intramodular/HumeAI.Client-Chats.swift +++ b/Sources/HumeAI/Intramodular/HumeAI.Client-Chats.swift @@ -10,17 +10,26 @@ import SwiftAPI import Merge extension HumeAI.Client { - public func listChats() async throws -> [HumeAI.APISpecification.ResponseBodies.Chat] { + public func listChats() async throws -> [HumeAI.Chat] { let response = try await run(\.listChats) + return response.chats } - public func listChatEvents(chatId: String) async throws -> [HumeAI.APISpecification.ResponseBodies.ChatEvent] { - let response = try await run(\.listChatEvents, with: chatId) + public func listChatEvents(chatId: String) async throws -> [HumeAI.ChatEvent] { + let input = HumeAI.APISpecification.PathInput.ID( + id: chatId + ) + let response = try await run(\.listChatEvents, with: input) + return response.events } public func getChatAudio(chatId: String) async throws -> Data { - try await run(\.getChatAudio, with: chatId) + let input = HumeAI.APISpecification.PathInput.ID( + id: chatId + ) + + return try await run(\.getChatAudio, with: input) } } diff --git a/Sources/HumeAI/Intramodular/HumeAI.Client-Configs.swift b/Sources/HumeAI/Intramodular/HumeAI.Client-Configs.swift index a7a3d769..2bf56697 100644 --- a/Sources/HumeAI/Intramodular/HumeAI.Client-Configs.swift +++ b/Sources/HumeAI/Intramodular/HumeAI.Client-Configs.swift @@ -10,8 +10,9 @@ import SwiftAPI import Merge extension HumeAI.Client { - public func listConfigs() async throws -> [HumeAI.APISpecification.ResponseBodies.Config] { + public func listConfigs() async throws -> [HumeAI.Config] { let response = try await run(\.listConfigs) + return response.configs } @@ -19,7 +20,7 @@ extension HumeAI.Client { name: String, description: String?, settings: [String: String] - ) async throws -> HumeAI.APISpecification.ResponseBodies.Config { + ) async throws -> HumeAI.Config { let input = HumeAI.APISpecification.RequestBodies.CreateConfigInput( name: name, description: description, @@ -29,6 +30,10 @@ extension HumeAI.Client { } public func deleteConfig(id: String) async throws { - try await run(\.deleteConfig, with: id) + let input = HumeAI.APISpecification.PathInput.ID( + id: id + ) + + try await run(\.deleteConfig, with: input) } } diff --git a/Sources/HumeAI/Intramodular/HumeAI.Client-CustomVoices.swift b/Sources/HumeAI/Intramodular/HumeAI.Client-CustomVoices.swift index a27b698c..8751e6c7 100644 --- a/Sources/HumeAI/Intramodular/HumeAI.Client-CustomVoices.swift +++ b/Sources/HumeAI/Intramodular/HumeAI.Client-CustomVoices.swift @@ -10,7 +10,7 @@ import SwiftAPI import Merge extension HumeAI.Client { - public func listCustomVoices() async throws -> [HumeAI.APISpecification.ResponseBodies.Voice] { + public func listCustomVoices() async throws -> [HumeAI.Voice] { let response = try await run(\.listCustomVoices) return response.voices } @@ -18,17 +18,22 @@ extension HumeAI.Client { public func createCustomVoice( name: String, baseVoice: String, - parameters: HumeAI.APISpecification.ResponseBodies.VoiceParameters - ) async throws -> HumeAI.APISpecification.ResponseBodies.Voice { + model: HumeAI.Model, + parameters: HumeAI.Voice.Parameters + ) async throws -> HumeAI.Voice { let input = HumeAI.APISpecification.RequestBodies.CreateVoiceInput( name: name, baseVoice: baseVoice, + parameterModel: model.rawValue, parameters: parameters ) return try await run(\.createCustomVoice, with: input) } public func deleteCustomVoice(id: String) async throws { - try await run(\.deleteCustomVoice, with: id) + let input = HumeAI.APISpecification.PathInput.ID( + id: id + ) + try await run(\.deleteCustomVoice, with: input) } } diff --git a/Sources/HumeAI/Intramodular/HumeAI.Client-Datasets.swift b/Sources/HumeAI/Intramodular/HumeAI.Client-Datasets.swift index 800bbd19..9076da25 100644 --- a/Sources/HumeAI/Intramodular/HumeAI.Client-Datasets.swift +++ b/Sources/HumeAI/Intramodular/HumeAI.Client-Datasets.swift @@ -10,7 +10,7 @@ import SwiftAPI import Merge extension HumeAI.Client { - public func listDatasets() async throws -> [ResponseBodies.Dataset] { + public func listDatasets() async throws -> [HumeAI.Dataset] { let response = try await run(\.listDatasets) return response.datasets } @@ -19,7 +19,7 @@ extension HumeAI.Client { name: String, description: String?, fileIds: [String] - ) async throws -> HumeAI.APISpecification.ResponseBodies.Dataset { + ) async throws -> HumeAI.Dataset { let input = HumeAI.APISpecification.RequestBodies.CreateDatasetInput( name: name, description: description, @@ -29,6 +29,9 @@ extension HumeAI.Client { } public func deleteDataset(id: String) async throws { - try await run(\.deleteDataset, with: id) + let input = HumeAI.APISpecification.PathInput.ID( + id: id + ) + try await run(\.deleteDataset, with: input) } } diff --git a/Sources/HumeAI/Intramodular/HumeAI.Client-Files.swift b/Sources/HumeAI/Intramodular/HumeAI.Client-Files.swift index 0106a016..54184c71 100644 --- a/Sources/HumeAI/Intramodular/HumeAI.Client-Files.swift +++ b/Sources/HumeAI/Intramodular/HumeAI.Client-Files.swift @@ -10,7 +10,7 @@ import SwiftAPI import Merge extension HumeAI.Client { - public func listFiles() async throws -> [HumeAI.APISpecification.ResponseBodies.File] { + public func listFiles() async throws -> [HumeAI.File] { let response = try await run(\.listFiles) return response.files } @@ -19,12 +19,19 @@ extension HumeAI.Client { data: Data, name: String, metadata: [String: String]? = nil - ) async throws -> HumeAI.APISpecification.ResponseBodies.File { - let input = HumeAI.APISpecification.RequestBodies.UploadFileInput(file: data, name: name, metadata: metadata) + ) async throws -> HumeAI.File { + let input = HumeAI.APISpecification.RequestBodies.UploadFileInput( + file: data, + name: name, + metadata: metadata + ) return try await run(\.uploadFile, with: input) } public func deleteFile(id: String) async throws { - try await run(\.deleteFile, with: id) + let input = HumeAI.APISpecification.PathInput.ID( + id: id + ) + try await run(\.deleteFile, with: input) } } diff --git a/Sources/HumeAI/Intramodular/HumeAI.Client-Jobs.swift b/Sources/HumeAI/Intramodular/HumeAI.Client-Jobs.swift index 67af5eae..c96f9527 100644 --- a/Sources/HumeAI/Intramodular/HumeAI.Client-Jobs.swift +++ b/Sources/HumeAI/Intramodular/HumeAI.Client-Jobs.swift @@ -15,7 +15,7 @@ extension HumeAI.Client { name: String, description: String? = nil, configuration: [String: String] - ) async throws -> HumeAI.APISpecification.ResponseBodies.Job { + ) async throws -> HumeAI.Job { let input = HumeAI.APISpecification.RequestBodies.TrainingJobInput( datasetId: datasetId, name: name, @@ -27,9 +27,9 @@ extension HumeAI.Client { public func startCustomInferenceJob( modelId: String, - files: [HumeAI.APISpecification.RequestBodies.CustomInferenceJobInput.FileInput], + files: [HumeAI.FileInput], configuration: [String: String] - ) async throws -> HumeAI.APISpecification.ResponseBodies.Job { + ) async throws -> HumeAI.Job { let input = HumeAI.APISpecification.RequestBodies.CustomInferenceJobInput( modelId: modelId, files: files, diff --git a/Sources/HumeAI/Intramodular/HumeAI.Client-Models.swift b/Sources/HumeAI/Intramodular/HumeAI.Client-Models.swift index 4ff09ace..e34714ec 100644 --- a/Sources/HumeAI/Intramodular/HumeAI.Client-Models.swift +++ b/Sources/HumeAI/Intramodular/HumeAI.Client-Models.swift @@ -20,14 +20,20 @@ extension HumeAI.Client { public func getModel( id: String ) async throws -> HumeAI.Model { - try await run(\.getModel, with: id) + let input = HumeAI.APISpecification.PathInput.ID( + id: id + ) + return try await run(\.getModel, with: input) } public func updateModelName( id: String, name: String ) async throws -> HumeAI.Model { - let input = HumeAI.APISpecification.RequestBodies.UpdateModelNameInput(name: name) + let input = HumeAI.APISpecification.RequestBodies.UpdateModelNameInput( + id: id, + name: name + ) return try await run(\.updateModelName, with: input) } } diff --git a/Sources/HumeAI/Intramodular/HumeAI.Client-Prompts.swift b/Sources/HumeAI/Intramodular/HumeAI.Client-Prompts.swift index e69df57f..77c742ae 100644 --- a/Sources/HumeAI/Intramodular/HumeAI.Client-Prompts.swift +++ b/Sources/HumeAI/Intramodular/HumeAI.Client-Prompts.swift @@ -10,7 +10,7 @@ import SwiftAPI import Merge extension HumeAI.Client { - public func listPrompts() async throws -> [HumeAI.APISpecification.ResponseBodies.Prompt] { + public func listPrompts() async throws -> [HumeAI.Prompt] { let response = try await run(\.listPrompts) return response.prompts } @@ -19,7 +19,7 @@ extension HumeAI.Client { name: String, content: String, description: String? = nil - ) async throws -> HumeAI.APISpecification.ResponseBodies.Prompt { + ) async throws -> HumeAI.Prompt { let input = HumeAI.APISpecification.RequestBodies.CreatePromptInput( name: name, description: description, @@ -30,6 +30,9 @@ extension HumeAI.Client { } public func deletePrompt(id: String) async throws { - try await run(\.deletePrompt, with: id) + let input = HumeAI.APISpecification.PathInput.ID( + id: id + ) + try await run(\.deletePrompt, with: input) } } diff --git a/Sources/HumeAI/Intramodular/HumeAI.Client-Stream.swift b/Sources/HumeAI/Intramodular/HumeAI.Client-Stream.swift index 7e826cd8..6eddd27c 100644 --- a/Sources/HumeAI/Intramodular/HumeAI.Client-Stream.swift +++ b/Sources/HumeAI/Intramodular/HumeAI.Client-Stream.swift @@ -11,11 +11,17 @@ import Merge extension HumeAI.Client { public func streamInference( + id: String, file: Data, models: [HumeAI.Model], metadata: [String: String]? = nil - ) async throws -> HumeAI.APISpecification.ResponseBodies.Job { - let input = HumeAI.APISpecification.RequestBodies.StreamInput(file: file, models: models, metadata: metadata) + ) async throws -> HumeAI.Job { + let input = HumeAI.APISpecification.RequestBodies.StreamInput( + id: id, + file: file, + models: models, + metadata: metadata + ) return try await run(\.streamInference, with: input) } } diff --git a/Sources/HumeAI/Intramodular/HumeAI.Client-Tools.swift b/Sources/HumeAI/Intramodular/HumeAI.Client-Tools.swift index 43fca7e3..c09e9b36 100644 --- a/Sources/HumeAI/Intramodular/HumeAI.Client-Tools.swift +++ b/Sources/HumeAI/Intramodular/HumeAI.Client-Tools.swift @@ -10,17 +10,19 @@ import SwiftAPI import Merge extension HumeAI.Client { - public func listTools() async throws -> [HumeAI.APISpecification.ResponseBodies.Tool] { + public func listTools() async throws -> [HumeAI.Tool] { let response = try await run(\.listTools) return response.tools } public func createTool( + id: String, name: String, description: String?, configuration: [String: String] - ) async throws -> HumeAI.APISpecification.ResponseBodies.Tool { + ) async throws -> HumeAI.Tool { let input = HumeAI.APISpecification.RequestBodies.CreateToolInput( + id: id, name: name, description: description, configuration: .init(parameters: configuration) @@ -28,12 +30,23 @@ extension HumeAI.Client { return try await run(\.createTool, with: input) } - public func deleteTool(id: String) async throws { - try await run(\.deleteTool, with: id) + public func deleteTool( + id: String + ) async throws { + + let input = HumeAI.APISpecification.PathInput.ID(id: id) + + try await run(\.deleteTool, with: input) } - public func updateToolName(id: String, name: String) async throws -> HumeAI.APISpecification.ResponseBodies.Tool { - let input = HumeAI.APISpecification.RequestBodies.UpdateToolNameInput(name: name) + public func updateToolName( + id: String, + name: String + ) async throws -> HumeAI.Tool { + let input = HumeAI.APISpecification.RequestBodies.UpdateToolNameInput( + id: id, + name: name + ) return try await run(\.updateToolName, with: input) } } diff --git a/Sources/HumeAI/Intramodular/HumeAI.Client.swift b/Sources/HumeAI/Intramodular/HumeAI.Client.swift index 2adafb8f..5471ef16 100644 --- a/Sources/HumeAI/Intramodular/HumeAI.Client.swift +++ b/Sources/HumeAI/Intramodular/HumeAI.Client.swift @@ -44,7 +44,7 @@ extension HumeAI { extension HumeAI.Client { // Text to Speech public func getAllAvailableVoices() async throws -> [HumeAI.Voice] { - let response = try await run(\.listVoices) + let response = try await run(\.listCustomVoices) return response.voices } } diff --git a/Sources/HumeAI/Intramodular/Models/HumeAI.Chat.swift b/Sources/HumeAI/Intramodular/Models/HumeAI.Chat.swift new file mode 100644 index 00000000..8259acd0 --- /dev/null +++ b/Sources/HumeAI/Intramodular/Models/HumeAI.Chat.swift @@ -0,0 +1,15 @@ +// +// HumeAI.Chat.swift +// AI +// +// Created by Jared Davidson on 11/25/24. +// + +extension HumeAI { + public struct Chat: Codable { + public let id: String + public let name: String + public let createdOn: Int64 + public let modifiedOn: Int64 + } +} diff --git a/Sources/HumeAI/Intramodular/Models/HumeAI.ChatEvent.swift b/Sources/HumeAI/Intramodular/Models/HumeAI.ChatEvent.swift new file mode 100644 index 00000000..3d17547d --- /dev/null +++ b/Sources/HumeAI/Intramodular/Models/HumeAI.ChatEvent.swift @@ -0,0 +1,18 @@ +// +// HumeAI.ChatEvent.swift +// AI +// +// Created by Jared Davidson on 11/25/24. +// + +extension HumeAI { + public struct ChatEvent: Codable { + public let id: String + public let chatId: String + public let type: String + public let content: String + public let createdOn: Int64 + public let audioUrl: String? + public let metadata: [String: String]? + } +} diff --git a/Sources/HumeAI/Intramodular/Models/HumeAI.ChatGroup.swift b/Sources/HumeAI/Intramodular/Models/HumeAI.ChatGroup.swift new file mode 100644 index 00000000..3037b590 --- /dev/null +++ b/Sources/HumeAI/Intramodular/Models/HumeAI.ChatGroup.swift @@ -0,0 +1,16 @@ +// +// HumeAI.ChatGroup.swift +// AI +// +// Created by Jared Davidson on 11/25/24. +// + +extension HumeAI { + public struct ChatGroup { + public let id: String + public let name: String + public let createdOn: Int64 + public let modifiedOn: Int64 + public let chats: [Chat]? + } +} diff --git a/Sources/HumeAI/Intramodular/Models/HumeAI.ChatMessage.swift b/Sources/HumeAI/Intramodular/Models/HumeAI.ChatMessage.swift new file mode 100644 index 00000000..1085fbbb --- /dev/null +++ b/Sources/HumeAI/Intramodular/Models/HumeAI.ChatMessage.swift @@ -0,0 +1,18 @@ +// +// HumeAI.ChatMessage.swift +// AI +// +// Created by Jared Davidson on 11/25/24. +// + +extension HumeAI { + public struct ChatMessage { + public let role: String + public let content: String + + public init(role: String, content: String) { + self.role = role + self.content = content + } + } +} diff --git a/Sources/HumeAI/Intramodular/Models/HumeAI.ChatResponse.swift b/Sources/HumeAI/Intramodular/Models/HumeAI.ChatResponse.swift new file mode 100644 index 00000000..6353d5b2 --- /dev/null +++ b/Sources/HumeAI/Intramodular/Models/HumeAI.ChatResponse.swift @@ -0,0 +1,32 @@ +// +// HumeAI.ChatResponse.swift +// AI +// +// Created by Jared Davidson on 11/25/24. +// + +extension HumeAI { + public struct ChatResponse { + public let id: String + public let created: Int64 + public let choices: [Choice] + public let usage: Usage + + public struct Choice { + public let index: Int + public let message: Message + public let finishReason: String? + + public struct Message { + public let role: String + public let content: String + } + } + + public struct Usage { + public let promptTokens: Int + public let completionTokens: Int + public let totalTokens: Int + } + } +} diff --git a/Sources/HumeAI/Intramodular/Models/HumeAI.Config.swift b/Sources/HumeAI/Intramodular/Models/HumeAI.Config.swift new file mode 100644 index 00000000..6cd8d926 --- /dev/null +++ b/Sources/HumeAI/Intramodular/Models/HumeAI.Config.swift @@ -0,0 +1,26 @@ +// +// HumeAI.Config.swift +// AI +// +// Created by Jared Davidson on 11/25/24. +// + +extension HumeAI { + public struct Config: Codable { + public let id: String + public let name: String + public let description: String? + public let createdOn: Int64 + public let modifiedOn: Int64 + public let versions: [ConfigVersion]? + + public struct ConfigVersion: Codable { + public let id: String + public let configId: String + public let description: String? + public let createdOn: Int64 + public let modifiedOn: Int64 + public let settings: [String: String] + } + } +} diff --git a/Sources/HumeAI/Intramodular/Models/HumeAI.Dataset.swift b/Sources/HumeAI/Intramodular/Models/HumeAI.Dataset.swift new file mode 100644 index 00000000..ab06b510 --- /dev/null +++ b/Sources/HumeAI/Intramodular/Models/HumeAI.Dataset.swift @@ -0,0 +1,26 @@ +// +// HumeAI.Dataset.swift +// AI +// +// Created by Jared Davidson on 11/25/24. +// + +extension HumeAI { + public struct Dataset: Codable { + public let id: String + public let name: String + public let description: String? + public let createdOn: Int64 + public let modifiedOn: Int64 + public let versions: [DatasetVersion]? + + public struct DatasetVersion: Codable { + public let id: String + public let datasetId: String + public let description: String? + public let createdOn: Int64 + public let modifiedOn: Int64 + public let files: [HumeAI.File]? + } + } +} diff --git a/Sources/HumeAI/Intramodular/Models/HumeAI.File.swift b/Sources/HumeAI/Intramodular/Models/HumeAI.File.swift new file mode 100644 index 00000000..549e6589 --- /dev/null +++ b/Sources/HumeAI/Intramodular/Models/HumeAI.File.swift @@ -0,0 +1,18 @@ +// +// HumeAI.File.swift +// AI +// +// Created by Jared Davidson on 11/25/24. +// + +extension HumeAI { + public struct File: Codable { + public let id: String + public let name: String + public let size: Int + public let mimeType: String + public let createdOn: Int64 + public let modifiedOn: Int64 + public let metadata: [String: String]? + } +} diff --git a/Sources/HumeAI/Intramodular/Models/HumeAI.FileInput.swift b/Sources/HumeAI/Intramodular/Models/HumeAI.FileInput.swift new file mode 100644 index 00000000..b3d57c99 --- /dev/null +++ b/Sources/HumeAI/Intramodular/Models/HumeAI.FileInput.swift @@ -0,0 +1,20 @@ +// +// HumeAI.FileInput.swift +// AI +// +// Created by Jared Davidson on 11/25/24. +// + +extension HumeAI { + public struct FileInput: Codable { + public let url: String + public let mimeType: String + public let metadata: [String: String]? + + public init(url: String, mimeType: String, metadata: [String: String]? = nil) { + self.url = url + self.mimeType = mimeType + self.metadata = metadata + } + } +} diff --git a/Sources/HumeAI/Intramodular/Models/HumeAI.Job.swift b/Sources/HumeAI/Intramodular/Models/HumeAI.Job.swift new file mode 100644 index 00000000..5617d7bd --- /dev/null +++ b/Sources/HumeAI/Intramodular/Models/HumeAI.Job.swift @@ -0,0 +1,33 @@ +// +// HumeAI.Job.swift +// AI +// +// Created by Jared Davidson on 11/25/24. +// + +extension HumeAI { + public struct Job { + public let id: String + public let status: String + public let createdOn: Int64 + public let modifiedOn: Int64 + public let predictions: [Prediction]? + public let artifacts: [String: String]? + + public struct Prediction { + public let file: FileInfo + public let results: [ModelResult] + + public struct FileInfo { + public let url: String + public let mimeType: String + public let metadata: [String: String]? + } + + public struct ModelResult { + public let model: String + public let results: [String: String] + } + } + } +} diff --git a/Sources/HumeAI/Intramodular/Models/HumeAI.Prompt.swift b/Sources/HumeAI/Intramodular/Models/HumeAI.Prompt.swift new file mode 100644 index 00000000..362e4852 --- /dev/null +++ b/Sources/HumeAI/Intramodular/Models/HumeAI.Prompt.swift @@ -0,0 +1,27 @@ +// +// HumeAI.Prompt.swift +// AI +// +// Created by Jared Davidson on 11/25/24. +// + +extension HumeAI { + public struct Prompt: Codable { + public let id: String + public let name: String + public let description: String? + public let createdOn: Int64 + public let modifiedOn: Int64 + public let versions: [PromptVersion]? + + public struct PromptVersion: Codable { + public let id: String + public let promptId: String + public let description: String? + public let createdOn: Int64 + public let modifiedOn: Int64 + public let content: String + public let metadata: [String: String]? + } + } +} diff --git a/Sources/HumeAI/Intramodular/Models/HumeAI.Tool.swift b/Sources/HumeAI/Intramodular/Models/HumeAI.Tool.swift new file mode 100644 index 00000000..aa632f7c --- /dev/null +++ b/Sources/HumeAI/Intramodular/Models/HumeAI.Tool.swift @@ -0,0 +1,30 @@ +// +// HumeAI.Tool.swift +// AI +// +// Created by Jared Davidson on 11/25/24. +// + +extension HumeAI { + public struct Tool: Codable { + public let id: String + public let name: String + public let description: String? + public let createdOn: Int64 + public let modifiedOn: Int64 + public let versions: [ToolVersion]? + + public struct ToolVersion: Codable { + public let id: String + public let toolId: String + public let description: String? + public let createdOn: Int64 + public let modifiedOn: Int64 + public let configuration: Configuration + + public struct Configuration: Codable { + public let parameters: [String: String] + } + } + } +} From 73db59937d80ad86ae4f5ad18b0c9439d863efb7 Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Mon, 25 Nov 2024 11:52:50 -0700 Subject: [PATCH 033/271] Build succeeds --- Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift b/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift index 4986c993..625c6c8d 100644 --- a/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift +++ b/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift @@ -396,7 +396,7 @@ extension HumeAI { "/v0/datasets/\(context.input.id)/versions" }) @Body(json: \.input) - var createDatasetVersion = Endpoint() + var createDatasetVersion = Endpoint() @DELETE @Path({ context -> String in @@ -408,7 +408,7 @@ extension HumeAI { @Path({ context -> String in "/v0/datasets/\(context.input.id)/versions" }) - var listDatasetVersions = Endpoint() + var listDatasetVersions = Endpoint() // MARK: - Models @GET @Path("/v0/models") From b850efdb90289af84773df9eca1df770370e4fdb Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Mon, 25 Nov 2024 12:16:35 -0700 Subject: [PATCH 034/271] tests start --- .../API/HumeAI.APISpecification.swift | 50 +++--- Tests/HumeAI/Intramodular/Batch.swift | 47 +++++ Tests/HumeAI/Intramodular/Chat.swift | 32 ++++ Tests/HumeAI/Intramodular/ChatGroup.swift | 32 ++++ Tests/HumeAI/Intramodular/Config.swift | 56 ++++++ Tests/HumeAI/Intramodular/Dataset.swift | 56 ++++++ Tests/HumeAI/Intramodular/File.swift | 41 +++++ Tests/HumeAI/Intramodular/Job.swift | 168 ++++++++++++++++++ Tests/HumeAI/Intramodular/Model.swift | 42 +++++ Tests/HumeAI/Intramodular/Prompts.swift | 56 ++++++ Tests/HumeAI/Intramodular/Stream.swift | 21 +++ Tests/HumeAI/Intramodular/Tests.swift | 7 - Tests/HumeAI/Intramodular/Tools.swift | 56 ++++++ Tests/HumeAI/Intramodular/Voices.swift | 46 +++++ Tests/HumeAI/module.swift | 7 + 15 files changed, 685 insertions(+), 32 deletions(-) create mode 100644 Tests/HumeAI/Intramodular/Batch.swift create mode 100644 Tests/HumeAI/Intramodular/Chat.swift create mode 100644 Tests/HumeAI/Intramodular/ChatGroup.swift create mode 100644 Tests/HumeAI/Intramodular/Config.swift create mode 100644 Tests/HumeAI/Intramodular/Dataset.swift create mode 100644 Tests/HumeAI/Intramodular/File.swift create mode 100644 Tests/HumeAI/Intramodular/Job.swift create mode 100644 Tests/HumeAI/Intramodular/Model.swift create mode 100644 Tests/HumeAI/Intramodular/Prompts.swift create mode 100644 Tests/HumeAI/Intramodular/Stream.swift delete mode 100644 Tests/HumeAI/Intramodular/Tests.swift create mode 100644 Tests/HumeAI/Intramodular/Tools.swift create mode 100644 Tests/HumeAI/Intramodular/Voices.swift diff --git a/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift b/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift index 625c6c8d..9890841c 100644 --- a/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift +++ b/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift @@ -66,7 +66,7 @@ extension HumeAI { @POST @Path("/v0/tools") - @Body(json: \.input) + @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var createTool = Endpoint() @GET @@ -79,7 +79,7 @@ extension HumeAI { @Path({ context -> String in "/v0/tools/\(context.input.id)/versions" }) - @Body(json: \.input) + @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var createToolVersion = Endpoint() @DELETE @@ -92,7 +92,7 @@ extension HumeAI { @Path({ context -> String in "/v0/tools/\(context.input.id)" }) - @Body(json: \.input) + @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var updateToolName = Endpoint() @GET @@ -111,7 +111,7 @@ extension HumeAI { @Path({ context -> String in "/v0/tools/\(context.input.id)/versions/\(context.input.versionID)" }) - @Body(json: \.input) + @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var updateToolDescription = Endpoint() // MARK: - Prompts @@ -121,7 +121,7 @@ extension HumeAI { @POST @Path("/v0/prompts") - @Body(json: \.input) + @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var createPrompt = Endpoint() @GET @@ -134,7 +134,7 @@ extension HumeAI { @Path({ context -> String in "/v0/prompts/\(context.input.id)/versions" }) - @Body(json: \.input) + @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var createPromptVersion = Endpoint() @DELETE @@ -147,7 +147,7 @@ extension HumeAI { @Path({ context -> String in "/v0/prompts/\(context.input.id)" }) - @Body(json: \.input) + @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var updatePromptName = Endpoint() @GET @@ -166,7 +166,7 @@ extension HumeAI { @Path({ context -> String in "/v0/prompts/\(context.input.id)/versions/\(context.input.versionID)" }) - @Body(json: \.input) + @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var updatePromptDescription = Endpoint() // MARK: - Custom Voices @@ -176,7 +176,7 @@ extension HumeAI { @POST @Path("/v0/custom-voices") - @Body(json: \.input) + @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var createCustomVoice = Endpoint() @GET @@ -189,7 +189,7 @@ extension HumeAI { @Path({ context -> String in "/v0/custom-voices/\(context.input.id)/versions" }) - @Body(json: \.input) + @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var createCustomVoiceVersion = Endpoint() @DELETE @@ -202,7 +202,7 @@ extension HumeAI { @Path({ context -> String in "/v0/custom-voices/\(context.input.id)" }) - @Body(json: \.input) + @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var updateCustomVoiceName = Endpoint() // MARK: - Configs @@ -212,7 +212,7 @@ extension HumeAI { @POST @Path("/v0/configs") - @Body(json: \.input) + @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var createConfig = Endpoint() @GET @@ -225,7 +225,7 @@ extension HumeAI { @Path({ context -> String in "/v0/configs/\(context.input.id)/versions" }) - @Body(json: \.input) + @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var createConfigVersion = Endpoint() @DELETE @@ -238,7 +238,7 @@ extension HumeAI { @Path({ context -> String in "/v0/configs/\(context.input.id)" }) - @Body(json: \.input) + @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var updateConfigName = Endpoint() @GET @@ -257,7 +257,7 @@ extension HumeAI { @Path({ context -> String in "/v0/configs/\(context.input.id)/versions/\(context.input.versionID)" }) - @Body(json: \.input) + @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var updateConfigDescription = Endpoint() // MARK: - Chats @@ -303,7 +303,7 @@ extension HumeAI { // MARK: - Chat @POST @Path("/v0/chat") - @Body(json: \.input) + @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var chat = Endpoint() // MARK: - Batch @@ -313,7 +313,7 @@ extension HumeAI { @POST @Path("/v0/batch/jobs") - @Body(json: \.input) + @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var startInferenceJob = Endpoint() @GET @@ -366,7 +366,7 @@ extension HumeAI { @Path({ context -> String in "/v0/files/\(context.input.id)" }) - @Body(json: \.input) + @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var updateFileName = Endpoint() @GET @@ -382,7 +382,7 @@ extension HumeAI { @POST @Path("/v0/datasets") - @Body(json: \.input) + @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var createDataset = Endpoint() @GET @@ -395,7 +395,7 @@ extension HumeAI { @Path({ context -> String in "/v0/datasets/\(context.input.id)/versions" }) - @Body(json: \.input) + @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var createDatasetVersion = Endpoint() @DELETE @@ -424,7 +424,7 @@ extension HumeAI { @Path({ context -> String in "/v0/models/\(context.input.id)" }) - @Body(json: \.input) + @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var updateModelName = Endpoint() @GET @@ -443,18 +443,18 @@ extension HumeAI { @Path({ context -> String in "/v0/models/\(context.input.id)/versions/\(context.input.versionId)" }) - @Body(json: \.input) + @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var updateModelDescription = Endpoint() // MARK: - Jobs @POST @Path("/v0/jobs/training") - @Body(json: \.input) + @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var startTrainingJob = Endpoint() @POST @Path("/v0/jobs/inference") - @Body(json: \.input) + @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var startCustomInferenceJob = Endpoint() } } @@ -487,7 +487,7 @@ extension HumeAI.APISpecification { request = request .header("Accept", "application/json") - .header(.authorization(.bearer, apiKey)) + .header("X-Hume-Api-Key", apiKey) .header(.contentType(.json)) return request diff --git a/Tests/HumeAI/Intramodular/Batch.swift b/Tests/HumeAI/Intramodular/Batch.swift new file mode 100644 index 00000000..c241591f --- /dev/null +++ b/Tests/HumeAI/Intramodular/Batch.swift @@ -0,0 +1,47 @@ +// +// Batch.swift +// AI +// +// Created by Jared Davidson on 11/25/24. +// + +import XCTest +@testable import HumeAI + +final class HumeAIClientBatchTests: XCTestCase { + func testStartInferenceJob() async throws { + let job = try await client.startInferenceJob( + files: [.init( + url: "test-url", + mimeType: "test/mime" + )], + models: [.burst] + ) + XCTAssertNotNil(job) + } + + func testGetJobDetails() async throws { + let job = try await client.getJobDetails(id: "test-id") + XCTAssertNotNil(job) + } + + func testListJobs() async throws { + print("Needs Implementation") + XCTFail("Not implemented") + } + + func testGetJobPredictions() async throws { + print("Needs Implementation") + XCTFail("Not implemented") + } + + func testGetJobArtifacts() async throws { + print("Needs Implementation") + XCTFail("Not implemented") + } + + func testStartInferenceJobFromLocalFile() async throws { + print("Needs Implementation") + XCTFail("Not implemented") + } +} diff --git a/Tests/HumeAI/Intramodular/Chat.swift b/Tests/HumeAI/Intramodular/Chat.swift new file mode 100644 index 00000000..7708d3c2 --- /dev/null +++ b/Tests/HumeAI/Intramodular/Chat.swift @@ -0,0 +1,32 @@ +// +// Chat.swift +// AI +// +// Created by Jared Davidson on 11/25/24. +// + +import XCTest +@testable import HumeAI + +final class HumeAIClientChatTests: XCTestCase { + + func testListChats() async throws { + let chats = try await client.listChats() + XCTAssertNotNil(chats) + } + + func testListChatEvents() async throws { + let events = try await client.listChatEvents(chatId: "test-id") + XCTAssertNotNil(events) + } + + func testGetChatAudio() async throws { + let audio = try await client.getChatAudio(chatId: "test-id") + XCTAssertNotNil(audio) + } + + func testChat() async throws { + let response = try await client.chat(messages: [.init(role: "user", content: "Hello")], model: "test-model") + XCTAssertNotNil(response) + } +} diff --git a/Tests/HumeAI/Intramodular/ChatGroup.swift b/Tests/HumeAI/Intramodular/ChatGroup.swift new file mode 100644 index 00000000..b352eb9e --- /dev/null +++ b/Tests/HumeAI/Intramodular/ChatGroup.swift @@ -0,0 +1,32 @@ +// +// ChatGroup.swift +// AI +// +// Created by Jared Davidson on 11/25/24. +// + +import XCTest +@testable import HumeAI + +final class HumeAIClientChatGroupTests: XCTestCase { + + func testListChatGroups() async throws { + let groups = try await client.listChatGroups() + XCTAssertNotNil(groups) + } + + func testGetChatGroup() async throws { + let group = try await client.getChatGroup(id: "test-id") + XCTAssertNotNil(group) + } + + func testListChatGroupEvents() async throws { + print("Needs Implementation") + XCTFail("Not implemented") + } + + func testGetChatGroupAudio() async throws { + print("Needs Implementation") + XCTFail("Not implemented") + } +} diff --git a/Tests/HumeAI/Intramodular/Config.swift b/Tests/HumeAI/Intramodular/Config.swift new file mode 100644 index 00000000..979e2b99 --- /dev/null +++ b/Tests/HumeAI/Intramodular/Config.swift @@ -0,0 +1,56 @@ +// +// Config.swift +// AI +// +// Created by Jared Davidson on 11/25/24. +// + +import XCTest +@testable import HumeAI + +final class HumeAIClientConfigTests: XCTestCase { + + func testListConfigs() async throws { + let configs = try await client.listConfigs() + XCTAssertNotNil(configs) + } + + func testCreateConfig() async throws { + let config = try await client.createConfig(name: "Test Config", description: "Test Description", settings: ["key": "value"]) + XCTAssertEqual(config.name, "Test Config") + } + + func testDeleteConfig() async throws { + try await client.deleteConfig(id: "test-id") + } + + func testListConfigVersions() async throws { + print("Needs Implementation") + XCTFail("Not implemented") + } + + func testCreateConfigVersion() async throws { + print("Needs Implementation") + XCTFail("Not implemented") + } + + func testGetConfigVersion() async throws { + print("Needs Implementation") + XCTFail("Not implemented") + } + + func testDeleteConfigVersion() async throws { + print("Needs Implementation") + XCTFail("Not implemented") + } + + func testUpdateConfigName() async throws { + print("Needs Implementation") + XCTFail("Not implemented") + } + + func testUpdateConfigDescription() async throws { + print("Needs Implementation") + XCTFail("Not implemented") + } +} diff --git a/Tests/HumeAI/Intramodular/Dataset.swift b/Tests/HumeAI/Intramodular/Dataset.swift new file mode 100644 index 00000000..e401de16 --- /dev/null +++ b/Tests/HumeAI/Intramodular/Dataset.swift @@ -0,0 +1,56 @@ +// +// Dataset.swift +// AI +// +// Created by Jared Davidson on 11/25/24. +// + +import XCTest +@testable import HumeAI + +final class HumeAIClientDatasetTests: XCTestCase { + + func testListDatasets() async throws { + let datasets = try await client.listDatasets() + XCTAssertNotNil(datasets) + } + + func testCreateDataset() async throws { + let dataset = try await client.createDataset(name: "Test Dataset", description: "Test Description", fileIds: ["test-id"]) + XCTAssertNotNil(dataset) + } + + func testDeleteDataset() async throws { + try await client.deleteDataset(id: "test-id") + } + + func testGetDataset() async throws { + print("Needs Implementation") + XCTFail("Not implemented") + } + + func testCreateDatasetVersion() async throws { + print("Needs Implementation") + XCTFail("Not implemented") + } + + func testListDatasetVersions() async throws { + print("Needs Implementation") + XCTFail("Not implemented") + } + + func testListDatasetFiles() async throws { + print("Needs Implementation") + XCTFail("Not implemented") + } + + func testGetDatasetVersion() async throws { + print("Needs Implementation") + XCTFail("Not implemented") + } + + func testListDatasetVersionFiles() async throws { + print("Needs Implementation") + XCTFail("Not implemented") + } +} diff --git a/Tests/HumeAI/Intramodular/File.swift b/Tests/HumeAI/Intramodular/File.swift new file mode 100644 index 00000000..5a32fe02 --- /dev/null +++ b/Tests/HumeAI/Intramodular/File.swift @@ -0,0 +1,41 @@ +// +// File.swift +// AI +// +// Created by Jared Davidson on 11/25/24. +// + +import XCTest +@testable import HumeAI + +final class HumeAIClientFileTests: XCTestCase { + + func testListFiles() async throws { + let files = try await client.listFiles() + XCTAssertNotNil(files) + } + + func testUploadFile() async throws { + let file = try await client.uploadFile(data: Data(), name: "test.txt") + XCTAssertNotNil(file) + } + + func testDeleteFile() async throws { + try await client.deleteFile(id: "test-id") + } + + func testGetFile() async throws { + print("Needs Implementation") + XCTFail("Not implemented") + } + + func testUpdateFileName() async throws { + print("Needs Implementation") + XCTFail("Not implemented") + } + + func testGetFilePredictions() async throws { + print("Needs Implementation") + XCTFail("Not implemented") + } +} diff --git a/Tests/HumeAI/Intramodular/Job.swift b/Tests/HumeAI/Intramodular/Job.swift new file mode 100644 index 00000000..39464877 --- /dev/null +++ b/Tests/HumeAI/Intramodular/Job.swift @@ -0,0 +1,168 @@ +// +// Job.swift +// AI +// +// Created by Jared Davidson on 11/25/24. +// + +import XCTest +@testable import HumeAI + +final class HumeAIClientJobTests: XCTestCase { + + // Training Jobs + func testStartTrainingJob() async throws { + let job = try await client.startTrainingJob( + datasetId: "test-id", + name: "Test Training Job", + description: "Test Description", + configuration: ["key": "value"] + ) + XCTAssertNotNil(job) + XCTAssertEqual(job.status, "pending") // Assuming initial status is pending + XCTAssertNotNil(job.id) + } + + func testStartTrainingJobWithoutDescription() async throws { + let job = try await client.startTrainingJob( + datasetId: "test-id", + name: "Test Training Job", + configuration: ["key": "value"] + ) + XCTAssertNotNil(job) + } + + // Custom Inference Jobs + func testStartCustomInferenceJob() async throws { + let files = [ + HumeAI.FileInput( + url: "test-url", + mimeType: "test/mime", + metadata: ["key": "value"] + ) + ] + + let job = try await client.startCustomInferenceJob( + modelId: "test-id", + files: files, + configuration: ["key": "value"] + ) + XCTAssertNotNil(job) + XCTAssertNotNil(job.id) + } + + // Job Status and Progress + func testGetJobDetails() async throws { + let job = try await client.getJobDetails(id: "test-id") + XCTAssertNotNil(job) + XCTAssertNotNil(job.status) + XCTAssertNotNil(job.createdOn) + XCTAssertNotNil(job.modifiedOn) + } + + // Error Cases + func testStartTrainingJobWithInvalidDataset() async throws { + do { + _ = try await client.startTrainingJob( + datasetId: "invalid-id", + name: "Test Job", + configuration: ["key": "value"] + ) + XCTFail("Expected error for invalid dataset ID") + } catch { + // Expected error + XCTAssertNotNil(error) + } + } + + func testStartCustomInferenceJobWithInvalidModel() async throws { + do { + _ = try await client.startCustomInferenceJob( + modelId: "invalid-id", + files: [.init(url: "test-url", mimeType: "test/mime")], + configuration: ["key": "value"] + ) + XCTFail("Expected error for invalid model ID") + } catch { + // Expected error + XCTAssertNotNil(error) + } + } + + func testGetInvalidJobDetails() async throws { + do { + _ = try await client.getJobDetails(id: "invalid-id") + XCTFail("Expected error for invalid job ID") + } catch { + // Expected error + XCTAssertNotNil(error) + } + } + + // Job Results + func testJobPredictions() async throws { + let job = try await client.getJobDetails(id: "test-id") + + if let predictions = job.predictions { + for prediction in predictions { + // Validate file info + XCTAssertNotNil(prediction.file.url) + XCTAssertNotNil(prediction.file.mimeType) + + // Validate results + XCTAssertFalse(prediction.results.isEmpty) + for result in prediction.results { + XCTAssertNotNil(result.model) + XCTAssertNotNil(result.results) + } + } + } + } + + // Job Artifacts + func testJobArtifacts() async throws { + let job = try await client.getJobDetails(id: "test-id") + + if let artifacts = job.artifacts { + XCTAssertFalse(artifacts.isEmpty) + } + } + + // Unimplemented Methods Tests + func testListJobs() async throws { + print("Needs Implementation") + XCTFail("Not implemented") + } + + func testGetJobPredictions() async throws { + print("Needs Implementation") + XCTFail("Not implemented") + } + + func testGetJobArtifacts() async throws { + print("Needs Implementation") + XCTFail("Not implemented") + } + + func testStartInferenceJobFromLocalFile() async throws { + print("Needs Implementation") + XCTFail("Not implemented") + } + + // Job Status Transitions + func testJobStatusTransitions() async throws { + let job = try await client.getJobDetails(id: "test-id") + + // Verify status is a valid value + let validStatuses = ["pending", "running", "completed", "failed"] + XCTAssertTrue(validStatuses.contains(job.status)) + } + + // Validation Tests + func testJobTimestamps() async throws { + let job = try await client.getJobDetails(id: "test-id") + + // Created timestamp should be before or equal to modified timestamp + XCTAssertLessThanOrEqual(job.createdOn, job.modifiedOn) + } +} diff --git a/Tests/HumeAI/Intramodular/Model.swift b/Tests/HumeAI/Intramodular/Model.swift new file mode 100644 index 00000000..81cbca75 --- /dev/null +++ b/Tests/HumeAI/Intramodular/Model.swift @@ -0,0 +1,42 @@ +// +// Model.swift +// AI +// +// Created by Jared Davidson on 11/25/24. +// + +import XCTest +@testable import HumeAI + +final class HumeAIClientModelTests: XCTestCase { + + func testListModels() async throws { + let models = try await client.listModels() + XCTAssertNotNil(models) + } + + func testGetModel() async throws { + let model = try await client.getModel(id: "test-id") + XCTAssertNotNil(model) + } + + func testUpdateModelName() async throws { + let model = try await client.updateModelName(id: "test-id", name: "Updated Name") + XCTAssertNotNil(model) + } + + func testListModelVersions() async throws { + print("Needs Implementation") + XCTFail("Not implemented") + } + + func testGetModelVersion() async throws { + print("Needs Implementation") + XCTFail("Not implemented") + } + + func testUpdateModelDescription() async throws { + print("Needs Implementation") + XCTFail("Not implemented") + } +} diff --git a/Tests/HumeAI/Intramodular/Prompts.swift b/Tests/HumeAI/Intramodular/Prompts.swift new file mode 100644 index 00000000..abac71ce --- /dev/null +++ b/Tests/HumeAI/Intramodular/Prompts.swift @@ -0,0 +1,56 @@ +// +// Prompts.swift +// AI +// +// Created by Jared Davidson on 11/25/24. +// + +import XCTest +@testable import HumeAI + +final class HumeAIClientPromptTests: XCTestCase { + + func testListPrompts() async throws { + let prompts = try await client.listPrompts() + XCTAssertNotNil(prompts) + } + + func testCreatePrompt() async throws { + let prompt = try await client.createPrompt(name: "Test Prompt", content: "Test Content", description: "Test Description") + XCTAssertEqual(prompt.name, "Test Prompt") + } + + func testDeletePrompt() async throws { + try await client.deletePrompt(id: "test-id") + } + + func testListPromptVersions() async throws { + print("Needs Implementation") + XCTFail("Not implemented") + } + + func testCreatePromptVersion() async throws { + print("Needs Implementation") + XCTFail("Not implemented") + } + + func testGetPromptVersion() async throws { + print("Needs Implementation") + XCTFail("Not implemented") + } + + func testDeletePromptVersion() async throws { + print("Needs Implementation") + XCTFail("Not implemented") + } + + func testUpdatePromptName() async throws { + print("Needs Implementation") + XCTFail("Not implemented") + } + + func testUpdatePromptDescription() async throws { + print("Needs Implementation") + XCTFail("Not implemented") + } +} diff --git a/Tests/HumeAI/Intramodular/Stream.swift b/Tests/HumeAI/Intramodular/Stream.swift new file mode 100644 index 00000000..b27e4539 --- /dev/null +++ b/Tests/HumeAI/Intramodular/Stream.swift @@ -0,0 +1,21 @@ +// +// Stream.swift +// AI +// +// Created by Jared Davidson on 11/25/24. +// + +import XCTest +@testable import HumeAI + +final class HumeAIClientStreamTests: XCTestCase { + + func testStreamInference() async throws { + let job = try await client.streamInference( + id: "test-id", + file: Data(), + models: [.language] + ) + XCTAssertNotNil(job) + } +} diff --git a/Tests/HumeAI/Intramodular/Tests.swift b/Tests/HumeAI/Intramodular/Tests.swift deleted file mode 100644 index f09e84e7..00000000 --- a/Tests/HumeAI/Intramodular/Tests.swift +++ /dev/null @@ -1,7 +0,0 @@ -// -// Tests.swift -// AI -// -// Created by Jared Davidson on 11/22/24. -// - diff --git a/Tests/HumeAI/Intramodular/Tools.swift b/Tests/HumeAI/Intramodular/Tools.swift new file mode 100644 index 00000000..e888c2e5 --- /dev/null +++ b/Tests/HumeAI/Intramodular/Tools.swift @@ -0,0 +1,56 @@ +// +// Tools.swift +// AI +// +// Created by Jared Davidson on 11/25/24. +// + +import XCTest +@testable import HumeAI + +final class HumeAIClientToolTests: XCTestCase { + + func testListTools() async throws { + let tools = try await client.listTools() + XCTAssertNotNil(tools) + } + + func testCreateTool() async throws { + let tool = try await client.createTool(id: "test-id", name: "Test Tool", description: "Test Description", configuration: ["key": "value"]) + XCTAssertEqual(tool.name, "Test Tool") + } + + func testListToolVersions() async throws { + print("Needs Implementation") + XCTFail("Not implemented") + } + + func testCreateToolVersion() async throws { + print("Needs Implementation") + XCTFail("Not implemented") + } + + func testDeleteTool() async throws { + try await client.deleteTool(id: "test-id") + } + + func testUpdateToolName() async throws { + let tool = try await client.updateToolName(id: "test-id", name: "Updated Name") + XCTAssertEqual(tool.name, "Updated Name") + } + + func testGetToolVersion() async throws { + print("Needs Implementation") + XCTFail("Not implemented") + } + + func testDeleteToolVersion() async throws { + print("Needs Implementation") + XCTFail("Not implemented") + } + + func testUpdateToolDescription() async throws { + print("Needs Implementation") + XCTFail("Not implemented") + } +} diff --git a/Tests/HumeAI/Intramodular/Voices.swift b/Tests/HumeAI/Intramodular/Voices.swift new file mode 100644 index 00000000..6ac53a3e --- /dev/null +++ b/Tests/HumeAI/Intramodular/Voices.swift @@ -0,0 +1,46 @@ +// +// Voices.swift +// AI +// +// Created by Jared Davidson on 11/25/24. +// + +import XCTest +@testable import HumeAI + +final class HumeAIClientCustomVoiceTests: XCTestCase { + + func testListCustomVoices() async throws { + let voices = try await client.listCustomVoices() + XCTAssertNotNil(voices) + } + + func testCreateCustomVoice() async throws { + let voice = try await client.createCustomVoice( + name: "Test Voice", + baseVoice: "base-voice", + model: .prosody, + parameters: .init() + ) + XCTAssertEqual(voice.name, "Test Voice") + } + + func testDeleteCustomVoice() async throws { + try await client.deleteCustomVoice(id: "test-id") + } + + func testGetCustomVoice() async throws { + print("Needs Implementation") + XCTFail("Not implemented") + } + + func testCreateCustomVoiceVersion() async throws { + print("Needs Implementation") + XCTFail("Not implemented") + } + + func testUpdateCustomVoiceName() async throws { + print("Needs Implementation") + XCTFail("Not implemented") + } +} diff --git a/Tests/HumeAI/module.swift b/Tests/HumeAI/module.swift index 1c4d3b99..a0cddc5f 100644 --- a/Tests/HumeAI/module.swift +++ b/Tests/HumeAI/module.swift @@ -5,3 +5,10 @@ // Created by Jared Davidson on 11/22/24. // +import HumeAI + +let HUMEAI_API_KEY = "Ei8s58Zp0JWqH9g00N8LdOFnpu03H4uj1Nr300OAh5dsdiGr" + +var client = HumeAI.Client( + apiKey: HUMEAI_API_KEY +) From eb9f69cc607dd89f4e30e116bb778173693a73be Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Mon, 25 Nov 2024 15:37:17 -0700 Subject: [PATCH 035/271] Testing --- ...umeAI.APISpecification.RequestBodies.swift | 14 +- .../API/HumeAI.APISpecification.swift | 141 ++++++------ ...eAI.APISpeicification.ResponseBodies.swift | 75 +----- .../Intramodular/HumeAI.Client-Batch.swift | 25 +- .../HumeAI.Client-CustomVoices.swift | 2 +- .../Intramodular/HumeAI.Client-Jobs.swift | 4 +- .../Intramodular/HumeAI.Client-Tools.swift | 34 ++- .../HumeAI/Intramodular/HumeAI.Model.swift | 167 +++++++++++++- .../Intramodular/Models/HumeAI.Job.swift | 109 +++++++-- .../Models/HumeAI.JobPrediction.swift | 67 ++++++ .../Intramodular/Models/HumeAI.Tool.swift | 7 +- Tests/HumeAI/Intramodular/Batch.swift | 24 +- Tests/HumeAI/Intramodular/Chat.swift | 8 +- Tests/HumeAI/Intramodular/Job.swift | 214 +++++++----------- Tests/HumeAI/Intramodular/Stream.swift | 2 +- Tests/HumeAI/Intramodular/Tools.swift | 74 +++++- Tests/HumeAI/Intramodular/Voices.swift | 2 +- 17 files changed, 627 insertions(+), 342 deletions(-) create mode 100644 Sources/HumeAI/Intramodular/Models/HumeAI.JobPrediction.swift diff --git a/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.RequestBodies.swift b/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.RequestBodies.swift index 066e2695..7788010e 100644 --- a/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.RequestBodies.swift +++ b/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.RequestBodies.swift @@ -55,8 +55,8 @@ extension HumeAI.APISpecification { } struct BatchInferenceJobInput: Codable { - let files: [HumeAI.FileInput] - let models: [HumeAI.Model] + let urls: [URL] + let models: HumeAI.Model let callback: CallbackConfig? } @@ -238,14 +238,12 @@ extension HumeAI.APISpecification { } struct CreateToolInput: Codable { - let id: String + var id: String? = nil let name: String + let parameters: String + let versionDescription: String? let description: String? - let configuration: Configuration - - struct Configuration: Codable { - let parameters: [String: String] - } + let fallbackContent: String? } struct CreateToolVersionInput: Codable { diff --git a/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift b/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift index 9890841c..06d14b68 100644 --- a/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift +++ b/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift @@ -61,260 +61,260 @@ extension HumeAI { // MARK: - Tools @GET - @Path("/v0/tools") + @Path("/v0/evi/tools") var listTools = Endpoint() @POST - @Path("/v0/tools") + @Path("/v0/evi/tools") @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var createTool = Endpoint() @GET @Path({ context -> String in - "/v0/tools/\(context.input.id)/versions" + "/v0/evi/tools/\(context.input.id)/versions" }) var listToolVersions = Endpoint() @POST @Path({ context -> String in - "/v0/tools/\(context.input.id)/versions" + "/v0/evi/tools/\(context.input.id ?? "")" }) @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var createToolVersion = Endpoint() @DELETE @Path({ context -> String in - "/v0/tools/\(context.input.id)" + "/v0/evi/tools/\(context.input.id)" }) var deleteTool = Endpoint() @PATCH @Path({ context -> String in - "/v0/tools/\(context.input.id)" + "/v0/evi/tools/\(context.input.id)" }) @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var updateToolName = Endpoint() @GET @Path({ context -> String in - "/v0/tools/\(context.input.id)/versions/\(context.input.versionId)" + "/v0/evi/tools/\(context.input.id)/versions/\(context.input.versionId)" }) var getToolVersion = Endpoint() @DELETE @Path({ context -> String in - "/v0/tools/\(context.input.id)/versions/\(context.input.versionId)" + "/v0/evi/tools/\(context.input.id)/versions/\(context.input.versionId)" }) var deleteToolVersion = Endpoint() @PATCH @Path({ context -> String in - "/v0/tools/\(context.input.id)/versions/\(context.input.versionID)" + "/v0/evi/tools/\(context.input.id)/versions/\(context.input.versionID)" }) @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var updateToolDescription = Endpoint() // MARK: - Prompts @GET - @Path("/v0/prompts") + @Path("/v0/evi/prompts") var listPrompts = Endpoint() @POST - @Path("/v0/prompts") + @Path("/v0/evi/prompts") @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var createPrompt = Endpoint() @GET @Path({ context -> String in - "/v0/prompts/\(context.input.id)/versions" + "/v0/evi/prompts/\(context.input.id)/versions" }) var listPromptVersions = Endpoint() @POST @Path({ context -> String in - "/v0/prompts/\(context.input.id)/versions" + "/v0/evi/prompts/\(context.input.id)/versions" }) @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var createPromptVersion = Endpoint() @DELETE @Path({ context -> String in - "/v0/prompts/\(context.input.id)" + "/v0/evi/prompts/\(context.input.id)" }) var deletePrompt = Endpoint() @PATCH @Path({ context -> String in - "/v0/prompts/\(context.input.id)" + "/v0/evi/prompts/\(context.input.id)" }) @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var updatePromptName = Endpoint() @GET @Path({ context -> String in - "/v0/prompts/\(context.input.id)/versions/\(context.input.versionId)" + "/v0/evi/prompts/\(context.input.id)/versions/\(context.input.versionId)" }) var getPromptVersion = Endpoint() @DELETE @Path({ context -> String in - "/v0/prompts/\(context.input.id)/versions/\(context.input.versionId)" + "/v0/evi/prompts/\(context.input.id)/versions/\(context.input.versionId)" }) var deletePromptVersion = Endpoint() @PATCH @Path({ context -> String in - "/v0/prompts/\(context.input.id)/versions/\(context.input.versionID)" + "/v0/evi/prompts/\(context.input.id)/versions/\(context.input.versionID)" }) @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var updatePromptDescription = Endpoint() // MARK: - Custom Voices @GET - @Path("/v0/custom-voices") + @Path("/v0/evi/custom-voices") var listCustomVoices = Endpoint() @POST - @Path("/v0/custom-voices") + @Path("/v0/evi/custom-voices") @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var createCustomVoice = Endpoint() @GET @Path({ context -> String in - "/v0/custom-voices/\(context.input.id)" + "/v0/evi/custom-voices/\(context.input.id)" }) var getCustomVoice = Endpoint() @POST @Path({ context -> String in - "/v0/custom-voices/\(context.input.id)/versions" + "/v0/evi/custom-voices/\(context.input.id)/versions" }) @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var createCustomVoiceVersion = Endpoint() @DELETE @Path({ context -> String in - "/v0/custom-voices/\(context.input.id)" + "/v0/evi/custom-voices/\(context.input.id)" }) var deleteCustomVoice = Endpoint() @PATCH @Path({ context -> String in - "/v0/custom-voices/\(context.input.id)" + "/v0/evi/custom-voices/\(context.input.id)" }) @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var updateCustomVoiceName = Endpoint() // MARK: - Configs @GET - @Path("/v0/configs") + @Path("/v0/evi/configs") var listConfigs = Endpoint() @POST - @Path("/v0/configs") + @Path("/v0/evi/configs") @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var createConfig = Endpoint() @GET @Path({ context -> String in - "/v0/configs/\(context.input.id)/versions" + "/v0/evi/configs/\(context.input.id)/versions" }) var listConfigVersions = Endpoint() @POST @Path({ context -> String in - "/v0/configs/\(context.input.id)/versions" + "/v0/evi/configs/\(context.input.id)/versions" }) @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var createConfigVersion = Endpoint() @DELETE @Path({ context -> String in - "/v0/configs/\(context.input.id)" + "/v0/evi/configs/\(context.input.id)" }) var deleteConfig = Endpoint() @PATCH @Path({ context -> String in - "/v0/configs/\(context.input.id)" + "/v0/evi/configs/\(context.input.id)" }) @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var updateConfigName = Endpoint() @GET @Path({ context -> String in - "/v0/configs/\(context.input.id)/versions/\(context.input.versionId)" + "/v0/evi/configs/\(context.input.id)/versions/\(context.input.versionId)" }) var getConfigVersion = Endpoint() @DELETE @Path({ context -> String in - "/v0/configs/\(context.input.id)/versions/\(context.input.versionId)" + "/v0/evi/configs/\(context.input.id)/versions/\(context.input.versionId)" }) var deleteConfigVersion = Endpoint() @PATCH @Path({ context -> String in - "/v0/configs/\(context.input.id)/versions/\(context.input.versionID)" + "/v0/evi/configs/\(context.input.id)/versions/\(context.input.versionID)" }) @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var updateConfigDescription = Endpoint() // MARK: - Chats @GET - @Path("/v0/chats") + @Path("/v0/evi/chats") var listChats = Endpoint() @GET @Path({ context -> String in - "/v0/chats/\(context.input.id)/events" + "/v0/evi/chats/\(context.input.id)/events" }) var listChatEvents = Endpoint() @GET @Path({ context -> String in - "/v0/chats/\(context.input.id)/audio" + "/v0/evi/chats/\(context.input.id)/audio" }) var getChatAudio = Endpoint() // MARK: - Chat Groups @GET - @Path("/v0/chat-groups") + @Path("/v0/evi/chat-groups") var listChatGroups = Endpoint() @GET @Path({ context -> String in - "/v0/chat-groups/\(context.input.id)" + "/v0/evi/chat-groups/\(context.input.id)" }) var getChatGroup = Endpoint() @GET @Path({ context -> String in - "/v0/chat-groups/\(context.input.id)/events" + "/v0/evi/chat-groups/\(context.input.id)/events" }) var listChatGroupEvents = Endpoint() @GET @Path({ context -> String in - "/v0/chat-groups/\(context.input.id)/audio" + "/v0/evi/chat-groups/\(context.input.id)/audio" }) var getChatGroupAudio = Endpoint() // MARK: - Chat @POST - @Path("/v0/chat") + @Path("/v0/evi/chat") @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var chat = Endpoint() // MARK: - Batch @GET @Path("/v0/batch/jobs") - var listJobs = Endpoint() + var listJobs = Endpoint() @POST @Path("/v0/batch/jobs") - @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) - var startInferenceJob = Endpoint() + @Body(json: \.input) + var startInferenceJob = Endpoint() @GET @Path({ context -> String in @@ -326,7 +326,7 @@ extension HumeAI { @Path({ context -> String in "/v0/batch/jobs/\(context.input.id)/predictions" }) - var getJobPredictions = Endpoint() + var getJobPredictions = Endpoint() @GET @Path({ context -> String in @@ -336,126 +336,126 @@ extension HumeAI { // MARK: - Stream @POST - @Path("/v0/stream") + @Path("/v0/stream/models") @Body(multipart: .input) var streamInference = Endpoint() // MARK: - Files @GET - @Path("/v0/files") + @Path("/v0/registry/files") var listFiles = Endpoint() @POST - @Path("/v0/files") + @Path("/v0/registry/files") @Body(multipart: .input) var uploadFile = Endpoint() @GET @Path({ context -> String in - "/v0/files/\(context.input.id)" + "/v0/registry/files/\(context.input.id)" }) var getFile = Endpoint() @DELETE @Path({ context -> String in - "/v0/files/\(context.input.id)" + "/v0/registry/files/\(context.input.id)" }) var deleteFile = Endpoint() @PATCH @Path({ context -> String in - "/v0/files/\(context.input.id)" + "/v0/registry/files/\(context.input.id)" }) @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var updateFileName = Endpoint() @GET @Path({ context -> String in - "/v0/files/\(context.input.id)/predictions" + "/v0/registry/files/\(context.input.id)/predictions" }) - var getFilePredictions = Endpoint() + var getFilePredictions = Endpoint() // MARK: - Datasets @GET - @Path("/v0/datasets") + @Path("/v0/registry/datasets") var listDatasets = Endpoint() @POST - @Path("/v0/datasets") + @Path("/v0/registry/datasets") @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var createDataset = Endpoint() @GET @Path({ context -> String in - "/v0/datasets/\(context.input.id)" + "/v0/registry/datasets/\(context.input.id)" }) var getDataset = Endpoint() @POST @Path({ context -> String in - "/v0/datasets/\(context.input.id)/versions" + "/v0/registry/datasets/\(context.input.id)/versions" }) @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var createDatasetVersion = Endpoint() @DELETE @Path({ context -> String in - "/v0/datasets/\(context.input.id)" + "/v0/registry/datasets/\(context.input.id)" }) var deleteDataset = Endpoint() @GET @Path({ context -> String in - "/v0/datasets/\(context.input.id)/versions" + "/v0/registry/datasets/\(context.input.id)/versions" }) var listDatasetVersions = Endpoint() // MARK: - Models @GET - @Path("/v0/models") + @Path("/v0/registry/models") var listModels = Endpoint() @GET @Path({ context -> String in - "/v0/models/\(context.input.id)" + "/v0/registry/models/\(context.input.id)" }) var getModel = Endpoint() @PATCH @Path({ context -> String in - "/v0/models/\(context.input.id)" + "/v0/registry/models/\(context.input.id)" }) @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var updateModelName = Endpoint() @GET @Path({ context -> String in - "/v0/models/\(context.input.id)/versions" + "/v0/registry/models/\(context.input.id)/versions" }) var listModelVersions = Endpoint() @GET @Path({ context -> String in - "/v0/models/\(context.input.id)/versions/\(context.input.versionId)" + "/v0/registry/models/\(context.input.id)/versions/\(context.input.versionId)" }) var getModelVersion = Endpoint() @PATCH @Path({ context -> String in - "/v0/models/\(context.input.id)/versions/\(context.input.versionId)" + "/v0/registry/models/\(context.input.id)/versions/\(context.input.versionId)" }) @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var updateModelDescription = Endpoint() // MARK: - Jobs @POST - @Path("/v0/jobs/training") + @Path("/v0/registry/v0/batch/jobs/tl/train") @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) - var startTrainingJob = Endpoint() + var startTrainingJob = Endpoint() @POST - @Path("/v0/jobs/inference") + @Path("/v0/batch/jobs/tl/inference") @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) - var startCustomInferenceJob = Endpoint() + var startCustomInferenceJob = Endpoint() } } @@ -486,7 +486,6 @@ extension HumeAI.APISpecification { } request = request - .header("Accept", "application/json") .header("X-Hume-Api-Key", apiKey) .header(.contentType(.json)) @@ -497,6 +496,8 @@ extension HumeAI.APISpecification { from response: HTTPResponse, context: DecodeOutputContext ) throws -> Output { + + print(response) do { try response.validate() } catch { diff --git a/Sources/HumeAI/Intramodular/API/HumeAI.APISpeicification.ResponseBodies.swift b/Sources/HumeAI/Intramodular/API/HumeAI.APISpeicification.ResponseBodies.swift index a4ad60d3..5ce1f6ab 100644 --- a/Sources/HumeAI/Intramodular/API/HumeAI.APISpeicification.ResponseBodies.swift +++ b/Sources/HumeAI/Intramodular/API/HumeAI.APISpeicification.ResponseBodies.swift @@ -102,13 +102,6 @@ extension HumeAI.APISpecification { let pageSize: Int let totalPages: Int let chatGroups: [ChatGroup] - - private enum CodingKeys: String, CodingKey { - case pageNumber = "page_number" - case pageSize = "page_size" - case totalPages = "total_pages" - case chatGroups = "chat_groups_page" - } } struct Chat: Codable { @@ -273,85 +266,27 @@ extension HumeAI.APISpecification { } } - struct Tool: Codable { - let id: String - let name: String - let description: String? - let createdOn: Int64 - let modifiedOn: Int64 - let versions: [ToolVersion]? - } - struct ToolVersion: Codable { let id: String - let toolId: String + let version: Int + let toolId: String? let description: String? let createdOn: Int64 let modifiedOn: Int64 - let configuration: Configuration - - struct Configuration: Codable { - let parameters: [String: String] - } } struct ToolList: Codable { let pageNumber: Int let pageSize: Int let totalPages: Int - let tools: [HumeAI.Tool] - - private enum CodingKeys: String, CodingKey { - case pageNumber = "page_number" - case pageSize = "page_size" - case totalPages = "total_pages" - case tools = "tools_page" - } + let toolsPage: [HumeAI.Tool] } - - struct Job: Codable { - let id: String - let status: String - let createdOn: Int64 - let modifiedOn: Int64 - let predictions: [Prediction]? - let artifacts: [String: String]? - - struct Prediction: Codable { - let file: FileInfo - let results: [ModelResult] - - struct FileInfo: Codable { - let url: String - let mimeType: String - let metadata: [String: String]? - - private enum CodingKeys: String, CodingKey { - case url - case mimeType = "mime_type" - case metadata - } - } - - struct ModelResult: Codable { - let model: String - let results: [String: String] - } - } - } - + struct JobList: Codable { let pageNumber: Int let pageSize: Int let totalPages: Int - let jobs: [Job] - - private enum CodingKeys: String, CodingKey { - case pageNumber = "page_number" - case pageSize = "page_size" - case totalPages = "total_pages" - case jobs = "jobs_page" - } + let jobs: [HumeAI.Job] } } } diff --git a/Sources/HumeAI/Intramodular/HumeAI.Client-Batch.swift b/Sources/HumeAI/Intramodular/HumeAI.Client-Batch.swift index f8eba3b7..97dca70d 100644 --- a/Sources/HumeAI/Intramodular/HumeAI.Client-Batch.swift +++ b/Sources/HumeAI/Intramodular/HumeAI.Client-Batch.swift @@ -11,11 +11,11 @@ import Merge extension HumeAI.Client { public func startInferenceJob( - files: [HumeAI.FileInput], - models: [HumeAI.Model] - ) async throws -> HumeAI.Job { + urls: [URL], + models: HumeAI.Model + ) async throws -> HumeAI.JobID { let input = HumeAI.APISpecification.RequestBodies.BatchInferenceJobInput( - files: files.map { .init(url: $0.url, mimeType: $0.mimeType, metadata: $0.metadata) }, + urls: urls, models: models, callback: nil ) @@ -30,4 +30,21 @@ extension HumeAI.Client { ) return try await run(\.getJobDetails, with: input) } + + public func getJobPredictions( + id: String + ) async throws -> [HumeAI.JobPrediction] { + let input = HumeAI.APISpecification.PathInput.ID( + id: id + ) + return try await run(\.getJobPredictions, with: input) + } + public func listJobs() async throws -> [HumeAI.Job] { + return try await run(\.listJobs, with: ()) + } + + public func getJobArtifacts(id: String) async throws -> [String: String] { + let input = HumeAI.APISpecification.PathInput.ID(id: id) + return try await run(\.getJobArtifacts, with: input) + } } diff --git a/Sources/HumeAI/Intramodular/HumeAI.Client-CustomVoices.swift b/Sources/HumeAI/Intramodular/HumeAI.Client-CustomVoices.swift index 8751e6c7..caadc511 100644 --- a/Sources/HumeAI/Intramodular/HumeAI.Client-CustomVoices.swift +++ b/Sources/HumeAI/Intramodular/HumeAI.Client-CustomVoices.swift @@ -24,7 +24,7 @@ extension HumeAI.Client { let input = HumeAI.APISpecification.RequestBodies.CreateVoiceInput( name: name, baseVoice: baseVoice, - parameterModel: model.rawValue, + parameterModel: HumeAI.paramaterModel, parameters: parameters ) return try await run(\.createCustomVoice, with: input) diff --git a/Sources/HumeAI/Intramodular/HumeAI.Client-Jobs.swift b/Sources/HumeAI/Intramodular/HumeAI.Client-Jobs.swift index c96f9527..5ff142f6 100644 --- a/Sources/HumeAI/Intramodular/HumeAI.Client-Jobs.swift +++ b/Sources/HumeAI/Intramodular/HumeAI.Client-Jobs.swift @@ -15,7 +15,7 @@ extension HumeAI.Client { name: String, description: String? = nil, configuration: [String: String] - ) async throws -> HumeAI.Job { + ) async throws -> HumeAI.JobID { let input = HumeAI.APISpecification.RequestBodies.TrainingJobInput( datasetId: datasetId, name: name, @@ -29,7 +29,7 @@ extension HumeAI.Client { modelId: String, files: [HumeAI.FileInput], configuration: [String: String] - ) async throws -> HumeAI.Job { + ) async throws -> HumeAI.JobID { let input = HumeAI.APISpecification.RequestBodies.CustomInferenceJobInput( modelId: modelId, files: files, diff --git a/Sources/HumeAI/Intramodular/HumeAI.Client-Tools.swift b/Sources/HumeAI/Intramodular/HumeAI.Client-Tools.swift index c09e9b36..2a58f401 100644 --- a/Sources/HumeAI/Intramodular/HumeAI.Client-Tools.swift +++ b/Sources/HumeAI/Intramodular/HumeAI.Client-Tools.swift @@ -12,7 +12,7 @@ import Merge extension HumeAI.Client { public func listTools() async throws -> [HumeAI.Tool] { let response = try await run(\.listTools) - return response.tools + return response.toolsPage } public func createTool( @@ -21,13 +21,33 @@ extension HumeAI.Client { description: String?, configuration: [String: String] ) async throws -> HumeAI.Tool { - let input = HumeAI.APISpecification.RequestBodies.CreateToolInput( - id: id, - name: name, - description: description, - configuration: .init(parameters: configuration) + let parameters: [String: Any] = [ + "type": "object", + "properties": [ + "location": [ + "type": "string", + "description": "The city and state, e.g. San Francisco, CA" + ], + "format": [ + "type": "string", + "enum": ["celsius", "fahrenheit"], + "description": "The temperature unit to use. Infer this from the users location." + ] + ], + "required": ["location", "format"] + ] + + let jsonParameters = try JSONSerialization.data(withJSONObject: parameters) + let parametersString = String(data: jsonParameters, encoding: .utf8) ?? "{}" + + let tool = HumeAI.APISpecification.RequestBodies.CreateToolInput( + name: "get_current_weather", + parameters: parametersString, + versionDescription: "Fetches current weather and uses celsius or fahrenheit based on location of user.", + description: "This tool is for getting the current weather.", + fallbackContent: "Unable to fetch current weather." ) - return try await run(\.createTool, with: input) + return try await run(\.createTool, with: tool) } public func deleteTool( diff --git a/Sources/HumeAI/Intramodular/HumeAI.Model.swift b/Sources/HumeAI/Intramodular/HumeAI.Model.swift index db0292d4..c8723ca9 100644 --- a/Sources/HumeAI/Intramodular/HumeAI.Model.swift +++ b/Sources/HumeAI/Intramodular/HumeAI.Model.swift @@ -11,12 +11,165 @@ import Foundation import Swift extension HumeAI { - public enum Model: String, Codable, Sendable { - case prosody = "prosody" - case language = "language" - case burst = "burst" - case face = "face" - case speech = "speech" - case tts = "tts" + static let paramaterModel = "20241004-11parameter" +} + +extension HumeAI { + public struct Model: Codable { + public var face: Face? + public var burst: [String: String]? + public var prosody: Prosody? + public var language: Language? + public var ner: NER? + public var facemesh: [String: String]? + + public struct Face: Codable { + public var fpsPred: Double? + public var probThreshold: Double? + public var identifyFaces: Bool? + public var minFaceSize: UInt64? + public var facs: [String: String]? + public var descriptions: [String: String]? + public var saveFaces: Bool? + + public init( + fpsPred: Double? = 3.0, + probThreshold: Double? = 0.99, + identifyFaces: Bool? = false, + minFaceSize: UInt64? = nil, + facs: [String: String]? = nil, + descriptions: [String: String]? = nil, + saveFaces: Bool? = false + ) { + self.fpsPred = fpsPred + self.probThreshold = probThreshold + self.identifyFaces = identifyFaces + self.minFaceSize = minFaceSize + self.facs = facs + self.descriptions = descriptions + self.saveFaces = saveFaces + } + + enum CodingKeys: String, CodingKey { + case fpsPred = "fps_pred" + case probThreshold = "prob_threshold" + case identifyFaces = "identify_faces" + case minFaceSize = "min_face_size" + case facs + case descriptions + case saveFaces = "save_faces" + } + } + + public struct Prosody: Codable { + public enum Granularity: String, Codable { + case word + case sentence + case utterance + case conversationalTurn = "conversational_turn" + } + + public struct Window: Codable { + public var length: Double? + public var step: Double? + + public init(length: Double? = 4.0, step: Double? = 1.0) { + self.length = length + self.step = step + } + } + + public var granularity: Granularity? + public var window: Window? + public var identifySpeakers: Bool? + + public init( + granularity: Granularity? = nil, + window: Window? = nil, + identifySpeakers: Bool? = false + ) { + self.granularity = granularity + self.window = window + self.identifySpeakers = identifySpeakers + } + + enum CodingKeys: String, CodingKey { + case granularity + case window + case identifySpeakers = "identify_speakers" + } + } + + public struct Language: Codable { } + + public struct NER: Codable { } + + public init( + face: Face? = nil, + burst: [String: String]? = nil, + prosody: Prosody? = nil, + language: Language? = nil, + ner: NER? = nil, + facemesh: [String: String]? = nil + ) { + self.face = face + self.burst = burst + self.prosody = prosody + self.language = language + self.ner = ner + self.facemesh = facemesh + } + } +} + +// Helper initializers for simpler model creation +extension HumeAI.Model { + public static func face( + fpsPred: Double? = 3.0, + probThreshold: Double? = 0.99, + identifyFaces: Bool? = false, + minFaceSize: UInt64? = nil, + facs: [String: String]? = [:], + descriptions: [String: String]? = [:], + saveFaces: Bool? = false + ) -> Self { + .init(face: .init( + fpsPred: fpsPred, + probThreshold: probThreshold, + identifyFaces: identifyFaces, + minFaceSize: minFaceSize, + facs: facs, + descriptions: descriptions, + saveFaces: saveFaces + )) + } + + public static func burst() -> Self { + .init(burst: [:]) + } + + public static func prosody( + granularity: Prosody.Granularity? = nil, + windowLength: Double? = 4.0, + windowStep: Double? = 1.0, + identifySpeakers: Bool? = false + ) -> Self { + .init(prosody: .init( + granularity: granularity, + window: .init(length: windowLength, step: windowStep), + identifySpeakers: identifySpeakers + )) + } + + public static func language() -> Self { + .init(language: .init()) + } + + public static func ner() -> Self { + .init(ner: .init()) + } + + public static func facemesh() -> Self { + .init(facemesh: [:]) } } diff --git a/Sources/HumeAI/Intramodular/Models/HumeAI.Job.swift b/Sources/HumeAI/Intramodular/Models/HumeAI.Job.swift index 5617d7bd..5d9587f3 100644 --- a/Sources/HumeAI/Intramodular/Models/HumeAI.Job.swift +++ b/Sources/HumeAI/Intramodular/Models/HumeAI.Job.swift @@ -6,28 +6,105 @@ // extension HumeAI { - public struct Job { - public let id: String + // MARK: - Root Response + public struct Job: Codable { + public let state: JobState + public let userID: String + public let type: String + public let jobID: String + public let request: JobRequest + + enum CodingKeys: String, CodingKey { + case state + case userID = "userId" + case type + case jobID = "jobId" + case request + } + } + + // MARK: - Job State + public struct JobState: Codable { + public let endedTimestampMs: Int64 + public let createdTimestampMs: Int64 + public let numPredictions: Int public let status: String - public let createdOn: Int64 - public let modifiedOn: Int64 - public let predictions: [Prediction]? - public let artifacts: [String: String]? + public let numErrors: Int + public let startedTimestampMs: Int64 + } + + // MARK: - Job Request + public struct JobRequest: Codable { + public let models: Models + public let notify: Bool + public let urls: [String] + public let callbackUrl: String? + public let text: [String] + public let files: [String] + public let registryFiles: [String] + } + + // MARK: - Models + public struct Models: Codable { + public let burst: [String: [String: String]]? + public let facemesh: JSON? + public let language: JSON? + public let face: JSON? + public let ner: JSON? + public let prosody: JSON? - public struct Prediction { - public let file: FileInfo - public let results: [ModelResult] + public enum JSON: Codable { + case null + case bool(Bool) + case number(Double) + case string(String) + case array([JSON]) + case object([String: JSON]) - public struct FileInfo { - public let url: String - public let mimeType: String - public let metadata: [String: String]? + public init(from decoder: Decoder) throws { + let container = try decoder.singleValueContainer() + if container.decodeNil() { + self = .null + } else if let bool = try? container.decode(Bool.self) { + self = .bool(bool) + } else if let number = try? container.decode(Double.self) { + self = .number(number) + } else if let string = try? container.decode(String.self) { + self = .string(string) + } else if let array = try? container.decode([JSON].self) { + self = .array(array) + } else if let object = try? container.decode([String: JSON].self) { + self = .object(object) + } else { + throw DecodingError.dataCorruptedError(in: container, debugDescription: "Invalid JSON value") + } } - public struct ModelResult { - public let model: String - public let results: [String: String] + public func encode(to encoder: Encoder) throws { + var container = encoder.singleValueContainer() + switch self { + case .null: + try container.encodeNil() + case .bool(let bool): + try container.encode(bool) + case .number(let number): + try container.encode(number) + case .string(let string): + try container.encode(string) + case .array(let array): + try container.encode(array) + case .object(let object): + try container.encode(object) + } } } } + + public struct JobID: Codable { + public let jobID: String + + enum CodingKeys: String, CodingKey { + case jobID = "jobId" + } + } } diff --git a/Sources/HumeAI/Intramodular/Models/HumeAI.JobPrediction.swift b/Sources/HumeAI/Intramodular/Models/HumeAI.JobPrediction.swift new file mode 100644 index 00000000..3a6aae61 --- /dev/null +++ b/Sources/HumeAI/Intramodular/Models/HumeAI.JobPrediction.swift @@ -0,0 +1,67 @@ +// +// HumeAI.JobPrediction.swift +// AI +// +// Created by Jared Davidson on 11/25/24. +// + +import Foundation + +extension HumeAI { + public struct JobPrediction: Codable { + public let source: Source + public let results: Results + + public struct Source: Codable { + public let type: String + public let url: String + } + + public struct Results: Codable { + public let predictions: [Prediction] + public let errors: [String] + } + + public struct Prediction: Codable { + public let file: String + public let models: Models + } + + public struct Models: Codable { + public let face: FaceModel? + + public struct FaceModel: Codable { + public let groupedPredictions: [GroupedPrediction] + + enum CodingKeys: String, CodingKey { + case groupedPredictions = "grouped_predictions" + } + } + } + + public struct GroupedPrediction: Codable { + public let id: String + public let predictions: [FacePrediction] + } + + public struct FacePrediction: Codable { + public let frame: Int + public let time: Int + public let prob: Double + public let box: BoundingBox + public let emotions: [Emotion] + } + + public struct BoundingBox: Codable { + public let x: Double + public let y: Double + public let w: Double + public let h: Double + } + + public struct Emotion: Codable { + public let name: String + public let score: Double + } + } +} diff --git a/Sources/HumeAI/Intramodular/Models/HumeAI.Tool.swift b/Sources/HumeAI/Intramodular/Models/HumeAI.Tool.swift index aa632f7c..244e2656 100644 --- a/Sources/HumeAI/Intramodular/Models/HumeAI.Tool.swift +++ b/Sources/HumeAI/Intramodular/Models/HumeAI.Tool.swift @@ -20,11 +20,8 @@ extension HumeAI { public let description: String? public let createdOn: Int64 public let modifiedOn: Int64 - public let configuration: Configuration - - public struct Configuration: Codable { - public let parameters: [String: String] - } + public let parameters: String + public let fallbackContent: String? } } } diff --git a/Tests/HumeAI/Intramodular/Batch.swift b/Tests/HumeAI/Intramodular/Batch.swift index c241591f..406ddcfc 100644 --- a/Tests/HumeAI/Intramodular/Batch.swift +++ b/Tests/HumeAI/Intramodular/Batch.swift @@ -11,36 +11,30 @@ import XCTest final class HumeAIClientBatchTests: XCTestCase { func testStartInferenceJob() async throws { let job = try await client.startInferenceJob( - files: [.init( - url: "test-url", - mimeType: "test/mime" - )], - models: [.burst] + urls: [URL(string: "https://hume-tutorials.s3.amazonaws.com/faces.zip")!], + models: .burst() ) XCTAssertNotNil(job) } func testGetJobDetails() async throws { - let job = try await client.getJobDetails(id: "test-id") + let job = try await client.getJobDetails(id: "424ddd20-b604-435b-abb0-712f1fe9303b") XCTAssertNotNil(job) } func testListJobs() async throws { - print("Needs Implementation") - XCTFail("Not implemented") + let jobs = try await client.listJobs() + XCTAssertNotNil(jobs) } func testGetJobPredictions() async throws { - print("Needs Implementation") - XCTFail("Not implemented") + let predictions = try await client.getJobPredictions(id: "424ddd20-b604-435b-abb0-712f1fe9303b") + XCTAssertNotNil(predictions) } func testGetJobArtifacts() async throws { - print("Needs Implementation") - XCTFail("Not implemented") - } - - func testStartInferenceJobFromLocalFile() async throws { + //Get the artifacts ZIP of a completed inference job. + print("Needs Implementation") XCTFail("Not implemented") } diff --git a/Tests/HumeAI/Intramodular/Chat.swift b/Tests/HumeAI/Intramodular/Chat.swift index 7708d3c2..a93a3c15 100644 --- a/Tests/HumeAI/Intramodular/Chat.swift +++ b/Tests/HumeAI/Intramodular/Chat.swift @@ -26,7 +26,13 @@ final class HumeAIClientChatTests: XCTestCase { } func testChat() async throws { - let response = try await client.chat(messages: [.init(role: "user", content: "Hello")], model: "test-model") + let response = try await client.chat( + messages: [.init( + role: "user", + content: "Hello" + )], + model: "test-model" + ) XCTAssertNotNil(response) } } diff --git a/Tests/HumeAI/Intramodular/Job.swift b/Tests/HumeAI/Intramodular/Job.swift index 39464877..437e0251 100644 --- a/Tests/HumeAI/Intramodular/Job.swift +++ b/Tests/HumeAI/Intramodular/Job.swift @@ -10,159 +10,119 @@ import XCTest final class HumeAIClientJobTests: XCTestCase { - // Training Jobs - func testStartTrainingJob() async throws { - let job = try await client.startTrainingJob( - datasetId: "test-id", - name: "Test Training Job", - description: "Test Description", - configuration: ["key": "value"] - ) - XCTAssertNotNil(job) - XCTAssertEqual(job.status, "pending") // Assuming initial status is pending - XCTAssertNotNil(job.id) - } - - func testStartTrainingJobWithoutDescription() async throws { - let job = try await client.startTrainingJob( - datasetId: "test-id", - name: "Test Training Job", - configuration: ["key": "value"] - ) - XCTAssertNotNil(job) - } - - // Custom Inference Jobs - func testStartCustomInferenceJob() async throws { - let files = [ - HumeAI.FileInput( - url: "test-url", - mimeType: "test/mime", - metadata: ["key": "value"] - ) - ] + // MARK: - Inference Jobs + func testStartInferenceJob() async throws { - let job = try await client.startCustomInferenceJob( - modelId: "test-id", - files: files, - configuration: ["key": "value"] + let response = try await client.startInferenceJob( + urls: [URL(string:"https://hume-tutorials.s3.amazonaws.com/faces.zip")!], + models: .burst() ) - XCTAssertNotNil(job) - XCTAssertNotNil(job.id) + + // Test JobResponse structure + XCTAssertNotNil(response) } - // Job Status and Progress + // MARK: - Job Status and Progress func testGetJobDetails() async throws { - let job = try await client.getJobDetails(id: "test-id") - XCTAssertNotNil(job) - XCTAssertNotNil(job.status) - XCTAssertNotNil(job.createdOn) - XCTAssertNotNil(job.modifiedOn) + let response = try await client.getJobDetails(id: "test-id") + + // Test timestamps + XCTAssertGreaterThan(response.state.endedTimestampMs, response.state.startedTimestampMs) + XCTAssertGreaterThan(response.state.endedTimestampMs, response.state.createdTimestampMs) + + // Test status + XCTAssertEqual(response.state.status, "COMPLETED") + + // Test request data + XCTAssertNotNil(response.request.urls) + XCTAssertFalse(response.request.notify) } - // Error Cases - func testStartTrainingJobWithInvalidDataset() async throws { - do { - _ = try await client.startTrainingJob( - datasetId: "invalid-id", - name: "Test Job", - configuration: ["key": "value"] - ) - XCTFail("Expected error for invalid dataset ID") - } catch { - // Expected error - XCTAssertNotNil(error) + // MARK: - Job Predictions + func testGetJobPredictions() async throws { + let predictions = try await client.getJobPredictions(id: "test-id") + + guard let firstPrediction = predictions.first else { + XCTFail("No predictions found") + return + } + + // Test source + XCTAssertEqual(firstPrediction.source.type, "url") + XCTAssertNotNil(firstPrediction.source.url) + + // Test results structure + XCTAssertNotNil(firstPrediction.results.predictions) + XCTAssertTrue(firstPrediction.results.errors.isEmpty) + + // Test face predictions + if let facePrediction = firstPrediction.results.predictions.first?.models.face?.groupedPredictions.first?.predictions.first { + // Test bounding box + XCTAssertGreaterThan(facePrediction.prob, 0) + XCTAssertNotNil(facePrediction.box) + + // Test emotions + XCTAssertFalse(facePrediction.emotions.isEmpty) + + // Test specific emotions exist + let emotionNames = facePrediction.emotions.map { $0.name } + XCTAssertTrue(emotionNames.contains("Joy")) + XCTAssertTrue(emotionNames.contains("Fear")) + + // Test emotion scores + for emotion in facePrediction.emotions { + XCTAssertGreaterThanOrEqual(emotion.score, 0) + XCTAssertLessThanOrEqual(emotion.score, 1) + } + } else { + XCTFail("No face predictions found") } } - func testStartCustomInferenceJobWithInvalidModel() async throws { + // MARK: - Error Cases + func testInvalidJobId() async throws { do { - _ = try await client.startCustomInferenceJob( - modelId: "invalid-id", - files: [.init(url: "test-url", mimeType: "test/mime")], - configuration: ["key": "value"] - ) - XCTFail("Expected error for invalid model ID") + _ = try await client.getJobDetails(id: "invalid-id") + XCTFail("Expected error for invalid job ID") } catch { - // Expected error XCTAssertNotNil(error) } } - func testGetInvalidJobDetails() async throws { + func testInvalidFileUrl() async throws { do { - _ = try await client.getJobDetails(id: "invalid-id") - XCTFail("Expected error for invalid job ID") + _ = try await client.startInferenceJob( + urls: [URL(string:"https://hume-tutorials.s3.amazonaws.com/faces.zip")!], + models: .burst() + ) + XCTFail("Expected error for invalid file URL") } catch { - // Expected error XCTAssertNotNil(error) } } - // Job Results - func testJobPredictions() async throws { - let job = try await client.getJobDetails(id: "test-id") + // MARK: - Helper Methods + func testGetTopEmotions() async throws { + let predictions = try await client.getJobPredictions(id: "test-id") - if let predictions = job.predictions { - for prediction in predictions { - // Validate file info - XCTAssertNotNil(prediction.file.url) - XCTAssertNotNil(prediction.file.mimeType) - - // Validate results - XCTAssertFalse(prediction.results.isEmpty) - for result in prediction.results { - XCTAssertNotNil(result.model) - XCTAssertNotNil(result.results) - } - } + guard let facePrediction = predictions.first?.results.predictions.first?.models.face?.groupedPredictions.first?.predictions.first else { + XCTFail("No face predictions found") + return } - } - - // Job Artifacts - func testJobArtifacts() async throws { - let job = try await client.getJobDetails(id: "test-id") - if let artifacts = job.artifacts { - XCTAssertFalse(artifacts.isEmpty) - } - } - - // Unimplemented Methods Tests - func testListJobs() async throws { - print("Needs Implementation") - XCTFail("Not implemented") - } - - func testGetJobPredictions() async throws { - print("Needs Implementation") - XCTFail("Not implemented") - } - - func testGetJobArtifacts() async throws { - print("Needs Implementation") - XCTFail("Not implemented") - } - - func testStartInferenceJobFromLocalFile() async throws { - print("Needs Implementation") - XCTFail("Not implemented") - } - - // Job Status Transitions - func testJobStatusTransitions() async throws { - let job = try await client.getJobDetails(id: "test-id") + // Get top 3 emotions + let topEmotions = facePrediction.emotions + .sorted { $0.score > $1.score } + .prefix(3) - // Verify status is a valid value - let validStatuses = ["pending", "running", "completed", "failed"] - XCTAssertTrue(validStatuses.contains(job.status)) - } - - // Validation Tests - func testJobTimestamps() async throws { - let job = try await client.getJobDetails(id: "test-id") + XCTAssertEqual(topEmotions.count, 3) - // Created timestamp should be before or equal to modified timestamp - XCTAssertLessThanOrEqual(job.createdOn, job.modifiedOn) + // Verify they're actually the highest scores + let highestScore = topEmotions.first!.score + for emotion in facePrediction.emotions { + if emotion.name != topEmotions.first!.name { + XCTAssertLessThanOrEqual(emotion.score, highestScore) + } + } } } diff --git a/Tests/HumeAI/Intramodular/Stream.swift b/Tests/HumeAI/Intramodular/Stream.swift index b27e4539..effbd364 100644 --- a/Tests/HumeAI/Intramodular/Stream.swift +++ b/Tests/HumeAI/Intramodular/Stream.swift @@ -14,7 +14,7 @@ final class HumeAIClientStreamTests: XCTestCase { let job = try await client.streamInference( id: "test-id", file: Data(), - models: [.language] + models: [.language()] ) XCTAssertNotNil(job) } diff --git a/Tests/HumeAI/Intramodular/Tools.swift b/Tests/HumeAI/Intramodular/Tools.swift index e888c2e5..216d6abd 100644 --- a/Tests/HumeAI/Intramodular/Tools.swift +++ b/Tests/HumeAI/Intramodular/Tools.swift @@ -11,27 +11,87 @@ import XCTest final class HumeAIClientToolTests: XCTestCase { func testListTools() async throws { + let tool = try await client.createTool( + id: UUID().uuidString, + name: "Test Tool", + description: "Test Description", + configuration: [:] + ) let tools = try await client.listTools() XCTAssertNotNil(tools) + try await client.deleteTool(id: tool.id) } func testCreateTool() async throws { - let tool = try await client.createTool(id: "test-id", name: "Test Tool", description: "Test Description", configuration: ["key": "value"]) - XCTAssertEqual(tool.name, "Test Tool") + let tool = try await client.createTool( + id: UUID().uuidString, + name: "Test Tool", + description: "Test Description", + configuration: [:] + ) + try await client.deleteTool(id: tool.id) + XCTAssertEqual(tool.name, "get_current_weather") } func testListToolVersions() async throws { - print("Needs Implementation") - XCTFail("Not implemented") + createToolVersion() + let toolVersions = try await client.run(\.listToolVersions, with: .init(id: "123")) + XCTAssertNotNil(toolVersions) + } + + func createToolVersion() async throws -> HumeAI.ToolVersion { + let tool = try await client.createTool( + id: UUID().uuidString, + name: "Test Tool", + description: "Test Description", + configuration: [:] + ) + + let parameters: [String: Any] = [ + "type": "object", + "properties": [ + "location": [ + "type": "string", + "description": "The city and state, e.g. San Francisco, CA" + ], + "format": [ + "type": "string", + "enum": ["celsius", "fahrenheit"], + "description": "The temperature unit to use. Infer this from the users location." + ] + ], + "required": ["location", "format"] + ] + + let jsonParameters = try JSONSerialization.data(withJSONObject: parameters) + let parametersString = String(data: jsonParameters, encoding: .utf8) ?? "{}" + + let toolVersion = try await client.run( + \.createToolVersion, + with: .init( + id: tool.id, + name: "get_current_weather", + parameters: parametersString, + versionDescription: "Fetches current weather and uses celsius or fahrenheit based on location of user.", + description: "This tool is for getting the current weather.", + fallbackContent: "Unable to fetch current weather." + ) + ) } func testCreateToolVersion() async throws { - print("Needs Implementation") - XCTFail("Not implemented") + createToolVersion() + try await client.deleteTool(id: tool.id) } func testDeleteTool() async throws { - try await client.deleteTool(id: "test-id") + let tool = try await client.createTool( + id: UUID().uuidString, + name: "Test Tool", + description: "Test Description", + configuration: [:] + ) + try await client.deleteTool(id: tool.id) } func testUpdateToolName() async throws { diff --git a/Tests/HumeAI/Intramodular/Voices.swift b/Tests/HumeAI/Intramodular/Voices.swift index 6ac53a3e..d0f0c70a 100644 --- a/Tests/HumeAI/Intramodular/Voices.swift +++ b/Tests/HumeAI/Intramodular/Voices.swift @@ -19,7 +19,7 @@ final class HumeAIClientCustomVoiceTests: XCTestCase { let voice = try await client.createCustomVoice( name: "Test Voice", baseVoice: "base-voice", - model: .prosody, + model: HumeAI.Model.prosody(), parameters: .init() ) XCTAssertEqual(voice.name, "Test Voice") From c3976a8f8e93dc641d0efc760a0c5e194a55445f Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Mon, 25 Nov 2024 16:25:36 -0700 Subject: [PATCH 036/271] Updated tests --- ...umeAI.APISpecification.RequestBodies.swift | 2 +- .../API/HumeAI.APISpecification.swift | 38 +++--- ...eAI.APISpeicification.ResponseBodies.swift | 12 +- .../Intramodular/HumeAI.Client-Tools.swift | 17 ++- .../Intramodular/Models/HumeAI.Tool.swift | 13 +- Tests/HumeAI/Intramodular/Prompts.swift | 6 +- Tests/HumeAI/Intramodular/Tools.swift | 117 +++++++++++------- 7 files changed, 120 insertions(+), 85 deletions(-) diff --git a/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.RequestBodies.swift b/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.RequestBodies.swift index 7788010e..445ad0e1 100644 --- a/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.RequestBodies.swift +++ b/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.RequestBodies.swift @@ -263,7 +263,7 @@ extension HumeAI.APISpecification { struct UpdateToolDescriptionInput: Codable { let id: String - let versionID: String + let version: Int let description: String } } diff --git a/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift b/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift index 06d14b68..75c848db 100644 --- a/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift +++ b/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift @@ -71,16 +71,16 @@ extension HumeAI { @GET @Path({ context -> String in - "/v0/evi/tools/\(context.input.id)/versions" + "/v0/evi/tools/\(context.input.id)" }) - var listToolVersions = Endpoint() + var listToolVersions = Endpoint() @POST @Path({ context -> String in "/v0/evi/tools/\(context.input.id ?? "")" }) @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) - var createToolVersion = Endpoint() + var createToolVersion = Endpoint() @DELETE @Path({ context -> String in @@ -93,26 +93,26 @@ extension HumeAI { "/v0/evi/tools/\(context.input.id)" }) @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) - var updateToolName = Endpoint() + var updateToolName = Endpoint() @GET @Path({ context -> String in - "/v0/evi/tools/\(context.input.id)/versions/\(context.input.versionId)" + "/v0/evi/tools/\(context.input.id)/version/\(context.input.version)" }) - var getToolVersion = Endpoint() + var getToolVersion = Endpoint() @DELETE @Path({ context -> String in - "/v0/evi/tools/\(context.input.id)/versions/\(context.input.versionId)" + "/v0/evi/tools/\(context.input.id)/version/\(context.input.version)" }) var deleteToolVersion = Endpoint() @PATCH @Path({ context -> String in - "/v0/evi/tools/\(context.input.id)/versions/\(context.input.versionID)" + "/v0/evi/tools/\(context.input.id)/version/\(context.input.version)" }) @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) - var updateToolDescription = Endpoint() + var updateToolDescription = Endpoint() // MARK: - Prompts @GET @@ -152,13 +152,13 @@ extension HumeAI { @GET @Path({ context -> String in - "/v0/evi/prompts/\(context.input.id)/versions/\(context.input.versionId)" + "/v0/evi/prompts/\(context.input.id)/versions/\(context.input.version)" }) var getPromptVersion = Endpoint() @DELETE @Path({ context -> String in - "/v0/evi/prompts/\(context.input.id)/versions/\(context.input.versionId)" + "/v0/evi/prompts/\(context.input.id)/versions/\(context.input.version)" }) var deletePromptVersion = Endpoint() @@ -243,13 +243,13 @@ extension HumeAI { @GET @Path({ context -> String in - "/v0/evi/configs/\(context.input.id)/versions/\(context.input.versionId)" + "/v0/evi/configs/\(context.input.id)/versions/\(context.input.version)" }) var getConfigVersion = Endpoint() @DELETE @Path({ context -> String in - "/v0/evi/configs/\(context.input.id)/versions/\(context.input.versionId)" + "/v0/evi/configs/\(context.input.id)/versions/\(context.input.version)" }) var deleteConfigVersion = Endpoint() @@ -279,24 +279,24 @@ extension HumeAI { // MARK: - Chat Groups @GET - @Path("/v0/evi/chat-groups") + @Path("/v0/evi/chat_groups") var listChatGroups = Endpoint() @GET @Path({ context -> String in - "/v0/evi/chat-groups/\(context.input.id)" + "/v0/evi/chat_groups/\(context.input.id)" }) var getChatGroup = Endpoint() @GET @Path({ context -> String in - "/v0/evi/chat-groups/\(context.input.id)/events" + "/v0/evi/chat_groups/\(context.input.id)/events" }) var listChatGroupEvents = Endpoint() @GET @Path({ context -> String in - "/v0/evi/chat-groups/\(context.input.id)/audio" + "/v0/evi/chat_groups/\(context.input.id)/audio" }) var getChatGroupAudio = Endpoint() @@ -435,7 +435,7 @@ extension HumeAI { @GET @Path({ context -> String in - "/v0/registry/models/\(context.input.id)/versions/\(context.input.versionId)" + "/v0/registry/models/\(context.input.id)/versions/\(context.input.version)" }) var getModelVersion = Endpoint() @@ -467,7 +467,7 @@ extension HumeAI.APISpecification { struct IDWithVersion: Codable { let id: String - let versionId: String + let version: Int } } diff --git a/Sources/HumeAI/Intramodular/API/HumeAI.APISpeicification.ResponseBodies.swift b/Sources/HumeAI/Intramodular/API/HumeAI.APISpeicification.ResponseBodies.swift index 5ce1f6ab..44f12a81 100644 --- a/Sources/HumeAI/Intramodular/API/HumeAI.APISpeicification.ResponseBodies.swift +++ b/Sources/HumeAI/Intramodular/API/HumeAI.APISpeicification.ResponseBodies.swift @@ -266,13 +266,11 @@ extension HumeAI.APISpecification { } } - struct ToolVersion: Codable { - let id: String - let version: Int - let toolId: String? - let description: String? - let createdOn: Int64 - let modifiedOn: Int64 + struct ToolVersionList: Codable { + let pageNumber: Int + let pageSize: Int + let totalPages: Int + let toolsPage: [HumeAI.Tool.ToolVersion] } struct ToolList: Codable { diff --git a/Sources/HumeAI/Intramodular/HumeAI.Client-Tools.swift b/Sources/HumeAI/Intramodular/HumeAI.Client-Tools.swift index 2a58f401..41e508dd 100644 --- a/Sources/HumeAI/Intramodular/HumeAI.Client-Tools.swift +++ b/Sources/HumeAI/Intramodular/HumeAI.Client-Tools.swift @@ -59,14 +59,27 @@ extension HumeAI.Client { try await run(\.deleteTool, with: input) } + public func deleteToolVersion( + id: String, + version: Int + ) async throws { + + let input = HumeAI.APISpecification.PathInput.IDWithVersion( + id: id, + version: version + ) + + try await run(\.deleteToolVersion, with: input) + } + public func updateToolName( id: String, name: String - ) async throws -> HumeAI.Tool { + ) async throws { let input = HumeAI.APISpecification.RequestBodies.UpdateToolNameInput( id: id, name: name ) - return try await run(\.updateToolName, with: input) + try await run(\.updateToolName, with: input) } } diff --git a/Sources/HumeAI/Intramodular/Models/HumeAI.Tool.swift b/Sources/HumeAI/Intramodular/Models/HumeAI.Tool.swift index 244e2656..24cf1df7 100644 --- a/Sources/HumeAI/Intramodular/Models/HumeAI.Tool.swift +++ b/Sources/HumeAI/Intramodular/Models/HumeAI.Tool.swift @@ -15,13 +15,12 @@ extension HumeAI { public let versions: [ToolVersion]? public struct ToolVersion: Codable { - public let id: String - public let toolId: String - public let description: String? - public let createdOn: Int64 - public let modifiedOn: Int64 - public let parameters: String - public let fallbackContent: String? + let id: String + let version: Int + let toolId: String? + let description: String? + let createdOn: Int64 + let modifiedOn: Int64 } } } diff --git a/Tests/HumeAI/Intramodular/Prompts.swift b/Tests/HumeAI/Intramodular/Prompts.swift index abac71ce..c7907ce5 100644 --- a/Tests/HumeAI/Intramodular/Prompts.swift +++ b/Tests/HumeAI/Intramodular/Prompts.swift @@ -16,7 +16,11 @@ final class HumeAIClientPromptTests: XCTestCase { } func testCreatePrompt() async throws { - let prompt = try await client.createPrompt(name: "Test Prompt", content: "Test Content", description: "Test Description") + let prompt = try await client.createPrompt( + name: "Test Prompt", + content: "Test Content", + description: "Test Description" + ) XCTAssertEqual(prompt.name, "Test Prompt") } diff --git a/Tests/HumeAI/Intramodular/Tools.swift b/Tests/HumeAI/Intramodular/Tools.swift index 216d6abd..7bc8d461 100644 --- a/Tests/HumeAI/Intramodular/Tools.swift +++ b/Tests/HumeAI/Intramodular/Tools.swift @@ -11,35 +11,88 @@ import XCTest final class HumeAIClientToolTests: XCTestCase { func testListTools() async throws { - let tool = try await client.createTool( - id: UUID().uuidString, - name: "Test Tool", - description: "Test Description", - configuration: [:] - ) + let tool = try await createTool() let tools = try await client.listTools() XCTAssertNotNil(tools) try await client.deleteTool(id: tool.id) } func testCreateTool() async throws { + let tool = try await createTool() + try await client.deleteTool(id: tool.id) + XCTAssertEqual(tool.name, "get_current_weather") + } + + func testListToolVersions() async throws { + let toolVersion = try await createToolVersion() + let toolVersions = try await client.run(\.listToolVersions, with: .init(id: toolVersion.tool.id)) + try await client.deleteTool(id: toolVersion.tool.id) + XCTAssertNotNil(toolVersions) + } + + func testCreateToolVersion() async throws { + let toolVersion = try await createToolVersion() + try await client.deleteTool(id: toolVersion.toolVersion.id) + } + + func testDeleteTool() async throws { + let tool = try await createTool() + try await client.deleteTool(id: tool.id) + } + + func testUpdateToolName() async throws { + let tool = try await createTool() + try await client.updateToolName(id: tool.id, name: "Updated_Name") + try await client.deleteTool(id: tool.id) + } + + func testGetToolVersion() async throws { + let toolVersion = try await createToolVersion() + let updatedTool = try await client.run( + \.getToolVersion, + with: .init( + id: toolVersion.tool.id, + version: toolVersion.toolVersion.version + ) + ) + try await client.deleteTool(id: updatedTool.id) + } + + func testDeleteToolVersion() async throws { + let toolVersion = try await createToolVersion() + try await client.deleteToolVersion( + id: toolVersion.tool.id, + version: toolVersion.toolVersion.version + ) + try await client.deleteTool(id: toolVersion.tool.id) + } + + func testUpdateToolDescription() async throws { + let toolVersion = try await createToolVersion() + try await client.run( + \.updateToolDescription, + with: .init( + id: toolVersion.tool.id, + version: toolVersion.toolVersion.version, + description: "Updated Description" + ) + ) + try await client.deleteTool(id: toolVersion.tool.id) + } + + func createTool() async throws -> HumeAI.Tool { let tool = try await client.createTool( id: UUID().uuidString, name: "Test Tool", description: "Test Description", configuration: [:] ) - try await client.deleteTool(id: tool.id) - XCTAssertEqual(tool.name, "get_current_weather") + + return tool } - func testListToolVersions() async throws { - createToolVersion() - let toolVersions = try await client.run(\.listToolVersions, with: .init(id: "123")) - XCTAssertNotNil(toolVersions) - } - func createToolVersion() async throws -> HumeAI.ToolVersion { + func createToolVersion() async throws -> (tool: HumeAI.Tool, toolVersion: HumeAI.Tool.ToolVersion) { let tool = try await client.createTool( id: UUID().uuidString, name: "Test Tool", @@ -77,40 +130,8 @@ final class HumeAIClientToolTests: XCTestCase { fallbackContent: "Unable to fetch current weather." ) ) + + return (tool, toolVersion) } - func testCreateToolVersion() async throws { - createToolVersion() - try await client.deleteTool(id: tool.id) - } - - func testDeleteTool() async throws { - let tool = try await client.createTool( - id: UUID().uuidString, - name: "Test Tool", - description: "Test Description", - configuration: [:] - ) - try await client.deleteTool(id: tool.id) - } - - func testUpdateToolName() async throws { - let tool = try await client.updateToolName(id: "test-id", name: "Updated Name") - XCTAssertEqual(tool.name, "Updated Name") - } - - func testGetToolVersion() async throws { - print("Needs Implementation") - XCTFail("Not implemented") - } - - func testDeleteToolVersion() async throws { - print("Needs Implementation") - XCTFail("Not implemented") - } - - func testUpdateToolDescription() async throws { - print("Needs Implementation") - XCTFail("Not implemented") - } } From f307ead409840591d260f540ce7859c5fdfa860b Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Mon, 25 Nov 2024 17:33:45 -0700 Subject: [PATCH 037/271] Prompts working --- ...umeAI.APISpecification.RequestBodies.swift | 12 +- .../API/HumeAI.APISpecification.swift | 26 ++--- ...eAI.APISpeicification.ResponseBodies.swift | 9 +- .../Intramodular/HumeAI.Client-Prompts.swift | 75 ++++++++++++- .../Intramodular/Models/HumeAI.Prompt.swift | 15 ++- Tests/HumeAI/Intramodular/Prompts.swift | 104 +++++++++++++----- 6 files changed, 177 insertions(+), 64 deletions(-) diff --git a/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.RequestBodies.swift b/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.RequestBodies.swift index 445ad0e1..c49a67b0 100644 --- a/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.RequestBodies.swift +++ b/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.RequestBodies.swift @@ -177,16 +177,14 @@ extension HumeAI.APISpecification { struct CreatePromptInput: Codable { let name: String - let description: String? - let content: String - let metadata: [String: String]? + let text: String + let versionDescription: String? } struct CreatePromptVersionInput: Codable { let id: String - let description: String? - let content: String - let metadata: [String: String]? + let text: String + let versionDescription: String? } struct UpdatePromptNameInput: Codable { @@ -196,7 +194,7 @@ extension HumeAI.APISpecification { struct UpdatePromptDescriptionInput: Codable { let id: String - let versionID: String + let version: Int let description: String } diff --git a/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift b/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift index 75c848db..f0b2883e 100644 --- a/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift +++ b/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift @@ -126,13 +126,13 @@ extension HumeAI { @GET @Path({ context -> String in - "/v0/evi/prompts/\(context.input.id)/versions" + "/v0/evi/prompts/\(context.input.id)" }) - var listPromptVersions = Endpoint() + var listPromptVersions = Endpoint() @POST @Path({ context -> String in - "/v0/evi/prompts/\(context.input.id)/versions" + "/v0/evi/prompts/\(context.input.id)" }) @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var createPromptVersion = Endpoint() @@ -148,26 +148,26 @@ extension HumeAI { "/v0/evi/prompts/\(context.input.id)" }) @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) - var updatePromptName = Endpoint() + var updatePromptName = Endpoint() @GET @Path({ context -> String in - "/v0/evi/prompts/\(context.input.id)/versions/\(context.input.version)" + "/v0/evi/prompts/\(context.input.id)/version/\(context.input.version)" }) var getPromptVersion = Endpoint() @DELETE @Path({ context -> String in - "/v0/evi/prompts/\(context.input.id)/versions/\(context.input.version)" + "/v0/evi/prompts/\(context.input.id)/version/\(context.input.version)" }) var deletePromptVersion = Endpoint() @PATCH @Path({ context -> String in - "/v0/evi/prompts/\(context.input.id)/versions/\(context.input.versionID)" + "/v0/evi/prompts/\(context.input.id)/version/\(context.input.version)" }) @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) - var updatePromptDescription = Endpoint() + var updatePromptDescription = Endpoint() // MARK: - Custom Voices @GET @@ -243,19 +243,19 @@ extension HumeAI { @GET @Path({ context -> String in - "/v0/evi/configs/\(context.input.id)/versions/\(context.input.version)" + "/v0/evi/configs/\(context.input.id)/version/\(context.input.version)" }) var getConfigVersion = Endpoint() @DELETE @Path({ context -> String in - "/v0/evi/configs/\(context.input.id)/versions/\(context.input.version)" + "/v0/evi/configs/\(context.input.id)/version/\(context.input.version)" }) var deleteConfigVersion = Endpoint() @PATCH @Path({ context -> String in - "/v0/evi/configs/\(context.input.id)/versions/\(context.input.versionID)" + "/v0/evi/configs/\(context.input.id)/version/\(context.input.versionID)" }) @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var updateConfigDescription = Endpoint() @@ -435,13 +435,13 @@ extension HumeAI { @GET @Path({ context -> String in - "/v0/registry/models/\(context.input.id)/versions/\(context.input.version)" + "/v0/registry/models/\(context.input.id)/version/\(context.input.version)" }) var getModelVersion = Endpoint() @PATCH @Path({ context -> String in - "/v0/registry/models/\(context.input.id)/versions/\(context.input.versionId)" + "/v0/registry/models/\(context.input.id)/version/\(context.input.versionId)" }) @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var updateModelDescription = Endpoint() diff --git a/Sources/HumeAI/Intramodular/API/HumeAI.APISpeicification.ResponseBodies.swift b/Sources/HumeAI/Intramodular/API/HumeAI.APISpeicification.ResponseBodies.swift index 44f12a81..f55a6e2c 100644 --- a/Sources/HumeAI/Intramodular/API/HumeAI.APISpeicification.ResponseBodies.swift +++ b/Sources/HumeAI/Intramodular/API/HumeAI.APISpeicification.ResponseBodies.swift @@ -256,14 +256,7 @@ extension HumeAI.APISpecification { let pageNumber: Int let pageSize: Int let totalPages: Int - let prompts: [HumeAI.Prompt] - - private enum CodingKeys: String, CodingKey { - case pageNumber = "page_number" - case pageSize = "page_size" - case totalPages = "total_pages" - case prompts = "prompts_page" - } + let promptsPage: [HumeAI.Prompt] } struct ToolVersionList: Codable { diff --git a/Sources/HumeAI/Intramodular/HumeAI.Client-Prompts.swift b/Sources/HumeAI/Intramodular/HumeAI.Client-Prompts.swift index 77c742ae..b4179ef2 100644 --- a/Sources/HumeAI/Intramodular/HumeAI.Client-Prompts.swift +++ b/Sources/HumeAI/Intramodular/HumeAI.Client-Prompts.swift @@ -12,19 +12,18 @@ import Merge extension HumeAI.Client { public func listPrompts() async throws -> [HumeAI.Prompt] { let response = try await run(\.listPrompts) - return response.prompts + return response.promptsPage } public func createPrompt( name: String, - content: String, + text: String, description: String? = nil ) async throws -> HumeAI.Prompt { let input = HumeAI.APISpecification.RequestBodies.CreatePromptInput( name: name, - description: description, - content: content, - metadata: nil + text: text, + versionDescription: description ) return try await run(\.createPrompt, with: input) } @@ -35,4 +34,70 @@ extension HumeAI.Client { ) try await run(\.deletePrompt, with: input) } + + public func listPromptVersions(id: String) async throws -> [HumeAI.Prompt] { + let input = HumeAI.APISpecification.PathInput.ID( + id: id + ) + return try await run(\.listPromptVersions, with: input).promptsPage + } + + public func createPromptVersion( + id: String, + text: String, + versionDescription: String? = nil + ) async throws -> HumeAI.Prompt.PromptVersion { + let input = HumeAI.APISpecification.RequestBodies.CreatePromptVersionInput( + id: id, + text: text, + versionDescription: versionDescription + ) + return try await run(\.createPromptVersion, with: input) + } + + public func getPromptVersion( + id: String, + version: Int + ) async throws -> HumeAI.Prompt.PromptVersion { + let input = HumeAI.APISpecification.PathInput.IDWithVersion( + id: id, + version: version + ) + return try await run(\.getPromptVersion, with: input) + } + + public func deletePromptVersion( + id: String, + version: Int + ) async throws { + let input = HumeAI.APISpecification.PathInput.IDWithVersion( + id: id, + version: version + ) + try await run(\.deletePromptVersion, with: input) + } + + public func updatePromptName( + id: String, + name: String + ) async throws { + let input = HumeAI.APISpecification.RequestBodies.UpdatePromptNameInput( + id: id, + name: name + ) + try await run(\.updatePromptName, with: input) + } + + public func updatePromptDescription( + id: String, + version: Int, + description: String + ) async throws { + let input = HumeAI.APISpecification.RequestBodies.UpdatePromptDescriptionInput( + id: id, + version: version, + description: description + ) + return try await run(\.updatePromptDescription, with: input) + } } diff --git a/Sources/HumeAI/Intramodular/Models/HumeAI.Prompt.swift b/Sources/HumeAI/Intramodular/Models/HumeAI.Prompt.swift index 362e4852..e3cd0dcd 100644 --- a/Sources/HumeAI/Intramodular/Models/HumeAI.Prompt.swift +++ b/Sources/HumeAI/Intramodular/Models/HumeAI.Prompt.swift @@ -8,20 +8,23 @@ extension HumeAI { public struct Prompt: Codable { public let id: String + public let version: Int + public let versionType: String public let name: String - public let description: String? public let createdOn: Int64 public let modifiedOn: Int64 - public let versions: [PromptVersion]? + public let text: String + public let versionDescription: String? public struct PromptVersion: Codable { public let id: String - public let promptId: String - public let description: String? + public let version: Int + public let versionType: String + public let name: String public let createdOn: Int64 public let modifiedOn: Int64 - public let content: String - public let metadata: [String: String]? + public let text: String + public let versionDescription: String? } } } diff --git a/Tests/HumeAI/Intramodular/Prompts.swift b/Tests/HumeAI/Intramodular/Prompts.swift index c7907ce5..374a199f 100644 --- a/Tests/HumeAI/Intramodular/Prompts.swift +++ b/Tests/HumeAI/Intramodular/Prompts.swift @@ -9,52 +9,106 @@ import XCTest @testable import HumeAI final class HumeAIClientPromptTests: XCTestCase { - + func testListPrompts() async throws { let prompts = try await client.listPrompts() + + for prompt in prompts { + try await client.deletePrompt(id: prompt.id) + } + XCTAssertNotNil(prompts) } func testCreatePrompt() async throws { - let prompt = try await client.createPrompt( - name: "Test Prompt", - content: "Test Content", - description: "Test Description" - ) - XCTAssertEqual(prompt.name, "Test Prompt") - } - - func testDeletePrompt() async throws { - try await client.deletePrompt(id: "test-id") + let prompt = try await createPrompt() + try await client.deletePrompt(id: prompt.id) + + XCTAssertNotNil(prompt.id) + XCTAssertEqual(prompt.version, 0) } func testListPromptVersions() async throws { - print("Needs Implementation") - XCTFail("Not implemented") + let prompt = try await createPromptVersion() + let versions = try await client.listPromptVersions(id: prompt.prompt.id) + print("VERSIONS", versions) + try await client.deletePrompt(id: prompt.prompt.id) + XCTAssertNotNil(versions) } - func testCreatePromptVersion() async throws { - print("Needs Implementation") - XCTFail("Not implemented") + func testGetPromptVersion() async throws { + let prompt = try await createPromptVersion() + let promptVersion = try await client.getPromptVersion( + id: prompt.prompt.id, + version: 0 + ) + try await client.deletePrompt(id: prompt.prompt.id) + XCTAssertNotNil(promptVersion) } - func testGetPromptVersion() async throws { - print("Needs Implementation") - XCTFail("Not implemented") + func testCreatePromptVersion() async throws { + let prompt = try await createPrompt() + + let promptVersion = try await client.createPromptVersion( + id: prompt.id, + text: "Test Content", + versionDescription: "" + ) + + XCTAssertNotNil(promptVersion.id) + XCTAssertEqual(promptVersion.version, 0) } func testDeletePromptVersion() async throws { - print("Needs Implementation") - XCTFail("Not implemented") + let prompt = try await createPromptVersion() + try await client.deletePromptVersion( + id: prompt.prompt.id, + version: prompt.promptVersion.version + ) } func testUpdatePromptName() async throws { - print("Needs Implementation") - XCTFail("Not implemented") + let prompt = try await createPromptVersion() + try await client.updatePromptName( + id: prompt.prompt.id, + name: "Updated name" + ) + try await client.deletePrompt(id: prompt.prompt.id) } func testUpdatePromptDescription() async throws { - print("Needs Implementation") - XCTFail("Not implemented") + let promptVersion = try await createPromptVersion() + try await client.updatePromptDescription( + id: promptVersion.prompt.id, + version: promptVersion.promptVersion.version, + description: "Updated Description" + ) + let prompts = try await client.listPrompts() + try await client.deletePrompt(id: promptVersion.prompt.id) + } + + func testDeletePrompt() async throws { + let prompt = try await createPrompt() + try await client.deletePrompt(id: prompt.id) + } + + func createPrompt() async throws -> HumeAI.Prompt { + let prompt = try await client.createPrompt( + name: "Test Prompt", + text: "Test Content" + ) + + return prompt + } + + func createPromptVersion() async throws -> (prompt: HumeAI.Prompt, promptVersion: HumeAI.Prompt.PromptVersion) { + let prompt = try await createPrompt() + + let promptVersion = try await client.createPromptVersion( + id: prompt.id, + text: "Test Content" + ) + + return (prompt, promptVersion) } } From 34fe8044d4adb94b2c7376a1cfc231095625b517 Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Mon, 25 Nov 2024 18:37:30 -0700 Subject: [PATCH 038/271] Updated Tests --- ...umeAI.APISpecification.RequestBodies.swift | 6 +- .../API/HumeAI.APISpecification.swift | 42 ++++---- ...eAI.APISpeicification.ResponseBodies.swift | 13 +-- .../Intramodular/HumeAI.Client-Batch.swift | 2 +- .../HumeAI.Client-CustomVoices.swift | 47 +++++++-- .../Intramodular/HumeAI.Client-Models.swift | 43 ++++++-- .../Intramodular/HumeAI.Client-Stream.swift | 2 +- .../HumeAI/Intramodular/HumeAI.Client.swift | 2 +- .../HumeAI/Intramodular/HumeAI.Model.swift | 6 +- .../Intramodular/Models/HumeAI.Models.swift | 98 +++++++++++++++++++ Tests/HumeAI/Intramodular/Model.swift | 38 +++++-- Tests/HumeAI/Intramodular/Prompts.swift | 4 +- Tests/HumeAI/Intramodular/Voices.swift | 94 ++++++++++++++---- 13 files changed, 314 insertions(+), 83 deletions(-) create mode 100644 Sources/HumeAI/Intramodular/Models/HumeAI.Models.swift diff --git a/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.RequestBodies.swift b/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.RequestBodies.swift index c49a67b0..bdc8e2bc 100644 --- a/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.RequestBodies.swift +++ b/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.RequestBodies.swift @@ -56,7 +56,7 @@ extension HumeAI.APISpecification { struct BatchInferenceJobInput: Codable { let urls: [URL] - let models: HumeAI.Model + let models: HumeAI.APIModel let callback: CallbackConfig? } @@ -92,6 +92,7 @@ extension HumeAI.APISpecification { struct CreateConfigVersionInput: Codable { let id: String + let version: Int let description: String? let settings: [String: String] } @@ -115,6 +116,7 @@ extension HumeAI.APISpecification { struct CreateDatasetVersionInput: Codable { let id: String + let version: Int let description: String? let fileIds: [String] } @@ -201,7 +203,7 @@ extension HumeAI.APISpecification { struct StreamInput: Codable, HTTPRequest.Multipart.ContentConvertible { let id: String // Add file ID let file: Data - let models: [HumeAI.Model] + let models: [HumeAI.APIModel] let metadata: [String: String]? public func __conversion() throws -> HTTPRequest.Multipart.Content { diff --git a/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift b/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift index f0b2883e..b78e11a9 100644 --- a/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift +++ b/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift @@ -171,39 +171,39 @@ extension HumeAI { // MARK: - Custom Voices @GET - @Path("/v0/evi/custom-voices") + @Path("/v0/evi/custom_voices") var listCustomVoices = Endpoint() @POST - @Path("/v0/evi/custom-voices") + @Path("/v0/evi/custom_voices") @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) - var createCustomVoice = Endpoint() + var createCustomVoice = Endpoint() @GET @Path({ context -> String in - "/v0/evi/custom-voices/\(context.input.id)" + "/v0/evi/custom_voices/\(context.input.id)" }) - var getCustomVoice = Endpoint() + var getCustomVoice = Endpoint() @POST @Path({ context -> String in - "/v0/evi/custom-voices/\(context.input.id)/versions" + "/v0/evi/custom_voices/\(context.input.id)" }) @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) - var createCustomVoiceVersion = Endpoint() + var createCustomVoiceVersion = Endpoint() @DELETE @Path({ context -> String in - "/v0/evi/custom-voices/\(context.input.id)" + "/v0/evi/custom_voices/\(context.input.id)" }) var deleteCustomVoice = Endpoint() @PATCH @Path({ context -> String in - "/v0/evi/custom-voices/\(context.input.id)" + "/v0/evi/custom_voices/\(context.input.id)" }) @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) - var updateCustomVoiceName = Endpoint() + var updateCustomVoiceName = Endpoint() // MARK: - Configs @GET @@ -217,13 +217,13 @@ extension HumeAI { @GET @Path({ context -> String in - "/v0/evi/configs/\(context.input.id)/versions" + "/v0/evi/configs/\(context.input.id)/version/\(context.input.version)" }) - var listConfigVersions = Endpoint() + var listConfigVersions = Endpoint() @POST @Path({ context -> String in - "/v0/evi/configs/\(context.input.id)/versions" + "/v0/evi/configs/\(context.input.id)/version/\(context.input.version)" }) @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var createConfigVersion = Endpoint() @@ -393,7 +393,7 @@ extension HumeAI { @POST @Path({ context -> String in - "/v0/registry/datasets/\(context.input.id)/versions" + "/v0/registry/datasets/\(context.input.id)/version/\(context.input.version)" }) @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) var createDatasetVersion = Endpoint() @@ -406,9 +406,9 @@ extension HumeAI { @GET @Path({ context -> String in - "/v0/registry/datasets/\(context.input.id)/versions" + "/v0/registry/datasets/\(context.input.id)/version/\(context.input.version)" }) - var listDatasetVersions = Endpoint() + var listDatasetVersions = Endpoint() // MARK: - Models @GET @Path("/v0/registry/models") @@ -425,26 +425,26 @@ extension HumeAI { "/v0/registry/models/\(context.input.id)" }) @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) - var updateModelName = Endpoint() + var updateModelName = Endpoint() @GET @Path({ context -> String in - "/v0/registry/models/\(context.input.id)/versions" + "/v0/registry/models/version" }) - var listModelVersions = Endpoint() + var listModelVersions = Endpoint() @GET @Path({ context -> String in "/v0/registry/models/\(context.input.id)/version/\(context.input.version)" }) - var getModelVersion = Endpoint() + var getModelVersion = Endpoint() @PATCH @Path({ context -> String in "/v0/registry/models/\(context.input.id)/version/\(context.input.versionId)" }) @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) - var updateModelDescription = Endpoint() + var updateModelDescription = Endpoint() // MARK: - Jobs @POST diff --git a/Sources/HumeAI/Intramodular/API/HumeAI.APISpeicification.ResponseBodies.swift b/Sources/HumeAI/Intramodular/API/HumeAI.APISpeicification.ResponseBodies.swift index f55a6e2c..ae4a636a 100644 --- a/Sources/HumeAI/Intramodular/API/HumeAI.APISpeicification.ResponseBodies.swift +++ b/Sources/HumeAI/Intramodular/API/HumeAI.APISpeicification.ResponseBodies.swift @@ -24,9 +24,7 @@ extension HumeAI.APISpecification { case voices = "custom_voices_page" } } - - typealias Voice = HumeAI.Voice - + struct TTSOutput: Codable { public let audio: Data public let durationMs: Int @@ -182,14 +180,7 @@ extension HumeAI.APISpecification { let pageNumber: Int let pageSize: Int let totalPages: Int - let voices: [Voice] - - private enum CodingKeys: String, CodingKey { - case pageNumber = "page_number" - case pageSize = "page_size" - case totalPages = "total_pages" - case voices = "voices_page" - } + let customVoicesPage: [HumeAI.Voice] } struct DatasetList: Codable { diff --git a/Sources/HumeAI/Intramodular/HumeAI.Client-Batch.swift b/Sources/HumeAI/Intramodular/HumeAI.Client-Batch.swift index 97dca70d..e034fd80 100644 --- a/Sources/HumeAI/Intramodular/HumeAI.Client-Batch.swift +++ b/Sources/HumeAI/Intramodular/HumeAI.Client-Batch.swift @@ -12,7 +12,7 @@ import Merge extension HumeAI.Client { public func startInferenceJob( urls: [URL], - models: HumeAI.Model + models: HumeAI.APIModel ) async throws -> HumeAI.JobID { let input = HumeAI.APISpecification.RequestBodies.BatchInferenceJobInput( urls: urls, diff --git a/Sources/HumeAI/Intramodular/HumeAI.Client-CustomVoices.swift b/Sources/HumeAI/Intramodular/HumeAI.Client-CustomVoices.swift index caadc511..0445d8eb 100644 --- a/Sources/HumeAI/Intramodular/HumeAI.Client-CustomVoices.swift +++ b/Sources/HumeAI/Intramodular/HumeAI.Client-CustomVoices.swift @@ -12,28 +12,61 @@ import Merge extension HumeAI.Client { public func listCustomVoices() async throws -> [HumeAI.Voice] { let response = try await run(\.listCustomVoices) - return response.voices + return response.customVoicesPage } public func createCustomVoice( name: String, baseVoice: String, - model: HumeAI.Model, - parameters: HumeAI.Voice.Parameters + parameterModel: String, + parameters: HumeAI.Voice.Parameters? = nil ) async throws -> HumeAI.Voice { let input = HumeAI.APISpecification.RequestBodies.CreateVoiceInput( name: name, baseVoice: baseVoice, - parameterModel: HumeAI.paramaterModel, + parameterModel: parameterModel, parameters: parameters ) return try await run(\.createCustomVoice, with: input) } - public func deleteCustomVoice(id: String) async throws { - let input = HumeAI.APISpecification.PathInput.ID( - id: id + public func getCustomVoice( + id: String + ) async throws -> HumeAI.Voice { + let input = HumeAI.APISpecification.PathInput.ID(id: id) + return try await run(\.getCustomVoice, with: input) + } + + public func createCustomVoiceVersion( + id: String, + baseVoice: String, + parameterModel: String, + parameters: HumeAI.Voice.Parameters? = nil + ) async throws -> HumeAI.Voice { + let input = HumeAI.APISpecification.RequestBodies.CreateVoiceVersionInput( + id: id, + baseVoice: baseVoice, + parameterModel: parameterModel, + parameters: parameters ) + return try await run(\.createCustomVoiceVersion, with: input) + } + + public func deleteCustomVoice( + id: String + ) async throws { + let input = HumeAI.APISpecification.PathInput.ID(id: id) try await run(\.deleteCustomVoice, with: input) } + + public func updateCustomVoiceName( + id: String, + name: String + ) async throws { + let input = HumeAI.APISpecification.RequestBodies.UpdateVoiceNameInput( + id: id, + name: name + ) + try await run(\.updateCustomVoiceName, with: input) + } } diff --git a/Sources/HumeAI/Intramodular/HumeAI.Client-Models.swift b/Sources/HumeAI/Intramodular/HumeAI.Client-Models.swift index e34714ec..1645c603 100644 --- a/Sources/HumeAI/Intramodular/HumeAI.Client-Models.swift +++ b/Sources/HumeAI/Intramodular/HumeAI.Client-Models.swift @@ -9,8 +9,6 @@ import NetworkKit import SwiftAPI import Merge -//FIXME: - Not correct Model structure - extension HumeAI.Client { public func listModels() async throws -> [HumeAI.Model] { let response = try await run(\.listModels) @@ -20,20 +18,51 @@ extension HumeAI.Client { public func getModel( id: String ) async throws -> HumeAI.Model { - let input = HumeAI.APISpecification.PathInput.ID( - id: id - ) + let input = HumeAI.APISpecification.PathInput.ID(id: id) return try await run(\.getModel, with: input) } public func updateModelName( id: String, name: String - ) async throws -> HumeAI.Model { + ) async throws { let input = HumeAI.APISpecification.RequestBodies.UpdateModelNameInput( id: id, name: name ) - return try await run(\.updateModelName, with: input) + try await run(\.updateModelName, with: input) + } + + public func listModelVersions( + id: String + ) async throws -> [HumeAI.Model.ModelVersion] { + let input = HumeAI.APISpecification.PathInput.ID( + id: id + ) + return try await run(\.listModelVersions, with: input) + } + + public func getModelVersion( + id: String, + version: Int + ) async throws -> HumeAI.Model.ModelVersion { + let input = HumeAI.APISpecification.PathInput.IDWithVersion( + id: id, + version: version + ) + return try await run(\.getModelVersion, with: input) + } + + public func updateModelDescription( + id: String, + versionId: String, + description: String + ) async throws { + let input = HumeAI.APISpecification.RequestBodies.UpdateModelDescriptionInput( + id: id, + versionId: versionId, + description: description + ) + try await run(\.updateModelDescription, with: input) } } diff --git a/Sources/HumeAI/Intramodular/HumeAI.Client-Stream.swift b/Sources/HumeAI/Intramodular/HumeAI.Client-Stream.swift index 6eddd27c..bda66bbf 100644 --- a/Sources/HumeAI/Intramodular/HumeAI.Client-Stream.swift +++ b/Sources/HumeAI/Intramodular/HumeAI.Client-Stream.swift @@ -13,7 +13,7 @@ extension HumeAI.Client { public func streamInference( id: String, file: Data, - models: [HumeAI.Model], + models: [HumeAI.APIModel], metadata: [String: String]? = nil ) async throws -> HumeAI.Job { let input = HumeAI.APISpecification.RequestBodies.StreamInput( diff --git a/Sources/HumeAI/Intramodular/HumeAI.Client.swift b/Sources/HumeAI/Intramodular/HumeAI.Client.swift index 5471ef16..1e5c61a6 100644 --- a/Sources/HumeAI/Intramodular/HumeAI.Client.swift +++ b/Sources/HumeAI/Intramodular/HumeAI.Client.swift @@ -45,7 +45,7 @@ extension HumeAI.Client { // Text to Speech public func getAllAvailableVoices() async throws -> [HumeAI.Voice] { let response = try await run(\.listCustomVoices) - return response.voices + return response.customVoicesPage } } diff --git a/Sources/HumeAI/Intramodular/HumeAI.Model.swift b/Sources/HumeAI/Intramodular/HumeAI.Model.swift index c8723ca9..a97ee40d 100644 --- a/Sources/HumeAI/Intramodular/HumeAI.Model.swift +++ b/Sources/HumeAI/Intramodular/HumeAI.Model.swift @@ -11,11 +11,11 @@ import Foundation import Swift extension HumeAI { - static let paramaterModel = "20241004-11parameter" + static let parameterModel = "20241004-11parameter" } extension HumeAI { - public struct Model: Codable { + public struct APIModel: Codable { public var face: Face? public var burst: [String: String]? public var prosody: Prosody? @@ -123,7 +123,7 @@ extension HumeAI { } // Helper initializers for simpler model creation -extension HumeAI.Model { +extension HumeAI.APIModel { public static func face( fpsPred: Double? = 3.0, probThreshold: Double? = 0.99, diff --git a/Sources/HumeAI/Intramodular/Models/HumeAI.Models.swift b/Sources/HumeAI/Intramodular/Models/HumeAI.Models.swift new file mode 100644 index 00000000..307c30f4 --- /dev/null +++ b/Sources/HumeAI/Intramodular/Models/HumeAI.Models.swift @@ -0,0 +1,98 @@ +// +// HumeAI.Models.swift +// AI +// +// Created by Jared Davidson on 11/25/24. +// + +extension HumeAI { + public struct Model: Codable { + public let id: String + public let name: String + public let createdOn: Int64 + public let modifiedOn: Int64 + public let totalStars: Int64 + public let modelIsStarredByUser: Bool + public let archived: Bool + public let isPubliclyShared: Bool + public let latestVersion: ModelVersion? + + public struct ModelVersion: Codable { + public let id: String + public let modelId: String + public let userId: String + public let version: String + public let sourceUri: String + public let datasetVersionId: String + public let createdOn: Int64 + public let metadata: [String: MetadataValue]? + public let description: String? + public let tags: [Tag]? + public let fileType: String? + public let targetFeature: String? + public let taskType: String? + public let trainingJobId: String? + + public struct Tag: Codable { + public let key: String + public let value: String + } + + public enum MetadataValue: Codable { + case string(String) + case object([String: String]) + + public init(from decoder: Decoder) throws { + let container = try decoder.singleValueContainer() + if let stringValue = try? container.decode(String.self) { + self = .string(stringValue) + } else if let objectValue = try? container.decode([String: String].self) { + self = .object(objectValue) + } else { + throw DecodingError.dataCorruptedError(in: container, debugDescription: "Invalid metadata value") + } + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.singleValueContainer() + switch self { + case .string(let value): + try container.encode(value) + case .object(let value): + try container.encode(value) + } + } + } + } + } + + public struct ModelList: Codable { + public let content: [Model] + public let pageable: PageInfo + public let total: Int64 + public let last: Bool + public let totalElements: Int64 + public let totalPages: Int + public let size: Int + public let number: Int + public let sort: SortInfo + public let first: Bool + public let numberOfElements: Int + public let empty: Bool + + public struct PageInfo: Codable { + public let offset: Int64 + public let sort: SortInfo + public let paged: Bool + public let unpaged: Bool + public let pageNumber: Int + public let pageSize: Int + } + + public struct SortInfo: Codable { + public let empty: Bool + public let sorted: Bool + public let unsorted: Bool + } + } +} diff --git a/Tests/HumeAI/Intramodular/Model.swift b/Tests/HumeAI/Intramodular/Model.swift index 81cbca75..8c54e3d8 100644 --- a/Tests/HumeAI/Intramodular/Model.swift +++ b/Tests/HumeAI/Intramodular/Model.swift @@ -13,30 +13,52 @@ final class HumeAIClientModelTests: XCTestCase { func testListModels() async throws { let models = try await client.listModels() XCTAssertNotNil(models) + + if let model = models.first { + XCTAssertNotNil(model.id) + XCTAssertNotNil(model.name) + XCTAssertNotNil(model.latestVersion) + } } func testGetModel() async throws { let model = try await client.getModel(id: "test-id") XCTAssertNotNil(model) + XCTAssertNotNil(model.latestVersion) } func testUpdateModelName() async throws { - let model = try await client.updateModelName(id: "test-id", name: "Updated Name") - XCTAssertNotNil(model) + let model = try await client.updateModelName( + id: "test-id", + name: "Updated Name" + ) } func testListModelVersions() async throws { - print("Needs Implementation") - XCTFail("Not implemented") + let versions = try await client.listModelVersions(id: "test-id") + XCTAssertNotNil(versions) + + if let version = versions.first { + XCTAssertNotNil(version.id) + XCTAssertNotNil(version.modelId) + XCTAssertNotNil(version.version) + } } func testGetModelVersion() async throws { - print("Needs Implementation") - XCTFail("Not implemented") + let version = try await client.getModelVersion( + id: "test-id", + version: 1 + ) + XCTAssertNotNil(version) + XCTAssertNotNil(version.modelId) } func testUpdateModelDescription() async throws { - print("Needs Implementation") - XCTFail("Not implemented") + let version = try await client.updateModelDescription( + id: "test-id", + versionId: "version-id", + description: "Updated Description" + ) } } diff --git a/Tests/HumeAI/Intramodular/Prompts.swift b/Tests/HumeAI/Intramodular/Prompts.swift index 374a199f..a7157c9e 100644 --- a/Tests/HumeAI/Intramodular/Prompts.swift +++ b/Tests/HumeAI/Intramodular/Prompts.swift @@ -23,9 +23,7 @@ final class HumeAIClientPromptTests: XCTestCase { func testCreatePrompt() async throws { let prompt = try await createPrompt() try await client.deletePrompt(id: prompt.id) - - XCTAssertNotNil(prompt.id) - XCTAssertEqual(prompt.version, 0) + XCTAssertNotNil(prompt) } func testListPromptVersions() async throws { diff --git a/Tests/HumeAI/Intramodular/Voices.swift b/Tests/HumeAI/Intramodular/Voices.swift index d0f0c70a..f7af6e71 100644 --- a/Tests/HumeAI/Intramodular/Voices.swift +++ b/Tests/HumeAI/Intramodular/Voices.swift @@ -8,39 +8,97 @@ import XCTest @testable import HumeAI -final class HumeAIClientCustomVoiceTests: XCTestCase { +final class HumeAIClientVoiceTests: XCTestCase { func testListCustomVoices() async throws { let voices = try await client.listCustomVoices() + + for voice in voices { + try await client.deleteCustomVoice(id: voice.id) + } + XCTAssertNotNil(voices) } func testCreateCustomVoice() async throws { - let voice = try await client.createCustomVoice( - name: "Test Voice", - baseVoice: "base-voice", - model: HumeAI.Model.prosody(), - parameters: .init() - ) - XCTAssertEqual(voice.name, "Test Voice") - } - - func testDeleteCustomVoice() async throws { - try await client.deleteCustomVoice(id: "test-id") + let voice = try await createVoice() + try await client.deleteCustomVoice(id: voice.id) + + XCTAssertNotNil(voice.id) + XCTAssertEqual(voice.name, "TEST VOICE") + XCTAssertEqual(voice.baseVoice, "ITO") } func testGetCustomVoice() async throws { - print("Needs Implementation") - XCTFail("Not implemented") + let voice = try await createVoice() + let retrievedVoice = try await client.getCustomVoice(id: voice.id) + try await client.deleteCustomVoice(id: voice.id) + + XCTAssertEqual(retrievedVoice.id, voice.id) } func testCreateCustomVoiceVersion() async throws { - print("Needs Implementation") - XCTFail("Not implemented") + let voiceVersion = try await createCustomVoiceVersion() + + try await client.deleteCustomVoice(id: voiceVersion.id) + + XCTAssertEqual(voiceVersion.baseVoice, "DACHER") + } + + func testDeleteCustomVoice() async throws { + let voice = try await createVoice() + try await client.deleteCustomVoice(id: voice.id) } func testUpdateCustomVoiceName() async throws { - print("Needs Implementation") - XCTFail("Not implemented") + let voice = try await createVoice() + + let updatedVoice = try await client.updateCustomVoiceName( + id: voice.id, + name: "Updated Voice Name" + ) + + try await client.deleteCustomVoice(id: voice.id) + } + + func createCustomVoiceVersion() async throws -> HumeAI.Voice { + let voice = try await client.createCustomVoice( + name: "Test Voice 2", + baseVoice: "ITO", + parameterModel: HumeAI.parameterModel, + parameters: createTestParameters() + ) + + return try await client.createCustomVoiceVersion( + id: voice.id, + baseVoice: "DACHER", + parameterModel: HumeAI.parameterModel + ) + } + + // Helper Methods + func createVoice() async throws -> HumeAI.Voice { + return try await client.createCustomVoice( + name: "Test Voice", + baseVoice: "ITO", + parameterModel: HumeAI.parameterModel, + parameters: createTestParameters() + ) + } + + func createTestParameters() -> HumeAI.Voice.Parameters { + return HumeAI.Voice.Parameters( + gender: 0.5, + articulation: 0.5, + assertiveness: 0.5, + buoyancy: 0.5, + confidence: 0.5, + enthusiasm: 0.5, + nasality: 0.5, + relaxedness: 0.5, + smoothness: 0.5, + tepidity: 0.5, + tightness: 0.5 + ) } } From dd577da5bff279a24fa81ab933bf32f9322a6a6e Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Tue, 26 Nov 2024 09:47:26 -0700 Subject: [PATCH 039/271] updated Rime --- Sources/Rime/Intramodular/Rime.Client.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/Rime/Intramodular/Rime.Client.swift b/Sources/Rime/Intramodular/Rime.Client.swift index 3d007a59..ac16e931 100644 --- a/Sources/Rime/Intramodular/Rime.Client.swift +++ b/Sources/Rime/Intramodular/Rime.Client.swift @@ -95,7 +95,7 @@ extension Rime.Client { let input = Rime.APISpecification.RequestBodies.TextToSpeechInput( speaker: voice, text: text, - modelId: model.rawValue + modelID: model.rawValue ) switch outputAudio { From f6e0f6584978bf7ebade604892b54aa648a773fa Mon Sep 17 00:00:00 2001 From: NatashaTheRobot Date: Fri, 29 Nov 2024 14:36:49 +0530 Subject: [PATCH 040/271] WIP --- Package.resolved | 14 +- Package.swift | 28 ++ .../ModelIdentifier.Provider.swift | 11 + .../Service/_MIServiceTypeIdentifier.swift | 1 + .../Intramodular/ElevenLabs.Model.swift | 4 +- .../xAI.APISpecification.RequestBodies.swift | 144 ++++++++++ .../xAI.APISpecification.ResponseBodies.swift | 6 + .../API/xAI.APISpecification.swift | 120 ++++++++ .../Models/xAI.ChatCompletion.swift | 36 +++ .../Models/xAI.ChatFunctionDefinition.swift | 17 ++ .../Intramodular/Models/xAI.ChatMessage.swift | 210 ++++++++++++++ .../Models/xAI.ChatMessageBody.swift | 215 +++++++++++++++ .../Intramodular/Models/xAI.ChatRole.swift | 41 +++ .../xAI/Intramodular/Models/xAI.Tool.swift | 51 ++++ .../Intramodular/xAI+LLMRequestHandling.swift | 156 +++++++++++ .../xAI.ChatMessage+LargeLanguageModels.swift | 258 ++++++++++++++++++ Sources/xAI/Intramodular/xAI.Client.swift | 50 ++++ Sources/xAI/Intramodular/xAI.Model.swift | 52 ++++ Sources/xAI/Intramodular/xAI.swift | 7 + Sources/xAI/module.swift | 5 + .../Intramodular/EmbeddingsTests.swift | 1 - Tests/xAI/Intramodular/CompletionTests.swift | 43 +++ .../Intramodular/FunctionCallingTests.swift | 103 +++++++ Tests/xAI/module.swift | 12 + 24 files changed, 1575 insertions(+), 10 deletions(-) create mode 100644 Sources/xAI/Intramodular/API/xAI.APISpecification.RequestBodies.swift create mode 100644 Sources/xAI/Intramodular/API/xAI.APISpecification.ResponseBodies.swift create mode 100644 Sources/xAI/Intramodular/API/xAI.APISpecification.swift create mode 100644 Sources/xAI/Intramodular/Models/xAI.ChatCompletion.swift create mode 100644 Sources/xAI/Intramodular/Models/xAI.ChatFunctionDefinition.swift create mode 100644 Sources/xAI/Intramodular/Models/xAI.ChatMessage.swift create mode 100644 Sources/xAI/Intramodular/Models/xAI.ChatMessageBody.swift create mode 100644 Sources/xAI/Intramodular/Models/xAI.ChatRole.swift create mode 100644 Sources/xAI/Intramodular/Models/xAI.Tool.swift create mode 100644 Sources/xAI/Intramodular/xAI+LLMRequestHandling.swift create mode 100644 Sources/xAI/Intramodular/xAI.ChatMessage+LargeLanguageModels.swift create mode 100644 Sources/xAI/Intramodular/xAI.Client.swift create mode 100644 Sources/xAI/Intramodular/xAI.Model.swift create mode 100644 Sources/xAI/Intramodular/xAI.swift create mode 100644 Sources/xAI/module.swift create mode 100644 Tests/xAI/Intramodular/CompletionTests.swift create mode 100644 Tests/xAI/Intramodular/FunctionCallingTests.swift create mode 100644 Tests/xAI/module.swift diff --git a/Package.resolved b/Package.resolved index e257e27a..666d3ccf 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "864ef9201dffd6ebf57da3ab4413cc1001edb70cd0c6d264b91e19b3967fb7ba", + "originHash" : "0db351194242c55d1647132cde67f92244bdfb0f30f99916a91c9464f714a06e", "pins" : [ { "identity" : "corepersistence", @@ -7,7 +7,7 @@ "location" : "https://github.com/vmanot/CorePersistence.git", "state" : { "branch" : "main", - "revision" : "38fd5271fa906a2d8395e4b42724142886a3c763" + "revision" : "e5026e82410d4140aa5468fe98069e4f5c4fa5cf" } }, { @@ -16,7 +16,7 @@ "location" : "https://github.com/vmanot/Merge.git", "state" : { "branch" : "master", - "revision" : "e8bc37c8dc203cab481efedd71237c151882c007" + "revision" : "2a47b62831164bea212a1616cfe3d4da32902f7f" } }, { @@ -34,7 +34,7 @@ "location" : "https://github.com/vmanot/Swallow.git", "state" : { "branch" : "master", - "revision" : "6227a1114e341daf54e90df61e173599b187a9b1" + "revision" : "f91811c49863ed506da4f3aed21f6c216a258ca0" } }, { @@ -51,8 +51,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-syntax.git", "state" : { - "revision" : "2bc86522d115234d1f588efe2bcb4ce4be8f8b82", - "version" : "510.0.3" + "revision" : "0687f71944021d616d34d922343dcef086855920", + "version" : "600.0.1" } }, { @@ -70,7 +70,7 @@ "location" : "https://github.com/SwiftUIX/SwiftUIX.git", "state" : { "branch" : "master", - "revision" : "836fc284a9bb07fc9ab6d2dce6ebd0e32aabde26" + "revision" : "275be4fd06b570b71fe1eb47b4246f4c4285b177" } } ], diff --git a/Package.swift b/Package.swift index e4abb826..244517eb 100644 --- a/Package.swift +++ b/Package.swift @@ -22,6 +22,7 @@ let package = Package( "ElevenLabs", "_Gemini", "Groq", + "xAI", "HuggingFace", "Jina", "Mistral", @@ -150,6 +151,21 @@ let package = Package( .enableExperimentalFeature("AccessLevelOnImport") ] ), + .target( + name: "xAI", + dependencies: [ + "CorePersistence", + "CoreMI", + "LargeLanguageModels", + "Merge", + "NetworkKit", + "Swallow" + ], + path: "Sources/xAI", + swiftSettings: [ + .enableExperimentalFeature("AccessLevelOnImport") + ] + ), .target( name: "Ollama", dependencies: [ @@ -275,6 +291,7 @@ let package = Package( "Mistral", "_Gemini", "Groq", + "xAI", "Ollama", "OpenAI", "Perplexity", @@ -345,6 +362,17 @@ let package = Package( .enableExperimentalFeature("AccessLevelOnImport") ] ), + .testTarget( + name: "xAITests", + dependencies: [ + "AI", + "Swallow" + ], + path: "Tests/xAI", + swiftSettings: [ + .enableExperimentalFeature("AccessLevelOnImport") + ] + ), .testTarget( name: "PerplexityTests", dependencies: [ diff --git a/Sources/CoreMI/Intramodular/Model Identifier/ModelIdentifier.Provider.swift b/Sources/CoreMI/Intramodular/Model Identifier/ModelIdentifier.Provider.swift index fbdc91cc..0ec80659 100644 --- a/Sources/CoreMI/Intramodular/Model Identifier/ModelIdentifier.Provider.swift +++ b/Sources/CoreMI/Intramodular/Model Identifier/ModelIdentifier.Provider.swift @@ -15,6 +15,7 @@ extension ModelIdentifier { case _Fal case _Mistral case _Groq + case _xAI case _Ollama case _OpenAI case _Gemini @@ -47,6 +48,10 @@ extension ModelIdentifier { Self._Groq } + public static var xAI: Self { + Self._xAI + } + public static var gemini: Self { Self._Gemini } @@ -92,6 +97,8 @@ extension ModelIdentifier.Provider: CustomStringConvertible { return "Mistral" case ._Groq: return "Groq" + case ._xAI: + return "xAI" case ._Ollama: return "Ollama" case ._OpenAI: @@ -129,6 +136,8 @@ extension ModelIdentifier.Provider: RawRepresentable { return "mistral" case ._Groq: return "groq" + case ._xAI: + return "xai" case ._Ollama: return "ollama" case ._OpenAI: @@ -164,6 +173,8 @@ extension ModelIdentifier.Provider: RawRepresentable { self = ._Mistral case Self._Groq.rawValue: self = ._Groq + case Self._xAI.rawValue: + self = ._xAI case Self._OpenAI.rawValue: self = ._OpenAI case Self._Gemini.rawValue: diff --git a/Sources/CoreMI/Intramodular/Service/_MIServiceTypeIdentifier.swift b/Sources/CoreMI/Intramodular/Service/_MIServiceTypeIdentifier.swift index 00fe0f99..413465c0 100644 --- a/Sources/CoreMI/Intramodular/Service/_MIServiceTypeIdentifier.swift +++ b/Sources/CoreMI/Intramodular/Service/_MIServiceTypeIdentifier.swift @@ -38,4 +38,5 @@ extension _MIServiceTypeIdentifier { public static let _VoyageAI = _MIServiceTypeIdentifier(rawValue: "hajat-fufoh-janaf-disam") public static let _Cohere = _MIServiceTypeIdentifier(rawValue: "guzob-fipin-navij-duvon") public static let _TogetherAI = _MIServiceTypeIdentifier(rawValue: "pafob-vopoj-lurig-zilur") + public static let _xAI = _MIServiceTypeIdentifier(rawValue: "niluj-futol-guhaj-pabas") } diff --git a/Sources/ElevenLabs/Intramodular/ElevenLabs.Model.swift b/Sources/ElevenLabs/Intramodular/ElevenLabs.Model.swift index 6d181027..35f1b09a 100644 --- a/Sources/ElevenLabs/Intramodular/ElevenLabs.Model.swift +++ b/Sources/ElevenLabs/Intramodular/ElevenLabs.Model.swift @@ -33,7 +33,7 @@ extension ElevenLabs.Model: CustomStringConvertible { extension ElevenLabs.Model: ModelIdentifierRepresentable { public init(from identifier: ModelIdentifier) throws { - guard identifier.provider == ._Groq, identifier.revision == nil else { + guard identifier.provider == ._ElevenLabs, identifier.revision == nil else { throw Never.Reason.illegal } @@ -46,7 +46,7 @@ extension ElevenLabs.Model: ModelIdentifierRepresentable { public func __conversion() -> ModelIdentifier { ModelIdentifier( - provider: ._Groq, + provider: ._ElevenLabs, name: rawValue, revision: nil ) diff --git a/Sources/xAI/Intramodular/API/xAI.APISpecification.RequestBodies.swift b/Sources/xAI/Intramodular/API/xAI.APISpecification.RequestBodies.swift new file mode 100644 index 00000000..1753bfaf --- /dev/null +++ b/Sources/xAI/Intramodular/API/xAI.APISpecification.RequestBodies.swift @@ -0,0 +1,144 @@ + + +import Foundation + +extension xAI.APISpecification.RequestBodies { + + /* https://docs.x.ai/api/endpoints#chat-completions */ + struct ChatCompletions: Codable, Hashable, Sendable { + private enum CodingKeys: String, CodingKey { + case model + case messages + case temperature + case topProbabilityMass = "top_p" + case choices = "n" + case stream + case stop + case maxTokens = "max_tokens" + case presencePenalty = "presence_penalty" + case frequencyPenalty = "frequency_penalty" + case logprobs = "logprobs" + case logitBias = "logit_bias" + case seed = "seed" + case topLogprobs = "top_logprobs" + case user + case tools + } + + /* Model name for the model to use. */ + var model: xAI.Model + + /* A list of messages that make up the the chat conversation. Different models support different message types, such as image and text.*/ + var messages: [xAI.ChatMessage] + + /* What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic.*/ + var temperature: Double? + + /* An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. It is generally recommended to alter this or `temperature` but not both.*/ + var topProbabilityMass: Double? + + /*The maximum number of tokens that can be generated in the chat completion. This value can be used to control costs for text generated via API.*/ + var maxTokens: Int? + + /* If set, partial message deltas will be sent. Tokens will be sent as data-only server-sent events as they become available, with the stream terminated by a `data: [DONE]` message.*/ + var stream: Bool? + + /* If specified, our system will make a best effort to sample deterministically, such that repeated requests with the same `seed` and parameters should return the same result. Determinism is not guaranteed, and you should refer to the `system_fingerprint` response parameter to monitor changes in the backend.*/ + var seed: Int? + + /* Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim. */ + var frequencyPenalty: Double? + + /* A JSON object that maps tokens (specified by their token ID in the tokenizer) to an associated bias value from -100 to 100. Mathematically, the bias is added to the logits generated by the model prior to sampling. The exact effect will vary per model, but values between -1 and 1 should decrease or increase likelihood of selection; values like -100 or 100 should result in a ban or exclusive selection of the relevant token.*/ + var logitBias: [String: Int]? + + /* Whether to return log probabilities of the output tokens or not. If true, returns the log probabilities of each output token returned in the content of message. */ + var logprobs: Bool? + + /* How many chat completion choices to generate for each input message. Note that you will be charged based on the number of generated tokens across all of the choices. Keep n as 1 to minimize costs. */ + var choices: Int? + + /* Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics. */ + var presencePenalty: Double? + + /* Up to 4 sequences where the API will stop generating further tokens. */ + var stop: [String]? + + /* An integer between 0 and 20 specifying the number of most likely tokens to return at each token position, each with an associated log probability. logprobs must be set to true if this parameter is used. */ + var topLogprobs: Int? + + /* A unique identifier representing your end-user, which can help xAI to monitor and detect abuse. */ + var user: String? + + /* A list of tools the model may call. Currently, only functions are supported as a tool. Use this to provide a list of functions the model may generate JSON inputs for. A max of 128 functions are supported. */ + var tools: [xAI.Tool]? + + init( + messages: [xAI.ChatMessage], + model: xAI.Model, + frequencyPenalty: Double? = nil, + logitBias: [String : Int]? = nil, + logprobs: Bool? = nil, + topLogprobs: Int? = nil, + maxTokens: Int? = nil, + choices: Int? = nil, + presencePenalty: Double? = nil, + seed: Int? = nil, + stop: [String]? = nil, + stream: Bool? = nil, + temperature: Double? = nil, + topProbabilityMass: Double? = nil, + user: String? = nil, + functions: [xAI.ChatFunctionDefinition]? = nil + ) { + self.messages = messages + self.model = model + self.frequencyPenalty = frequencyPenalty + self.logitBias = logitBias + self.logprobs = logprobs + self.topLogprobs = topLogprobs + self.maxTokens = maxTokens + self.choices = choices + self.presencePenalty = presencePenalty + self.seed = seed + self.stop = stop + self.stream = stream + self.temperature = temperature + self.topProbabilityMass = topProbabilityMass + self.user = user + self.tools = functions?.map { xAI.Tool.function($0) } + + } + + init( + user: String?, + messages: [xAI.ChatMessage], + model: xAI.Model, + temperature: Double?, + topProbabilityMass: Double?, + choices: Int?, + stream: Bool?, + stop: [String]?, + maxTokens: Int?, + presencePenalty: Double?, + frequencyPenalty: Double? + ) { + self.user = user + self.messages = messages + self.model = model + self.temperature = temperature + self.topProbabilityMass = topProbabilityMass + self.choices = choices + self.stream = stream + self.stop = stop + self.maxTokens = maxTokens + self.presencePenalty = presencePenalty + self.frequencyPenalty = frequencyPenalty + + self.logitBias = nil + self.logprobs = nil + self.topLogprobs = nil + self.seed = nil + } + } +} diff --git a/Sources/xAI/Intramodular/API/xAI.APISpecification.ResponseBodies.swift b/Sources/xAI/Intramodular/API/xAI.APISpecification.ResponseBodies.swift new file mode 100644 index 00000000..6ca529f0 --- /dev/null +++ b/Sources/xAI/Intramodular/API/xAI.APISpecification.ResponseBodies.swift @@ -0,0 +1,6 @@ + +import Foundation + +extension xAI.APISpecification.ResponseBodies { + +} diff --git a/Sources/xAI/Intramodular/API/xAI.APISpecification.swift b/Sources/xAI/Intramodular/API/xAI.APISpecification.swift new file mode 100644 index 00000000..89be500e --- /dev/null +++ b/Sources/xAI/Intramodular/API/xAI.APISpecification.swift @@ -0,0 +1,120 @@ + + +import NetworkKit +import FoundationX +import Swallow + +extension xAI { + public enum APIError: APIErrorProtocol { + public typealias API = xAI.APISpecification + + case apiKeyMissing + case incorrectAPIKeyProvided + case rateLimitExceeded + case badRequest(request: API.Request?, error: API.Request.Error) + case runtime(AnyError) + + public var traits: ErrorTraits { + [.domain(.networking)] + } + } + + public struct APISpecification: RESTAPISpecification { + public typealias Error = APIError + + public struct Configuration: Codable, Hashable { + public var apiKey: String? + } + + public let configuration: Configuration + + public var host: URL { + URL(string: "https://api.x.ai/v1")! + } + + public var id: some Hashable { + configuration + } + + @POST + @Path("chat/completions") + var chatCompletions = Endpoint() + } +} + +extension xAI.APISpecification { + public final class Endpoint: BaseHTTPEndpoint { + override public func buildRequestBase( + from input: Input, + context: BuildRequestContext + ) throws -> Request { + let configuration = context.root.configuration + + return try super + .buildRequestBase(from: input, context: context) + .jsonBody(input, keyEncodingStrategy: .convertToSnakeCase) + .header(.contentType(.json)) + .header(.accept(.json)) + .header(.authorization(.bearer, configuration.apiKey.unwrap())) + } + + struct _ErrorWrapper: Codable, Hashable, Sendable { + struct Error: Codable, Hashable, Sendable { + let type: String + let param: AnyCodable? + let message: String + } + + let error: Error + } + + override public func decodeOutputBase( + from response: Request.Response, + context: DecodeOutputContext + ) throws -> Output { + do { + try response.validate() + } catch { + let apiError: Error + + if let error = error as? Request.Error { + if let error = try? response.decode( + _ErrorWrapper.self, + keyDecodingStrategy: .convertFromSnakeCase + ).error { + if error.message.contains("You didn't provide an API key") { + throw Error.apiKeyMissing + } else if error.message.contains("Incorrect API key provided") { + throw Error.incorrectAPIKeyProvided + } + } + + if response.statusCode.rawValue == 429 { + apiError = .rateLimitExceeded + } else { + apiError = .badRequest(error) + } + } else { + apiError = .runtime(error) + } + + throw apiError + } + + return try response.decode( + Output.self, + keyDecodingStrategy: .convertFromSnakeCase + ) + } + } +} + +extension xAI.APISpecification { + public enum RequestBodies: _StaticSwift.Namespace { + + } + + public enum ResponseBodies: _StaticSwift.Namespace { + + } +} diff --git a/Sources/xAI/Intramodular/Models/xAI.ChatCompletion.swift b/Sources/xAI/Intramodular/Models/xAI.ChatCompletion.swift new file mode 100644 index 00000000..084aebdc --- /dev/null +++ b/Sources/xAI/Intramodular/Models/xAI.ChatCompletion.swift @@ -0,0 +1,36 @@ + + +import Foundation + +extension xAI { + public struct ChatCompletion: Codable, Hashable, Sendable { + + public struct Choice: Codable, Hashable, Sendable { + public enum FinishReason: String, Codable, Hashable, Sendable { + case stop = "stop" + case length = "length" + case modelLength = "model_length" + case toolCalls = "tool_calls" + } + + public let index: Int + public let message: ChatMessage + public let finishReason: FinishReason + } + + public struct Usage: Codable, Hashable, Sendable { + public let promptTokens: Int + public let completionTokens: Int + public let totalTokens: Int + } + + public var id: String + public var object: String + public var created: Date + public var model: Model + public var choices: [Choice] + public let usage: Usage + public let systemFingerprint: String + } +} + diff --git a/Sources/xAI/Intramodular/Models/xAI.ChatFunctionDefinition.swift b/Sources/xAI/Intramodular/Models/xAI.ChatFunctionDefinition.swift new file mode 100644 index 00000000..ca4b8169 --- /dev/null +++ b/Sources/xAI/Intramodular/Models/xAI.ChatFunctionDefinition.swift @@ -0,0 +1,17 @@ + +import CorePersistence + +extension xAI { + public struct ChatFunctionDefinition: Codable, Hashable, Sendable { + public let name: String + public let description: String + public let parameters: JSONSchema + + public init(name: String, description: String, parameters: JSONSchema) { + self.name = name + self.description = description + self.parameters = parameters + } + } +} + diff --git a/Sources/xAI/Intramodular/Models/xAI.ChatMessage.swift b/Sources/xAI/Intramodular/Models/xAI.ChatMessage.swift new file mode 100644 index 00000000..13b3f651 --- /dev/null +++ b/Sources/xAI/Intramodular/Models/xAI.ChatMessage.swift @@ -0,0 +1,210 @@ + +import CorePersistence +import Diagnostics +import LargeLanguageModels +import Swallow + +extension xAI { + public struct ChatMessage: Hashable, Sendable { + public typealias ID = String + + public let id: ID + public let role: ChatRole + public var body: ChatMessageBody + + public init( + id: ID? = nil, + role: ChatRole, + body: ChatMessageBody + ) { + switch body { + case .text: + assert(role != .function) + case .content: + assert(role != .function) + case .functionCall: + assert(role == .assistant) + case .toolCalls(_): + assert(role == .assistant) + case .functionInvocation: + assert(role == .function) + } + + self.id = id ?? UUID().stringValue // FIXME: !!! + self.role = role + self.body = body + } + } + + public enum FunctionCallingStrategy: Codable, Hashable, Sendable { + enum CodingKeys: String, CodingKey { + case none = "none" + case auto = "auto" + case function = "name" + } + + case none + case auto + case function(String) + + public init(from decoder: Decoder) throws { + switch try decoder._determineContainerKind() { + case .singleValue: + let rawValue = try decoder.singleValueContainer().decode(String.self) + + switch rawValue { + case CodingKeys.none.rawValue: + self = .none + case CodingKeys.auto.rawValue: + self = .auto + default: + throw DecodingError.dataCorrupted(.init(codingPath: [])) + } + case .keyed: + let container = try decoder.container(keyedBy: CodingKeys.self) + + self = try .function(container.decode(String.self, forKey: .function)) + default: + throw DecodingError.dataCorrupted(.init(codingPath: [])) + } + } + + public func encode(to encoder: Encoder) throws { + switch self { + case .none: + var container = encoder.singleValueContainer() + + try container.encode(CodingKeys.none.rawValue) + case .auto: + var container = encoder.singleValueContainer() + + try container.encode(CodingKeys.auto.rawValue) + case .function(let name): + var container = encoder.container(keyedBy: CodingKeys.self) + + try container.encode(name, forKey: .function) + } + } + } +} + +// MARK: - Conformances + +extension xAI.ChatMessage: AbstractLLM.ChatMessageConvertible { + public func __conversion() throws -> AbstractLLM.ChatMessage { + .init( + id: .init(rawValue: id), + role: try role.__conversion(), + content: try PromptLiteral(from: self) + ) + } +} + +extension xAI.ChatMessage: Codable { + public enum CodingKeys: CodingKey { + case id + case role + case content + case name + case functionCall + case toolCalls + } + + public init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + print(try JSON(from: decoder).prettyPrintedDescription) + + + self.id = try container.decodeIfPresent(String.self, forKey: .id) ?? UUID().stringValue // FIXME + self.role = try container.decode(xAI.ChatRole.self, forKey: .role) + + switch role { + case .function: + self.body = .functionInvocation( + .init( + name: try container.decode(String.self, forKey: .name), + response: try container.decode(String.self, forKey: .name) + ) + ) + case .assistant: + if let toolCalls = try container.decodeIfPresent([xAI.ToolCall].self, forKey: .toolCalls) { + if let function = toolCalls.first?.function { + self.body = .functionCall(function) + } else { + self.body = .toolCalls(toolCalls) + } + + } else { + self.body = try .content(container.decode(String.self, forKey: .content)) + } + default: + self.body = try .content(container.decode(String.self, forKey: .content)) + } + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + + try container.encode(role, forKey: .role) + + switch body { + case .text(let content): + try container.encode(content, forKey: .content) + case .content(let content): + try container.encode(content, forKey: .content) + case .functionCall(let call): + try _tryAssert(role == .assistant) + + try container.encode(call, forKey: .functionCall) + try container.encodeNil(forKey: .content) + case .toolCalls(let calls): + try _tryAssert(role == .assistant) + + try container.encode(calls, forKey: .toolCalls) + try container.encodeNil(forKey: .content) + case .functionInvocation(let invocation): + try _tryAssert(role == .function) + + try container.encode(invocation.name, forKey: .name) + try container.encode(invocation.response, forKey: .content) + } + } +} + +// MARK: - Initializers + +extension xAI.ChatMessage { + public init( + id: ID? = nil, + role: xAI.ChatRole, + body: String + ) { + self.init( + id: id, + role: role, + body: .content(body) + ) + } + + public init( + role: xAI.ChatRole, + content: String + ) { + self.init( + role: role, + body: content + ) + } + + public static func system( + _ content: String + ) -> Self { + Self(id: UUID().stringValue, role: .system, body: .content(content)) + } + + public static func user( + _ content: String + ) -> Self { + Self(id: UUID().stringValue, role: .user, body: .content(content)) + } +} diff --git a/Sources/xAI/Intramodular/Models/xAI.ChatMessageBody.swift b/Sources/xAI/Intramodular/Models/xAI.ChatMessageBody.swift new file mode 100644 index 00000000..1f9122e1 --- /dev/null +++ b/Sources/xAI/Intramodular/Models/xAI.ChatMessageBody.swift @@ -0,0 +1,215 @@ + + +import CorePersistence +import Diagnostics +import Swift + +extension xAI { + public enum ChatMessageBody: Hashable, Sendable { + + + public struct FunctionCall: Codable, Hashable, Sendable { + public let name: String + public let arguments: String + + public init(name: String, arguments: String) { + self.name = name + self.arguments = arguments + } + } + + public struct FunctionInvocation: Codable, Hashable, Sendable { + public let name: String + public let response: String + + public init(name: String, response: String) { + self.name = name + self.response = response + } + } + + case text(String) + case content([_Content]) + /// The call made to a function provided to the LLM. + case functionCall(FunctionCall) + case toolCalls([ToolCall]) + /// The result of a function call of a function that was provided to the LLM. + case functionInvocation(FunctionInvocation) + } +} + +// MARK: - Initializers + +extension xAI.ChatMessageBody { + public static func content(_ text: String) -> Self { + .text(text) + } +} + +// MARK: - Extensions + +extension xAI.ChatMessageBody { + public var isEmpty: Bool { + switch self { + case .text(let text): + return text.isEmpty + case .content(let content): + return content.isEmpty + case .functionCall: + return false + case .toolCalls(let toolCalls): + return false + case .functionInvocation: + return false + } + } + + var _textValue: String? { + guard case .text(let string) = self else { + return nil + } + + return string + } + + public mutating func append(_ newText: String) throws { + switch self { + case .text(let text): + self = .text(text.appending(contentsOf: newText)) + case .content(let content): + self = .content(content.appending(.text(newText))) + case .functionCall: + throw Never.Reason.illegal + case .toolCalls(let toolCalls): + throw Never.Reason.illegal + case .functionInvocation: + throw Never.Reason.illegal + } + } + + public static func += (lhs: inout Self, rhs: String) throws { + try lhs.append(rhs) + } +} + +// MARK: - Auxiliary + +extension xAI.ChatMessageBody { + enum _ContentType: String, Codable, Hashable, Sendable { + case text = "text" + case imageURL = "image_url" + } + + public enum _Content: Sendable { + public struct ImageURL: Codable, Hashable, Sendable { + /// https://platform.openai.com/docs/guides/vision/low-or-high-fidelity-image-understanding + public enum ImageDetail: String, Codable, Hashable, Sendable { + case low + case high + case auto + } + + public let url: URL + public let detail: ImageDetail + + public init(url: URL, detail: ImageDetail = .auto) { + self.url = url + self.detail = detail + } + } + + case text(String) + case imageURL(ImageURL) + + public static func imageURL(_ url: URL) -> Self { + Self.imageURL(ImageURL(url: url, detail: .auto)) + } + } +} + +// MARK: - Conformances + +extension xAI.ChatMessageBody._Content: Codable { + fileprivate enum CodingKeys: String, CodingKey { + case type + case text + case imageURL = "image_url" + } + + public init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + print(try JSON(from: decoder).prettyPrintedDescription) + + let contentType = try container.decode(xAI.ChatMessageBody._ContentType.self, forKey: .type) + + switch contentType { + case .text: + self = .text(try container.decode(String.self, forKey: .text)) + case .imageURL: + self = .imageURL(try container.decode(ImageURL.self, forKey: .imageURL)) + } + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + switch self { + case .text(let text): + try container.encode("text", forKey: .type) + try container.encode(text, forKey: .text) + case .imageURL(let imageURL): + try container.encode("image_url", forKey: .type) + try container.encode(imageURL, forKey: .imageURL) + } + } +} + +extension xAI.ChatMessageBody: CustomStringConvertible { + public var description: String { + switch self { + case .text(let text): + return text.description + case .content(let content): + return content.description + case .functionCall(let call): + return "\(call.name)(\(call.arguments))" + case .toolCalls(let calls): + return calls.map { "\($0.function.name)(\($0.function.arguments))" }.joined(separator: ", ") + case .functionInvocation(let invocation): + return "\(invocation.name)(...) = \(invocation.response)" + } + } +} + +extension xAI.ChatMessageBody._Content: CustomStringConvertible { + public var description: String { + switch self { + case .text(let text): + return text.description + case .imageURL(let imageURL): + return imageURL.url.description + } + } +} + +extension xAI.ChatMessageBody._Content: Hashable { + public func hash(into hasher: inout Hasher) { + switch self { + case .text(let string): + hasher.combine(string) + case .imageURL(let url): + hasher.combine(url) + } + } + + public static func == (lhs: Self, rhs: Self) -> Bool { + switch (lhs, rhs) { + case let (.text(a), .text(b)): + return a == b + case let (.imageURL(a), .imageURL(b)): + return a == b + default: + return false + } + } +} + diff --git a/Sources/xAI/Intramodular/Models/xAI.ChatRole.swift b/Sources/xAI/Intramodular/Models/xAI.ChatRole.swift new file mode 100644 index 00000000..b7e04857 --- /dev/null +++ b/Sources/xAI/Intramodular/Models/xAI.ChatRole.swift @@ -0,0 +1,41 @@ + +import CorePersistence +import Diagnostics +import LargeLanguageModels +import Swallow + +extension xAI { + public enum ChatRole: String, Codable, Hashable, Sendable { + case system + case user + case assistant + case function + + public init(from role: AbstractLLM.ChatRole) { + switch role { + case .system: + self = .system + case .user: + self = .user + case .assistant: + self = .assistant + case .other(.function): + self = .function + } + } + + public func __conversion() throws -> AbstractLLM.ChatRole { + switch self { + case .system: + return .system + case .user: + return .user + case .assistant: + return .assistant + case .function: + return .other(.function) + } + } + } +} + diff --git a/Sources/xAI/Intramodular/Models/xAI.Tool.swift b/Sources/xAI/Intramodular/Models/xAI.Tool.swift new file mode 100644 index 00000000..148be8e4 --- /dev/null +++ b/Sources/xAI/Intramodular/Models/xAI.Tool.swift @@ -0,0 +1,51 @@ + + +extension xAI { + public enum ToolType: String, CaseIterable, Codable, Hashable, Sendable { + /* Currently, only functions are supported as a tool. */ + case function + } + + public struct Tool: Codable, Hashable, Sendable { + public let type: ToolType + public let function: xAI.ChatFunctionDefinition? + + private init( + type: ToolType, + function: xAI.ChatFunctionDefinition? + ) { + self.type = type + self.function = function + + if function != nil { + assert(type == .function) + } + } + + public static func function( + _ function: xAI.ChatFunctionDefinition + ) -> Self { + Self(type: .function, function: function) + } + } + + public struct ToolCall: Codable, Hashable, Sendable { + public let index: Int? + public let id: String? + public let type: ToolType? + public let function: ChatMessageBody.FunctionCall + + public init( + index: Int? = nil, + id: String?, + type: ToolType = .function, + function: ChatMessageBody.FunctionCall + ) { + self.index = index + self.id = id + self.type = type + self.function = function + } + } +} + diff --git a/Sources/xAI/Intramodular/xAI+LLMRequestHandling.swift b/Sources/xAI/Intramodular/xAI+LLMRequestHandling.swift new file mode 100644 index 00000000..e978f81a --- /dev/null +++ b/Sources/xAI/Intramodular/xAI+LLMRequestHandling.swift @@ -0,0 +1,156 @@ + + +import CorePersistence +import LargeLanguageModels +import NetworkKit +import Swallow + +extension xAI.Client: _TaskDependenciesExporting { + public var _exportedTaskDependencies: TaskDependencies { + var result = TaskDependencies() + + result[\.llm] = self + + return result + } +} + +extension xAI.Client: LLMRequestHandling { + public var _availableModels: [ModelIdentifier]? { + xAI.Model.allCases.map({ $0.__conversion() }) + } + + public func complete( + prompt: Prompt, + parameters: Prompt.CompletionParameters + ) async throws -> Prompt.Completion { + let _completion: Any + + switch prompt { + case let prompt as AbstractLLM.TextPrompt: + _completion = try await _complete( + prompt: prompt, + parameters: try cast(parameters) + ) + + case let prompt as AbstractLLM.ChatPrompt: + _completion = try await _complete( + prompt: prompt, + parameters: try cast(parameters) + ) + default: + throw LLMRequestHandlingError.unsupportedPromptType(Prompt.self) + } + + return try cast(_completion) + } + + private func _complete( + prompt: AbstractLLM.TextPrompt, + parameters: AbstractLLM.TextCompletionParameters + ) async throws -> AbstractLLM.TextCompletion { + throw LLMRequestHandlingError.unsupportedPromptType(.init(Swift.type(of: prompt))) + } + + private func _complete( + prompt: AbstractLLM.ChatPrompt, + parameters: AbstractLLM.ChatCompletionParameters + ) async throws -> AbstractLLM.ChatCompletion { + + var messages: [xAI.ChatMessage] = [] + for message in prompt.messages { + let chatMessage = try await xAI.ChatMessage(from: message) + messages.append(chatMessage) + } + + let response: xAI.ChatCompletion = try await run( + \.chatCompletions, + with: .init( + messages: messages, + model: _model(for: prompt, parameters: parameters), + maxTokens: parameters.tokenLimit?.fixedValue, + seed: nil, + stream: false, + temperature: parameters.temperatureOrTopP?.temperature, + topProbabilityMass: parameters.temperatureOrTopP?.topProbabilityMass, + functions: parameters.functions?.map { xAI.ChatFunctionDefinition(from: $0) } + ) + ) + + assert(response.choices.count == 1) + + let message = try AbstractLLM.ChatMessage(from: response, choiceIndex: 0) + + return AbstractLLM.ChatCompletion( + prompt: prompt.messages, + message: message, + stopReason: .init() // FIXME: !!! + ) + } + + private func _model( + for prompt: AbstractLLM.ChatPrompt, + parameters: AbstractLLM.ChatCompletionParameters? + ) throws -> xAI.Model { + try prompt.context.get(\.modelIdentifier)?.as(xAI.Model.self) ?? .grok_beta + } +} + +// MARK: - Auxiliary + +extension AbstractLLM.ChatRole { + public init( + from role: xAI.ChatRole + ) throws { + switch role { + case .system: + self = .system + case .user: + self = .user + case .assistant: + self = .assistant + case .function: + self = .other(.function) + } + } +} + +extension AbstractLLM.ChatMessage { + public init( + from completion: xAI.ChatCompletion, + choiceIndex: Int + ) throws { + let choice = completion.choices[choiceIndex] + + self.init( + id: AnyPersistentIdentifier(erasing: "\(completion.id)_\(choiceIndex.description)"), + role: try AbstractLLM.ChatRole(from: choice.message.role), + content: PromptLiteral(choice.message.body.description) + ) + } +} + +extension xAI.ChatMessage { + public init( + from message: AbstractLLM.ChatMessage + ) throws { + self.init( + role: xAI.ChatRole( + from: message.role + ), + content: try message.content._stripToText() + ) + } +} + +extension xAI.ChatFunctionDefinition { + public init( + from function: AbstractLLM.ChatFunctionDefinition + ) { + self.init( + name: function.name.rawValue, + description: function.context, + parameters: function.parameters + ) + } +} diff --git a/Sources/xAI/Intramodular/xAI.ChatMessage+LargeLanguageModels.swift b/Sources/xAI/Intramodular/xAI.ChatMessage+LargeLanguageModels.swift new file mode 100644 index 00000000..a1937e11 --- /dev/null +++ b/Sources/xAI/Intramodular/xAI.ChatMessage+LargeLanguageModels.swift @@ -0,0 +1,258 @@ + + +import CorePersistence +import FoundationX +@_spi(Internal) import LargeLanguageModels + +extension xAI.ChatMessage: _PromptLiteralEncodingContainer { + public mutating func encode( + _ component: PromptLiteral._Degenerate.Component + ) async throws { + var content: [xAI.ChatMessageBody._Content] + + switch self.body { + case .text(let _content): + content = [.text(_content)] + case .content(let _content): + content = _content + case .functionCall(_): + throw Never.Reason.unsupported + case .toolCalls(_): + throw Never.Reason.unsupported + case .functionInvocation(_): + throw Never.Reason.unsupported + } + + switch component.payload { + case .string(let string): + content.append(.text(string)) + case .image(let image): + let imageURL: Base64DataURL = try await image.toBase64DataURL() + + content.append(.imageURL(xAI.ChatMessageBody._Content.ImageURL(url: imageURL.url, detail: .auto))) + case .functionCall: + throw Never.Reason.unsupported + case .resultOfFunctionCall: + throw Never.Reason.unsupported + } + + self = .init( + id: nil, // FIXME: !!! + role: role, + body: .content(content) + ) + } +} + +extension xAI.ChatMessage { + public init( + from message: AbstractLLM.ChatMessage + ) async throws { + let role: xAI.ChatRole + + switch message.role { + case .system: + role = .system + case .user: + role = .user + case .assistant: + role = .assistant + case .other(.function): + role = .function + } + + let _content = try message.content._degenerate() + + if _content.components.contains(where: { $0.payload.type == .functionCall || $0.payload.type == .functionInvocation }) { + switch try _content.components.toCollectionOfOne().value.payload { + case .functionCall(let call): + self.init( + id: nil, + // FIXME: !!! + role: role, + body: .functionCall( + xAI.ChatMessageBody.FunctionCall( + name: call.name.rawValue, + arguments: try call.arguments.__conversion() + ) + ) + ) + case .resultOfFunctionCall(let result): + self.init( + id: nil, // FIXME: !!! + role: role, + body: .functionInvocation( + .init( + name: result.name.rawValue, + response: try result.result.__conversion() as String + ) + ) + ) + default: + assertionFailure("Unsupported prompt literal.") + + throw Never.Reason.illegal + } + } else { + var _temp = Self( + id: nil, // FIXME: !!! + role: role, + body: .content([]) + ) + + try await message.content._encode(to: &_temp) + + self = _temp + } + } +} + +extension AbstractLLM.ChatMessage { + public init( + from message: xAI.ChatMessage + ) throws { + let id = message.id + let role: AbstractLLM.ChatRole + + switch message.role { + case .system: + role = .system + case .user: + role = .user + case .assistant: + role = .assistant + case .function: + role = .other(.function) + } + + switch message.body { + case .text(let content): + self.init( + id: AnyPersistentIdentifier(erasing: id), + role: role, + content: PromptLiteral( + content, + role: .chat(role) + ) + ) + case .content(let content): + self.init( + id: AnyPersistentIdentifier(erasing: id), + role: role, + content: PromptLiteral( + from: content, + role: .chat(role) + ) + ) + case .functionCall(let call): + self.init( + id: AnyPersistentIdentifier(erasing: id), + role: role, + content: try PromptLiteral( + functionCall: .init( + functionID: nil, + name: AbstractLLM.ChatFunction.Name(rawValue: call.name), + arguments: AbstractLLM.ChatFunctionCall.Arguments(unencoded: call.arguments), + context: .init() + ), + role: .chat(role) + ) + ) + case .toolCalls(let calls): + guard let firstCall = calls.first?.function else { + throw DecodingError.dataCorrupted(.init( + codingPath: [], + debugDescription: "Tool calls array is empty" + )) + } + + self.init( + id: AnyPersistentIdentifier(erasing: id), + role: role, + content: try PromptLiteral( + functionCall: .init( + functionID: nil, + name: AbstractLLM.ChatFunction.Name(rawValue: firstCall.name), + arguments: AbstractLLM.ChatFunctionCall.Arguments(unencoded: firstCall.arguments), + context: .init() + ), + role: .chat(role) + ) + ) + case .functionInvocation(let invocation): + self.init( + id: AnyPersistentIdentifier(erasing: id), + role: role, + content: try .init( + functionInvocation: .init( + functionID: nil, + name: AbstractLLM.ChatFunction.Name(rawValue: invocation.name), + result: .init(rawValue: invocation.response) + ), + role: .chat(role) + ) + ) + } + } +} + +extension PromptLiteral { + public init(from message: xAI.ChatMessage) throws { + let role: PromptMatterRole + + switch message.role { + case .system: + role = .chat(.system) + case .user: + role = .chat(.user) + case .assistant: + role = .chat(.assistant) + case .function: + role = .chat(.other(.function)) + } + + switch message.body { + case .text(let text): + self.init(from: [.text(text)], role: role) + case .content(let content): + self.init(from: content, role: role) + case .functionCall: + TODO.unimplemented + case .toolCalls(_): + TODO.unimplemented + case .functionInvocation: + TODO.unimplemented + } + } + + init( + from contents: [xAI.ChatMessageBody._Content], + role: PromptMatterRole + ) { + var components: [PromptLiteral.StringInterpolation.Component] = [] + + for content in contents { + switch content { + case .text(let content): + components.append( + PromptLiteral.StringInterpolation.Component( + payload: .stringLiteral(content), + role: role + ) + ) + case .imageURL(let image): + assert(image.detail == .auto) // FIXME + + components.append( + PromptLiteral.StringInterpolation.Component( + payload: .image(.url(image.url)), + role: role + ) + ) + } + } + + self.init(stringInterpolation: .init(components: components)) + } +} + diff --git a/Sources/xAI/Intramodular/xAI.Client.swift b/Sources/xAI/Intramodular/xAI.Client.swift new file mode 100644 index 00000000..eb33832f --- /dev/null +++ b/Sources/xAI/Intramodular/xAI.Client.swift @@ -0,0 +1,50 @@ + + +import CorePersistence +import LargeLanguageModels +import Merge +import NetworkKit +import Swallow + +extension xAI { + @RuntimeDiscoverable + public final class Client: HTTPClient, _StaticSwift.Namespace { + public static var persistentTypeRepresentation: some IdentityRepresentation { + _MIServiceTypeIdentifier._xAI + } + + public let interface: APISpecification + public let session: HTTPSession + + public init(interface: APISpecification, session: HTTPSession) { + self.interface = interface + self.session = session + } + + public convenience init(apiKey: String?) { + self.init( + interface: .init(configuration: .init(apiKey: apiKey)), + session: .shared + ) + } + } +} + +extension xAI.Client: _MIService { + public convenience init( + account: (any _MIServiceAccount)? + ) async throws { + let account: any _MIServiceAccount = try account.unwrap() + let serviceIdentifier: _MIServiceTypeIdentifier = account.serviceIdentifier + + guard serviceIdentifier == _MIServiceTypeIdentifier._xAI else { + throw _MIServiceError.serviceTypeIncompatible(serviceIdentifier) + } + + guard let credential = account.credential as? _MIServiceAPIKeyCredential else { + throw _MIServiceError.invalidCredentials(account.credential) + } + + self.init(apiKey: credential.apiKey) + } +} diff --git a/Sources/xAI/Intramodular/xAI.Model.swift b/Sources/xAI/Intramodular/xAI.Model.swift new file mode 100644 index 00000000..bc06398d --- /dev/null +++ b/Sources/xAI/Intramodular/xAI.Model.swift @@ -0,0 +1,52 @@ + + +import CoreMI +import CorePersistence +import LargeLanguageModels +import Swallow + +extension xAI { + public enum Model: String, CaseIterable, Codable, Hashable, Named, Sendable { + case grok_beta = "grok-beta" + case grok_vision_beta = "grok-vision-beta" + + public var name: String { + switch self { + case .grok_beta: + return "Grok Beta" + case .grok_vision_beta: + return "Grok Vision Beta" + } + } + } +} + +// MARK: - Conformances + +extension xAI.Model: CustomStringConvertible { + public var description: String { + rawValue + } +} + +extension xAI.Model: ModelIdentifierRepresentable { + public init(from identifier: ModelIdentifier) throws { + guard identifier.provider == ._xAI, identifier.revision == nil else { + throw Never.Reason.illegal + } + + guard let model = Self(rawValue: identifier.name) else { + throw Never.Reason.unexpected + } + + self = model + } + + public func __conversion() -> ModelIdentifier { + ModelIdentifier( + provider: ._xAI, + name: rawValue, + revision: nil + ) + } +} diff --git a/Sources/xAI/Intramodular/xAI.swift b/Sources/xAI/Intramodular/xAI.swift new file mode 100644 index 00000000..24ccd67a --- /dev/null +++ b/Sources/xAI/Intramodular/xAI.swift @@ -0,0 +1,7 @@ + +import Swift + +public enum xAI { + +} + diff --git a/Sources/xAI/module.swift b/Sources/xAI/module.swift new file mode 100644 index 00000000..86462ca6 --- /dev/null +++ b/Sources/xAI/module.swift @@ -0,0 +1,5 @@ + + +@_exported import LargeLanguageModels +@_exported import SwallowMacrosClient + diff --git a/Tests/Mistral/Intramodular/EmbeddingsTests.swift b/Tests/Mistral/Intramodular/EmbeddingsTests.swift index 4aee6269..3d8c2d75 100644 --- a/Tests/Mistral/Intramodular/EmbeddingsTests.swift +++ b/Tests/Mistral/Intramodular/EmbeddingsTests.swift @@ -3,7 +3,6 @@ // import LargeLanguageModels -import Groq import XCTest import Mistral diff --git a/Tests/xAI/Intramodular/CompletionTests.swift b/Tests/xAI/Intramodular/CompletionTests.swift new file mode 100644 index 00000000..ef9e78b9 --- /dev/null +++ b/Tests/xAI/Intramodular/CompletionTests.swift @@ -0,0 +1,43 @@ + + +import LargeLanguageModels +import xAI +import XCTest + +final class CompletionTests: XCTestCase { + + let llm: any LLMRequestHandling = client + + func testChatCompletionsGrokBeta() async throws { + let result = try await resultForModel(xAI.Model.grok_beta) + print(result) // "Hey! What's up with you?" + } + + func testChatCompletionsGrokVisionBeta() async throws { + let result = try await resultForModel(xAI.Model.grok_vision_beta) + print(result) // "Hey! How can I help you today?" + } + + private func resultForModel(_ model: xAI.Model) async throws -> String { + + let messages: [AbstractLLM.ChatMessage] = [ + AbstractLLM.ChatMessage( + role: .system, + body: "You are an extremely intelligent assistant." + ), + AbstractLLM.ChatMessage( + role: .user, + body: "Sup?" + ) + ] + + let result: String = try await llm.complete( + messages, + model: model, + as: String.self + ) + + return result + } +} + diff --git a/Tests/xAI/Intramodular/FunctionCallingTests.swift b/Tests/xAI/Intramodular/FunctionCallingTests.swift new file mode 100644 index 00000000..ba6af3cb --- /dev/null +++ b/Tests/xAI/Intramodular/FunctionCallingTests.swift @@ -0,0 +1,103 @@ + + +import CorePersistence +import xAI +import XCTest + +final class FunctionCallingTests: XCTestCase { + let llm: any LLMRequestHandling = client + + func testFunctionCalling() async throws { + let messages: [AbstractLLM.ChatMessage] = [ + .system { + "You are a Metereologist Expert accurately giving weather data in fahrenheit at any given city around the world" + }, + .user { + "What is the weather in San Francisco, CA?" + } + ] + + let functionCall1: AbstractLLM.ChatFunctionCall = try await llm.complete( + messages, + functions: [makeGetWeatherFunction1()], + as: .functionCall + ) + + let functionCall2: AbstractLLM.ChatFunctionCall = try await llm.complete( + messages, + functions: [makeGetWeatherFunction2()], + as: .functionCall + ) + + let result1 = try functionCall1.decode(GetWeatherParameters.self) + let result2 = try functionCall2.decode(GetWeatherParameters.self) + + print(result1, result2) + } + + private func makeGetWeatherFunction1() -> AbstractLLM.ChatFunctionDefinition { + let weatherObjectSchema = JSONSchema( + type: .object, + description: "Weather in a certain location", + properties: [ + "location": JSONSchema( + type: .string, + description: "The city and state, e.g. San Francisco, CA" + ), + "unit_fahrenheit" : JSONSchema( + type: .number, + description: "The unit of temperature in 'fahrenheit'" + ) + ], + required: true + ) + + let getWeatherFunction: AbstractLLM.ChatFunctionDefinition = AbstractLLM.ChatFunctionDefinition( + name: "get_weather", + context: "Get the current weather in a given location", + parameters: JSONSchema( + type: .object, + description: "Weather data for a given location in fahrenheit", + properties: [ + "weather": .array(weatherObjectSchema) + ] + ) + ) + + return getWeatherFunction + } + + struct GetWeatherParameters: Codable, Hashable, Sendable { + let weather: [WeatherObject] + } + + struct WeatherObject: Codable, Hashable, Sendable { + let location: String + let unit_fahrenheit: Double? + } + + private func makeGetWeatherFunction2() throws -> AbstractLLM.ChatFunctionDefinition { + let getWeatherFunction: AbstractLLM.ChatFunctionDefinition = AbstractLLM.ChatFunctionDefinition( + name: "get_weather", + context: "Get the current weather in a given location", + parameters: JSONSchema( + type: .object, + description: "Weather data for a given location in fahrenheit", + properties: [ + "weather": try .array { + try JSONSchema( + type: WeatherObject.self, + description: "Weather in a certain location", + propertyDescriptions: [ + "location": "The city and state, e.g. San Francisco, CA", + "unit_fahrenheit": "The unit of temperature in 'fahrenheit'" + ] + ) + } + ] + ) + ) + + return getWeatherFunction + } +} diff --git a/Tests/xAI/module.swift b/Tests/xAI/module.swift new file mode 100644 index 00000000..bd88733f --- /dev/null +++ b/Tests/xAI/module.swift @@ -0,0 +1,12 @@ + + +import xAI + +public var xAI_API_KEY: String { + "xai-iukwcbTFm3HCyuJVq7U5c0c9LKHJ0uhnGIsiOyn4Qu0zxSH3g1ULDSkaCHHoDQnX9tsV5cSCWom0HosP" +} + +public var client: xAI.Client { + xAI.Client(apiKey: xAI_API_KEY) +} + From 7e10f24cabb13927cdbcffa6b2706df4cd9f27e7 Mon Sep 17 00:00:00 2001 From: NatashaTheRobot Date: Sat, 30 Nov 2024 14:40:35 +0530 Subject: [PATCH 041/271] separated out embedding models, added completion models --- Package.resolved | 14 +- Package.swift | 11 + .../TogetherAI.APISpecification.swift | 2 +- .../Intramodular/TogetherAI.Client.swift | 2 +- .../Intramodular/TogetherAI.Model.swift | 197 +++++++++++++++--- Tests/TogetherAI/module.swift | 2 +- 6 files changed, 193 insertions(+), 35 deletions(-) diff --git a/Package.resolved b/Package.resolved index e257e27a..a3cf72c2 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "864ef9201dffd6ebf57da3ab4413cc1001edb70cd0c6d264b91e19b3967fb7ba", + "originHash" : "43bc324f7aba4797f38e1f72595973383d186932faefc9a4b3698c64d5b9cb44", "pins" : [ { "identity" : "corepersistence", @@ -7,7 +7,7 @@ "location" : "https://github.com/vmanot/CorePersistence.git", "state" : { "branch" : "main", - "revision" : "38fd5271fa906a2d8395e4b42724142886a3c763" + "revision" : "cfbee4e123a18cb893613cdd536391bb7dec2203" } }, { @@ -16,7 +16,7 @@ "location" : "https://github.com/vmanot/Merge.git", "state" : { "branch" : "master", - "revision" : "e8bc37c8dc203cab481efedd71237c151882c007" + "revision" : "925ca4baa33f8462d0ecd0757e7efabdac0a27ea" } }, { @@ -34,7 +34,7 @@ "location" : "https://github.com/vmanot/Swallow.git", "state" : { "branch" : "master", - "revision" : "6227a1114e341daf54e90df61e173599b187a9b1" + "revision" : "85d690b23077728eff23e9fc0297e724995e9d89" } }, { @@ -51,8 +51,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-syntax.git", "state" : { - "revision" : "2bc86522d115234d1f588efe2bcb4ce4be8f8b82", - "version" : "510.0.3" + "revision" : "0687f71944021d616d34d922343dcef086855920", + "version" : "600.0.1" } }, { @@ -70,7 +70,7 @@ "location" : "https://github.com/SwiftUIX/SwiftUIX.git", "state" : { "branch" : "master", - "revision" : "836fc284a9bb07fc9ab6d2dce6ebd0e32aabde26" + "revision" : "a68663989c8aaae013c4104c6a4aa2f35afe1000" } } ], diff --git a/Package.swift b/Package.swift index f2c02ee9..b41e64ff 100644 --- a/Package.swift +++ b/Package.swift @@ -507,6 +507,17 @@ let package = Package( swiftSettings: [ .enableExperimentalFeature("AccessLevelOnImport") ] + ), + .testTarget( + name: "TogetherAITests", + dependencies: [ + "AI", + "Swallow" + ], + path: "Tests/TogetherAI", + swiftSettings: [ + .enableExperimentalFeature("AccessLevelOnImport") + ] ) ] ) diff --git a/Sources/TogetherAI/Intramodular/TogetherAI.APISpecification.swift b/Sources/TogetherAI/Intramodular/TogetherAI.APISpecification.swift index 07b41904..dd1252d2 100644 --- a/Sources/TogetherAI/Intramodular/TogetherAI.APISpecification.swift +++ b/Sources/TogetherAI/Intramodular/TogetherAI.APISpecification.swift @@ -122,7 +122,7 @@ extension TogetherAI.APISpecification { extension TogetherAI.APISpecification.RequestBodies { public struct CreateEmbedding: Codable, Hashable { - public let model: TogetherAI.Model + public let model: TogetherAI.Model.Embedding public let input: String } } diff --git a/Sources/TogetherAI/Intramodular/TogetherAI.Client.swift b/Sources/TogetherAI/Intramodular/TogetherAI.Client.swift index 6601259f..4ce369db 100644 --- a/Sources/TogetherAI/Intramodular/TogetherAI.Client.swift +++ b/Sources/TogetherAI/Intramodular/TogetherAI.Client.swift @@ -53,7 +53,7 @@ extension TogetherAI.Client: CoreMI._ServiceClientProtocol { extension TogetherAI.Client { public func createEmbeddings( - for model: TogetherAI.Model, + for model: TogetherAI.Model.Embedding, input: String ) async throws -> TogetherAI.Embeddings { try await run( diff --git a/Sources/TogetherAI/Intramodular/TogetherAI.Model.swift b/Sources/TogetherAI/Intramodular/TogetherAI.Model.swift index 316cf1d3..52ea5e62 100644 --- a/Sources/TogetherAI/Intramodular/TogetherAI.Model.swift +++ b/Sources/TogetherAI/Intramodular/TogetherAI.Model.swift @@ -7,8 +7,61 @@ import CorePersistence import LargeLanguageModels import Swallow +public protocol _TogetherAI_ModelType: Codable, Hashable, RawRepresentable, Sendable where RawValue == String { + var contextSize: Int { get throws } +} + extension TogetherAI { - public enum Model: String, CaseIterable, Codable, Hashable, Named, Sendable { + public typealias _ModelType = _TogetherAI_ModelType +} + +extension TogetherAI { + public enum Model: CaseIterable, _TogetherAI_ModelType, Hashable { + public private(set) static var allCases: [Model] = { + var result: [Model] = [] + + result += Embedding.allCases.map({ Self.embedding($0 )}) + result += Completion.allCases.map({ Self.completion($0) }) + + return result + }() + + case completion(Completion) + case embedding(Embedding) + case unknown(String) + + public var name: String { + if let base = (base as? any Named) { + return base.name.description + } else { + return base.rawValue + } + } + + private var base: any TogetherAI._ModelType { + switch self { + case .completion(let value): + return value + case .embedding(let value): + return value + case .unknown: + assertionFailure(.unimplemented) + + return self + } + } + + public var contextSize: Int { + get throws { + try base.contextSize + } + } + } +} + +extension TogetherAI.Model { + public enum Embedding: String, TogetherAI._ModelType, CaseIterable { + // Together Models case togetherM2Bert80M2KRetrieval = "togethercomputer/m2-bert-80M-2k-retrieval" case togetherM2Bert80M8KRetrieval = "togethercomputer/m2-bert-80M-8k-retrieval" @@ -29,21 +82,21 @@ extension TogetherAI { public var name: String { switch self { - case .togetherM2Bert80M2KRetrieval: + case .togetherM2Bert80M2KRetrieval: return "M2-BERT-80M-2K-Retrieval" - case .togetherM2Bert80M8KRetrieval: + case .togetherM2Bert80M8KRetrieval: return "M2-BERT-80M-8K-Retrieval" - case .togetherM2Bert80M32KRetrieval: + case .togetherM2Bert80M32KRetrieval: return "M2-BERT-80M-32K-Retrieval" - case .whereIsAIUAELargeV1: + case .whereIsAIUAELargeV1: return "UAE-Large-v1" - case .baaiLargeENV15: + case .baaiLargeENV15: return "BGE-Large-EN-v1.5" - case .baaiBaseENV15: + case .baaiBaseENV15: return "BGE-Base-EN-v1.5" - case .sentenceBERT: + case .sentenceBERT: return "Sentence-BERT" - case .googleBERTBaseUncased: + case .googleBERTBaseUncased: return "BERT" } } @@ -72,47 +125,141 @@ extension TogetherAI { } } - public var contextWindow: Int { + public var contextSize: Int { switch self { - case .togetherM2Bert80M2KRetrieval: + case .togetherM2Bert80M2KRetrieval: return 2048 - case .togetherM2Bert80M8KRetrieval: + case .togetherM2Bert80M8KRetrieval: return 8192 - case .togetherM2Bert80M32KRetrieval: + case .togetherM2Bert80M32KRetrieval: return 32768 case .whereIsAIUAELargeV1, .baaiLargeENV15, .baaiBaseENV15, .sentenceBERT, .googleBERTBaseUncased: return 512 } } + + public init?(rawValue: String) { + switch rawValue { + case "togethercomputer/m2-bert-80M-2k-retrieval": + self = .togetherM2Bert80M2KRetrieval + case "togethercomputer/m2-bert-80M-8k-retrieval": + self = .togetherM2Bert80M8KRetrieval + case "togethercomputer/m2-bert-80M-32k-retrieval": + self = .togetherM2Bert80M32KRetrieval + case "WhereIsAI/UAE-Large-V1": + self = .whereIsAIUAELargeV1 + case "BAAI/bge-large-en-v1.5": + self = .baaiLargeENV15 + case "BAAI/bge-base-en-v1.5": + self = .baaiBaseENV15 + case "sentence-transformers/msmarco-bert-base-dot-v5": + self = .sentenceBERT + case "bert-base-uncased": + self = .googleBERTBaseUncased + default: + return nil + } + } + } +} + +extension TogetherAI.Model { + public enum Completion: String, TogetherAI._ModelType, CaseIterable { + + case metaLlama2_70B = "meta-llama/Llama-2-70b-hf" + case mistral7b = "mistralai/Mistral-7B-v0.1" + case mixtral8x7b = "mistralai/Mixtral-8x7B-v0.1" + + public var name: String { + switch self { + case .metaLlama2_70B: + return "Meta LLaMA-2 (70B)" + case .mistral7b: + return "Mistral (7B)" + case .mixtral8x7b: + return "Mixtral-8x7B (46.7B)" + } + } + + public var contextSize: Int { + switch self { + case .metaLlama2_70B: + return 4096 + case .mistral7b: + return 8192 + case .mixtral8x7b: + return 32768 + } + } + + public init?(rawValue: String) { + switch rawValue { + case "meta-llama/Llama-2-70b-hf": + self = .metaLlama2_70B + case "mistralai/Mistral-7B-v0.1": + self = .mistral7b + case "mistralai/Mixtral-8x7B-v0.1": + self = .mixtral8x7b + default: + return nil + } + } } } // MARK: - Conformances -extension TogetherAI.Model: CustomStringConvertible { - public var description: String { - rawValue +extension TogetherAI.Model: Codable { + public init(from decoder: Decoder) throws { + self = try Self(rawValue: try String(from: decoder)).unwrap() + } + + public func encode(to encoder: Encoder) throws { + try rawValue.encode(to: encoder) } } extension TogetherAI.Model: ModelIdentifierRepresentable { - public init(from identifier: ModelIdentifier) throws { - guard identifier.provider == ._TogetherAI, identifier.revision == nil else { - throw Never.Reason.illegal - } - - guard let model = Self(rawValue: identifier.name) else { - throw Never.Reason.unexpected + private enum _DecodingError: Error { + case invalidModelProvider + } + + public init(from model: ModelIdentifier) throws { + guard model.provider == .openAI else { + throw _DecodingError.invalidModelProvider } - self = model + self = try Self(rawValue: model.name).unwrap() } public func __conversion() -> ModelIdentifier { ModelIdentifier( - provider: ._TogetherAI, + provider: .togetherAI, name: rawValue, revision: nil ) } } + +extension TogetherAI.Model: RawRepresentable { + public var rawValue: String { + switch self { + case .completion(let model): + return model.rawValue + case .embedding(let model): + return model.rawValue + case .unknown(let rawValue): + return rawValue + } + } + + public init?(rawValue: String) { + if let model = Completion(rawValue: rawValue) { + self = .completion(model) + } else if let model = Embedding(rawValue: rawValue) { + self = .embedding(model) + } else { + self = .unknown(rawValue) + } + } +} diff --git a/Tests/TogetherAI/module.swift b/Tests/TogetherAI/module.swift index 67d8ba23..7d2491eb 100644 --- a/Tests/TogetherAI/module.swift +++ b/Tests/TogetherAI/module.swift @@ -5,7 +5,7 @@ import TogetherAI public var TOGETHERAI_API_KEY: String { - "" + "e7a0f4590185d90881baded9ca54b0f173838b8b001e4450c0759ab9894c949b" } public var client: TogetherAI.Client { From 2a121f17ba9f7ef45ca3e658a0097de441916dbb Mon Sep 17 00:00:00 2001 From: NatashaTheRobot Date: Sat, 30 Nov 2024 15:46:55 +0530 Subject: [PATCH 042/271] added completions api to togetherai --- .../TogetherAI.APISpecification.swift | 90 +++++++++++++++++++ .../Intramodular/TogetherAI.Client.swift | 35 ++++++++ .../Intramodular/TogetherAI.Completion.swift | 41 +++++++++ .../Intramodular/TogetherAI.Model.swift | 10 +-- .../Intramodular/CompetionTests.swift | 49 ++++++++++ Tests/TogetherAI/module.swift | 2 +- 6 files changed, 221 insertions(+), 6 deletions(-) create mode 100644 Sources/TogetherAI/Intramodular/TogetherAI.Completion.swift create mode 100644 Tests/TogetherAI/Intramodular/CompetionTests.swift diff --git a/Sources/TogetherAI/Intramodular/TogetherAI.APISpecification.swift b/Sources/TogetherAI/Intramodular/TogetherAI.APISpecification.swift index dd1252d2..97dd0e9e 100644 --- a/Sources/TogetherAI/Intramodular/TogetherAI.APISpecification.swift +++ b/Sources/TogetherAI/Intramodular/TogetherAI.APISpecification.swift @@ -41,6 +41,10 @@ extension TogetherAI { @POST @Path("embeddings") public var createEmbeddings = Endpoint() + + @POST + @Path("completions") + public var createCompletion = Endpoint() } } @@ -125,4 +129,90 @@ extension TogetherAI.APISpecification.RequestBodies { public let model: TogetherAI.Model.Embedding public let input: String } + + public struct CreateCompletion: Codable, Hashable { + + private enum CodingKeys: String, CodingKey { + case model + case prompt + case maxTokens = "max_tokens" + case stream + case stop + case temperature + case topP = "top_p" + case topK = "top_k" + case repetitionPenalty = "repetition_penalty" + case logprobs + case echo + case choices = "n" + case safetyModel = "safety_model" + } + + public let model: TogetherAI.Model.Completion + public let prompt: String + + // The maximum number of tokens to generate. + // Defaults to 200 + public let maxTokens: Int? + + // If true, stream tokens as Server-Sent Events as the model generates them instead of waiting for the full model response. If false, return a single JSON object containing the results. + public let stream: Bool? + + // A list of string sequences that will truncate (stop) inference text output. For example, "" will stop generation as soon as the model generates the given token. + public let stop: [String]? + + // A decimal number that determines the degree of randomness in the response. A value of 1 will always yield the same output. A temperature less than 1 favors more correctness and is appropriate for question answering or summarization. A value greater than 1 introduces more randomness in the output. + public let temperature: Double? + + // The top_p (nucleus) parameter is used to dynamically adjust the number of choices for each predicted token based on the cumulative probabilities. It specifies a probability threshold, below which all less likely tokens are filtered out. This technique helps to maintain diversity and generate more fluent and natural-sounding text. + public let topP: Double? + + // The top_k parameter is used to limit the number of choices for the next predicted word or token. It specifies the maximum number of tokens to consider at each step, based on their probability of occurrence. This technique helps to speed up the generation process and can improve the quality of the generated text by focusing on the most likely options. + public let topK: Double? + + // A number that controls the diversity of generated text by reducing the likelihood of repeated sequences. Higher values decrease repetition. + public let repetitionPenalty: Double? + + // Number of top-k logprobs to return + public let logprobs: Int? + + // Echo prompt in output. Can be used with logprobs to return prompt logprobs. + public let echo: Bool? + + // How many completions to generate for each prompt + public let choices: Int? + + // A moderation model to validate tokens. Choice between available moderation models found here: https://docs.together.ai/docs/inference-models#moderation-models + public let safetyModel: String? + + public init( + model: TogetherAI.Model.Completion, + prompt: String, + maxTokens: Int?, + stream: Bool? = nil, + stop: [String]? = nil, + temperature: Double? = nil, + topP: Double? = nil, + topK: Double? = nil, + repetitionPenalty: Double? = nil, + logprobs: Int? = nil, + echo: Bool? = nil, + choices: Int? = nil, + safetyModel: String? = nil + ) { + self.model = model + self.prompt = prompt + self.maxTokens = maxTokens ?? 200 + self.stream = stream + self.stop = stop + self.temperature = temperature + self.topP = topP + self.topK = topK + self.repetitionPenalty = repetitionPenalty + self.logprobs = logprobs + self.echo = echo + self.choices = choices + self.safetyModel = safetyModel + } + } } diff --git a/Sources/TogetherAI/Intramodular/TogetherAI.Client.swift b/Sources/TogetherAI/Intramodular/TogetherAI.Client.swift index 4ce369db..ef90e5ee 100644 --- a/Sources/TogetherAI/Intramodular/TogetherAI.Client.swift +++ b/Sources/TogetherAI/Intramodular/TogetherAI.Client.swift @@ -64,4 +64,39 @@ extension TogetherAI.Client { ) ) } + + public func createCompletion( + for model: TogetherAI.Model.Completion, + prompt: String, + maxTokens: Int? = nil, + stream: Bool? = nil, + stop: [String]? = nil, + temperature: Double? = nil, + topP: Double? = nil, + topK: Double? = nil, + repetitionPenalty: Double? = nil, + logprobs: Int? = nil, + echo: Bool? = nil, + choices: Int? = nil, + safetyModel: String? = nil + ) async throws -> TogetherAI.Completion { + try await run( + \.createCompletion, + with: .init( + model: model, + prompt: prompt, + maxTokens: maxTokens, + stream: stream, + stop: stop, + temperature: temperature, + topP: topP, + topK: topK, + repetitionPenalty: repetitionPenalty, + logprobs: logprobs, + echo: echo, + choices: choices, + safetyModel: safetyModel + ) + ) + } } diff --git a/Sources/TogetherAI/Intramodular/TogetherAI.Completion.swift b/Sources/TogetherAI/Intramodular/TogetherAI.Completion.swift new file mode 100644 index 00000000..e65c4391 --- /dev/null +++ b/Sources/TogetherAI/Intramodular/TogetherAI.Completion.swift @@ -0,0 +1,41 @@ +// +// Copyright (c) Vatsal Manot +// + +import NetworkKit +import Swift + +extension TogetherAI { + public final class Completion: Codable, Sendable { + private enum CodingKeys: String, CodingKey { + case id + case object + case model + case createdAt = "created" + case choices + case usage + } + + public struct Choice: Codable, Hashable, Sendable { + public let text: String + public let index: Int + public let seed: Double + public let finishReason: String + } + + public struct Usage: Codable, Hashable, Sendable { + public let promptTokens: Int + public let completionTokens: Int + public let totalTokens: Int + } + + + public let id: String + public let model: TogetherAI.Model.Completion + public let object: String + public let createdAt: Date + public let choices: [Choice] + public let usage: Usage + } +} + diff --git a/Sources/TogetherAI/Intramodular/TogetherAI.Model.swift b/Sources/TogetherAI/Intramodular/TogetherAI.Model.swift index 52ea5e62..8a487824 100644 --- a/Sources/TogetherAI/Intramodular/TogetherAI.Model.swift +++ b/Sources/TogetherAI/Intramodular/TogetherAI.Model.swift @@ -166,14 +166,14 @@ extension TogetherAI.Model { extension TogetherAI.Model { public enum Completion: String, TogetherAI._ModelType, CaseIterable { - case metaLlama2_70B = "meta-llama/Llama-2-70b-hf" + case llama2_70B = "meta-llama/Llama-2-70b-hf" case mistral7b = "mistralai/Mistral-7B-v0.1" case mixtral8x7b = "mistralai/Mixtral-8x7B-v0.1" public var name: String { switch self { - case .metaLlama2_70B: - return "Meta LLaMA-2 (70B)" + case .llama2_70B: + return "LLaMA-2 (70B)" case .mistral7b: return "Mistral (7B)" case .mixtral8x7b: @@ -183,7 +183,7 @@ extension TogetherAI.Model { public var contextSize: Int { switch self { - case .metaLlama2_70B: + case .llama2_70B: return 4096 case .mistral7b: return 8192 @@ -195,7 +195,7 @@ extension TogetherAI.Model { public init?(rawValue: String) { switch rawValue { case "meta-llama/Llama-2-70b-hf": - self = .metaLlama2_70B + self = .llama2_70B case "mistralai/Mistral-7B-v0.1": self = .mistral7b case "mistralai/Mixtral-8x7B-v0.1": diff --git a/Tests/TogetherAI/Intramodular/CompetionTests.swift b/Tests/TogetherAI/Intramodular/CompetionTests.swift new file mode 100644 index 00000000..9febc433 --- /dev/null +++ b/Tests/TogetherAI/Intramodular/CompetionTests.swift @@ -0,0 +1,49 @@ +// +// Copyright (c) Vatsal Manot +// + +import Foundation +import LargeLanguageModels +import TogetherAI +import XCTest + +final class CompletionTests: XCTestCase { + + func testCompletionsLlama() async throws { + let completion = try await client + .createCompletion( + for: .llama2_70B, + prompt: "List all of the states in the USA and their capitals in a table.", + maxTokens: 200, + temperature: 0.7, + choices: 5 + ) + print(completion) + } + + func testCompletionsMistral() async throws { + let completion = try await client + .createCompletion( + for: .mistral7b, + prompt: "List all of the states in the USA and their capitals in a table.", + maxTokens: 400, + temperature: 0.5, + choices: 2 + ) + print(completion) + } + + func testCompletionsMixtral() async throws { + let completion = try await client + .createCompletion( + for: .mixtral8x7b, + prompt: "List all of the states in the USA and their capitals in a table.", + maxTokens: 175, + temperature: 0.9, + choices: 3 + ) + print(completion) + } +} + + diff --git a/Tests/TogetherAI/module.swift b/Tests/TogetherAI/module.swift index 7d2491eb..e856c439 100644 --- a/Tests/TogetherAI/module.swift +++ b/Tests/TogetherAI/module.swift @@ -5,7 +5,7 @@ import TogetherAI public var TOGETHERAI_API_KEY: String { - "e7a0f4590185d90881baded9ca54b0f173838b8b001e4450c0759ab9894c949b" + "YOUR_API_KEY" } public var client: TogetherAI.Client { From 9aae12c2133b7b1c09ccd8cfac5b5ecedb1e5617 Mon Sep 17 00:00:00 2001 From: NatashaTheRobot Date: Sat, 30 Nov 2024 16:25:09 +0530 Subject: [PATCH 043/271] added llmrequesthandling --- ...TogetherAI.Client+LLMRequestHandling.swift | 128 ++++++++++++++++++ .../Intramodular/TogetherAI.Model.swift | 2 +- .../Intramodular/CompetionTests.swift | 20 ++- 3 files changed, 148 insertions(+), 2 deletions(-) create mode 100644 Sources/TogetherAI/Intramodular/TogetherAI.Client+LLMRequestHandling.swift diff --git a/Sources/TogetherAI/Intramodular/TogetherAI.Client+LLMRequestHandling.swift b/Sources/TogetherAI/Intramodular/TogetherAI.Client+LLMRequestHandling.swift new file mode 100644 index 00000000..12c4d3fc --- /dev/null +++ b/Sources/TogetherAI/Intramodular/TogetherAI.Client+LLMRequestHandling.swift @@ -0,0 +1,128 @@ +// +// Copyright (c) Vatsal Manot +// + +import CoreMI +import CorePersistence +import Diagnostics +@_spi(Internal) import LargeLanguageModels +import Merge +import Swallow + +extension TogetherAI.Client: _TaskDependenciesExporting { + public var _exportedTaskDependencies: TaskDependencies { + var result = TaskDependencies() + + result[\.llm] = self + //result[\.embedding] = self + + return result + } +} + +extension TogetherAI.Client: LLMRequestHandling { + private var _debugPrintCompletions: Bool { + false + } + + public var _availableModels: [ModelIdentifier]? { + return TogetherAI.Model.allCases.map({ $0.__conversion() }) + } + + public func complete( + prompt: Prompt, + parameters: Prompt.CompletionParameters + ) async throws -> Prompt.Completion { + let _completion: Any + + switch prompt { + case let prompt as AbstractLLM.TextPrompt: + _completion = try await _complete( + prompt: prompt, + parameters: try cast(parameters) + ) + default: + throw LLMRequestHandlingError.unsupportedPromptType(Prompt.self) + } + + return try cast(_completion) + } + + private func _complete( + prompt: AbstractLLM.TextPrompt, + parameters: AbstractLLM.TextCompletionParameters + ) async throws -> AbstractLLM.TextCompletion { + let parameters = try cast(parameters, to: AbstractLLM.TextCompletionParameters.self) + + let model = TogetherAI.Model.Completion.mixtral8x7b + + let promptText = try prompt.prefix.promptLiteral + let completion = try await + self.createCompletion( + for: model, + prompt: promptText._stripToText(), + maxTokens: parameters.tokenLimit.fixedValue, + stop: parameters.stops, + temperature: parameters.temperatureOrTopP?.temperature, + topP: parameters.temperatureOrTopP?.topProbabilityMass + ) + + let text = try completion.choices.toCollectionOfOne().first.text + + _debugPrint( + prompt: prompt.debugDescription + .delimited(by: .quotationMark) + .delimited(by: "\n") + , + completion: text + .delimited(by: .quotationMark) + .delimited(by: "\n") + ) + + + return .init(prefix: promptText, text: text) + } +} + +extension TogetherAI.Client { + private func _debugPrint(prompt: String, completion: String) { + guard _debugPrintCompletions else { + return + } + + guard _isDebugAssertConfiguration else { + return + } + + let description = String.concatenate(separator: "\n") { + "=== [PROMPT START] ===" + prompt.debugDescription + .delimited(by: .quotationMark) + .delimited(by: "\n") + "==== [COMPLETION] ====" + completion + .delimited(by: .quotationMark) + .delimited(by: "\n") + "==== [PROMPT END] ====" + } + + print(description) + } +} + +// MARK: - Auxiliary + +extension ModelIdentifier { + + public init( + from model: TogetherAI.Model.Completion + ) { + self.init(provider: .togetherAI, name: model.rawValue, revision: nil) + } + + public init( + from model: TogetherAI.Model.Embedding + ) { + self.init(provider: .togetherAI, name: model.rawValue, revision: nil) + } +} diff --git a/Sources/TogetherAI/Intramodular/TogetherAI.Model.swift b/Sources/TogetherAI/Intramodular/TogetherAI.Model.swift index 8a487824..e12b71af 100644 --- a/Sources/TogetherAI/Intramodular/TogetherAI.Model.swift +++ b/Sources/TogetherAI/Intramodular/TogetherAI.Model.swift @@ -225,7 +225,7 @@ extension TogetherAI.Model: ModelIdentifierRepresentable { } public init(from model: ModelIdentifier) throws { - guard model.provider == .openAI else { + guard model.provider == .togetherAI else { throw _DecodingError.invalidModelProvider } diff --git a/Tests/TogetherAI/Intramodular/CompetionTests.swift b/Tests/TogetherAI/Intramodular/CompetionTests.swift index 9febc433..0cb98147 100644 --- a/Tests/TogetherAI/Intramodular/CompetionTests.swift +++ b/Tests/TogetherAI/Intramodular/CompetionTests.swift @@ -8,7 +8,25 @@ import TogetherAI import XCTest final class CompletionTests: XCTestCase { - + + func testCompletionsLLMRequest() async throws { + let llm: any LLMRequestHandling = client + + let prompt: AbstractLLM.TextPrompt = .init(stringLiteral: "List all of the states in the USA and their capitals in a table.") + let parameters: AbstractLLM.TextCompletionParameters = .init( + tokenLimit: .fixed(400), + temperature: 0.8, + stops: nil + ) + + let completion = try await llm.complete( + prompt: prompt, + parameters: parameters + ) + + print(completion) + } + func testCompletionsLlama() async throws { let completion = try await client .createCompletion( From 4d410c05a95256e680975845ef7a6139ea01caf1 Mon Sep 17 00:00:00 2001 From: NatashaTheRobot Date: Sat, 30 Nov 2024 16:50:38 +0530 Subject: [PATCH 044/271] added text embeddings request handling conformance --- .../TogetherAI.APISpecification.swift | 2 +- ...TogetherAI.Client+LLMRequestHandling.swift | 2 +- ...Client+TextEmbeddingsRequestHandling.swift | 40 +++++++++++++++++++ .../Intramodular/TogetherAI.Client.swift | 15 ++++++- .../Intramodular/TogetherAI.Embeddings.swift | 2 +- .../Intramodular/EmbeddingsTests.swift | 22 +++++++++- 6 files changed, 78 insertions(+), 5 deletions(-) create mode 100644 Sources/TogetherAI/Intramodular/TogetherAI.Client+TextEmbeddingsRequestHandling.swift diff --git a/Sources/TogetherAI/Intramodular/TogetherAI.APISpecification.swift b/Sources/TogetherAI/Intramodular/TogetherAI.APISpecification.swift index 97dd0e9e..0416b7a8 100644 --- a/Sources/TogetherAI/Intramodular/TogetherAI.APISpecification.swift +++ b/Sources/TogetherAI/Intramodular/TogetherAI.APISpecification.swift @@ -127,7 +127,7 @@ extension TogetherAI.APISpecification { extension TogetherAI.APISpecification.RequestBodies { public struct CreateEmbedding: Codable, Hashable { public let model: TogetherAI.Model.Embedding - public let input: String + public let input: [String] } public struct CreateCompletion: Codable, Hashable { diff --git a/Sources/TogetherAI/Intramodular/TogetherAI.Client+LLMRequestHandling.swift b/Sources/TogetherAI/Intramodular/TogetherAI.Client+LLMRequestHandling.swift index 12c4d3fc..27526ffa 100644 --- a/Sources/TogetherAI/Intramodular/TogetherAI.Client+LLMRequestHandling.swift +++ b/Sources/TogetherAI/Intramodular/TogetherAI.Client+LLMRequestHandling.swift @@ -14,7 +14,7 @@ extension TogetherAI.Client: _TaskDependenciesExporting { var result = TaskDependencies() result[\.llm] = self - //result[\.embedding] = self + result[\.embedding] = self return result } diff --git a/Sources/TogetherAI/Intramodular/TogetherAI.Client+TextEmbeddingsRequestHandling.swift b/Sources/TogetherAI/Intramodular/TogetherAI.Client+TextEmbeddingsRequestHandling.swift new file mode 100644 index 00000000..e7c6e816 --- /dev/null +++ b/Sources/TogetherAI/Intramodular/TogetherAI.Client+TextEmbeddingsRequestHandling.swift @@ -0,0 +1,40 @@ +// +// Copyright (c) Vatsal Manot +// + +import CoreMI +import CorePersistence + +extension TogetherAI.Client: TextEmbeddingsRequestHandling { + public func fulfill( + _ request: TextEmbeddingsRequest + ) async throws -> TextEmbeddings { + guard !request.input.isEmpty else { + return TextEmbeddings( + model: .init(from: TogetherAI.Model.Embedding.togetherM2Bert80M2KRetrieval), + data: [] + ) + } + + let model: ModelIdentifier = request.model ?? ModelIdentifier(from: TogetherAI.Model.Embedding.togetherM2Bert80M2KRetrieval) + let embeddingModel = try TogetherAI.Model.Embedding(rawValue: model.name).unwrap() + + let embeddings = try await createEmbeddings( + for: embeddingModel, + input: request.input + ).data + + try _tryAssert(request.input.count == embeddings.count) + + return TextEmbeddings( + model: .init(from: TogetherAI.Model.Embedding.togetherM2Bert80M2KRetrieval), + data: request.input.zip(embeddings).map { + TextEmbeddings.Element( + text: $0, + embedding: $1.embedding, + model: model + ) + } + ) + } +} diff --git a/Sources/TogetherAI/Intramodular/TogetherAI.Client.swift b/Sources/TogetherAI/Intramodular/TogetherAI.Client.swift index ef90e5ee..5948d898 100644 --- a/Sources/TogetherAI/Intramodular/TogetherAI.Client.swift +++ b/Sources/TogetherAI/Intramodular/TogetherAI.Client.swift @@ -54,7 +54,7 @@ extension TogetherAI.Client: CoreMI._ServiceClientProtocol { extension TogetherAI.Client { public func createEmbeddings( for model: TogetherAI.Model.Embedding, - input: String + input: [String] ) async throws -> TogetherAI.Embeddings { try await run( \.createEmbeddings, @@ -65,6 +65,19 @@ extension TogetherAI.Client { ) } + public func createEmbeddings( + for model: TogetherAI.Model.Embedding, + input: String + ) async throws -> TogetherAI.Embeddings { + try await run( + \.createEmbeddings, + with: .init( + model: model, + input: [input] + ) + ) + } + public func createCompletion( for model: TogetherAI.Model.Completion, prompt: String, diff --git a/Sources/TogetherAI/Intramodular/TogetherAI.Embeddings.swift b/Sources/TogetherAI/Intramodular/TogetherAI.Embeddings.swift index a30e8576..02464834 100644 --- a/Sources/TogetherAI/Intramodular/TogetherAI.Embeddings.swift +++ b/Sources/TogetherAI/Intramodular/TogetherAI.Embeddings.swift @@ -15,7 +15,7 @@ extension TogetherAI { extension TogetherAI.Embeddings { public struct EmbeddingData: Codable, Hashable, Sendable { public let object: String - public let embedding: [Float] + public let embedding: [Double] public let index: Int } } diff --git a/Tests/TogetherAI/Intramodular/EmbeddingsTests.swift b/Tests/TogetherAI/Intramodular/EmbeddingsTests.swift index a9de0f2b..ea5a3b69 100644 --- a/Tests/TogetherAI/Intramodular/EmbeddingsTests.swift +++ b/Tests/TogetherAI/Intramodular/EmbeddingsTests.swift @@ -3,11 +3,31 @@ // import LargeLanguageModels -import VoyageAI +import TogetherAI import XCTest final class EmbeddingsTests: XCTestCase { + func testTextEmbeddingsRequesntHandling() async { + let textEmbeddingsClient: any TextEmbeddingsRequestHandling = client + let textInput = "Our solar system orbits the Milky Way galaxy at about 515,000 mph" + + do { + let embeddings = try await textEmbeddingsClient.fulfill( + .init( + input: [textInput], + model: ModelIdentifier( + from: TogetherAI.Model.Embedding.togetherM2Bert80M8KRetrieval + ) + ) + ) + let embeddingsData = embeddings.data + XCTAssertTrue(!embeddingsData.isEmpty) + } catch { + XCTFail(String(describing: error)) + } + } + func testTextEmbeddings() async { let textInput = "Our solar system orbits the Milky Way galaxy at about 515,000 mph" do { From 3cf471a7d2ac758da71a246912bf30aebe19fa88 Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Tue, 3 Dec 2024 09:59:32 -0700 Subject: [PATCH 045/271] CreateImageEdit --- Package.resolved | 14 +++--- ...penAI.APISpecification.RequestBodies.swift | 44 +++++++++++++++++++ .../Intramodular/Models/OpenAI.Model.swift | 3 ++ .../Intramodular/OpenAI.Client-Image.swift | 8 ++++ 4 files changed, 62 insertions(+), 7 deletions(-) diff --git a/Package.resolved b/Package.resolved index e257e27a..941f0af2 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "864ef9201dffd6ebf57da3ab4413cc1001edb70cd0c6d264b91e19b3967fb7ba", + "originHash" : "43bc324f7aba4797f38e1f72595973383d186932faefc9a4b3698c64d5b9cb44", "pins" : [ { "identity" : "corepersistence", @@ -7,7 +7,7 @@ "location" : "https://github.com/vmanot/CorePersistence.git", "state" : { "branch" : "main", - "revision" : "38fd5271fa906a2d8395e4b42724142886a3c763" + "revision" : "e5026e82410d4140aa5468fe98069e4f5c4fa5cf" } }, { @@ -16,7 +16,7 @@ "location" : "https://github.com/vmanot/Merge.git", "state" : { "branch" : "master", - "revision" : "e8bc37c8dc203cab481efedd71237c151882c007" + "revision" : "2a47b62831164bea212a1616cfe3d4da32902f7f" } }, { @@ -34,7 +34,7 @@ "location" : "https://github.com/vmanot/Swallow.git", "state" : { "branch" : "master", - "revision" : "6227a1114e341daf54e90df61e173599b187a9b1" + "revision" : "f91811c49863ed506da4f3aed21f6c216a258ca0" } }, { @@ -51,8 +51,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-syntax.git", "state" : { - "revision" : "2bc86522d115234d1f588efe2bcb4ce4be8f8b82", - "version" : "510.0.3" + "revision" : "0687f71944021d616d34d922343dcef086855920", + "version" : "600.0.1" } }, { @@ -70,7 +70,7 @@ "location" : "https://github.com/SwiftUIX/SwiftUIX.git", "state" : { "branch" : "master", - "revision" : "836fc284a9bb07fc9ab6d2dce6ebd0e32aabde26" + "revision" : "275be4fd06b570b71fe1eb47b4246f4c4285b177" } } ], diff --git a/Sources/OpenAI/Intramodular/API/OpenAI.APISpecification.RequestBodies.swift b/Sources/OpenAI/Intramodular/API/OpenAI.APISpecification.RequestBodies.swift index 386b9164..bd5e0234 100644 --- a/Sources/OpenAI/Intramodular/API/OpenAI.APISpecification.RequestBodies.swift +++ b/Sources/OpenAI/Intramodular/API/OpenAI.APISpecification.RequestBodies.swift @@ -644,6 +644,50 @@ extension OpenAI.APISpecification.RequestBodies { } } +extension OpenAI.APISpecification.RequestBodies { + struct CreateImageEdit: Codable { + enum CodingKeys: String, CodingKey { + case image + case prompt + case mask + case model + case numberOfImages = "n" + case size + case responseFormat = "response_format" + case user + } + + let image: Data + let prompt: String + let mask: Data? + let model: OpenAI.Model.DALL_E + let numberOfImages: Int + let size: OpenAI.Image.Size + let responseFormat: OpenAI.Client.ImageResponseFormat + let user: String? + + init( + image: Data, + prompt: String, + mask: Data? = nil, + model: OpenAI.Model.DALL_E = .dalle2, + numberOfImages: Int = 1, + size: OpenAI.Image.Size = .w1024h1024, + responseFormat: OpenAI.Client.ImageResponseFormat = .ephemeralURL, + user: String? = nil + ) { + self.image = image + self.prompt = prompt + self.mask = mask + self.model = model + self.numberOfImages = numberOfImages + self.size = size + self.responseFormat = responseFormat + self.user = user + } + } +} + extension OpenAI.APISpecification.RequestBodies { struct CreateVectorStore: Codable { enum CodingKeys: String, CodingKey { diff --git a/Sources/OpenAI/Intramodular/Models/OpenAI.Model.swift b/Sources/OpenAI/Intramodular/Models/OpenAI.Model.swift index 23505a92..e50eeff4 100644 --- a/Sources/OpenAI/Intramodular/Models/OpenAI.Model.swift +++ b/Sources/OpenAI/Intramodular/Models/OpenAI.Model.swift @@ -405,6 +405,7 @@ extension OpenAI.Model { } case dalle3 = "dall-e-3" + case dalle2 = "dall-e-2" public var contextSize: Int? { 4000 @@ -414,6 +415,8 @@ extension OpenAI.Model { switch self { case .dalle3: "dall-e-3" + case .dalle2: + "dall-e-2" } } } diff --git a/Sources/OpenAI/Intramodular/OpenAI.Client-Image.swift b/Sources/OpenAI/Intramodular/OpenAI.Client-Image.swift index 23124b55..c78d1528 100644 --- a/Sources/OpenAI/Intramodular/OpenAI.Client-Image.swift +++ b/Sources/OpenAI/Intramodular/OpenAI.Client-Image.swift @@ -3,6 +3,7 @@ // import CorePersistence +import SwiftUIX import Swallow extension OpenAI.Client { @@ -40,4 +41,11 @@ extension OpenAI.Client { return response } + + public func createImageEdit( + image: _AnyImage, + prompt: String + ) { + + } } From c53ff3dd58208eb5c6d493f88d6d18821caef7fb Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Tue, 3 Dec 2024 12:10:43 -0700 Subject: [PATCH 046/271] image edits --- ...penAI.APISpecification.RequestBodies.swift | 74 ++++++++++++++++++- .../API/OpenAI.APISpecification.swift | 8 ++ .../Intramodular/OpenAI.Client-Image.swift | 13 +++- 3 files changed, 91 insertions(+), 4 deletions(-) diff --git a/Sources/OpenAI/Intramodular/API/OpenAI.APISpecification.RequestBodies.swift b/Sources/OpenAI/Intramodular/API/OpenAI.APISpecification.RequestBodies.swift index bd5e0234..a2f6090d 100644 --- a/Sources/OpenAI/Intramodular/API/OpenAI.APISpecification.RequestBodies.swift +++ b/Sources/OpenAI/Intramodular/API/OpenAI.APISpecification.RequestBodies.swift @@ -645,7 +645,7 @@ extension OpenAI.APISpecification.RequestBodies { } extension OpenAI.APISpecification.RequestBodies { - struct CreateImageEdit: Codable { + struct CreateImageEdit: Codable, HTTPRequest.Multipart.ContentConvertible { enum CodingKeys: String, CodingKey { case image case prompt @@ -685,6 +685,76 @@ extension OpenAI.APISpecification.RequestBodies { self.responseFormat = responseFormat self.user = user } + + func __conversion() -> HTTPRequest.Multipart.Content { + var result = HTTPRequest.Multipart.Content() + + result.append( + .file( + named: "image", + data: image, + filename: "image.png", + contentType: .custom("image/png") + ) + ) + + result.append( + .text( + named: "prompt", + value: prompt + ) + ) + + if let mask = mask { + result.append( + .file( + named: "mask", + data: mask, + filename: "mask.png", + contentType: .custom("image/png") + ) + ) + } + + result.append( + .text( + named: "model", + value: model.rawValue + ) + ) + + result.append( + .text( + named: "n", + value: String(numberOfImages) + ) + ) + + result.append( + .text( + named: "size", + value: size.rawValue + ) + ) + + result.append( + .text( + named: "response_format", + value: responseFormat.rawValue + ) + ) + + if let user = user { + result.append( + .text( + named: "user", + value: user + ) + ) + } + + return result + } } } @@ -861,7 +931,7 @@ extension OpenAI.APISpecification.RequestBodies { /// The seed controls the reproducibility of the job. Passing in the same seed and job parameters should produce the same results, but may differ in rare cases. If a seed is not specified, one will be generated for you. let seed: Int? } - + } extension OpenAI.APISpecification.RequestBodies { diff --git a/Sources/OpenAI/Intramodular/API/OpenAI.APISpecification.swift b/Sources/OpenAI/Intramodular/API/OpenAI.APISpecification.swift index 022f7506..edb65fad 100644 --- a/Sources/OpenAI/Intramodular/API/OpenAI.APISpecification.swift +++ b/Sources/OpenAI/Intramodular/API/OpenAI.APISpecification.swift @@ -203,6 +203,11 @@ extension OpenAI { @Body(json: .input, keyEncodingStrategy: .convertToSnakeCase) var createImage = Endpoint, Void>() + @POST + @Path("/v1/images/edits") + @Body(multipart: .input) + var createImageEdit = Endpoint, Void>() + // Vector Store @Header(["OpenAI-Beta": "assistants=v2"]) @POST @@ -354,6 +359,9 @@ extension OpenAI.APISpecification { context: DecodeOutputContext ) throws -> Output { do { + + print(response) + try response.validate() } catch { let apiError: Error diff --git a/Sources/OpenAI/Intramodular/OpenAI.Client-Image.swift b/Sources/OpenAI/Intramodular/OpenAI.Client-Image.swift index c78d1528..36956fd9 100644 --- a/Sources/OpenAI/Intramodular/OpenAI.Client-Image.swift +++ b/Sources/OpenAI/Intramodular/OpenAI.Client-Image.swift @@ -43,9 +43,18 @@ extension OpenAI.Client { } public func createImageEdit( - image: _AnyImage, + image: Data, prompt: String - ) { + ) async throws -> OpenAI.List { + let requestBody = OpenAI.APISpecification.RequestBodies.CreateImageEdit( + image: image, + prompt: prompt + ) + + let response = try await run(\.createImageEdit, with: requestBody) + print(response) + + return response } } From a040321e14f0a62e60df2cea19a9980c545c109f Mon Sep 17 00:00:00 2001 From: Purav Manot Date: Wed, 11 Dec 2024 00:27:32 +0530 Subject: [PATCH 047/271] Add xAI --- Package.swift | 35 ++++ .../ModelIdentifier.Provider.swift | 5 + ...penAI.APISpecification.RequestBodies.swift | 2 +- .../Perplexity+LLMRequestHandling.swift | 1 - ...exity.APISpecification.RequestBodies.swift | 46 +++++- ...xity.APISpecification.ResponseBodies.swift | 1 + .../Intramodular/XAI+LLMRequestHandling.swift | 119 ++++++++++++++ .../XAI.APISpecification.RequestBodies.swift | 123 ++++++++++++++ .../XAI.APISpecification.ResponseBodies.swift | 10 ++ .../XAI.APISpecification.swift | 151 ++++++++++++++++++ .../xAI/Intramodular/XAI.ChatMessage.swift | 10 ++ Sources/xAI/Intramodular/XAI.Client.swift | 52 ++++++ Sources/xAI/Intramodular/XAI.Model.swift | 54 +++++++ Sources/xAI/Intramodular/XAI.swift | 9 ++ Sources/xAI/module.swift | 6 + .../Intramodular/CompletionTests.swift | 3 +- Tests/XAI/Intramodular/CompletionTests.swift | 34 ++++ 17 files changed, 651 insertions(+), 10 deletions(-) create mode 100644 Sources/xAI/Intramodular/XAI+LLMRequestHandling.swift create mode 100644 Sources/xAI/Intramodular/XAI.APISpecification/XAI.APISpecification.RequestBodies.swift create mode 100644 Sources/xAI/Intramodular/XAI.APISpecification/XAI.APISpecification.ResponseBodies.swift create mode 100644 Sources/xAI/Intramodular/XAI.APISpecification/XAI.APISpecification.swift create mode 100644 Sources/xAI/Intramodular/XAI.ChatMessage.swift create mode 100644 Sources/xAI/Intramodular/XAI.Client.swift create mode 100644 Sources/xAI/Intramodular/XAI.Model.swift create mode 100644 Sources/xAI/Intramodular/XAI.swift create mode 100644 Sources/xAI/module.swift create mode 100644 Tests/XAI/Intramodular/CompletionTests.swift diff --git a/Package.swift b/Package.swift index ade916e7..2eba40c1 100644 --- a/Package.swift +++ b/Package.swift @@ -28,6 +28,7 @@ let package = Package( "Ollama", "OpenAI", "Perplexity", + "XAI", "TogetherAI", "VoyageAI", "AI", @@ -50,6 +51,12 @@ let package = Package( targets: [ "Perplexity" ] + ), + .library( + name: "XAI", + targets: [ + "XAI" + ] ) ], dependencies: [ @@ -235,6 +242,22 @@ let package = Package( .enableExperimentalFeature("AccessLevelOnImport") ] ), + .target( + name: "XAI", + dependencies: [ + "CorePersistence", + "CoreMI", + "LargeLanguageModels", + "OpenAI", + "Merge", + "NetworkKit", + "Swallow" + ], + path: "Sources/XAI", + swiftSettings: [ + .enableExperimentalFeature("AccessLevelOnImport") + ] + ), .target( name: "Jina", dependencies: [ @@ -353,6 +376,7 @@ let package = Package( "Ollama", "OpenAI", "Perplexity", + "XAI", "PlayHT", "Rime", "Swallow", @@ -419,6 +443,17 @@ let package = Package( .enableExperimentalFeature("AccessLevelOnImport") ] ), + .testTarget( + name: "XAITests", + dependencies: [ + "AI", + "Swallow" + ], + path: "Tests/XAI", + swiftSettings: [ + .enableExperimentalFeature("AccessLevelOnImport") + ] + ), .testTarget( name: "PerplexityTests", dependencies: [ diff --git a/Sources/CoreMI/Intramodular/Model Identifier/ModelIdentifier.Provider.swift b/Sources/CoreMI/Intramodular/Model Identifier/ModelIdentifier.Provider.swift index 1d3b94ce..516b52cb 100644 --- a/Sources/CoreMI/Intramodular/Model Identifier/ModelIdentifier.Provider.swift +++ b/Sources/CoreMI/Intramodular/Model Identifier/ModelIdentifier.Provider.swift @@ -28,6 +28,7 @@ extension ModelIdentifier { case _Rime case _HumeAI case _NeetsAI + case _xAI case unknown(String) @@ -138,6 +139,8 @@ extension ModelIdentifier.Provider: CustomStringConvertible { return "HumeAI" case ._NeetsAI: return "NeetsAI" + case ._xAI: + return "xAI" case .unknown(let provider): return provider } @@ -183,6 +186,8 @@ extension ModelIdentifier.Provider: RawRepresentable { return "humeAI" case ._NeetsAI: return "neetsAI" + case ._xAI: + return "xAI" case .unknown(let provider): return provider } diff --git a/Sources/OpenAI/Intramodular/API Specification/OpenAI.APISpecification.RequestBodies.swift b/Sources/OpenAI/Intramodular/API Specification/OpenAI.APISpecification.RequestBodies.swift index f0e988bf..fbfa56ee 100644 --- a/Sources/OpenAI/Intramodular/API Specification/OpenAI.APISpecification.RequestBodies.swift +++ b/Sources/OpenAI/Intramodular/API Specification/OpenAI.APISpecification.RequestBodies.swift @@ -12,7 +12,7 @@ extension OpenAI.APISpecification { } extension OpenAI.APISpecification.RequestBodies { - struct CreateCompletion: Codable, Hashable { + public struct CreateCompletion: Codable, Hashable { let prompt: Either let model: OpenAI.Model let suffix: String? diff --git a/Sources/Perplexity/Intramodular/Perplexity+LLMRequestHandling.swift b/Sources/Perplexity/Intramodular/Perplexity+LLMRequestHandling.swift index 7ecf63ba..2aa90bfd 100644 --- a/Sources/Perplexity/Intramodular/Perplexity+LLMRequestHandling.swift +++ b/Sources/Perplexity/Intramodular/Perplexity+LLMRequestHandling.swift @@ -70,7 +70,6 @@ extension Perplexity.Client: LLMRequestHandling { topP: parameters.temperatureOrTopP?.topProbabilityMass, topK: nil, maxTokens: parameters.tokenLimit?.fixedValue, - returnCitations: nil, returnImages: nil, stream: false, presencePenalty: nil, diff --git a/Sources/Perplexity/Intramodular/Perplexity.APISpecification/Perplexity.APISpecification.RequestBodies.swift b/Sources/Perplexity/Intramodular/Perplexity.APISpecification/Perplexity.APISpecification.RequestBodies.swift index e8104870..3581aabd 100644 --- a/Sources/Perplexity/Intramodular/Perplexity.APISpecification/Perplexity.APISpecification.RequestBodies.swift +++ b/Sources/Perplexity/Intramodular/Perplexity.APISpecification/Perplexity.APISpecification.RequestBodies.swift @@ -1,7 +1,3 @@ -// -// Copyright (c) Vatsal Manot -// - import Foundation extension Perplexity.APISpecification.RequestBodies { @@ -25,12 +21,18 @@ extension Perplexity.APISpecification.RequestBodies { /// The maximum number of completion tokens returned by the API. The total number of tokens requested in max_tokens plus the number of prompt tokens sent in messages must not exceed the context window token limit of model requested. If left unspecified, then the model will generate tokens until either it reaches its stop token or the end of its context window. public var maxTokens: Int? - /// Determines whether or not a request to an online model should return citations. Citations are in closed beta access. To gain access, apply at https://perplexity.typeform.com/to/j50rnNiB - public var returnCitations: Bool? + /// Given a list of domains, limit the citations used by the online model to URLs from the specified domains. Currently limited to only 3 domains for whitelisting and blacklisting. + public var searchDomainFilter: [String]? - /// Determines whether or not a request to an online model should return images. Images are in closed beta access. To gain access, apply at https://perplexity.typeform.com/to/j50rnNiB + /// Determines whether or not a request to an online model should return images. Images are in closed beta. public var returnImages: Bool? + /// Determines whether or not a request to an online model should return related questions. Related questions are in closed beta. + public var returnRelatedQuestions: Bool? + + /// Returns search results within the specified time interval - does not apply to images. Values include `month`, `week`, `day`, `hour`. + public var searchRecencyFilter: String? + /// Determines whether or not to incrementally stream the response with server-sent events with content-type: text/event-stream. public var stream: Bool? @@ -39,5 +41,35 @@ extension Perplexity.APISpecification.RequestBodies { /// A multiplicative penalty greater than 0. Values greater than 1.0 penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim. A value of 1.0 means no penalty. Incompatible with presence_penalty. public var frequencyPenalty: Double? + + public init( + model: Perplexity.Model, + messages: [Perplexity.ChatMessage], + temperature: Double? = nil, + topP: Double? = nil, + topK: Int? = nil, + maxTokens: Int? = nil, + searchDomainFilter: [String]? = nil, + returnImages: Bool? = nil, + returnRelatedQuestions: Bool? = nil, + searchRecencyFilter: String? = nil, + stream: Bool? = nil, + presencePenalty: Double? = nil, + frequencyPenalty: Double? = nil + ) { + self.model = model + self.messages = messages + self.temperature = temperature + self.topP = topP + self.topK = topK + self.maxTokens = maxTokens + self.searchDomainFilter = searchDomainFilter + self.returnImages = returnImages + self.returnRelatedQuestions = returnRelatedQuestions + self.searchRecencyFilter = searchRecencyFilter + self.stream = stream + self.presencePenalty = presencePenalty + self.frequencyPenalty = frequencyPenalty + } } } diff --git a/Sources/Perplexity/Intramodular/Perplexity.APISpecification/Perplexity.APISpecification.ResponseBodies.swift b/Sources/Perplexity/Intramodular/Perplexity.APISpecification/Perplexity.APISpecification.ResponseBodies.swift index c96e4581..566d3145 100644 --- a/Sources/Perplexity/Intramodular/Perplexity.APISpecification/Perplexity.APISpecification.ResponseBodies.swift +++ b/Sources/Perplexity/Intramodular/Perplexity.APISpecification/Perplexity.APISpecification.ResponseBodies.swift @@ -36,6 +36,7 @@ extension Perplexity.APISpecification.ResponseBodies { public var object: String public var created: Date public var model: Perplexity.Model + public var citations: [String] public var choices: [Choice] public let usage: Usage } diff --git a/Sources/xAI/Intramodular/XAI+LLMRequestHandling.swift b/Sources/xAI/Intramodular/XAI+LLMRequestHandling.swift new file mode 100644 index 00000000..ba297618 --- /dev/null +++ b/Sources/xAI/Intramodular/XAI+LLMRequestHandling.swift @@ -0,0 +1,119 @@ +// +// Copyright (c) Vatsal Manot +// + +import CorePersistence +import LargeLanguageModels +import NetworkKit +import OpenAI +import Swallow + +extension XAI.Client: _TaskDependenciesExporting { + public var _exportedTaskDependencies: TaskDependencies { + var result = TaskDependencies() + + result[\.llm] = self + + return result + } +} + +extension XAI.Client: LLMRequestHandling { + public var _availableModels: [ModelIdentifier]? { + XAI.Model.allCases.map({ $0.__conversion() }) + } + + public func complete( + prompt: Prompt, + parameters: Prompt.CompletionParameters + ) async throws -> Prompt.Completion { + let _completion: Any + + switch prompt { + case let prompt as AbstractLLM.TextPrompt: + _completion = try await _complete( + prompt: prompt, + parameters: try cast(parameters) + ) + + case let prompt as AbstractLLM.ChatPrompt: + _completion = try await _complete( + prompt: prompt, + parameters: try cast(parameters) + ) + default: + throw LLMRequestHandlingError.unsupportedPromptType(Prompt.self) + } + + return try cast(_completion) + } + + private func _complete( + prompt: AbstractLLM.TextPrompt, + parameters: AbstractLLM.TextCompletionParameters + ) async throws -> AbstractLLM.TextCompletion { + throw LLMRequestHandlingError.unsupportedPromptType(.init(Swift.type(of: prompt))) + } + + private func _complete( + prompt: AbstractLLM.ChatPrompt, + parameters: AbstractLLM.ChatCompletionParameters + ) async throws -> AbstractLLM.ChatCompletion { + let response: XAI.APISpecification.ResponseBodies.ChatCompletion = try await run( + \.chatCompletions, + with: .init( + messages: try await prompt.messages.asyncMap { + try await XAI.ChatMessage(from: $0) + }, + model: _model(for: prompt, parameters: parameters), + maxTokens: parameters.tokenLimit?.fixedValue, + temperature: parameters.temperatureOrTopP?.temperature + ) + ) + + assert(response.choices.count == 1) + + let message = try AbstractLLM.ChatMessage(from: response.choices[0]) + + return AbstractLLM.ChatCompletion( + prompt: prompt.messages, + message: message, + stopReason: .init() // FIXME: !!! + ) + } + + private func _model( + for prompt: AbstractLLM.ChatPrompt, + parameters: AbstractLLM.ChatCompletionParameters? + ) throws -> XAI.Model { + try prompt.context.get(\.modelIdentifier)?.as(XAI.Model.self) ?? XAI.Model.grokBeta + } +} + +// MARK: - Auxiliary + +extension AbstractLLM.ChatMessage { + public init( + from completion: XAI.APISpecification.ResponseBodies.ChatCompletion.Choice + ) throws { + try self.init(from: completion.message) + } +} + +extension XAI.ChatMessage.Role { + public init( + from role: AbstractLLM.ChatRole + ) throws { + switch role { + case .system: + self = .system + case .user: + self = .user + case .assistant: + self = .assistant + case .other: + throw Never.Reason.unsupported + } + } +} + diff --git a/Sources/xAI/Intramodular/XAI.APISpecification/XAI.APISpecification.RequestBodies.swift b/Sources/xAI/Intramodular/XAI.APISpecification/XAI.APISpecification.RequestBodies.swift new file mode 100644 index 00000000..d98a79f0 --- /dev/null +++ b/Sources/xAI/Intramodular/XAI.APISpecification/XAI.APISpecification.RequestBodies.swift @@ -0,0 +1,123 @@ +import Foundation +import OpenAI + +extension XAI.APISpecification.RequestBodies { + public struct CreateChatCompletion: Codable, Hashable { + private enum CodingKeys: String, CodingKey { + case user + case messages + case functions = "functions" + case functionCallingStrategy = "function_call" + case model + case temperature + case topProbabilityMass = "top_p" + case choices = "n" + case stream + case stop + case maxTokens = "max_tokens" + case presencePenalty = "presence_penalty" + case frequencyPenalty = "frequency_penalty" + case logprobs = "logprobs" + case topLogprobs = "top_logprobs" + case logitBias = "logit_bias" + case responseFormat = "response_format" + case seed = "seed" + } + + let messages: [OpenAI.ChatMessage] + let model: XAI.Model + let frequencyPenalty: Double? + let logitBias: [String: Int]? + let logprobs: Bool? + let topLogprobs: Int? + let maxTokens: Int? + let choices: Int? + let presencePenalty: Double? + let responseFormat: OpenAI.ChatCompletion.ResponseFormat? + let seed: String? + let stop: [String]? + let stream: Bool? + let temperature: Double? + let topProbabilityMass: Double? + let user: String? + let functions: [OpenAI.ChatFunctionDefinition]? + let functionCallingStrategy: OpenAI.FunctionCallingStrategy? + + public init( + messages: [OpenAI.ChatMessage], + model: XAI.Model, + frequencyPenalty: Double? = nil, + logitBias: [String : Int]? = nil, + logprobs: Bool? = nil, + topLogprobs: Int? = nil, + maxTokens: Int? = nil, + choices: Int? = nil, + presencePenalty: Double? = nil, + responseFormat: OpenAI.ChatCompletion.ResponseFormat? = nil, + seed: String? = nil, + stop: [String]? = nil, + stream: Bool? = nil, + temperature: Double? = nil, + topProbabilityMass: Double? = nil, + user: String? = nil, + functions: [OpenAI.ChatFunctionDefinition]? = nil, + functionCallingStrategy: OpenAI.FunctionCallingStrategy? = nil + ) { + self.messages = messages + self.model = model + self.frequencyPenalty = frequencyPenalty + self.logitBias = logitBias + self.logprobs = logprobs + self.topLogprobs = topLogprobs + self.maxTokens = maxTokens + self.choices = choices + self.presencePenalty = presencePenalty + self.responseFormat = responseFormat + self.seed = seed + self.stop = stop + self.stream = stream + self.temperature = temperature + self.topProbabilityMass = topProbabilityMass + self.user = user + self.functions = functions + self.functionCallingStrategy = functionCallingStrategy + } + + public init( + user: String?, + messages: [OpenAI.ChatMessage], + functions: [OpenAI.ChatFunctionDefinition]?, + functionCallingStrategy: OpenAI.FunctionCallingStrategy?, + model: XAI.Model, + temperature: Double?, + topProbabilityMass: Double?, + choices: Int?, + stream: Bool?, + stop: [String]?, + maxTokens: Int?, + presencePenalty: Double?, + frequencyPenalty: Double?, + responseFormat: OpenAI.ChatCompletion.ResponseFormat? + ) { + self.user = user + self.messages = messages + self.functions = functions.nilIfEmpty() + self.functionCallingStrategy = functions == nil ? nil : functionCallingStrategy + self.model = model + self.temperature = temperature + self.topProbabilityMass = topProbabilityMass + self.choices = choices + self.stream = stream + self.stop = stop + self.maxTokens = maxTokens + self.presencePenalty = presencePenalty + self.frequencyPenalty = frequencyPenalty + self.logitBias = nil + self.logprobs = nil + self.topLogprobs = nil + self.responseFormat = responseFormat + self.seed = nil + } + } +} + diff --git a/Sources/xAI/Intramodular/XAI.APISpecification/XAI.APISpecification.ResponseBodies.swift b/Sources/xAI/Intramodular/XAI.APISpecification/XAI.APISpecification.ResponseBodies.swift new file mode 100644 index 00000000..2e74dbe9 --- /dev/null +++ b/Sources/xAI/Intramodular/XAI.APISpecification/XAI.APISpecification.ResponseBodies.swift @@ -0,0 +1,10 @@ +// +// Copyright (c) Vatsal Manot +// + +import Foundation +import OpenAI + +extension XAI.APISpecification.ResponseBodies { + public typealias ChatCompletion = OpenAI.ChatCompletion +} diff --git a/Sources/xAI/Intramodular/XAI.APISpecification/XAI.APISpecification.swift b/Sources/xAI/Intramodular/XAI.APISpecification/XAI.APISpecification.swift new file mode 100644 index 00000000..054c5eda --- /dev/null +++ b/Sources/xAI/Intramodular/XAI.APISpecification/XAI.APISpecification.swift @@ -0,0 +1,151 @@ +// +// Copyright (c) Vatsal Manot +// + +import CorePersistence +import FoundationX +import OpenAI +import NetworkKit +import Swallow + +extension XAI { + public enum APIError: APIErrorProtocol { + public typealias API = XAI.APISpecification + + case apiKeyMissing + case incorrectAPIKeyProvided + case rateLimitExceeded + case badRequest(request: API.Request?, error: API.Request.Error) + case runtime(AnyError) + + public var traits: ErrorTraits { + [.domain(.networking)] + } + } + + public struct APISpecification: RESTAPISpecification { + public typealias Error = APIError + + public struct Configuration: Codable, Hashable { + public var apiKey: String? + } + + public let configuration: Configuration + + public var host: URL { + URL(string: "https://api.x.ai/")! + } + + public var id: some Hashable { + configuration + } + + @POST + @Path("v1/chat/completions") + public var chatCompletions = Endpoint() + } +} + +extension XAI.APISpecification { + public final class Endpoint: BaseHTTPEndpoint { + override public func buildRequestBase( + from input: Input, + context: BuildRequestContext + ) throws -> Request { + let configuration = context.root.configuration + + return try super + .buildRequestBase(from: input, context: context) + .jsonBody(input, keyEncodingStrategy: .convertToSnakeCase) + .header(.contentType(.json)) + .header(.accept(.json)) + .header(.authorization(.bearer, configuration.apiKey.unwrap())) + } + + struct _ErrorWrapper: Codable, Hashable, Sendable { + let detail: [ErrorDetail] + + struct ErrorDetail: Codable, Hashable, Sendable { + let loc: [ErrorLocation] + let msg: String + let type: String + + enum ErrorLocation: Codable, Hashable, Sendable { + case string(String) + case integer(Int) + + init(from decoder: Decoder) throws { + let container = try decoder.singleValueContainer() + if let stringValue = try? container.decode(String.self) { + self = .string(stringValue) + } else if let intValue = try? container.decode(Int.self) { + self = .integer(intValue) + } else { + throw DecodingError.dataCorruptedError(in: container, debugDescription: "Cannot decode ErrorLocation") + } + } + + func encode(to encoder: Encoder) throws { + var container = encoder.singleValueContainer() + switch self { + case .string(let value): + try container.encode(value) + case .integer(let value): + try container.encode(value) + } + } + } + } + } + + override public func decodeOutputBase( + from response: Request.Response, + context: DecodeOutputContext + ) throws -> Output { + do { + try response.validate() + } catch { + let apiError: Error + + if let error = error as? Request.Error { + if let errorWrapper = try? response.decode( + _ErrorWrapper.self, + keyDecodingStrategy: .convertFromSnakeCase + ) { + let errorMsg = errorWrapper.detail.first?.msg ?? "" + if errorMsg.contains("You didn't provide an API key") { + throw Error.apiKeyMissing + } else if errorMsg.contains("Incorrect API key provided") { + throw Error.incorrectAPIKeyProvided + } + } + + if response.statusCode.rawValue == 429 { + apiError = .rateLimitExceeded + } else { + apiError = .badRequest(error) + } + } else { + apiError = .runtime(error) + } + + throw apiError + } + + return try response.decode( + Output.self, + keyDecodingStrategy: .convertFromSnakeCase + ) + } + } +} + +extension XAI.APISpecification { + public enum RequestBodies: _StaticSwift.Namespace { + + } + + public enum ResponseBodies: _StaticSwift.Namespace { + + } +} diff --git a/Sources/xAI/Intramodular/XAI.ChatMessage.swift b/Sources/xAI/Intramodular/XAI.ChatMessage.swift new file mode 100644 index 00000000..aab90fbc --- /dev/null +++ b/Sources/xAI/Intramodular/XAI.ChatMessage.swift @@ -0,0 +1,10 @@ +// +// Copyright (c) Vatsal Manot +// + +import Foundation +import OpenAI + +extension XAI { + public typealias ChatMessage = OpenAI.ChatMessage +} diff --git a/Sources/xAI/Intramodular/XAI.Client.swift b/Sources/xAI/Intramodular/XAI.Client.swift new file mode 100644 index 00000000..b7dcb5bb --- /dev/null +++ b/Sources/xAI/Intramodular/XAI.Client.swift @@ -0,0 +1,52 @@ +// +// Copyright (c) Vatsal Manot +// + +import CorePersistence +import LargeLanguageModels +import Merge +import NetworkKit +import Swallow + +extension XAI { + @RuntimeDiscoverable + public final class Client: HTTPClient, _StaticSwift.Namespace { + public static var persistentTypeRepresentation: some IdentityRepresentation { + CoreMI._ServiceVendorIdentifier._xAI + } + + public let interface: APISpecification + public let session: HTTPSession + + public init(interface: APISpecification, session: HTTPSession) { + self.interface = interface + self.session = session + } + + public convenience init(apiKey: String?) { + self.init( + interface: .init(configuration: .init(apiKey: apiKey)), + session: .shared + ) + } + } +} + +extension XAI.Client: CoreMI._ServiceClientProtocol { + public convenience init( + account: (any CoreMI._ServiceAccountProtocol)? + ) async throws { + let account: any CoreMI._ServiceAccountProtocol = try account.unwrap() + let serviceVendorIdentifier: CoreMI._ServiceVendorIdentifier = try account.serviceVendorIdentifier.unwrap() + + guard serviceVendorIdentifier == CoreMI._ServiceVendorIdentifier._xAI else { + throw CoreMI._ServiceClientError.incompatibleVendor(serviceVendorIdentifier) + } + + guard let credential = try account.credential as? CoreMI._ServiceCredentialTypes.APIKeyCredential else { + throw CoreMI._ServiceClientError.invalidCredential(try account.credential) + } + + self.init(apiKey: credential.apiKey) + } +} diff --git a/Sources/xAI/Intramodular/XAI.Model.swift b/Sources/xAI/Intramodular/XAI.Model.swift new file mode 100644 index 00000000..152056b7 --- /dev/null +++ b/Sources/xAI/Intramodular/XAI.Model.swift @@ -0,0 +1,54 @@ +// +// Copyright (c) Vatsal Manot +// + +import CoreMI +import CorePersistence +import LargeLanguageModels +import Swallow + +extension XAI { + public enum Model: String, CaseIterable, Codable, Hashable, Named, Sendable { + case grokBeta = "grok-beta" + case grokVisionBeta = "grok-vision-beta" + + public var name: String { + switch self { + case .grokBeta: + return "Grok Beta" + case .grokVisionBeta: + return "Grok Vision Beta" + } + } + } +} + +// MARK: - Conformances + +extension XAI.Model: CustomStringConvertible { + public var description: String { + rawValue + } +} + +extension XAI.Model: ModelIdentifierRepresentable { + public init(from identifier: ModelIdentifier) throws { + guard identifier.provider == ._xAI, identifier.revision == nil else { + throw Never.Reason.illegal + } + + guard let model = Self(rawValue: identifier.name) else { + throw Never.Reason.unexpected + } + + self = model + } + + public func __conversion() -> ModelIdentifier { + ModelIdentifier( + provider: ._xAI, + name: rawValue, + revision: nil + ) + } +} diff --git a/Sources/xAI/Intramodular/XAI.swift b/Sources/xAI/Intramodular/XAI.swift new file mode 100644 index 00000000..66cdda47 --- /dev/null +++ b/Sources/xAI/Intramodular/XAI.swift @@ -0,0 +1,9 @@ +// +// Copyright (c) Vatsal Manot +// + +import Swift + +public enum XAI { + +} diff --git a/Sources/xAI/module.swift b/Sources/xAI/module.swift new file mode 100644 index 00000000..877659d4 --- /dev/null +++ b/Sources/xAI/module.swift @@ -0,0 +1,6 @@ +// +// Copyright (c) Vatsal Manot +// + +@_exported import LargeLanguageModels +import Swift diff --git a/Tests/Perplexity/Intramodular/CompletionTests.swift b/Tests/Perplexity/Intramodular/CompletionTests.swift index 2f07169b..1decb677 100644 --- a/Tests/Perplexity/Intramodular/CompletionTests.swift +++ b/Tests/Perplexity/Intramodular/CompletionTests.swift @@ -55,8 +55,9 @@ final class CompletionTests: XCTestCase { AbstractLLM.ChatMessage( role: .user, body: "Sup?" - ) + ), ] + AbstractLLM.ChatCompletionStream let result: String = try await llm.complete( messages, diff --git a/Tests/XAI/Intramodular/CompletionTests.swift b/Tests/XAI/Intramodular/CompletionTests.swift new file mode 100644 index 00000000..96bb02cf --- /dev/null +++ b/Tests/XAI/Intramodular/CompletionTests.swift @@ -0,0 +1,34 @@ +// +// Copyright (c) Vatsal Manot +// + +import LargeLanguageModels +import XAI +import XCTest + +final class CompletionTests: XCTestCase { + let llm: any LLMRequestHandling = client + + func testChatCompletions() async throws { + let llm: any LLMRequestHandling = client + + let messages: [AbstractLLM.ChatMessage] = [ + AbstractLLM.ChatMessage( + role: .system, + body: "You are an extremely intelligent assistant." + ), + AbstractLLM.ChatMessage( + role: .user, + body: "Sup?" + ) + ] + + let result: String = try await llm.complete( + messages, + model: XAI.Model.grokBeta, + as: .string + ) + + print(result) // "Hello! How can I assist you today?" + } +} From ecf11cb0bd581684cb36edf45e3f90d6d9e6da36 Mon Sep 17 00:00:00 2001 From: Purav Manot Date: Wed, 11 Dec 2024 01:23:57 +0530 Subject: [PATCH 048/271] Update package --- ...enAI.APISpecification.ResponseBodies.swift | 2 +- .../Intramodular/XAI+LLMRequestHandling.swift | 284 ++++++++++++++++-- .../XAI.APISpecification.ResponseBodies.swift | 2 +- .../XAI.APISpecification.swift | 8 +- .../xAI/Intramodular/XAI.ChatCompletion.swift | 238 +++++++++++++++ .../XAI.Client.ChatCompletionParameters.swift | 15 + Tests/XAI/module.swift | 14 + 7 files changed, 541 insertions(+), 22 deletions(-) create mode 100644 Sources/xAI/Intramodular/XAI.ChatCompletion.swift create mode 100644 Sources/xAI/Intramodular/XAI.Client.ChatCompletionParameters.swift create mode 100644 Tests/XAI/module.swift diff --git a/Sources/OpenAI/Intramodular/API Specification/OpenAI.APISpecification.ResponseBodies.swift b/Sources/OpenAI/Intramodular/API Specification/OpenAI.APISpecification.ResponseBodies.swift index 640f4114..5ef07087 100644 --- a/Sources/OpenAI/Intramodular/API Specification/OpenAI.APISpecification.ResponseBodies.swift +++ b/Sources/OpenAI/Intramodular/API Specification/OpenAI.APISpecification.ResponseBodies.swift @@ -42,7 +42,7 @@ extension OpenAI.APISpecification.ResponseBodies { } } - struct CreateChatCompletion: Codable, Hashable, Sendable { + public struct CreateChatCompletion: Codable, Hashable, Sendable { public let message: OpenAI.ChatMessage } diff --git a/Sources/xAI/Intramodular/XAI+LLMRequestHandling.swift b/Sources/xAI/Intramodular/XAI+LLMRequestHandling.swift index ba297618..40a72feb 100644 --- a/Sources/xAI/Intramodular/XAI+LLMRequestHandling.swift +++ b/Sources/xAI/Intramodular/XAI+LLMRequestHandling.swift @@ -59,27 +59,37 @@ extension XAI.Client: LLMRequestHandling { prompt: AbstractLLM.ChatPrompt, parameters: AbstractLLM.ChatCompletionParameters ) async throws -> AbstractLLM.ChatCompletion { - let response: XAI.APISpecification.ResponseBodies.ChatCompletion = try await run( - \.chatCompletions, - with: .init( - messages: try await prompt.messages.asyncMap { - try await XAI.ChatMessage(from: $0) - }, - model: _model(for: prompt, parameters: parameters), - maxTokens: parameters.tokenLimit?.fixedValue, - temperature: parameters.temperatureOrTopP?.temperature - ) - ) + let model: XAI.Model = try self._model(for: prompt, parameters: parameters) + let parameters = try cast(parameters, to: AbstractLLM.ChatCompletionParameters.self) + let maxTokens: Int? - assert(response.choices.count == 1) + do { + switch (parameters.tokenLimit) { + case .fixed(let count): + maxTokens = count + case .max, .none: + maxTokens = nil + } + } - let message = try AbstractLLM.ChatMessage(from: response.choices[0]) + let completion: OpenAI.ChatCompletion = try await self.createChatCompletion( + messages: prompt.messages.asyncMap({ try await OpenAI.ChatMessage(from: $0) }), + model: model, + parameters: .init( + from: parameters, + model: model, + messages: prompt.messages, + maxTokens: maxTokens + ) + ) + + let message = try completion.choices.toCollectionOfOne().first.message return AbstractLLM.ChatCompletion( prompt: prompt.messages, - message: message, - stopReason: .init() // FIXME: !!! + message: try .init(from: message) ) + } private func _model( @@ -92,14 +102,43 @@ extension XAI.Client: LLMRequestHandling { // MARK: - Auxiliary -extension AbstractLLM.ChatMessage { +extension XAI.Client { + public func createChatCompletion( + messages: [XAI.ChatMessage], + model: XAI.Model, + parameters: XAI.Client.ChatCompletionParameters + ) async throws -> OpenAI.ChatCompletion { + let requestBody = XAI.APISpecification.RequestBodies.CreateChatCompletion( + messages: messages, + model: model, + parameters: parameters, + stream: false + ) + + return try await run(\.createChatCompletions, with: requestBody) + } +} + +extension XAI.Client.ChatCompletionParameters { public init( - from completion: XAI.APISpecification.ResponseBodies.ChatCompletion.Choice + from parameters: AbstractLLM.ChatCompletionParameters, + model: XAI.Model, + messages _: [AbstractLLM.ChatMessage], + maxTokens: Int? = nil ) throws { - try self.init(from: completion.message) + self.init( + temperature: parameters.temperatureOrTopP?.temperature, + topProbabilityMass: parameters.temperatureOrTopP?.topProbabilityMass, + stop: parameters.stops, + maxTokens: maxTokens, + functions: parameters.functions?.map { + OpenAI.ChatFunctionDefinition(from: $0) + } + ) } } + extension XAI.ChatMessage.Role { public init( from role: AbstractLLM.ChatRole @@ -117,3 +156,212 @@ extension XAI.ChatMessage.Role { } } +extension XAI.APISpecification.RequestBodies.CreateChatCompletion { + public init( + messages: [XAI.ChatMessage], + model: XAI.Model, + parameters: XAI.Client.ChatCompletionParameters, + user: String? = nil, + stream: Bool + ) { + self.init( + user: user, + messages: messages, + functions: parameters.functions, + functionCallingStrategy: parameters.functionCallingStrategy, + model: model, + temperature: parameters.temperature, + topProbabilityMass: parameters.topProbabilityMass, + choices: parameters.choices, + stream: stream, + stop: parameters.stop, + maxTokens: parameters.maxTokens, + presencePenalty: parameters.presencePenalty, + frequencyPenalty: parameters.frequencyPenalty, + responseFormat: parameters.responseFormat + ) + } +} + +/* + extension OpenAI.Client: LLMRequestHandling { + private var _debugPrintCompletions: Bool { + false + } + + public var _availableModels: [ModelIdentifier]? { + if let __cached_models { + do { + return try __cached_models.map({ try $0.__conversion() }) + } catch { + runtimeIssue(error) + } + } + + return OpenAI.Model.allCases.map({ $0.__conversion() }) + } + + public func complete( + prompt: Prompt, + parameters: Prompt.CompletionParameters + ) async throws -> Prompt.Completion { + let _completion: Any + + switch prompt { + case let prompt as AbstractLLM.TextPrompt: + _completion = try await _complete( + prompt: prompt, + parameters: try cast(parameters) + ) + + case let prompt as AbstractLLM.ChatPrompt: + _completion = try await _complete( + prompt: prompt, + parameters: try cast(parameters) + ) + default: + throw LLMRequestHandlingError.unsupportedPromptType(Prompt.self) + } + + return try cast(_completion) + } + + private func _complete( + prompt: AbstractLLM.TextPrompt, + parameters: AbstractLLM.TextCompletionParameters + ) async throws -> AbstractLLM.TextCompletion { + let parameters = try cast(parameters, to: AbstractLLM.TextCompletionParameters.self) + + let model = OpenAI.Model.instructGPT(.davinci) + + let promptText = try prompt.prefix.promptLiteral + let completion = try await self.createCompletion( + model: model, + prompt: promptText._stripToText(), + parameters: .init( + from: parameters, + model: model, + prompt: prompt.prefix + ) + ) + + let text = try completion.choices.toCollectionOfOne().first.text + + _debugPrint( + prompt: prompt.debugDescription + .delimited(by: .quotationMark) + .delimited(by: "\n") + , + completion: text + .delimited(by: .quotationMark) + .delimited(by: "\n") + ) + + + return .init(prefix: promptText, text: text) + } + + private func _complete( + prompt: AbstractLLM.ChatPrompt, + parameters: AbstractLLM.ChatCompletionParameters + ) async throws -> AbstractLLM.ChatCompletion { + let model = try self._model(for: prompt, parameters: parameters) + let parameters = try cast(parameters, to: AbstractLLM.ChatCompletionParameters.self) + let maxTokens: Int? + + do { + switch (parameters.tokenLimit) { + case .fixed(let count): + maxTokens = count + case .max, .none: + /*let tokenizer = try await tokenizer(for: model) + let tokens = try tokenizer.encode(prompt._rawContent) + let contextSize = try model.contextSize + + maxTokens = contextSize - tokens.count*/ + maxTokens = nil + } + } + + let completion = try await self.createChatCompletion( + messages: prompt.messages.asyncMap({ try await OpenAI.ChatMessage(from: $0) }), + model: model, + parameters: .init( + from: parameters, + model: model, + messages: prompt.messages, + maxTokens: maxTokens + ) + ) + + let message = try completion.choices.toCollectionOfOne().first.message + + _debugPrint( + prompt: prompt.debugDescription, + completion: message.body + .description + .delimited(by: .quotationMark) + .delimited(by: "\n") + ) + + return AbstractLLM.ChatCompletion( + prompt: prompt.messages, + message: try .init(from: message) + ) + } + + private func _validateParameters( + parameters: AbstractLLM.ChatCompletionParameters, + model: OpenAI.Model + ) { + if let temperature = parameters.temperatureOrTopP?.temperature { + if temperature > 1.2 { + runtimeIssue("OpenAI's API doesn't seem to support a temperature higher than 1.2, but it is available on their playground at https://platform.openai.com/playground/chat?models=gpt-4o") + } + } + } + + public func completion( + for prompt: AbstractLLM.ChatPrompt + ) throws -> AbstractLLM.ChatCompletionStream { + AbstractLLM.ChatCompletionStream { + try await self._completion(for: prompt) + } + } + + private func _completion( + for prompt: AbstractLLM.ChatPrompt + ) async throws -> AnyPublisher { + var session: OpenAI.ChatCompletionSession! = OpenAI.ChatCompletionSession(client: self) + + let messages: [OpenAI.ChatMessage] = try await prompt.messages.asyncMap { + try await OpenAI.ChatMessage(from: $0) + } + let model: OpenAI.Model = try self._model(for: prompt, parameters: nil) + let parameters: OpenAI.Client.ChatCompletionParameters = try await self._chatCompletionParameters( + from: prompt.context.completionParameters, + for: prompt + ) + + return try await session + .complete( + messages: messages, + model: model, + parameters: parameters + ) + .tryMap { (message: OpenAI.ChatMessage) -> AbstractLLM.ChatCompletionStream.Event in + AbstractLLM.ChatCompletionStream.Event.completion( + AbstractLLM.ChatCompletion.Partial( + message: .init(whole: try AbstractLLM.ChatMessage(from: message)), + stopReason: nil + ) + ) + } + .handleCancelOrCompletion { _ in + session = nil + } + .eraseToAnyPublisher() + } + } + + */ diff --git a/Sources/xAI/Intramodular/XAI.APISpecification/XAI.APISpecification.ResponseBodies.swift b/Sources/xAI/Intramodular/XAI.APISpecification/XAI.APISpecification.ResponseBodies.swift index 2e74dbe9..190cc950 100644 --- a/Sources/xAI/Intramodular/XAI.APISpecification/XAI.APISpecification.ResponseBodies.swift +++ b/Sources/xAI/Intramodular/XAI.APISpecification/XAI.APISpecification.ResponseBodies.swift @@ -6,5 +6,5 @@ import Foundation import OpenAI extension XAI.APISpecification.ResponseBodies { - public typealias ChatCompletion = OpenAI.ChatCompletion + } diff --git a/Sources/xAI/Intramodular/XAI.APISpecification/XAI.APISpecification.swift b/Sources/xAI/Intramodular/XAI.APISpecification/XAI.APISpecification.swift index 054c5eda..0d3953d0 100644 --- a/Sources/xAI/Intramodular/XAI.APISpecification/XAI.APISpecification.swift +++ b/Sources/xAI/Intramodular/XAI.APISpecification/XAI.APISpecification.swift @@ -41,8 +41,12 @@ extension XAI { } @POST - @Path("v1/chat/completions") - public var chatCompletions = Endpoint() + @Path("/v1/chat/completions") + @Body(json: .input, keyEncodingStrategy: .convertToSnakeCase) + var createChatCompletions = Endpoint() + + + } } diff --git a/Sources/xAI/Intramodular/XAI.ChatCompletion.swift b/Sources/xAI/Intramodular/XAI.ChatCompletion.swift new file mode 100644 index 00000000..340deb4b --- /dev/null +++ b/Sources/xAI/Intramodular/XAI.ChatCompletion.swift @@ -0,0 +1,238 @@ +// +// File.swift +// AI +// +// Created by Purav Manot on 11/12/24. +// + +import Foundation +import OpenAI + +extension XAI { + public final class ChatCompletion: XAI.Object { + private enum CodingKeys: String, CodingKey { + case id + case model + case createdAt = "created" + case choices + case usage + } + + public struct Choice: Codable, Hashable, Sendable { + public enum FinishReason: String, Codable, Hashable, Sendable { + case length = "length" + case stop = "stop" + case functionCall = "function_call" + } + + public let message: ChatMessage + public let index: Int + public let finishReason: FinishReason? + } + + public let id: String + public let model: XAI.Model + public let createdAt: Date + public let choices: [Choice] + public let usage: Usage + + public required init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + + self.id = try container.decode(forKey: .id) + self.model = try container.decode(forKey: .model) + self.createdAt = try container.decode(forKey: .createdAt) + self.choices = try container.decode(forKey: .choices) + self.usage = try container.decode(forKey: .usage) + + try super.init(from: decoder) + } + + public override func encode(to encoder: Encoder) throws { + try super.encode(to: encoder) + + var container = encoder.container(keyedBy: CodingKeys.self) + + try container.encode(id, forKey: .id) + try container.encode(model, forKey: .model) + try container.encode(createdAt, forKey: .createdAt) + try container.encode(choices, forKey: .choices) + try container.encode(usage, forKey: .usage) + } + } + + public final class ChatCompletionChunk: XAI.Object { + private enum CodingKeys: String, CodingKey { + case id + case model + case createdAt = "created" + case choices + } + + public struct Choice: Codable, Hashable, Sendable { + public struct Delta: Codable, Hashable, Sendable { + public let role: OpenAI.ChatRole? + public let content: String? + } + + public enum FinishReason: String, Codable, Hashable, Sendable { + case length = "length" + case stop = "stop" + } + + public var delta: Delta + public let index: Int + public let finishReason: FinishReason? + } + + public let id: String + public let model: XAI.Model + public let createdAt: Date + public let choices: [Choice] + + public required init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + + self.id = try container.decode(forKey: .id) + self.model = try container.decode(forKey: .model) + self.createdAt = try container.decode(forKey: .createdAt) + self.choices = try container.decode(forKey: .choices) + + try super.init(from: decoder) + } + + public override func encode(to encoder: Encoder) throws { + try super.encode(to: encoder) + + var container = encoder.container(keyedBy: CodingKeys.self) + + try container.encode(id, forKey: .id) + try container.encode(model, forKey: .model) + try container.encode(createdAt, forKey: .createdAt) + try container.encode(choices, forKey: .choices) + } + } +} + +extension XAI { + public enum ObjectType: String, CaseIterable, Codable, TypeDiscriminator, Sendable { + case assistant = "assistant" + case assistantFile = "assistant.file" + case chatCompletion = "chat.completion" + case chatCompletionChunk = "chat.completion.chunk" + case embedding = "embedding" + case file = "file" + case image = "image" + case list + case message = "thread.message" + case model = "model" + case run = "thread.run" + case speech = "speech" + case thread = "thread" + case textCompletion = "text_completion" + case transcription = "transcription" + case vectorStore = "vector_store" + case vectorStoreDeleted = "vector_store.deleted" + + public static var _undiscriminatedType: Any.Type? { + OpenAI.Object.self + } + + public func resolveType() -> Any.Type { + switch self { + case .assistant: + return OpenAI.Assistant.self + case .assistantFile: + return OpenAI.AssistantFile.self + case .embedding: + return OpenAI.Embedding.self + case .file: + return OpenAI.File.self + case .chatCompletion: + return XAI.ChatCompletion.self + case .chatCompletionChunk: + return OpenAI.ChatCompletionChunk.self + case .image: + return OpenAI.Image.self + case .list: + return OpenAI.List.self + case .message: + return OpenAI.Message.self + case .model: + return OpenAI.ModelObject.self + case .run: + return OpenAI.Run.self + case .speech: + return OpenAI.Speech.self + case .textCompletion: + return OpenAI.TextCompletion.self + case .thread: + return OpenAI.Thread.self + case .transcription: + return OpenAI.AudioTranscription.self + case .vectorStore: + return OpenAI.VectorStore.self + case .vectorStoreDeleted: + return OpenAI.VectorStore.self + } + } + } +} + +extension XAI { + public class Object: Codable, PolymorphicDecodable, TypeDiscriminable { + private enum CodingKeys: String, CodingKey { + case type = "object" + } + + public let type: ObjectType + + public var typeDiscriminator: ObjectType { + type + } + + public init(type: ObjectType) { + self.type = type + } + + public required init( + from decoder: Decoder + ) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + + let type = try container.decodeIfPresent(ObjectType.self, forKey: .type) + + if let type { + self.type = type + } else if Self.self is OpenAI.AnyList.Type { + self.type = .list + } else { + self.type = try ObjectType.allCases.firstAndOnly(where: { $0.resolveType() == Self.self }).unwrap() + } + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + + try container.encode(type, forKey: .type) + } + } +} + +extension XAI { + public struct Usage: Codable, Hashable, Sendable { + public let promptTokens: Int + public let completionTokens: Int? + public let totalTokens: Int + public let promptTokensDetails: PromptTokensDetails? + public let completionTokensDetails: CompletionTokensDetails? + } + + public struct PromptTokensDetails: Codable, Hashable, Sendable { + public let cachedTokens: Int? + } + + public struct CompletionTokensDetails: Codable, Hashable, Sendable { + public let reasoningTokens: Int? + } +} diff --git a/Sources/xAI/Intramodular/XAI.Client.ChatCompletionParameters.swift b/Sources/xAI/Intramodular/XAI.Client.ChatCompletionParameters.swift new file mode 100644 index 00000000..75cea53b --- /dev/null +++ b/Sources/xAI/Intramodular/XAI.Client.ChatCompletionParameters.swift @@ -0,0 +1,15 @@ +// +// File.swift +// AI +// +// Created by Purav Manot on 11/12/24. +// + +import Foundation +import OpenAI + +extension XAI.Client { + public typealias ChatCompletionParameters = OpenAI.Client.ChatCompletionParameters +} + + diff --git a/Tests/XAI/module.swift b/Tests/XAI/module.swift new file mode 100644 index 00000000..313d61a5 --- /dev/null +++ b/Tests/XAI/module.swift @@ -0,0 +1,14 @@ +// +// Copyright (c) Vatsal Manot +// + +import XAI + +public var XAI_API_KEY: String { + "xai-EHvwOT7wQpdYyr49MtVkNmXnQPd9kJN1NhGdEpMcDCBN9Qawi3I0jii2a6lLUgIDMn1QHtzu8g88xOl8" +} + +public var client: XAI.Client { + XAI.Client(apiKey: XAI_API_KEY) +} + From e61c99d6eed57f9b41e62ed55bab3b9085e7578c Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Tue, 10 Dec 2024 14:37:14 -0700 Subject: [PATCH 049/271] removed print statements from debugging --- Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift | 2 -- .../OpenAI/Intramodular/API Client/OpenAI.Client-Image.swift | 2 -- .../API Specification/OpenAI.APISpecification.swift | 3 --- 3 files changed, 7 deletions(-) diff --git a/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift b/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift index b78e11a9..cb71af84 100644 --- a/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift +++ b/Sources/HumeAI/Intramodular/API/HumeAI.APISpecification.swift @@ -496,8 +496,6 @@ extension HumeAI.APISpecification { from response: HTTPResponse, context: DecodeOutputContext ) throws -> Output { - - print(response) do { try response.validate() } catch { diff --git a/Sources/OpenAI/Intramodular/API Client/OpenAI.Client-Image.swift b/Sources/OpenAI/Intramodular/API Client/OpenAI.Client-Image.swift index 36956fd9..7a8b3ca1 100644 --- a/Sources/OpenAI/Intramodular/API Client/OpenAI.Client-Image.swift +++ b/Sources/OpenAI/Intramodular/API Client/OpenAI.Client-Image.swift @@ -53,8 +53,6 @@ extension OpenAI.Client { let response = try await run(\.createImageEdit, with: requestBody) - print(response) - return response } } diff --git a/Sources/OpenAI/Intramodular/API Specification/OpenAI.APISpecification.swift b/Sources/OpenAI/Intramodular/API Specification/OpenAI.APISpecification.swift index edb65fad..3e62f991 100644 --- a/Sources/OpenAI/Intramodular/API Specification/OpenAI.APISpecification.swift +++ b/Sources/OpenAI/Intramodular/API Specification/OpenAI.APISpecification.swift @@ -359,9 +359,6 @@ extension OpenAI.APISpecification { context: DecodeOutputContext ) throws -> Output { do { - - print(response) - try response.validate() } catch { let apiError: Error From 939c487ba4da063a7e6fc611cf12de36c99d5d51 Mon Sep 17 00:00:00 2001 From: Vatsal Manot Date: Wed, 11 Dec 2024 15:20:32 +0530 Subject: [PATCH 050/271] Update package --- Package.swift | 61 ++- .../CoreMI._ServiceClientProtocol.swift | 2 +- Sources/Ollama/Intramodular/Ollama.swift | 2 +- .../Intramodular/XAI+LLMRequestHandling.swift | 367 ------------------ .../XAI.APISpecification.RequestBodies.swift | 123 ------ .../XAI.APISpecification.ResponseBodies.swift | 10 - .../XAI.APISpecification.swift | 155 -------- .../xAI/Intramodular/XAI.ChatCompletion.swift | 238 ------------ .../xAI/Intramodular/XAI.ChatMessage.swift | 10 - .../XAI.Client.ChatCompletionParameters.swift | 15 - Sources/xAI/Intramodular/XAI.Client.swift | 52 --- Sources/xAI/Intramodular/XAI.Model.swift | 54 --- Sources/xAI/Intramodular/XAI.swift | 9 - Sources/xAI/module.swift | 6 - Tests/XAI/Intramodular/CompletionTests.swift | 34 -- Tests/XAI/module.swift | 14 - 16 files changed, 28 insertions(+), 1124 deletions(-) delete mode 100644 Sources/xAI/Intramodular/XAI+LLMRequestHandling.swift delete mode 100644 Sources/xAI/Intramodular/XAI.APISpecification/XAI.APISpecification.RequestBodies.swift delete mode 100644 Sources/xAI/Intramodular/XAI.APISpecification/XAI.APISpecification.ResponseBodies.swift delete mode 100644 Sources/xAI/Intramodular/XAI.APISpecification/XAI.APISpecification.swift delete mode 100644 Sources/xAI/Intramodular/XAI.ChatCompletion.swift delete mode 100644 Sources/xAI/Intramodular/XAI.ChatMessage.swift delete mode 100644 Sources/xAI/Intramodular/XAI.Client.ChatCompletionParameters.swift delete mode 100644 Sources/xAI/Intramodular/XAI.Client.swift delete mode 100644 Sources/xAI/Intramodular/XAI.Model.swift delete mode 100644 Sources/xAI/Intramodular/XAI.swift delete mode 100644 Sources/xAI/module.swift delete mode 100644 Tests/XAI/Intramodular/CompletionTests.swift delete mode 100644 Tests/XAI/module.swift diff --git a/Package.swift b/Package.swift index 2eba40c1..eb9a8799 100644 --- a/Package.swift +++ b/Package.swift @@ -18,19 +18,14 @@ let package = Package( "CoreMI", "LargeLanguageModels", "Anthropic", - "Cohere", "ElevenLabs", "_Gemini", "Groq", "HuggingFace", - "Jina", "Mistral", "Ollama", "OpenAI", "Perplexity", - "XAI", - "TogetherAI", - "VoyageAI", "AI", ] ), @@ -40,6 +35,18 @@ let package = Package( "Anthropic" ] ), + .library( + name: "Cohere", + targets: [ + "Cohere" + ] + ), + .library( + name: "HumeAI", + targets: [ + "HumeAI" + ] + ), .library( name: "OpenAI", targets: [ @@ -53,9 +60,21 @@ let package = Package( ] ), .library( - name: "XAI", + name: "Jina", + targets: [ + "Jina" + ] + ), + .library( + name: "TogetherAI", + targets: [ + "TogetherAI" + ] + ), + .library( + name: "VoyageAI", targets: [ - "XAI" + "VoyageAI" ] ) ], @@ -242,22 +261,6 @@ let package = Package( .enableExperimentalFeature("AccessLevelOnImport") ] ), - .target( - name: "XAI", - dependencies: [ - "CorePersistence", - "CoreMI", - "LargeLanguageModels", - "OpenAI", - "Merge", - "NetworkKit", - "Swallow" - ], - path: "Sources/XAI", - swiftSettings: [ - .enableExperimentalFeature("AccessLevelOnImport") - ] - ), .target( name: "Jina", dependencies: [ @@ -376,7 +379,6 @@ let package = Package( "Ollama", "OpenAI", "Perplexity", - "XAI", "PlayHT", "Rime", "Swallow", @@ -443,17 +445,6 @@ let package = Package( .enableExperimentalFeature("AccessLevelOnImport") ] ), - .testTarget( - name: "XAITests", - dependencies: [ - "AI", - "Swallow" - ], - path: "Tests/XAI", - swiftSettings: [ - .enableExperimentalFeature("AccessLevelOnImport") - ] - ), .testTarget( name: "PerplexityTests", dependencies: [ diff --git a/Sources/CoreMI/Intramodular/Service/CoreMI._ServiceClientProtocol.swift b/Sources/CoreMI/Intramodular/Service/CoreMI._ServiceClientProtocol.swift index 9fd23037..9b9efdb9 100644 --- a/Sources/CoreMI/Intramodular/Service/CoreMI._ServiceClientProtocol.swift +++ b/Sources/CoreMI/Intramodular/Service/CoreMI._ServiceClientProtocol.swift @@ -7,7 +7,7 @@ import Swallow extension CoreMI { /// A client for an AI/ML service. - public protocol _ServiceClientProtocol: PersistentlyRepresentableType { + public protocol _ServiceClientProtocol: AnyObject, PersistentlyRepresentableType { init(account: (any CoreMI._ServiceAccountProtocol)?) async throws } diff --git a/Sources/Ollama/Intramodular/Ollama.swift b/Sources/Ollama/Intramodular/Ollama.swift index 0bbb9583..491fe4e6 100644 --- a/Sources/Ollama/Intramodular/Ollama.swift +++ b/Sources/Ollama/Intramodular/Ollama.swift @@ -86,7 +86,7 @@ extension Ollama: CoreMI._ServiceClientProtocol { } -extension CoreMI._ServiceClientProtocol where Self == Ollama { +extension PersistentlyRepresentableType where Self == Ollama { public init( account: (any CoreMI._ServiceAccountProtocol)? ) async throws { diff --git a/Sources/xAI/Intramodular/XAI+LLMRequestHandling.swift b/Sources/xAI/Intramodular/XAI+LLMRequestHandling.swift deleted file mode 100644 index 40a72feb..00000000 --- a/Sources/xAI/Intramodular/XAI+LLMRequestHandling.swift +++ /dev/null @@ -1,367 +0,0 @@ -// -// Copyright (c) Vatsal Manot -// - -import CorePersistence -import LargeLanguageModels -import NetworkKit -import OpenAI -import Swallow - -extension XAI.Client: _TaskDependenciesExporting { - public var _exportedTaskDependencies: TaskDependencies { - var result = TaskDependencies() - - result[\.llm] = self - - return result - } -} - -extension XAI.Client: LLMRequestHandling { - public var _availableModels: [ModelIdentifier]? { - XAI.Model.allCases.map({ $0.__conversion() }) - } - - public func complete( - prompt: Prompt, - parameters: Prompt.CompletionParameters - ) async throws -> Prompt.Completion { - let _completion: Any - - switch prompt { - case let prompt as AbstractLLM.TextPrompt: - _completion = try await _complete( - prompt: prompt, - parameters: try cast(parameters) - ) - - case let prompt as AbstractLLM.ChatPrompt: - _completion = try await _complete( - prompt: prompt, - parameters: try cast(parameters) - ) - default: - throw LLMRequestHandlingError.unsupportedPromptType(Prompt.self) - } - - return try cast(_completion) - } - - private func _complete( - prompt: AbstractLLM.TextPrompt, - parameters: AbstractLLM.TextCompletionParameters - ) async throws -> AbstractLLM.TextCompletion { - throw LLMRequestHandlingError.unsupportedPromptType(.init(Swift.type(of: prompt))) - } - - private func _complete( - prompt: AbstractLLM.ChatPrompt, - parameters: AbstractLLM.ChatCompletionParameters - ) async throws -> AbstractLLM.ChatCompletion { - let model: XAI.Model = try self._model(for: prompt, parameters: parameters) - let parameters = try cast(parameters, to: AbstractLLM.ChatCompletionParameters.self) - let maxTokens: Int? - - do { - switch (parameters.tokenLimit) { - case .fixed(let count): - maxTokens = count - case .max, .none: - maxTokens = nil - } - } - - let completion: OpenAI.ChatCompletion = try await self.createChatCompletion( - messages: prompt.messages.asyncMap({ try await OpenAI.ChatMessage(from: $0) }), - model: model, - parameters: .init( - from: parameters, - model: model, - messages: prompt.messages, - maxTokens: maxTokens - ) - ) - - let message = try completion.choices.toCollectionOfOne().first.message - - return AbstractLLM.ChatCompletion( - prompt: prompt.messages, - message: try .init(from: message) - ) - - } - - private func _model( - for prompt: AbstractLLM.ChatPrompt, - parameters: AbstractLLM.ChatCompletionParameters? - ) throws -> XAI.Model { - try prompt.context.get(\.modelIdentifier)?.as(XAI.Model.self) ?? XAI.Model.grokBeta - } -} - -// MARK: - Auxiliary - -extension XAI.Client { - public func createChatCompletion( - messages: [XAI.ChatMessage], - model: XAI.Model, - parameters: XAI.Client.ChatCompletionParameters - ) async throws -> OpenAI.ChatCompletion { - let requestBody = XAI.APISpecification.RequestBodies.CreateChatCompletion( - messages: messages, - model: model, - parameters: parameters, - stream: false - ) - - return try await run(\.createChatCompletions, with: requestBody) - } -} - -extension XAI.Client.ChatCompletionParameters { - public init( - from parameters: AbstractLLM.ChatCompletionParameters, - model: XAI.Model, - messages _: [AbstractLLM.ChatMessage], - maxTokens: Int? = nil - ) throws { - self.init( - temperature: parameters.temperatureOrTopP?.temperature, - topProbabilityMass: parameters.temperatureOrTopP?.topProbabilityMass, - stop: parameters.stops, - maxTokens: maxTokens, - functions: parameters.functions?.map { - OpenAI.ChatFunctionDefinition(from: $0) - } - ) - } -} - - -extension XAI.ChatMessage.Role { - public init( - from role: AbstractLLM.ChatRole - ) throws { - switch role { - case .system: - self = .system - case .user: - self = .user - case .assistant: - self = .assistant - case .other: - throw Never.Reason.unsupported - } - } -} - -extension XAI.APISpecification.RequestBodies.CreateChatCompletion { - public init( - messages: [XAI.ChatMessage], - model: XAI.Model, - parameters: XAI.Client.ChatCompletionParameters, - user: String? = nil, - stream: Bool - ) { - self.init( - user: user, - messages: messages, - functions: parameters.functions, - functionCallingStrategy: parameters.functionCallingStrategy, - model: model, - temperature: parameters.temperature, - topProbabilityMass: parameters.topProbabilityMass, - choices: parameters.choices, - stream: stream, - stop: parameters.stop, - maxTokens: parameters.maxTokens, - presencePenalty: parameters.presencePenalty, - frequencyPenalty: parameters.frequencyPenalty, - responseFormat: parameters.responseFormat - ) - } -} - -/* - extension OpenAI.Client: LLMRequestHandling { - private var _debugPrintCompletions: Bool { - false - } - - public var _availableModels: [ModelIdentifier]? { - if let __cached_models { - do { - return try __cached_models.map({ try $0.__conversion() }) - } catch { - runtimeIssue(error) - } - } - - return OpenAI.Model.allCases.map({ $0.__conversion() }) - } - - public func complete( - prompt: Prompt, - parameters: Prompt.CompletionParameters - ) async throws -> Prompt.Completion { - let _completion: Any - - switch prompt { - case let prompt as AbstractLLM.TextPrompt: - _completion = try await _complete( - prompt: prompt, - parameters: try cast(parameters) - ) - - case let prompt as AbstractLLM.ChatPrompt: - _completion = try await _complete( - prompt: prompt, - parameters: try cast(parameters) - ) - default: - throw LLMRequestHandlingError.unsupportedPromptType(Prompt.self) - } - - return try cast(_completion) - } - - private func _complete( - prompt: AbstractLLM.TextPrompt, - parameters: AbstractLLM.TextCompletionParameters - ) async throws -> AbstractLLM.TextCompletion { - let parameters = try cast(parameters, to: AbstractLLM.TextCompletionParameters.self) - - let model = OpenAI.Model.instructGPT(.davinci) - - let promptText = try prompt.prefix.promptLiteral - let completion = try await self.createCompletion( - model: model, - prompt: promptText._stripToText(), - parameters: .init( - from: parameters, - model: model, - prompt: prompt.prefix - ) - ) - - let text = try completion.choices.toCollectionOfOne().first.text - - _debugPrint( - prompt: prompt.debugDescription - .delimited(by: .quotationMark) - .delimited(by: "\n") - , - completion: text - .delimited(by: .quotationMark) - .delimited(by: "\n") - ) - - - return .init(prefix: promptText, text: text) - } - - private func _complete( - prompt: AbstractLLM.ChatPrompt, - parameters: AbstractLLM.ChatCompletionParameters - ) async throws -> AbstractLLM.ChatCompletion { - let model = try self._model(for: prompt, parameters: parameters) - let parameters = try cast(parameters, to: AbstractLLM.ChatCompletionParameters.self) - let maxTokens: Int? - - do { - switch (parameters.tokenLimit) { - case .fixed(let count): - maxTokens = count - case .max, .none: - /*let tokenizer = try await tokenizer(for: model) - let tokens = try tokenizer.encode(prompt._rawContent) - let contextSize = try model.contextSize - - maxTokens = contextSize - tokens.count*/ - maxTokens = nil - } - } - - let completion = try await self.createChatCompletion( - messages: prompt.messages.asyncMap({ try await OpenAI.ChatMessage(from: $0) }), - model: model, - parameters: .init( - from: parameters, - model: model, - messages: prompt.messages, - maxTokens: maxTokens - ) - ) - - let message = try completion.choices.toCollectionOfOne().first.message - - _debugPrint( - prompt: prompt.debugDescription, - completion: message.body - .description - .delimited(by: .quotationMark) - .delimited(by: "\n") - ) - - return AbstractLLM.ChatCompletion( - prompt: prompt.messages, - message: try .init(from: message) - ) - } - - private func _validateParameters( - parameters: AbstractLLM.ChatCompletionParameters, - model: OpenAI.Model - ) { - if let temperature = parameters.temperatureOrTopP?.temperature { - if temperature > 1.2 { - runtimeIssue("OpenAI's API doesn't seem to support a temperature higher than 1.2, but it is available on their playground at https://platform.openai.com/playground/chat?models=gpt-4o") - } - } - } - - public func completion( - for prompt: AbstractLLM.ChatPrompt - ) throws -> AbstractLLM.ChatCompletionStream { - AbstractLLM.ChatCompletionStream { - try await self._completion(for: prompt) - } - } - - private func _completion( - for prompt: AbstractLLM.ChatPrompt - ) async throws -> AnyPublisher { - var session: OpenAI.ChatCompletionSession! = OpenAI.ChatCompletionSession(client: self) - - let messages: [OpenAI.ChatMessage] = try await prompt.messages.asyncMap { - try await OpenAI.ChatMessage(from: $0) - } - let model: OpenAI.Model = try self._model(for: prompt, parameters: nil) - let parameters: OpenAI.Client.ChatCompletionParameters = try await self._chatCompletionParameters( - from: prompt.context.completionParameters, - for: prompt - ) - - return try await session - .complete( - messages: messages, - model: model, - parameters: parameters - ) - .tryMap { (message: OpenAI.ChatMessage) -> AbstractLLM.ChatCompletionStream.Event in - AbstractLLM.ChatCompletionStream.Event.completion( - AbstractLLM.ChatCompletion.Partial( - message: .init(whole: try AbstractLLM.ChatMessage(from: message)), - stopReason: nil - ) - ) - } - .handleCancelOrCompletion { _ in - session = nil - } - .eraseToAnyPublisher() - } - } - - */ diff --git a/Sources/xAI/Intramodular/XAI.APISpecification/XAI.APISpecification.RequestBodies.swift b/Sources/xAI/Intramodular/XAI.APISpecification/XAI.APISpecification.RequestBodies.swift deleted file mode 100644 index d98a79f0..00000000 --- a/Sources/xAI/Intramodular/XAI.APISpecification/XAI.APISpecification.RequestBodies.swift +++ /dev/null @@ -1,123 +0,0 @@ -import Foundation -import OpenAI - -extension XAI.APISpecification.RequestBodies { - public struct CreateChatCompletion: Codable, Hashable { - private enum CodingKeys: String, CodingKey { - case user - case messages - case functions = "functions" - case functionCallingStrategy = "function_call" - case model - case temperature - case topProbabilityMass = "top_p" - case choices = "n" - case stream - case stop - case maxTokens = "max_tokens" - case presencePenalty = "presence_penalty" - case frequencyPenalty = "frequency_penalty" - case logprobs = "logprobs" - case topLogprobs = "top_logprobs" - case logitBias = "logit_bias" - case responseFormat = "response_format" - case seed = "seed" - } - - let messages: [OpenAI.ChatMessage] - let model: XAI.Model - let frequencyPenalty: Double? - let logitBias: [String: Int]? - let logprobs: Bool? - let topLogprobs: Int? - let maxTokens: Int? - let choices: Int? - let presencePenalty: Double? - let responseFormat: OpenAI.ChatCompletion.ResponseFormat? - let seed: String? - let stop: [String]? - let stream: Bool? - let temperature: Double? - let topProbabilityMass: Double? - let user: String? - let functions: [OpenAI.ChatFunctionDefinition]? - let functionCallingStrategy: OpenAI.FunctionCallingStrategy? - - public init( - messages: [OpenAI.ChatMessage], - model: XAI.Model, - frequencyPenalty: Double? = nil, - logitBias: [String : Int]? = nil, - logprobs: Bool? = nil, - topLogprobs: Int? = nil, - maxTokens: Int? = nil, - choices: Int? = nil, - presencePenalty: Double? = nil, - responseFormat: OpenAI.ChatCompletion.ResponseFormat? = nil, - seed: String? = nil, - stop: [String]? = nil, - stream: Bool? = nil, - temperature: Double? = nil, - topProbabilityMass: Double? = nil, - user: String? = nil, - functions: [OpenAI.ChatFunctionDefinition]? = nil, - functionCallingStrategy: OpenAI.FunctionCallingStrategy? = nil - ) { - self.messages = messages - self.model = model - self.frequencyPenalty = frequencyPenalty - self.logitBias = logitBias - self.logprobs = logprobs - self.topLogprobs = topLogprobs - self.maxTokens = maxTokens - self.choices = choices - self.presencePenalty = presencePenalty - self.responseFormat = responseFormat - self.seed = seed - self.stop = stop - self.stream = stream - self.temperature = temperature - self.topProbabilityMass = topProbabilityMass - self.user = user - self.functions = functions - self.functionCallingStrategy = functionCallingStrategy - } - - public init( - user: String?, - messages: [OpenAI.ChatMessage], - functions: [OpenAI.ChatFunctionDefinition]?, - functionCallingStrategy: OpenAI.FunctionCallingStrategy?, - model: XAI.Model, - temperature: Double?, - topProbabilityMass: Double?, - choices: Int?, - stream: Bool?, - stop: [String]?, - maxTokens: Int?, - presencePenalty: Double?, - frequencyPenalty: Double?, - responseFormat: OpenAI.ChatCompletion.ResponseFormat? - ) { - self.user = user - self.messages = messages - self.functions = functions.nilIfEmpty() - self.functionCallingStrategy = functions == nil ? nil : functionCallingStrategy - self.model = model - self.temperature = temperature - self.topProbabilityMass = topProbabilityMass - self.choices = choices - self.stream = stream - self.stop = stop - self.maxTokens = maxTokens - self.presencePenalty = presencePenalty - self.frequencyPenalty = frequencyPenalty - self.logitBias = nil - self.logprobs = nil - self.topLogprobs = nil - self.responseFormat = responseFormat - self.seed = nil - } - } -} - diff --git a/Sources/xAI/Intramodular/XAI.APISpecification/XAI.APISpecification.ResponseBodies.swift b/Sources/xAI/Intramodular/XAI.APISpecification/XAI.APISpecification.ResponseBodies.swift deleted file mode 100644 index 190cc950..00000000 --- a/Sources/xAI/Intramodular/XAI.APISpecification/XAI.APISpecification.ResponseBodies.swift +++ /dev/null @@ -1,10 +0,0 @@ -// -// Copyright (c) Vatsal Manot -// - -import Foundation -import OpenAI - -extension XAI.APISpecification.ResponseBodies { - -} diff --git a/Sources/xAI/Intramodular/XAI.APISpecification/XAI.APISpecification.swift b/Sources/xAI/Intramodular/XAI.APISpecification/XAI.APISpecification.swift deleted file mode 100644 index 0d3953d0..00000000 --- a/Sources/xAI/Intramodular/XAI.APISpecification/XAI.APISpecification.swift +++ /dev/null @@ -1,155 +0,0 @@ -// -// Copyright (c) Vatsal Manot -// - -import CorePersistence -import FoundationX -import OpenAI -import NetworkKit -import Swallow - -extension XAI { - public enum APIError: APIErrorProtocol { - public typealias API = XAI.APISpecification - - case apiKeyMissing - case incorrectAPIKeyProvided - case rateLimitExceeded - case badRequest(request: API.Request?, error: API.Request.Error) - case runtime(AnyError) - - public var traits: ErrorTraits { - [.domain(.networking)] - } - } - - public struct APISpecification: RESTAPISpecification { - public typealias Error = APIError - - public struct Configuration: Codable, Hashable { - public var apiKey: String? - } - - public let configuration: Configuration - - public var host: URL { - URL(string: "https://api.x.ai/")! - } - - public var id: some Hashable { - configuration - } - - @POST - @Path("/v1/chat/completions") - @Body(json: .input, keyEncodingStrategy: .convertToSnakeCase) - var createChatCompletions = Endpoint() - - - - } -} - -extension XAI.APISpecification { - public final class Endpoint: BaseHTTPEndpoint { - override public func buildRequestBase( - from input: Input, - context: BuildRequestContext - ) throws -> Request { - let configuration = context.root.configuration - - return try super - .buildRequestBase(from: input, context: context) - .jsonBody(input, keyEncodingStrategy: .convertToSnakeCase) - .header(.contentType(.json)) - .header(.accept(.json)) - .header(.authorization(.bearer, configuration.apiKey.unwrap())) - } - - struct _ErrorWrapper: Codable, Hashable, Sendable { - let detail: [ErrorDetail] - - struct ErrorDetail: Codable, Hashable, Sendable { - let loc: [ErrorLocation] - let msg: String - let type: String - - enum ErrorLocation: Codable, Hashable, Sendable { - case string(String) - case integer(Int) - - init(from decoder: Decoder) throws { - let container = try decoder.singleValueContainer() - if let stringValue = try? container.decode(String.self) { - self = .string(stringValue) - } else if let intValue = try? container.decode(Int.self) { - self = .integer(intValue) - } else { - throw DecodingError.dataCorruptedError(in: container, debugDescription: "Cannot decode ErrorLocation") - } - } - - func encode(to encoder: Encoder) throws { - var container = encoder.singleValueContainer() - switch self { - case .string(let value): - try container.encode(value) - case .integer(let value): - try container.encode(value) - } - } - } - } - } - - override public func decodeOutputBase( - from response: Request.Response, - context: DecodeOutputContext - ) throws -> Output { - do { - try response.validate() - } catch { - let apiError: Error - - if let error = error as? Request.Error { - if let errorWrapper = try? response.decode( - _ErrorWrapper.self, - keyDecodingStrategy: .convertFromSnakeCase - ) { - let errorMsg = errorWrapper.detail.first?.msg ?? "" - if errorMsg.contains("You didn't provide an API key") { - throw Error.apiKeyMissing - } else if errorMsg.contains("Incorrect API key provided") { - throw Error.incorrectAPIKeyProvided - } - } - - if response.statusCode.rawValue == 429 { - apiError = .rateLimitExceeded - } else { - apiError = .badRequest(error) - } - } else { - apiError = .runtime(error) - } - - throw apiError - } - - return try response.decode( - Output.self, - keyDecodingStrategy: .convertFromSnakeCase - ) - } - } -} - -extension XAI.APISpecification { - public enum RequestBodies: _StaticSwift.Namespace { - - } - - public enum ResponseBodies: _StaticSwift.Namespace { - - } -} diff --git a/Sources/xAI/Intramodular/XAI.ChatCompletion.swift b/Sources/xAI/Intramodular/XAI.ChatCompletion.swift deleted file mode 100644 index 340deb4b..00000000 --- a/Sources/xAI/Intramodular/XAI.ChatCompletion.swift +++ /dev/null @@ -1,238 +0,0 @@ -// -// File.swift -// AI -// -// Created by Purav Manot on 11/12/24. -// - -import Foundation -import OpenAI - -extension XAI { - public final class ChatCompletion: XAI.Object { - private enum CodingKeys: String, CodingKey { - case id - case model - case createdAt = "created" - case choices - case usage - } - - public struct Choice: Codable, Hashable, Sendable { - public enum FinishReason: String, Codable, Hashable, Sendable { - case length = "length" - case stop = "stop" - case functionCall = "function_call" - } - - public let message: ChatMessage - public let index: Int - public let finishReason: FinishReason? - } - - public let id: String - public let model: XAI.Model - public let createdAt: Date - public let choices: [Choice] - public let usage: Usage - - public required init(from decoder: Decoder) throws { - let container = try decoder.container(keyedBy: CodingKeys.self) - - self.id = try container.decode(forKey: .id) - self.model = try container.decode(forKey: .model) - self.createdAt = try container.decode(forKey: .createdAt) - self.choices = try container.decode(forKey: .choices) - self.usage = try container.decode(forKey: .usage) - - try super.init(from: decoder) - } - - public override func encode(to encoder: Encoder) throws { - try super.encode(to: encoder) - - var container = encoder.container(keyedBy: CodingKeys.self) - - try container.encode(id, forKey: .id) - try container.encode(model, forKey: .model) - try container.encode(createdAt, forKey: .createdAt) - try container.encode(choices, forKey: .choices) - try container.encode(usage, forKey: .usage) - } - } - - public final class ChatCompletionChunk: XAI.Object { - private enum CodingKeys: String, CodingKey { - case id - case model - case createdAt = "created" - case choices - } - - public struct Choice: Codable, Hashable, Sendable { - public struct Delta: Codable, Hashable, Sendable { - public let role: OpenAI.ChatRole? - public let content: String? - } - - public enum FinishReason: String, Codable, Hashable, Sendable { - case length = "length" - case stop = "stop" - } - - public var delta: Delta - public let index: Int - public let finishReason: FinishReason? - } - - public let id: String - public let model: XAI.Model - public let createdAt: Date - public let choices: [Choice] - - public required init(from decoder: Decoder) throws { - let container = try decoder.container(keyedBy: CodingKeys.self) - - self.id = try container.decode(forKey: .id) - self.model = try container.decode(forKey: .model) - self.createdAt = try container.decode(forKey: .createdAt) - self.choices = try container.decode(forKey: .choices) - - try super.init(from: decoder) - } - - public override func encode(to encoder: Encoder) throws { - try super.encode(to: encoder) - - var container = encoder.container(keyedBy: CodingKeys.self) - - try container.encode(id, forKey: .id) - try container.encode(model, forKey: .model) - try container.encode(createdAt, forKey: .createdAt) - try container.encode(choices, forKey: .choices) - } - } -} - -extension XAI { - public enum ObjectType: String, CaseIterable, Codable, TypeDiscriminator, Sendable { - case assistant = "assistant" - case assistantFile = "assistant.file" - case chatCompletion = "chat.completion" - case chatCompletionChunk = "chat.completion.chunk" - case embedding = "embedding" - case file = "file" - case image = "image" - case list - case message = "thread.message" - case model = "model" - case run = "thread.run" - case speech = "speech" - case thread = "thread" - case textCompletion = "text_completion" - case transcription = "transcription" - case vectorStore = "vector_store" - case vectorStoreDeleted = "vector_store.deleted" - - public static var _undiscriminatedType: Any.Type? { - OpenAI.Object.self - } - - public func resolveType() -> Any.Type { - switch self { - case .assistant: - return OpenAI.Assistant.self - case .assistantFile: - return OpenAI.AssistantFile.self - case .embedding: - return OpenAI.Embedding.self - case .file: - return OpenAI.File.self - case .chatCompletion: - return XAI.ChatCompletion.self - case .chatCompletionChunk: - return OpenAI.ChatCompletionChunk.self - case .image: - return OpenAI.Image.self - case .list: - return OpenAI.List.self - case .message: - return OpenAI.Message.self - case .model: - return OpenAI.ModelObject.self - case .run: - return OpenAI.Run.self - case .speech: - return OpenAI.Speech.self - case .textCompletion: - return OpenAI.TextCompletion.self - case .thread: - return OpenAI.Thread.self - case .transcription: - return OpenAI.AudioTranscription.self - case .vectorStore: - return OpenAI.VectorStore.self - case .vectorStoreDeleted: - return OpenAI.VectorStore.self - } - } - } -} - -extension XAI { - public class Object: Codable, PolymorphicDecodable, TypeDiscriminable { - private enum CodingKeys: String, CodingKey { - case type = "object" - } - - public let type: ObjectType - - public var typeDiscriminator: ObjectType { - type - } - - public init(type: ObjectType) { - self.type = type - } - - public required init( - from decoder: Decoder - ) throws { - let container = try decoder.container(keyedBy: CodingKeys.self) - - let type = try container.decodeIfPresent(ObjectType.self, forKey: .type) - - if let type { - self.type = type - } else if Self.self is OpenAI.AnyList.Type { - self.type = .list - } else { - self.type = try ObjectType.allCases.firstAndOnly(where: { $0.resolveType() == Self.self }).unwrap() - } - } - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - - try container.encode(type, forKey: .type) - } - } -} - -extension XAI { - public struct Usage: Codable, Hashable, Sendable { - public let promptTokens: Int - public let completionTokens: Int? - public let totalTokens: Int - public let promptTokensDetails: PromptTokensDetails? - public let completionTokensDetails: CompletionTokensDetails? - } - - public struct PromptTokensDetails: Codable, Hashable, Sendable { - public let cachedTokens: Int? - } - - public struct CompletionTokensDetails: Codable, Hashable, Sendable { - public let reasoningTokens: Int? - } -} diff --git a/Sources/xAI/Intramodular/XAI.ChatMessage.swift b/Sources/xAI/Intramodular/XAI.ChatMessage.swift deleted file mode 100644 index aab90fbc..00000000 --- a/Sources/xAI/Intramodular/XAI.ChatMessage.swift +++ /dev/null @@ -1,10 +0,0 @@ -// -// Copyright (c) Vatsal Manot -// - -import Foundation -import OpenAI - -extension XAI { - public typealias ChatMessage = OpenAI.ChatMessage -} diff --git a/Sources/xAI/Intramodular/XAI.Client.ChatCompletionParameters.swift b/Sources/xAI/Intramodular/XAI.Client.ChatCompletionParameters.swift deleted file mode 100644 index 75cea53b..00000000 --- a/Sources/xAI/Intramodular/XAI.Client.ChatCompletionParameters.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// File.swift -// AI -// -// Created by Purav Manot on 11/12/24. -// - -import Foundation -import OpenAI - -extension XAI.Client { - public typealias ChatCompletionParameters = OpenAI.Client.ChatCompletionParameters -} - - diff --git a/Sources/xAI/Intramodular/XAI.Client.swift b/Sources/xAI/Intramodular/XAI.Client.swift deleted file mode 100644 index b7dcb5bb..00000000 --- a/Sources/xAI/Intramodular/XAI.Client.swift +++ /dev/null @@ -1,52 +0,0 @@ -// -// Copyright (c) Vatsal Manot -// - -import CorePersistence -import LargeLanguageModels -import Merge -import NetworkKit -import Swallow - -extension XAI { - @RuntimeDiscoverable - public final class Client: HTTPClient, _StaticSwift.Namespace { - public static var persistentTypeRepresentation: some IdentityRepresentation { - CoreMI._ServiceVendorIdentifier._xAI - } - - public let interface: APISpecification - public let session: HTTPSession - - public init(interface: APISpecification, session: HTTPSession) { - self.interface = interface - self.session = session - } - - public convenience init(apiKey: String?) { - self.init( - interface: .init(configuration: .init(apiKey: apiKey)), - session: .shared - ) - } - } -} - -extension XAI.Client: CoreMI._ServiceClientProtocol { - public convenience init( - account: (any CoreMI._ServiceAccountProtocol)? - ) async throws { - let account: any CoreMI._ServiceAccountProtocol = try account.unwrap() - let serviceVendorIdentifier: CoreMI._ServiceVendorIdentifier = try account.serviceVendorIdentifier.unwrap() - - guard serviceVendorIdentifier == CoreMI._ServiceVendorIdentifier._xAI else { - throw CoreMI._ServiceClientError.incompatibleVendor(serviceVendorIdentifier) - } - - guard let credential = try account.credential as? CoreMI._ServiceCredentialTypes.APIKeyCredential else { - throw CoreMI._ServiceClientError.invalidCredential(try account.credential) - } - - self.init(apiKey: credential.apiKey) - } -} diff --git a/Sources/xAI/Intramodular/XAI.Model.swift b/Sources/xAI/Intramodular/XAI.Model.swift deleted file mode 100644 index 152056b7..00000000 --- a/Sources/xAI/Intramodular/XAI.Model.swift +++ /dev/null @@ -1,54 +0,0 @@ -// -// Copyright (c) Vatsal Manot -// - -import CoreMI -import CorePersistence -import LargeLanguageModels -import Swallow - -extension XAI { - public enum Model: String, CaseIterable, Codable, Hashable, Named, Sendable { - case grokBeta = "grok-beta" - case grokVisionBeta = "grok-vision-beta" - - public var name: String { - switch self { - case .grokBeta: - return "Grok Beta" - case .grokVisionBeta: - return "Grok Vision Beta" - } - } - } -} - -// MARK: - Conformances - -extension XAI.Model: CustomStringConvertible { - public var description: String { - rawValue - } -} - -extension XAI.Model: ModelIdentifierRepresentable { - public init(from identifier: ModelIdentifier) throws { - guard identifier.provider == ._xAI, identifier.revision == nil else { - throw Never.Reason.illegal - } - - guard let model = Self(rawValue: identifier.name) else { - throw Never.Reason.unexpected - } - - self = model - } - - public func __conversion() -> ModelIdentifier { - ModelIdentifier( - provider: ._xAI, - name: rawValue, - revision: nil - ) - } -} diff --git a/Sources/xAI/Intramodular/XAI.swift b/Sources/xAI/Intramodular/XAI.swift deleted file mode 100644 index 66cdda47..00000000 --- a/Sources/xAI/Intramodular/XAI.swift +++ /dev/null @@ -1,9 +0,0 @@ -// -// Copyright (c) Vatsal Manot -// - -import Swift - -public enum XAI { - -} diff --git a/Sources/xAI/module.swift b/Sources/xAI/module.swift deleted file mode 100644 index 877659d4..00000000 --- a/Sources/xAI/module.swift +++ /dev/null @@ -1,6 +0,0 @@ -// -// Copyright (c) Vatsal Manot -// - -@_exported import LargeLanguageModels -import Swift diff --git a/Tests/XAI/Intramodular/CompletionTests.swift b/Tests/XAI/Intramodular/CompletionTests.swift deleted file mode 100644 index 96bb02cf..00000000 --- a/Tests/XAI/Intramodular/CompletionTests.swift +++ /dev/null @@ -1,34 +0,0 @@ -// -// Copyright (c) Vatsal Manot -// - -import LargeLanguageModels -import XAI -import XCTest - -final class CompletionTests: XCTestCase { - let llm: any LLMRequestHandling = client - - func testChatCompletions() async throws { - let llm: any LLMRequestHandling = client - - let messages: [AbstractLLM.ChatMessage] = [ - AbstractLLM.ChatMessage( - role: .system, - body: "You are an extremely intelligent assistant." - ), - AbstractLLM.ChatMessage( - role: .user, - body: "Sup?" - ) - ] - - let result: String = try await llm.complete( - messages, - model: XAI.Model.grokBeta, - as: .string - ) - - print(result) // "Hello! How can I assist you today?" - } -} diff --git a/Tests/XAI/module.swift b/Tests/XAI/module.swift deleted file mode 100644 index 313d61a5..00000000 --- a/Tests/XAI/module.swift +++ /dev/null @@ -1,14 +0,0 @@ -// -// Copyright (c) Vatsal Manot -// - -import XAI - -public var XAI_API_KEY: String { - "xai-EHvwOT7wQpdYyr49MtVkNmXnQPd9kJN1NhGdEpMcDCBN9Qawi3I0jii2a6lLUgIDMn1QHtzu8g88xOl8" -} - -public var client: XAI.Client { - XAI.Client(apiKey: XAI_API_KEY) -} - From 3d684484a0fbec77cbbc77447ad66eaa7d70da66 Mon Sep 17 00:00:00 2001 From: Vatsal Manot Date: Thu, 12 Dec 2024 01:00:16 +0530 Subject: [PATCH 051/271] Update package --- Sources/_Gemini/Intramodular/_Gemini.Model.swift | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Sources/_Gemini/Intramodular/_Gemini.Model.swift b/Sources/_Gemini/Intramodular/_Gemini.Model.swift index 7169e784..9677aff9 100644 --- a/Sources/_Gemini/Intramodular/_Gemini.Model.swift +++ b/Sources/_Gemini/Intramodular/_Gemini.Model.swift @@ -7,14 +7,17 @@ import Swift extension _Gemini { public enum Model: String, CaseIterable, Codable, Hashable, Sendable { + case gemini_2_0_flash_exp = "gemini-2.0-flash-exp" case gemini_1_5_pro = "gemini-1.5-pro" case gemini_1_5_pro_latest = "gemini-1.5-pro-latest" case gemini_1_5_flash = "gemini-1.5-flash" case gemini_1_5_flash_latest = "gemini-1.5-flash-latest" case gemini_1_0_pro = "gemini-1.0-pro" - + public var maximumContextLength: Int { switch self { + case .gemini_2_0_flash_exp: + return 1048576 case .gemini_1_5_pro: return 1048576 case .gemini_1_5_pro_latest: From 9339454a137dfa856a7b280af54dda4935fecc50 Mon Sep 17 00:00:00 2001 From: Vatsal Manot Date: Thu, 12 Dec 2024 01:09:37 +0530 Subject: [PATCH 052/271] Update package --- Package.swift | 17 +++++++++++++++++ Tests/_Gemini/module.swift | 9 +++++++++ 2 files changed, 26 insertions(+) create mode 100644 Tests/_Gemini/module.swift diff --git a/Package.swift b/Package.swift index eb9a8799..e7ddb997 100644 --- a/Package.swift +++ b/Package.swift @@ -29,6 +29,12 @@ let package = Package( "AI", ] ), + .library( + name: "_Gemini", + targets: [ + "_Gemini" + ] + ), .library( name: "Anthropic", targets: [ @@ -401,6 +407,17 @@ let package = Package( .enableExperimentalFeature("AccessLevelOnImport") ] ), + .testTarget( + name: "_GeminiTests", + dependencies: [ + "AI", + "Swallow" + ], + path: "Tests/_Gemini", + swiftSettings: [ + .enableExperimentalFeature("AccessLevelOnImport") + ] + ), .testTarget( name: "AnthropicTests", dependencies: [ diff --git a/Tests/_Gemini/module.swift b/Tests/_Gemini/module.swift new file mode 100644 index 00000000..230031af --- /dev/null +++ b/Tests/_Gemini/module.swift @@ -0,0 +1,9 @@ +// +// Copyright (c) Preternatural AI, Inc. +// + +import _Gemini + +var GEMINI_API_KEY: String { + "API_KEY" +} From 676ef05101efad6d5f253406df5563b7870ecd33 Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Thu, 2 Jan 2025 08:15:53 -0700 Subject: [PATCH 053/271] language support for playht --- Package.resolved | 191 +++++++++++++++++- ...layHT.APISpecification.RequestBodies.swift | 19 +- .../API/PlayHT.APISpecification.swift | 7 +- .../Intramodular/Models/PlayHT.Voice.swift | 21 ++ .../PlayHT/Intramodular/PlayHT.Client.swift | 32 +-- .../PlayHT/Intramodular/PlayHT.Model.swift | 4 + 6 files changed, 236 insertions(+), 38 deletions(-) diff --git a/Package.resolved b/Package.resolved index 44c6cdec..23ea1ed3 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,6 +1,33 @@ { - "originHash" : "094840915419b625ed8a43083bdf164ab8d3f6bbb7fda2dcec07cb5e55a2b736", + "originHash" : "a7afdc02c33e043aef77037e39006816570e8a6bd0c65d3499a410c01f230282", "pins" : [ + { + "identity" : "abseil-cpp-binary", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/abseil-cpp-binary.git", + "state" : { + "revision" : "194a6706acbd25e4ef639bcaddea16e8758a3e27", + "version" : "1.2024011602.0" + } + }, + { + "identity" : "app-check", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/app-check.git", + "state" : { + "revision" : "61b85103a1aeed8218f17c794687781505fbbef5", + "version" : "11.2.0" + } + }, + { + "identity" : "chatkit", + "kind" : "remoteSourceControl", + "location" : "https://github.com/PreternaturalAI/ChatKit.git", + "state" : { + "branch" : "main", + "revision" : "8b19deb1b0f74f091fec9a8c4755998a00f2b4cb" + } + }, { "identity" : "corepersistence", "kind" : "remoteSourceControl", @@ -10,6 +37,87 @@ "revision" : "3fc10b8e55c3be60ca4695200cecfc046c0ba29a" } }, + { + "identity" : "fal", + "kind" : "remoteSourceControl", + "location" : "https://github.com/preternatural-fork/Fal", + "state" : { + "revision" : "a58ca8a926a56a69ba3c454583f626b3629a4223", + "version" : "0.5.6" + } + }, + { + "identity" : "firebase-ios-sdk", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/firebase-ios-sdk.git", + "state" : { + "revision" : "2e02253fd1ce99145bcbf1bb367ccf61bd0ca46b", + "version" : "11.6.0" + } + }, + { + "identity" : "googleappmeasurement", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleAppMeasurement.git", + "state" : { + "revision" : "4f234bcbdae841d7015258fbbf8e7743a39b8200", + "version" : "11.4.0" + } + }, + { + "identity" : "googledatatransport", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleDataTransport.git", + "state" : { + "revision" : "617af071af9aa1d6a091d59a202910ac482128f9", + "version" : "10.1.0" + } + }, + { + "identity" : "googleutilities", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleUtilities.git", + "state" : { + "revision" : "53156c7ec267db846e6b64c9f4c4e31ba4cf75eb", + "version" : "8.0.2" + } + }, + { + "identity" : "grpc-binary", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/grpc-binary.git", + "state" : { + "revision" : "f56d8fc3162de9a498377c7b6cea43431f4f5083", + "version" : "1.65.1" + } + }, + { + "identity" : "gtm-session-fetcher", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/gtm-session-fetcher.git", + "state" : { + "revision" : "5cfe5f090c982de9c58605d2a82a4fc77b774fbd", + "version" : "4.1.0" + } + }, + { + "identity" : "interop-ios-for-google-sdks", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/interop-ios-for-google-sdks.git", + "state" : { + "revision" : "2d12673670417654f08f5f90fdd62926dc3a2648", + "version" : "100.0.0" + } + }, + { + "identity" : "leveldb", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/leveldb.git", + "state" : { + "revision" : "a0bc79961d7be727d258d33d5a6b2f1023270ba1", + "version" : "1.22.5" + } + }, { "identity" : "merge", "kind" : "remoteSourceControl", @@ -19,6 +127,15 @@ "revision" : "4bc71ce650b79b3dbe1a26acf7e54b29d750e0b6" } }, + { + "identity" : "nanopb", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/nanopb.git", + "state" : { + "revision" : "b7e1104502eca3a213b46303391ca4d3bc8ddec1", + "version" : "2.30910.0" + } + }, { "identity" : "networkkit", "kind" : "remoteSourceControl", @@ -28,6 +145,24 @@ "revision" : "8daa1ba22e5d18e1b8e469d5a0dd0c58b675eb87" } }, + { + "identity" : "promises", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/promises.git", + "state" : { + "revision" : "540318ecedd63d883069ae7f1ed811a2df00b6ac", + "version" : "2.4.0" + } + }, + { + "identity" : "sideproject", + "kind" : "remoteSourceControl", + "location" : "https://github.com/PreternaturalAI/Sideproject", + "state" : { + "branch" : "main", + "revision" : "82a434ea0c586612c0facb18108948547e24b9ee" + } + }, { "identity" : "swallow", "kind" : "remoteSourceControl", @@ -46,6 +181,24 @@ "version" : "1.1.4" } }, + { + "identity" : "swift-msgpack", + "kind" : "remoteSourceControl", + "location" : "https://github.com/nnabeyang/swift-msgpack.git", + "state" : { + "revision" : "7843723ab63aae2d7fa3b30a86cd1da578a441a3", + "version" : "0.6.0" + } + }, + { + "identity" : "swift-protobuf", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-protobuf.git", + "state" : { + "revision" : "ebc7251dd5b37f627c93698e4374084d98409633", + "version" : "1.28.2" + } + }, { "identity" : "swift-syntax", "kind" : "remoteSourceControl", @@ -64,6 +217,15 @@ "revision" : "3e47cc5f9b0cefe9ed1d0971aff22583bd9ac7b0" } }, + { + "identity" : "swiftui-introspect", + "kind" : "remoteSourceControl", + "location" : "https://github.com/siteline/SwiftUI-Introspect", + "state" : { + "revision" : "121c146fe591b1320238d054ae35c81ffa45f45a", + "version" : "0.12.0" + } + }, { "identity" : "swiftuix", "kind" : "remoteSourceControl", @@ -72,6 +234,33 @@ "branch" : "master", "revision" : "50e2aacd7b124ffb5d06b4bfa5a4f255052a559b" } + }, + { + "identity" : "swiftuiz", + "kind" : "remoteSourceControl", + "location" : "https://github.com/SwiftUIX/SwiftUIZ.git", + "state" : { + "branch" : "main", + "revision" : "194190e802249ba05e02903d06471eaff024caa0" + } + }, + { + "identity" : "swipeactions", + "kind" : "remoteSourceControl", + "location" : "https://github.com/aheze/SwipeActions", + "state" : { + "revision" : "41e6f6dce02d8cfa164f8c5461a41340850ca3ab", + "version" : "1.1.0" + } + }, + { + "identity" : "zipfoundation", + "kind" : "remoteSourceControl", + "location" : "https://github.com/weichsel/ZIPFoundation", + "state" : { + "revision" : "02b6abe5f6eef7e3cbd5f247c5cc24e246efcfe0", + "version" : "0.9.19" + } } ], "version" : 3 diff --git a/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.RequestBodies.swift b/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.RequestBodies.swift index 79ddf26e..563b91c1 100644 --- a/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.RequestBodies.swift +++ b/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.RequestBodies.swift @@ -15,7 +15,7 @@ extension PlayHT.APISpecification { public let text: String public let voice: String public let voiceEngine: PlayHT.Model - public let quality: String +// public let quality: String public let outputFormat: String // public let speed: Double? @@ -26,10 +26,11 @@ extension PlayHT.APISpecification { // public let voiceGuidance: Double? // public let styleGuidance: Double? // public let textGuidance: Double? - // public let language: String? + public let language: String? // private enum CodingKeys: String, CodingKey { - case text, voice, quality + case text, voice +// case quality case voiceEngine = "voice_engine" case outputFormat = "output_format" // case speed @@ -38,15 +39,15 @@ extension PlayHT.APISpecification { // case voiceGuidance = "voice_guidance" // case styleGuidance = "style_guidance" // case textGuidance = "text_guidance" - // case language + case language } public init( text: String, voice: String, voiceEngine: PlayHT.Model = .playHT2, - quality: String = "medium", - outputFormat: String = "mp3" +// quality: String = "medium", + outputFormat: String = "mp3", // speed: Double? = nil, // sampleRate: Int? = 48000, // seed: Int? = nil, @@ -55,12 +56,12 @@ extension PlayHT.APISpecification { // voiceGuidance: Double? = nil, // styleGuidance: Double? = nil, // textGuidance: Double? = nil, - // language: String? = nil + language: String? = nil ) { self.text = text self.voice = voice self.voiceEngine = voiceEngine - self.quality = quality +// self.quality = quality self.outputFormat = outputFormat // self.speed = speed // self.sampleRate = sampleRate @@ -70,7 +71,7 @@ extension PlayHT.APISpecification { // self.voiceGuidance = voiceGuidance // self.styleGuidance = styleGuidance // self.textGuidance = textGuidance - // self.language = language + self.language = language } } diff --git a/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.swift b/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.swift index 525ef06d..bbe1e997 100644 --- a/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.swift +++ b/Sources/PlayHT/Intramodular/API/PlayHT.APISpecification.swift @@ -71,7 +71,7 @@ extension PlayHT { @POST @Path("/tts/stream") @Body(json: \.input, keyEncodingStrategy: .convertToSnakeCase) - var streamTextToSpeech = Endpoint() + var streamTextToSpeech = Endpoint() @GET @Path("/cloned-voices") @@ -107,10 +107,10 @@ extension PlayHT.APISpecification { from: input, context: context ) - + request = request .header("X-USER-ID", context.root.configuration.userId) - .header("accept", "application/json") + .header(.accept(.mpeg)) .header("AUTHORIZATION", context.root.configuration.apiKey) .header(.contentType(.json)) @@ -122,6 +122,7 @@ extension PlayHT.APISpecification { context: DecodeOutputContext ) throws -> Output { do { + dump(response) try response.validate() } catch { let apiError: Error diff --git a/Sources/PlayHT/Intramodular/Models/PlayHT.Voice.swift b/Sources/PlayHT/Intramodular/Models/PlayHT.Voice.swift index 3ac8907f..c9708c13 100644 --- a/Sources/PlayHT/Intramodular/Models/PlayHT.Voice.swift +++ b/Sources/PlayHT/Intramodular/Models/PlayHT.Voice.swift @@ -31,6 +31,27 @@ extension PlayHT { case id, name, language, languageCode, voiceEngine, isCloned case gender, accent, age, style, sample, texture, loudness, tempo } + + public init( + id: String, + name: String, + language: String + ) { + self.id = .init(rawValue: id) + self.name = name + self.language = language + self.languageCode = nil + self.voiceEngine = "" + self.isCloned = nil + self.gender = nil + self.accent = nil + self.age = nil + self.style = nil + self.sample = nil + self.texture = nil + self.loudness = nil + self.tempo = nil + } // Add custom decoding if needed to handle any special cases public init(from decoder: Decoder) throws { diff --git a/Sources/PlayHT/Intramodular/PlayHT.Client.swift b/Sources/PlayHT/Intramodular/PlayHT.Client.swift index 66e6e80f..e98849ee 100644 --- a/Sources/PlayHT/Intramodular/PlayHT.Client.swift +++ b/Sources/PlayHT/Intramodular/PlayHT.Client.swift @@ -63,7 +63,7 @@ extension PlayHT.Client { async let clonedVoices = clonedVoices() let (available, cloned) = try await (htVoices, clonedVoices) - return available + cloned + return cloned } public func availableVoices() async throws -> [PlayHT.Voice] { @@ -78,6 +78,7 @@ extension PlayHT.Client { text: String, voice: String, settings: PlayHT.VoiceSettings, + language: String, outputSettings: PlayHT.OutputSettings = .default, model: PlayHT.Model ) async throws -> Data { @@ -86,33 +87,14 @@ extension PlayHT.Client { text: text, voice: voice, voiceEngine: model, - quality: outputSettings.quality.rawValue, - outputFormat: outputSettings.format.rawValue +// quality: outputSettings.quality.rawValue, + outputFormat: outputSettings.format.rawValue, + language: language ) let responseData = try await run(\.streamTextToSpeech, with: input) - - guard let url = URL(string: responseData.href) else { - throw PlayHTError.invalidURL - } - - var request = URLRequest(url: url) - request.httpMethod = "GET" - request.addValue("application/json", forHTTPHeaderField: "Content-Type") - request.addValue(interface.configuration.userId ?? "", forHTTPHeaderField: "X-USER-ID") - request.addValue(interface.configuration.apiKey ?? "", forHTTPHeaderField: "AUTHORIZATION") - - let (audioData, response) = try await URLSession.shared.data(for: request) - - guard let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 else { - throw PlayHTError.audioFetchFailed - } - - guard !audioData.isEmpty else { - throw PlayHTError.audioFetchFailed - } - - return audioData + + return responseData } diff --git a/Sources/PlayHT/Intramodular/PlayHT.Model.swift b/Sources/PlayHT/Intramodular/PlayHT.Model.swift index 9eeb0a28..20579363 100644 --- a/Sources/PlayHT/Intramodular/PlayHT.Model.swift +++ b/Sources/PlayHT/Intramodular/PlayHT.Model.swift @@ -18,6 +18,10 @@ extension PlayHT { case playHT1 = "PlayHT1.0" case playHT2Turbo = "PlayHT2.0-turbo" + + case play3_0Mini = "Play3.0-mini" + + case playDialog = "PlayDialog" } } From 520073a4811c58ce98baf1d8c038e454a0f6172c Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Wed, 8 Jan 2025 18:11:17 -0700 Subject: [PATCH 054/271] ElevenLabs+Dubbing --- ...nLabs.APISpecification.RequestBodies.swift | 185 ++++++++++++++++++ ...Labs.APISpecification.ResponseBodies.swift | 23 +++ .../API/ElevenLabs.APISpecification.swift | 18 ++ .../ElevenLabs.Client+Dubbing.swift | 83 ++++++++ .../Intramodular/ElevenLabs.Model.swift | 2 + .../Models/ElevenLabs.DubbingOptions.swift | 33 ++++ .../Models/ElevenLabs.DubbingProgress.swift | 16 ++ .../Models/ElevenLabs.DubbingResult.swift | 16 ++ .../{ => Models}/ElevenLabs.Voice.swift | 0 .../ElevenLabs.VoiceSettings.swift | 0 SwallowUI | 1 + 11 files changed, 377 insertions(+) create mode 100644 Sources/ElevenLabs/Intramodular/ElevenLabs.Client+Dubbing.swift create mode 100644 Sources/ElevenLabs/Intramodular/Models/ElevenLabs.DubbingOptions.swift create mode 100644 Sources/ElevenLabs/Intramodular/Models/ElevenLabs.DubbingProgress.swift create mode 100644 Sources/ElevenLabs/Intramodular/Models/ElevenLabs.DubbingResult.swift rename Sources/ElevenLabs/Intramodular/{ => Models}/ElevenLabs.Voice.swift (100%) rename Sources/ElevenLabs/Intramodular/{ => Models}/ElevenLabs.VoiceSettings.swift (100%) create mode 160000 SwallowUI diff --git a/Sources/ElevenLabs/Intramodular/API/ElevenLabs.APISpecification.RequestBodies.swift b/Sources/ElevenLabs/Intramodular/API/ElevenLabs.APISpecification.RequestBodies.swift index 3404e48e..1b72b81b 100644 --- a/Sources/ElevenLabs/Intramodular/API/ElevenLabs.APISpecification.RequestBodies.swift +++ b/Sources/ElevenLabs/Intramodular/API/ElevenLabs.APISpecification.RequestBodies.swift @@ -14,6 +14,7 @@ extension ElevenLabs.APISpecification { enum RequestBodies { public struct SpeechRequest: Codable, Hashable, Equatable { public let text: String + public let languageCode: String? public let voiceSettings: ElevenLabs.VoiceSettings public let model: ElevenLabs.Model @@ -21,14 +22,17 @@ extension ElevenLabs.APISpecification { case text case voiceSettings = "voice_settings" case model = "model_id" + case languageCode = "language_code" } public init( text: String, + languageCode: String?, voiceSettings: ElevenLabs.VoiceSettings, model: ElevenLabs.Model ) { self.text = text + self.languageCode = languageCode self.voiceSettings = voiceSettings self.model = model } @@ -47,17 +51,20 @@ extension ElevenLabs.APISpecification { public struct SpeechToSpeechInput: Codable, Hashable, HTTPRequest.Multipart.ContentConvertible, Equatable { public let voiceId: String public let audioURL: URL + public let languageCode: String? public let model: ElevenLabs.Model public let voiceSettings: ElevenLabs.VoiceSettings public init( voiceId: String, audioURL: URL, + languageCode: String?, model: ElevenLabs.Model, voiceSettings: ElevenLabs.VoiceSettings ) { self.voiceId = voiceId self.audioURL = audioURL + self.languageCode = languageCode self.model = model self.voiceSettings = voiceSettings } @@ -72,6 +79,15 @@ extension ElevenLabs.APISpecification { ) ) + if let languageCode { + result.append( + .text( + named: "language_code", + value: languageCode + ) + ) + } + let encoder = JSONEncoder() encoder.keyEncodingStrategy = .convertToSnakeCase if let voiceSettingsData = try? encoder.encode(voiceSettings), @@ -201,5 +217,174 @@ extension ElevenLabs.APISpecification { return result } } + + public struct DubbingRequest: Codable, Hashable, HTTPRequest.Multipart.ContentConvertible { + public let name: String? + public let sourceURL: URL? + public let sourceLang: String? + public let targetLang: String + public let numSpeakers: Int? + public let watermark: Bool? + public let startTime: Int? + public let endTime: Int? + public let highestResolution: Bool? + public let dropBackgroundAudio: Bool? + public let useProfanityFilter: Bool? + public let fileData: Data? + + public init( + name: String? = nil, + sourceURL: URL? = nil, + sourceLang: String? = nil, + targetLang: String, + numSpeakers: Int? = nil, + watermark: Bool? = nil, + startTime: Int? = nil, + endTime: Int? = nil, + highestResolution: Bool? = nil, + dropBackgroundAudio: Bool? = nil, + useProfanityFilter: Bool? = nil, + fileData: Data? = nil + ) { + self.name = name + self.sourceURL = sourceURL + self.sourceLang = sourceLang + self.targetLang = targetLang + self.numSpeakers = numSpeakers + self.watermark = watermark + self.startTime = startTime + self.endTime = endTime + self.highestResolution = highestResolution + self.dropBackgroundAudio = dropBackgroundAudio + self.useProfanityFilter = useProfanityFilter + self.fileData = fileData + } + + public func __conversion() throws -> HTTPRequest.Multipart.Content { + var result = HTTPRequest.Multipart.Content() + + if let name { + result.append(.text(named: "name", value: name)) + } + + if let sourceURL { + result.append(.text(named: "source_url", value: sourceURL.absoluteString)) + } + + if let sourceLang { + result.append(.text(named: "source_lang", value: sourceLang)) + } + + result.append(.text(named: "target_lang", value: targetLang)) + + if let numSpeakers { + result.append(.text(named: "num_speakers", value: String(numSpeakers))) + } + + if let watermark { + result.append(.text(named: "watermark", value: String(watermark))) + } + + if let startTime { + result.append(.text(named: "start_time", value: String(startTime))) + } + + if let endTime { + result.append(.text(named: "end_time", value: String(endTime))) + } + + if let highestResolution { + result.append(.text(named: "highest_resolution", value: String(highestResolution))) + } + + if let dropBackgroundAudio { + result.append(.text(named: "drop_background_audio", value: String(dropBackgroundAudio))) + } + + if let useProfanityFilter { + result.append(.text(named: "use_profanity_filter", value: String(useProfanityFilter))) + } + + if let fileData { + result.append( + .file( + named: "file", + data: fileData, + filename: "input.mp4", + contentType: .mp4 + ) + ) + } + + return result + } + } + public struct DubbingInput: Codable, Hashable, HTTPRequest.Multipart.ContentConvertible { + public let voiceId: String + public let audioURL: URL + public let languageCode: String + public let model: ElevenLabs.Model + public let voiceSettings: ElevenLabs.VoiceSettings + + public init( + voiceId: String, + audioURL: URL, + languageCode: String, + model: ElevenLabs.Model, + voiceSettings: ElevenLabs.VoiceSettings + ) { + self.voiceId = voiceId + self.audioURL = audioURL + self.languageCode = languageCode + self.model = model + self.voiceSettings = voiceSettings + } + + public func __conversion() throws -> HTTPRequest.Multipart.Content { + var result = HTTPRequest.Multipart.Content() + + result.append( + .text( + named: "model_id", + value: model.rawValue + ) + ) + + result.append( + .text( + named: "language_code", + value: languageCode + ) + ) + + let encoder = JSONEncoder() + encoder.keyEncodingStrategy = .convertToSnakeCase + if let voiceSettingsData = try? encoder.encode(voiceSettings), + let voiceSettingsString = String( + data: voiceSettingsData, + encoding: .utf8 + ) { + result.append( + .text( + named: "voice_settings", + value: voiceSettingsString + ) + ) + } + + if let fileData = try? Data(contentsOf: audioURL) { + result.append( + .file( + named: "audio", + data: fileData, + filename: audioURL.lastPathComponent, + contentType: .mpeg + ) + ) + } + + return result + } + } } } diff --git a/Sources/ElevenLabs/Intramodular/API/ElevenLabs.APISpecification.ResponseBodies.swift b/Sources/ElevenLabs/Intramodular/API/ElevenLabs.APISpecification.ResponseBodies.swift index b80abbd5..658d8de4 100644 --- a/Sources/ElevenLabs/Intramodular/API/ElevenLabs.APISpecification.ResponseBodies.swift +++ b/Sources/ElevenLabs/Intramodular/API/ElevenLabs.APISpecification.ResponseBodies.swift @@ -16,5 +16,28 @@ extension ElevenLabs.APISpecification { public struct VoiceID: Codable { public let voiceId: String } + + public struct DubbingResponse: Codable { + public let dubbingId: String + public let expectedDurationSec: Double + } + + public struct DubbingStatus: Codable { + public enum State: String, Codable { + case processing + case completed + case failed + } + + public let state: State + public let failure_reason: String? + public let progress: Double? + } + + public struct DubbingProgress: Codable { + public let status: DubbingStatus + public let expectedDuration: TimeInterval + public let dubbingId: String + } } } diff --git a/Sources/ElevenLabs/Intramodular/API/ElevenLabs.APISpecification.swift b/Sources/ElevenLabs/Intramodular/API/ElevenLabs.APISpecification.swift index fa442c34..c520694a 100644 --- a/Sources/ElevenLabs/Intramodular/API/ElevenLabs.APISpecification.swift +++ b/Sources/ElevenLabs/Intramodular/API/ElevenLabs.APISpecification.swift @@ -94,6 +94,24 @@ extension ElevenLabs { "/v1/voices/\(context.input)" }) var deleteVoice = Endpoint() + + // Dubbing + @POST + @Path("/v1/dubbing") + @Body(multipart: .input) + var initiateDubbing = Endpoint() + + @GET + @Path({ context -> String in + "/v1/dubbing/\(context.input)/status" + }) + var getDubbingStatus = Endpoint() + + @GET + @Path({ context -> String in + "/v1/dubbing/\(context.input)" + }) + var getDubbingResult = Endpoint() } } diff --git a/Sources/ElevenLabs/Intramodular/ElevenLabs.Client+Dubbing.swift b/Sources/ElevenLabs/Intramodular/ElevenLabs.Client+Dubbing.swift new file mode 100644 index 00000000..35ca928c --- /dev/null +++ b/Sources/ElevenLabs/Intramodular/ElevenLabs.Client+Dubbing.swift @@ -0,0 +1,83 @@ +// +// ElevenLabs.Client+Dubbing.swift +// AI +// +// Created by Jared Davidson on 1/7/25. +// + +import Foundation + +extension ElevenLabs.Client { + public func dub( + fileData: Data? = nil, + sourceURL: URL? = nil, + name: String? = nil, + sourceLang: String? = nil, + targetLang: String,app + numSpeakers: Int? = nil, + options: DubbingOptions = .init(), + progress: @escaping (DubbingProgress) async -> Void + ) async throws -> DubbingResult { + guard fileData != nil || sourceURL != nil else { + throw NSError(domain: "ElevenLabs", code: -1, userInfo: [ + NSLocalizedDescriptionKey: "Either fileData or sourceURL must be provided" + ]) + } + + let request = ElevenLabs.APISpecification.RequestBodies.DubbingRequest( + name: name, + sourceURL: sourceURL, + sourceLang: sourceLang, + targetLang: targetLang, + numSpeakers: numSpeakers, + watermark: options.watermark, + startTime: options.startTime, + endTime: options.endTime, + highestResolution: options.highestResolution, + dropBackgroundAudio: options.dropBackgroundAudio, + useProfanityFilter: options.useProfanityFilter, + fileData: fileData + ) + + // Start dubbing process + let response = try await run(\.initiateDubbing, with: request) + let dubbingId = response.dubbingId + let expectedDuration = response.expectedDurationSec + + // Poll for status + let pollingInterval: TimeInterval = 5 // seconds + let maxAttempts = Int(ceil(expectedDuration / pollingInterval)) + 10 // Add some buffer attempts + + for _ in 0.. Date: Wed, 8 Jan 2025 18:19:50 -0700 Subject: [PATCH 055/271] update --- Sources/ElevenLabs/Intramodular/ElevenLabs.Client.swift | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Sources/ElevenLabs/Intramodular/ElevenLabs.Client.swift b/Sources/ElevenLabs/Intramodular/ElevenLabs.Client.swift index 2093a3ea..b33cb1e4 100644 --- a/Sources/ElevenLabs/Intramodular/ElevenLabs.Client.swift +++ b/Sources/ElevenLabs/Intramodular/ElevenLabs.Client.swift @@ -42,11 +42,13 @@ extension ElevenLabs.Client { public func speech( for text: String, voiceID: String, + languageCode: String?, voiceSettings: ElevenLabs.VoiceSettings, model: ElevenLabs.Model ) async throws -> Data { let requestBody = ElevenLabs.APISpecification.RequestBodies.SpeechRequest( text: text, + languageCode: languageCode, voiceSettings: voiceSettings, model: model ) @@ -57,12 +59,14 @@ extension ElevenLabs.Client { public func speechToSpeech( inputAudioURL: URL, voiceID: String, + languageCode: String?, voiceSettings: ElevenLabs.VoiceSettings, model: ElevenLabs.Model ) async throws -> Data { let input = ElevenLabs.APISpecification.RequestBodies.SpeechToSpeechInput( voiceId: voiceID, audioURL: inputAudioURL, + languageCode: languageCode, model: model, voiceSettings: voiceSettings ) From 3a90366a560a96b21c636c8086ca42e823bb2254 Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Fri, 10 Jan 2025 13:03:39 -0700 Subject: [PATCH 056/271] Initial Push w/ Elements from Voice (Not Working) --- .../AbstractVoice.swift | 63 +++++++ .../AbstractVoiceSettings.swift | 147 ++++++++++++++++ .../SpeechSynthesisRequestHandling.swift | 70 ++++++++ .../VideoGenerationSettings.FrameRate.swift | 16 ++ ...deoGenerationSettings.MotionSettings.swift | 23 +++ .../VideoGenerationSettings.Quality.swift | 29 ++++ .../VideoGenerationSettings.Resolution.swift | 163 ++++++++++++++++++ ...ideoGenerationSettings.StyleStrength.swift | 27 +++ .../VideoGenerationSettings.swift | 43 +++++ .../VideoGenerationRequestHandling.swift | 41 +++++ .../VideoModel.swift | 35 ++++ 11 files changed, 657 insertions(+) create mode 100644 Sources/AI/WIP - Move Somewhere Else/AbstractVoice.swift create mode 100644 Sources/AI/WIP - Move Somewhere Else/AbstractVoiceSettings.swift create mode 100644 Sources/AI/WIP - Move Somewhere Else/SpeechSynthesisRequestHandling.swift create mode 100644 Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.FrameRate.swift create mode 100644 Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.MotionSettings.swift create mode 100644 Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.Quality.swift create mode 100644 Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.Resolution.swift create mode 100644 Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.StyleStrength.swift create mode 100644 Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.swift create mode 100644 Sources/AI/WIP - Move Somewhere Else/VideoGenerationRequestHandling.swift create mode 100644 Sources/AI/WIP - Move Somewhere Else/VideoModel.swift diff --git a/Sources/AI/WIP - Move Somewhere Else/AbstractVoice.swift b/Sources/AI/WIP - Move Somewhere Else/AbstractVoice.swift new file mode 100644 index 00000000..ff7dfc11 --- /dev/null +++ b/Sources/AI/WIP - Move Somewhere Else/AbstractVoice.swift @@ -0,0 +1,63 @@ +// +// AudioStore.swift +// Voice +// +// Created by Jared Davidson on 10/31/24. +// + +import CorePersistence +import SwiftUI +import AVFoundation +import UniformTypeIdentifiers +import ElevenLabs + +public struct AbstractVoice: Codable, Hashable, Identifiable, Sendable { + public typealias ID = _TypeAssociatedID + + public let id: ID + public let voiceID: String + public let name: String + public let description: String? + + init( + voiceID: String, + name: String, + description: String? + ) { + self.id = .init(rawValue: voiceID) + self.voiceID = voiceID + self.name = name + self.description = description + } +} + +// MARK: - Conformances + +public protocol AbstractVoiceInitiable { + init(voice: AbstractVoice) throws +} + +public protocol AbstractVoiceConvertible { + func __conversion() throws -> AbstractVoice +} + +extension ElevenLabs.Voice: AbstractVoiceConvertible { + public func __conversion() throws -> AbstractVoice { + return AbstractVoice( + voiceID: self.voiceID, + name: self.name, + description: self.description + ) + } +} + +extension ElevenLabs.Voice: AbstractVoiceInitiable { + public init(voice: AbstractVoice) throws { + self.init( + voiceID: voice.voiceID, + name: voice.name, + description: voice.description, + isOwner: nil + ) + } +} diff --git a/Sources/AI/WIP - Move Somewhere Else/AbstractVoiceSettings.swift b/Sources/AI/WIP - Move Somewhere Else/AbstractVoiceSettings.swift new file mode 100644 index 00000000..76052981 --- /dev/null +++ b/Sources/AI/WIP - Move Somewhere Else/AbstractVoiceSettings.swift @@ -0,0 +1,147 @@ +// +// VoiceStore.swift +// Voice +// +// Created by Jared Davidson on 10/30/24. +// + +import SwiftUIZ +import CorePersistence +import ElevenLabs + +public struct AbstractVoiceSettings: Codable, Sendable, Initiable { + public init() { + self.init(stability: 1.0) + } + + + public enum Setting: String, Codable, Sendable { + case stability + case similarityBoost = "similarity_boost" + case styleExaggeration = "style" + case speakerBoost = "use_speaker_boost" + } + + /// Increasing stability will make the voice more consistent between re-generations, but it can also make it sounds a bit monotone. On longer text fragments it is recommended to lower this value. + /// This is a double between 0 (more variable) and 1 (more stable). + public var stability: Double + + /// Increasing the Similarity Boost setting enhances the overall voice clarity and targets speaker similarity. However, very high values can cause artifacts, so it is recommended to adjust this setting to find the optimal value. + /// This is a double between 0 (Low) and 1 (High). + public var similarityBoost: Double + + /// High values are recommended if the style of the speech should be exaggerated compared to the selected voice. Higher values can lead to more instability in the generated speech. Setting this to 0 will greatly increase generation speed and is the default setting. + public var styleExaggeration: Double + + /// Boost the similarity of the synthesized speech and the voice at the cost of some generation speed. + public var speakerBoost: Bool + + public var removeBackgroundNoise: Bool + + public init(stability: Double, + similarityBoost: Double, + styleExaggeration: Double, + speakerBoost: Bool, + removeBackgroundNoise: Bool) { + self.stability = max(0, min(1, stability)) + self.similarityBoost = max(0, min(1, similarityBoost)) + self.styleExaggeration = max(0, min(1, styleExaggeration)) + self.speakerBoost = speakerBoost + self.removeBackgroundNoise = removeBackgroundNoise + } + + public init(stability: Double? = nil, + similarityBoost: Double? = nil, + styleExaggeration: Double? = nil, + speakerBoost: Bool? = nil, + removeBackgroundNoise: Bool? = nil) { + self.stability = stability.map { max(0, min(1, $0)) } ?? 0.5 + self.similarityBoost = similarityBoost.map { max(0, min(1, $0)) } ?? 0.75 + self.styleExaggeration = styleExaggeration.map { max(0, min(1, $0)) } ?? 0 + self.speakerBoost = speakerBoost ?? true + self.removeBackgroundNoise = removeBackgroundNoise ?? false + } + + public init(stability: Double) { + self.init( + stability: stability, + similarityBoost: 0.75, + styleExaggeration: 0, + speakerBoost: true, + removeBackgroundNoise: false + ) + } + + public init(similarityBoost: Double) { + self.init( + stability: 0.5, + similarityBoost: similarityBoost, + styleExaggeration: 0, + speakerBoost: true, + removeBackgroundNoise: false + ) + } + + public init(styleExaggeration: Double) { + self.init( + stability: 0.5, + similarityBoost: 0.75, + styleExaggeration: styleExaggeration, + speakerBoost: true, + removeBackgroundNoise: false + ) + } + + public init(speakerBoost: Bool) { + self.init( + stability: 0.5, + similarityBoost: 0.75, + styleExaggeration: 0, + speakerBoost: speakerBoost, + removeBackgroundNoise: false + ) + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + + try container.encode(stability, forKey: .stability) + try container.encode(similarityBoost, forKey: .similarityBoost) + try container.encode(styleExaggeration, forKey: .styleExaggeration) + try container.encode(speakerBoost, forKey: .speakerBoost) + try container.encode(removeBackgroundNoise, forKey: .removeBackgroundNoise) + } +} + + +public protocol AbstractVoiceSettingsInitiable { + init(settings: AbstractVoiceSettings) throws +} + +public protocol AbstractVoiceSettingsConvertible { + func __conversion() throws -> AbstractVoiceSettings +} + +extension ElevenLabs.VoiceSettings: AbstractVoiceSettingsConvertible { + public func __conversion() throws -> AbstractVoiceSettings { + return .init( + stability: stability, + similarityBoost: similarityBoost, + styleExaggeration: styleExaggeration, + speakerBoost: speakerBoost, + removeBackgroundNoise: removeBackgroundNoise + ) + } +} + +extension ElevenLabs.VoiceSettings: AbstractVoiceSettingsInitiable { + public init(settings: AbstractVoiceSettings) throws { + self.init( + stability: settings.stability, + similarityBoost: settings.similarityBoost, + styleExaggeration: settings.styleExaggeration, + speakerBoost: settings.speakerBoost, + removeBackgroundNoise: settings.removeBackgroundNoise + ) + } +} diff --git a/Sources/AI/WIP - Move Somewhere Else/SpeechSynthesisRequestHandling.swift b/Sources/AI/WIP - Move Somewhere Else/SpeechSynthesisRequestHandling.swift new file mode 100644 index 00000000..43ac0d9c --- /dev/null +++ b/Sources/AI/WIP - Move Somewhere Else/SpeechSynthesisRequestHandling.swift @@ -0,0 +1,70 @@ +// +// SpeechSynthesisRequestHandling.swift +// Voice +// +// Created by Jared Davidson on 10/30/24. +// + +import Foundation +import AI +import ElevenLabs +import PlayHT +import SwiftUI + +public protocol SpeechToSpeechRequest { + +} + +public protocol SpeechToSpeechRequestHandling { + +} + +public protocol SpeechSynthesisRequestHandling { + func availableVoices() async throws -> [ElevenLabs.Voice] + + func speech( + for text: String, + voiceID: String, + voiceSettings: ElevenLabs.VoiceSettings, + model: ElevenLabs.Model + ) async throws -> Data + + func speechToSpeech( + inputAudioURL: URL, + voiceID: String, + voiceSettings: ElevenLabs.VoiceSettings, + model: ElevenLabs.Model + ) async throws -> Data + + func upload( + voiceWithName name: String, + description: String, + fileURL: URL + ) async throws -> ElevenLabs.Voice.ID + + func edit( + voice: ElevenLabs.Voice.ID, + name: String, + description: String, + fileURL: URL? + ) async throws -> Bool + + func delete(voice: ElevenLabs.Voice.ID) async throws +} + +// MARK: - Environment Key + +private struct ElevenLabsClientKey: EnvironmentKey { + static let defaultValue: (any SpeechSynthesisRequestHandling)? = ElevenLabs.Client(apiKey: "") +} + +extension EnvironmentValues { + var speechSynthesizer: (any SpeechSynthesisRequestHandling)? { + get { self[ElevenLabsClientKey.self] } + set { self[ElevenLabsClientKey.self] = newValue } + } +} + +// MARK: - Conformances + +extension ElevenLabs.Client: SpeechSynthesisRequestHandling {} diff --git a/Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.FrameRate.swift b/Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.FrameRate.swift new file mode 100644 index 00000000..da61c5dd --- /dev/null +++ b/Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.FrameRate.swift @@ -0,0 +1,16 @@ +// +// Copyright (c) Preternatural AI, Inc. +// + +import Foundation + +extension VideoGenerationSettings { + public enum FrameRate: Int, Codable, CaseIterable { + case fps8 = 8 + case fps16 = 16 + case fps24 = 24 + case fps30 = 30 + + public var fps: Int { rawValue } + } +} diff --git a/Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.MotionSettings.swift b/Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.MotionSettings.swift new file mode 100644 index 00000000..addec423 --- /dev/null +++ b/Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.MotionSettings.swift @@ -0,0 +1,23 @@ +// +// Copyright (c) Preternatural AI, Inc. +// + +import Foundation + +extension VideoGenerationSettings { + public struct MotionSettings: Codable, Hashable { + public var stabilize: Bool + public var motionBucketId: Int // 0-127 + public var conditioningAugmentation: Double // 0.01-0.1 + + public init( + stabilize: Bool = true, + motionBucketId: Int = 127, + conditioningAugmentation: Double = 0.02 + ) { + self.stabilize = stabilize + self.motionBucketId = max(0, min(127, motionBucketId)) + self.conditioningAugmentation = max(0.01, min(0.1, conditioningAugmentation)) + } + } +} diff --git a/Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.Quality.swift b/Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.Quality.swift new file mode 100644 index 00000000..bc3516a1 --- /dev/null +++ b/Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.Quality.swift @@ -0,0 +1,29 @@ +// +// Copyright (c) Preternatural AI, Inc. +// + +import Foundation + +extension VideoGenerationSettings { + public enum Quality: String, Codable, CaseIterable { + case draft = "draft" // 20 steps + case fast = "fast" // 30 steps + case balanced = "balanced" // 35 steps + case quality = "quality" // 40 steps + case max = "max" // 50 steps + + var inferenceSteps: Int { + switch self { + case .draft: return 20 + case .fast: return 30 + case .balanced: return 35 + case .quality: return 40 + case .max: return 50 + } + } + + var qualityValue: Double { + Double(inferenceSteps - 20) / 30 + } + } +} diff --git a/Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.Resolution.swift b/Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.Resolution.swift new file mode 100644 index 00000000..a140a046 --- /dev/null +++ b/Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.Resolution.swift @@ -0,0 +1,163 @@ +// +// Copyright (c) Preternatural AI, Inc. +// + +import Foundation + +extension VideoGenerationSettings { + public enum Resolution: Codable, Hashable { + // Square Resolutions + case sd512x512 + case sd768x768 + case sd1024x1024 + + // Landscape HD Resolutions + case hd720p // 1280x720 + case hd1080p // 1920x1080 + case hd1440p // 2560x1440 + case uhd4k // 3840x2160 + + // Social Media Formats + case instagram // 1080x1080 + case story // 1080x1920 + case tiktok // 1080x1920 + case youtube // 1920x1080 + + // Custom Resolution + case custom(width: Int, height: Int) + + public static var allCases: [Resolution] { + [ + .sd512x512, .sd768x768, .sd1024x1024, + .hd720p, .hd1080p, .hd1440p, .uhd4k, + .instagram, .story, .tiktok, .youtube + ] + } + + public var dimensions: (width: Int, height: Int) { + switch self { + // Square Resolutions + case .sd512x512: + return (512, 512) + case .sd768x768: + return (768, 768) + case .sd1024x1024: + return (1024, 1024) + + // Landscape HD Resolutions + case .hd720p: + return (1280, 720) + case .hd1080p: + return (1920, 1080) + case .hd1440p: + return (2560, 1440) + case .uhd4k: + return (3840, 2160) + + // Social Media Formats + case .instagram: + return (1080, 1080) + case .story: + return (1080, 1920) + case .tiktok: + return (1080, 1920) + case .youtube: + return (1920, 1080) + + case .custom(let width, let height): + return (width, height) + } + } + + public var width: Int { dimensions.width } + public var height: Int { dimensions.height } + + public var aspectRatio: String { + let gcd = calculateGCD(width, height) + let simplifiedWidth = width / gcd + let simplifiedHeight = height / gcd + + // Check for common aspect ratios + switch (simplifiedWidth, simplifiedHeight) { + case (1, 1): return "1:1" // Square + case (16, 9): return "16:9" // Standard Widescreen + case (9, 16): return "9:16" // Vertical/Portrait + case (4, 3): return "4:3" // Traditional TV + case (21, 9): return "21:9" // Ultrawide + default: return "\(simplifiedWidth):\(simplifiedHeight)" + } + } + + public var resolution: String { + switch self { + case .uhd4k: + return "4K" + case .hd1440p: + return "1440p" + case .hd1080p, .youtube: + return "1080p" + case .hd720p: + return "720p" + case .instagram, .story, .tiktok: + return "1080p" + case .sd512x512: + return "512p" + case .sd768x768: + return "768p" + case .sd1024x1024: + return "1024p" + case .custom(let width, _): + if width >= 3840 { return "4K" } + if width >= 2560 { return "1440p" } + if width >= 1920 { return "1080p" } + if width >= 1280 { return "720p" } + return "\(width)p" + } + } + + public static func detectResolution(width: Int, height: Int) -> Resolution { + switch (width, height) { + case (512, 512): return .sd512x512 + case (768, 768): return .sd768x768 + case (1024, 1024): return .sd1024x1024 + case (1280, 720): return .hd720p + case (1920, 1080): return .hd1080p + case (2560, 1440): return .hd1440p + case (3840, 2160): return .uhd4k + case (1080, 1080): return .instagram + case (1080, 1920): return .story + default: return .custom(width: width, height: height) + } + } + + private func calculateGCD(_ a: Int, _ b: Int) -> Int { + var a = a + var b = b + while b != 0 { + let temp = b + b = a % b + a = temp + } + + return a + } + + public var displayName: String { + switch self { + case .sd512x512: return "512Γ—512" + case .sd768x768: return "768Γ—768" + case .sd1024x1024: return "1024Γ—1024" + case .hd720p: return "HD 720p" + case .hd1080p: return "Full HD 1080p" + case .hd1440p: return "QHD 1440p" + case .uhd4k: return "4K UHD" + case .instagram: return "Instagram Square" + case .story: return "Instagram/TikTok Story" + case .tiktok: return "TikTok Video" + case .youtube: return "YouTube HD" + case .custom(let width, let height): + return "\(width)Γ—\(height)" + } + } + } +} diff --git a/Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.StyleStrength.swift b/Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.StyleStrength.swift new file mode 100644 index 00000000..6a75ff9b --- /dev/null +++ b/Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.StyleStrength.swift @@ -0,0 +1,27 @@ +// +// Copyright (c) Preternatural AI, Inc. +// + +import Foundation + +extension VideoGenerationSettings { + public enum StyleStrength: String, Codable, CaseIterable { + case subtle = "subtle" // 1-5 + case balanced = "balanced" // 5-10 + case strong = "strong" // 10-15 + case extreme = "extreme" // 15-20 + + var guidanceScale: Double { + switch self { + case .subtle: return 3.0 + case .balanced: return 7.5 + case .strong: return 12.5 + case .extreme: return 17.5 + } + } + + var strengthValue: Double { + (guidanceScale - 1) / 19 + } + } +} diff --git a/Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.swift b/Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.swift new file mode 100644 index 00000000..1c8d7314 --- /dev/null +++ b/Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.swift @@ -0,0 +1,43 @@ +// +// Copyright (c) Preternatural AI, Inc. +// + +import Foundation + +public struct VideoGenerationSettings: Codable, Hashable { + /// Duration of the generated video in seconds (1-60) + public var duration: Double { + didSet { + duration = max(1, min(60, duration)) + } + } + + public var resolution: Resolution + public var frameRate: FrameRate + public var quality: Quality + public var styleStrength: StyleStrength + public var motion: MotionSettings + public var negativePrompt: String + + public var fps: Int { frameRate.fps } + public var numInferenceSteps: Int { quality.inferenceSteps } + public var guidanceScale: Double { styleStrength.guidanceScale } + + public init( + duration: Double = 10.0, + resolution: Resolution = .sd512x512, + frameRate: FrameRate = .fps24, + quality: Quality = .balanced, + styleStrength: StyleStrength = .balanced, + motion: MotionSettings = MotionSettings(), + negativePrompt: String = "" + ) { + self.duration = max(1, min(60, duration)) + self.resolution = resolution + self.frameRate = frameRate + self.quality = quality + self.styleStrength = styleStrength + self.motion = motion + self.negativePrompt = negativePrompt + } +} diff --git a/Sources/AI/WIP - Move Somewhere Else/VideoGenerationRequestHandling.swift b/Sources/AI/WIP - Move Somewhere Else/VideoGenerationRequestHandling.swift new file mode 100644 index 00000000..f8ea8566 --- /dev/null +++ b/Sources/AI/WIP - Move Somewhere Else/VideoGenerationRequestHandling.swift @@ -0,0 +1,41 @@ +// +// Copyright (c) Preternatural AI, Inc. +// + +import AVFoundation +import Foundation +import SwiftUI + +public protocol VideoGenerationRequestHandling { + func availableModels() async throws -> [VideoModel] + + func textToVideo( + text: String, + model: VideoModel, + settings: VideoGenerationSettings + ) async throws -> Data + + func imageToVideo( + imageURL: URL, + model: VideoModel, + settings: VideoGenerationSettings + ) async throws -> Data + + func videoToVideo( + videoURL: URL, + prompt: String, + model: VideoModel, + settings: VideoGenerationSettings + ) async throws -> Data +} + +private struct VideoGeneratorKey: EnvironmentKey { + static let defaultValue: (any VideoGenerationRequestHandling)? = DummyVideoGenerator() +} + +extension EnvironmentValues { + var videoClient: (any VideoGenerationRequestHandling)? { + get { self[VideoGeneratorKey.self] } + set { self[VideoGeneratorKey.self] = newValue } + } +} diff --git a/Sources/AI/WIP - Move Somewhere Else/VideoModel.swift b/Sources/AI/WIP - Move Somewhere Else/VideoModel.swift new file mode 100644 index 00000000..ed63bae8 --- /dev/null +++ b/Sources/AI/WIP - Move Somewhere Else/VideoModel.swift @@ -0,0 +1,35 @@ +// +// Copyright (c) Preternatural AI, Inc. +// + +import CorePersistence +import Foundation + +public struct VideoModel: Codable, Hashable, Identifiable { + public typealias ID = _TypeAssociatedID + + public let id: ID + public let endpoint: String + public let name: String + public let description: String? + public let capabilities: [Capability] + + public enum Capability: String, Codable { + case textToVideo + case imageToVideo + case videoToVideo + } + + public init( + endpoint: String, + name: String, + description: String?, + capabilities: [Capability] + ) { + self.id = .random() + self.endpoint = endpoint + self.name = name + self.description = description + self.capabilities = capabilities + } +} From 7541d4d644f1f86ae9ebfa933f274c74f2a4cce3 Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Fri, 10 Jan 2025 13:32:50 -0700 Subject: [PATCH 057/271] Building again --- .../AI/WIP - Move Somewhere Else/AbstractVoiceSettings.swift | 2 +- .../SpeechSynthesisRequestHandling.swift | 2 +- .../VideoGenerationSettings.Quality.swift | 4 ++-- .../VideoGenerationSettings.StyleStrength.swift | 4 ++-- .../Video Generation Setttings/VideoGenerationSettings.swift | 2 +- .../VideoGenerationRequestHandling.swift | 4 ++-- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Sources/AI/WIP - Move Somewhere Else/AbstractVoiceSettings.swift b/Sources/AI/WIP - Move Somewhere Else/AbstractVoiceSettings.swift index 76052981..d6f87dc5 100644 --- a/Sources/AI/WIP - Move Somewhere Else/AbstractVoiceSettings.swift +++ b/Sources/AI/WIP - Move Somewhere Else/AbstractVoiceSettings.swift @@ -9,7 +9,7 @@ import SwiftUIZ import CorePersistence import ElevenLabs -public struct AbstractVoiceSettings: Codable, Sendable, Initiable { +public struct AbstractVoiceSettings: Codable, Sendable, Initiable, Equatable { public init() { self.init(stability: 1.0) } diff --git a/Sources/AI/WIP - Move Somewhere Else/SpeechSynthesisRequestHandling.swift b/Sources/AI/WIP - Move Somewhere Else/SpeechSynthesisRequestHandling.swift index 43ac0d9c..d6e9f590 100644 --- a/Sources/AI/WIP - Move Somewhere Else/SpeechSynthesisRequestHandling.swift +++ b/Sources/AI/WIP - Move Somewhere Else/SpeechSynthesisRequestHandling.swift @@ -59,7 +59,7 @@ private struct ElevenLabsClientKey: EnvironmentKey { } extension EnvironmentValues { - var speechSynthesizer: (any SpeechSynthesisRequestHandling)? { + public var speechSynthesizer: (any SpeechSynthesisRequestHandling)? { get { self[ElevenLabsClientKey.self] } set { self[ElevenLabsClientKey.self] = newValue } } diff --git a/Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.Quality.swift b/Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.Quality.swift index bc3516a1..5ce0de27 100644 --- a/Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.Quality.swift +++ b/Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.Quality.swift @@ -12,7 +12,7 @@ extension VideoGenerationSettings { case quality = "quality" // 40 steps case max = "max" // 50 steps - var inferenceSteps: Int { + public var inferenceSteps: Int { switch self { case .draft: return 20 case .fast: return 30 @@ -22,7 +22,7 @@ extension VideoGenerationSettings { } } - var qualityValue: Double { + public var qualityValue: Double { Double(inferenceSteps - 20) / 30 } } diff --git a/Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.StyleStrength.swift b/Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.StyleStrength.swift index 6a75ff9b..1fdc10af 100644 --- a/Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.StyleStrength.swift +++ b/Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.StyleStrength.swift @@ -11,7 +11,7 @@ extension VideoGenerationSettings { case strong = "strong" // 10-15 case extreme = "extreme" // 15-20 - var guidanceScale: Double { + public var guidanceScale: Double { switch self { case .subtle: return 3.0 case .balanced: return 7.5 @@ -20,7 +20,7 @@ extension VideoGenerationSettings { } } - var strengthValue: Double { + public var strengthValue: Double { (guidanceScale - 1) / 19 } } diff --git a/Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.swift b/Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.swift index 1c8d7314..81a72cfb 100644 --- a/Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.swift +++ b/Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.swift @@ -4,7 +4,7 @@ import Foundation -public struct VideoGenerationSettings: Codable, Hashable { +public struct VideoGenerationSettings: Codable, Hashable, Equatable { /// Duration of the generated video in seconds (1-60) public var duration: Double { didSet { diff --git a/Sources/AI/WIP - Move Somewhere Else/VideoGenerationRequestHandling.swift b/Sources/AI/WIP - Move Somewhere Else/VideoGenerationRequestHandling.swift index f8ea8566..9a6ed8e8 100644 --- a/Sources/AI/WIP - Move Somewhere Else/VideoGenerationRequestHandling.swift +++ b/Sources/AI/WIP - Move Somewhere Else/VideoGenerationRequestHandling.swift @@ -30,11 +30,11 @@ public protocol VideoGenerationRequestHandling { } private struct VideoGeneratorKey: EnvironmentKey { - static let defaultValue: (any VideoGenerationRequestHandling)? = DummyVideoGenerator() + public static let defaultValue: (any VideoGenerationRequestHandling)? = nil } extension EnvironmentValues { - var videoClient: (any VideoGenerationRequestHandling)? { + public var videoClient: (any VideoGenerationRequestHandling)? { get { self[VideoGeneratorKey.self] } set { self[VideoGeneratorKey.self] = newValue } } From 9497758347534aadcba256c68f720263f45383bf Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Fri, 10 Jan 2025 17:29:29 -0700 Subject: [PATCH 058/271] Working --- .../SpeechSynthesisRequestHandling.swift | 30 ++++++++++++++++++- .../VideoGenerationRequestHandling.swift | 28 +++++++++++++++++ .../API/ElevenLabs.APISpecification.swift | 3 -- .../Intramodular/ElevenLabs.Client.swift | 25 +++++++++++++++- 4 files changed, 81 insertions(+), 5 deletions(-) diff --git a/Sources/AI/WIP - Move Somewhere Else/SpeechSynthesisRequestHandling.swift b/Sources/AI/WIP - Move Somewhere Else/SpeechSynthesisRequestHandling.swift index d6e9f590..54f9e853 100644 --- a/Sources/AI/WIP - Move Somewhere Else/SpeechSynthesisRequestHandling.swift +++ b/Sources/AI/WIP - Move Somewhere Else/SpeechSynthesisRequestHandling.swift @@ -19,7 +19,7 @@ public protocol SpeechToSpeechRequestHandling { } -public protocol SpeechSynthesisRequestHandling { +public protocol SpeechSynthesisRequestHandling: AnyObject { func availableVoices() async throws -> [ElevenLabs.Voice] func speech( @@ -68,3 +68,31 @@ extension EnvironmentValues { // MARK: - Conformances extension ElevenLabs.Client: SpeechSynthesisRequestHandling {} + + +public struct AnySpeechSynthesisRequestHandling: Hashable { + private let _service: any CoreMI._ServiceClientProtocol + private let _base: any SpeechSynthesisRequestHandling + private let _hashValue: Int + + public init( + _ base: any SpeechSynthesisRequestHandling, + service: any CoreMI._ServiceClientProtocol + ) { + self._base = base + self._hashValue = ObjectIdentifier(base as AnyObject).hashValue + self._service = service + } + + public static func == (lhs: AnySpeechSynthesisRequestHandling, rhs: AnySpeechSynthesisRequestHandling) -> Bool { + lhs._hashValue == rhs._hashValue + } + + public func hash(into hasher: inout Hasher) { + hasher.combine(_hashValue) + } + + public func base() -> any SpeechSynthesisRequestHandling { + _base + } +} diff --git a/Sources/AI/WIP - Move Somewhere Else/VideoGenerationRequestHandling.swift b/Sources/AI/WIP - Move Somewhere Else/VideoGenerationRequestHandling.swift index 9a6ed8e8..8d975397 100644 --- a/Sources/AI/WIP - Move Somewhere Else/VideoGenerationRequestHandling.swift +++ b/Sources/AI/WIP - Move Somewhere Else/VideoGenerationRequestHandling.swift @@ -5,6 +5,7 @@ import AVFoundation import Foundation import SwiftUI +import LargeLanguageModels public protocol VideoGenerationRequestHandling { func availableModels() async throws -> [VideoModel] @@ -39,3 +40,30 @@ extension EnvironmentValues { set { self[VideoGeneratorKey.self] = newValue } } } + +public struct AnyVideoGenerationRequestHandling: Hashable { + private let _service: any CoreMI._ServiceClientProtocol + private let _base: any VideoGenerationRequestHandling + private let _hashValue: Int + + public init( + _ base: any VideoGenerationRequestHandling, + service: any CoreMI._ServiceClientProtocol + ) { + self._base = base + self._hashValue = ObjectIdentifier(base as AnyObject).hashValue + self._service = service + } + + public static func == (lhs: AnyVideoGenerationRequestHandling, rhs: AnyVideoGenerationRequestHandling) -> Bool { + lhs._hashValue == rhs._hashValue + } + + public func hash(into hasher: inout Hasher) { + hasher.combine(_hashValue) + } + + public func base() -> any VideoGenerationRequestHandling { + _base + } +} diff --git a/Sources/ElevenLabs/Intramodular/API/ElevenLabs.APISpecification.swift b/Sources/ElevenLabs/Intramodular/API/ElevenLabs.APISpecification.swift index fa442c34..656255b8 100644 --- a/Sources/ElevenLabs/Intramodular/API/ElevenLabs.APISpecification.swift +++ b/Sources/ElevenLabs/Intramodular/API/ElevenLabs.APISpecification.swift @@ -128,9 +128,6 @@ extension ElevenLabs.APISpecification { context: DecodeOutputContext ) throws -> Output { do { - if Input.self == RequestBodies.EditVoiceInput.self { - print("TEsts") - } try response.validate() } catch { let apiError: Error diff --git a/Sources/ElevenLabs/Intramodular/ElevenLabs.Client.swift b/Sources/ElevenLabs/Intramodular/ElevenLabs.Client.swift index 2093a3ea..6fbc4922 100644 --- a/Sources/ElevenLabs/Intramodular/ElevenLabs.Client.swift +++ b/Sources/ElevenLabs/Intramodular/ElevenLabs.Client.swift @@ -10,10 +10,15 @@ import SwiftAPI import Merge import FoundationX import Swallow +import LargeLanguageModels extension ElevenLabs { @RuntimeDiscoverable public final class Client: SwiftAPI.Client, ObservableObject { + public static var persistentTypeRepresentation: some IdentityRepresentation { + CoreMI._ServiceVendorIdentifier._ElevenLabs + } + public typealias API = ElevenLabs.APISpecification public typealias Session = HTTPSession @@ -33,6 +38,25 @@ extension ElevenLabs { } } +extension ElevenLabs.Client: CoreMI._ServiceClientProtocol { + public convenience init( + account: (any CoreMI._ServiceAccountProtocol)? + ) async throws { + let account: any CoreMI._ServiceAccountProtocol = try account.unwrap() + let serviceVendorIdentifier: CoreMI._ServiceVendorIdentifier = try account.serviceVendorIdentifier.unwrap() + + guard serviceVendorIdentifier == CoreMI._ServiceVendorIdentifier._ElevenLabs else { + throw CoreMI._ServiceClientError.incompatibleVendor(serviceVendorIdentifier) + } + + guard let credential = try account.credential as? CoreMI._ServiceCredentialTypes.APIKeyCredential else { + throw CoreMI._ServiceClientError.invalidCredential(try account.credential) + } + + self.init(apiKey: credential.apiKey) + } +} + extension ElevenLabs.Client { public func availableVoices() async throws -> [ElevenLabs.Voice] { try await run(\.listVoices).voices @@ -50,7 +74,6 @@ extension ElevenLabs.Client { voiceSettings: voiceSettings, model: model ) - return try await run(\.textToSpeech, with: .init(voiceId: voiceID, requestBody: requestBody)) } From fc6e2725c9679513e5665856498d9856dbbf3e00 Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Fri, 10 Jan 2025 19:11:01 -0700 Subject: [PATCH 059/271] Fixes --- .../SpeechSynthesisRequestHandling.swift | 23 +++++++++++-------- .../VideoGenerationRequestHandling.swift | 22 ++++++++++-------- 2 files changed, 25 insertions(+), 20 deletions(-) diff --git a/Sources/AI/WIP - Move Somewhere Else/SpeechSynthesisRequestHandling.swift b/Sources/AI/WIP - Move Somewhere Else/SpeechSynthesisRequestHandling.swift index 54f9e853..725b9e86 100644 --- a/Sources/AI/WIP - Move Somewhere Else/SpeechSynthesisRequestHandling.swift +++ b/Sources/AI/WIP - Move Somewhere Else/SpeechSynthesisRequestHandling.swift @@ -71,17 +71,24 @@ extension ElevenLabs.Client: SpeechSynthesisRequestHandling {} public struct AnySpeechSynthesisRequestHandling: Hashable { - private let _service: any CoreMI._ServiceClientProtocol - private let _base: any SpeechSynthesisRequestHandling private let _hashValue: Int + public let base: any CoreMI._ServiceClientProtocol & SpeechSynthesisRequestHandling + + public var displayName: String { + switch base { + case is ElevenLabs.Client: + return "ElevenLabs" + default: + fatalError() + } + } + public init( - _ base: any SpeechSynthesisRequestHandling, - service: any CoreMI._ServiceClientProtocol + _ base: any CoreMI._ServiceClientProtocol & SpeechSynthesisRequestHandling ) { - self._base = base + self.base = base self._hashValue = ObjectIdentifier(base as AnyObject).hashValue - self._service = service } public static func == (lhs: AnySpeechSynthesisRequestHandling, rhs: AnySpeechSynthesisRequestHandling) -> Bool { @@ -91,8 +98,4 @@ public struct AnySpeechSynthesisRequestHandling: Hashable { public func hash(into hasher: inout Hasher) { hasher.combine(_hashValue) } - - public func base() -> any SpeechSynthesisRequestHandling { - _base - } } diff --git a/Sources/AI/WIP - Move Somewhere Else/VideoGenerationRequestHandling.swift b/Sources/AI/WIP - Move Somewhere Else/VideoGenerationRequestHandling.swift index 8d975397..d9f9ab1c 100644 --- a/Sources/AI/WIP - Move Somewhere Else/VideoGenerationRequestHandling.swift +++ b/Sources/AI/WIP - Move Somewhere Else/VideoGenerationRequestHandling.swift @@ -42,17 +42,23 @@ extension EnvironmentValues { } public struct AnyVideoGenerationRequestHandling: Hashable { - private let _service: any CoreMI._ServiceClientProtocol - private let _base: any VideoGenerationRequestHandling + public let base: any CoreMI._ServiceClientProtocol & VideoGenerationRequestHandling private let _hashValue: Int + +// var displayName: String { +// switch base { +// case is FalVideoGenerationRequestHandling: +// return "Fal" +// default: +// fatalError() +// } +// } public init( - _ base: any VideoGenerationRequestHandling, - service: any CoreMI._ServiceClientProtocol + _ base: any CoreMI._ServiceClientProtocol & VideoGenerationRequestHandling ) { - self._base = base + self.base = base self._hashValue = ObjectIdentifier(base as AnyObject).hashValue - self._service = service } public static func == (lhs: AnyVideoGenerationRequestHandling, rhs: AnyVideoGenerationRequestHandling) -> Bool { @@ -62,8 +68,4 @@ public struct AnyVideoGenerationRequestHandling: Hashable { public func hash(into hasher: inout Hasher) { hasher.combine(_hashValue) } - - public func base() -> any VideoGenerationRequestHandling { - _base - } } From fbc2f1062a265cbea60e5e9c35ae258ebc87f8f7 Mon Sep 17 00:00:00 2001 From: Purav Manot Date: Mon, 13 Jan 2025 16:11:30 +0530 Subject: [PATCH 060/271] Update --- .../SpeechSynthesisRequestHandling.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/Sources/AI/WIP - Move Somewhere Else/SpeechSynthesisRequestHandling.swift b/Sources/AI/WIP - Move Somewhere Else/SpeechSynthesisRequestHandling.swift index 725b9e86..1de670e4 100644 --- a/Sources/AI/WIP - Move Somewhere Else/SpeechSynthesisRequestHandling.swift +++ b/Sources/AI/WIP - Move Somewhere Else/SpeechSynthesisRequestHandling.swift @@ -8,7 +8,6 @@ import Foundation import AI import ElevenLabs -import PlayHT import SwiftUI public protocol SpeechToSpeechRequest { From f74b0f59ef655540d6f6136dea8872455f758d42 Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Tue, 14 Jan 2025 16:11:00 -0700 Subject: [PATCH 061/271] Move files to LargeLanguageModels. Added conformances to individual structs. --- Package.swift | 2 +- .../AnySpeechSynthesisRequestHandling.swift | 39 +++++++ .../SpeechSynthesisRequestHandling.swift | 100 ------------------ .../Intramodular/ElevenLabs.Client.swift | 53 ++++++++++ .../Intramodular/ElevenLabs.Voice.swift | 22 ++++ .../ElevenLabs.VoiceSettings.swift | 27 +++++ .../AbstractVoice.swift | 24 +---- .../AbstractVoiceSettings.swift | 25 ----- .../SpeechSynthesisRequestHandling.swift | 63 +++++++++++ .../VideoGenerationSettings.FrameRate.swift | 0 ...deoGenerationSettings.MotionSettings.swift | 0 .../VideoGenerationSettings.Quality.swift | 0 .../VideoGenerationSettings.Resolution.swift | 0 ...ideoGenerationSettings.StyleStrength.swift | 0 .../VideoGenerationSettings.swift | 0 .../VideoGenerationRequestHandling.swift | 0 .../VideoModel.swift | 0 .../Intramodular/Models/PlayHT.Voice.swift | 57 +++++++++- .../Rime/Intramodular/Models/Rime.Voice.swift | 47 ++++++++ 19 files changed, 309 insertions(+), 150 deletions(-) create mode 100644 Sources/AI/AnySpeechSynthesisRequestHandling.swift delete mode 100644 Sources/AI/WIP - Move Somewhere Else/SpeechSynthesisRequestHandling.swift rename Sources/{AI => LargeLanguageModels/Intramodular}/WIP - Move Somewhere Else/AbstractVoice.swift (60%) rename Sources/{AI => LargeLanguageModels/Intramodular}/WIP - Move Somewhere Else/AbstractVoiceSettings.swift (83%) create mode 100644 Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/SpeechSynthesisRequestHandling.swift rename Sources/{AI => LargeLanguageModels/Intramodular}/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.FrameRate.swift (100%) rename Sources/{AI => LargeLanguageModels/Intramodular}/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.MotionSettings.swift (100%) rename Sources/{AI => LargeLanguageModels/Intramodular}/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.Quality.swift (100%) rename Sources/{AI => LargeLanguageModels/Intramodular}/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.Resolution.swift (100%) rename Sources/{AI => LargeLanguageModels/Intramodular}/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.StyleStrength.swift (100%) rename Sources/{AI => LargeLanguageModels/Intramodular}/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.swift (100%) rename Sources/{AI => LargeLanguageModels/Intramodular}/WIP - Move Somewhere Else/VideoGenerationRequestHandling.swift (100%) rename Sources/{AI => LargeLanguageModels/Intramodular}/WIP - Move Somewhere Else/VideoModel.swift (100%) diff --git a/Package.swift b/Package.swift index a374aaf0..f731cfd7 100644 --- a/Package.swift +++ b/Package.swift @@ -115,7 +115,7 @@ let package = Package( "Merge", "NetworkKit", "Swallow", - "SwiftUIX", + "SwiftUIX" ], path: "Sources/LargeLanguageModels", resources: [ diff --git a/Sources/AI/AnySpeechSynthesisRequestHandling.swift b/Sources/AI/AnySpeechSynthesisRequestHandling.swift new file mode 100644 index 00000000..18dce27e --- /dev/null +++ b/Sources/AI/AnySpeechSynthesisRequestHandling.swift @@ -0,0 +1,39 @@ +// +// AnySpeechSynthesisRequestHandling.swift +// AI +// +// Created by Jared Davidson on 1/14/25. +// + +import ElevenLabs +import LargeLanguageModels + +public struct AnySpeechSynthesisRequestHandling: Hashable { + private let _hashValue: Int + + public let base: any CoreMI._ServiceClientProtocol & SpeechSynthesisRequestHandling + + public var displayName: String { + switch base { + case is ElevenLabs.Client: + return "ElevenLabs" + default: + fatalError() + } + } + + public init( + _ base: any CoreMI._ServiceClientProtocol & SpeechSynthesisRequestHandling + ) { + self.base = base + self._hashValue = ObjectIdentifier(base as AnyObject).hashValue + } + + public static func == (lhs: AnySpeechSynthesisRequestHandling, rhs: AnySpeechSynthesisRequestHandling) -> Bool { + lhs._hashValue == rhs._hashValue + } + + public func hash(into hasher: inout Hasher) { + hasher.combine(_hashValue) + } +} diff --git a/Sources/AI/WIP - Move Somewhere Else/SpeechSynthesisRequestHandling.swift b/Sources/AI/WIP - Move Somewhere Else/SpeechSynthesisRequestHandling.swift deleted file mode 100644 index 1de670e4..00000000 --- a/Sources/AI/WIP - Move Somewhere Else/SpeechSynthesisRequestHandling.swift +++ /dev/null @@ -1,100 +0,0 @@ -// -// SpeechSynthesisRequestHandling.swift -// Voice -// -// Created by Jared Davidson on 10/30/24. -// - -import Foundation -import AI -import ElevenLabs -import SwiftUI - -public protocol SpeechToSpeechRequest { - -} - -public protocol SpeechToSpeechRequestHandling { - -} - -public protocol SpeechSynthesisRequestHandling: AnyObject { - func availableVoices() async throws -> [ElevenLabs.Voice] - - func speech( - for text: String, - voiceID: String, - voiceSettings: ElevenLabs.VoiceSettings, - model: ElevenLabs.Model - ) async throws -> Data - - func speechToSpeech( - inputAudioURL: URL, - voiceID: String, - voiceSettings: ElevenLabs.VoiceSettings, - model: ElevenLabs.Model - ) async throws -> Data - - func upload( - voiceWithName name: String, - description: String, - fileURL: URL - ) async throws -> ElevenLabs.Voice.ID - - func edit( - voice: ElevenLabs.Voice.ID, - name: String, - description: String, - fileURL: URL? - ) async throws -> Bool - - func delete(voice: ElevenLabs.Voice.ID) async throws -} - -// MARK: - Environment Key - -private struct ElevenLabsClientKey: EnvironmentKey { - static let defaultValue: (any SpeechSynthesisRequestHandling)? = ElevenLabs.Client(apiKey: "") -} - -extension EnvironmentValues { - public var speechSynthesizer: (any SpeechSynthesisRequestHandling)? { - get { self[ElevenLabsClientKey.self] } - set { self[ElevenLabsClientKey.self] = newValue } - } -} - -// MARK: - Conformances - -extension ElevenLabs.Client: SpeechSynthesisRequestHandling {} - - -public struct AnySpeechSynthesisRequestHandling: Hashable { - private let _hashValue: Int - - public let base: any CoreMI._ServiceClientProtocol & SpeechSynthesisRequestHandling - - public var displayName: String { - switch base { - case is ElevenLabs.Client: - return "ElevenLabs" - default: - fatalError() - } - } - - public init( - _ base: any CoreMI._ServiceClientProtocol & SpeechSynthesisRequestHandling - ) { - self.base = base - self._hashValue = ObjectIdentifier(base as AnyObject).hashValue - } - - public static func == (lhs: AnySpeechSynthesisRequestHandling, rhs: AnySpeechSynthesisRequestHandling) -> Bool { - lhs._hashValue == rhs._hashValue - } - - public func hash(into hasher: inout Hasher) { - hasher.combine(_hashValue) - } -} diff --git a/Sources/ElevenLabs/Intramodular/ElevenLabs.Client.swift b/Sources/ElevenLabs/Intramodular/ElevenLabs.Client.swift index 6fbc4922..2d7a03b6 100644 --- a/Sources/ElevenLabs/Intramodular/ElevenLabs.Client.swift +++ b/Sources/ElevenLabs/Intramodular/ElevenLabs.Client.swift @@ -130,3 +130,56 @@ extension ElevenLabs.Client { try await run(\.deleteVoice, with: voice.rawValue) } } + +// MARK: - Conformances + +extension ElevenLabs.Client: SpeechSynthesisRequestHandling { + public func availableVoices() async throws -> [AbstractVoice] { + return try await self.availableVoices().map({try $0.__conversion()}) + } + + public func speech(for text: String, voiceID: String, voiceSettings: AbstractVoiceSettings, model: String) async throws -> Data { + try await self.speech( + for: text, + voiceID: voiceID, + voiceSettings: .init(settings: voiceSettings), + model: .init(rawValue: model) ?? .MultilingualV1 + ) + } + + public func speechToSpeech(inputAudioURL: URL, voiceID: String, voiceSettings: AbstractVoiceSettings, model: String) async throws -> Data { + try await self.speechToSpeech( + inputAudioURL: inputAudioURL, + voiceID: voiceID, + voiceSettings: .init(settings: voiceSettings), + model: .init(rawValue: model) ?? .MultilingualV1 + ) + } + + public func upload(voiceWithName name: String, description: String, fileURL: URL) async throws -> AbstractVoice.ID { + let voice: ElevenLabs.Voice.ID = try await self.upload( + voiceWithName: name, + description: description, + fileURL: fileURL + ) + + return .init(rawValue: voice.rawValue) + } + + public func edit(voice: AbstractVoice.ID, name: String, description: String, fileURL: URL?) async throws -> Bool { + try await self.edit( + voice: ElevenLabs.Voice.ID(rawValue: voice.rawValue), + name: name, + description: description, + fileURL: fileURL + ) + } + + public func delete(voice: AbstractVoice.ID) async throws { + try await self.delete( + voice: ElevenLabs.Voice.ID( + rawValue: voice.rawValue + ) + ) + } +} diff --git a/Sources/ElevenLabs/Intramodular/ElevenLabs.Voice.swift b/Sources/ElevenLabs/Intramodular/ElevenLabs.Voice.swift index 3a54532f..dbe29d63 100644 --- a/Sources/ElevenLabs/Intramodular/ElevenLabs.Voice.swift +++ b/Sources/ElevenLabs/Intramodular/ElevenLabs.Voice.swift @@ -4,6 +4,7 @@ import Foundation import Swift +import LargeLanguageModels extension ElevenLabs { public struct Voice: Hashable, Identifiable, Sendable { @@ -42,3 +43,24 @@ extension ElevenLabs.Voice: Codable { case isOwner } } + +extension ElevenLabs.Voice: AbstractVoiceConvertible { + public func __conversion() throws -> AbstractVoice { + return AbstractVoice( + voiceID: self.voiceID, + name: self.name, + description: self.description + ) + } +} + +extension ElevenLabs.Voice: AbstractVoiceInitiable { + public init(voice: AbstractVoice) throws { + self.init( + voiceID: voice.voiceID, + name: voice.name, + description: voice.description, + isOwner: nil + ) + } +} diff --git a/Sources/ElevenLabs/Intramodular/ElevenLabs.VoiceSettings.swift b/Sources/ElevenLabs/Intramodular/ElevenLabs.VoiceSettings.swift index 1ffb7947..f0a6b825 100644 --- a/Sources/ElevenLabs/Intramodular/ElevenLabs.VoiceSettings.swift +++ b/Sources/ElevenLabs/Intramodular/ElevenLabs.VoiceSettings.swift @@ -3,6 +3,7 @@ // import Foundation +import LargeLanguageModels extension ElevenLabs { public struct VoiceSettings: Codable, Sendable, Hashable { @@ -98,3 +99,29 @@ extension ElevenLabs.VoiceSettings { ) } } + +// MARK: - Conformances + +extension ElevenLabs.VoiceSettings: AbstractVoiceSettingsConvertible { + public func __conversion() throws -> AbstractVoiceSettings { + return .init( + stability: stability, + similarityBoost: similarityBoost, + styleExaggeration: styleExaggeration, + speakerBoost: speakerBoost, + removeBackgroundNoise: removeBackgroundNoise + ) + } +} + +extension ElevenLabs.VoiceSettings: AbstractVoiceSettingsInitiable { + public init(settings: AbstractVoiceSettings) throws { + self.init( + stability: settings.stability, + similarityBoost: settings.similarityBoost, + styleExaggeration: settings.styleExaggeration, + speakerBoost: settings.speakerBoost, + removeBackgroundNoise: settings.removeBackgroundNoise + ) + } +} diff --git a/Sources/AI/WIP - Move Somewhere Else/AbstractVoice.swift b/Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/AbstractVoice.swift similarity index 60% rename from Sources/AI/WIP - Move Somewhere Else/AbstractVoice.swift rename to Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/AbstractVoice.swift index ff7dfc11..80de4232 100644 --- a/Sources/AI/WIP - Move Somewhere Else/AbstractVoice.swift +++ b/Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/AbstractVoice.swift @@ -9,7 +9,6 @@ import CorePersistence import SwiftUI import AVFoundation import UniformTypeIdentifiers -import ElevenLabs public struct AbstractVoice: Codable, Hashable, Identifiable, Sendable { public typealias ID = _TypeAssociatedID @@ -19,7 +18,7 @@ public struct AbstractVoice: Codable, Hashable, Identifiable, Sendable { public let name: String public let description: String? - init( + public init( voiceID: String, name: String, description: String? @@ -40,24 +39,3 @@ public protocol AbstractVoiceInitiable { public protocol AbstractVoiceConvertible { func __conversion() throws -> AbstractVoice } - -extension ElevenLabs.Voice: AbstractVoiceConvertible { - public func __conversion() throws -> AbstractVoice { - return AbstractVoice( - voiceID: self.voiceID, - name: self.name, - description: self.description - ) - } -} - -extension ElevenLabs.Voice: AbstractVoiceInitiable { - public init(voice: AbstractVoice) throws { - self.init( - voiceID: voice.voiceID, - name: voice.name, - description: voice.description, - isOwner: nil - ) - } -} diff --git a/Sources/AI/WIP - Move Somewhere Else/AbstractVoiceSettings.swift b/Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/AbstractVoiceSettings.swift similarity index 83% rename from Sources/AI/WIP - Move Somewhere Else/AbstractVoiceSettings.swift rename to Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/AbstractVoiceSettings.swift index d6f87dc5..34fd03b6 100644 --- a/Sources/AI/WIP - Move Somewhere Else/AbstractVoiceSettings.swift +++ b/Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/AbstractVoiceSettings.swift @@ -7,7 +7,6 @@ import SwiftUIZ import CorePersistence -import ElevenLabs public struct AbstractVoiceSettings: Codable, Sendable, Initiable, Equatable { public init() { @@ -121,27 +120,3 @@ public protocol AbstractVoiceSettingsInitiable { public protocol AbstractVoiceSettingsConvertible { func __conversion() throws -> AbstractVoiceSettings } - -extension ElevenLabs.VoiceSettings: AbstractVoiceSettingsConvertible { - public func __conversion() throws -> AbstractVoiceSettings { - return .init( - stability: stability, - similarityBoost: similarityBoost, - styleExaggeration: styleExaggeration, - speakerBoost: speakerBoost, - removeBackgroundNoise: removeBackgroundNoise - ) - } -} - -extension ElevenLabs.VoiceSettings: AbstractVoiceSettingsInitiable { - public init(settings: AbstractVoiceSettings) throws { - self.init( - stability: settings.stability, - similarityBoost: settings.similarityBoost, - styleExaggeration: settings.styleExaggeration, - speakerBoost: settings.speakerBoost, - removeBackgroundNoise: settings.removeBackgroundNoise - ) - } -} diff --git a/Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/SpeechSynthesisRequestHandling.swift b/Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/SpeechSynthesisRequestHandling.swift new file mode 100644 index 00000000..e8bec05c --- /dev/null +++ b/Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/SpeechSynthesisRequestHandling.swift @@ -0,0 +1,63 @@ +// +// SpeechSynthesisRequestHandling.swift +// Voice +// +// Created by Jared Davidson on 10/30/24. +// + +import Foundation +import SwiftUI + +public protocol SpeechToSpeechRequest { + +} + +public protocol SpeechToSpeechRequestHandling { + +} + +public protocol SpeechSynthesisRequestHandling: AnyObject { + func availableVoices() async throws -> [AbstractVoice] + + func speech( + for text: String, + voiceID: String, + voiceSettings: AbstractVoiceSettings, + model: String + ) async throws -> Data + + func speechToSpeech( + inputAudioURL: URL, + voiceID: String, + voiceSettings: AbstractVoiceSettings, + model: String + ) async throws -> Data + + func upload( + voiceWithName name: String, + description: String, + fileURL: URL + ) async throws -> AbstractVoice.ID + + func edit( + voice: AbstractVoice.ID, + name: String, + description: String, + fileURL: URL? + ) async throws -> Bool + + func delete(voice: AbstractVoice.ID) async throws +} + +// MARK: - Environment Key + +private struct AbstractClientKey: EnvironmentKey { + static let defaultValue: (any SpeechSynthesisRequestHandling)? = nil +} + +extension EnvironmentValues { + public var speechSynthesizer: (any SpeechSynthesisRequestHandling)? { + get { self[AbstractClientKey.self] } + set { self[AbstractClientKey.self] = newValue } + } +} diff --git a/Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.FrameRate.swift b/Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.FrameRate.swift similarity index 100% rename from Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.FrameRate.swift rename to Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.FrameRate.swift diff --git a/Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.MotionSettings.swift b/Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.MotionSettings.swift similarity index 100% rename from Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.MotionSettings.swift rename to Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.MotionSettings.swift diff --git a/Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.Quality.swift b/Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.Quality.swift similarity index 100% rename from Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.Quality.swift rename to Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.Quality.swift diff --git a/Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.Resolution.swift b/Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.Resolution.swift similarity index 100% rename from Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.Resolution.swift rename to Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.Resolution.swift diff --git a/Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.StyleStrength.swift b/Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.StyleStrength.swift similarity index 100% rename from Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.StyleStrength.swift rename to Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.StyleStrength.swift diff --git a/Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.swift b/Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.swift similarity index 100% rename from Sources/AI/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.swift rename to Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.swift diff --git a/Sources/AI/WIP - Move Somewhere Else/VideoGenerationRequestHandling.swift b/Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/VideoGenerationRequestHandling.swift similarity index 100% rename from Sources/AI/WIP - Move Somewhere Else/VideoGenerationRequestHandling.swift rename to Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/VideoGenerationRequestHandling.swift diff --git a/Sources/AI/WIP - Move Somewhere Else/VideoModel.swift b/Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/VideoModel.swift similarity index 100% rename from Sources/AI/WIP - Move Somewhere Else/VideoModel.swift rename to Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/VideoModel.swift diff --git a/Sources/PlayHT/Intramodular/Models/PlayHT.Voice.swift b/Sources/PlayHT/Intramodular/Models/PlayHT.Voice.swift index 3ac8907f..7ee76f26 100644 --- a/Sources/PlayHT/Intramodular/Models/PlayHT.Voice.swift +++ b/Sources/PlayHT/Intramodular/Models/PlayHT.Voice.swift @@ -7,6 +7,7 @@ import Foundation import Swallow +import LargeLanguageModels extension PlayHT { public struct Voice: Codable, Hashable, Identifiable { @@ -16,7 +17,7 @@ extension PlayHT { public let name: String public let language: String? public let languageCode: String? - public let voiceEngine: String + public let voiceEngine: String? public let isCloned: Bool? public let gender: String? public let accent: String? @@ -26,6 +27,39 @@ extension PlayHT { public let texture: String? public let loudness: String? public let tempo: String? + + + init( + id: ID, + name: String, + language: String? = nil, + languageCode: String? = nil, + voiceEngine: String? = nil, + isCloned: Bool? = nil, + gender: String? = nil, + accent: String? = nil, + age: String? = nil, + style: String? = nil, + sample: String? = nil, + texture: String? = nil, + loudness: String? = nil, + tempo: String? = nil + ) { + self.id = id + self.name = name + self.language = language + self.languageCode = languageCode + self.voiceEngine = voiceEngine + self.isCloned = isCloned + self.gender = gender + self.accent = accent + self.age = age + self.style = style + self.sample = sample + self.texture = texture + self.loudness = loudness + self.tempo = tempo + } private enum CodingKeys: String, CodingKey { case id, name, language, languageCode, voiceEngine, isCloned @@ -72,3 +106,24 @@ extension PlayHT { case flac = "flac" } } + +// MARK: - Conformances + +extension PlayHT.Voice: AbstractVoiceConvertible { + public func __conversion() throws -> AbstractVoice { + return AbstractVoice( + voiceID: self.id.rawValue, + name: self.name, + description: nil + ) + } +} + +extension PlayHT.Voice: AbstractVoiceInitiable { + public init(voice: AbstractVoice) throws { + self.init( + id: .init(rawValue: voice.id.rawValue), + name: voice.name + ) + } +} diff --git a/Sources/Rime/Intramodular/Models/Rime.Voice.swift b/Sources/Rime/Intramodular/Models/Rime.Voice.swift index 1a341b41..459a19ba 100644 --- a/Sources/Rime/Intramodular/Models/Rime.Voice.swift +++ b/Sources/Rime/Intramodular/Models/Rime.Voice.swift @@ -6,10 +6,32 @@ // import Foundation +import CorePersistence import Swallow +import LargeLanguageModels extension Rime { public struct Voice: Hashable { + public typealias ID = _TypeAssociatedID + + public init( + name: String, + age: String?, + country: String?, + region: String?, + demographic: String?, + genre: [String]? + ) { + self.id = .init(rawValue: UUID().uuidString) + self.name = name + self.age = age + self.country = country + self.region = region + self.demographic = demographic + self.genre = genre + } + + public let id: ID public let name: String public let age: String? public let country: String? @@ -42,5 +64,30 @@ extension Rime.Voice: Codable { self.region = try container.decodeIfPresent(String.self, forKey: Rime.Voice.CodingKeys.region) self.demographic = try container.decodeIfPresent(String.self, forKey: Rime.Voice.CodingKeys.demographic) self.genre = try container.decodeIfPresent([String].self, forKey: Rime.Voice.CodingKeys.genre) + + self.id = .init(rawValue: UUID().uuidString) + } +} + +extension Rime.Voice: AbstractVoiceInitiable { + public init(voice: AbstractVoice) throws { + self.init( + name: voice.name, + age: nil, + country: nil, + region: nil, + demographic: nil, + genre: nil + ) + } +} + +extension Rime.Voice: AbstractVoiceConvertible { + public func __conversion() throws -> AbstractVoice { + return AbstractVoice( + voiceID: self.id.rawValue, + name: self.name, + description: nil + ) } } From 114db0bd655f650447ad7841aabe89d9aa2229a7 Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Tue, 14 Jan 2025 17:08:08 -0700 Subject: [PATCH 062/271] Moved protocol conformances --- ...lient+SpeechSynthesisRequestHandling.swift | 44 +++++++++++ .../AbstractVoice.swift | 0 .../AbstractVoiceSettings.swift | 0 .../SpeechSynthesisRequestHandling.swift | 0 .../VideoGenerationRequestHandling.swift | 1 - .../VideoGenerationSettings.FrameRate.swift | 0 ...deoGenerationSettings.MotionSettings.swift | 0 .../VideoGenerationSettings.Quality.swift | 0 .../VideoGenerationSettings.Resolution.swift | 0 ...ideoGenerationSettings.StyleStrength.swift | 0 .../VideoGenerationSettings.swift | 0 .../VideoModel.swift | 0 .../Intramodular/Models/NeetsAI.Voice.swift | 22 ++++++ ...lient+SpeechSynthesisRequestHandling.swift | 41 ++++++++++ ...lient+SpeechSynthesisRequestHandling.swift | 56 +++++++++++++ .../PlayHT/Intramodular/PlayHT.Client.swift | 6 +- Sources/PlayHT/Intramodular/URL++.swift | 79 +++++++++++++++++++ ...lient+SpeechSynthesisRequestHandling.swift | 55 +++++++++++++ 18 files changed, 300 insertions(+), 4 deletions(-) create mode 100644 Sources/HumeAI/Intramodular/HumeAI.Client+SpeechSynthesisRequestHandling.swift rename Sources/LargeLanguageModels/Intramodular/{WIP - Move Somewhere Else => AbstractVoice (WIP)}/AbstractVoice.swift (100%) rename Sources/LargeLanguageModels/Intramodular/{WIP - Move Somewhere Else => AbstractVoice (WIP)}/AbstractVoiceSettings.swift (100%) rename Sources/LargeLanguageModels/Intramodular/{WIP - Move Somewhere Else => AbstractVoice (WIP)}/SpeechSynthesisRequestHandling.swift (100%) rename Sources/LargeLanguageModels/Intramodular/{WIP - Move Somewhere Else => VideoGeneration (WIP)}/VideoGenerationRequestHandling.swift (98%) rename Sources/LargeLanguageModels/Intramodular/{WIP - Move Somewhere Else/Video Generation Setttings => VideoGeneration (WIP)}/VideoGenerationSettings.FrameRate.swift (100%) rename Sources/LargeLanguageModels/Intramodular/{WIP - Move Somewhere Else/Video Generation Setttings => VideoGeneration (WIP)}/VideoGenerationSettings.MotionSettings.swift (100%) rename Sources/LargeLanguageModels/Intramodular/{WIP - Move Somewhere Else/Video Generation Setttings => VideoGeneration (WIP)}/VideoGenerationSettings.Quality.swift (100%) rename Sources/LargeLanguageModels/Intramodular/{WIP - Move Somewhere Else/Video Generation Setttings => VideoGeneration (WIP)}/VideoGenerationSettings.Resolution.swift (100%) rename Sources/LargeLanguageModels/Intramodular/{WIP - Move Somewhere Else/Video Generation Setttings => VideoGeneration (WIP)}/VideoGenerationSettings.StyleStrength.swift (100%) rename Sources/LargeLanguageModels/Intramodular/{WIP - Move Somewhere Else/Video Generation Setttings => VideoGeneration (WIP)}/VideoGenerationSettings.swift (100%) rename Sources/LargeLanguageModels/Intramodular/{WIP - Move Somewhere Else => VideoGeneration (WIP)}/VideoModel.swift (100%) create mode 100644 Sources/NeetsAI/Intramodular/NeetsAI.Client+SpeechSynthesisRequestHandling.swift create mode 100644 Sources/PlayHT/Intramodular/PlayHT.Client+SpeechSynthesisRequestHandling.swift create mode 100644 Sources/PlayHT/Intramodular/URL++.swift create mode 100644 Sources/Rime/Intramodular/Rime.Client+SpeechSynthesisRequestHandling.swift diff --git a/Sources/HumeAI/Intramodular/HumeAI.Client+SpeechSynthesisRequestHandling.swift b/Sources/HumeAI/Intramodular/HumeAI.Client+SpeechSynthesisRequestHandling.swift new file mode 100644 index 00000000..cd5a4e8f --- /dev/null +++ b/Sources/HumeAI/Intramodular/HumeAI.Client+SpeechSynthesisRequestHandling.swift @@ -0,0 +1,44 @@ +// +// HumeAI+ElevenLabsClientProtocol.swift +// Voice +// +// Created by Jared Davidson on 11/22/24. +// + +import Foundation +import SwiftUI +import AVFoundation +import LargeLanguageModels + +extension HumeAI.Client: SpeechSynthesisRequestHandling { + public func availableVoices() async throws -> [AbstractVoice] { + return try await getAllAvailableVoices().map( + { voice in + return AbstractVoice( + voiceID: voice.id, + name: voice.name, + description: nil + ) + }) + } + + public func speech(for text: String, voiceID: String, voiceSettings: AbstractVoiceSettings, model: String) async throws -> Data { + throw HumeAI.APIError.unknown(message: "Text to speech not supported") + } + + public func speechToSpeech(inputAudioURL: URL, voiceID: String, voiceSettings: AbstractVoiceSettings, model: String) async throws -> Data { + throw HumeAI.APIError.unknown(message: "Speech to speech not supported") + } + + public func upload(voiceWithName name: String, description: String, fileURL: URL) async throws -> AbstractVoice.ID { + throw HumeAI.APIError.unknown(message: "Voice creation is not supported") + } + + public func edit(voice: AbstractVoice.ID, name: String, description: String, fileURL: URL?) async throws -> Bool { + throw HumeAI.APIError.unknown(message: "Voice creation is not supported") + } + + public func delete(voice: AbstractVoice.ID) async throws { + throw HumeAI.APIError.unknown(message: "Voice creation is not supported") + } +} diff --git a/Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/AbstractVoice.swift b/Sources/LargeLanguageModels/Intramodular/AbstractVoice (WIP)/AbstractVoice.swift similarity index 100% rename from Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/AbstractVoice.swift rename to Sources/LargeLanguageModels/Intramodular/AbstractVoice (WIP)/AbstractVoice.swift diff --git a/Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/AbstractVoiceSettings.swift b/Sources/LargeLanguageModels/Intramodular/AbstractVoice (WIP)/AbstractVoiceSettings.swift similarity index 100% rename from Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/AbstractVoiceSettings.swift rename to Sources/LargeLanguageModels/Intramodular/AbstractVoice (WIP)/AbstractVoiceSettings.swift diff --git a/Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/SpeechSynthesisRequestHandling.swift b/Sources/LargeLanguageModels/Intramodular/AbstractVoice (WIP)/SpeechSynthesisRequestHandling.swift similarity index 100% rename from Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/SpeechSynthesisRequestHandling.swift rename to Sources/LargeLanguageModels/Intramodular/AbstractVoice (WIP)/SpeechSynthesisRequestHandling.swift diff --git a/Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/VideoGenerationRequestHandling.swift b/Sources/LargeLanguageModels/Intramodular/VideoGeneration (WIP)/VideoGenerationRequestHandling.swift similarity index 98% rename from Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/VideoGenerationRequestHandling.swift rename to Sources/LargeLanguageModels/Intramodular/VideoGeneration (WIP)/VideoGenerationRequestHandling.swift index d9f9ab1c..bc82693e 100644 --- a/Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/VideoGenerationRequestHandling.swift +++ b/Sources/LargeLanguageModels/Intramodular/VideoGeneration (WIP)/VideoGenerationRequestHandling.swift @@ -5,7 +5,6 @@ import AVFoundation import Foundation import SwiftUI -import LargeLanguageModels public protocol VideoGenerationRequestHandling { func availableModels() async throws -> [VideoModel] diff --git a/Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.FrameRate.swift b/Sources/LargeLanguageModels/Intramodular/VideoGeneration (WIP)/VideoGenerationSettings.FrameRate.swift similarity index 100% rename from Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.FrameRate.swift rename to Sources/LargeLanguageModels/Intramodular/VideoGeneration (WIP)/VideoGenerationSettings.FrameRate.swift diff --git a/Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.MotionSettings.swift b/Sources/LargeLanguageModels/Intramodular/VideoGeneration (WIP)/VideoGenerationSettings.MotionSettings.swift similarity index 100% rename from Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.MotionSettings.swift rename to Sources/LargeLanguageModels/Intramodular/VideoGeneration (WIP)/VideoGenerationSettings.MotionSettings.swift diff --git a/Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.Quality.swift b/Sources/LargeLanguageModels/Intramodular/VideoGeneration (WIP)/VideoGenerationSettings.Quality.swift similarity index 100% rename from Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.Quality.swift rename to Sources/LargeLanguageModels/Intramodular/VideoGeneration (WIP)/VideoGenerationSettings.Quality.swift diff --git a/Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.Resolution.swift b/Sources/LargeLanguageModels/Intramodular/VideoGeneration (WIP)/VideoGenerationSettings.Resolution.swift similarity index 100% rename from Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.Resolution.swift rename to Sources/LargeLanguageModels/Intramodular/VideoGeneration (WIP)/VideoGenerationSettings.Resolution.swift diff --git a/Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.StyleStrength.swift b/Sources/LargeLanguageModels/Intramodular/VideoGeneration (WIP)/VideoGenerationSettings.StyleStrength.swift similarity index 100% rename from Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.StyleStrength.swift rename to Sources/LargeLanguageModels/Intramodular/VideoGeneration (WIP)/VideoGenerationSettings.StyleStrength.swift diff --git a/Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.swift b/Sources/LargeLanguageModels/Intramodular/VideoGeneration (WIP)/VideoGenerationSettings.swift similarity index 100% rename from Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/Video Generation Setttings/VideoGenerationSettings.swift rename to Sources/LargeLanguageModels/Intramodular/VideoGeneration (WIP)/VideoGenerationSettings.swift diff --git a/Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/VideoModel.swift b/Sources/LargeLanguageModels/Intramodular/VideoGeneration (WIP)/VideoModel.swift similarity index 100% rename from Sources/LargeLanguageModels/Intramodular/WIP - Move Somewhere Else/VideoModel.swift rename to Sources/LargeLanguageModels/Intramodular/VideoGeneration (WIP)/VideoModel.swift diff --git a/Sources/NeetsAI/Intramodular/Models/NeetsAI.Voice.swift b/Sources/NeetsAI/Intramodular/Models/NeetsAI.Voice.swift index 2f035154..4422720b 100644 --- a/Sources/NeetsAI/Intramodular/Models/NeetsAI.Voice.swift +++ b/Sources/NeetsAI/Intramodular/Models/NeetsAI.Voice.swift @@ -6,6 +6,7 @@ // import Foundation +import LargeLanguageModels extension NeetsAI { public struct Voice: Codable, Hashable { @@ -15,3 +16,24 @@ extension NeetsAI { public let supportedModels: [String] } } + +extension NeetsAI.Voice: AbstractVoiceConvertible { + public func __conversion() throws -> AbstractVoice { + return AbstractVoice( + voiceID: self.id, + name: self.title ?? "", + description: self.aliasOf + ) + } +} + +extension NeetsAI.Voice: AbstractVoiceInitiable { + public init(voice: AbstractVoice) throws { + self.init( + id: voice.voiceID, + title: voice.name, + aliasOf: voice.description, + supportedModels: [] + ) + } +} diff --git a/Sources/NeetsAI/Intramodular/NeetsAI.Client+SpeechSynthesisRequestHandling.swift b/Sources/NeetsAI/Intramodular/NeetsAI.Client+SpeechSynthesisRequestHandling.swift new file mode 100644 index 00000000..3fa5844b --- /dev/null +++ b/Sources/NeetsAI/Intramodular/NeetsAI.Client+SpeechSynthesisRequestHandling.swift @@ -0,0 +1,41 @@ +// +// NeetsAI.Client+SpeechSynthesisRequestHandling.swift +// Voice +// + +import Foundation +import SwiftUI +import AVFoundation +import LargeLanguageModels + +extension NeetsAI.Client: SpeechSynthesisRequestHandling { + public func availableVoices() async throws -> [AbstractVoice] { + return try await getAllAvailableVoices().map( { try $0.__conversion() } ) + } + + public func speech(for text: String, voiceID: String, voiceSettings: LargeLanguageModels.AbstractVoiceSettings, model: String) async throws -> Data { + let audio = try await generateSpeech( + text: text, + voiceId: voiceID, + model: .init(rawValue: model) ?? .mistralai + ) + return audio + } + + public func speechToSpeech(inputAudioURL: URL, voiceID: String, voiceSettings: LargeLanguageModels.AbstractVoiceSettings, model: String) async throws -> Data { + throw NeetsAI.APIError.unknown(message: "Speech to speech not supported") + + } + + public func upload(voiceWithName name: String, description: String, fileURL: URL) async throws -> LargeLanguageModels.AbstractVoice.ID { + throw NeetsAI.APIError.unknown(message: "Uploading Voice is not supported") + } + + public func edit(voice: LargeLanguageModels.AbstractVoice.ID, name: String, description: String, fileURL: URL?) async throws -> Bool { + throw NeetsAI.APIError.unknown(message: "Editing Voice is not supported") + } + + public func delete(voice: LargeLanguageModels.AbstractVoice.ID) async throws { + throw NeetsAI.APIError.unknown(message: "Deleting Voice is not supported") + } +} diff --git a/Sources/PlayHT/Intramodular/PlayHT.Client+SpeechSynthesisRequestHandling.swift b/Sources/PlayHT/Intramodular/PlayHT.Client+SpeechSynthesisRequestHandling.swift new file mode 100644 index 00000000..c987b479 --- /dev/null +++ b/Sources/PlayHT/Intramodular/PlayHT.Client+SpeechSynthesisRequestHandling.swift @@ -0,0 +1,56 @@ +// +// PlayHT+SpeechSynthesisRequestHandling.swift +// Voice +// +// Created by Jared Davidson on 11/20/24. +// + +import Foundation +import AI +import ElevenLabs +import SwiftUI +import AVFoundation +import LargeLanguageModels + +extension PlayHT.Client: SpeechSynthesisRequestHandling { + public func availableVoices() async throws -> [AbstractVoice] { + let voices: [AbstractVoice] = try await getAllAvailableVoices().map { try $0.__conversion() } + return voices + } + + public func speech(for text: String, voiceID: String, voiceSettings: AbstractVoiceSettings, model: String) async throws -> Data { + let data: Data = try await streamTextToSpeech( + text: text, + voice: voiceID, + settings: .init(), + model: .playHT2Turbo + ) + + return data + } + + public func speechToSpeech(inputAudioURL: URL, voiceID: String, voiceSettings: LargeLanguageModels.AbstractVoiceSettings, model: String) async throws -> Data { + throw PlayHT.APIError.unknown(message: "Speech to speech not supported") + } + + public func upload(voiceWithName name: String, description: String, fileURL: URL) async throws -> AbstractVoice.ID { + let mp4URL = try await fileURL.convertAudioToMP4() + let fileURLString = mp4URL.absoluteString + let voiceID = try await instantCloneVoice( + sampleFileURL: fileURLString, + name: name + ) + + try? FileManager.default.removeItem(at: mp4URL) + + return .init(rawValue: voiceID.rawValue) + } + + public func edit(voice: LargeLanguageModels.AbstractVoice.ID, name: String, description: String, fileURL: URL?) async throws -> Bool { + throw PlayHT.APIError.unknown(message: "Voice editing not supported") + } + + public func delete(voice: LargeLanguageModels.AbstractVoice.ID) async throws { + try await deleteClonedVoice(voice: .init(rawValue: voice.rawValue)) + } +} diff --git a/Sources/PlayHT/Intramodular/PlayHT.Client.swift b/Sources/PlayHT/Intramodular/PlayHT.Client.swift index 66e6e80f..eb63bfa8 100644 --- a/Sources/PlayHT/Intramodular/PlayHT.Client.swift +++ b/Sources/PlayHT/Intramodular/PlayHT.Client.swift @@ -59,14 +59,14 @@ extension PlayHT.Client: CoreMI._ServiceClientProtocol { extension PlayHT.Client { public func getAllAvailableVoices() async throws -> [PlayHT.Voice] { - async let htVoices = availableVoices() - async let clonedVoices = clonedVoices() + async let htVoices = self.getAvailableVoices() + async let clonedVoices = self.clonedVoices() let (available, cloned) = try await (htVoices, clonedVoices) return available + cloned } - public func availableVoices() async throws -> [PlayHT.Voice] { + public func getAvailableVoices() async throws -> [PlayHT.Voice] { try await run(\.listVoices).voices } diff --git a/Sources/PlayHT/Intramodular/URL++.swift b/Sources/PlayHT/Intramodular/URL++.swift new file mode 100644 index 00000000..f584da1f --- /dev/null +++ b/Sources/PlayHT/Intramodular/URL++.swift @@ -0,0 +1,79 @@ +// +// URL++.swift +// AI +// +// Created by Jared Davidson on 1/14/25. +// + +import AVFoundation +import AudioToolbox + +// FIXME: - This needs to be moved somewhere else (@archetapp) + +extension URL { + func convertAudioToMP4() async throws -> URL { + let outputURL = FileManager.default.temporaryDirectory + .appendingPathComponent(UUID().uuidString) + .appendingPathExtension("mp4") + + let asset = AVURLAsset(url: self) + + let composition = AVMutableComposition() + guard let compositionTrack = composition.addMutableTrack( + withMediaType: .audio, + preferredTrackID: kCMPersistentTrackID_Invalid + ) else { + throw NSError(domain: "AudioConversion", code: -1, userInfo: [NSLocalizedDescriptionKey: "Could not create composition track"]) + } + + guard let audioTrack = try await asset.loadTracks(withMediaType: .audio).first else { + throw NSError(domain: "AudioConversion", code: -1, userInfo: [NSLocalizedDescriptionKey: "No audio track found"]) + } + + let timeRange = CMTimeRange(start: .zero, duration: try await asset.load(.duration)) + for i in 0..<4 { + try compositionTrack.insertTimeRange( + timeRange, + of: audioTrack, + at: CMTime(seconds: Double(i) * timeRange.duration.seconds, preferredTimescale: 600) + ) + } + + guard let exportSession = AVAssetExportSession( + asset: composition, + presetName: AVAssetExportPresetPassthrough + ) else { + throw NSError(domain: "AudioConversion", code: -1, userInfo: [NSLocalizedDescriptionKey: "Could not create export session"]) + } + + exportSession.outputURL = outputURL + exportSession.outputFileType = AVFileType.mp4 + exportSession.shouldOptimizeForNetworkUse = true + + // Create a tuple of values we need to check after export + try await withCheckedThrowingContinuation { continuation in + let mainQueue = DispatchQueue.main + exportSession.exportAsynchronously { + mainQueue.async { + switch exportSession.status { + case .completed: + continuation.resume() + case .failed: + continuation.resume(throwing: exportSession.error ?? NSError(domain: "AudioConversion", code: -1, userInfo: [NSLocalizedDescriptionKey: "Export failed"])) + case .cancelled: + continuation.resume(throwing: NSError(domain: "AudioConversion", code: -1, userInfo: [NSLocalizedDescriptionKey: "Export cancelled"])) + default: + continuation.resume(throwing: NSError(domain: "AudioConversion", code: -1, userInfo: [NSLocalizedDescriptionKey: "Unknown export error"])) + } + } + } + } + + let fileSize = try FileManager.default.attributesOfItem(atPath: outputURL.path)[.size] as? Int ?? 0 + if fileSize < 5000 { // 5KB minimum + throw NSError(domain: "AudioConversion", code: -1, userInfo: [NSLocalizedDescriptionKey: "Converted file too small"]) + } + + return outputURL + } +} diff --git a/Sources/Rime/Intramodular/Rime.Client+SpeechSynthesisRequestHandling.swift b/Sources/Rime/Intramodular/Rime.Client+SpeechSynthesisRequestHandling.swift new file mode 100644 index 00000000..93126293 --- /dev/null +++ b/Sources/Rime/Intramodular/Rime.Client+SpeechSynthesisRequestHandling.swift @@ -0,0 +1,55 @@ +// +// Rime+SpeechSynthesisRequestHandling.swift +// Voice +// +// Created by Jared Davidson on 11/21/24. +// + +import Foundation +import AI +import ElevenLabs +import SwiftUI +import AVFoundation + +extension Rime.Client: SpeechSynthesisRequestHandling { + public func availableVoices() async throws -> [AbstractVoice] { + return try await getAllAvailableVoiceDetails().map { try $0.__conversion() } + } + + public func speech(for text: String, voiceID: String, voiceSettings: AbstractVoiceSettings, model: String) async throws -> Data { + return try await streamTextToSpeech( + text: text, + voice: voiceID, + outputAudio: .MP3, + model: .mist + ) + } + + public func speechToSpeech(inputAudioURL: URL, voiceID: String, voiceSettings: AbstractVoiceSettings, model: String) async throws -> Data { + throw Rime.APIError.unknown(message: "Speech to speech not supported") + } + + public func upload(voiceWithName name: String, description: String, fileURL: URL) async throws -> AbstractVoice.ID { + throw Rime.APIError.unknown(message: "Voice creation is not supported") + } + + public func edit(voice: AbstractVoice.ID, name: String, description: String, fileURL: URL?) async throws -> Bool { + throw Rime.APIError.unknown(message: "Voice creation is not supported") + } + + public func delete(voice: AbstractVoice.ID) async throws { + throw Rime.APIError.unknown(message: "Voice creation is not supported") + } + + public func availableVoices() async throws -> [ElevenLabs.Voice] { + return try await getAllAvailableVoiceDetails().map { voice in + ElevenLabs.Voice( + voiceID: voice.name, + name: voice.name, + description: voice.demographic, + isOwner: false + ) + } + } + +} From f2f807c282e67ee6cb4cac35f3e471d0df0011f7 Mon Sep 17 00:00:00 2001 From: Purav Manot Date: Thu, 16 Jan 2025 18:18:42 +0530 Subject: [PATCH 063/271] Cleanup --- .../SpeechSynthesisRequestHandling.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/Sources/AI/WIP - Move Somewhere Else/SpeechSynthesisRequestHandling.swift b/Sources/AI/WIP - Move Somewhere Else/SpeechSynthesisRequestHandling.swift index 1de670e4..e7d762d0 100644 --- a/Sources/AI/WIP - Move Somewhere Else/SpeechSynthesisRequestHandling.swift +++ b/Sources/AI/WIP - Move Somewhere Else/SpeechSynthesisRequestHandling.swift @@ -6,7 +6,6 @@ // import Foundation -import AI import ElevenLabs import SwiftUI From 3aba2ada446184b215d872de01cec1abc7a88a6c Mon Sep 17 00:00:00 2001 From: Purav Manot Date: Fri, 17 Jan 2025 00:43:00 +0530 Subject: [PATCH 064/271] Update Gemini (Incomplete) --- ...emini.APISpecification.RequestBodies.swift | 38 +++++++++---- .../API/_Gemini.APISpecification.swift | 53 +++++++++++++++++-- .../Intramodular/_Gemini.Client+Files.swift | 46 +++++++++------- 3 files changed, 103 insertions(+), 34 deletions(-) diff --git a/Sources/_Gemini/Intramodular/API/_Gemini.APISpecification.RequestBodies.swift b/Sources/_Gemini/Intramodular/API/_Gemini.APISpecification.RequestBodies.swift index 7003aebd..0eaaa91f 100644 --- a/Sources/_Gemini/Intramodular/API/_Gemini.APISpecification.RequestBodies.swift +++ b/Sources/_Gemini/Intramodular/API/_Gemini.APISpecification.RequestBodies.swift @@ -142,10 +142,31 @@ extension _Gemini.APISpecification { } } - public struct FileUploadInput: Codable, HTTPRequest.Multipart.ContentConvertible { + public struct FinalizeFileUploadInput { + public let data: Data + public let uploadUrl: String + public let fileSize: Int + + public init(data: Data, uploadUrl: String, fileSize: Int) { + self.data = data + self.uploadUrl = uploadUrl + self.fileSize = fileSize + } + } + + public struct StartFileUploadInput: Codable { + public struct UploadMetadata: Codable { + let file: FileMetadata + + struct FileMetadata: Codable { + let display_name: String + } + } + public let fileData: Data public let mimeType: String public let displayName: String + public let metadata: UploadMetadata public init( fileData: Data, @@ -155,11 +176,12 @@ extension _Gemini.APISpecification { self.fileData = fileData self.mimeType = mimeType self.displayName = displayName + self.metadata = .init(file: .init(display_name: displayName)) } - + /* public func __conversion() throws -> HTTPRequest.Multipart.Content { var result = HTTPRequest.Multipart.Content() - + // TODO: - Add this to `HTTPMediaType` @jared @vmanot let fileExtension: String = { guard let subtype = mimeType.split(separator: "/").last else { @@ -188,17 +210,11 @@ extension _Gemini.APISpecification { } }() - result.append( - .file( - named: "file", - data: fileData, - filename: "\(displayName).\(fileExtension)", - contentType: .init(rawValue: mimeType) - ) - ) + result.ap return result } + */ } public struct DeleteFileInput: Codable { diff --git a/Sources/_Gemini/Intramodular/API/_Gemini.APISpecification.swift b/Sources/_Gemini/Intramodular/API/_Gemini.APISpecification.swift index fe289d07..4474386e 100644 --- a/Sources/_Gemini/Intramodular/API/_Gemini.APISpecification.swift +++ b/Sources/_Gemini/Intramodular/API/_Gemini.APISpecification.swift @@ -75,11 +75,29 @@ extension _Gemini { // Initial Upload Request endpoint @POST @Path("/upload/v1beta/files") - @Header([ - "X-Goog-Upload-Command": "start, upload, finalize" - ]) - @Body(multipart: .input) - var uploadFile = Endpoint() + @Header({ context in + [ + HTTPHeaderField(key: "X-Goog-Upload-Protocol", value: "resumable"), + HTTPHeaderField(key: "X-Goog-Upload-Command", value: "start"), + HTTPHeaderField(key: "X-Goog-Upload-Header-Content-Length", value: "\(context.input.fileData.count)"), + HTTPHeaderField(key: "X-Goog-Upload-Header-Content-Type", value: context.input.mimeType), + HTTPHeaderField.contentType(.json) + ] + }) + @Body(json: \RequestBodies.StartFileUploadInput.metadata) + var startFileUpload = Endpoint() + + @POST + @Path({ context in context.input.uploadUrl }) + @Header({ context in + [ + HTTPHeaderField(key: "Content-Length", value: "\(context.input.fileSize)"), + HTTPHeaderField(key: "X-Goog-Upload-Offset", value: "0"), + HTTPHeaderField(key: "X-Goog-Upload-Command", value: "upload, finalize") + ] + }) + @Body(json: \RequestBodies.FinalizeFileUploadInput.data) + var finalizeFileUpload = Endpoint() // File Status endpoint @GET @@ -157,6 +175,7 @@ extension _Gemini.APISpecification { context: context ) + // FIXME: (@jared) - why are you replacing the query instead of appending a new query item? is this intentional? if let apiKey = context.root.configuration.apiKey { request = request.query([.init(name: "key", value: apiKey)]) } @@ -173,10 +192,34 @@ extension _Gemini.APISpecification { try response.validate() + + if let options: _Gemini.APISpecification.Options = context.options as? _Gemini.APISpecification.Options, let headerKey = options.outputHeaderKey { + print("HEADERS: \(response.headerFields)") + let stringValue: String? = response.headerFields.first (where: { $0.key == headerKey })?.value + print(stringValue) + + switch Output.self { + case String.self: + return (try stringValue.unwrap()) as! Output + case Optional.self: + return stringValue as! Output + default: + throw _Gemini.APIError.invalidContentType + } + } + return try response.decode( Output.self, keyDecodingStrategy: .convertFromSnakeCase ) } } + + public class Options { + var outputHeaderKey: HTTPHeaderField.Key? + + init(outputHeaderKey: HTTPHeaderField.Key? = nil) { + self.outputHeaderKey = outputHeaderKey + } + } } diff --git a/Sources/_Gemini/Intramodular/_Gemini.Client+Files.swift b/Sources/_Gemini/Intramodular/_Gemini.Client+Files.swift index b6fa298c..7ff3c88a 100644 --- a/Sources/_Gemini/Intramodular/_Gemini.Client+Files.swift +++ b/Sources/_Gemini/Intramodular/_Gemini.Client+Files.swift @@ -9,6 +9,17 @@ import Merge import NetworkKit import Swallow +fileprivate enum TempError: CustomStringError, Error { + case fetchedResponse + + public var description: String { + switch self { + case .fetchedResponse: + return "Got response url from header" + } + } +} + extension _Gemini.Client { public func uploadFile( from data: Data, @@ -20,27 +31,26 @@ extension _Gemini.Client { throw FileProcessingError.invalidFileName } - do { - var mimeType: String? = mimeType?.rawValue ?? _MediaAssetFileType(data)?.mimeType - - if mimeType == nil, let swiftType { - mimeType = HTTPMediaType(_swiftType: swiftType)?.rawValue - } - - let input = _Gemini.APISpecification.RequestBodies.FileUploadInput( - fileData: data, - mimeType: try mimeType.unwrap(), - displayName: displayName - ) - - let response = try await run(\.uploadFile, with: input) - - return response.file - } catch { - throw _Gemini.APIError.unknown(message: "File upload failed: \(error.localizedDescription)") + var mimeType: String? = mimeType?.rawValue ?? _MediaAssetFileType(data)?.mimeType + + if mimeType == nil, let swiftType { + mimeType = HTTPMediaType(_swiftType: swiftType)?.rawValue } + + let input = _Gemini.APISpecification.RequestBodies.StartFileUploadInput( + fileData: data, + mimeType: try mimeType.unwrap(), + displayName: displayName + ) + + let uploadURLString: String = try await run(\.startFileUpload, with: input, options: _Gemini.APISpecification.Options(outputHeaderKey: .custom("x-goog-upload-url"))).value + + let result: _Gemini.APISpecification.ResponseBodies.FileUpload = try await run(\.finalizeFileUpload, with: _Gemini.APISpecification.RequestBodies.FinalizeFileUploadInput(data: data, uploadUrl: uploadURLString, fileSize: data.count)) + + return result.file } + public func uploadFile( from url: URL, mimeType: HTTPMediaType?, From 5b3e1361cd40a0f87369c5605bf88f94dc189c54 Mon Sep 17 00:00:00 2001 From: Purav Manot Date: Fri, 17 Jan 2025 01:21:54 +0530 Subject: [PATCH 065/271] Fix --- .../API/_Gemini.APISpecification.swift | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/Sources/_Gemini/Intramodular/API/_Gemini.APISpecification.swift b/Sources/_Gemini/Intramodular/API/_Gemini.APISpecification.swift index 4474386e..cecb0399 100644 --- a/Sources/_Gemini/Intramodular/API/_Gemini.APISpecification.swift +++ b/Sources/_Gemini/Intramodular/API/_Gemini.APISpecification.swift @@ -70,11 +70,13 @@ extension _Gemini { "/v1beta/models/\(context.input.model):generateContent" }) @Body(json: \.requestBody) + @Query({ $0.root.configuration.apiKey.map { ["key": $0] } ?? [:] }) var generateContent = Endpoint() // Initial Upload Request endpoint @POST @Path("/upload/v1beta/files") + @Query({ $0.root.configuration.apiKey.map { ["key": $0] } ?? [:] }) @Header({ context in [ HTTPHeaderField(key: "X-Goog-Upload-Protocol", value: "resumable"), @@ -88,7 +90,7 @@ extension _Gemini { var startFileUpload = Endpoint() @POST - @Path({ context in context.input.uploadUrl }) + @AbsolutePath({ $0.input.uploadUrl }) @Header({ context in [ HTTPHeaderField(key: "Content-Length", value: "\(context.input.fileSize)"), @@ -96,7 +98,7 @@ extension _Gemini { HTTPHeaderField(key: "X-Goog-Upload-Command", value: "upload, finalize") ] }) - @Body(json: \RequestBodies.FinalizeFileUploadInput.data) + @Body(data: \RequestBodies.FinalizeFileUploadInput.data) var finalizeFileUpload = Endpoint() // File Status endpoint @@ -104,6 +106,7 @@ extension _Gemini { @Path({ context -> String in "/v1beta/\(context.input.name.rawValue)" }) + @Query({ $0.root.configuration.apiKey.map { ["key": $0] } ?? [:] }) var getFile = Endpoint() @GET @@ -119,8 +122,13 @@ extension _Gemini { parameters["pageToken"] = pageToken } + if let apiKey = context.root.configuration.apiKey { + parameters["key"] = apiKey + } + return parameters }) + @Query({ $0.root.configuration.apiKey.map { ["key": $0] } ?? [:] }) var listFiles = Endpoint() // Delete File endpoint @@ -128,24 +136,28 @@ extension _Gemini { @Path({ context -> String in "/\(context.input.fileURL.path)" }) + @Query({ $0.root.configuration.apiKey.map { ["key": $0] } ?? [:] }) var deleteFile = Endpoint() - //Fine Tuning + // Fine Tuning @POST @Path("/v1beta/tunedModels") @Body(json: \.requestBody) + @Query({ $0.root.configuration.apiKey.map { ["key": $0] } ?? [:] }) var createTunedModel = Endpoint() @GET @Path({ context -> String in "/v1/\(context.input.operationName)" }) + @Query({ $0.root.configuration.apiKey.map { ["key": $0] } ?? [:] }) var getTuningOperation = Endpoint() @GET @Path({ context -> String in "/v1beta/\(context.input.modelName)" }) + @Query({ $0.root.configuration.apiKey.map { ["key": $0] } ?? [:] }) var getTunedModel = Endpoint() @POST @@ -153,6 +165,7 @@ extension _Gemini { "/v1beta/\(context.input.model):generateContent" // Use the model name directly }) @Body(json: \.requestBody) + @Query({ $0.root.configuration.apiKey.map { ["key": $0] } ?? [:] }) var generateTunedContent = Endpoint() @POST @@ -160,6 +173,7 @@ extension _Gemini { "/v1beta/models/\(context.input.model):embedContent" }) @Body(json: \.input) + @Query({ $0.root.configuration.apiKey.map { ["key": $0] } ?? [:] }) var generateEmbedding = Endpoint() } } @@ -175,10 +189,7 @@ extension _Gemini.APISpecification { context: context ) - // FIXME: (@jared) - why are you replacing the query instead of appending a new query item? is this intentional? - if let apiKey = context.root.configuration.apiKey { - request = request.query([.init(name: "key", value: apiKey)]) - } + print("REQUEST URL: \(request.url)") return request } From 1f990563cffcea707608a3a6687deb6487c2a753 Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Fri, 17 Jan 2025 09:26:45 -0700 Subject: [PATCH 066/271] Fixed build issue --- Package.swift | 1 + Sources/AI/AnySpeechSynthesisRequestHandling.swift | 3 +++ .../Intramodular/Models/NeetsAI.Voice.swift | 2 +- ...sAI.Client+SpeechSynthesisRequestHandling.swift | 14 +++++++++++++- Sources/NeetsAI/module.swift | 2 ++ 5 files changed, 20 insertions(+), 2 deletions(-) diff --git a/Package.swift b/Package.swift index f731cfd7..df47734a 100644 --- a/Package.swift +++ b/Package.swift @@ -389,6 +389,7 @@ let package = Package( "Ollama", "OpenAI", "Swallow", + "NeetsAI", ], path: "Sources/AI", swiftSettings: [ diff --git a/Sources/AI/AnySpeechSynthesisRequestHandling.swift b/Sources/AI/AnySpeechSynthesisRequestHandling.swift index 18dce27e..5684958f 100644 --- a/Sources/AI/AnySpeechSynthesisRequestHandling.swift +++ b/Sources/AI/AnySpeechSynthesisRequestHandling.swift @@ -7,6 +7,7 @@ import ElevenLabs import LargeLanguageModels +import NeetsAI public struct AnySpeechSynthesisRequestHandling: Hashable { private let _hashValue: Int @@ -17,6 +18,8 @@ public struct AnySpeechSynthesisRequestHandling: Hashable { switch base { case is ElevenLabs.Client: return "ElevenLabs" + case is NeetsAI.Client: + return "NeetsAI" default: fatalError() } diff --git a/Sources/NeetsAI/Intramodular/Models/NeetsAI.Voice.swift b/Sources/NeetsAI/Intramodular/Models/NeetsAI.Voice.swift index 4422720b..ee23943a 100644 --- a/Sources/NeetsAI/Intramodular/Models/NeetsAI.Voice.swift +++ b/Sources/NeetsAI/Intramodular/Models/NeetsAI.Voice.swift @@ -30,7 +30,7 @@ extension NeetsAI.Voice: AbstractVoiceConvertible { extension NeetsAI.Voice: AbstractVoiceInitiable { public init(voice: AbstractVoice) throws { self.init( - id: voice.voiceID, + id: .init(voice.voiceID), title: voice.name, aliasOf: voice.description, supportedModels: [] diff --git a/Sources/NeetsAI/Intramodular/NeetsAI.Client+SpeechSynthesisRequestHandling.swift b/Sources/NeetsAI/Intramodular/NeetsAI.Client+SpeechSynthesisRequestHandling.swift index 3fa5844b..973024bd 100644 --- a/Sources/NeetsAI/Intramodular/NeetsAI.Client+SpeechSynthesisRequestHandling.swift +++ b/Sources/NeetsAI/Intramodular/NeetsAI.Client+SpeechSynthesisRequestHandling.swift @@ -10,7 +10,11 @@ import LargeLanguageModels extension NeetsAI.Client: SpeechSynthesisRequestHandling { public func availableVoices() async throws -> [AbstractVoice] { - return try await getAllAvailableVoices().map( { try $0.__conversion() } ) + let voices = try await getAllAvailableVoices() + .map({ try $0.__conversion() }) + .filter({ !$0.name.isEmpty }) + .unique(by: \.name) + return voices } public func speech(for text: String, voiceID: String, voiceSettings: LargeLanguageModels.AbstractVoiceSettings, model: String) async throws -> Data { @@ -39,3 +43,11 @@ extension NeetsAI.Client: SpeechSynthesisRequestHandling { throw NeetsAI.APIError.unknown(message: "Deleting Voice is not supported") } } + +// FIXME: - REMOVE ME +extension Sequence { + func unique(by keyPath: KeyPath) -> [Element] { + var seen = Set() + return filter { seen.insert($0[keyPath: keyPath]).inserted } + } +} diff --git a/Sources/NeetsAI/module.swift b/Sources/NeetsAI/module.swift index 1c4d3b99..5b26df46 100644 --- a/Sources/NeetsAI/module.swift +++ b/Sources/NeetsAI/module.swift @@ -5,3 +5,5 @@ // Created by Jared Davidson on 11/22/24. // +@_exported import Swallow +@_exported import SwallowMacrosClient From 3fe5468107870109a8c0a7fabdca7abbf1fa87d9 Mon Sep 17 00:00:00 2001 From: Purav Manot Date: Sat, 18 Jan 2025 22:45:30 +0530 Subject: [PATCH 067/271] Update --- Sources/_Gemini/Intramodular/_Gemini.Client+Files.swift | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Sources/_Gemini/Intramodular/_Gemini.Client+Files.swift b/Sources/_Gemini/Intramodular/_Gemini.Client+Files.swift index 7ff3c88a..020e3cde 100644 --- a/Sources/_Gemini/Intramodular/_Gemini.Client+Files.swift +++ b/Sources/_Gemini/Intramodular/_Gemini.Client+Files.swift @@ -6,6 +6,7 @@ import CoreMI import Dispatch import FoundationX import Merge +import Media import NetworkKit import Swallow @@ -50,6 +51,9 @@ extension _Gemini.Client { return result.file } + public func upload(file: any MediaFile) async throws { + try await self.uploadFile(from: file.url, mimeType: HTTPMediaType(fileURL: file.url), displayName: file.name) + } public func uploadFile( from url: URL, From 6fac42dba41a5b3b8038d1e66e00c28086a57be8 Mon Sep 17 00:00:00 2001 From: Purav Manot Date: Mon, 20 Jan 2025 04:03:54 +0530 Subject: [PATCH 068/271] Cleanup --- Package.swift | 3 ++- .../AbstractVoice (WIP)/AbstractVoiceSettings.swift | 2 +- .../Intramodular/API/_Gemini.APISpecification.swift | 10 +--------- 3 files changed, 4 insertions(+), 11 deletions(-) diff --git a/Package.swift b/Package.swift index df47734a..ee06cd68 100644 --- a/Package.swift +++ b/Package.swift @@ -191,7 +191,8 @@ let package = Package( "LargeLanguageModels", "Merge", "NetworkKit", - "Swallow" + "Swallow", + "Media" ], path: "Sources/_Gemini", swiftSettings: [ diff --git a/Sources/LargeLanguageModels/Intramodular/AbstractVoice (WIP)/AbstractVoiceSettings.swift b/Sources/LargeLanguageModels/Intramodular/AbstractVoice (WIP)/AbstractVoiceSettings.swift index 34fd03b6..b54b685f 100644 --- a/Sources/LargeLanguageModels/Intramodular/AbstractVoice (WIP)/AbstractVoiceSettings.swift +++ b/Sources/LargeLanguageModels/Intramodular/AbstractVoice (WIP)/AbstractVoiceSettings.swift @@ -5,7 +5,7 @@ // Created by Jared Davidson on 10/30/24. // -import SwiftUIZ +import SwiftUIX import CorePersistence public struct AbstractVoiceSettings: Codable, Sendable, Initiable, Equatable { diff --git a/Sources/_Gemini/Intramodular/API/_Gemini.APISpecification.swift b/Sources/_Gemini/Intramodular/API/_Gemini.APISpecification.swift index cecb0399..587217f2 100644 --- a/Sources/_Gemini/Intramodular/API/_Gemini.APISpecification.swift +++ b/Sources/_Gemini/Intramodular/API/_Gemini.APISpecification.swift @@ -184,13 +184,11 @@ extension _Gemini.APISpecification { from input: Input, context: BuildRequestContext ) throws -> Request { - var request = try super.buildRequestBase( + let request = try super.buildRequestBase( from: input, context: context ) - print("REQUEST URL: \(request.url)") - return request } @@ -198,16 +196,10 @@ extension _Gemini.APISpecification { from response: Request.Response, context: DecodeOutputContext ) throws -> Output { - - print(response) - try response.validate() - if let options: _Gemini.APISpecification.Options = context.options as? _Gemini.APISpecification.Options, let headerKey = options.outputHeaderKey { - print("HEADERS: \(response.headerFields)") let stringValue: String? = response.headerFields.first (where: { $0.key == headerKey })?.value - print(stringValue) switch Output.self { case String.self: From 96c7895d1619a34fa7ebbe5570451f7db701690c Mon Sep 17 00:00:00 2001 From: Purav Manot Date: Mon, 20 Jan 2025 23:40:06 +0530 Subject: [PATCH 069/271] Fix package.swift --- Package.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Package.swift b/Package.swift index ee06cd68..6dd9893e 100644 --- a/Package.swift +++ b/Package.swift @@ -92,6 +92,7 @@ let package = Package( ], dependencies: [ .package(url: "https://github.com/vmanot/CorePersistence.git", branch: "main"), + .package(url: "https://github.com/vmanot/Media", branch: "main"), .package(url: "https://github.com/vmanot/Merge.git", branch: "master"), .package(url: "https://github.com/vmanot/NetworkKit.git", branch: "master"), .package(url: "https://github.com/vmanot/Swallow.git", branch: "master"), From 6c47824c71022e71eed9e01c28934b76dcda1544 Mon Sep 17 00:00:00 2001 From: Vatsal Manot Date: Sat, 22 Feb 2025 16:33:34 -0800 Subject: [PATCH 070/271] Update package --- Sources/PlayHT/Intramodular/URL++.swift | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/Sources/PlayHT/Intramodular/URL++.swift b/Sources/PlayHT/Intramodular/URL++.swift index f584da1f..622b5933 100644 --- a/Sources/PlayHT/Intramodular/URL++.swift +++ b/Sources/PlayHT/Intramodular/URL++.swift @@ -52,18 +52,17 @@ extension URL { // Create a tuple of values we need to check after export try await withCheckedThrowingContinuation { continuation in - let mainQueue = DispatchQueue.main exportSession.exportAsynchronously { - mainQueue.async { + Task { @MainActor in switch exportSession.status { - case .completed: - continuation.resume() - case .failed: - continuation.resume(throwing: exportSession.error ?? NSError(domain: "AudioConversion", code: -1, userInfo: [NSLocalizedDescriptionKey: "Export failed"])) - case .cancelled: - continuation.resume(throwing: NSError(domain: "AudioConversion", code: -1, userInfo: [NSLocalizedDescriptionKey: "Export cancelled"])) - default: - continuation.resume(throwing: NSError(domain: "AudioConversion", code: -1, userInfo: [NSLocalizedDescriptionKey: "Unknown export error"])) + case .completed: + continuation.resume() + case .failed: + continuation.resume(throwing: exportSession.error ?? NSError(domain: "AudioConversion", code: -1, userInfo: [NSLocalizedDescriptionKey: "Export failed"])) + case .cancelled: + continuation.resume(throwing: NSError(domain: "AudioConversion", code: -1, userInfo: [NSLocalizedDescriptionKey: "Export cancelled"])) + default: + continuation.resume(throwing: NSError(domain: "AudioConversion", code: -1, userInfo: [NSLocalizedDescriptionKey: "Unknown export error"])) } } } From 1f2f38132d55439b943ca7593aa22473b6ce27b8 Mon Sep 17 00:00:00 2001 From: Vatsal Manot Date: Thu, 10 Apr 2025 22:06:16 -0700 Subject: [PATCH 071/271] Update package --- ...HT.Client+SpeechSynthesisRequestHandling.swift | 2 -- ...me.Client+SpeechSynthesisRequestHandling.swift | 15 +-------------- 2 files changed, 1 insertion(+), 16 deletions(-) diff --git a/Sources/PlayHT/Intramodular/PlayHT.Client+SpeechSynthesisRequestHandling.swift b/Sources/PlayHT/Intramodular/PlayHT.Client+SpeechSynthesisRequestHandling.swift index 8132946d..5ad471cd 100644 --- a/Sources/PlayHT/Intramodular/PlayHT.Client+SpeechSynthesisRequestHandling.swift +++ b/Sources/PlayHT/Intramodular/PlayHT.Client+SpeechSynthesisRequestHandling.swift @@ -6,8 +6,6 @@ // import Foundation -import AI -import ElevenLabs import SwiftUI import AVFoundation import LargeLanguageModels diff --git a/Sources/Rime/Intramodular/Rime.Client+SpeechSynthesisRequestHandling.swift b/Sources/Rime/Intramodular/Rime.Client+SpeechSynthesisRequestHandling.swift index 93126293..f4bd5023 100644 --- a/Sources/Rime/Intramodular/Rime.Client+SpeechSynthesisRequestHandling.swift +++ b/Sources/Rime/Intramodular/Rime.Client+SpeechSynthesisRequestHandling.swift @@ -5,9 +5,8 @@ // Created by Jared Davidson on 11/21/24. // +import LargeLanguageModels import Foundation -import AI -import ElevenLabs import SwiftUI import AVFoundation @@ -40,16 +39,4 @@ extension Rime.Client: SpeechSynthesisRequestHandling { public func delete(voice: AbstractVoice.ID) async throws { throw Rime.APIError.unknown(message: "Voice creation is not supported") } - - public func availableVoices() async throws -> [ElevenLabs.Voice] { - return try await getAllAvailableVoiceDetails().map { voice in - ElevenLabs.Voice( - voiceID: voice.name, - name: voice.name, - description: voice.demographic, - isOwner: false - ) - } - } - } From b18859e8228f007a42d2d38069bbedff659477f3 Mon Sep 17 00:00:00 2001 From: "Jared Davidson (Archetapp)" Date: Sat, 12 Apr 2025 15:23:12 -0600 Subject: [PATCH 072/271] added at least 1 import, cleanup --- .../AnySpeechSynthesisRequestHandling.swift | 2 + ...nLabs.APISpecification.RequestBodies.swift | 650 +++++++++--------- .../Models/ElevenLabs.DubbingOptions.swift | 2 + .../Intramodular/Models/HumeAI.Chat.swift | 2 + .../Models/HumeAI.ChatEvent.swift | 2 + .../Models/HumeAI.ChatGroup.swift | 2 + .../Models/HumeAI.ChatMessage.swift | 2 + .../Models/HumeAI.ChatResponse.swift | 2 + .../Intramodular/Models/HumeAI.Config.swift | 2 + .../Intramodular/Models/HumeAI.Dataset.swift | 2 + .../Intramodular/Models/HumeAI.File.swift | 2 + .../Models/HumeAI.FileInput.swift | 2 + .../Intramodular/Models/HumeAI.Job.swift | 2 + .../Intramodular/Models/HumeAI.Models.swift | 2 + .../Intramodular/Models/HumeAI.Prompt.swift | 2 + .../Intramodular/Models/HumeAI.Tool.swift | 2 + ...etsAI.APISpecification.RequestBodies.swift | 2 + .../Models/PlayHT.VoiceSettings.swift | 2 + 18 files changed, 357 insertions(+), 327 deletions(-) diff --git a/Sources/AI/AnySpeechSynthesisRequestHandling.swift b/Sources/AI/AnySpeechSynthesisRequestHandling.swift index 5684958f..f6f82af9 100644 --- a/Sources/AI/AnySpeechSynthesisRequestHandling.swift +++ b/Sources/AI/AnySpeechSynthesisRequestHandling.swift @@ -9,6 +9,8 @@ import ElevenLabs import LargeLanguageModels import NeetsAI +// FIXME: - (@archetapp) Is this the best place to put this file? + public struct AnySpeechSynthesisRequestHandling: Hashable { private let _hashValue: Int diff --git a/Sources/ElevenLabs/Intramodular/API/ElevenLabs.APISpecification.RequestBodies.swift b/Sources/ElevenLabs/Intramodular/API/ElevenLabs.APISpecification.RequestBodies.swift index b0abe155..1ab5be7b 100644 --- a/Sources/ElevenLabs/Intramodular/API/ElevenLabs.APISpecification.RequestBodies.swift +++ b/Sources/ElevenLabs/Intramodular/API/ElevenLabs.APISpecification.RequestBodies.swift @@ -11,383 +11,379 @@ import Merge extension ElevenLabs.APISpecification { enum RequestBodies { - - } -} - -extension ElevenLabs.APISpecification.RequestBodies { - public struct SpeechRequest: Codable, Hashable, Equatable { - public let text: String - public let languageCode: String? - public let voiceSettings: ElevenLabs.VoiceSettings - public let model: ElevenLabs.Model - - private enum CodingKeys: String, CodingKey { - case text - case voiceSettings = "voice_settings" - case model = "model_id" - case languageCode = "language_code" - } - - public init( - text: String, - languageCode: String?, - voiceSettings: ElevenLabs.VoiceSettings, - model: ElevenLabs.Model - ) { - self.text = text - self.languageCode = languageCode - self.voiceSettings = voiceSettings - self.model = model - } - } - - public struct TextToSpeechInput: Codable, Hashable { - public let voiceId: String - public let requestBody: SpeechRequest - - public init(voiceId: String, requestBody: SpeechRequest) { - self.voiceId = voiceId - self.requestBody = requestBody + public struct SpeechRequest: Codable, Hashable, Equatable { + public let text: String + public let languageCode: String? + public let voiceSettings: ElevenLabs.VoiceSettings + public let model: ElevenLabs.Model + + private enum CodingKeys: String, CodingKey { + case text + case voiceSettings = "voice_settings" + case model = "model_id" + case languageCode = "language_code" + } + + public init( + text: String, + languageCode: String?, + voiceSettings: ElevenLabs.VoiceSettings, + model: ElevenLabs.Model + ) { + self.text = text + self.languageCode = languageCode + self.voiceSettings = voiceSettings + self.model = model + } } - } - - public struct SpeechToSpeechInput: Codable, Hashable, HTTPRequest.Multipart.ContentConvertible, Equatable { - public let voiceId: String - public let audioURL: URL - public let languageCode: String? - public let model: ElevenLabs.Model - public let voiceSettings: ElevenLabs.VoiceSettings - public init( - voiceId: String, - audioURL: URL, - languageCode: String?, - model: ElevenLabs.Model, - voiceSettings: ElevenLabs.VoiceSettings - ) { - self.voiceId = voiceId - self.audioURL = audioURL - self.languageCode = languageCode - self.model = model - self.voiceSettings = voiceSettings + public struct TextToSpeechInput: Codable, Hashable { + public let voiceId: String + public let requestBody: SpeechRequest + + public init(voiceId: String, requestBody: SpeechRequest) { + self.voiceId = voiceId + self.requestBody = requestBody + } } - public func __conversion() throws -> HTTPRequest.Multipart.Content { - var result = HTTPRequest.Multipart.Content() - - result.append( - .text( - named: "model_id", - value: model.rawValue - ) - ) + public struct SpeechToSpeechInput: Codable, Hashable, HTTPRequest.Multipart.ContentConvertible, Equatable { + public let voiceId: String + public let audioURL: URL + public let languageCode: String? + public let model: ElevenLabs.Model + public let voiceSettings: ElevenLabs.VoiceSettings - if let languageCode { - result.append( - .text( - named: "language_code", - value: languageCode - ) - ) + public init( + voiceId: String, + audioURL: URL, + languageCode: String?, + model: ElevenLabs.Model, + voiceSettings: ElevenLabs.VoiceSettings + ) { + self.voiceId = voiceId + self.audioURL = audioURL + self.languageCode = languageCode + self.model = model + self.voiceSettings = voiceSettings } - let encoder = JSONEncoder() - encoder.keyEncodingStrategy = .convertToSnakeCase - if let voiceSettingsData = try? encoder.encode(voiceSettings), - let voiceSettingsString = String( - data: voiceSettingsData, - encoding: .utf8 - ) { + public func __conversion() throws -> HTTPRequest.Multipart.Content { + var result = HTTPRequest.Multipart.Content() + result.append( .text( - named: "voice_settings", - value: voiceSettingsString + named: "model_id", + value: model.rawValue ) ) - } - - if let fileData = try? Data(contentsOf: audioURL) { - result.append( - .file( - named: "audio", - data: fileData, - filename: audioURL.lastPathComponent, - contentType: .mpeg + + if let languageCode { + result.append( + .text( + named: "language_code", + value: languageCode + ) ) - ) + } + + let encoder = JSONEncoder() + encoder.keyEncodingStrategy = .convertToSnakeCase + if let voiceSettingsData = try? encoder.encode(voiceSettings), + let voiceSettingsString = String( + data: voiceSettingsData, + encoding: .utf8 + ) { + result.append( + .text( + named: "voice_settings", + value: voiceSettingsString + ) + ) + } + + if let fileData = try? Data(contentsOf: audioURL) { + result.append( + .file( + named: "audio", + data: fileData, + filename: audioURL.lastPathComponent, + contentType: .mpeg + ) + ) + } + + return result } - - return result - } - } - - public struct AddVoiceInput: Codable, Hashable, HTTPRequest.Multipart.ContentConvertible, Equatable { - public let name: String - public let description: String - public let fileURL: URL - - public init( - name: String, - description: String, - fileURL: URL - ) { - self.name = name - self.description = description - self.fileURL = fileURL } - public func __conversion() throws -> HTTPRequest.Multipart.Content { - var result = HTTPRequest.Multipart.Content() + public struct AddVoiceInput: Codable, Hashable, HTTPRequest.Multipart.ContentConvertible, Equatable { + public let name: String + public let description: String + public let fileURL: URL - result.append( - .text( - named: "name", - value: name - ) - ) - - result.append( - .text( - named: "description", - value: description - ) - ) + public init( + name: String, + description: String, + fileURL: URL + ) { + self.name = name + self.description = description + self.fileURL = fileURL + } - if let fileData = try? Data(contentsOf: fileURL) { + public func __conversion() throws -> HTTPRequest.Multipart.Content { + var result = HTTPRequest.Multipart.Content() + result.append( - .file( - named: "files", - data: fileData, - filename: fileURL.lastPathComponent, - contentType: .m4a + .text( + named: "name", + value: name ) ) - } - - return result - } - } - - public struct EditVoiceInput: Codable, Hashable, HTTPRequest.Multipart.ContentConvertible, Equatable { - public let voiceId: String - public let name: String - public let description: String? - public let fileURL: URL? - - public init( - voiceId: String, - name: String, - description: String? = nil, - fileURL: URL? = nil - ) { - self.voiceId = voiceId - self.name = name - self.description = description - self.fileURL = fileURL - } - - public func __conversion() throws -> HTTPRequest.Multipart.Content { - var result = HTTPRequest.Multipart.Content() - - result.append( - .text( - named: "name", - value: name - ) - ) - - if let description = description { + result.append( .text( named: "description", value: description ) ) - } - - if let fileURL = fileURL, - let fileData = try? Data(contentsOf: fileURL) { - result.append( - .file( - named: "files", - data: fileData, - filename: fileURL.lastPathComponent, - contentType: .m4a + + if let fileData = try? Data(contentsOf: fileURL) { + result.append( + .file( + named: "files", + data: fileData, + filename: fileURL.lastPathComponent, + contentType: .m4a + ) ) - ) + } + + return result } - - return result } - } - - public struct DubbingRequest: Codable, Hashable, HTTPRequest.Multipart.ContentConvertible { - public let name: String? - public let sourceURL: URL? - public let sourceLang: String? - public let targetLang: String - public let numSpeakers: Int? - public let watermark: Bool? - public let startTime: Int? - public let endTime: Int? - public let highestResolution: Bool? - public let dropBackgroundAudio: Bool? - public let useProfanityFilter: Bool? - public let fileData: Data? - public init( - name: String? = nil, - sourceURL: URL? = nil, - sourceLang: String? = nil, - targetLang: String, - numSpeakers: Int? = nil, - watermark: Bool? = nil, - startTime: Int? = nil, - endTime: Int? = nil, - highestResolution: Bool? = nil, - dropBackgroundAudio: Bool? = nil, - useProfanityFilter: Bool? = nil, - fileData: Data? = nil - ) { - self.name = name - self.sourceURL = sourceURL - self.sourceLang = sourceLang - self.targetLang = targetLang - self.numSpeakers = numSpeakers - self.watermark = watermark - self.startTime = startTime - self.endTime = endTime - self.highestResolution = highestResolution - self.dropBackgroundAudio = dropBackgroundAudio - self.useProfanityFilter = useProfanityFilter - self.fileData = fileData - } - - public func __conversion() throws -> HTTPRequest.Multipart.Content { - var result = HTTPRequest.Multipart.Content() - - if let name { - result.append(.text(named: "name", value: name)) - } - - if let sourceURL { - result.append(.text(named: "source_url", value: sourceURL.absoluteString)) - } - - if let sourceLang { - result.append(.text(named: "source_lang", value: sourceLang)) - } - - result.append(.text(named: "target_lang", value: targetLang)) - - if let numSpeakers { - result.append(.text(named: "num_speakers", value: String(numSpeakers))) - } - - if let watermark { - result.append(.text(named: "watermark", value: String(watermark))) - } - - if let startTime { - result.append(.text(named: "start_time", value: String(startTime))) - } - - if let endTime { - result.append(.text(named: "end_time", value: String(endTime))) - } - - if let highestResolution { - result.append(.text(named: "highest_resolution", value: String(highestResolution))) - } + public struct EditVoiceInput: Codable, Hashable, HTTPRequest.Multipart.ContentConvertible, Equatable { + public let voiceId: String + public let name: String + public let description: String? + public let fileURL: URL? - if let dropBackgroundAudio { - result.append(.text(named: "drop_background_audio", value: String(dropBackgroundAudio))) + public init( + voiceId: String, + name: String, + description: String? = nil, + fileURL: URL? = nil + ) { + self.voiceId = voiceId + self.name = name + self.description = description + self.fileURL = fileURL } - if let useProfanityFilter { - result.append(.text(named: "use_profanity_filter", value: String(useProfanityFilter))) - } - - if let fileData { + public func __conversion() throws -> HTTPRequest.Multipart.Content { + var result = HTTPRequest.Multipart.Content() + result.append( - .file( - named: "file", - data: fileData, - filename: "input.mp4", - contentType: .mp4 + .text( + named: "name", + value: name ) ) + + if let description = description { + result.append( + .text( + named: "description", + value: description + ) + ) + } + + if let fileURL = fileURL, + let fileData = try? Data(contentsOf: fileURL) { + result.append( + .file( + named: "files", + data: fileData, + filename: fileURL.lastPathComponent, + contentType: .m4a + ) + ) + } + + return result } - - return result } - } - public struct DubbingInput: Codable, Hashable, HTTPRequest.Multipart.ContentConvertible { - public let voiceId: String - public let audioURL: URL - public let languageCode: String - public let model: ElevenLabs.Model - public let voiceSettings: ElevenLabs.VoiceSettings - public init( - voiceId: String, - audioURL: URL, - languageCode: String, - model: ElevenLabs.Model, - voiceSettings: ElevenLabs.VoiceSettings - ) { - self.voiceId = voiceId - self.audioURL = audioURL - self.languageCode = languageCode - self.model = model - self.voiceSettings = voiceSettings - } - - public func __conversion() throws -> HTTPRequest.Multipart.Content { - var result = HTTPRequest.Multipart.Content() + public struct DubbingRequest: Codable, Hashable, HTTPRequest.Multipart.ContentConvertible { + public let name: String? + public let sourceURL: URL? + public let sourceLang: String? + public let targetLang: String + public let numSpeakers: Int? + public let watermark: Bool? + public let startTime: Int? + public let endTime: Int? + public let highestResolution: Bool? + public let dropBackgroundAudio: Bool? + public let useProfanityFilter: Bool? + public let fileData: Data? - result.append( - .text( - named: "model_id", - value: model.rawValue - ) - ) + public init( + name: String? = nil, + sourceURL: URL? = nil, + sourceLang: String? = nil, + targetLang: String, + numSpeakers: Int? = nil, + watermark: Bool? = nil, + startTime: Int? = nil, + endTime: Int? = nil, + highestResolution: Bool? = nil, + dropBackgroundAudio: Bool? = nil, + useProfanityFilter: Bool? = nil, + fileData: Data? = nil + ) { + self.name = name + self.sourceURL = sourceURL + self.sourceLang = sourceLang + self.targetLang = targetLang + self.numSpeakers = numSpeakers + self.watermark = watermark + self.startTime = startTime + self.endTime = endTime + self.highestResolution = highestResolution + self.dropBackgroundAudio = dropBackgroundAudio + self.useProfanityFilter = useProfanityFilter + self.fileData = fileData + } - result.append( - .text( - named: "language_code", - value: languageCode - ) - ) + public func __conversion() throws -> HTTPRequest.Multipart.Content { + var result = HTTPRequest.Multipart.Content() + + if let name { + result.append(.text(named: "name", value: name)) + } + + if let sourceURL { + result.append(.text(named: "source_url", value: sourceURL.absoluteString)) + } + + if let sourceLang { + result.append(.text(named: "source_lang", value: sourceLang)) + } + + result.append(.text(named: "target_lang", value: targetLang)) + + if let numSpeakers { + result.append(.text(named: "num_speakers", value: String(numSpeakers))) + } + + if let watermark { + result.append(.text(named: "watermark", value: String(watermark))) + } + + if let startTime { + result.append(.text(named: "start_time", value: String(startTime))) + } + + if let endTime { + result.append(.text(named: "end_time", value: String(endTime))) + } + + if let highestResolution { + result.append(.text(named: "highest_resolution", value: String(highestResolution))) + } + + if let dropBackgroundAudio { + result.append(.text(named: "drop_background_audio", value: String(dropBackgroundAudio))) + } + + if let useProfanityFilter { + result.append(.text(named: "use_profanity_filter", value: String(useProfanityFilter))) + } + + if let fileData { + result.append( + .file( + named: "file", + data: fileData, + filename: "input.mp4", + contentType: .mp4 + ) + ) + } + + return result + } + } + public struct DubbingInput: Codable, Hashable, HTTPRequest.Multipart.ContentConvertible { + public let voiceId: String + public let audioURL: URL + public let languageCode: String + public let model: ElevenLabs.Model + public let voiceSettings: ElevenLabs.VoiceSettings + + public init( + voiceId: String, + audioURL: URL, + languageCode: String, + model: ElevenLabs.Model, + voiceSettings: ElevenLabs.VoiceSettings + ) { + self.voiceId = voiceId + self.audioURL = audioURL + self.languageCode = languageCode + self.model = model + self.voiceSettings = voiceSettings + } - let encoder = JSONEncoder() - encoder.keyEncodingStrategy = .convertToSnakeCase - if let voiceSettingsData = try? encoder.encode(voiceSettings), - let voiceSettingsString = String( - data: voiceSettingsData, - encoding: .utf8 - ) { + public func __conversion() throws -> HTTPRequest.Multipart.Content { + var result = HTTPRequest.Multipart.Content() + result.append( .text( - named: "voice_settings", - value: voiceSettingsString + named: "model_id", + value: model.rawValue ) ) - } - - if let fileData = try? Data(contentsOf: audioURL) { + result.append( - .file( - named: "audio", - data: fileData, - filename: audioURL.lastPathComponent, - contentType: .mpeg + .text( + named: "language_code", + value: languageCode ) ) + + let encoder = JSONEncoder() + encoder.keyEncodingStrategy = .convertToSnakeCase + if let voiceSettingsData = try? encoder.encode(voiceSettings), + let voiceSettingsString = String( + data: voiceSettingsData, + encoding: .utf8 + ) { + result.append( + .text( + named: "voice_settings", + value: voiceSettingsString + ) + ) + } + + if let fileData = try? Data(contentsOf: audioURL) { + result.append( + .file( + named: "audio", + data: fileData, + filename: audioURL.lastPathComponent, + contentType: .mpeg + ) + ) + } + + return result } - - return result } } } diff --git a/Sources/ElevenLabs/Intramodular/Models/ElevenLabs.DubbingOptions.swift b/Sources/ElevenLabs/Intramodular/Models/ElevenLabs.DubbingOptions.swift index 1ce91c86..3b7b0373 100644 --- a/Sources/ElevenLabs/Intramodular/Models/ElevenLabs.DubbingOptions.swift +++ b/Sources/ElevenLabs/Intramodular/Models/ElevenLabs.DubbingOptions.swift @@ -5,6 +5,8 @@ // Created by Jared Davidson on 1/7/25. // +import Foundation + extension ElevenLabs.Client { public struct DubbingOptions { public var watermark: Bool? diff --git a/Sources/HumeAI/Intramodular/Models/HumeAI.Chat.swift b/Sources/HumeAI/Intramodular/Models/HumeAI.Chat.swift index 8259acd0..9f04a260 100644 --- a/Sources/HumeAI/Intramodular/Models/HumeAI.Chat.swift +++ b/Sources/HumeAI/Intramodular/Models/HumeAI.Chat.swift @@ -5,6 +5,8 @@ // Created by Jared Davidson on 11/25/24. // +import Foundation + extension HumeAI { public struct Chat: Codable { public let id: String diff --git a/Sources/HumeAI/Intramodular/Models/HumeAI.ChatEvent.swift b/Sources/HumeAI/Intramodular/Models/HumeAI.ChatEvent.swift index 3d17547d..3e45ecf6 100644 --- a/Sources/HumeAI/Intramodular/Models/HumeAI.ChatEvent.swift +++ b/Sources/HumeAI/Intramodular/Models/HumeAI.ChatEvent.swift @@ -5,6 +5,8 @@ // Created by Jared Davidson on 11/25/24. // +import Foundation + extension HumeAI { public struct ChatEvent: Codable { public let id: String diff --git a/Sources/HumeAI/Intramodular/Models/HumeAI.ChatGroup.swift b/Sources/HumeAI/Intramodular/Models/HumeAI.ChatGroup.swift index 3037b590..ff0a0433 100644 --- a/Sources/HumeAI/Intramodular/Models/HumeAI.ChatGroup.swift +++ b/Sources/HumeAI/Intramodular/Models/HumeAI.ChatGroup.swift @@ -5,6 +5,8 @@ // Created by Jared Davidson on 11/25/24. // +import Foundation + extension HumeAI { public struct ChatGroup { public let id: String diff --git a/Sources/HumeAI/Intramodular/Models/HumeAI.ChatMessage.swift b/Sources/HumeAI/Intramodular/Models/HumeAI.ChatMessage.swift index 1085fbbb..cb091272 100644 --- a/Sources/HumeAI/Intramodular/Models/HumeAI.ChatMessage.swift +++ b/Sources/HumeAI/Intramodular/Models/HumeAI.ChatMessage.swift @@ -5,6 +5,8 @@ // Created by Jared Davidson on 11/25/24. // +import Foundation + extension HumeAI { public struct ChatMessage { public let role: String diff --git a/Sources/HumeAI/Intramodular/Models/HumeAI.ChatResponse.swift b/Sources/HumeAI/Intramodular/Models/HumeAI.ChatResponse.swift index 6353d5b2..2b6f2051 100644 --- a/Sources/HumeAI/Intramodular/Models/HumeAI.ChatResponse.swift +++ b/Sources/HumeAI/Intramodular/Models/HumeAI.ChatResponse.swift @@ -5,6 +5,8 @@ // Created by Jared Davidson on 11/25/24. // +import Foundation + extension HumeAI { public struct ChatResponse { public let id: String diff --git a/Sources/HumeAI/Intramodular/Models/HumeAI.Config.swift b/Sources/HumeAI/Intramodular/Models/HumeAI.Config.swift index 6cd8d926..f2debc1e 100644 --- a/Sources/HumeAI/Intramodular/Models/HumeAI.Config.swift +++ b/Sources/HumeAI/Intramodular/Models/HumeAI.Config.swift @@ -5,6 +5,8 @@ // Created by Jared Davidson on 11/25/24. // +import Foundation + extension HumeAI { public struct Config: Codable { public let id: String diff --git a/Sources/HumeAI/Intramodular/Models/HumeAI.Dataset.swift b/Sources/HumeAI/Intramodular/Models/HumeAI.Dataset.swift index ab06b510..23e315de 100644 --- a/Sources/HumeAI/Intramodular/Models/HumeAI.Dataset.swift +++ b/Sources/HumeAI/Intramodular/Models/HumeAI.Dataset.swift @@ -5,6 +5,8 @@ // Created by Jared Davidson on 11/25/24. // +import Foundation + extension HumeAI { public struct Dataset: Codable { public let id: String diff --git a/Sources/HumeAI/Intramodular/Models/HumeAI.File.swift b/Sources/HumeAI/Intramodular/Models/HumeAI.File.swift index 549e6589..56392e60 100644 --- a/Sources/HumeAI/Intramodular/Models/HumeAI.File.swift +++ b/Sources/HumeAI/Intramodular/Models/HumeAI.File.swift @@ -5,6 +5,8 @@ // Created by Jared Davidson on 11/25/24. // +import Foundation + extension HumeAI { public struct File: Codable { public let id: String diff --git a/Sources/HumeAI/Intramodular/Models/HumeAI.FileInput.swift b/Sources/HumeAI/Intramodular/Models/HumeAI.FileInput.swift index b3d57c99..9f2995fa 100644 --- a/Sources/HumeAI/Intramodular/Models/HumeAI.FileInput.swift +++ b/Sources/HumeAI/Intramodular/Models/HumeAI.FileInput.swift @@ -5,6 +5,8 @@ // Created by Jared Davidson on 11/25/24. // +import Foundation + extension HumeAI { public struct FileInput: Codable { public let url: String diff --git a/Sources/HumeAI/Intramodular/Models/HumeAI.Job.swift b/Sources/HumeAI/Intramodular/Models/HumeAI.Job.swift index 5d9587f3..0231784f 100644 --- a/Sources/HumeAI/Intramodular/Models/HumeAI.Job.swift +++ b/Sources/HumeAI/Intramodular/Models/HumeAI.Job.swift @@ -5,6 +5,8 @@ // Created by Jared Davidson on 11/25/24. // +import Foundation + extension HumeAI { // MARK: - Root Response public struct Job: Codable { diff --git a/Sources/HumeAI/Intramodular/Models/HumeAI.Models.swift b/Sources/HumeAI/Intramodular/Models/HumeAI.Models.swift index 307c30f4..0c22b653 100644 --- a/Sources/HumeAI/Intramodular/Models/HumeAI.Models.swift +++ b/Sources/HumeAI/Intramodular/Models/HumeAI.Models.swift @@ -5,6 +5,8 @@ // Created by Jared Davidson on 11/25/24. // +import Foundation + extension HumeAI { public struct Model: Codable { public let id: String diff --git a/Sources/HumeAI/Intramodular/Models/HumeAI.Prompt.swift b/Sources/HumeAI/Intramodular/Models/HumeAI.Prompt.swift index e3cd0dcd..7cdd85c1 100644 --- a/Sources/HumeAI/Intramodular/Models/HumeAI.Prompt.swift +++ b/Sources/HumeAI/Intramodular/Models/HumeAI.Prompt.swift @@ -5,6 +5,8 @@ // Created by Jared Davidson on 11/25/24. // +import Foundation + extension HumeAI { public struct Prompt: Codable { public let id: String diff --git a/Sources/HumeAI/Intramodular/Models/HumeAI.Tool.swift b/Sources/HumeAI/Intramodular/Models/HumeAI.Tool.swift index 24cf1df7..c4b6b84f 100644 --- a/Sources/HumeAI/Intramodular/Models/HumeAI.Tool.swift +++ b/Sources/HumeAI/Intramodular/Models/HumeAI.Tool.swift @@ -5,6 +5,8 @@ // Created by Jared Davidson on 11/25/24. // +import Foundation + extension HumeAI { public struct Tool: Codable { public let id: String diff --git a/Sources/NeetsAI/Intramodular/API/NeetsAI.APISpecification.RequestBodies.swift b/Sources/NeetsAI/Intramodular/API/NeetsAI.APISpecification.RequestBodies.swift index 6c25fd1e..f48f0519 100644 --- a/Sources/NeetsAI/Intramodular/API/NeetsAI.APISpecification.RequestBodies.swift +++ b/Sources/NeetsAI/Intramodular/API/NeetsAI.APISpecification.RequestBodies.swift @@ -5,6 +5,8 @@ // Created by Jared Davidson on 11/22/24. // +import Foundation + extension NeetsAI.APISpecification { enum RequestBodies { struct TTSInput: Codable { diff --git a/Sources/PlayHT/Intramodular/Models/PlayHT.VoiceSettings.swift b/Sources/PlayHT/Intramodular/Models/PlayHT.VoiceSettings.swift index ea90cdeb..e676b451 100644 --- a/Sources/PlayHT/Intramodular/Models/PlayHT.VoiceSettings.swift +++ b/Sources/PlayHT/Intramodular/Models/PlayHT.VoiceSettings.swift @@ -5,6 +5,8 @@ // Created by Jared Davidson on 11/20/24. // +import Foundation + extension PlayHT { public struct VoiceSettings: Codable, Hashable { public var speed: Double From bf45e700ddce67525c69603c1c41e0af9c2fb489 Mon Sep 17 00:00:00 2001 From: Akshat Patel Date: Sun, 27 Apr 2025 20:42:35 +0530 Subject: [PATCH 073/271] Update build action --- .github/workflows/preternatural-build.yml | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/.github/workflows/preternatural-build.yml b/.github/workflows/preternatural-build.yml index 181b18eb..2726ed3e 100644 --- a/.github/workflows/preternatural-build.yml +++ b/.github/workflows/preternatural-build.yml @@ -5,14 +5,21 @@ on: pull_request: branches: [ main ] workflow_dispatch: - concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true - jobs: - build: - uses: PreternaturalAI/preternatural-github-actions/.github/workflows/preternatural-build.yml@main - with: - xcode-version: '16' - configurations: '["debug"]' \ No newline at end of file + preternatural-build: + name: Build (Xcode ${{ matrix.xcode }}) + runs-on: ghcr.io/cirruslabs/macos-runner:sequoia + strategy: + matrix: + xcode: ['16.2', '16.3'] + steps: + - name: Checkout repository + uses: actions/checkout@v3 + - name: Run Preternatural Build + uses: PreternaturalAI/preternatural-github-actions/preternatural-build@main + with: + xcode-version: ${{ matrix.xcode }} + configurations: '["debug"]' \ No newline at end of file From 50c32418513f200e6b6a2432e79495116e7598eb Mon Sep 17 00:00:00 2001 From: Purav Manot Date: Mon, 2 Jun 2025 18:13:39 -0400 Subject: [PATCH 074/271] Update package --- .../Models/_Gemini.GenerationConfig.swift | 23 +++++++++++++++++++ .../_Gemini.GoogleSearchRetrieval.swift | 2 +- .../_Gemini.Client+ContentGeneration.swift | 6 +++++ .../_Gemini/Intramodular/_Gemini.Model.swift | 1 + 4 files changed, 31 insertions(+), 1 deletion(-) diff --git a/Sources/_Gemini/Intramodular/Models/_Gemini.GenerationConfig.swift b/Sources/_Gemini/Intramodular/Models/_Gemini.GenerationConfig.swift index e352e195..45b147af 100644 --- a/Sources/_Gemini/Intramodular/Models/_Gemini.GenerationConfig.swift +++ b/Sources/_Gemini/Intramodular/Models/_Gemini.GenerationConfig.swift @@ -6,6 +6,7 @@ // import Foundation +import CorePersistence extension _Gemini { public struct GenerationConfiguration: Codable { @@ -114,3 +115,25 @@ extension _Gemini.SchemaObject: Codable { } } } + +// MARK: - Conversion + +extension _Gemini.SchemaObject { + public init(from jsonSchema: JSONSchema) { + switch jsonSchema.type { + case .object: + let mappedProperties = jsonSchema.properties?.mapValues { _Gemini.SchemaObject(from: $0) } ?? [:] + self = .object(properties: mappedProperties) + case .array: + self = .array(items: _Gemini.SchemaObject(from: jsonSchema.items ?? JSONSchema(type: .string))) + case .string: + self = .string + case .number, .integer: + self = .number + case .boolean: + self = .boolean + case nil: + self = .object(properties: [:]) + } + } +} diff --git a/Sources/_Gemini/Intramodular/Models/_Gemini.GoogleSearchRetrieval.swift b/Sources/_Gemini/Intramodular/Models/_Gemini.GoogleSearchRetrieval.swift index 775464d9..0029e5b0 100644 --- a/Sources/_Gemini/Intramodular/Models/_Gemini.GoogleSearchRetrieval.swift +++ b/Sources/_Gemini/Intramodular/Models/_Gemini.GoogleSearchRetrieval.swift @@ -15,7 +15,7 @@ extension _Gemini { public let dynamicRetrievalConfiguration: DynamicRetrievalConfiguration - public init(dynamicRetrievalConfiguration: DynamicRetrievalConfiguration) { + public init(dynamicRetrievalConfiguration: DynamicRetrievalConfiguration = .init(dynamicThreshold: 0.3)) { self.dynamicRetrievalConfiguration = dynamicRetrievalConfiguration } } diff --git a/Sources/_Gemini/Intramodular/_Gemini.Client+ContentGeneration.swift b/Sources/_Gemini/Intramodular/_Gemini.Client+ContentGeneration.swift index 174b0e1e..7bb8f683 100644 --- a/Sources/_Gemini/Intramodular/_Gemini.Client+ContentGeneration.swift +++ b/Sources/_Gemini/Intramodular/_Gemini.Client+ContentGeneration.swift @@ -26,6 +26,7 @@ extension _Gemini.Client { public func generateContent( messages: [_Gemini.Message] = [], file: _Gemini.File? = nil, + tools: [_Gemini.Tool] = [], mimeType: HTTPMediaType? = nil, model: _Gemini.Model, configuration: _Gemini.GenerationConfiguration = configDefault @@ -58,6 +59,7 @@ extension _Gemini.Client { return try await generateContent( contents: contents, systemInstruction: systemInstruction, + tools: tools, model: model, configuration: configuration ) @@ -66,6 +68,7 @@ extension _Gemini.Client { public func generateContent( messages: [_Gemini.Message] = [], files: [_Gemini.File], + tools: [_Gemini.Tool] = [], model: _Gemini.Model, configuration: _Gemini.GenerationConfiguration = configDefault ) async throws -> _Gemini.Content { @@ -96,6 +99,7 @@ extension _Gemini.Client { return try await generateContent( contents: contents, systemInstruction: systemInstruction, + tools: tools, model: model, configuration: configuration ) @@ -104,6 +108,7 @@ extension _Gemini.Client { internal func generateContent( contents: [_Gemini.APISpecification.RequestBodies.Content], systemInstruction: _Gemini.APISpecification.RequestBodies.Content?, + tools: [_Gemini.Tool] = [], model: _Gemini.Model, configuration: _Gemini.GenerationConfiguration ) async throws -> _Gemini.Content { @@ -112,6 +117,7 @@ extension _Gemini.Client { requestBody: .init( contents: contents, generationConfig: configuration, + tools: tools, systemInstruction: systemInstruction ) ) diff --git a/Sources/_Gemini/Intramodular/_Gemini.Model.swift b/Sources/_Gemini/Intramodular/_Gemini.Model.swift index 672dc5e0..bf217489 100644 --- a/Sources/_Gemini/Intramodular/_Gemini.Model.swift +++ b/Sources/_Gemini/Intramodular/_Gemini.Model.swift @@ -23,6 +23,7 @@ extension _Gemini { self.rawValue = rawValue } + public static let gemini_2_0_flash = Model(rawValue: "gemini-2.0-flash") public static let gemini_2_0_flash_exp = Model(rawValue: "gemini-2.0-flash-exp") public static let gemini_1_5_pro = Model(rawValue: "gemini-1.5-pro") public static let gemini_1_5_pro_latest = Model(rawValue: "gemini-1.5-pro-latest") From 7ea8f1cf8501dfb42935dff2960c61ae5c62e58d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 10 Mar 2026 00:22:46 +0000 Subject: [PATCH 075/271] Initial plan From 735e75646ae6ef7376531263db07aca048c32f5e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 2 Aug 2026 12:25:10 +0000 Subject: [PATCH 076/271] feat: add error logging, agent pipeline, and failed response store MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - LLMErrorLogger actor + AbstractLLM.ErrorLogEntry for capturing errors that occur during LLM request handling - FailedLLMResponseStore actor + AbstractLLM.FailedChatResponse for persisting failed chat completions; includes JSONL export for fine-tuning pipelines - LLMAgentPipeline (Observer β†’ Research β†’ Decision) with LLMAgentStage protocol and built-in stage implementations --- Package.resolved | 6 +- .../LLMs/Agents/LLMAgentPipeline.swift | 148 ++++++++++++++++++ .../LLMs/Logging/FailedLLMResponseStore.swift | 108 +++++++++++++ .../LLMs/Logging/LLMErrorLogger.swift | 94 +++++++++++ 4 files changed, 353 insertions(+), 3 deletions(-) create mode 100644 Sources/LargeLanguageModels/Intramodular/LLMs/Agents/LLMAgentPipeline.swift create mode 100644 Sources/LargeLanguageModels/Intramodular/LLMs/Logging/FailedLLMResponseStore.swift create mode 100644 Sources/LargeLanguageModels/Intramodular/LLMs/Logging/LLMErrorLogger.swift diff --git a/Package.resolved b/Package.resolved index 1aaa8500..07dab8b6 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "24eb1da3856f86e40bb6b87db2d4707a7cf68fd47d732dcbb9ec4d0aa614626d", + "originHash" : "2572cb6f07a6ae0395beb608bb9286d4ef1f1dee043e4886367aa794452e4a55", "pins" : [ { "identity" : "corepersistence", @@ -42,7 +42,7 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-collections", "state" : { - "revision" : "671108c96644956dddcd89dd59c203dcdb36cec7", + "revision" : "ff27e3678ddb895ebf917ce513f3105395078dae", "version" : "1.1.4" } }, @@ -51,7 +51,7 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-syntax.git", "state" : { - "revision" : "0687f71944021d616d34d922343dcef086855920", + "revision" : "60e8eb850721b5a6eebbd973b39f450a16553bd9", "version" : "600.0.1" } }, diff --git a/Sources/LargeLanguageModels/Intramodular/LLMs/Agents/LLMAgentPipeline.swift b/Sources/LargeLanguageModels/Intramodular/LLMs/Agents/LLMAgentPipeline.swift new file mode 100644 index 00000000..b83e9a18 --- /dev/null +++ b/Sources/LargeLanguageModels/Intramodular/LLMs/Agents/LLMAgentPipeline.swift @@ -0,0 +1,148 @@ +// +// Copyright (c) Vatsal Manot +// + +import Foundation +import Swallow + +// MARK: - Stage protocol + +/// A single stage in an LLM-driven agent pipeline. +/// +/// Each stage receives a plain-text input, processes it with an LLM using +/// its ``systemPrompt``, and returns a plain-text output that feeds the next stage. +public protocol LLMAgentStage: Sendable { + /// A human-readable label for this stage (e.g. `"Observer"`). + var stageName: String { get } + + /// The system prompt that instructs the LLM on how to behave in this stage. + var systemPrompt: String { get } + + /// Process `input` using `llm` and return the stage's output. + func process(input: String, using llm: any LLMRequestHandling) async throws -> String +} + +extension LLMAgentStage { + public func process(input: String, using llm: any LLMRequestHandling) async throws -> String { + let messages: [AbstractLLM.ChatMessage] = [ + .system(systemPrompt), + .user(input), + ] + let completion = try await llm.complete(messages) + return try completion.toString() + } +} + +// MARK: - Built-in stages + +extension AbstractLLM { + /// Observes raw input (events, signals, changes) and describes what is happening. + public struct ObserverStage: LLMAgentStage { + public let stageName: String = "Observer" + public let systemPrompt: String + + public init( + systemPrompt: String = """ + You are an observer agent. Given raw input data, events, or signals, \ + clearly describe what is happening. Be concise and factual. + """ + ) { + self.systemPrompt = systemPrompt + } + } + + /// Analyses observations to discover meaning, patterns, and predictions. + public struct ResearchStage: LLMAgentStage { + public let stageName: String = "Research" + public let systemPrompt: String + + public init( + systemPrompt: String = """ + You are a research agent. Given an observation, analyse its meaning, \ + identify patterns, and make predictions. Provide a concise analytical summary. + """ + ) { + self.systemPrompt = systemPrompt + } + } + + /// Takes research results and produces a concrete decision or action recommendation. + public struct DecisionStage: LLMAgentStage { + public let stageName: String = "Decision" + public let systemPrompt: String + + public init( + systemPrompt: String = """ + You are a decision agent. Given research findings, produce a clear, \ + actionable decision or recommendation. Be direct and specific. + """ + ) { + self.systemPrompt = systemPrompt + } + } +} + +// MARK: - Pipeline result + +extension AbstractLLM { + /// The output produced by each stage of an ``AgentPipeline`` run. + public struct AgentPipelineResult: Sendable { + /// Raw input passed into the pipeline. + public let input: String + /// Output from the ``ObserverStage``: what is happening. + public let observation: String + /// Output from the ``ResearchStage``: what it means. + public let research: String + /// Output from the ``DecisionStage``: what to do. + public let decision: String + } +} + +// MARK: - Pipeline + +extension AbstractLLM { + /// A sequential Observer β†’ Research β†’ Decision agent pipeline. + /// + /// Each stage's output becomes the next stage's input, mirroring the + /// Reality β†’ Observation β†’ Intelligence β†’ Decision flow. + /// + /// ```swift + /// let pipeline = AbstractLLM.AgentPipeline(llm: myLLM) + /// let result = try await pipeline.run(input: "Server CPU spiked to 98% at 03:00 UTC") + /// print(result.decision) // "Scale out the web tier by two instances …" + /// ``` + public struct AgentPipeline: Sendable { + public let observer: any LLMAgentStage + public let researcher: any LLMAgentStage + public let decisionMaker: any LLMAgentStage + public let llm: any LLMRequestHandling + + public init( + observer: any LLMAgentStage = ObserverStage(), + researcher: any LLMAgentStage = ResearchStage(), + decisionMaker: any LLMAgentStage = DecisionStage(), + llm: any LLMRequestHandling + ) { + self.observer = observer + self.researcher = researcher + self.decisionMaker = decisionMaker + self.llm = llm + } + + /// Run the full Observer β†’ Research β†’ Decision pipeline on `input`. + /// + /// - Parameter input: The raw reality input (events, signals, data). + /// - Returns: An ``AgentPipelineResult`` containing each stage's output. + public func run(input: String) async throws -> AgentPipelineResult { + let observation = try await observer.process(input: input, using: llm) + let research = try await researcher.process(input: observation, using: llm) + let decision = try await decisionMaker.process(input: research, using: llm) + return AgentPipelineResult( + input: input, + observation: observation, + research: research, + decision: decision + ) + } + } +} diff --git a/Sources/LargeLanguageModels/Intramodular/LLMs/Logging/FailedLLMResponseStore.swift b/Sources/LargeLanguageModels/Intramodular/LLMs/Logging/FailedLLMResponseStore.swift new file mode 100644 index 00000000..8ddad34f --- /dev/null +++ b/Sources/LargeLanguageModels/Intramodular/LLMs/Logging/FailedLLMResponseStore.swift @@ -0,0 +1,108 @@ +// +// Copyright (c) Vatsal Manot +// + +import Foundation +import Swallow + +extension AbstractLLM { + /// A record of a chat completion request that resulted in an error. + /// + /// These records can be exported and used to improve prompts or to build a + /// fine-tuning dataset that corrects known failure modes. + public struct FailedChatResponse: Codable, Hashable, Identifiable, Sendable { + public let id: UUID + public let timestamp: Date + public let modelIdentifier: ModelIdentifier? + public let prompt: [AbstractLLM.ChatMessage] + public let errorDescription: String + + public init( + id: UUID = UUID(), + timestamp: Date = Date(), + modelIdentifier: ModelIdentifier? = nil, + prompt: [AbstractLLM.ChatMessage], + errorDescription: String + ) { + self.id = id + self.timestamp = timestamp + self.modelIdentifier = modelIdentifier + self.prompt = prompt + self.errorDescription = errorDescription + } + } +} + +/// A thread-safe store for chat completion requests that resulted in errors. +/// +/// Accumulated entries can be exported as JSONL for use in fine-tuning +/// pipelines that teach models to handle or avoid past failure patterns. +public actor FailedLLMResponseStore { + /// The shared, process-wide failed-response store. + public static let shared = FailedLLMResponseStore() + + private var _entries: [AbstractLLM.FailedChatResponse] = [] + + public init() {} + + /// All recorded failed responses, in chronological order. + public var entries: [AbstractLLM.FailedChatResponse] { + _entries + } + + /// Append a new failed-response record. + public func record(_ entry: AbstractLLM.FailedChatResponse) { + _entries.append(entry) + } + + /// Remove all recorded entries. + public func clear() { + _entries.removeAll() + } + + /// Export all entries as a JSONL string. + /// + /// Each line is a JSON object representing one ``AbstractLLM/FailedChatResponse``. + /// The output is suitable for ingestion by fine-tuning pipelines that use + /// the JSONL format (e.g. OpenAI fine-tuning, Axolotl, Unsloth). + public func exportAsJSONL() throws -> String { + let encoder = JSONEncoder() + encoder.outputFormatting = [] + encoder.dateEncodingStrategy = .iso8601 + return try _entries + .map { try String(decoding: encoder.encode($0), as: UTF8.self) } + .joined(separator: "\n") + } +} + +// MARK: - LLMRequestHandling integration + +extension LLMRequestHandling { + /// Complete a chat prompt, automatically recording any failure in `store`. + /// + /// On failure the record is appended to `store` and then the error is + /// rethrown so normal error-handling still applies. + /// + /// - Parameters: + /// - prompt: The chat prompt to complete. + /// - parameters: Completion parameters. + /// - store: The ``FailedLLMResponseStore`` to append failures to. + public func complete( + prompt: AbstractLLM.ChatPrompt, + parameters: AbstractLLM.ChatCompletionParameters, + recordingFailuresIn store: FailedLLMResponseStore + ) async throws -> AbstractLLM.ChatCompletion { + do { + return try await complete(prompt: prompt, parameters: parameters) + } catch { + let modelID = try? prompt.context.modelIdentifier?._oneValue + let entry = AbstractLLM.FailedChatResponse( + modelIdentifier: modelID, + prompt: prompt.messages, + errorDescription: error.localizedDescription + ) + await store.record(entry) + throw error + } + } +} diff --git a/Sources/LargeLanguageModels/Intramodular/LLMs/Logging/LLMErrorLogger.swift b/Sources/LargeLanguageModels/Intramodular/LLMs/Logging/LLMErrorLogger.swift new file mode 100644 index 00000000..34c7f140 --- /dev/null +++ b/Sources/LargeLanguageModels/Intramodular/LLMs/Logging/LLMErrorLogger.swift @@ -0,0 +1,94 @@ +// +// Copyright (c) Vatsal Manot +// + +import Foundation +import Swallow + +extension AbstractLLM { + /// A record of an error that occurred during an LLM request. + public struct ErrorLogEntry: Codable, Hashable, Identifiable, Sendable { + public let id: UUID + public let timestamp: Date + public let modelIdentifier: ModelIdentifier? + public let promptDescription: String + public let errorDescription: String + + public init( + id: UUID = UUID(), + timestamp: Date = Date(), + modelIdentifier: ModelIdentifier? = nil, + promptDescription: String, + errorDescription: String + ) { + self.id = id + self.timestamp = timestamp + self.modelIdentifier = modelIdentifier + self.promptDescription = promptDescription + self.errorDescription = errorDescription + } + } +} + +/// A thread-safe logger for errors that occur during LLM requests. +/// +/// Errors accumulated here can be reviewed to improve prompt design or to +/// identify patterns in failures. Use +/// ``LLMRequestHandling/complete(_:parameters:loggingErrorsTo:)`` to +/// automatically capture failures from any `LLMRequestHandling` call. +public actor LLMErrorLogger { + /// The shared, process-wide error logger. + public static let shared = LLMErrorLogger() + + private var _entries: [AbstractLLM.ErrorLogEntry] = [] + + public init() {} + + /// All recorded error entries, in chronological order. + public var entries: [AbstractLLM.ErrorLogEntry] { + _entries + } + + /// Append a new entry to the log. + public func log(_ entry: AbstractLLM.ErrorLogEntry) { + _entries.append(entry) + } + + /// Remove all recorded entries. + public func clear() { + _entries.removeAll() + } +} + +// MARK: - LLMRequestHandling integration + +extension LLMRequestHandling { + /// Complete a prompt, automatically logging any thrown error to `logger`. + /// + /// On failure the entry is logged and then the error is rethrown so normal + /// error-handling still applies. + /// + /// - Parameters: + /// - prompt: The prompt to complete. + /// - parameters: Completion parameters. + /// - logger: The ``LLMErrorLogger`` to append failures to. + /// Defaults to ``LLMErrorLogger/shared``. + public func complete( + _ prompt: Prompt, + parameters: Prompt.CompletionParameters, + loggingErrorsTo logger: LLMErrorLogger + ) async throws -> Prompt.Completion { + do { + return try await complete(prompt: prompt, parameters: parameters) + } catch { + let modelID = try? prompt.context.modelIdentifier?._oneValue + let entry = AbstractLLM.ErrorLogEntry( + modelIdentifier: modelID, + promptDescription: String(describing: prompt), + errorDescription: error.localizedDescription + ) + await logger.log(entry) + throw error + } + } +} From 7026c5b70282c7d3716f6b1864b6dce9c399bb28 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 11 Aug 2026 09:17:15 +0000 Subject: [PATCH 077/271] Improve project documentation and contribution guidance Co-authored-by: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> --- CHANGELOG.md | 11 ++++ CONTRIBUTING.md | 37 ++++++++++++ README.md | 134 ++++++++++++++++++++++++++++++++++++------- docs/ARCHITECTURE.md | 85 +++++++++++++++++++++++++++ 4 files changed, 246 insertions(+), 21 deletions(-) create mode 100644 CHANGELOG.md create mode 100644 CONTRIBUTING.md create mode 100644 docs/ARCHITECTURE.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..cfb3a06d --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,11 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +## [Unreleased] + +### Added + +- Added architecture documentation in `docs/ARCHITECTURE.md`. +- Added contribution guidelines in `CONTRIBUTING.md`. +- Improved `README.md` with architecture, dependency graph, and documentation links. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..1f9c2b44 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,37 @@ +# Contributing + +Thanks for contributing to AI. + +## Prerequisites + +- Xcode 15.4+ (Swift 5.10 toolchain) +- Apple platform SDKs supported by this package + +## Getting Started + +1. Fork the repository and create a feature branch. +2. Make focused changes with clear commit messages. +3. Run tests locally: + +```bash +swift test +``` + +4. Update documentation when behavior, APIs, or architecture changes. +5. Open a pull request with a clear summary and test notes. + +## Pull Request Checklist + +- [ ] Changes are scoped to one topic +- [ ] Public API changes are documented +- [ ] Tests pass locally (`swift test`) +- [ ] README/docs/changelog updated when needed + +## Reporting Issues + +When filing a bug, include: + +- Steps to reproduce +- Expected vs actual behavior +- Platform and Xcode/Swift versions +- Relevant logs or sample payloads diff --git a/README.md b/README.md index cf435eff..23d43af9 100644 --- a/README.md +++ b/README.md @@ -42,27 +42,119 @@ The definitive, open-source Swift framework for interfacing with generative AI. -[Installation](#installation)\ -[Usage](#usage) - -* [Import the framework](#import-the-framework) -* [Initialize an AI Client](#initialize-an-ai-client) -* [LLM Clients Abstraction](#llm-clients-abstraction) -* [Supported Models](#supported-models) -* [Completions](#completions) - * [Basic Completions](#basic-completions) - * [Vision: Image-to-Text](#vision-image-to-text) - * [Function Calling](#function-calling) -* [DALLE-3 Image Generation](#dalle-3-image-generation) -* [Audio](#audio) - * [Audio Transcription: Whisper](#audio-transcription-whisper) - * [Audio Generation: OpenAI](#audio-generation-openai) - * [Audio Generation: ElevenLabs](#audio-generation-elevenlabs) -* [Text Embeddings](#text-embeddings) - -[Roadmap](#roadmap) \ -[Acknowledgements](#acknowledgements) \ -[License](#license) +## Documentation + +- [Architecture](docs/ARCHITECTURE.md) +- [Contributing](CONTRIBUTING.md) +- [Changelog](CHANGELOG.md) + +## Table of Contents + +- [Architecture](#architecture) +- [Dependencies](#dependencies) +- [Installation](#installation) +- [Usage](#usage) + - [Import the framework](#import-the-framework) + - [Initialize an AI Client](#initialize-an-ai-client) + - [LLM Clients Abstraction](#llm-clients-abstraction) + - [Supported Models](#supported-models) + - [Completions](#completions) + - [Basic Completions](#basic-completions) + - [Vision: Image-to-Text](#vision-image-to-text) + - [Function Calling](#function-calling) + - [DALLE-3 Image Generation](#dalle-3-image-generation) + - [Audio](#audio) + - [Audio Transcription: Whisper](#audio-transcription-whisper) + - [Audio Generation: OpenAI](#audio-generation-openai) + - [Audio Generation: ElevenLabs](#audio-generation-elevenlabs) + - [Text Embeddings](#text-embeddings) +- [Roadmap](#roadmap) +- [Acknowledgements](#acknowledgements) +- [License](#license) + +## Architecture + +This package is organized as a Swift Package Manager workspace with layered modules: + +- `CoreMI` provides shared core abstractions used across providers. +- `LargeLanguageModels` builds common LLM request/response functionality on top of `CoreMI`. +- Provider modules (`OpenAI`, `Anthropic`, `Mistral`, `Groq`, `ElevenLabs`, etc.) implement vendor-specific APIs. +- `AI` is the umbrella product that re-exports the main modules for one-stop integration. + +### Component Dependency Graph + +The following graph is derived from `/home/runner/work/ai/ai/Package.swift` target dependencies: + +```mermaid +graph TD + CoreMI --> CorePersistence + CoreMI --> Merge + CoreMI --> Swallow + + LargeLanguageModels --> CoreMI + LargeLanguageModels --> CorePersistence + LargeLanguageModels --> Merge + LargeLanguageModels --> NetworkKit + LargeLanguageModels --> Swallow + LargeLanguageModels --> SwiftUIX + + Anthropic --> LargeLanguageModels + OpenAI --> LargeLanguageModels + HuggingFace --> CoreMI + + Cohere --> CoreMI + Cohere --> LargeLanguageModels + ElevenLabs --> CoreMI + ElevenLabs --> LargeLanguageModels + Groq --> CoreMI + Groq --> LargeLanguageModels + HumeAI --> CoreMI + HumeAI --> LargeLanguageModels + Jina --> CoreMI + Jina --> LargeLanguageModels + Mistral --> CoreMI + Mistral --> LargeLanguageModels + NeetsAI --> CoreMI + NeetsAI --> LargeLanguageModels + Ollama --> CoreMI + Ollama --> LargeLanguageModels + PlayHT --> CoreMI + PlayHT --> LargeLanguageModels + Rime --> CoreMI + Rime --> LargeLanguageModels + TogetherAI --> CoreMI + TogetherAI --> LargeLanguageModels + VoyageAI --> CoreMI + VoyageAI --> LargeLanguageModels + _Gemini --> CoreMI + _Gemini --> LargeLanguageModels + + Perplexity --> OpenAI + Perplexity --> CoreMI + Perplexity --> LargeLanguageModels + + AI --> CoreMI + AI --> LargeLanguageModels + AI --> Anthropic + AI --> Cohere + AI --> ElevenLabs + AI --> Groq + AI --> HuggingFace + AI --> Jina + AI --> Mistral + AI --> Ollama + AI --> OpenAI +``` + +## Dependencies + +External package dependencies declared in `/home/runner/work/ai/ai/Package.swift`: + +- [`CorePersistence`](https://github.com/vmanot/CorePersistence) +- [`Merge`](https://github.com/vmanot/Merge) +- [`NetworkKit`](https://github.com/vmanot/NetworkKit) +- [`Swallow`](https://github.com/vmanot/Swallow) +- [`SwiftUIX`](https://github.com/SwiftUIX/SwiftUIX) # Installation diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md new file mode 100644 index 00000000..adc2e5d2 --- /dev/null +++ b/docs/ARCHITECTURE.md @@ -0,0 +1,85 @@ +# Architecture + +This document summarizes the package architecture as defined in `/home/runner/work/ai/ai/Package.swift`. + +## Module Layers + +1. **Core layer** + - `CoreMI` +2. **LLM abstraction layer** + - `LargeLanguageModels` +3. **Provider layer** + - `Anthropic`, `Cohere`, `ElevenLabs`, `Groq`, `HuggingFace`, `HumeAI`, `Jina`, `Mistral`, `NeetsAI`, `Ollama`, `OpenAI`, `Perplexity`, `PlayHT`, `Rime`, `TogetherAI`, `VoyageAI`, `_Gemini` +4. **Umbrella layer** + - `AI` + +## Component Dependency Graph + +```mermaid +graph TD + CoreMI --> CorePersistence + CoreMI --> Merge + CoreMI --> Swallow + + LargeLanguageModels --> CoreMI + LargeLanguageModels --> CorePersistence + LargeLanguageModels --> Merge + LargeLanguageModels --> NetworkKit + LargeLanguageModels --> Swallow + LargeLanguageModels --> SwiftUIX + + Anthropic --> LargeLanguageModels + OpenAI --> LargeLanguageModels + HuggingFace --> CoreMI + + Cohere --> CoreMI + Cohere --> LargeLanguageModels + ElevenLabs --> CoreMI + ElevenLabs --> LargeLanguageModels + Groq --> CoreMI + Groq --> LargeLanguageModels + HumeAI --> CoreMI + HumeAI --> LargeLanguageModels + Jina --> CoreMI + Jina --> LargeLanguageModels + Mistral --> CoreMI + Mistral --> LargeLanguageModels + NeetsAI --> CoreMI + NeetsAI --> LargeLanguageModels + Ollama --> CoreMI + Ollama --> LargeLanguageModels + PlayHT --> CoreMI + PlayHT --> LargeLanguageModels + Rime --> CoreMI + Rime --> LargeLanguageModels + TogetherAI --> CoreMI + TogetherAI --> LargeLanguageModels + VoyageAI --> CoreMI + VoyageAI --> LargeLanguageModels + _Gemini --> CoreMI + _Gemini --> LargeLanguageModels + + Perplexity --> OpenAI + Perplexity --> CoreMI + Perplexity --> LargeLanguageModels + + AI --> CoreMI + AI --> LargeLanguageModels + AI --> Anthropic + AI --> Cohere + AI --> ElevenLabs + AI --> Groq + AI --> HuggingFace + AI --> Jina + AI --> Mistral + AI --> Ollama + AI --> OpenAI +``` + +## External Dependencies + +- `CorePersistence` +- `Merge` +- `NetworkKit` +- `Swallow` +- `SwiftUIX` From 256c31a666876491c8720187fc02e7e073f9b61c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 11 Aug 2026 09:17:49 +0000 Subject: [PATCH 078/271] Document architecture, dependencies, and contribution guides Co-authored-by: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> --- CHANGELOG.md | 38 ++++++ CONTRIBUTING.md | 137 +++++++++++++++++++++ README.md | 231 ++++++++++++++++++++++++++++++++++-- docs/ARCHITECTURE.md | 277 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 673 insertions(+), 10 deletions(-) create mode 100644 CHANGELOG.md create mode 100644 CONTRIBUTING.md create mode 100644 docs/ARCHITECTURE.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..90a58e7b --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,38 @@ +# Changelog + +All notable changes to this project are documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html) where release tags are used. + +The package is currently in **alpha**; APIs may change between releases. + +## [Unreleased] + +### Added + +- Architecture documentation (`docs/ARCHITECTURE.md`) with a component dependency graph derived from `Package.swift` +- Contributing guide (`CONTRIBUTING.md`) +- This changelog +- README sections for architecture overview, dependencies, documentation links, and an updated module roadmap + +### Changed + +- README table of contents expanded to include Architecture, Dependencies, Documentation, Contributing, and Changelog + +## [0.0.1] - Alpha + +Initial public alpha of the **AI** Swift package (Preternatural AI): + +- Core layers: `CoreMI`, `LargeLanguageModels` +- Umbrella product `AI` and standalone provider libraries +- Provider integrations including OpenAI, Anthropic, Mistral, Groq, Ollama, Hugging Face hub helpers, embeddings providers (Cohere, Jina, VoyageAI, TogetherAI), voice providers (ElevenLabs, PlayHT, Rime, HumeAI, NeetsAI), Perplexity, and experimental `_Gemini` +- Shared abstractions: `LLMRequestHandling`, `PromptLiteral`, `AbstractLLM` chat/function-calling types, text embeddings protocols +- MIT license + + diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..e977b007 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,137 @@ +# Contributing + +Thanks for your interest in improving **AI** β€” the open-source Swift framework for generative AI ([PreternaturalAI/AI](https://github.com/PreternaturalAI/AI)). + +This guide covers how to set up the package, make changes that match existing patterns, and submit contributions. + +## Code of conduct + +Be respectful and constructive in issues, discussions, and pull requests. Harassment or bad-faith behavior is not acceptable. + +## Getting started + +### Requirements + +- macOS with a recent **Xcode** (CI builds with Xcode **16.2** and **16.3**; see [`.github/workflows/preternatural-build.yml`](.github/workflows/preternatural-build.yml)) +- Swift **5.10+** (`// swift-tools-version:5.10` in `Package.swift`) +- Network access to resolve package dependencies (Swallow, Merge, NetworkKit, CorePersistence, SwiftUIX) + +### Clone and open + +```bash +git clone https://github.com/PreternaturalAI/AI.git +cd AI +open Package.swift +``` + +Or resolve and build from the command line: + +```bash +swift package resolve +swift build +``` + +### Run tests + +```bash +swift test +``` + +Many integration-style tests expect provider API keys. Prefer unit tests that do not call live APIs when possible. Do not commit secrets; use environment variables or local config that stays out of git (see `.gitignore`). + +## Project layout + +``` +Sources/ + CoreMI/ # Core request, model ID, service, ASR/TTS foundations + LargeLanguageModels/ # AbstractLLM, prompts, embeddings protocols + OpenAI/, Anthropic/, … # Provider clients + AI/ # Umbrella re-exports +Tests/ # Parallel test targets per area +docs/ # Architecture and long-form docs +Package.swift # Products, targets, external dependencies +``` + +Read [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) for the dependency graph and layering rules before large changes. + +## How to contribute + +### Bug reports + +Open an issue with: + +- What you expected vs what happened +- Package version / commit and Xcode version +- Provider and model (if relevant) +- Minimal reproduction (code snippet preferred) + +### Feature requests + +Describe the use case and whether it fits an existing protocol (`LLMRequestHandling`, `TextEmbeddingsRequestHandling`, TTS types, etc.) or needs a new abstraction. + +### Pull requests + +1. Fork the repository and create a branch from `main`. +2. Keep changes focused; prefer small PRs. +3. Match existing naming and file layout (`Sources//Intramodular/…`). +4. Update docs when you change public API, products, or dependencies: + - [README.md](README.md) for user-facing behavior + - [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) if targets or the graph change + - [CHANGELOG.md](CHANGELOG.md) under an β€œUnreleased” section +5. Add or extend tests under `Tests/` when practical. +6. Ensure the project builds for your change set. +7. Fill in a clear PR description (motivation, approach, test plan). + +## Adding or extending a provider + +Typical pattern for a new remote API client: + +1. **Target** β€” Add a `.target` (and optionally a `.library` product) in `Package.swift` with dependencies on `LargeLanguageModels`, `NetworkKit`, `Merge`, `Swallow`, and usually `CoreMI` / `CorePersistence`. +2. **Module root** β€” `Sources//module.swift` and namespace enum (see existing providers). +3. **API specification** β€” NetworkKit-oriented `APISpecification` + request/response body types. +4. **Client** β€” `.Client` holding credentials and performing requests. +5. **Protocol conformance** β€” e.g. `LLMRequestHandling` or `TextEmbeddingsRequestHandling` in an extension file. +6. **Models** β€” Strongly typed model identifiers conforming to `ModelIdentifierConvertible` where applicable. +7. **Umbrella** β€” Only add to the `AI` product/target if the provider should ship with the default umbrella import. +8. **Tests** β€” `Tests//` test target depending on `AI` or the standalone product. +9. **Docs** β€” Architecture table, README usage/roadmap, and CHANGELOG. + +Prefer implementing shared protocols over one-off APIs so apps can swap providers. + +### Dependency rules + +- Do **not** introduce provider β†’ provider dependencies unless there is a strong shared-type reason (today only **Perplexity β†’ OpenAI**). +- New external packages require a clear rationale and a `Package.swift` + `Package.resolved` update. +- Keep the layering: providers β†’ `LargeLanguageModels` β†’ `CoreMI` β†’ external foundation packages. + +## Coding guidelines + +- **Swift concurrency** β€” Prefer `async`/`await`; align with `Merge` / existing client patterns. +- **Access control** β€” Many targets use `AccessLevelOnImport`; follow neighboring files. +- **Errors** β€” Surface typed errors where the module already does; avoid swallowing failures silently. +- **Formatting** β€” Match the style of the file you edit (indentation, import order, documentation comments). +- **Copyright** β€” New source files typically include the existing file header style used in the module. + +## Documentation + +| Doc | Purpose | +|-----|---------| +| [README.md](README.md) | Install, usage examples, links | +| [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) | Layers, products, dependency graph | +| [CHANGELOG.md](CHANGELOG.md) | User-visible changes | +| [LICENSE](LICENSE) | MIT | + +When editing architecture docs, regenerate or manually update the Mermaid graph so it stays consistent with `Package.swift`. + +## CI + +Pushes and PRs to `main` run the **Build** workflow (Preternatural build action on macOS runners). Fix build failures before merge. + +## License + +By contributing, you agree that your contributions are licensed under the same **MIT** license as the project ([LICENSE](LICENSE)). + +## Questions + +- Open a GitHub Discussion or Issue on [PreternaturalAI/AI](https://github.com/PreternaturalAI/AI) +- For architecture questions, start from [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) diff --git a/README.md b/README.md index cf435eff..b2da76d2 100644 --- a/README.md +++ b/README.md @@ -42,8 +42,18 @@ The definitive, open-source Swift framework for interfacing with generative AI. -[Installation](#installation)\ -[Usage](#usage) +[Installation](#installation) Β· +[Architecture](#architecture) Β· +[Dependencies](#dependencies) Β· +[Usage](#usage) Β· +[Documentation](#documentation) Β· +[Roadmap](#roadmap) Β· +[Contributing](#contributing) Β· +[Changelog](#changelog) Β· +[Acknowledgements](#acknowledgements) Β· +[License](#license) + +### Usage guide * [Import the framework](#import-the-framework) * [Initialize an AI Client](#initialize-an-ai-client) @@ -58,11 +68,16 @@ The definitive, open-source Swift framework for interfacing with generative AI. * [Audio Transcription: Whisper](#audio-transcription-whisper) * [Audio Generation: OpenAI](#audio-generation-openai) * [Audio Generation: ElevenLabs](#audio-generation-elevenlabs) -* [Text Embeddings](#text-embeddings) +* [Text Embeddings](#text-embeddings) -[Roadmap](#roadmap) \ -[Acknowledgements](#acknowledgements) \ -[License](#license) +### Docs & community + +| Resource | Description | +|----------|-------------| +| [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) | Layers, products, and full dependency graph | +| [CONTRIBUTING.md](CONTRIBUTING.md) | Setup, PR process, adding providers | +| [CHANGELOG.md](CHANGELOG.md) | Notable changes by release | +| [LICENSE](LICENSE) | MIT | # Installation @@ -74,6 +89,143 @@ The definitive, open-source Swift framework for interfacing with generative AI. 4. Choose the version you'd like to install. 5. Click `Add Package`. +Or add the dependency in `Package.swift`: + +```swift +dependencies: [ + .package(url: "https://github.com/PreternaturalAI/AI.git", branch: "main") +] +``` + +Then link the `AI` product (umbrella) or a standalone product such as `OpenAI`, `Anthropic`, or `Perplexity` (see [Architecture](#architecture)). + +# Architecture + +The package is organized in layers. Provider SDKs implement shared protocols (`LLMRequestHandling`, embeddings, TTS, and so on) defined in the core modules. + +| Layer | Modules | Responsibility | +|-------|---------|----------------| +| Umbrella | `AI` | Re-exports core + commonly used providers (`import AI`) | +| Providers | `OpenAI`, `Anthropic`, `Mistral`, `Groq`, `Ollama`, `Perplexity`, `Cohere`, `Jina`, `VoyageAI`, `TogetherAI`, `ElevenLabs`, `PlayHT`, `Rime`, `HumeAI`, `NeetsAI`, `_Gemini`, `HuggingFace`, … | API clients and model types | +| LLM abstractions | `LargeLanguageModels` | `AbstractLLM`, `PromptLiteral`, chat/function-calling, embeddings protocols | +| Foundations | `CoreMI` | Request handling, model identifiers, service credentials, ASR/TTS bases | +| External | Swallow, Merge, NetworkKit, CorePersistence, SwiftUIX | Shared infrastructure (see [Dependencies](#dependencies)) | + +### Component dependency graph + +Graph of **package targets** as declared in [`Package.swift`](Package.swift) (external packages shown once at the bottom). For products, tests, and design notes, see **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)**. + +```mermaid +flowchart TB + subgraph umbrella [Umbrella] + AI + end + + subgraph providers [Provider targets] + OpenAI + Anthropic + Mistral + Groq + Ollama + Perplexity + Cohere + Jina + VoyageAI + TogetherAI + ElevenLabs + PlayHT + Rime + HumeAI + NeetsAI + Gemini["_Gemini"] + HuggingFace + end + + subgraph core [Core targets] + LargeLanguageModels + CoreMI + end + + subgraph external [External packages] + Swallow + Merge + NetworkKit + CorePersistence + SwiftUIX + end + + AI --> CoreMI + AI --> LargeLanguageModels + AI --> OpenAI + AI --> Anthropic + AI --> Mistral + AI --> Groq + AI --> Ollama + AI --> Cohere + AI --> ElevenLabs + AI --> HuggingFace + AI --> Jina + + OpenAI --> LargeLanguageModels + Anthropic --> LargeLanguageModels + Mistral --> LargeLanguageModels + Groq --> LargeLanguageModels + Ollama --> LargeLanguageModels + Perplexity --> LargeLanguageModels + Perplexity --> OpenAI + Cohere --> LargeLanguageModels + Jina --> LargeLanguageModels + VoyageAI --> LargeLanguageModels + TogetherAI --> LargeLanguageModels + ElevenLabs --> LargeLanguageModels + PlayHT --> LargeLanguageModels + Rime --> LargeLanguageModels + HumeAI --> LargeLanguageModels + NeetsAI --> LargeLanguageModels + Gemini --> LargeLanguageModels + HuggingFace --> CoreMI + + LargeLanguageModels --> CoreMI + LargeLanguageModels --> CorePersistence + LargeLanguageModels --> Merge + LargeLanguageModels --> NetworkKit + LargeLanguageModels --> Swallow + LargeLanguageModels --> SwiftUIX + + CoreMI --> CorePersistence + CoreMI --> Merge + CoreMI --> Swallow +``` + +**Notes** + +- Most providers also depend on `CoreMI`, `CorePersistence`, `Merge`, `NetworkKit`, and `Swallow` directly (edges omitted above for readability where they already flow through `LargeLanguageModels`). +- **Perplexity** is the only provider that depends on another provider target (`OpenAI`). +- **HuggingFace** depends on `CoreMI` + `Swallow` only (hub/tokenizer helpers, not the full LLM stack). +- The `AI` umbrella product does **not** include every target (for example `_Gemini`, `Perplexity`, and several voice/embeddings products are separate libraries). + +# Dependencies + +### External Swift packages + +| Package | Repository | Role | +|---------|------------|------| +| Swallow | [vmanot/Swallow](https://github.com/vmanot/Swallow) | Extensions, macros client, diagnostics | +| Merge | [vmanot/Merge](https://github.com/vmanot/Merge) | Concurrency / async utilities | +| NetworkKit | [vmanot/NetworkKit](https://github.com/vmanot/NetworkKit) | HTTP client & API specifications | +| CorePersistence | [vmanot/CorePersistence](https://github.com/vmanot/CorePersistence) | Persistence & schema helpers (e.g. JSONSchema) | +| SwiftUIX | [SwiftUIX/SwiftUIX](https://github.com/SwiftUIX/SwiftUIX) | SwiftUI extensions | + +Transitive pins (see [`Package.resolved`](Package.resolved)) include **SwiftAPI**, **swift-collections**, and **swift-syntax**. + +### SPM products you can link + +| Product | Use when | +|---------|----------| +| `AI` | You want the umbrella import and bundled providers | +| `OpenAI`, `Anthropic`, … | You want a single vendor SDK | +| `_Gemini`, `Perplexity`, `PlayHT`, `Rime`, `TogetherAI`, `VoyageAI`, `HumeAI`, `NeetsAI` | Standalone products not fully folded into the umbrella re-export surface | + # Usage ## Import the framework @@ -551,14 +703,73 @@ let embeddings = try await LLMManager.client.textEmbeddings( return embeddings.data.first?.embedding.description ``` +# Documentation + +| Document | Contents | +|----------|----------| +| **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)** | Full architecture, products vs targets, Mermaid graph, test layout | +| **[CONTRIBUTING.md](CONTRIBUTING.md)** | Dev setup, coding guidelines, how to add a provider | +| **[CHANGELOG.md](CHANGELOG.md)** | Release notes and unreleased changes | +| **[LICENSE](LICENSE)** | MIT License text | + +API behavior is illustrated in the [Usage](#usage) sections above; protocol details live in `Sources/LargeLanguageModels` and `Sources/CoreMI`. + # Roadmap -- [x] OpenAI +Status reflects modules present in this repository (`Sources/` + `Package.swift`). Checked items ship as package targets; depth of feature coverage varies by provider. + +### Core + +- [x] `CoreMI` β€” request handling, model identifiers, services, ASR/TTS foundations +- [x] `LargeLanguageModels` β€” `AbstractLLM`, prompts, function calling, embeddings protocols +- [x] `AI` umbrella product + +### LLM & multimodal providers + +- [x] OpenAI (chat, vision, tools, images, Whisper, speech) - [x] Anthropic - [x] Mistral +- [x] Groq - [x] Ollama -- [ ] Perplexity -- [ ] Groq +- [x] Perplexity +- [x] TogetherAI +- [x] `_Gemini` (Google Gemini client; standalone product) +- [ ] Broader parity matrix (streaming, tools, vision) across every LLM provider + +### Embeddings & hub + +- [x] OpenAI embeddings +- [x] Cohere +- [x] Jina +- [x] VoyageAI +- [x] Hugging Face hub helpers / tokenizer resources + +### Voice & speech + +- [x] ElevenLabs +- [x] PlayHT +- [x] Rime +- [x] HumeAI +- [x] NeetsAI +- [x] OpenAI TTS / Whisper + +### Project hygiene + +- [x] Architecture & dependency documentation +- [x] Contributing guide & changelog +- [ ] Tagged semantic releases with automated changelog sections + +# Contributing + +Contributions are welcome. Please read **[CONTRIBUTING.md](CONTRIBUTING.md)** for: + +- Environment and build requirements +- PR expectations and testing notes +- Steps to add or extend a provider without breaking layering rules + +# Changelog + +See **[CHANGELOG.md](CHANGELOG.md)** for user-visible changes. The package is in **alpha**; expect API evolution between releases. # Acknowledgements @@ -567,4 +778,4 @@ return embeddings.data.first?.embedding.description # License -This package is licensed under the MIT License. +This package is licensed under the [MIT License](LICENSE). diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md new file mode 100644 index 00000000..139e3396 --- /dev/null +++ b/docs/ARCHITECTURE.md @@ -0,0 +1,277 @@ +# Architecture + +This document describes the structure of the **AI** Swift package as defined by [`Package.swift`](../Package.swift) and the modules under [`Sources/`](../Sources). + +## Overview + +The package is a layered Swift framework for generative AI on Apple platforms. Higher layers depend only on lower layers; provider SDKs plug into shared protocols rather than into each other (with one documented exception: **Perplexity** depends on **OpenAI** for shared types). + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Products (importable libraries) β”‚ +β”‚ AI (umbrella) Β· OpenAI Β· Anthropic Β· … Β· _Gemini Β· … β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Provider targets β”‚ +β”‚ OpenAI, Anthropic, Mistral, Groq, Ollama, … β”‚ +β”‚ Implement LLMRequestHandling / embeddings / TTS / etc. β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ LargeLanguageModels β”‚ +β”‚ AbstractLLM, PromptLiteral, embeddings protocols β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ CoreMI β”‚ +β”‚ Request handling, model IDs, services, ASR/TTS foundations β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ External packages β”‚ +β”‚ Swallow Β· Merge Β· NetworkKit Β· CorePersistence Β· SwiftUIX β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +## Platform support + +Declared in `Package.swift`: + +| Platform | Minimum | +|------------|---------| +| iOS | 16 | +| macOS | 13 | +| tvOS | 16 | +| visionOS | 1 | +| watchOS | 9 | + +Swift tools version: **5.10**. Many targets enable the experimental `AccessLevelOnImport` feature. + +## Module layers + +### CoreMI + +**Path:** `Sources/CoreMI` +**Depends on:** CorePersistence, Merge, Swallow + +Foundation types for machine-intelligence services: + +- `CoreMI.RequestHandling` β€” generic generative request interface +- Model identifiers (`ModelIdentifier`, providers, scopes) +- Service client / credential / account protocols +- ASR and TTS request foundations (`TTSRequestHandling`, speech synthesizer types) + +### LargeLanguageModels + +**Path:** `Sources/LargeLanguageModels` +**Depends on:** CorePersistence, CoreMI, Merge, NetworkKit, Swallow, SwiftUIX +**Resources:** `Resources/` (e.g. stopwords) + +Provider-agnostic LLM surface: + +- `LLMRequestHandling` β€” chat/text completion and streaming (extends `CoreMI.RequestHandling`) +- `AbstractLLM` β€” prompts, messages, roles, completion parameters, function calling, agents +- `PromptLiteral` β€” typed prompt construction (text, images, interpolation) +- `TextEmbeddingsRequestHandling` β€” embedding requests +- Task dependencies (`TaskDependencyValues.llm`, `.embedding`) + +### Provider targets + +Each provider lives under `Sources/` and typically exposes a `Client` that conforms to one or more of: + +- `LLMRequestHandling` +- `TextEmbeddingsRequestHandling` +- TTS / speech APIs (where applicable) +- Provider-specific REST models via NetworkKit + +| Target | Role (from source layout) | Notable dependencies beyond LLM stack | +|--------|---------------------------|----------------------------------------| +| **OpenAI** | Chat, vision, tools, images, Whisper, TTS, assistants | LargeLanguageModels, Merge, NetworkKit, Swallow | +| **Anthropic** | Claude chat / tools | LargeLanguageModels, Merge, NetworkKit, Swallow | +| **Mistral** | Chat + embeddings | CoreMI, CorePersistence, LLM stack | +| **Groq** | Fast LLM inference | CoreMI, CorePersistence, LLM stack | +| **Ollama** | Local LLM HTTP API | CoreMI, CorePersistence, LLM stack | +| **Perplexity** | Search-oriented LLM | **Also depends on OpenAI** | +| **Cohere** | Embeddings-focused client | CoreMI, CorePersistence, LLM stack | +| **Jina** | Embeddings | CoreMI, CorePersistence, LLM stack | +| **VoyageAI** | Embeddings | CoreMI, CorePersistence, LLM stack | +| **TogetherAI** | Hosted open models / embeddings | CoreMI, CorePersistence, LLM stack | +| **ElevenLabs** | Voice / TTS | CoreMI, CorePersistence, LLM stack | +| **PlayHT** | Voice / TTS | CoreMI, CorePersistence, LLM stack | +| **Rime** | Voice / TTS | CoreMI, CorePersistence, LLM stack | +| **HumeAI** | Empathic voice / chat APIs | CoreMI, CorePersistence, LLM stack | +| **NeetsAI** | Voice / chat | CoreMI, CorePersistence, LLM stack | +| **_Gemini** | Google Gemini (content, files, embeddings, tools) | CoreMI, CorePersistence, LLM stack | +| **HuggingFace** | Hub download / tokenizer resources | **CoreMI, Swallow only** (no LargeLanguageModels) | + +### AI (umbrella) + +**Path:** `Sources/AI` +**Depends on:** CoreMI, LargeLanguageModels, Anthropic, Cohere, ElevenLabs, Groq, HuggingFace, Jina, Mistral, Ollama, OpenAI, Swallow + +Thin re-export module (`@_exported import …`) so `import AI` pulls in the core stack and several bundled providers. Not every product target is re-exported here (for example `_Gemini`, `Perplexity`, `PlayHT`, `Rime`, `TogetherAI`, `VoyageAI`, `HumeAI`, and `NeetsAI` are separate products). + +## Products vs targets + +### Umbrella product + +```swift +.library(name: "AI", targets: [ + "CoreMI", "LargeLanguageModels", + "Anthropic", "Cohere", "ElevenLabs", "Groq", "HuggingFace", + "Jina", "Mistral", "Ollama", "OpenAI", "AI", +]) +``` + +### Standalone products + +These can be linked without the full umbrella: + +- `_Gemini`, `Anthropic`, `HumeAI`, `NeetsAI`, `OpenAI`, `Perplexity`, `PlayHT`, `Rime`, `TogetherAI`, `VoyageAI` + +## Dependency graph (internal) + +Derived from `Package.swift` target `dependencies` (external packages collapsed to a single node where helpful). + +```mermaid +flowchart TB + subgraph external [External packages] + Swallow + Merge + NetworkKit + CorePersistence + SwiftUIX + end + + subgraph core [Core] + CoreMI + LargeLanguageModels + HuggingFace + end + + subgraph providers_llm [LLM providers] + OpenAI + Anthropic + Mistral + Groq + Ollama + Perplexity + _Gemini + TogetherAI + NeetsAI + HumeAI + end + + subgraph providers_embed [Embedding-focused] + Cohere + Jina + VoyageAI + end + + subgraph providers_voice [Voice / TTS] + ElevenLabs + PlayHT + Rime + end + + subgraph umbrella [Umbrella] + AI + end + + CorePersistence --> CoreMI + Merge --> CoreMI + Swallow --> CoreMI + + CoreMI --> LargeLanguageModels + CorePersistence --> LargeLanguageModels + Merge --> LargeLanguageModels + NetworkKit --> LargeLanguageModels + Swallow --> LargeLanguageModels + SwiftUIX --> LargeLanguageModels + + CoreMI --> HuggingFace + Swallow --> HuggingFace + + LargeLanguageModels --> OpenAI + LargeLanguageModels --> Anthropic + LargeLanguageModels --> Mistral + LargeLanguageModels --> Groq + LargeLanguageModels --> Ollama + LargeLanguageModels --> Perplexity + LargeLanguageModels --> _Gemini + LargeLanguageModels --> TogetherAI + LargeLanguageModels --> NeetsAI + LargeLanguageModels --> HumeAI + LargeLanguageModels --> Cohere + LargeLanguageModels --> Jina + LargeLanguageModels --> VoyageAI + LargeLanguageModels --> ElevenLabs + LargeLanguageModels --> PlayHT + LargeLanguageModels --> Rime + + OpenAI --> Perplexity + + CoreMI --> AI + LargeLanguageModels --> AI + Anthropic --> AI + Cohere --> AI + ElevenLabs --> AI + Groq --> AI + HuggingFace --> AI + Jina --> AI + Mistral --> AI + Ollama --> AI + OpenAI --> AI + Swallow --> AI +``` + +### Compact target β†’ internal dependency list + +| Target | Internal package targets | +|--------|---------------------------| +| CoreMI | β€” | +| LargeLanguageModels | CoreMI | +| HuggingFace | CoreMI | +| OpenAI | LargeLanguageModels | +| Anthropic | LargeLanguageModels | +| Mistral, Groq, Ollama, Cohere, Jina, VoyageAI, TogetherAI, ElevenLabs, PlayHT, Rime, HumeAI, NeetsAI, _Gemini | CoreMI, LargeLanguageModels | +| Perplexity | CoreMI, LargeLanguageModels, **OpenAI** | +| AI | CoreMI, LargeLanguageModels, Anthropic, Cohere, ElevenLabs, Groq, HuggingFace, Jina, Mistral, Ollama, OpenAI | + +## External dependencies + +Declared in `Package.swift`: + +| Package | URL | Purpose (typical use in this repo) | +|---------|-----|--------------------------------------| +| [Swallow](https://github.com/vmanot/Swallow) | branch `master` | Standard library extensions, macros client, diagnostics utilities | +| [Merge](https://github.com/vmanot/Merge) | branch `master` | Concurrency / async utilities | +| [NetworkKit](https://github.com/vmanot/NetworkKit) | branch `master` | HTTP API client layer for provider specs | +| [CorePersistence](https://github.com/vmanot/CorePersistence) | branch `main` | Persistence / schema helpers (e.g. JSONSchema) | +| [SwiftUIX](https://github.com/SwiftUIX/SwiftUIX) | branch `master` | SwiftUI extensions used by LLM UI-adjacent types | + +Resolved transitive pins (see `Package.resolved`) include **SwiftAPI**, **swift-collections**, and **swift-syntax**. + +## Tests + +Test targets under `Tests/` generally depend on the `AI` umbrella (plus `Swallow`). `_GeminiTests` also depends on `_Gemini` directly. + +| Test target | Path | +|-------------|------| +| LargeLanguageModelsTests | `Tests/LargeLanguageModels` | +| AnthropicTests, OpenAITests, MistralTests, GroqTests, … | `Tests/` | +| _GeminiTests | `Tests/_Gemini` | + +## Design notes + +1. **Protocol-oriented providers** β€” App code can depend on `any LLMRequestHandling` and swap OpenAI, Anthropic, Groq, etc. without rewriting call sites. +2. **Umbrella vs lean imports** β€” Use `import AI` for convenience, or link a standalone product (e.g. `OpenAI` only) to reduce surface area. +3. **NetworkKit API specs** β€” Most providers define an `*.APISpecification` and map responses into `AbstractLLM` types. +4. **Experimental Swift features** β€” `AccessLevelOnImport` is enabled on most targets; keep import access consistent when adding files. + +## Related docs + +- [README](../README.md) β€” installation and usage +- [CONTRIBUTING](../CONTRIBUTING.md) β€” how to extend the package +- [CHANGELOG](../CHANGELOG.md) β€” release history From 528e781221e3402641976452360a818f8e1516ca Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 11 Aug 2026 09:17:52 +0000 Subject: [PATCH 079/271] Fix documentation path references Co-authored-by: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> --- README.md | 4 ++-- docs/ARCHITECTURE.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 23d43af9..f3acc3dd 100644 --- a/README.md +++ b/README.md @@ -83,7 +83,7 @@ This package is organized as a Swift Package Manager workspace with layered modu ### Component Dependency Graph -The following graph is derived from `/home/runner/work/ai/ai/Package.swift` target dependencies: +The following graph is derived from `Package.swift` target dependencies: ```mermaid graph TD @@ -148,7 +148,7 @@ graph TD ## Dependencies -External package dependencies declared in `/home/runner/work/ai/ai/Package.swift`: +External package dependencies declared in `Package.swift`: - [`CorePersistence`](https://github.com/vmanot/CorePersistence) - [`Merge`](https://github.com/vmanot/Merge) diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index adc2e5d2..5fff7582 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -1,6 +1,6 @@ # Architecture -This document summarizes the package architecture as defined in `/home/runner/work/ai/ai/Package.swift`. +This document summarizes the package architecture as defined in `Package.swift`. ## Module Layers From 3b5365d04de300c5d4600c90ee45a01fc78145dc Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 11 Aug 2026 09:18:15 +0000 Subject: [PATCH 080/271] Fix CHANGELOG release date format for Keep a Changelog Co-authored-by: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 90a58e7b..3d3df3d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,7 +20,7 @@ The package is currently in **alpha**; APIs may change between releases. - README table of contents expanded to include Architecture, Dependencies, Documentation, Contributing, and Changelog -## [0.0.1] - Alpha +## [0.0.1] - 2024-01-01 Initial public alpha of the **AI** Swift package (Preternatural AI): From c6eb27610fca3599ae26d236df51b0217ed3af0d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 11 Aug 2026 09:18:19 +0000 Subject: [PATCH 081/271] Link README dependency graph to architecture doc Co-authored-by: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> --- README.md | 63 +------------------------------------------------------ 1 file changed, 1 insertion(+), 62 deletions(-) diff --git a/README.md b/README.md index f3acc3dd..862a0a74 100644 --- a/README.md +++ b/README.md @@ -83,68 +83,7 @@ This package is organized as a Swift Package Manager workspace with layered modu ### Component Dependency Graph -The following graph is derived from `Package.swift` target dependencies: - -```mermaid -graph TD - CoreMI --> CorePersistence - CoreMI --> Merge - CoreMI --> Swallow - - LargeLanguageModels --> CoreMI - LargeLanguageModels --> CorePersistence - LargeLanguageModels --> Merge - LargeLanguageModels --> NetworkKit - LargeLanguageModels --> Swallow - LargeLanguageModels --> SwiftUIX - - Anthropic --> LargeLanguageModels - OpenAI --> LargeLanguageModels - HuggingFace --> CoreMI - - Cohere --> CoreMI - Cohere --> LargeLanguageModels - ElevenLabs --> CoreMI - ElevenLabs --> LargeLanguageModels - Groq --> CoreMI - Groq --> LargeLanguageModels - HumeAI --> CoreMI - HumeAI --> LargeLanguageModels - Jina --> CoreMI - Jina --> LargeLanguageModels - Mistral --> CoreMI - Mistral --> LargeLanguageModels - NeetsAI --> CoreMI - NeetsAI --> LargeLanguageModels - Ollama --> CoreMI - Ollama --> LargeLanguageModels - PlayHT --> CoreMI - PlayHT --> LargeLanguageModels - Rime --> CoreMI - Rime --> LargeLanguageModels - TogetherAI --> CoreMI - TogetherAI --> LargeLanguageModels - VoyageAI --> CoreMI - VoyageAI --> LargeLanguageModels - _Gemini --> CoreMI - _Gemini --> LargeLanguageModels - - Perplexity --> OpenAI - Perplexity --> CoreMI - Perplexity --> LargeLanguageModels - - AI --> CoreMI - AI --> LargeLanguageModels - AI --> Anthropic - AI --> Cohere - AI --> ElevenLabs - AI --> Groq - AI --> HuggingFace - AI --> Jina - AI --> Mistral - AI --> Ollama - AI --> OpenAI -``` +A full dependency graph generated from `Package.swift` target dependencies is available in [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md#component-dependency-graph). ## Dependencies From fe620751caccd1690e052ecb76116ac958aaf3ad Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 11 Aug 2026 09:18:49 +0000 Subject: [PATCH 082/271] Clarify AI umbrella target coverage in architecture doc Co-authored-by: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> --- docs/ARCHITECTURE.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 5fff7582..90f93ab7 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -75,6 +75,7 @@ graph TD AI --> Ollama AI --> OpenAI ``` +> Note: The `AI` umbrella target currently depends on `CoreMI`, `LargeLanguageModels`, `Anthropic`, `Cohere`, `ElevenLabs`, `Groq`, `HuggingFace`, `Jina`, `Mistral`, `Ollama`, and `OpenAI`. Other provider modules in this repository are distributed as standalone products and are not re-exported by `AI` in `Package.swift`. ## External Dependencies From 5452b699487a019269aeabe683c24a29ca0efde5 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 11 Aug 2026 09:19:18 +0000 Subject: [PATCH 083/271] Clarify README architecture section naming Co-authored-by: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 862a0a74..ea26cc1e 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ The definitive, open-source Swift framework for interfacing with generative AI. ## Table of Contents -- [Architecture](#architecture) +- [Architecture Overview](#architecture-overview) - [Dependencies](#dependencies) - [Installation](#installation) - [Usage](#usage) @@ -72,7 +72,7 @@ The definitive, open-source Swift framework for interfacing with generative AI. - [Acknowledgements](#acknowledgements) - [License](#license) -## Architecture +## Architecture Overview This package is organized as a Swift Package Manager workspace with layered modules: From 217520e74b0ca788f11d1422db0cfa1e58b2e668 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 11 Aug 2026 09:19:54 +0000 Subject: [PATCH 084/271] Annotate standalone providers in dependency graph Co-authored-by: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> --- docs/ARCHITECTURE.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 90f93ab7..57b3e055 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -74,6 +74,15 @@ graph TD AI --> Mistral AI --> Ollama AI --> OpenAI + + AI -. standalone product .-> HumeAI + AI -. standalone product .-> NeetsAI + AI -. standalone product .-> Perplexity + AI -. standalone product .-> PlayHT + AI -. standalone product .-> Rime + AI -. standalone product .-> TogetherAI + AI -. standalone product .-> VoyageAI + AI -. standalone product .-> _Gemini ``` > Note: The `AI` umbrella target currently depends on `CoreMI`, `LargeLanguageModels`, `Anthropic`, `Cohere`, `ElevenLabs`, `Groq`, `HuggingFace`, `Jina`, `Mistral`, `Ollama`, and `OpenAI`. Other provider modules in this repository are distributed as standalone products and are not re-exported by `AI` in `Package.swift`. From cc5a65cc8a41fccda1830e49ff36d48728dd4ff9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 11 Aug 2026 09:20:27 +0000 Subject: [PATCH 085/271] Clarify graph external dependencies and HuggingFace note Co-authored-by: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> --- docs/ARCHITECTURE.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 57b3e055..b79ac91d 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -15,6 +15,8 @@ This document summarizes the package architecture as defined in `Package.swift`. ## Component Dependency Graph +In this graph, `CorePersistence`, `Merge`, `NetworkKit`, `Swallow`, and `SwiftUIX` are external package dependencies (not targets in this repository). + ```mermaid graph TD CoreMI --> CorePersistence @@ -86,6 +88,8 @@ graph TD ``` > Note: The `AI` umbrella target currently depends on `CoreMI`, `LargeLanguageModels`, `Anthropic`, `Cohere`, `ElevenLabs`, `Groq`, `HuggingFace`, `Jina`, `Mistral`, `Ollama`, and `OpenAI`. Other provider modules in this repository are distributed as standalone products and are not re-exported by `AI` in `Package.swift`. +> Note: `HuggingFace` intentionally differs from most provider modules: in `Package.swift` it depends on `CoreMI` and `Swallow`, and does not depend on `LargeLanguageModels`. + ## External Dependencies - `CorePersistence` From 9c2b354a66edbbad5df7c641eda7fdaeb052913f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 11 Aug 2026 09:20:59 +0000 Subject: [PATCH 086/271] Add missing HuggingFace Swallow dependency edge Co-authored-by: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> --- docs/ARCHITECTURE.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index b79ac91d..913a99c8 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -33,6 +33,7 @@ graph TD Anthropic --> LargeLanguageModels OpenAI --> LargeLanguageModels HuggingFace --> CoreMI + HuggingFace --> Swallow Cohere --> CoreMI Cohere --> LargeLanguageModels From 4c0508013596c867c045ef754e3d925053acc003 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 11 Aug 2026 10:19:41 +0000 Subject: [PATCH 087/271] Harden docs: accuracy, capability matrix, PR template Co-authored-by: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> --- .github/PULL_REQUEST_TEMPLATE.md | 31 ++++++++++++ CHANGELOG.md | 11 ++-- CONTRIBUTING.md | 22 ++++---- README.md | 77 +++++++++++++++++++++------- docs/ARCHITECTURE.md | 87 +++++++++++++++++++++++++++----- docs/README.md | 31 ++++++++++++ 6 files changed, 215 insertions(+), 44 deletions(-) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 docs/README.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..7dfe0424 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,31 @@ +## Summary + + + +## Type of change + +- [ ] Bug fix +- [ ] New provider / API surface +- [ ] Refactor +- [ ] Documentation +- [ ] Tests / CI +- [ ] Other + +## Checklist + +- [ ] Builds with the package’s supported Xcode/Swift versions +- [ ] Tests added or updated when behavior changes +- [ ] No secrets or API keys committed +- [ ] Docs updated if products, targets, public API, or dependencies changed: + - [ ] `README.md` + - [ ] `docs/ARCHITECTURE.md` (graph / tables) + - [ ] `CHANGELOG.md` (`[Unreleased]`) +- [ ] Layering respected (providers β†’ `LargeLanguageModels` β†’ `CoreMI`; avoid new providerβ†’provider deps) + +## Test plan + + + +## Related issues + + diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d3df3d3..ccf42e87 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,17 +12,22 @@ The package is currently in **alpha**; APIs may change between releases. ### Added - Architecture documentation (`docs/ARCHITECTURE.md`) with a component dependency graph derived from `Package.swift` -- Contributing guide (`CONTRIBUTING.md`) +- Documentation index (`docs/README.md`) +- Contributing guide (`CONTRIBUTING.md`) and GitHub pull request template - This changelog -- README sections for architecture overview, dependencies, documentation links, and an updated module roadmap +- README sections for architecture overview, dependencies, protocol capability matrix, documentation links, and an updated module roadmap ### Changed - README table of contents expanded to include Architecture, Dependencies, Documentation, Contributing, and Changelog +- Clarified **AI product vs AI module** re-exports (`import AI` exports CoreMI, LargeLanguageModels, OpenAI only) +- Documented SPM product list exactly as in `Package.swift` and noted targets without standalone products +- Documented test-target gaps (Ollama, Rime, TogetherAI registration, CoreMI) +- Fixed stray `` markup and platform notes (including visionOS) in the README ## [0.0.1] - 2024-01-01 -Initial public alpha of the **AI** Swift package (Preternatural AI): +Baseline snapshot of the public **alpha** tree (date is a documentation anchor, not a git tag guarantee): - Core layers: `CoreMI`, `LargeLanguageModels` - Umbrella product `AI` and standalone provider libraries diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e977b007..fe2ab4ae 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -46,13 +46,16 @@ Sources/ CoreMI/ # Core request, model ID, service, ASR/TTS foundations LargeLanguageModels/ # AbstractLLM, prompts, embeddings protocols OpenAI/, Anthropic/, … # Provider clients - AI/ # Umbrella re-exports -Tests/ # Parallel test targets per area -docs/ # Architecture and long-form docs + AI/ # Umbrella module (selective @_exported imports) +Tests/ # Parallel test targets per area (some providers still missing) +docs/ # Architecture and long-form docs (start at docs/README.md) Package.swift # Products, targets, external dependencies +.github/PULL_REQUEST_TEMPLATE.md ``` -Read [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) for the dependency graph and layering rules before large changes. +Read [docs/README.md](docs/README.md) and [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) for the dependency graph, product vs module distinction, and layering rules before large changes. + +**Important:** The `AI` **product** links many provider targets; the `AI` **module** only re-exports CoreMI, LargeLanguageModels, and OpenAI. See architecture docs before changing `Sources/AI/module.swift`. ## How to contribute @@ -92,9 +95,9 @@ Typical pattern for a new remote API client: 4. **Client** β€” `.Client` holding credentials and performing requests. 5. **Protocol conformance** β€” e.g. `LLMRequestHandling` or `TextEmbeddingsRequestHandling` in an extension file. 6. **Models** β€” Strongly typed model identifiers conforming to `ModelIdentifierConvertible` where applicable. -7. **Umbrella** β€” Only add to the `AI` product/target if the provider should ship with the default umbrella import. -8. **Tests** β€” `Tests//` test target depending on `AI` or the standalone product. -9. **Docs** β€” Architecture table, README usage/roadmap, and CHANGELOG. +7. **Product vs re-export** β€” Add a `.library` product if clients should link the provider alone. Add the target to the `AI` product’s `targets` array only if it should ship with the multi-provider product. Add `@_exported import` in `Sources/AI/module.swift` only if `import AI` should surface that module’s API (today only OpenAI among providers). +8. **Tests** β€” Add both `Tests//` **and** a `.testTarget` in `Package.swift` (a folder alone is not enough; `TogetherAI` currently has a tests directory without a registered test target). +9. **Docs** β€” Architecture tables/graph, README products/roadmap, `docs/README.md` if needed, and CHANGELOG. Prefer implementing shared protocols over one-off APIs so apps can swap providers. @@ -117,12 +120,13 @@ Prefer implementing shared protocols over one-off APIs so apps can swap provider | Doc | Purpose | |-----|---------| | [README.md](README.md) | Install, usage examples, links | -| [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) | Layers, products, dependency graph | +| [docs/README.md](docs/README.md) | Doc index | +| [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) | Layers, products, dependency graph, protocol matrix | | [CHANGELOG.md](CHANGELOG.md) | User-visible changes | | [LICENSE](LICENSE) | MIT | +| [.github/PULL_REQUEST_TEMPLATE.md](.github/PULL_REQUEST_TEMPLATE.md) | PR checklist | When editing architecture docs, regenerate or manually update the Mermaid graph so it stays consistent with `Package.swift`. - ## CI Pushes and PRs to `main` run the **Build** workflow (Preternatural build action on macOS runners). Fix build failures before merge. diff --git a/README.md b/README.md index b2da76d2..fef18e4e 100644 --- a/README.md +++ b/README.md @@ -1,43 +1,44 @@ > [!IMPORTANT] > This package is presently in its alpha stage of development (2026-03-04). ---- +#### Supported Platforms - +SPM platforms from [`Package.swift`](Package.swift): **iOS 16+**, **macOS 13+**, **tvOS 16+**, **visionOS 1+**, **watchOS 9+**. -#### Supported Platforms

- macos + macOS   - macos + iOS   - macos + iPadOS   - macos + tvOS   - macos + watchOS

+Also targets **visionOS** (badge art not yet in `Images/`). + # AI The definitive, open-source Swift framework for interfacing with generative AI. @@ -74,7 +75,8 @@ The definitive, open-source Swift framework for interfacing with generative AI. | Resource | Description | |----------|-------------| -| [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) | Layers, products, and full dependency graph | +| [docs/README.md](docs/README.md) | Documentation index | +| [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) | Layers, products, protocol matrix, full dependency graph | | [CONTRIBUTING.md](CONTRIBUTING.md) | Setup, PR process, adding providers | | [CHANGELOG.md](CHANGELOG.md) | Notable changes by release | | [LICENSE](LICENSE) | MIT | @@ -105,12 +107,15 @@ The package is organized in layers. Provider SDKs implement shared protocols (`L | Layer | Modules | Responsibility | |-------|---------|----------------| -| Umbrella | `AI` | Re-exports core + commonly used providers (`import AI`) | +| Umbrella module | `AI` | `@_exported` re-exports **CoreMI**, **LargeLanguageModels**, **OpenAI** (and Swallow macros client). Other bundled modules still need their own `import`. | +| Umbrella product | `AI` library | SPM product that **links** core + Anthropic, Cohere, ElevenLabs, Groq, HuggingFace, Jina, Mistral, Ollama, OpenAI, and the `AI` module | | Providers | `OpenAI`, `Anthropic`, `Mistral`, `Groq`, `Ollama`, `Perplexity`, `Cohere`, `Jina`, `VoyageAI`, `TogetherAI`, `ElevenLabs`, `PlayHT`, `Rime`, `HumeAI`, `NeetsAI`, `_Gemini`, `HuggingFace`, … | API clients and model types | | LLM abstractions | `LargeLanguageModels` | `AbstractLLM`, `PromptLiteral`, chat/function-calling, embeddings protocols | | Foundations | `CoreMI` | Request handling, model identifiers, service credentials, ASR/TTS bases | | External | Swallow, Merge, NetworkKit, CorePersistence, SwiftUIX | Shared infrastructure (see [Dependencies](#dependencies)) | +`import AI` is enough for OpenAI + shared LLM types. For other clients linked by the product, add e.g. `import Anthropic` or `import Groq`. Providers shipped only as standalone products (`Perplexity`, `_Gemini`, `VoyageAI`, …) require linking that product. + ### Component dependency graph Graph of **package targets** as declared in [`Package.swift`](Package.swift) (external packages shown once at the bottom). For products, tests, and design notes, see **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)**. @@ -200,9 +205,30 @@ flowchart TB **Notes** - Most providers also depend on `CoreMI`, `CorePersistence`, `Merge`, `NetworkKit`, and `Swallow` directly (edges omitted above for readability where they already flow through `LargeLanguageModels`). +- **OpenAI** and **Anthropic** depend on `LargeLanguageModels` + networking stack, not on `CoreMI` directly in `Package.swift`. - **Perplexity** is the only provider that depends on another provider target (`OpenAI`). - **HuggingFace** depends on `CoreMI` + `Swallow` only (hub/tokenizer helpers, not the full LLM stack). -- The `AI` umbrella product does **not** include every target (for example `_Gemini`, `Perplexity`, and several voice/embeddings products are separate libraries). +- The `AI` **product** does **not** link every target (for example `_Gemini`, `Perplexity`, `PlayHT`, `Rime`, `TogetherAI`, `VoyageAI`, `HumeAI`, `NeetsAI` are separate products). +- The `AI` **module** re-exports only CoreMI, LargeLanguageModels, and OpenAI among first-party modules (`Sources/AI/module.swift`). + +### Protocol capabilities (from source) + +Which shared protocols have an explicit client conformance today: + +| Target | `LLMRequestHandling` | `TextEmbeddingsRequestHandling` | Notes | +|--------|:--------------------:|:-------------------------------:|-------| +| OpenAI | yes | yes | Also images, Whisper, speech, assistants | +| Anthropic | yes | | | +| Mistral | yes | yes | | +| Groq | yes | | | +| Ollama | yes | | | +| Perplexity | yes | | Depends on OpenAI target | +| Cohere | | yes | | +| Jina | | yes | | +| VoyageAI | | yes | | +| TogetherAI, ElevenLabs, PlayHT, Rime, HumeAI, NeetsAI, _Gemini, HuggingFace | | | Provider-specific client APIs / hub helpers (see `Sources/`) | + +Full layering detail: **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)**. Docs index: **[docs/README.md](docs/README.md)**. # Dependencies @@ -220,11 +246,23 @@ Transitive pins (see [`Package.resolved`](Package.resolved)) include **SwiftAPI* ### SPM products you can link -| Product | Use when | -|---------|----------| -| `AI` | You want the umbrella import and bundled providers | -| `OpenAI`, `Anthropic`, … | You want a single vendor SDK | -| `_Gemini`, `Perplexity`, `PlayHT`, `Rime`, `TogetherAI`, `VoyageAI`, `HumeAI`, `NeetsAI` | Standalone products not fully folded into the umbrella re-export surface | +Exact product names from `Package.swift`: + +| Product | Targets exposed | Use when | +|---------|-----------------|----------| +| `AI` | CoreMI, LargeLanguageModels, Anthropic, Cohere, ElevenLabs, Groq, HuggingFace, Jina, Mistral, Ollama, OpenAI, AI | Default multi-provider app dependency | +| `OpenAI` | OpenAI | OpenAI-only | +| `Anthropic` | Anthropic | Anthropic-only | +| `Perplexity` | Perplexity | Perplexity (pulls OpenAI transitively) | +| `TogetherAI` | TogetherAI | Together AI | +| `VoyageAI` | VoyageAI | Voyage embeddings | +| `PlayHT` | PlayHT | PlayHT voice | +| `Rime` | Rime | Rime voice | +| `HumeAI` | HumeAI | Hume | +| `NeetsAI` | NeetsAI | Neets | +| `_Gemini` | _Gemini | Google Gemini client | + +There is **no** standalone SPM product today for `CoreMI`, `LargeLanguageModels`, `Cohere`, `Groq`, `HuggingFace`, `Jina`, `Mistral`, `Ollama`, or `ElevenLabs` β€” consume them via the `AI` product (or add a product in `Package.swift` if you need a leaner slice). # Usage @@ -707,7 +745,8 @@ return embeddings.data.first?.embedding.description | Document | Contents | |----------|----------| -| **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)** | Full architecture, products vs targets, Mermaid graph, test layout | +| **[docs/README.md](docs/README.md)** | Documentation index | +| **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)** | Full architecture, products vs targets, Mermaid graph, protocol matrix, tests | | **[CONTRIBUTING.md](CONTRIBUTING.md)** | Dev setup, coding guidelines, how to add a provider | | **[CHANGELOG.md](CHANGELOG.md)** | Release notes and unreleased changes | | **[LICENSE](LICENSE)** | MIT License text | @@ -756,7 +795,9 @@ Status reflects modules present in this repository (`Sources/` + `Package.swift` ### Project hygiene - [x] Architecture & dependency documentation -- [x] Contributing guide & changelog +- [x] Contributing guide, docs index, PR template & changelog +- [ ] Register missing test targets (Ollama, Rime, TogetherAI folder) +- [ ] visionOS badge artwork under `Images/` - [ ] Tagged semantic releases with automated changelog sections # Contributing diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 139e3396..0fc47ba2 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -105,12 +105,41 @@ Each provider lives under `Sources/` and typically exposes a `Client` that | **_Gemini** | Google Gemini (content, files, embeddings, tools) | CoreMI, CorePersistence, LLM stack | | **HuggingFace** | Hub download / tokenizer resources | **CoreMI, Swallow only** (no LargeLanguageModels) | -### AI (umbrella) +### AI (umbrella module vs product) **Path:** `Sources/AI` -**Depends on:** CoreMI, LargeLanguageModels, Anthropic, Cohere, ElevenLabs, Groq, HuggingFace, Jina, Mistral, Ollama, OpenAI, Swallow - -Thin re-export module (`@_exported import …`) so `import AI` pulls in the core stack and several bundled providers. Not every product target is re-exported here (for example `_Gemini`, `Perplexity`, `PlayHT`, `Rime`, `TogetherAI`, `VoyageAI`, `HumeAI`, and `NeetsAI` are separate products). +**Target depends on:** CoreMI, LargeLanguageModels, Anthropic, Cohere, ElevenLabs, Groq, HuggingFace, Jina, Mistral, Ollama, OpenAI, Swallow + +Distinguish **module** from **product**: + +| Concept | What it does | +|---------|----------------| +| **`AI` module** (`Sources/AI/module.swift`) | `@_exported import` of **CoreMI**, **LargeLanguageModels**, **OpenAI**, and **SwallowMacrosClient** only | +| **`AI` product** (`.library(name: "AI", …)`) | Links the modules listed below so clients may `import` them when depending on the product | + +So `import AI` brings OpenAI + shared LLM/CoreMI APIs into scope. Modules such as Anthropic or Groq are available to import when the `AI` product is linked, but they are **not** re-exported by the `AI` module. + +## Protocol capability matrix + +Explicit conformances found under `Sources/` (not an exhaustive feature matrix for every API surface): + +| Target | `LLMRequestHandling` | `TextEmbeddingsRequestHandling` | Other surfaces (illustrative) | +|--------|:--------------------:|:-------------------------------:|-------------------------------| +| OpenAI | βœ“ (`OpenAI.Client+LLMRequestHandling`) | βœ“ | Images, Whisper, speech, assistants | +| Anthropic | βœ“ | | Tools / chat messages | +| Mistral | βœ“ | βœ“ | | +| Groq | βœ“ | | | +| Ollama | βœ“ | | Local HTTP API | +| Perplexity | βœ“ | | Uses OpenAI target | +| Cohere | | βœ“ | | +| Jina | | βœ“ | | +| VoyageAI | | βœ“ | | +| TogetherAI | | | Client + embeddings types (check module) | +| ElevenLabs / PlayHT / Rime | | | Voice / TTS clients | +| HumeAI / NeetsAI | | | Provider clients | +| _Gemini | | | Content, files, embeddings, tools (Gemini-specific) | +| HuggingFace | | | Hub download / tokenizer resources | +| LargeLanguageModels | | βœ“ (`NLEmbeddingProvider` et al.) | `PromptLiteral`, `AbstractLLM` | ## Products vs targets @@ -126,10 +155,15 @@ Thin re-export module (`@_exported import …`) so `import AI` pulls in the core ### Standalone products -These can be linked without the full umbrella: +Declared as their own `.library` entries (link without the full umbrella product): - `_Gemini`, `Anthropic`, `HumeAI`, `NeetsAI`, `OpenAI`, `Perplexity`, `PlayHT`, `Rime`, `TogetherAI`, `VoyageAI` +### Targets without a dedicated product + +Linked only via the `AI` product (unless you add a new `.library`): + +- `CoreMI`, `LargeLanguageModels`, `Cohere`, `ElevenLabs`, `Groq`, `HuggingFace`, `Jina`, `Mistral`, `Ollama`, and the `AI` module itself ## Dependency graph (internal) Derived from `Package.swift` target `dependencies` (external packages collapsed to a single node where helpful). @@ -233,12 +267,14 @@ flowchart TB | CoreMI | β€” | | LargeLanguageModels | CoreMI | | HuggingFace | CoreMI | -| OpenAI | LargeLanguageModels | -| Anthropic | LargeLanguageModels | +| OpenAI | LargeLanguageModels *(plus Merge, NetworkKit, Swallow externally)* | +| Anthropic | LargeLanguageModels *(plus Merge, NetworkKit, Swallow externally)* | | Mistral, Groq, Ollama, Cohere, Jina, VoyageAI, TogetherAI, ElevenLabs, PlayHT, Rime, HumeAI, NeetsAI, _Gemini | CoreMI, LargeLanguageModels | | Perplexity | CoreMI, LargeLanguageModels, **OpenAI** | | AI | CoreMI, LargeLanguageModels, Anthropic, Cohere, ElevenLabs, Groq, HuggingFace, Jina, Mistral, Ollama, OpenAI | +OpenAI and Anthropic do **not** list `CoreMI` in `Package.swift`; they reach CoreMI types transitively through `LargeLanguageModels`. + ## External dependencies Declared in `Package.swift`: @@ -255,23 +291,46 @@ Resolved transitive pins (see `Package.resolved`) include **SwiftAPI**, **swift- ## Tests -Test targets under `Tests/` generally depend on the `AI` umbrella (plus `Swallow`). `_GeminiTests` also depends on `_Gemini` directly. +Test targets under `Tests/` generally depend on the `AI` product (plus `Swallow`). `_GeminiTests` also depends on `_Gemini` directly. -| Test target | Path | -|-------------|------| +| Test target (`Package.swift`) | Path | +|-------------------------------|------| | LargeLanguageModelsTests | `Tests/LargeLanguageModels` | -| AnthropicTests, OpenAITests, MistralTests, GroqTests, … | `Tests/` | +| AnthropicTests | `Tests/Anthropic` | +| OpenAITests | `Tests/OpenAI` | +| MistralTests | `Tests/Mistral` | +| GroqTests | `Tests/Groq` | +| PerplexityTests | `Tests/Perplexity` | +| ElevenLabsTests | `Tests/ElevenLabs` | +| PlayHTTests | `Tests/PlayHT` | +| JinaTests | `Tests/Jina` | +| VoyageAITests | `Tests/VoyageAI` | +| CohereTests | `Tests/Cohere` | +| HuggingFaceTests | `Tests/HuggingFace` | +| NeetsAITests | `Tests/NeetsAI` | +| HumeAITests | `Tests/HumeAI` | | _GeminiTests | `Tests/_Gemini` | +### Gaps (as of this doc) + +| Area | Observation | +|------|-------------| +| **Ollama** | Source target exists; **no** `OllamaTests` test target | +| **Rime** | Source target exists; **no** `RimeTests` test target | +| **TogetherAI** | `Tests/TogetherAI/` directory exists, but **no** matching `.testTarget` in `Package.swift` | +| **CoreMI** | No dedicated `CoreMITests` target | + ## Design notes 1. **Protocol-oriented providers** β€” App code can depend on `any LLMRequestHandling` and swap OpenAI, Anthropic, Groq, etc. without rewriting call sites. -2. **Umbrella vs lean imports** β€” Use `import AI` for convenience, or link a standalone product (e.g. `OpenAI` only) to reduce surface area. -3. **NetworkKit API specs** β€” Most providers define an `*.APISpecification` and map responses into `AbstractLLM` types. -4. **Experimental Swift features** β€” `AccessLevelOnImport` is enabled on most targets; keep import access consistent when adding files. +2. **Product vs module** β€” Depending on the `AI` **product** links many modules; `import AI` only re-exports CoreMI, LargeLanguageModels, and OpenAI. Import other modules explicitly. +3. **Lean linking** β€” Prefer a standalone product (e.g. `OpenAI`) when you do not need the multi-provider product surface. +4. **NetworkKit API specs** β€” Most providers define an `*.APISpecification` and map responses into `AbstractLLM` types. +5. **Experimental Swift features** β€” `AccessLevelOnImport` is enabled on most targets; keep import access consistent when adding files. ## Related docs +- [docs/README.md](README.md) β€” documentation index - [README](../README.md) β€” installation and usage - [CONTRIBUTING](../CONTRIBUTING.md) β€” how to extend the package - [CHANGELOG](../CHANGELOG.md) β€” release history diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000..5e24f4c9 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,31 @@ +# Documentation + +Guides for the **AI** Swift package ([PreternaturalAI/AI](https://github.com/PreternaturalAI/AI)). + +| Document | Audience | Description | +|----------|----------|-------------| +| [../README.md](../README.md) | Everyone | Install, usage examples, architecture summary, dependency graph, roadmap | +| [ARCHITECTURE.md](ARCHITECTURE.md) | Contributors & integrators | Layers, products vs targets, Mermaid graphs, protocol matrix, tests | +| [../CONTRIBUTING.md](../CONTRIBUTING.md) | Contributors | Setup, PR process, adding providers | +| [../CHANGELOG.md](../CHANGELOG.md) | Everyone | Notable changes | +| [../LICENSE](../LICENSE) | Everyone | MIT | + +## Quick orientation + +```text +Package.swift products, targets, external deps +Sources/CoreMI foundations (requests, model IDs, services) +Sources/LargeLanguageModels AbstractLLM, prompts, embeddings protocols +Sources/ vendor clients +Sources/AI umbrella module (selective @_exported imports) +Tests/ parallel test targets (see ARCHITECTURE.md for gaps) +docs/ long-form documentation (this folder) +``` + +## Keeping docs honest + +When you change `Package.swift` or add a provider: + +1. Update the dependency graph and tables in [ARCHITECTURE.md](ARCHITECTURE.md). +2. Mirror user-facing bits in [../README.md](../README.md) (products, roadmap, import notes). +3. Note the change under `[Unreleased]` in [../CHANGELOG.md](../CHANGELOG.md). From 79cfd97cdc5e35eacc4a291fce45404766f564d9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 11 Aug 2026 10:20:14 +0000 Subject: [PATCH 088/271] Fix CONTRIBUTING markdown heading spacing Co-authored-by: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> --- CONTRIBUTING.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index fe2ab4ae..1b481455 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -127,6 +127,7 @@ Prefer implementing shared protocols over one-off APIs so apps can swap provider | [.github/PULL_REQUEST_TEMPLATE.md](.github/PULL_REQUEST_TEMPLATE.md) | PR checklist | When editing architecture docs, regenerate or manually update the Mermaid graph so it stays consistent with `Package.swift`. + ## CI Pushes and PRs to `main` run the **Build** workflow (Preternatural build action on macOS runners). Fix build failures before merge. From 6018efd052cb3be571b3a8161f1328f8a110b123 Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Wed, 12 Aug 2026 04:49:14 -0700 Subject: [PATCH 089/271] Document package architecture, dependency graph, and contribution workflow (#50) * Document architecture, dependencies, and contribution guides Co-authored-by: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> * Fix CHANGELOG release date format for Keep a Changelog Co-authored-by: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> * Harden docs: accuracy, capability matrix, PR template Co-authored-by: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> * Fix CONTRIBUTING markdown heading spacing Co-authored-by: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> --- .github/PULL_REQUEST_TEMPLATE.md | 31 ++++ README.md | 260 +++++++++++++++++++++++++++++-- docs/README.md | 31 ++++ 3 files changed, 310 insertions(+), 12 deletions(-) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 docs/README.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..7dfe0424 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,31 @@ +## Summary + + + +## Type of change + +- [ ] Bug fix +- [ ] New provider / API surface +- [ ] Refactor +- [ ] Documentation +- [ ] Tests / CI +- [ ] Other + +## Checklist + +- [ ] Builds with the package’s supported Xcode/Swift versions +- [ ] Tests added or updated when behavior changes +- [ ] No secrets or API keys committed +- [ ] Docs updated if products, targets, public API, or dependencies changed: + - [ ] `README.md` + - [ ] `docs/ARCHITECTURE.md` (graph / tables) + - [ ] `CHANGELOG.md` (`[Unreleased]`) +- [ ] Layering respected (providers β†’ `LargeLanguageModels` β†’ `CoreMI`; avoid new providerβ†’provider deps) + +## Test plan + + + +## Related issues + + diff --git a/README.md b/README.md index ea26cc1e..388e6c54 100644 --- a/README.md +++ b/README.md @@ -1,43 +1,44 @@ > [!IMPORTANT] > This package is presently in its alpha stage of development (2026-03-04). ---- +#### Supported Platforms - +SPM platforms from [`Package.swift`](Package.swift): **iOS 16+**, **macOS 13+**, **tvOS 16+**, **visionOS 1+**, **watchOS 9+**. -#### Supported Platforms

- macos + macOS   - macos + iOS   - macos + iPadOS   - macos + tvOS   - macos + watchOS

+Also targets **visionOS** (badge art not yet in `Images/`). + # AI The definitive, open-source Swift framework for interfacing with generative AI. @@ -105,6 +106,179 @@ External package dependencies declared in `Package.swift`: 4. Choose the version you'd like to install. 5. Click `Add Package`. +Or add the dependency in `Package.swift`: + +```swift +dependencies: [ + .package(url: "https://github.com/PreternaturalAI/AI.git", branch: "main") +] +``` + +Then link the `AI` product (umbrella) or a standalone product such as `OpenAI`, `Anthropic`, or `Perplexity` (see [Architecture](#architecture)). + +# Architecture + +The package is organized in layers. Provider SDKs implement shared protocols (`LLMRequestHandling`, embeddings, TTS, and so on) defined in the core modules. + +| Layer | Modules | Responsibility | +|-------|---------|----------------| +| Umbrella module | `AI` | `@_exported` re-exports **CoreMI**, **LargeLanguageModels**, **OpenAI** (and Swallow macros client). Other bundled modules still need their own `import`. | +| Umbrella product | `AI` library | SPM product that **links** core + Anthropic, Cohere, ElevenLabs, Groq, HuggingFace, Jina, Mistral, Ollama, OpenAI, and the `AI` module | +| Providers | `OpenAI`, `Anthropic`, `Mistral`, `Groq`, `Ollama`, `Perplexity`, `Cohere`, `Jina`, `VoyageAI`, `TogetherAI`, `ElevenLabs`, `PlayHT`, `Rime`, `HumeAI`, `NeetsAI`, `_Gemini`, `HuggingFace`, … | API clients and model types | +| LLM abstractions | `LargeLanguageModels` | `AbstractLLM`, `PromptLiteral`, chat/function-calling, embeddings protocols | +| Foundations | `CoreMI` | Request handling, model identifiers, service credentials, ASR/TTS bases | +| External | Swallow, Merge, NetworkKit, CorePersistence, SwiftUIX | Shared infrastructure (see [Dependencies](#dependencies)) | + +`import AI` is enough for OpenAI + shared LLM types. For other clients linked by the product, add e.g. `import Anthropic` or `import Groq`. Providers shipped only as standalone products (`Perplexity`, `_Gemini`, `VoyageAI`, …) require linking that product. + +### Component dependency graph + +Graph of **package targets** as declared in [`Package.swift`](Package.swift) (external packages shown once at the bottom). For products, tests, and design notes, see **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)**. + +```mermaid +flowchart TB + subgraph umbrella [Umbrella] + AI + end + + subgraph providers [Provider targets] + OpenAI + Anthropic + Mistral + Groq + Ollama + Perplexity + Cohere + Jina + VoyageAI + TogetherAI + ElevenLabs + PlayHT + Rime + HumeAI + NeetsAI + Gemini["_Gemini"] + HuggingFace + end + + subgraph core [Core targets] + LargeLanguageModels + CoreMI + end + + subgraph external [External packages] + Swallow + Merge + NetworkKit + CorePersistence + SwiftUIX + end + + AI --> CoreMI + AI --> LargeLanguageModels + AI --> OpenAI + AI --> Anthropic + AI --> Mistral + AI --> Groq + AI --> Ollama + AI --> Cohere + AI --> ElevenLabs + AI --> HuggingFace + AI --> Jina + + OpenAI --> LargeLanguageModels + Anthropic --> LargeLanguageModels + Mistral --> LargeLanguageModels + Groq --> LargeLanguageModels + Ollama --> LargeLanguageModels + Perplexity --> LargeLanguageModels + Perplexity --> OpenAI + Cohere --> LargeLanguageModels + Jina --> LargeLanguageModels + VoyageAI --> LargeLanguageModels + TogetherAI --> LargeLanguageModels + ElevenLabs --> LargeLanguageModels + PlayHT --> LargeLanguageModels + Rime --> LargeLanguageModels + HumeAI --> LargeLanguageModels + NeetsAI --> LargeLanguageModels + Gemini --> LargeLanguageModels + HuggingFace --> CoreMI + + LargeLanguageModels --> CoreMI + LargeLanguageModels --> CorePersistence + LargeLanguageModels --> Merge + LargeLanguageModels --> NetworkKit + LargeLanguageModels --> Swallow + LargeLanguageModels --> SwiftUIX + + CoreMI --> CorePersistence + CoreMI --> Merge + CoreMI --> Swallow +``` + +**Notes** + +- Most providers also depend on `CoreMI`, `CorePersistence`, `Merge`, `NetworkKit`, and `Swallow` directly (edges omitted above for readability where they already flow through `LargeLanguageModels`). +- **OpenAI** and **Anthropic** depend on `LargeLanguageModels` + networking stack, not on `CoreMI` directly in `Package.swift`. +- **Perplexity** is the only provider that depends on another provider target (`OpenAI`). +- **HuggingFace** depends on `CoreMI` + `Swallow` only (hub/tokenizer helpers, not the full LLM stack). +- The `AI` **product** does **not** link every target (for example `_Gemini`, `Perplexity`, `PlayHT`, `Rime`, `TogetherAI`, `VoyageAI`, `HumeAI`, `NeetsAI` are separate products). +- The `AI` **module** re-exports only CoreMI, LargeLanguageModels, and OpenAI among first-party modules (`Sources/AI/module.swift`). + +### Protocol capabilities (from source) + +Which shared protocols have an explicit client conformance today: + +| Target | `LLMRequestHandling` | `TextEmbeddingsRequestHandling` | Notes | +|--------|:--------------------:|:-------------------------------:|-------| +| OpenAI | yes | yes | Also images, Whisper, speech, assistants | +| Anthropic | yes | | | +| Mistral | yes | yes | | +| Groq | yes | | | +| Ollama | yes | | | +| Perplexity | yes | | Depends on OpenAI target | +| Cohere | | yes | | +| Jina | | yes | | +| VoyageAI | | yes | | +| TogetherAI, ElevenLabs, PlayHT, Rime, HumeAI, NeetsAI, _Gemini, HuggingFace | | | Provider-specific client APIs / hub helpers (see `Sources/`) | + +Full layering detail: **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)**. Docs index: **[docs/README.md](docs/README.md)**. + +# Dependencies + +### External Swift packages + +| Package | Repository | Role | +|---------|------------|------| +| Swallow | [vmanot/Swallow](https://github.com/vmanot/Swallow) | Extensions, macros client, diagnostics | +| Merge | [vmanot/Merge](https://github.com/vmanot/Merge) | Concurrency / async utilities | +| NetworkKit | [vmanot/NetworkKit](https://github.com/vmanot/NetworkKit) | HTTP client & API specifications | +| CorePersistence | [vmanot/CorePersistence](https://github.com/vmanot/CorePersistence) | Persistence & schema helpers (e.g. JSONSchema) | +| SwiftUIX | [SwiftUIX/SwiftUIX](https://github.com/SwiftUIX/SwiftUIX) | SwiftUI extensions | + +Transitive pins (see [`Package.resolved`](Package.resolved)) include **SwiftAPI**, **swift-collections**, and **swift-syntax**. + +### SPM products you can link + +Exact product names from `Package.swift`: + +| Product | Targets exposed | Use when | +|---------|-----------------|----------| +| `AI` | CoreMI, LargeLanguageModels, Anthropic, Cohere, ElevenLabs, Groq, HuggingFace, Jina, Mistral, Ollama, OpenAI, AI | Default multi-provider app dependency | +| `OpenAI` | OpenAI | OpenAI-only | +| `Anthropic` | Anthropic | Anthropic-only | +| `Perplexity` | Perplexity | Perplexity (pulls OpenAI transitively) | +| `TogetherAI` | TogetherAI | Together AI | +| `VoyageAI` | VoyageAI | Voyage embeddings | +| `PlayHT` | PlayHT | PlayHT voice | +| `Rime` | Rime | Rime voice | +| `HumeAI` | HumeAI | Hume | +| `NeetsAI` | NeetsAI | Neets | +| `_Gemini` | _Gemini | Google Gemini client | + +There is **no** standalone SPM product today for `CoreMI`, `LargeLanguageModels`, `Cohere`, `Groq`, `HuggingFace`, `Jina`, `Mistral`, `Ollama`, or `ElevenLabs` β€” consume them via the `AI` product (or add a product in `Package.swift` if you need a leaner slice). + # Usage ## Import the framework @@ -582,14 +756,76 @@ let embeddings = try await LLMManager.client.textEmbeddings( return embeddings.data.first?.embedding.description ``` +# Documentation + +| Document | Contents | +|----------|----------| +| **[docs/README.md](docs/README.md)** | Documentation index | +| **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)** | Full architecture, products vs targets, Mermaid graph, protocol matrix, tests | +| **[CONTRIBUTING.md](CONTRIBUTING.md)** | Dev setup, coding guidelines, how to add a provider | +| **[CHANGELOG.md](CHANGELOG.md)** | Release notes and unreleased changes | +| **[LICENSE](LICENSE)** | MIT License text | + +API behavior is illustrated in the [Usage](#usage) sections above; protocol details live in `Sources/LargeLanguageModels` and `Sources/CoreMI`. + # Roadmap -- [x] OpenAI +Status reflects modules present in this repository (`Sources/` + `Package.swift`). Checked items ship as package targets; depth of feature coverage varies by provider. + +### Core + +- [x] `CoreMI` β€” request handling, model identifiers, services, ASR/TTS foundations +- [x] `LargeLanguageModels` β€” `AbstractLLM`, prompts, function calling, embeddings protocols +- [x] `AI` umbrella product + +### LLM & multimodal providers + +- [x] OpenAI (chat, vision, tools, images, Whisper, speech) - [x] Anthropic - [x] Mistral +- [x] Groq - [x] Ollama -- [ ] Perplexity -- [ ] Groq +- [x] Perplexity +- [x] TogetherAI +- [x] `_Gemini` (Google Gemini client; standalone product) +- [ ] Broader parity matrix (streaming, tools, vision) across every LLM provider + +### Embeddings & hub + +- [x] OpenAI embeddings +- [x] Cohere +- [x] Jina +- [x] VoyageAI +- [x] Hugging Face hub helpers / tokenizer resources + +### Voice & speech + +- [x] ElevenLabs +- [x] PlayHT +- [x] Rime +- [x] HumeAI +- [x] NeetsAI +- [x] OpenAI TTS / Whisper + +### Project hygiene + +- [x] Architecture & dependency documentation +- [x] Contributing guide, docs index, PR template & changelog +- [ ] Register missing test targets (Ollama, Rime, TogetherAI folder) +- [ ] visionOS badge artwork under `Images/` +- [ ] Tagged semantic releases with automated changelog sections + +# Contributing + +Contributions are welcome. Please read **[CONTRIBUTING.md](CONTRIBUTING.md)** for: + +- Environment and build requirements +- PR expectations and testing notes +- Steps to add or extend a provider without breaking layering rules + +# Changelog + +See **[CHANGELOG.md](CHANGELOG.md)** for user-visible changes. The package is in **alpha**; expect API evolution between releases. # Acknowledgements @@ -598,4 +834,4 @@ return embeddings.data.first?.embedding.description # License -This package is licensed under the MIT License. +This package is licensed under the [MIT License](LICENSE). diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000..5e24f4c9 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,31 @@ +# Documentation + +Guides for the **AI** Swift package ([PreternaturalAI/AI](https://github.com/PreternaturalAI/AI)). + +| Document | Audience | Description | +|----------|----------|-------------| +| [../README.md](../README.md) | Everyone | Install, usage examples, architecture summary, dependency graph, roadmap | +| [ARCHITECTURE.md](ARCHITECTURE.md) | Contributors & integrators | Layers, products vs targets, Mermaid graphs, protocol matrix, tests | +| [../CONTRIBUTING.md](../CONTRIBUTING.md) | Contributors | Setup, PR process, adding providers | +| [../CHANGELOG.md](../CHANGELOG.md) | Everyone | Notable changes | +| [../LICENSE](../LICENSE) | Everyone | MIT | + +## Quick orientation + +```text +Package.swift products, targets, external deps +Sources/CoreMI foundations (requests, model IDs, services) +Sources/LargeLanguageModels AbstractLLM, prompts, embeddings protocols +Sources/ vendor clients +Sources/AI umbrella module (selective @_exported imports) +Tests/ parallel test targets (see ARCHITECTURE.md for gaps) +docs/ long-form documentation (this folder) +``` + +## Keeping docs honest + +When you change `Package.swift` or add a provider: + +1. Update the dependency graph and tables in [ARCHITECTURE.md](ARCHITECTURE.md). +2. Mirror user-facing bits in [../README.md](../README.md) (products, roadmap, import notes). +3. Note the change under `[Unreleased]` in [../CHANGELOG.md](../CHANGELOG.md). From 150959e6ba1df65573325176ad61bf598d8f8081 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Wed, 12 Aug 2026 15:37:29 -0700 Subject: [PATCH 090/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) --- .github/PULL_REQUEST_TEMPLATE.md | 31 ++++ README.md | 260 +++++++++++++++++++++++++++++-- docs/README.md | 31 ++++ 3 files changed, 310 insertions(+), 12 deletions(-) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 docs/README.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..7dfe0424 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,31 @@ +## Summary + + + +## Type of change + +- [ ] Bug fix +- [ ] New provider / API surface +- [ ] Refactor +- [ ] Documentation +- [ ] Tests / CI +- [ ] Other + +## Checklist + +- [ ] Builds with the package’s supported Xcode/Swift versions +- [ ] Tests added or updated when behavior changes +- [ ] No secrets or API keys committed +- [ ] Docs updated if products, targets, public API, or dependencies changed: + - [ ] `README.md` + - [ ] `docs/ARCHITECTURE.md` (graph / tables) + - [ ] `CHANGELOG.md` (`[Unreleased]`) +- [ ] Layering respected (providers β†’ `LargeLanguageModels` β†’ `CoreMI`; avoid new providerβ†’provider deps) + +## Test plan + + + +## Related issues + + diff --git a/README.md b/README.md index ea26cc1e..388e6c54 100644 --- a/README.md +++ b/README.md @@ -1,43 +1,44 @@ > [!IMPORTANT] > This package is presently in its alpha stage of development (2026-03-04). ---- +#### Supported Platforms - +SPM platforms from [`Package.swift`](Package.swift): **iOS 16+**, **macOS 13+**, **tvOS 16+**, **visionOS 1+**, **watchOS 9+**. -#### Supported Platforms

- macos + macOS   - macos + iOS   - macos + iPadOS   - macos + tvOS   - macos + watchOS

+Also targets **visionOS** (badge art not yet in `Images/`). + # AI The definitive, open-source Swift framework for interfacing with generative AI. @@ -105,6 +106,179 @@ External package dependencies declared in `Package.swift`: 4. Choose the version you'd like to install. 5. Click `Add Package`. +Or add the dependency in `Package.swift`: + +```swift +dependencies: [ + .package(url: "https://github.com/PreternaturalAI/AI.git", branch: "main") +] +``` + +Then link the `AI` product (umbrella) or a standalone product such as `OpenAI`, `Anthropic`, or `Perplexity` (see [Architecture](#architecture)). + +# Architecture + +The package is organized in layers. Provider SDKs implement shared protocols (`LLMRequestHandling`, embeddings, TTS, and so on) defined in the core modules. + +| Layer | Modules | Responsibility | +|-------|---------|----------------| +| Umbrella module | `AI` | `@_exported` re-exports **CoreMI**, **LargeLanguageModels**, **OpenAI** (and Swallow macros client). Other bundled modules still need their own `import`. | +| Umbrella product | `AI` library | SPM product that **links** core + Anthropic, Cohere, ElevenLabs, Groq, HuggingFace, Jina, Mistral, Ollama, OpenAI, and the `AI` module | +| Providers | `OpenAI`, `Anthropic`, `Mistral`, `Groq`, `Ollama`, `Perplexity`, `Cohere`, `Jina`, `VoyageAI`, `TogetherAI`, `ElevenLabs`, `PlayHT`, `Rime`, `HumeAI`, `NeetsAI`, `_Gemini`, `HuggingFace`, … | API clients and model types | +| LLM abstractions | `LargeLanguageModels` | `AbstractLLM`, `PromptLiteral`, chat/function-calling, embeddings protocols | +| Foundations | `CoreMI` | Request handling, model identifiers, service credentials, ASR/TTS bases | +| External | Swallow, Merge, NetworkKit, CorePersistence, SwiftUIX | Shared infrastructure (see [Dependencies](#dependencies)) | + +`import AI` is enough for OpenAI + shared LLM types. For other clients linked by the product, add e.g. `import Anthropic` or `import Groq`. Providers shipped only as standalone products (`Perplexity`, `_Gemini`, `VoyageAI`, …) require linking that product. + +### Component dependency graph + +Graph of **package targets** as declared in [`Package.swift`](Package.swift) (external packages shown once at the bottom). For products, tests, and design notes, see **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)**. + +```mermaid +flowchart TB + subgraph umbrella [Umbrella] + AI + end + + subgraph providers [Provider targets] + OpenAI + Anthropic + Mistral + Groq + Ollama + Perplexity + Cohere + Jina + VoyageAI + TogetherAI + ElevenLabs + PlayHT + Rime + HumeAI + NeetsAI + Gemini["_Gemini"] + HuggingFace + end + + subgraph core [Core targets] + LargeLanguageModels + CoreMI + end + + subgraph external [External packages] + Swallow + Merge + NetworkKit + CorePersistence + SwiftUIX + end + + AI --> CoreMI + AI --> LargeLanguageModels + AI --> OpenAI + AI --> Anthropic + AI --> Mistral + AI --> Groq + AI --> Ollama + AI --> Cohere + AI --> ElevenLabs + AI --> HuggingFace + AI --> Jina + + OpenAI --> LargeLanguageModels + Anthropic --> LargeLanguageModels + Mistral --> LargeLanguageModels + Groq --> LargeLanguageModels + Ollama --> LargeLanguageModels + Perplexity --> LargeLanguageModels + Perplexity --> OpenAI + Cohere --> LargeLanguageModels + Jina --> LargeLanguageModels + VoyageAI --> LargeLanguageModels + TogetherAI --> LargeLanguageModels + ElevenLabs --> LargeLanguageModels + PlayHT --> LargeLanguageModels + Rime --> LargeLanguageModels + HumeAI --> LargeLanguageModels + NeetsAI --> LargeLanguageModels + Gemini --> LargeLanguageModels + HuggingFace --> CoreMI + + LargeLanguageModels --> CoreMI + LargeLanguageModels --> CorePersistence + LargeLanguageModels --> Merge + LargeLanguageModels --> NetworkKit + LargeLanguageModels --> Swallow + LargeLanguageModels --> SwiftUIX + + CoreMI --> CorePersistence + CoreMI --> Merge + CoreMI --> Swallow +``` + +**Notes** + +- Most providers also depend on `CoreMI`, `CorePersistence`, `Merge`, `NetworkKit`, and `Swallow` directly (edges omitted above for readability where they already flow through `LargeLanguageModels`). +- **OpenAI** and **Anthropic** depend on `LargeLanguageModels` + networking stack, not on `CoreMI` directly in `Package.swift`. +- **Perplexity** is the only provider that depends on another provider target (`OpenAI`). +- **HuggingFace** depends on `CoreMI` + `Swallow` only (hub/tokenizer helpers, not the full LLM stack). +- The `AI` **product** does **not** link every target (for example `_Gemini`, `Perplexity`, `PlayHT`, `Rime`, `TogetherAI`, `VoyageAI`, `HumeAI`, `NeetsAI` are separate products). +- The `AI` **module** re-exports only CoreMI, LargeLanguageModels, and OpenAI among first-party modules (`Sources/AI/module.swift`). + +### Protocol capabilities (from source) + +Which shared protocols have an explicit client conformance today: + +| Target | `LLMRequestHandling` | `TextEmbeddingsRequestHandling` | Notes | +|--------|:--------------------:|:-------------------------------:|-------| +| OpenAI | yes | yes | Also images, Whisper, speech, assistants | +| Anthropic | yes | | | +| Mistral | yes | yes | | +| Groq | yes | | | +| Ollama | yes | | | +| Perplexity | yes | | Depends on OpenAI target | +| Cohere | | yes | | +| Jina | | yes | | +| VoyageAI | | yes | | +| TogetherAI, ElevenLabs, PlayHT, Rime, HumeAI, NeetsAI, _Gemini, HuggingFace | | | Provider-specific client APIs / hub helpers (see `Sources/`) | + +Full layering detail: **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)**. Docs index: **[docs/README.md](docs/README.md)**. + +# Dependencies + +### External Swift packages + +| Package | Repository | Role | +|---------|------------|------| +| Swallow | [vmanot/Swallow](https://github.com/vmanot/Swallow) | Extensions, macros client, diagnostics | +| Merge | [vmanot/Merge](https://github.com/vmanot/Merge) | Concurrency / async utilities | +| NetworkKit | [vmanot/NetworkKit](https://github.com/vmanot/NetworkKit) | HTTP client & API specifications | +| CorePersistence | [vmanot/CorePersistence](https://github.com/vmanot/CorePersistence) | Persistence & schema helpers (e.g. JSONSchema) | +| SwiftUIX | [SwiftUIX/SwiftUIX](https://github.com/SwiftUIX/SwiftUIX) | SwiftUI extensions | + +Transitive pins (see [`Package.resolved`](Package.resolved)) include **SwiftAPI**, **swift-collections**, and **swift-syntax**. + +### SPM products you can link + +Exact product names from `Package.swift`: + +| Product | Targets exposed | Use when | +|---------|-----------------|----------| +| `AI` | CoreMI, LargeLanguageModels, Anthropic, Cohere, ElevenLabs, Groq, HuggingFace, Jina, Mistral, Ollama, OpenAI, AI | Default multi-provider app dependency | +| `OpenAI` | OpenAI | OpenAI-only | +| `Anthropic` | Anthropic | Anthropic-only | +| `Perplexity` | Perplexity | Perplexity (pulls OpenAI transitively) | +| `TogetherAI` | TogetherAI | Together AI | +| `VoyageAI` | VoyageAI | Voyage embeddings | +| `PlayHT` | PlayHT | PlayHT voice | +| `Rime` | Rime | Rime voice | +| `HumeAI` | HumeAI | Hume | +| `NeetsAI` | NeetsAI | Neets | +| `_Gemini` | _Gemini | Google Gemini client | + +There is **no** standalone SPM product today for `CoreMI`, `LargeLanguageModels`, `Cohere`, `Groq`, `HuggingFace`, `Jina`, `Mistral`, `Ollama`, or `ElevenLabs` β€” consume them via the `AI` product (or add a product in `Package.swift` if you need a leaner slice). + # Usage ## Import the framework @@ -582,14 +756,76 @@ let embeddings = try await LLMManager.client.textEmbeddings( return embeddings.data.first?.embedding.description ``` +# Documentation + +| Document | Contents | +|----------|----------| +| **[docs/README.md](docs/README.md)** | Documentation index | +| **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)** | Full architecture, products vs targets, Mermaid graph, protocol matrix, tests | +| **[CONTRIBUTING.md](CONTRIBUTING.md)** | Dev setup, coding guidelines, how to add a provider | +| **[CHANGELOG.md](CHANGELOG.md)** | Release notes and unreleased changes | +| **[LICENSE](LICENSE)** | MIT License text | + +API behavior is illustrated in the [Usage](#usage) sections above; protocol details live in `Sources/LargeLanguageModels` and `Sources/CoreMI`. + # Roadmap -- [x] OpenAI +Status reflects modules present in this repository (`Sources/` + `Package.swift`). Checked items ship as package targets; depth of feature coverage varies by provider. + +### Core + +- [x] `CoreMI` β€” request handling, model identifiers, services, ASR/TTS foundations +- [x] `LargeLanguageModels` β€” `AbstractLLM`, prompts, function calling, embeddings protocols +- [x] `AI` umbrella product + +### LLM & multimodal providers + +- [x] OpenAI (chat, vision, tools, images, Whisper, speech) - [x] Anthropic - [x] Mistral +- [x] Groq - [x] Ollama -- [ ] Perplexity -- [ ] Groq +- [x] Perplexity +- [x] TogetherAI +- [x] `_Gemini` (Google Gemini client; standalone product) +- [ ] Broader parity matrix (streaming, tools, vision) across every LLM provider + +### Embeddings & hub + +- [x] OpenAI embeddings +- [x] Cohere +- [x] Jina +- [x] VoyageAI +- [x] Hugging Face hub helpers / tokenizer resources + +### Voice & speech + +- [x] ElevenLabs +- [x] PlayHT +- [x] Rime +- [x] HumeAI +- [x] NeetsAI +- [x] OpenAI TTS / Whisper + +### Project hygiene + +- [x] Architecture & dependency documentation +- [x] Contributing guide, docs index, PR template & changelog +- [ ] Register missing test targets (Ollama, Rime, TogetherAI folder) +- [ ] visionOS badge artwork under `Images/` +- [ ] Tagged semantic releases with automated changelog sections + +# Contributing + +Contributions are welcome. Please read **[CONTRIBUTING.md](CONTRIBUTING.md)** for: + +- Environment and build requirements +- PR expectations and testing notes +- Steps to add or extend a provider without breaking layering rules + +# Changelog + +See **[CHANGELOG.md](CHANGELOG.md)** for user-visible changes. The package is in **alpha**; expect API evolution between releases. # Acknowledgements @@ -598,4 +834,4 @@ return embeddings.data.first?.embedding.description # License -This package is licensed under the MIT License. +This package is licensed under the [MIT License](LICENSE). diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000..5e24f4c9 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,31 @@ +# Documentation + +Guides for the **AI** Swift package ([PreternaturalAI/AI](https://github.com/PreternaturalAI/AI)). + +| Document | Audience | Description | +|----------|----------|-------------| +| [../README.md](../README.md) | Everyone | Install, usage examples, architecture summary, dependency graph, roadmap | +| [ARCHITECTURE.md](ARCHITECTURE.md) | Contributors & integrators | Layers, products vs targets, Mermaid graphs, protocol matrix, tests | +| [../CONTRIBUTING.md](../CONTRIBUTING.md) | Contributors | Setup, PR process, adding providers | +| [../CHANGELOG.md](../CHANGELOG.md) | Everyone | Notable changes | +| [../LICENSE](../LICENSE) | Everyone | MIT | + +## Quick orientation + +```text +Package.swift products, targets, external deps +Sources/CoreMI foundations (requests, model IDs, services) +Sources/LargeLanguageModels AbstractLLM, prompts, embeddings protocols +Sources/ vendor clients +Sources/AI umbrella module (selective @_exported imports) +Tests/ parallel test targets (see ARCHITECTURE.md for gaps) +docs/ long-form documentation (this folder) +``` + +## Keeping docs honest + +When you change `Package.swift` or add a provider: + +1. Update the dependency graph and tables in [ARCHITECTURE.md](ARCHITECTURE.md). +2. Mirror user-facing bits in [../README.md](../README.md) (products, roadmap, import notes). +3. Note the change under `[Unreleased]` in [../CHANGELOG.md](../CHANGELOG.md). From 5ff1759ae83ce397bd6d88e5bf03af67ca75d07e Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Wed, 12 Aug 2026 15:37:53 -0700 Subject: [PATCH 091/271] Document package architecture, dependency graph, and contribution workflow (#50) (#52) --- .github/PULL_REQUEST_TEMPLATE.md | 31 +++ CHANGELOG.md | 11 + CONTRIBUTING.md | 37 ++++ README.md | 333 ++++++++++++++++++++++++++++--- docs/ARCHITECTURE.md | 100 ++++++++++ docs/README.md | 31 +++ 6 files changed, 510 insertions(+), 33 deletions(-) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 CHANGELOG.md create mode 100644 CONTRIBUTING.md create mode 100644 docs/ARCHITECTURE.md create mode 100644 docs/README.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..7dfe0424 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,31 @@ +## Summary + + + +## Type of change + +- [ ] Bug fix +- [ ] New provider / API surface +- [ ] Refactor +- [ ] Documentation +- [ ] Tests / CI +- [ ] Other + +## Checklist + +- [ ] Builds with the package’s supported Xcode/Swift versions +- [ ] Tests added or updated when behavior changes +- [ ] No secrets or API keys committed +- [ ] Docs updated if products, targets, public API, or dependencies changed: + - [ ] `README.md` + - [ ] `docs/ARCHITECTURE.md` (graph / tables) + - [ ] `CHANGELOG.md` (`[Unreleased]`) +- [ ] Layering respected (providers β†’ `LargeLanguageModels` β†’ `CoreMI`; avoid new providerβ†’provider deps) + +## Test plan + + + +## Related issues + + diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..cfb3a06d --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,11 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +## [Unreleased] + +### Added + +- Added architecture documentation in `docs/ARCHITECTURE.md`. +- Added contribution guidelines in `CONTRIBUTING.md`. +- Improved `README.md` with architecture, dependency graph, and documentation links. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..1f9c2b44 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,37 @@ +# Contributing + +Thanks for contributing to AI. + +## Prerequisites + +- Xcode 15.4+ (Swift 5.10 toolchain) +- Apple platform SDKs supported by this package + +## Getting Started + +1. Fork the repository and create a feature branch. +2. Make focused changes with clear commit messages. +3. Run tests locally: + +```bash +swift test +``` + +4. Update documentation when behavior, APIs, or architecture changes. +5. Open a pull request with a clear summary and test notes. + +## Pull Request Checklist + +- [ ] Changes are scoped to one topic +- [ ] Public API changes are documented +- [ ] Tests pass locally (`swift test`) +- [ ] README/docs/changelog updated when needed + +## Reporting Issues + +When filing a bug, include: + +- Steps to reproduce +- Expected vs actual behavior +- Platform and Xcode/Swift versions +- Relevant logs or sample payloads diff --git a/README.md b/README.md index cf435eff..388e6c54 100644 --- a/README.md +++ b/README.md @@ -1,68 +1,100 @@ > [!IMPORTANT] > This package is presently in its alpha stage of development (2026-03-04). ---- +#### Supported Platforms - +SPM platforms from [`Package.swift`](Package.swift): **iOS 16+**, **macOS 13+**, **tvOS 16+**, **visionOS 1+**, **watchOS 9+**. -#### Supported Platforms

- macos + macOS   - macos + iOS   - macos + iPadOS   - macos + tvOS   - macos + watchOS

+Also targets **visionOS** (badge art not yet in `Images/`). + # AI The definitive, open-source Swift framework for interfacing with generative AI. -[Installation](#installation)\ -[Usage](#usage) - -* [Import the framework](#import-the-framework) -* [Initialize an AI Client](#initialize-an-ai-client) -* [LLM Clients Abstraction](#llm-clients-abstraction) -* [Supported Models](#supported-models) -* [Completions](#completions) - * [Basic Completions](#basic-completions) - * [Vision: Image-to-Text](#vision-image-to-text) - * [Function Calling](#function-calling) -* [DALLE-3 Image Generation](#dalle-3-image-generation) -* [Audio](#audio) - * [Audio Transcription: Whisper](#audio-transcription-whisper) - * [Audio Generation: OpenAI](#audio-generation-openai) - * [Audio Generation: ElevenLabs](#audio-generation-elevenlabs) -* [Text Embeddings](#text-embeddings) - -[Roadmap](#roadmap) \ -[Acknowledgements](#acknowledgements) \ -[License](#license) +## Documentation + +- [Architecture](docs/ARCHITECTURE.md) +- [Contributing](CONTRIBUTING.md) +- [Changelog](CHANGELOG.md) + +## Table of Contents + +- [Architecture Overview](#architecture-overview) +- [Dependencies](#dependencies) +- [Installation](#installation) +- [Usage](#usage) + - [Import the framework](#import-the-framework) + - [Initialize an AI Client](#initialize-an-ai-client) + - [LLM Clients Abstraction](#llm-clients-abstraction) + - [Supported Models](#supported-models) + - [Completions](#completions) + - [Basic Completions](#basic-completions) + - [Vision: Image-to-Text](#vision-image-to-text) + - [Function Calling](#function-calling) + - [DALLE-3 Image Generation](#dalle-3-image-generation) + - [Audio](#audio) + - [Audio Transcription: Whisper](#audio-transcription-whisper) + - [Audio Generation: OpenAI](#audio-generation-openai) + - [Audio Generation: ElevenLabs](#audio-generation-elevenlabs) + - [Text Embeddings](#text-embeddings) +- [Roadmap](#roadmap) +- [Acknowledgements](#acknowledgements) +- [License](#license) + +## Architecture Overview + +This package is organized as a Swift Package Manager workspace with layered modules: + +- `CoreMI` provides shared core abstractions used across providers. +- `LargeLanguageModels` builds common LLM request/response functionality on top of `CoreMI`. +- Provider modules (`OpenAI`, `Anthropic`, `Mistral`, `Groq`, `ElevenLabs`, etc.) implement vendor-specific APIs. +- `AI` is the umbrella product that re-exports the main modules for one-stop integration. + +### Component Dependency Graph + +A full dependency graph generated from `Package.swift` target dependencies is available in [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md#component-dependency-graph). + +## Dependencies + +External package dependencies declared in `Package.swift`: + +- [`CorePersistence`](https://github.com/vmanot/CorePersistence) +- [`Merge`](https://github.com/vmanot/Merge) +- [`NetworkKit`](https://github.com/vmanot/NetworkKit) +- [`Swallow`](https://github.com/vmanot/Swallow) +- [`SwiftUIX`](https://github.com/SwiftUIX/SwiftUIX) # Installation @@ -74,6 +106,179 @@ The definitive, open-source Swift framework for interfacing with generative AI. 4. Choose the version you'd like to install. 5. Click `Add Package`. +Or add the dependency in `Package.swift`: + +```swift +dependencies: [ + .package(url: "https://github.com/PreternaturalAI/AI.git", branch: "main") +] +``` + +Then link the `AI` product (umbrella) or a standalone product such as `OpenAI`, `Anthropic`, or `Perplexity` (see [Architecture](#architecture)). + +# Architecture + +The package is organized in layers. Provider SDKs implement shared protocols (`LLMRequestHandling`, embeddings, TTS, and so on) defined in the core modules. + +| Layer | Modules | Responsibility | +|-------|---------|----------------| +| Umbrella module | `AI` | `@_exported` re-exports **CoreMI**, **LargeLanguageModels**, **OpenAI** (and Swallow macros client). Other bundled modules still need their own `import`. | +| Umbrella product | `AI` library | SPM product that **links** core + Anthropic, Cohere, ElevenLabs, Groq, HuggingFace, Jina, Mistral, Ollama, OpenAI, and the `AI` module | +| Providers | `OpenAI`, `Anthropic`, `Mistral`, `Groq`, `Ollama`, `Perplexity`, `Cohere`, `Jina`, `VoyageAI`, `TogetherAI`, `ElevenLabs`, `PlayHT`, `Rime`, `HumeAI`, `NeetsAI`, `_Gemini`, `HuggingFace`, … | API clients and model types | +| LLM abstractions | `LargeLanguageModels` | `AbstractLLM`, `PromptLiteral`, chat/function-calling, embeddings protocols | +| Foundations | `CoreMI` | Request handling, model identifiers, service credentials, ASR/TTS bases | +| External | Swallow, Merge, NetworkKit, CorePersistence, SwiftUIX | Shared infrastructure (see [Dependencies](#dependencies)) | + +`import AI` is enough for OpenAI + shared LLM types. For other clients linked by the product, add e.g. `import Anthropic` or `import Groq`. Providers shipped only as standalone products (`Perplexity`, `_Gemini`, `VoyageAI`, …) require linking that product. + +### Component dependency graph + +Graph of **package targets** as declared in [`Package.swift`](Package.swift) (external packages shown once at the bottom). For products, tests, and design notes, see **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)**. + +```mermaid +flowchart TB + subgraph umbrella [Umbrella] + AI + end + + subgraph providers [Provider targets] + OpenAI + Anthropic + Mistral + Groq + Ollama + Perplexity + Cohere + Jina + VoyageAI + TogetherAI + ElevenLabs + PlayHT + Rime + HumeAI + NeetsAI + Gemini["_Gemini"] + HuggingFace + end + + subgraph core [Core targets] + LargeLanguageModels + CoreMI + end + + subgraph external [External packages] + Swallow + Merge + NetworkKit + CorePersistence + SwiftUIX + end + + AI --> CoreMI + AI --> LargeLanguageModels + AI --> OpenAI + AI --> Anthropic + AI --> Mistral + AI --> Groq + AI --> Ollama + AI --> Cohere + AI --> ElevenLabs + AI --> HuggingFace + AI --> Jina + + OpenAI --> LargeLanguageModels + Anthropic --> LargeLanguageModels + Mistral --> LargeLanguageModels + Groq --> LargeLanguageModels + Ollama --> LargeLanguageModels + Perplexity --> LargeLanguageModels + Perplexity --> OpenAI + Cohere --> LargeLanguageModels + Jina --> LargeLanguageModels + VoyageAI --> LargeLanguageModels + TogetherAI --> LargeLanguageModels + ElevenLabs --> LargeLanguageModels + PlayHT --> LargeLanguageModels + Rime --> LargeLanguageModels + HumeAI --> LargeLanguageModels + NeetsAI --> LargeLanguageModels + Gemini --> LargeLanguageModels + HuggingFace --> CoreMI + + LargeLanguageModels --> CoreMI + LargeLanguageModels --> CorePersistence + LargeLanguageModels --> Merge + LargeLanguageModels --> NetworkKit + LargeLanguageModels --> Swallow + LargeLanguageModels --> SwiftUIX + + CoreMI --> CorePersistence + CoreMI --> Merge + CoreMI --> Swallow +``` + +**Notes** + +- Most providers also depend on `CoreMI`, `CorePersistence`, `Merge`, `NetworkKit`, and `Swallow` directly (edges omitted above for readability where they already flow through `LargeLanguageModels`). +- **OpenAI** and **Anthropic** depend on `LargeLanguageModels` + networking stack, not on `CoreMI` directly in `Package.swift`. +- **Perplexity** is the only provider that depends on another provider target (`OpenAI`). +- **HuggingFace** depends on `CoreMI` + `Swallow` only (hub/tokenizer helpers, not the full LLM stack). +- The `AI` **product** does **not** link every target (for example `_Gemini`, `Perplexity`, `PlayHT`, `Rime`, `TogetherAI`, `VoyageAI`, `HumeAI`, `NeetsAI` are separate products). +- The `AI` **module** re-exports only CoreMI, LargeLanguageModels, and OpenAI among first-party modules (`Sources/AI/module.swift`). + +### Protocol capabilities (from source) + +Which shared protocols have an explicit client conformance today: + +| Target | `LLMRequestHandling` | `TextEmbeddingsRequestHandling` | Notes | +|--------|:--------------------:|:-------------------------------:|-------| +| OpenAI | yes | yes | Also images, Whisper, speech, assistants | +| Anthropic | yes | | | +| Mistral | yes | yes | | +| Groq | yes | | | +| Ollama | yes | | | +| Perplexity | yes | | Depends on OpenAI target | +| Cohere | | yes | | +| Jina | | yes | | +| VoyageAI | | yes | | +| TogetherAI, ElevenLabs, PlayHT, Rime, HumeAI, NeetsAI, _Gemini, HuggingFace | | | Provider-specific client APIs / hub helpers (see `Sources/`) | + +Full layering detail: **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)**. Docs index: **[docs/README.md](docs/README.md)**. + +# Dependencies + +### External Swift packages + +| Package | Repository | Role | +|---------|------------|------| +| Swallow | [vmanot/Swallow](https://github.com/vmanot/Swallow) | Extensions, macros client, diagnostics | +| Merge | [vmanot/Merge](https://github.com/vmanot/Merge) | Concurrency / async utilities | +| NetworkKit | [vmanot/NetworkKit](https://github.com/vmanot/NetworkKit) | HTTP client & API specifications | +| CorePersistence | [vmanot/CorePersistence](https://github.com/vmanot/CorePersistence) | Persistence & schema helpers (e.g. JSONSchema) | +| SwiftUIX | [SwiftUIX/SwiftUIX](https://github.com/SwiftUIX/SwiftUIX) | SwiftUI extensions | + +Transitive pins (see [`Package.resolved`](Package.resolved)) include **SwiftAPI**, **swift-collections**, and **swift-syntax**. + +### SPM products you can link + +Exact product names from `Package.swift`: + +| Product | Targets exposed | Use when | +|---------|-----------------|----------| +| `AI` | CoreMI, LargeLanguageModels, Anthropic, Cohere, ElevenLabs, Groq, HuggingFace, Jina, Mistral, Ollama, OpenAI, AI | Default multi-provider app dependency | +| `OpenAI` | OpenAI | OpenAI-only | +| `Anthropic` | Anthropic | Anthropic-only | +| `Perplexity` | Perplexity | Perplexity (pulls OpenAI transitively) | +| `TogetherAI` | TogetherAI | Together AI | +| `VoyageAI` | VoyageAI | Voyage embeddings | +| `PlayHT` | PlayHT | PlayHT voice | +| `Rime` | Rime | Rime voice | +| `HumeAI` | HumeAI | Hume | +| `NeetsAI` | NeetsAI | Neets | +| `_Gemini` | _Gemini | Google Gemini client | + +There is **no** standalone SPM product today for `CoreMI`, `LargeLanguageModels`, `Cohere`, `Groq`, `HuggingFace`, `Jina`, `Mistral`, `Ollama`, or `ElevenLabs` β€” consume them via the `AI` product (or add a product in `Package.swift` if you need a leaner slice). + # Usage ## Import the framework @@ -551,14 +756,76 @@ let embeddings = try await LLMManager.client.textEmbeddings( return embeddings.data.first?.embedding.description ``` +# Documentation + +| Document | Contents | +|----------|----------| +| **[docs/README.md](docs/README.md)** | Documentation index | +| **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)** | Full architecture, products vs targets, Mermaid graph, protocol matrix, tests | +| **[CONTRIBUTING.md](CONTRIBUTING.md)** | Dev setup, coding guidelines, how to add a provider | +| **[CHANGELOG.md](CHANGELOG.md)** | Release notes and unreleased changes | +| **[LICENSE](LICENSE)** | MIT License text | + +API behavior is illustrated in the [Usage](#usage) sections above; protocol details live in `Sources/LargeLanguageModels` and `Sources/CoreMI`. + # Roadmap -- [x] OpenAI +Status reflects modules present in this repository (`Sources/` + `Package.swift`). Checked items ship as package targets; depth of feature coverage varies by provider. + +### Core + +- [x] `CoreMI` β€” request handling, model identifiers, services, ASR/TTS foundations +- [x] `LargeLanguageModels` β€” `AbstractLLM`, prompts, function calling, embeddings protocols +- [x] `AI` umbrella product + +### LLM & multimodal providers + +- [x] OpenAI (chat, vision, tools, images, Whisper, speech) - [x] Anthropic - [x] Mistral +- [x] Groq - [x] Ollama -- [ ] Perplexity -- [ ] Groq +- [x] Perplexity +- [x] TogetherAI +- [x] `_Gemini` (Google Gemini client; standalone product) +- [ ] Broader parity matrix (streaming, tools, vision) across every LLM provider + +### Embeddings & hub + +- [x] OpenAI embeddings +- [x] Cohere +- [x] Jina +- [x] VoyageAI +- [x] Hugging Face hub helpers / tokenizer resources + +### Voice & speech + +- [x] ElevenLabs +- [x] PlayHT +- [x] Rime +- [x] HumeAI +- [x] NeetsAI +- [x] OpenAI TTS / Whisper + +### Project hygiene + +- [x] Architecture & dependency documentation +- [x] Contributing guide, docs index, PR template & changelog +- [ ] Register missing test targets (Ollama, Rime, TogetherAI folder) +- [ ] visionOS badge artwork under `Images/` +- [ ] Tagged semantic releases with automated changelog sections + +# Contributing + +Contributions are welcome. Please read **[CONTRIBUTING.md](CONTRIBUTING.md)** for: + +- Environment and build requirements +- PR expectations and testing notes +- Steps to add or extend a provider without breaking layering rules + +# Changelog + +See **[CHANGELOG.md](CHANGELOG.md)** for user-visible changes. The package is in **alpha**; expect API evolution between releases. # Acknowledgements @@ -567,4 +834,4 @@ return embeddings.data.first?.embedding.description # License -This package is licensed under the MIT License. +This package is licensed under the [MIT License](LICENSE). diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md new file mode 100644 index 00000000..913a99c8 --- /dev/null +++ b/docs/ARCHITECTURE.md @@ -0,0 +1,100 @@ +# Architecture + +This document summarizes the package architecture as defined in `Package.swift`. + +## Module Layers + +1. **Core layer** + - `CoreMI` +2. **LLM abstraction layer** + - `LargeLanguageModels` +3. **Provider layer** + - `Anthropic`, `Cohere`, `ElevenLabs`, `Groq`, `HuggingFace`, `HumeAI`, `Jina`, `Mistral`, `NeetsAI`, `Ollama`, `OpenAI`, `Perplexity`, `PlayHT`, `Rime`, `TogetherAI`, `VoyageAI`, `_Gemini` +4. **Umbrella layer** + - `AI` + +## Component Dependency Graph + +In this graph, `CorePersistence`, `Merge`, `NetworkKit`, `Swallow`, and `SwiftUIX` are external package dependencies (not targets in this repository). + +```mermaid +graph TD + CoreMI --> CorePersistence + CoreMI --> Merge + CoreMI --> Swallow + + LargeLanguageModels --> CoreMI + LargeLanguageModels --> CorePersistence + LargeLanguageModels --> Merge + LargeLanguageModels --> NetworkKit + LargeLanguageModels --> Swallow + LargeLanguageModels --> SwiftUIX + + Anthropic --> LargeLanguageModels + OpenAI --> LargeLanguageModels + HuggingFace --> CoreMI + HuggingFace --> Swallow + + Cohere --> CoreMI + Cohere --> LargeLanguageModels + ElevenLabs --> CoreMI + ElevenLabs --> LargeLanguageModels + Groq --> CoreMI + Groq --> LargeLanguageModels + HumeAI --> CoreMI + HumeAI --> LargeLanguageModels + Jina --> CoreMI + Jina --> LargeLanguageModels + Mistral --> CoreMI + Mistral --> LargeLanguageModels + NeetsAI --> CoreMI + NeetsAI --> LargeLanguageModels + Ollama --> CoreMI + Ollama --> LargeLanguageModels + PlayHT --> CoreMI + PlayHT --> LargeLanguageModels + Rime --> CoreMI + Rime --> LargeLanguageModels + TogetherAI --> CoreMI + TogetherAI --> LargeLanguageModels + VoyageAI --> CoreMI + VoyageAI --> LargeLanguageModels + _Gemini --> CoreMI + _Gemini --> LargeLanguageModels + + Perplexity --> OpenAI + Perplexity --> CoreMI + Perplexity --> LargeLanguageModels + + AI --> CoreMI + AI --> LargeLanguageModels + AI --> Anthropic + AI --> Cohere + AI --> ElevenLabs + AI --> Groq + AI --> HuggingFace + AI --> Jina + AI --> Mistral + AI --> Ollama + AI --> OpenAI + + AI -. standalone product .-> HumeAI + AI -. standalone product .-> NeetsAI + AI -. standalone product .-> Perplexity + AI -. standalone product .-> PlayHT + AI -. standalone product .-> Rime + AI -. standalone product .-> TogetherAI + AI -. standalone product .-> VoyageAI + AI -. standalone product .-> _Gemini +``` +> Note: The `AI` umbrella target currently depends on `CoreMI`, `LargeLanguageModels`, `Anthropic`, `Cohere`, `ElevenLabs`, `Groq`, `HuggingFace`, `Jina`, `Mistral`, `Ollama`, and `OpenAI`. Other provider modules in this repository are distributed as standalone products and are not re-exported by `AI` in `Package.swift`. + +> Note: `HuggingFace` intentionally differs from most provider modules: in `Package.swift` it depends on `CoreMI` and `Swallow`, and does not depend on `LargeLanguageModels`. + +## External Dependencies + +- `CorePersistence` +- `Merge` +- `NetworkKit` +- `Swallow` +- `SwiftUIX` diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000..5e24f4c9 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,31 @@ +# Documentation + +Guides for the **AI** Swift package ([PreternaturalAI/AI](https://github.com/PreternaturalAI/AI)). + +| Document | Audience | Description | +|----------|----------|-------------| +| [../README.md](../README.md) | Everyone | Install, usage examples, architecture summary, dependency graph, roadmap | +| [ARCHITECTURE.md](ARCHITECTURE.md) | Contributors & integrators | Layers, products vs targets, Mermaid graphs, protocol matrix, tests | +| [../CONTRIBUTING.md](../CONTRIBUTING.md) | Contributors | Setup, PR process, adding providers | +| [../CHANGELOG.md](../CHANGELOG.md) | Everyone | Notable changes | +| [../LICENSE](../LICENSE) | Everyone | MIT | + +## Quick orientation + +```text +Package.swift products, targets, external deps +Sources/CoreMI foundations (requests, model IDs, services) +Sources/LargeLanguageModels AbstractLLM, prompts, embeddings protocols +Sources/ vendor clients +Sources/AI umbrella module (selective @_exported imports) +Tests/ parallel test targets (see ARCHITECTURE.md for gaps) +docs/ long-form documentation (this folder) +``` + +## Keeping docs honest + +When you change `Package.swift` or add a provider: + +1. Update the dependency graph and tables in [ARCHITECTURE.md](ARCHITECTURE.md). +2. Mirror user-facing bits in [../README.md](../README.md) (products, roadmap, import notes). +3. Note the change under `[Unreleased]` in [../CHANGELOG.md](../CHANGELOG.md). From 42db03932d21c2db08b1ef5bd7245c26e52251f4 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Wed, 12 Aug 2026 15:38:23 -0700 Subject: [PATCH 092/271] Document package architecture, dependency graph, and contribution workflow (#50) (#53) --- .github/PULL_REQUEST_TEMPLATE.md | 31 ++++ README.md | 260 +++++++++++++++++++++++++++++-- docs/README.md | 31 ++++ 3 files changed, 310 insertions(+), 12 deletions(-) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 docs/README.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..7dfe0424 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,31 @@ +## Summary + + + +## Type of change + +- [ ] Bug fix +- [ ] New provider / API surface +- [ ] Refactor +- [ ] Documentation +- [ ] Tests / CI +- [ ] Other + +## Checklist + +- [ ] Builds with the package’s supported Xcode/Swift versions +- [ ] Tests added or updated when behavior changes +- [ ] No secrets or API keys committed +- [ ] Docs updated if products, targets, public API, or dependencies changed: + - [ ] `README.md` + - [ ] `docs/ARCHITECTURE.md` (graph / tables) + - [ ] `CHANGELOG.md` (`[Unreleased]`) +- [ ] Layering respected (providers β†’ `LargeLanguageModels` β†’ `CoreMI`; avoid new providerβ†’provider deps) + +## Test plan + + + +## Related issues + + diff --git a/README.md b/README.md index ea26cc1e..388e6c54 100644 --- a/README.md +++ b/README.md @@ -1,43 +1,44 @@ > [!IMPORTANT] > This package is presently in its alpha stage of development (2026-03-04). ---- +#### Supported Platforms - +SPM platforms from [`Package.swift`](Package.swift): **iOS 16+**, **macOS 13+**, **tvOS 16+**, **visionOS 1+**, **watchOS 9+**. -#### Supported Platforms

- macos + macOS   - macos + iOS   - macos + iPadOS   - macos + tvOS   - macos + watchOS

+Also targets **visionOS** (badge art not yet in `Images/`). + # AI The definitive, open-source Swift framework for interfacing with generative AI. @@ -105,6 +106,179 @@ External package dependencies declared in `Package.swift`: 4. Choose the version you'd like to install. 5. Click `Add Package`. +Or add the dependency in `Package.swift`: + +```swift +dependencies: [ + .package(url: "https://github.com/PreternaturalAI/AI.git", branch: "main") +] +``` + +Then link the `AI` product (umbrella) or a standalone product such as `OpenAI`, `Anthropic`, or `Perplexity` (see [Architecture](#architecture)). + +# Architecture + +The package is organized in layers. Provider SDKs implement shared protocols (`LLMRequestHandling`, embeddings, TTS, and so on) defined in the core modules. + +| Layer | Modules | Responsibility | +|-------|---------|----------------| +| Umbrella module | `AI` | `@_exported` re-exports **CoreMI**, **LargeLanguageModels**, **OpenAI** (and Swallow macros client). Other bundled modules still need their own `import`. | +| Umbrella product | `AI` library | SPM product that **links** core + Anthropic, Cohere, ElevenLabs, Groq, HuggingFace, Jina, Mistral, Ollama, OpenAI, and the `AI` module | +| Providers | `OpenAI`, `Anthropic`, `Mistral`, `Groq`, `Ollama`, `Perplexity`, `Cohere`, `Jina`, `VoyageAI`, `TogetherAI`, `ElevenLabs`, `PlayHT`, `Rime`, `HumeAI`, `NeetsAI`, `_Gemini`, `HuggingFace`, … | API clients and model types | +| LLM abstractions | `LargeLanguageModels` | `AbstractLLM`, `PromptLiteral`, chat/function-calling, embeddings protocols | +| Foundations | `CoreMI` | Request handling, model identifiers, service credentials, ASR/TTS bases | +| External | Swallow, Merge, NetworkKit, CorePersistence, SwiftUIX | Shared infrastructure (see [Dependencies](#dependencies)) | + +`import AI` is enough for OpenAI + shared LLM types. For other clients linked by the product, add e.g. `import Anthropic` or `import Groq`. Providers shipped only as standalone products (`Perplexity`, `_Gemini`, `VoyageAI`, …) require linking that product. + +### Component dependency graph + +Graph of **package targets** as declared in [`Package.swift`](Package.swift) (external packages shown once at the bottom). For products, tests, and design notes, see **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)**. + +```mermaid +flowchart TB + subgraph umbrella [Umbrella] + AI + end + + subgraph providers [Provider targets] + OpenAI + Anthropic + Mistral + Groq + Ollama + Perplexity + Cohere + Jina + VoyageAI + TogetherAI + ElevenLabs + PlayHT + Rime + HumeAI + NeetsAI + Gemini["_Gemini"] + HuggingFace + end + + subgraph core [Core targets] + LargeLanguageModels + CoreMI + end + + subgraph external [External packages] + Swallow + Merge + NetworkKit + CorePersistence + SwiftUIX + end + + AI --> CoreMI + AI --> LargeLanguageModels + AI --> OpenAI + AI --> Anthropic + AI --> Mistral + AI --> Groq + AI --> Ollama + AI --> Cohere + AI --> ElevenLabs + AI --> HuggingFace + AI --> Jina + + OpenAI --> LargeLanguageModels + Anthropic --> LargeLanguageModels + Mistral --> LargeLanguageModels + Groq --> LargeLanguageModels + Ollama --> LargeLanguageModels + Perplexity --> LargeLanguageModels + Perplexity --> OpenAI + Cohere --> LargeLanguageModels + Jina --> LargeLanguageModels + VoyageAI --> LargeLanguageModels + TogetherAI --> LargeLanguageModels + ElevenLabs --> LargeLanguageModels + PlayHT --> LargeLanguageModels + Rime --> LargeLanguageModels + HumeAI --> LargeLanguageModels + NeetsAI --> LargeLanguageModels + Gemini --> LargeLanguageModels + HuggingFace --> CoreMI + + LargeLanguageModels --> CoreMI + LargeLanguageModels --> CorePersistence + LargeLanguageModels --> Merge + LargeLanguageModels --> NetworkKit + LargeLanguageModels --> Swallow + LargeLanguageModels --> SwiftUIX + + CoreMI --> CorePersistence + CoreMI --> Merge + CoreMI --> Swallow +``` + +**Notes** + +- Most providers also depend on `CoreMI`, `CorePersistence`, `Merge`, `NetworkKit`, and `Swallow` directly (edges omitted above for readability where they already flow through `LargeLanguageModels`). +- **OpenAI** and **Anthropic** depend on `LargeLanguageModels` + networking stack, not on `CoreMI` directly in `Package.swift`. +- **Perplexity** is the only provider that depends on another provider target (`OpenAI`). +- **HuggingFace** depends on `CoreMI` + `Swallow` only (hub/tokenizer helpers, not the full LLM stack). +- The `AI` **product** does **not** link every target (for example `_Gemini`, `Perplexity`, `PlayHT`, `Rime`, `TogetherAI`, `VoyageAI`, `HumeAI`, `NeetsAI` are separate products). +- The `AI` **module** re-exports only CoreMI, LargeLanguageModels, and OpenAI among first-party modules (`Sources/AI/module.swift`). + +### Protocol capabilities (from source) + +Which shared protocols have an explicit client conformance today: + +| Target | `LLMRequestHandling` | `TextEmbeddingsRequestHandling` | Notes | +|--------|:--------------------:|:-------------------------------:|-------| +| OpenAI | yes | yes | Also images, Whisper, speech, assistants | +| Anthropic | yes | | | +| Mistral | yes | yes | | +| Groq | yes | | | +| Ollama | yes | | | +| Perplexity | yes | | Depends on OpenAI target | +| Cohere | | yes | | +| Jina | | yes | | +| VoyageAI | | yes | | +| TogetherAI, ElevenLabs, PlayHT, Rime, HumeAI, NeetsAI, _Gemini, HuggingFace | | | Provider-specific client APIs / hub helpers (see `Sources/`) | + +Full layering detail: **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)**. Docs index: **[docs/README.md](docs/README.md)**. + +# Dependencies + +### External Swift packages + +| Package | Repository | Role | +|---------|------------|------| +| Swallow | [vmanot/Swallow](https://github.com/vmanot/Swallow) | Extensions, macros client, diagnostics | +| Merge | [vmanot/Merge](https://github.com/vmanot/Merge) | Concurrency / async utilities | +| NetworkKit | [vmanot/NetworkKit](https://github.com/vmanot/NetworkKit) | HTTP client & API specifications | +| CorePersistence | [vmanot/CorePersistence](https://github.com/vmanot/CorePersistence) | Persistence & schema helpers (e.g. JSONSchema) | +| SwiftUIX | [SwiftUIX/SwiftUIX](https://github.com/SwiftUIX/SwiftUIX) | SwiftUI extensions | + +Transitive pins (see [`Package.resolved`](Package.resolved)) include **SwiftAPI**, **swift-collections**, and **swift-syntax**. + +### SPM products you can link + +Exact product names from `Package.swift`: + +| Product | Targets exposed | Use when | +|---------|-----------------|----------| +| `AI` | CoreMI, LargeLanguageModels, Anthropic, Cohere, ElevenLabs, Groq, HuggingFace, Jina, Mistral, Ollama, OpenAI, AI | Default multi-provider app dependency | +| `OpenAI` | OpenAI | OpenAI-only | +| `Anthropic` | Anthropic | Anthropic-only | +| `Perplexity` | Perplexity | Perplexity (pulls OpenAI transitively) | +| `TogetherAI` | TogetherAI | Together AI | +| `VoyageAI` | VoyageAI | Voyage embeddings | +| `PlayHT` | PlayHT | PlayHT voice | +| `Rime` | Rime | Rime voice | +| `HumeAI` | HumeAI | Hume | +| `NeetsAI` | NeetsAI | Neets | +| `_Gemini` | _Gemini | Google Gemini client | + +There is **no** standalone SPM product today for `CoreMI`, `LargeLanguageModels`, `Cohere`, `Groq`, `HuggingFace`, `Jina`, `Mistral`, `Ollama`, or `ElevenLabs` β€” consume them via the `AI` product (or add a product in `Package.swift` if you need a leaner slice). + # Usage ## Import the framework @@ -582,14 +756,76 @@ let embeddings = try await LLMManager.client.textEmbeddings( return embeddings.data.first?.embedding.description ``` +# Documentation + +| Document | Contents | +|----------|----------| +| **[docs/README.md](docs/README.md)** | Documentation index | +| **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)** | Full architecture, products vs targets, Mermaid graph, protocol matrix, tests | +| **[CONTRIBUTING.md](CONTRIBUTING.md)** | Dev setup, coding guidelines, how to add a provider | +| **[CHANGELOG.md](CHANGELOG.md)** | Release notes and unreleased changes | +| **[LICENSE](LICENSE)** | MIT License text | + +API behavior is illustrated in the [Usage](#usage) sections above; protocol details live in `Sources/LargeLanguageModels` and `Sources/CoreMI`. + # Roadmap -- [x] OpenAI +Status reflects modules present in this repository (`Sources/` + `Package.swift`). Checked items ship as package targets; depth of feature coverage varies by provider. + +### Core + +- [x] `CoreMI` β€” request handling, model identifiers, services, ASR/TTS foundations +- [x] `LargeLanguageModels` β€” `AbstractLLM`, prompts, function calling, embeddings protocols +- [x] `AI` umbrella product + +### LLM & multimodal providers + +- [x] OpenAI (chat, vision, tools, images, Whisper, speech) - [x] Anthropic - [x] Mistral +- [x] Groq - [x] Ollama -- [ ] Perplexity -- [ ] Groq +- [x] Perplexity +- [x] TogetherAI +- [x] `_Gemini` (Google Gemini client; standalone product) +- [ ] Broader parity matrix (streaming, tools, vision) across every LLM provider + +### Embeddings & hub + +- [x] OpenAI embeddings +- [x] Cohere +- [x] Jina +- [x] VoyageAI +- [x] Hugging Face hub helpers / tokenizer resources + +### Voice & speech + +- [x] ElevenLabs +- [x] PlayHT +- [x] Rime +- [x] HumeAI +- [x] NeetsAI +- [x] OpenAI TTS / Whisper + +### Project hygiene + +- [x] Architecture & dependency documentation +- [x] Contributing guide, docs index, PR template & changelog +- [ ] Register missing test targets (Ollama, Rime, TogetherAI folder) +- [ ] visionOS badge artwork under `Images/` +- [ ] Tagged semantic releases with automated changelog sections + +# Contributing + +Contributions are welcome. Please read **[CONTRIBUTING.md](CONTRIBUTING.md)** for: + +- Environment and build requirements +- PR expectations and testing notes +- Steps to add or extend a provider without breaking layering rules + +# Changelog + +See **[CHANGELOG.md](CHANGELOG.md)** for user-visible changes. The package is in **alpha**; expect API evolution between releases. # Acknowledgements @@ -598,4 +834,4 @@ return embeddings.data.first?.embedding.description # License -This package is licensed under the MIT License. +This package is licensed under the [MIT License](LICENSE). diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000..5e24f4c9 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,31 @@ +# Documentation + +Guides for the **AI** Swift package ([PreternaturalAI/AI](https://github.com/PreternaturalAI/AI)). + +| Document | Audience | Description | +|----------|----------|-------------| +| [../README.md](../README.md) | Everyone | Install, usage examples, architecture summary, dependency graph, roadmap | +| [ARCHITECTURE.md](ARCHITECTURE.md) | Contributors & integrators | Layers, products vs targets, Mermaid graphs, protocol matrix, tests | +| [../CONTRIBUTING.md](../CONTRIBUTING.md) | Contributors | Setup, PR process, adding providers | +| [../CHANGELOG.md](../CHANGELOG.md) | Everyone | Notable changes | +| [../LICENSE](../LICENSE) | Everyone | MIT | + +## Quick orientation + +```text +Package.swift products, targets, external deps +Sources/CoreMI foundations (requests, model IDs, services) +Sources/LargeLanguageModels AbstractLLM, prompts, embeddings protocols +Sources/ vendor clients +Sources/AI umbrella module (selective @_exported imports) +Tests/ parallel test targets (see ARCHITECTURE.md for gaps) +docs/ long-form documentation (this folder) +``` + +## Keeping docs honest + +When you change `Package.swift` or add a provider: + +1. Update the dependency graph and tables in [ARCHITECTURE.md](ARCHITECTURE.md). +2. Mirror user-facing bits in [../README.md](../README.md) (products, roadmap, import notes). +3. Note the change under `[Unreleased]` in [../CHANGELOG.md](../CHANGELOG.md). From 0a2235b44227c17d474260c982a2fe94acae70ec Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Wed, 12 Aug 2026 15:38:54 -0700 Subject: [PATCH 093/271] Document package architecture, dependency graph, and contribution workflow (#50) (#54) --- .github/PULL_REQUEST_TEMPLATE.md | 31 ++++ README.md | 260 +++++++++++++++++++++++++++++-- docs/README.md | 31 ++++ 3 files changed, 310 insertions(+), 12 deletions(-) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 docs/README.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..7dfe0424 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,31 @@ +## Summary + + + +## Type of change + +- [ ] Bug fix +- [ ] New provider / API surface +- [ ] Refactor +- [ ] Documentation +- [ ] Tests / CI +- [ ] Other + +## Checklist + +- [ ] Builds with the package’s supported Xcode/Swift versions +- [ ] Tests added or updated when behavior changes +- [ ] No secrets or API keys committed +- [ ] Docs updated if products, targets, public API, or dependencies changed: + - [ ] `README.md` + - [ ] `docs/ARCHITECTURE.md` (graph / tables) + - [ ] `CHANGELOG.md` (`[Unreleased]`) +- [ ] Layering respected (providers β†’ `LargeLanguageModels` β†’ `CoreMI`; avoid new providerβ†’provider deps) + +## Test plan + + + +## Related issues + + diff --git a/README.md b/README.md index ea26cc1e..388e6c54 100644 --- a/README.md +++ b/README.md @@ -1,43 +1,44 @@ > [!IMPORTANT] > This package is presently in its alpha stage of development (2026-03-04). ---- +#### Supported Platforms - +SPM platforms from [`Package.swift`](Package.swift): **iOS 16+**, **macOS 13+**, **tvOS 16+**, **visionOS 1+**, **watchOS 9+**. -#### Supported Platforms

- macos + macOS   - macos + iOS   - macos + iPadOS   - macos + tvOS   - macos + watchOS

+Also targets **visionOS** (badge art not yet in `Images/`). + # AI The definitive, open-source Swift framework for interfacing with generative AI. @@ -105,6 +106,179 @@ External package dependencies declared in `Package.swift`: 4. Choose the version you'd like to install. 5. Click `Add Package`. +Or add the dependency in `Package.swift`: + +```swift +dependencies: [ + .package(url: "https://github.com/PreternaturalAI/AI.git", branch: "main") +] +``` + +Then link the `AI` product (umbrella) or a standalone product such as `OpenAI`, `Anthropic`, or `Perplexity` (see [Architecture](#architecture)). + +# Architecture + +The package is organized in layers. Provider SDKs implement shared protocols (`LLMRequestHandling`, embeddings, TTS, and so on) defined in the core modules. + +| Layer | Modules | Responsibility | +|-------|---------|----------------| +| Umbrella module | `AI` | `@_exported` re-exports **CoreMI**, **LargeLanguageModels**, **OpenAI** (and Swallow macros client). Other bundled modules still need their own `import`. | +| Umbrella product | `AI` library | SPM product that **links** core + Anthropic, Cohere, ElevenLabs, Groq, HuggingFace, Jina, Mistral, Ollama, OpenAI, and the `AI` module | +| Providers | `OpenAI`, `Anthropic`, `Mistral`, `Groq`, `Ollama`, `Perplexity`, `Cohere`, `Jina`, `VoyageAI`, `TogetherAI`, `ElevenLabs`, `PlayHT`, `Rime`, `HumeAI`, `NeetsAI`, `_Gemini`, `HuggingFace`, … | API clients and model types | +| LLM abstractions | `LargeLanguageModels` | `AbstractLLM`, `PromptLiteral`, chat/function-calling, embeddings protocols | +| Foundations | `CoreMI` | Request handling, model identifiers, service credentials, ASR/TTS bases | +| External | Swallow, Merge, NetworkKit, CorePersistence, SwiftUIX | Shared infrastructure (see [Dependencies](#dependencies)) | + +`import AI` is enough for OpenAI + shared LLM types. For other clients linked by the product, add e.g. `import Anthropic` or `import Groq`. Providers shipped only as standalone products (`Perplexity`, `_Gemini`, `VoyageAI`, …) require linking that product. + +### Component dependency graph + +Graph of **package targets** as declared in [`Package.swift`](Package.swift) (external packages shown once at the bottom). For products, tests, and design notes, see **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)**. + +```mermaid +flowchart TB + subgraph umbrella [Umbrella] + AI + end + + subgraph providers [Provider targets] + OpenAI + Anthropic + Mistral + Groq + Ollama + Perplexity + Cohere + Jina + VoyageAI + TogetherAI + ElevenLabs + PlayHT + Rime + HumeAI + NeetsAI + Gemini["_Gemini"] + HuggingFace + end + + subgraph core [Core targets] + LargeLanguageModels + CoreMI + end + + subgraph external [External packages] + Swallow + Merge + NetworkKit + CorePersistence + SwiftUIX + end + + AI --> CoreMI + AI --> LargeLanguageModels + AI --> OpenAI + AI --> Anthropic + AI --> Mistral + AI --> Groq + AI --> Ollama + AI --> Cohere + AI --> ElevenLabs + AI --> HuggingFace + AI --> Jina + + OpenAI --> LargeLanguageModels + Anthropic --> LargeLanguageModels + Mistral --> LargeLanguageModels + Groq --> LargeLanguageModels + Ollama --> LargeLanguageModels + Perplexity --> LargeLanguageModels + Perplexity --> OpenAI + Cohere --> LargeLanguageModels + Jina --> LargeLanguageModels + VoyageAI --> LargeLanguageModels + TogetherAI --> LargeLanguageModels + ElevenLabs --> LargeLanguageModels + PlayHT --> LargeLanguageModels + Rime --> LargeLanguageModels + HumeAI --> LargeLanguageModels + NeetsAI --> LargeLanguageModels + Gemini --> LargeLanguageModels + HuggingFace --> CoreMI + + LargeLanguageModels --> CoreMI + LargeLanguageModels --> CorePersistence + LargeLanguageModels --> Merge + LargeLanguageModels --> NetworkKit + LargeLanguageModels --> Swallow + LargeLanguageModels --> SwiftUIX + + CoreMI --> CorePersistence + CoreMI --> Merge + CoreMI --> Swallow +``` + +**Notes** + +- Most providers also depend on `CoreMI`, `CorePersistence`, `Merge`, `NetworkKit`, and `Swallow` directly (edges omitted above for readability where they already flow through `LargeLanguageModels`). +- **OpenAI** and **Anthropic** depend on `LargeLanguageModels` + networking stack, not on `CoreMI` directly in `Package.swift`. +- **Perplexity** is the only provider that depends on another provider target (`OpenAI`). +- **HuggingFace** depends on `CoreMI` + `Swallow` only (hub/tokenizer helpers, not the full LLM stack). +- The `AI` **product** does **not** link every target (for example `_Gemini`, `Perplexity`, `PlayHT`, `Rime`, `TogetherAI`, `VoyageAI`, `HumeAI`, `NeetsAI` are separate products). +- The `AI` **module** re-exports only CoreMI, LargeLanguageModels, and OpenAI among first-party modules (`Sources/AI/module.swift`). + +### Protocol capabilities (from source) + +Which shared protocols have an explicit client conformance today: + +| Target | `LLMRequestHandling` | `TextEmbeddingsRequestHandling` | Notes | +|--------|:--------------------:|:-------------------------------:|-------| +| OpenAI | yes | yes | Also images, Whisper, speech, assistants | +| Anthropic | yes | | | +| Mistral | yes | yes | | +| Groq | yes | | | +| Ollama | yes | | | +| Perplexity | yes | | Depends on OpenAI target | +| Cohere | | yes | | +| Jina | | yes | | +| VoyageAI | | yes | | +| TogetherAI, ElevenLabs, PlayHT, Rime, HumeAI, NeetsAI, _Gemini, HuggingFace | | | Provider-specific client APIs / hub helpers (see `Sources/`) | + +Full layering detail: **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)**. Docs index: **[docs/README.md](docs/README.md)**. + +# Dependencies + +### External Swift packages + +| Package | Repository | Role | +|---------|------------|------| +| Swallow | [vmanot/Swallow](https://github.com/vmanot/Swallow) | Extensions, macros client, diagnostics | +| Merge | [vmanot/Merge](https://github.com/vmanot/Merge) | Concurrency / async utilities | +| NetworkKit | [vmanot/NetworkKit](https://github.com/vmanot/NetworkKit) | HTTP client & API specifications | +| CorePersistence | [vmanot/CorePersistence](https://github.com/vmanot/CorePersistence) | Persistence & schema helpers (e.g. JSONSchema) | +| SwiftUIX | [SwiftUIX/SwiftUIX](https://github.com/SwiftUIX/SwiftUIX) | SwiftUI extensions | + +Transitive pins (see [`Package.resolved`](Package.resolved)) include **SwiftAPI**, **swift-collections**, and **swift-syntax**. + +### SPM products you can link + +Exact product names from `Package.swift`: + +| Product | Targets exposed | Use when | +|---------|-----------------|----------| +| `AI` | CoreMI, LargeLanguageModels, Anthropic, Cohere, ElevenLabs, Groq, HuggingFace, Jina, Mistral, Ollama, OpenAI, AI | Default multi-provider app dependency | +| `OpenAI` | OpenAI | OpenAI-only | +| `Anthropic` | Anthropic | Anthropic-only | +| `Perplexity` | Perplexity | Perplexity (pulls OpenAI transitively) | +| `TogetherAI` | TogetherAI | Together AI | +| `VoyageAI` | VoyageAI | Voyage embeddings | +| `PlayHT` | PlayHT | PlayHT voice | +| `Rime` | Rime | Rime voice | +| `HumeAI` | HumeAI | Hume | +| `NeetsAI` | NeetsAI | Neets | +| `_Gemini` | _Gemini | Google Gemini client | + +There is **no** standalone SPM product today for `CoreMI`, `LargeLanguageModels`, `Cohere`, `Groq`, `HuggingFace`, `Jina`, `Mistral`, `Ollama`, or `ElevenLabs` β€” consume them via the `AI` product (or add a product in `Package.swift` if you need a leaner slice). + # Usage ## Import the framework @@ -582,14 +756,76 @@ let embeddings = try await LLMManager.client.textEmbeddings( return embeddings.data.first?.embedding.description ``` +# Documentation + +| Document | Contents | +|----------|----------| +| **[docs/README.md](docs/README.md)** | Documentation index | +| **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)** | Full architecture, products vs targets, Mermaid graph, protocol matrix, tests | +| **[CONTRIBUTING.md](CONTRIBUTING.md)** | Dev setup, coding guidelines, how to add a provider | +| **[CHANGELOG.md](CHANGELOG.md)** | Release notes and unreleased changes | +| **[LICENSE](LICENSE)** | MIT License text | + +API behavior is illustrated in the [Usage](#usage) sections above; protocol details live in `Sources/LargeLanguageModels` and `Sources/CoreMI`. + # Roadmap -- [x] OpenAI +Status reflects modules present in this repository (`Sources/` + `Package.swift`). Checked items ship as package targets; depth of feature coverage varies by provider. + +### Core + +- [x] `CoreMI` β€” request handling, model identifiers, services, ASR/TTS foundations +- [x] `LargeLanguageModels` β€” `AbstractLLM`, prompts, function calling, embeddings protocols +- [x] `AI` umbrella product + +### LLM & multimodal providers + +- [x] OpenAI (chat, vision, tools, images, Whisper, speech) - [x] Anthropic - [x] Mistral +- [x] Groq - [x] Ollama -- [ ] Perplexity -- [ ] Groq +- [x] Perplexity +- [x] TogetherAI +- [x] `_Gemini` (Google Gemini client; standalone product) +- [ ] Broader parity matrix (streaming, tools, vision) across every LLM provider + +### Embeddings & hub + +- [x] OpenAI embeddings +- [x] Cohere +- [x] Jina +- [x] VoyageAI +- [x] Hugging Face hub helpers / tokenizer resources + +### Voice & speech + +- [x] ElevenLabs +- [x] PlayHT +- [x] Rime +- [x] HumeAI +- [x] NeetsAI +- [x] OpenAI TTS / Whisper + +### Project hygiene + +- [x] Architecture & dependency documentation +- [x] Contributing guide, docs index, PR template & changelog +- [ ] Register missing test targets (Ollama, Rime, TogetherAI folder) +- [ ] visionOS badge artwork under `Images/` +- [ ] Tagged semantic releases with automated changelog sections + +# Contributing + +Contributions are welcome. Please read **[CONTRIBUTING.md](CONTRIBUTING.md)** for: + +- Environment and build requirements +- PR expectations and testing notes +- Steps to add or extend a provider without breaking layering rules + +# Changelog + +See **[CHANGELOG.md](CHANGELOG.md)** for user-visible changes. The package is in **alpha**; expect API evolution between releases. # Acknowledgements @@ -598,4 +834,4 @@ return embeddings.data.first?.embedding.description # License -This package is licensed under the MIT License. +This package is licensed under the [MIT License](LICENSE). diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000..5e24f4c9 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,31 @@ +# Documentation + +Guides for the **AI** Swift package ([PreternaturalAI/AI](https://github.com/PreternaturalAI/AI)). + +| Document | Audience | Description | +|----------|----------|-------------| +| [../README.md](../README.md) | Everyone | Install, usage examples, architecture summary, dependency graph, roadmap | +| [ARCHITECTURE.md](ARCHITECTURE.md) | Contributors & integrators | Layers, products vs targets, Mermaid graphs, protocol matrix, tests | +| [../CONTRIBUTING.md](../CONTRIBUTING.md) | Contributors | Setup, PR process, adding providers | +| [../CHANGELOG.md](../CHANGELOG.md) | Everyone | Notable changes | +| [../LICENSE](../LICENSE) | Everyone | MIT | + +## Quick orientation + +```text +Package.swift products, targets, external deps +Sources/CoreMI foundations (requests, model IDs, services) +Sources/LargeLanguageModels AbstractLLM, prompts, embeddings protocols +Sources/ vendor clients +Sources/AI umbrella module (selective @_exported imports) +Tests/ parallel test targets (see ARCHITECTURE.md for gaps) +docs/ long-form documentation (this folder) +``` + +## Keeping docs honest + +When you change `Package.swift` or add a provider: + +1. Update the dependency graph and tables in [ARCHITECTURE.md](ARCHITECTURE.md). +2. Mirror user-facing bits in [../README.md](../README.md) (products, roadmap, import notes). +3. Note the change under `[Unreleased]` in [../CHANGELOG.md](../CHANGELOG.md). From 177bfbce4ab6ca75d75b69e9c0e6fbae6e3096a8 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Wed, 12 Aug 2026 15:39:22 -0700 Subject: [PATCH 094/271] Document package architecture, dependency graph, and contribution workflow (#50) (#55) --- .github/PULL_REQUEST_TEMPLATE.md | 31 +++ CHANGELOG.md | 11 + CONTRIBUTING.md | 37 ++++ README.md | 333 ++++++++++++++++++++++++++++--- docs/ARCHITECTURE.md | 100 ++++++++++ docs/README.md | 31 +++ 6 files changed, 510 insertions(+), 33 deletions(-) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 CHANGELOG.md create mode 100644 CONTRIBUTING.md create mode 100644 docs/ARCHITECTURE.md create mode 100644 docs/README.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..7dfe0424 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,31 @@ +## Summary + + + +## Type of change + +- [ ] Bug fix +- [ ] New provider / API surface +- [ ] Refactor +- [ ] Documentation +- [ ] Tests / CI +- [ ] Other + +## Checklist + +- [ ] Builds with the package’s supported Xcode/Swift versions +- [ ] Tests added or updated when behavior changes +- [ ] No secrets or API keys committed +- [ ] Docs updated if products, targets, public API, or dependencies changed: + - [ ] `README.md` + - [ ] `docs/ARCHITECTURE.md` (graph / tables) + - [ ] `CHANGELOG.md` (`[Unreleased]`) +- [ ] Layering respected (providers β†’ `LargeLanguageModels` β†’ `CoreMI`; avoid new providerβ†’provider deps) + +## Test plan + + + +## Related issues + + diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..cfb3a06d --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,11 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +## [Unreleased] + +### Added + +- Added architecture documentation in `docs/ARCHITECTURE.md`. +- Added contribution guidelines in `CONTRIBUTING.md`. +- Improved `README.md` with architecture, dependency graph, and documentation links. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..1f9c2b44 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,37 @@ +# Contributing + +Thanks for contributing to AI. + +## Prerequisites + +- Xcode 15.4+ (Swift 5.10 toolchain) +- Apple platform SDKs supported by this package + +## Getting Started + +1. Fork the repository and create a feature branch. +2. Make focused changes with clear commit messages. +3. Run tests locally: + +```bash +swift test +``` + +4. Update documentation when behavior, APIs, or architecture changes. +5. Open a pull request with a clear summary and test notes. + +## Pull Request Checklist + +- [ ] Changes are scoped to one topic +- [ ] Public API changes are documented +- [ ] Tests pass locally (`swift test`) +- [ ] README/docs/changelog updated when needed + +## Reporting Issues + +When filing a bug, include: + +- Steps to reproduce +- Expected vs actual behavior +- Platform and Xcode/Swift versions +- Relevant logs or sample payloads diff --git a/README.md b/README.md index cf435eff..388e6c54 100644 --- a/README.md +++ b/README.md @@ -1,68 +1,100 @@ > [!IMPORTANT] > This package is presently in its alpha stage of development (2026-03-04). ---- +#### Supported Platforms - +SPM platforms from [`Package.swift`](Package.swift): **iOS 16+**, **macOS 13+**, **tvOS 16+**, **visionOS 1+**, **watchOS 9+**. -#### Supported Platforms

- macos + macOS   - macos + iOS   - macos + iPadOS   - macos + tvOS   - macos + watchOS

+Also targets **visionOS** (badge art not yet in `Images/`). + # AI The definitive, open-source Swift framework for interfacing with generative AI. -[Installation](#installation)\ -[Usage](#usage) - -* [Import the framework](#import-the-framework) -* [Initialize an AI Client](#initialize-an-ai-client) -* [LLM Clients Abstraction](#llm-clients-abstraction) -* [Supported Models](#supported-models) -* [Completions](#completions) - * [Basic Completions](#basic-completions) - * [Vision: Image-to-Text](#vision-image-to-text) - * [Function Calling](#function-calling) -* [DALLE-3 Image Generation](#dalle-3-image-generation) -* [Audio](#audio) - * [Audio Transcription: Whisper](#audio-transcription-whisper) - * [Audio Generation: OpenAI](#audio-generation-openai) - * [Audio Generation: ElevenLabs](#audio-generation-elevenlabs) -* [Text Embeddings](#text-embeddings) - -[Roadmap](#roadmap) \ -[Acknowledgements](#acknowledgements) \ -[License](#license) +## Documentation + +- [Architecture](docs/ARCHITECTURE.md) +- [Contributing](CONTRIBUTING.md) +- [Changelog](CHANGELOG.md) + +## Table of Contents + +- [Architecture Overview](#architecture-overview) +- [Dependencies](#dependencies) +- [Installation](#installation) +- [Usage](#usage) + - [Import the framework](#import-the-framework) + - [Initialize an AI Client](#initialize-an-ai-client) + - [LLM Clients Abstraction](#llm-clients-abstraction) + - [Supported Models](#supported-models) + - [Completions](#completions) + - [Basic Completions](#basic-completions) + - [Vision: Image-to-Text](#vision-image-to-text) + - [Function Calling](#function-calling) + - [DALLE-3 Image Generation](#dalle-3-image-generation) + - [Audio](#audio) + - [Audio Transcription: Whisper](#audio-transcription-whisper) + - [Audio Generation: OpenAI](#audio-generation-openai) + - [Audio Generation: ElevenLabs](#audio-generation-elevenlabs) + - [Text Embeddings](#text-embeddings) +- [Roadmap](#roadmap) +- [Acknowledgements](#acknowledgements) +- [License](#license) + +## Architecture Overview + +This package is organized as a Swift Package Manager workspace with layered modules: + +- `CoreMI` provides shared core abstractions used across providers. +- `LargeLanguageModels` builds common LLM request/response functionality on top of `CoreMI`. +- Provider modules (`OpenAI`, `Anthropic`, `Mistral`, `Groq`, `ElevenLabs`, etc.) implement vendor-specific APIs. +- `AI` is the umbrella product that re-exports the main modules for one-stop integration. + +### Component Dependency Graph + +A full dependency graph generated from `Package.swift` target dependencies is available in [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md#component-dependency-graph). + +## Dependencies + +External package dependencies declared in `Package.swift`: + +- [`CorePersistence`](https://github.com/vmanot/CorePersistence) +- [`Merge`](https://github.com/vmanot/Merge) +- [`NetworkKit`](https://github.com/vmanot/NetworkKit) +- [`Swallow`](https://github.com/vmanot/Swallow) +- [`SwiftUIX`](https://github.com/SwiftUIX/SwiftUIX) # Installation @@ -74,6 +106,179 @@ The definitive, open-source Swift framework for interfacing with generative AI. 4. Choose the version you'd like to install. 5. Click `Add Package`. +Or add the dependency in `Package.swift`: + +```swift +dependencies: [ + .package(url: "https://github.com/PreternaturalAI/AI.git", branch: "main") +] +``` + +Then link the `AI` product (umbrella) or a standalone product such as `OpenAI`, `Anthropic`, or `Perplexity` (see [Architecture](#architecture)). + +# Architecture + +The package is organized in layers. Provider SDKs implement shared protocols (`LLMRequestHandling`, embeddings, TTS, and so on) defined in the core modules. + +| Layer | Modules | Responsibility | +|-------|---------|----------------| +| Umbrella module | `AI` | `@_exported` re-exports **CoreMI**, **LargeLanguageModels**, **OpenAI** (and Swallow macros client). Other bundled modules still need their own `import`. | +| Umbrella product | `AI` library | SPM product that **links** core + Anthropic, Cohere, ElevenLabs, Groq, HuggingFace, Jina, Mistral, Ollama, OpenAI, and the `AI` module | +| Providers | `OpenAI`, `Anthropic`, `Mistral`, `Groq`, `Ollama`, `Perplexity`, `Cohere`, `Jina`, `VoyageAI`, `TogetherAI`, `ElevenLabs`, `PlayHT`, `Rime`, `HumeAI`, `NeetsAI`, `_Gemini`, `HuggingFace`, … | API clients and model types | +| LLM abstractions | `LargeLanguageModels` | `AbstractLLM`, `PromptLiteral`, chat/function-calling, embeddings protocols | +| Foundations | `CoreMI` | Request handling, model identifiers, service credentials, ASR/TTS bases | +| External | Swallow, Merge, NetworkKit, CorePersistence, SwiftUIX | Shared infrastructure (see [Dependencies](#dependencies)) | + +`import AI` is enough for OpenAI + shared LLM types. For other clients linked by the product, add e.g. `import Anthropic` or `import Groq`. Providers shipped only as standalone products (`Perplexity`, `_Gemini`, `VoyageAI`, …) require linking that product. + +### Component dependency graph + +Graph of **package targets** as declared in [`Package.swift`](Package.swift) (external packages shown once at the bottom). For products, tests, and design notes, see **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)**. + +```mermaid +flowchart TB + subgraph umbrella [Umbrella] + AI + end + + subgraph providers [Provider targets] + OpenAI + Anthropic + Mistral + Groq + Ollama + Perplexity + Cohere + Jina + VoyageAI + TogetherAI + ElevenLabs + PlayHT + Rime + HumeAI + NeetsAI + Gemini["_Gemini"] + HuggingFace + end + + subgraph core [Core targets] + LargeLanguageModels + CoreMI + end + + subgraph external [External packages] + Swallow + Merge + NetworkKit + CorePersistence + SwiftUIX + end + + AI --> CoreMI + AI --> LargeLanguageModels + AI --> OpenAI + AI --> Anthropic + AI --> Mistral + AI --> Groq + AI --> Ollama + AI --> Cohere + AI --> ElevenLabs + AI --> HuggingFace + AI --> Jina + + OpenAI --> LargeLanguageModels + Anthropic --> LargeLanguageModels + Mistral --> LargeLanguageModels + Groq --> LargeLanguageModels + Ollama --> LargeLanguageModels + Perplexity --> LargeLanguageModels + Perplexity --> OpenAI + Cohere --> LargeLanguageModels + Jina --> LargeLanguageModels + VoyageAI --> LargeLanguageModels + TogetherAI --> LargeLanguageModels + ElevenLabs --> LargeLanguageModels + PlayHT --> LargeLanguageModels + Rime --> LargeLanguageModels + HumeAI --> LargeLanguageModels + NeetsAI --> LargeLanguageModels + Gemini --> LargeLanguageModels + HuggingFace --> CoreMI + + LargeLanguageModels --> CoreMI + LargeLanguageModels --> CorePersistence + LargeLanguageModels --> Merge + LargeLanguageModels --> NetworkKit + LargeLanguageModels --> Swallow + LargeLanguageModels --> SwiftUIX + + CoreMI --> CorePersistence + CoreMI --> Merge + CoreMI --> Swallow +``` + +**Notes** + +- Most providers also depend on `CoreMI`, `CorePersistence`, `Merge`, `NetworkKit`, and `Swallow` directly (edges omitted above for readability where they already flow through `LargeLanguageModels`). +- **OpenAI** and **Anthropic** depend on `LargeLanguageModels` + networking stack, not on `CoreMI` directly in `Package.swift`. +- **Perplexity** is the only provider that depends on another provider target (`OpenAI`). +- **HuggingFace** depends on `CoreMI` + `Swallow` only (hub/tokenizer helpers, not the full LLM stack). +- The `AI` **product** does **not** link every target (for example `_Gemini`, `Perplexity`, `PlayHT`, `Rime`, `TogetherAI`, `VoyageAI`, `HumeAI`, `NeetsAI` are separate products). +- The `AI` **module** re-exports only CoreMI, LargeLanguageModels, and OpenAI among first-party modules (`Sources/AI/module.swift`). + +### Protocol capabilities (from source) + +Which shared protocols have an explicit client conformance today: + +| Target | `LLMRequestHandling` | `TextEmbeddingsRequestHandling` | Notes | +|--------|:--------------------:|:-------------------------------:|-------| +| OpenAI | yes | yes | Also images, Whisper, speech, assistants | +| Anthropic | yes | | | +| Mistral | yes | yes | | +| Groq | yes | | | +| Ollama | yes | | | +| Perplexity | yes | | Depends on OpenAI target | +| Cohere | | yes | | +| Jina | | yes | | +| VoyageAI | | yes | | +| TogetherAI, ElevenLabs, PlayHT, Rime, HumeAI, NeetsAI, _Gemini, HuggingFace | | | Provider-specific client APIs / hub helpers (see `Sources/`) | + +Full layering detail: **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)**. Docs index: **[docs/README.md](docs/README.md)**. + +# Dependencies + +### External Swift packages + +| Package | Repository | Role | +|---------|------------|------| +| Swallow | [vmanot/Swallow](https://github.com/vmanot/Swallow) | Extensions, macros client, diagnostics | +| Merge | [vmanot/Merge](https://github.com/vmanot/Merge) | Concurrency / async utilities | +| NetworkKit | [vmanot/NetworkKit](https://github.com/vmanot/NetworkKit) | HTTP client & API specifications | +| CorePersistence | [vmanot/CorePersistence](https://github.com/vmanot/CorePersistence) | Persistence & schema helpers (e.g. JSONSchema) | +| SwiftUIX | [SwiftUIX/SwiftUIX](https://github.com/SwiftUIX/SwiftUIX) | SwiftUI extensions | + +Transitive pins (see [`Package.resolved`](Package.resolved)) include **SwiftAPI**, **swift-collections**, and **swift-syntax**. + +### SPM products you can link + +Exact product names from `Package.swift`: + +| Product | Targets exposed | Use when | +|---------|-----------------|----------| +| `AI` | CoreMI, LargeLanguageModels, Anthropic, Cohere, ElevenLabs, Groq, HuggingFace, Jina, Mistral, Ollama, OpenAI, AI | Default multi-provider app dependency | +| `OpenAI` | OpenAI | OpenAI-only | +| `Anthropic` | Anthropic | Anthropic-only | +| `Perplexity` | Perplexity | Perplexity (pulls OpenAI transitively) | +| `TogetherAI` | TogetherAI | Together AI | +| `VoyageAI` | VoyageAI | Voyage embeddings | +| `PlayHT` | PlayHT | PlayHT voice | +| `Rime` | Rime | Rime voice | +| `HumeAI` | HumeAI | Hume | +| `NeetsAI` | NeetsAI | Neets | +| `_Gemini` | _Gemini | Google Gemini client | + +There is **no** standalone SPM product today for `CoreMI`, `LargeLanguageModels`, `Cohere`, `Groq`, `HuggingFace`, `Jina`, `Mistral`, `Ollama`, or `ElevenLabs` β€” consume them via the `AI` product (or add a product in `Package.swift` if you need a leaner slice). + # Usage ## Import the framework @@ -551,14 +756,76 @@ let embeddings = try await LLMManager.client.textEmbeddings( return embeddings.data.first?.embedding.description ``` +# Documentation + +| Document | Contents | +|----------|----------| +| **[docs/README.md](docs/README.md)** | Documentation index | +| **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)** | Full architecture, products vs targets, Mermaid graph, protocol matrix, tests | +| **[CONTRIBUTING.md](CONTRIBUTING.md)** | Dev setup, coding guidelines, how to add a provider | +| **[CHANGELOG.md](CHANGELOG.md)** | Release notes and unreleased changes | +| **[LICENSE](LICENSE)** | MIT License text | + +API behavior is illustrated in the [Usage](#usage) sections above; protocol details live in `Sources/LargeLanguageModels` and `Sources/CoreMI`. + # Roadmap -- [x] OpenAI +Status reflects modules present in this repository (`Sources/` + `Package.swift`). Checked items ship as package targets; depth of feature coverage varies by provider. + +### Core + +- [x] `CoreMI` β€” request handling, model identifiers, services, ASR/TTS foundations +- [x] `LargeLanguageModels` β€” `AbstractLLM`, prompts, function calling, embeddings protocols +- [x] `AI` umbrella product + +### LLM & multimodal providers + +- [x] OpenAI (chat, vision, tools, images, Whisper, speech) - [x] Anthropic - [x] Mistral +- [x] Groq - [x] Ollama -- [ ] Perplexity -- [ ] Groq +- [x] Perplexity +- [x] TogetherAI +- [x] `_Gemini` (Google Gemini client; standalone product) +- [ ] Broader parity matrix (streaming, tools, vision) across every LLM provider + +### Embeddings & hub + +- [x] OpenAI embeddings +- [x] Cohere +- [x] Jina +- [x] VoyageAI +- [x] Hugging Face hub helpers / tokenizer resources + +### Voice & speech + +- [x] ElevenLabs +- [x] PlayHT +- [x] Rime +- [x] HumeAI +- [x] NeetsAI +- [x] OpenAI TTS / Whisper + +### Project hygiene + +- [x] Architecture & dependency documentation +- [x] Contributing guide, docs index, PR template & changelog +- [ ] Register missing test targets (Ollama, Rime, TogetherAI folder) +- [ ] visionOS badge artwork under `Images/` +- [ ] Tagged semantic releases with automated changelog sections + +# Contributing + +Contributions are welcome. Please read **[CONTRIBUTING.md](CONTRIBUTING.md)** for: + +- Environment and build requirements +- PR expectations and testing notes +- Steps to add or extend a provider without breaking layering rules + +# Changelog + +See **[CHANGELOG.md](CHANGELOG.md)** for user-visible changes. The package is in **alpha**; expect API evolution between releases. # Acknowledgements @@ -567,4 +834,4 @@ return embeddings.data.first?.embedding.description # License -This package is licensed under the MIT License. +This package is licensed under the [MIT License](LICENSE). diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md new file mode 100644 index 00000000..913a99c8 --- /dev/null +++ b/docs/ARCHITECTURE.md @@ -0,0 +1,100 @@ +# Architecture + +This document summarizes the package architecture as defined in `Package.swift`. + +## Module Layers + +1. **Core layer** + - `CoreMI` +2. **LLM abstraction layer** + - `LargeLanguageModels` +3. **Provider layer** + - `Anthropic`, `Cohere`, `ElevenLabs`, `Groq`, `HuggingFace`, `HumeAI`, `Jina`, `Mistral`, `NeetsAI`, `Ollama`, `OpenAI`, `Perplexity`, `PlayHT`, `Rime`, `TogetherAI`, `VoyageAI`, `_Gemini` +4. **Umbrella layer** + - `AI` + +## Component Dependency Graph + +In this graph, `CorePersistence`, `Merge`, `NetworkKit`, `Swallow`, and `SwiftUIX` are external package dependencies (not targets in this repository). + +```mermaid +graph TD + CoreMI --> CorePersistence + CoreMI --> Merge + CoreMI --> Swallow + + LargeLanguageModels --> CoreMI + LargeLanguageModels --> CorePersistence + LargeLanguageModels --> Merge + LargeLanguageModels --> NetworkKit + LargeLanguageModels --> Swallow + LargeLanguageModels --> SwiftUIX + + Anthropic --> LargeLanguageModels + OpenAI --> LargeLanguageModels + HuggingFace --> CoreMI + HuggingFace --> Swallow + + Cohere --> CoreMI + Cohere --> LargeLanguageModels + ElevenLabs --> CoreMI + ElevenLabs --> LargeLanguageModels + Groq --> CoreMI + Groq --> LargeLanguageModels + HumeAI --> CoreMI + HumeAI --> LargeLanguageModels + Jina --> CoreMI + Jina --> LargeLanguageModels + Mistral --> CoreMI + Mistral --> LargeLanguageModels + NeetsAI --> CoreMI + NeetsAI --> LargeLanguageModels + Ollama --> CoreMI + Ollama --> LargeLanguageModels + PlayHT --> CoreMI + PlayHT --> LargeLanguageModels + Rime --> CoreMI + Rime --> LargeLanguageModels + TogetherAI --> CoreMI + TogetherAI --> LargeLanguageModels + VoyageAI --> CoreMI + VoyageAI --> LargeLanguageModels + _Gemini --> CoreMI + _Gemini --> LargeLanguageModels + + Perplexity --> OpenAI + Perplexity --> CoreMI + Perplexity --> LargeLanguageModels + + AI --> CoreMI + AI --> LargeLanguageModels + AI --> Anthropic + AI --> Cohere + AI --> ElevenLabs + AI --> Groq + AI --> HuggingFace + AI --> Jina + AI --> Mistral + AI --> Ollama + AI --> OpenAI + + AI -. standalone product .-> HumeAI + AI -. standalone product .-> NeetsAI + AI -. standalone product .-> Perplexity + AI -. standalone product .-> PlayHT + AI -. standalone product .-> Rime + AI -. standalone product .-> TogetherAI + AI -. standalone product .-> VoyageAI + AI -. standalone product .-> _Gemini +``` +> Note: The `AI` umbrella target currently depends on `CoreMI`, `LargeLanguageModels`, `Anthropic`, `Cohere`, `ElevenLabs`, `Groq`, `HuggingFace`, `Jina`, `Mistral`, `Ollama`, and `OpenAI`. Other provider modules in this repository are distributed as standalone products and are not re-exported by `AI` in `Package.swift`. + +> Note: `HuggingFace` intentionally differs from most provider modules: in `Package.swift` it depends on `CoreMI` and `Swallow`, and does not depend on `LargeLanguageModels`. + +## External Dependencies + +- `CorePersistence` +- `Merge` +- `NetworkKit` +- `Swallow` +- `SwiftUIX` diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000..5e24f4c9 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,31 @@ +# Documentation + +Guides for the **AI** Swift package ([PreternaturalAI/AI](https://github.com/PreternaturalAI/AI)). + +| Document | Audience | Description | +|----------|----------|-------------| +| [../README.md](../README.md) | Everyone | Install, usage examples, architecture summary, dependency graph, roadmap | +| [ARCHITECTURE.md](ARCHITECTURE.md) | Contributors & integrators | Layers, products vs targets, Mermaid graphs, protocol matrix, tests | +| [../CONTRIBUTING.md](../CONTRIBUTING.md) | Contributors | Setup, PR process, adding providers | +| [../CHANGELOG.md](../CHANGELOG.md) | Everyone | Notable changes | +| [../LICENSE](../LICENSE) | Everyone | MIT | + +## Quick orientation + +```text +Package.swift products, targets, external deps +Sources/CoreMI foundations (requests, model IDs, services) +Sources/LargeLanguageModels AbstractLLM, prompts, embeddings protocols +Sources/ vendor clients +Sources/AI umbrella module (selective @_exported imports) +Tests/ parallel test targets (see ARCHITECTURE.md for gaps) +docs/ long-form documentation (this folder) +``` + +## Keeping docs honest + +When you change `Package.swift` or add a provider: + +1. Update the dependency graph and tables in [ARCHITECTURE.md](ARCHITECTURE.md). +2. Mirror user-facing bits in [../README.md](../README.md) (products, roadmap, import notes). +3. Note the change under `[Unreleased]` in [../CHANGELOG.md](../CHANGELOG.md). From 0eab6adc5760551096b13b649bdefc2bb3d6d853 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Wed, 12 Aug 2026 15:40:24 -0700 Subject: [PATCH 095/271] Document package architecture, dependency graph, and contribution workflow (#50) (#57) --- .github/PULL_REQUEST_TEMPLATE.md | 31 +++ CHANGELOG.md | 11 + CONTRIBUTING.md | 37 ++++ README.md | 333 ++++++++++++++++++++++++++++--- docs/ARCHITECTURE.md | 100 ++++++++++ docs/README.md | 31 +++ 6 files changed, 510 insertions(+), 33 deletions(-) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 CHANGELOG.md create mode 100644 CONTRIBUTING.md create mode 100644 docs/ARCHITECTURE.md create mode 100644 docs/README.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..7dfe0424 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,31 @@ +## Summary + + + +## Type of change + +- [ ] Bug fix +- [ ] New provider / API surface +- [ ] Refactor +- [ ] Documentation +- [ ] Tests / CI +- [ ] Other + +## Checklist + +- [ ] Builds with the package’s supported Xcode/Swift versions +- [ ] Tests added or updated when behavior changes +- [ ] No secrets or API keys committed +- [ ] Docs updated if products, targets, public API, or dependencies changed: + - [ ] `README.md` + - [ ] `docs/ARCHITECTURE.md` (graph / tables) + - [ ] `CHANGELOG.md` (`[Unreleased]`) +- [ ] Layering respected (providers β†’ `LargeLanguageModels` β†’ `CoreMI`; avoid new providerβ†’provider deps) + +## Test plan + + + +## Related issues + + diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..cfb3a06d --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,11 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +## [Unreleased] + +### Added + +- Added architecture documentation in `docs/ARCHITECTURE.md`. +- Added contribution guidelines in `CONTRIBUTING.md`. +- Improved `README.md` with architecture, dependency graph, and documentation links. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..1f9c2b44 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,37 @@ +# Contributing + +Thanks for contributing to AI. + +## Prerequisites + +- Xcode 15.4+ (Swift 5.10 toolchain) +- Apple platform SDKs supported by this package + +## Getting Started + +1. Fork the repository and create a feature branch. +2. Make focused changes with clear commit messages. +3. Run tests locally: + +```bash +swift test +``` + +4. Update documentation when behavior, APIs, or architecture changes. +5. Open a pull request with a clear summary and test notes. + +## Pull Request Checklist + +- [ ] Changes are scoped to one topic +- [ ] Public API changes are documented +- [ ] Tests pass locally (`swift test`) +- [ ] README/docs/changelog updated when needed + +## Reporting Issues + +When filing a bug, include: + +- Steps to reproduce +- Expected vs actual behavior +- Platform and Xcode/Swift versions +- Relevant logs or sample payloads diff --git a/README.md b/README.md index cf435eff..388e6c54 100644 --- a/README.md +++ b/README.md @@ -1,68 +1,100 @@ > [!IMPORTANT] > This package is presently in its alpha stage of development (2026-03-04). ---- +#### Supported Platforms - +SPM platforms from [`Package.swift`](Package.swift): **iOS 16+**, **macOS 13+**, **tvOS 16+**, **visionOS 1+**, **watchOS 9+**. -#### Supported Platforms

- macos + macOS   - macos + iOS   - macos + iPadOS   - macos + tvOS   - macos + watchOS

+Also targets **visionOS** (badge art not yet in `Images/`). + # AI The definitive, open-source Swift framework for interfacing with generative AI. -[Installation](#installation)\ -[Usage](#usage) - -* [Import the framework](#import-the-framework) -* [Initialize an AI Client](#initialize-an-ai-client) -* [LLM Clients Abstraction](#llm-clients-abstraction) -* [Supported Models](#supported-models) -* [Completions](#completions) - * [Basic Completions](#basic-completions) - * [Vision: Image-to-Text](#vision-image-to-text) - * [Function Calling](#function-calling) -* [DALLE-3 Image Generation](#dalle-3-image-generation) -* [Audio](#audio) - * [Audio Transcription: Whisper](#audio-transcription-whisper) - * [Audio Generation: OpenAI](#audio-generation-openai) - * [Audio Generation: ElevenLabs](#audio-generation-elevenlabs) -* [Text Embeddings](#text-embeddings) - -[Roadmap](#roadmap) \ -[Acknowledgements](#acknowledgements) \ -[License](#license) +## Documentation + +- [Architecture](docs/ARCHITECTURE.md) +- [Contributing](CONTRIBUTING.md) +- [Changelog](CHANGELOG.md) + +## Table of Contents + +- [Architecture Overview](#architecture-overview) +- [Dependencies](#dependencies) +- [Installation](#installation) +- [Usage](#usage) + - [Import the framework](#import-the-framework) + - [Initialize an AI Client](#initialize-an-ai-client) + - [LLM Clients Abstraction](#llm-clients-abstraction) + - [Supported Models](#supported-models) + - [Completions](#completions) + - [Basic Completions](#basic-completions) + - [Vision: Image-to-Text](#vision-image-to-text) + - [Function Calling](#function-calling) + - [DALLE-3 Image Generation](#dalle-3-image-generation) + - [Audio](#audio) + - [Audio Transcription: Whisper](#audio-transcription-whisper) + - [Audio Generation: OpenAI](#audio-generation-openai) + - [Audio Generation: ElevenLabs](#audio-generation-elevenlabs) + - [Text Embeddings](#text-embeddings) +- [Roadmap](#roadmap) +- [Acknowledgements](#acknowledgements) +- [License](#license) + +## Architecture Overview + +This package is organized as a Swift Package Manager workspace with layered modules: + +- `CoreMI` provides shared core abstractions used across providers. +- `LargeLanguageModels` builds common LLM request/response functionality on top of `CoreMI`. +- Provider modules (`OpenAI`, `Anthropic`, `Mistral`, `Groq`, `ElevenLabs`, etc.) implement vendor-specific APIs. +- `AI` is the umbrella product that re-exports the main modules for one-stop integration. + +### Component Dependency Graph + +A full dependency graph generated from `Package.swift` target dependencies is available in [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md#component-dependency-graph). + +## Dependencies + +External package dependencies declared in `Package.swift`: + +- [`CorePersistence`](https://github.com/vmanot/CorePersistence) +- [`Merge`](https://github.com/vmanot/Merge) +- [`NetworkKit`](https://github.com/vmanot/NetworkKit) +- [`Swallow`](https://github.com/vmanot/Swallow) +- [`SwiftUIX`](https://github.com/SwiftUIX/SwiftUIX) # Installation @@ -74,6 +106,179 @@ The definitive, open-source Swift framework for interfacing with generative AI. 4. Choose the version you'd like to install. 5. Click `Add Package`. +Or add the dependency in `Package.swift`: + +```swift +dependencies: [ + .package(url: "https://github.com/PreternaturalAI/AI.git", branch: "main") +] +``` + +Then link the `AI` product (umbrella) or a standalone product such as `OpenAI`, `Anthropic`, or `Perplexity` (see [Architecture](#architecture)). + +# Architecture + +The package is organized in layers. Provider SDKs implement shared protocols (`LLMRequestHandling`, embeddings, TTS, and so on) defined in the core modules. + +| Layer | Modules | Responsibility | +|-------|---------|----------------| +| Umbrella module | `AI` | `@_exported` re-exports **CoreMI**, **LargeLanguageModels**, **OpenAI** (and Swallow macros client). Other bundled modules still need their own `import`. | +| Umbrella product | `AI` library | SPM product that **links** core + Anthropic, Cohere, ElevenLabs, Groq, HuggingFace, Jina, Mistral, Ollama, OpenAI, and the `AI` module | +| Providers | `OpenAI`, `Anthropic`, `Mistral`, `Groq`, `Ollama`, `Perplexity`, `Cohere`, `Jina`, `VoyageAI`, `TogetherAI`, `ElevenLabs`, `PlayHT`, `Rime`, `HumeAI`, `NeetsAI`, `_Gemini`, `HuggingFace`, … | API clients and model types | +| LLM abstractions | `LargeLanguageModels` | `AbstractLLM`, `PromptLiteral`, chat/function-calling, embeddings protocols | +| Foundations | `CoreMI` | Request handling, model identifiers, service credentials, ASR/TTS bases | +| External | Swallow, Merge, NetworkKit, CorePersistence, SwiftUIX | Shared infrastructure (see [Dependencies](#dependencies)) | + +`import AI` is enough for OpenAI + shared LLM types. For other clients linked by the product, add e.g. `import Anthropic` or `import Groq`. Providers shipped only as standalone products (`Perplexity`, `_Gemini`, `VoyageAI`, …) require linking that product. + +### Component dependency graph + +Graph of **package targets** as declared in [`Package.swift`](Package.swift) (external packages shown once at the bottom). For products, tests, and design notes, see **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)**. + +```mermaid +flowchart TB + subgraph umbrella [Umbrella] + AI + end + + subgraph providers [Provider targets] + OpenAI + Anthropic + Mistral + Groq + Ollama + Perplexity + Cohere + Jina + VoyageAI + TogetherAI + ElevenLabs + PlayHT + Rime + HumeAI + NeetsAI + Gemini["_Gemini"] + HuggingFace + end + + subgraph core [Core targets] + LargeLanguageModels + CoreMI + end + + subgraph external [External packages] + Swallow + Merge + NetworkKit + CorePersistence + SwiftUIX + end + + AI --> CoreMI + AI --> LargeLanguageModels + AI --> OpenAI + AI --> Anthropic + AI --> Mistral + AI --> Groq + AI --> Ollama + AI --> Cohere + AI --> ElevenLabs + AI --> HuggingFace + AI --> Jina + + OpenAI --> LargeLanguageModels + Anthropic --> LargeLanguageModels + Mistral --> LargeLanguageModels + Groq --> LargeLanguageModels + Ollama --> LargeLanguageModels + Perplexity --> LargeLanguageModels + Perplexity --> OpenAI + Cohere --> LargeLanguageModels + Jina --> LargeLanguageModels + VoyageAI --> LargeLanguageModels + TogetherAI --> LargeLanguageModels + ElevenLabs --> LargeLanguageModels + PlayHT --> LargeLanguageModels + Rime --> LargeLanguageModels + HumeAI --> LargeLanguageModels + NeetsAI --> LargeLanguageModels + Gemini --> LargeLanguageModels + HuggingFace --> CoreMI + + LargeLanguageModels --> CoreMI + LargeLanguageModels --> CorePersistence + LargeLanguageModels --> Merge + LargeLanguageModels --> NetworkKit + LargeLanguageModels --> Swallow + LargeLanguageModels --> SwiftUIX + + CoreMI --> CorePersistence + CoreMI --> Merge + CoreMI --> Swallow +``` + +**Notes** + +- Most providers also depend on `CoreMI`, `CorePersistence`, `Merge`, `NetworkKit`, and `Swallow` directly (edges omitted above for readability where they already flow through `LargeLanguageModels`). +- **OpenAI** and **Anthropic** depend on `LargeLanguageModels` + networking stack, not on `CoreMI` directly in `Package.swift`. +- **Perplexity** is the only provider that depends on another provider target (`OpenAI`). +- **HuggingFace** depends on `CoreMI` + `Swallow` only (hub/tokenizer helpers, not the full LLM stack). +- The `AI` **product** does **not** link every target (for example `_Gemini`, `Perplexity`, `PlayHT`, `Rime`, `TogetherAI`, `VoyageAI`, `HumeAI`, `NeetsAI` are separate products). +- The `AI` **module** re-exports only CoreMI, LargeLanguageModels, and OpenAI among first-party modules (`Sources/AI/module.swift`). + +### Protocol capabilities (from source) + +Which shared protocols have an explicit client conformance today: + +| Target | `LLMRequestHandling` | `TextEmbeddingsRequestHandling` | Notes | +|--------|:--------------------:|:-------------------------------:|-------| +| OpenAI | yes | yes | Also images, Whisper, speech, assistants | +| Anthropic | yes | | | +| Mistral | yes | yes | | +| Groq | yes | | | +| Ollama | yes | | | +| Perplexity | yes | | Depends on OpenAI target | +| Cohere | | yes | | +| Jina | | yes | | +| VoyageAI | | yes | | +| TogetherAI, ElevenLabs, PlayHT, Rime, HumeAI, NeetsAI, _Gemini, HuggingFace | | | Provider-specific client APIs / hub helpers (see `Sources/`) | + +Full layering detail: **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)**. Docs index: **[docs/README.md](docs/README.md)**. + +# Dependencies + +### External Swift packages + +| Package | Repository | Role | +|---------|------------|------| +| Swallow | [vmanot/Swallow](https://github.com/vmanot/Swallow) | Extensions, macros client, diagnostics | +| Merge | [vmanot/Merge](https://github.com/vmanot/Merge) | Concurrency / async utilities | +| NetworkKit | [vmanot/NetworkKit](https://github.com/vmanot/NetworkKit) | HTTP client & API specifications | +| CorePersistence | [vmanot/CorePersistence](https://github.com/vmanot/CorePersistence) | Persistence & schema helpers (e.g. JSONSchema) | +| SwiftUIX | [SwiftUIX/SwiftUIX](https://github.com/SwiftUIX/SwiftUIX) | SwiftUI extensions | + +Transitive pins (see [`Package.resolved`](Package.resolved)) include **SwiftAPI**, **swift-collections**, and **swift-syntax**. + +### SPM products you can link + +Exact product names from `Package.swift`: + +| Product | Targets exposed | Use when | +|---------|-----------------|----------| +| `AI` | CoreMI, LargeLanguageModels, Anthropic, Cohere, ElevenLabs, Groq, HuggingFace, Jina, Mistral, Ollama, OpenAI, AI | Default multi-provider app dependency | +| `OpenAI` | OpenAI | OpenAI-only | +| `Anthropic` | Anthropic | Anthropic-only | +| `Perplexity` | Perplexity | Perplexity (pulls OpenAI transitively) | +| `TogetherAI` | TogetherAI | Together AI | +| `VoyageAI` | VoyageAI | Voyage embeddings | +| `PlayHT` | PlayHT | PlayHT voice | +| `Rime` | Rime | Rime voice | +| `HumeAI` | HumeAI | Hume | +| `NeetsAI` | NeetsAI | Neets | +| `_Gemini` | _Gemini | Google Gemini client | + +There is **no** standalone SPM product today for `CoreMI`, `LargeLanguageModels`, `Cohere`, `Groq`, `HuggingFace`, `Jina`, `Mistral`, `Ollama`, or `ElevenLabs` β€” consume them via the `AI` product (or add a product in `Package.swift` if you need a leaner slice). + # Usage ## Import the framework @@ -551,14 +756,76 @@ let embeddings = try await LLMManager.client.textEmbeddings( return embeddings.data.first?.embedding.description ``` +# Documentation + +| Document | Contents | +|----------|----------| +| **[docs/README.md](docs/README.md)** | Documentation index | +| **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)** | Full architecture, products vs targets, Mermaid graph, protocol matrix, tests | +| **[CONTRIBUTING.md](CONTRIBUTING.md)** | Dev setup, coding guidelines, how to add a provider | +| **[CHANGELOG.md](CHANGELOG.md)** | Release notes and unreleased changes | +| **[LICENSE](LICENSE)** | MIT License text | + +API behavior is illustrated in the [Usage](#usage) sections above; protocol details live in `Sources/LargeLanguageModels` and `Sources/CoreMI`. + # Roadmap -- [x] OpenAI +Status reflects modules present in this repository (`Sources/` + `Package.swift`). Checked items ship as package targets; depth of feature coverage varies by provider. + +### Core + +- [x] `CoreMI` β€” request handling, model identifiers, services, ASR/TTS foundations +- [x] `LargeLanguageModels` β€” `AbstractLLM`, prompts, function calling, embeddings protocols +- [x] `AI` umbrella product + +### LLM & multimodal providers + +- [x] OpenAI (chat, vision, tools, images, Whisper, speech) - [x] Anthropic - [x] Mistral +- [x] Groq - [x] Ollama -- [ ] Perplexity -- [ ] Groq +- [x] Perplexity +- [x] TogetherAI +- [x] `_Gemini` (Google Gemini client; standalone product) +- [ ] Broader parity matrix (streaming, tools, vision) across every LLM provider + +### Embeddings & hub + +- [x] OpenAI embeddings +- [x] Cohere +- [x] Jina +- [x] VoyageAI +- [x] Hugging Face hub helpers / tokenizer resources + +### Voice & speech + +- [x] ElevenLabs +- [x] PlayHT +- [x] Rime +- [x] HumeAI +- [x] NeetsAI +- [x] OpenAI TTS / Whisper + +### Project hygiene + +- [x] Architecture & dependency documentation +- [x] Contributing guide, docs index, PR template & changelog +- [ ] Register missing test targets (Ollama, Rime, TogetherAI folder) +- [ ] visionOS badge artwork under `Images/` +- [ ] Tagged semantic releases with automated changelog sections + +# Contributing + +Contributions are welcome. Please read **[CONTRIBUTING.md](CONTRIBUTING.md)** for: + +- Environment and build requirements +- PR expectations and testing notes +- Steps to add or extend a provider without breaking layering rules + +# Changelog + +See **[CHANGELOG.md](CHANGELOG.md)** for user-visible changes. The package is in **alpha**; expect API evolution between releases. # Acknowledgements @@ -567,4 +834,4 @@ return embeddings.data.first?.embedding.description # License -This package is licensed under the MIT License. +This package is licensed under the [MIT License](LICENSE). diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md new file mode 100644 index 00000000..913a99c8 --- /dev/null +++ b/docs/ARCHITECTURE.md @@ -0,0 +1,100 @@ +# Architecture + +This document summarizes the package architecture as defined in `Package.swift`. + +## Module Layers + +1. **Core layer** + - `CoreMI` +2. **LLM abstraction layer** + - `LargeLanguageModels` +3. **Provider layer** + - `Anthropic`, `Cohere`, `ElevenLabs`, `Groq`, `HuggingFace`, `HumeAI`, `Jina`, `Mistral`, `NeetsAI`, `Ollama`, `OpenAI`, `Perplexity`, `PlayHT`, `Rime`, `TogetherAI`, `VoyageAI`, `_Gemini` +4. **Umbrella layer** + - `AI` + +## Component Dependency Graph + +In this graph, `CorePersistence`, `Merge`, `NetworkKit`, `Swallow`, and `SwiftUIX` are external package dependencies (not targets in this repository). + +```mermaid +graph TD + CoreMI --> CorePersistence + CoreMI --> Merge + CoreMI --> Swallow + + LargeLanguageModels --> CoreMI + LargeLanguageModels --> CorePersistence + LargeLanguageModels --> Merge + LargeLanguageModels --> NetworkKit + LargeLanguageModels --> Swallow + LargeLanguageModels --> SwiftUIX + + Anthropic --> LargeLanguageModels + OpenAI --> LargeLanguageModels + HuggingFace --> CoreMI + HuggingFace --> Swallow + + Cohere --> CoreMI + Cohere --> LargeLanguageModels + ElevenLabs --> CoreMI + ElevenLabs --> LargeLanguageModels + Groq --> CoreMI + Groq --> LargeLanguageModels + HumeAI --> CoreMI + HumeAI --> LargeLanguageModels + Jina --> CoreMI + Jina --> LargeLanguageModels + Mistral --> CoreMI + Mistral --> LargeLanguageModels + NeetsAI --> CoreMI + NeetsAI --> LargeLanguageModels + Ollama --> CoreMI + Ollama --> LargeLanguageModels + PlayHT --> CoreMI + PlayHT --> LargeLanguageModels + Rime --> CoreMI + Rime --> LargeLanguageModels + TogetherAI --> CoreMI + TogetherAI --> LargeLanguageModels + VoyageAI --> CoreMI + VoyageAI --> LargeLanguageModels + _Gemini --> CoreMI + _Gemini --> LargeLanguageModels + + Perplexity --> OpenAI + Perplexity --> CoreMI + Perplexity --> LargeLanguageModels + + AI --> CoreMI + AI --> LargeLanguageModels + AI --> Anthropic + AI --> Cohere + AI --> ElevenLabs + AI --> Groq + AI --> HuggingFace + AI --> Jina + AI --> Mistral + AI --> Ollama + AI --> OpenAI + + AI -. standalone product .-> HumeAI + AI -. standalone product .-> NeetsAI + AI -. standalone product .-> Perplexity + AI -. standalone product .-> PlayHT + AI -. standalone product .-> Rime + AI -. standalone product .-> TogetherAI + AI -. standalone product .-> VoyageAI + AI -. standalone product .-> _Gemini +``` +> Note: The `AI` umbrella target currently depends on `CoreMI`, `LargeLanguageModels`, `Anthropic`, `Cohere`, `ElevenLabs`, `Groq`, `HuggingFace`, `Jina`, `Mistral`, `Ollama`, and `OpenAI`. Other provider modules in this repository are distributed as standalone products and are not re-exported by `AI` in `Package.swift`. + +> Note: `HuggingFace` intentionally differs from most provider modules: in `Package.swift` it depends on `CoreMI` and `Swallow`, and does not depend on `LargeLanguageModels`. + +## External Dependencies + +- `CorePersistence` +- `Merge` +- `NetworkKit` +- `Swallow` +- `SwiftUIX` diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000..5e24f4c9 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,31 @@ +# Documentation + +Guides for the **AI** Swift package ([PreternaturalAI/AI](https://github.com/PreternaturalAI/AI)). + +| Document | Audience | Description | +|----------|----------|-------------| +| [../README.md](../README.md) | Everyone | Install, usage examples, architecture summary, dependency graph, roadmap | +| [ARCHITECTURE.md](ARCHITECTURE.md) | Contributors & integrators | Layers, products vs targets, Mermaid graphs, protocol matrix, tests | +| [../CONTRIBUTING.md](../CONTRIBUTING.md) | Contributors | Setup, PR process, adding providers | +| [../CHANGELOG.md](../CHANGELOG.md) | Everyone | Notable changes | +| [../LICENSE](../LICENSE) | Everyone | MIT | + +## Quick orientation + +```text +Package.swift products, targets, external deps +Sources/CoreMI foundations (requests, model IDs, services) +Sources/LargeLanguageModels AbstractLLM, prompts, embeddings protocols +Sources/ vendor clients +Sources/AI umbrella module (selective @_exported imports) +Tests/ parallel test targets (see ARCHITECTURE.md for gaps) +docs/ long-form documentation (this folder) +``` + +## Keeping docs honest + +When you change `Package.swift` or add a provider: + +1. Update the dependency graph and tables in [ARCHITECTURE.md](ARCHITECTURE.md). +2. Mirror user-facing bits in [../README.md](../README.md) (products, roadmap, import notes). +3. Note the change under `[Unreleased]` in [../CHANGELOG.md](../CHANGELOG.md). From 59f79e065af9c123077511fb57551edc7efb0a24 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Wed, 12 Aug 2026 15:41:04 -0700 Subject: [PATCH 096/271] Document package architecture, dependency graph, and contribution workflow (#50) (#58) --- .github/PULL_REQUEST_TEMPLATE.md | 31 +++ CHANGELOG.md | 11 + CONTRIBUTING.md | 37 ++++ README.md | 333 ++++++++++++++++++++++++++++--- docs/ARCHITECTURE.md | 100 ++++++++++ docs/README.md | 31 +++ 6 files changed, 510 insertions(+), 33 deletions(-) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 CHANGELOG.md create mode 100644 CONTRIBUTING.md create mode 100644 docs/ARCHITECTURE.md create mode 100644 docs/README.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..7dfe0424 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,31 @@ +## Summary + + + +## Type of change + +- [ ] Bug fix +- [ ] New provider / API surface +- [ ] Refactor +- [ ] Documentation +- [ ] Tests / CI +- [ ] Other + +## Checklist + +- [ ] Builds with the package’s supported Xcode/Swift versions +- [ ] Tests added or updated when behavior changes +- [ ] No secrets or API keys committed +- [ ] Docs updated if products, targets, public API, or dependencies changed: + - [ ] `README.md` + - [ ] `docs/ARCHITECTURE.md` (graph / tables) + - [ ] `CHANGELOG.md` (`[Unreleased]`) +- [ ] Layering respected (providers β†’ `LargeLanguageModels` β†’ `CoreMI`; avoid new providerβ†’provider deps) + +## Test plan + + + +## Related issues + + diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..cfb3a06d --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,11 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +## [Unreleased] + +### Added + +- Added architecture documentation in `docs/ARCHITECTURE.md`. +- Added contribution guidelines in `CONTRIBUTING.md`. +- Improved `README.md` with architecture, dependency graph, and documentation links. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..1f9c2b44 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,37 @@ +# Contributing + +Thanks for contributing to AI. + +## Prerequisites + +- Xcode 15.4+ (Swift 5.10 toolchain) +- Apple platform SDKs supported by this package + +## Getting Started + +1. Fork the repository and create a feature branch. +2. Make focused changes with clear commit messages. +3. Run tests locally: + +```bash +swift test +``` + +4. Update documentation when behavior, APIs, or architecture changes. +5. Open a pull request with a clear summary and test notes. + +## Pull Request Checklist + +- [ ] Changes are scoped to one topic +- [ ] Public API changes are documented +- [ ] Tests pass locally (`swift test`) +- [ ] README/docs/changelog updated when needed + +## Reporting Issues + +When filing a bug, include: + +- Steps to reproduce +- Expected vs actual behavior +- Platform and Xcode/Swift versions +- Relevant logs or sample payloads diff --git a/README.md b/README.md index cf435eff..388e6c54 100644 --- a/README.md +++ b/README.md @@ -1,68 +1,100 @@ > [!IMPORTANT] > This package is presently in its alpha stage of development (2026-03-04). ---- +#### Supported Platforms - +SPM platforms from [`Package.swift`](Package.swift): **iOS 16+**, **macOS 13+**, **tvOS 16+**, **visionOS 1+**, **watchOS 9+**. -#### Supported Platforms

- macos + macOS   - macos + iOS   - macos + iPadOS   - macos + tvOS   - macos + watchOS

+Also targets **visionOS** (badge art not yet in `Images/`). + # AI The definitive, open-source Swift framework for interfacing with generative AI. -[Installation](#installation)\ -[Usage](#usage) - -* [Import the framework](#import-the-framework) -* [Initialize an AI Client](#initialize-an-ai-client) -* [LLM Clients Abstraction](#llm-clients-abstraction) -* [Supported Models](#supported-models) -* [Completions](#completions) - * [Basic Completions](#basic-completions) - * [Vision: Image-to-Text](#vision-image-to-text) - * [Function Calling](#function-calling) -* [DALLE-3 Image Generation](#dalle-3-image-generation) -* [Audio](#audio) - * [Audio Transcription: Whisper](#audio-transcription-whisper) - * [Audio Generation: OpenAI](#audio-generation-openai) - * [Audio Generation: ElevenLabs](#audio-generation-elevenlabs) -* [Text Embeddings](#text-embeddings) - -[Roadmap](#roadmap) \ -[Acknowledgements](#acknowledgements) \ -[License](#license) +## Documentation + +- [Architecture](docs/ARCHITECTURE.md) +- [Contributing](CONTRIBUTING.md) +- [Changelog](CHANGELOG.md) + +## Table of Contents + +- [Architecture Overview](#architecture-overview) +- [Dependencies](#dependencies) +- [Installation](#installation) +- [Usage](#usage) + - [Import the framework](#import-the-framework) + - [Initialize an AI Client](#initialize-an-ai-client) + - [LLM Clients Abstraction](#llm-clients-abstraction) + - [Supported Models](#supported-models) + - [Completions](#completions) + - [Basic Completions](#basic-completions) + - [Vision: Image-to-Text](#vision-image-to-text) + - [Function Calling](#function-calling) + - [DALLE-3 Image Generation](#dalle-3-image-generation) + - [Audio](#audio) + - [Audio Transcription: Whisper](#audio-transcription-whisper) + - [Audio Generation: OpenAI](#audio-generation-openai) + - [Audio Generation: ElevenLabs](#audio-generation-elevenlabs) + - [Text Embeddings](#text-embeddings) +- [Roadmap](#roadmap) +- [Acknowledgements](#acknowledgements) +- [License](#license) + +## Architecture Overview + +This package is organized as a Swift Package Manager workspace with layered modules: + +- `CoreMI` provides shared core abstractions used across providers. +- `LargeLanguageModels` builds common LLM request/response functionality on top of `CoreMI`. +- Provider modules (`OpenAI`, `Anthropic`, `Mistral`, `Groq`, `ElevenLabs`, etc.) implement vendor-specific APIs. +- `AI` is the umbrella product that re-exports the main modules for one-stop integration. + +### Component Dependency Graph + +A full dependency graph generated from `Package.swift` target dependencies is available in [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md#component-dependency-graph). + +## Dependencies + +External package dependencies declared in `Package.swift`: + +- [`CorePersistence`](https://github.com/vmanot/CorePersistence) +- [`Merge`](https://github.com/vmanot/Merge) +- [`NetworkKit`](https://github.com/vmanot/NetworkKit) +- [`Swallow`](https://github.com/vmanot/Swallow) +- [`SwiftUIX`](https://github.com/SwiftUIX/SwiftUIX) # Installation @@ -74,6 +106,179 @@ The definitive, open-source Swift framework for interfacing with generative AI. 4. Choose the version you'd like to install. 5. Click `Add Package`. +Or add the dependency in `Package.swift`: + +```swift +dependencies: [ + .package(url: "https://github.com/PreternaturalAI/AI.git", branch: "main") +] +``` + +Then link the `AI` product (umbrella) or a standalone product such as `OpenAI`, `Anthropic`, or `Perplexity` (see [Architecture](#architecture)). + +# Architecture + +The package is organized in layers. Provider SDKs implement shared protocols (`LLMRequestHandling`, embeddings, TTS, and so on) defined in the core modules. + +| Layer | Modules | Responsibility | +|-------|---------|----------------| +| Umbrella module | `AI` | `@_exported` re-exports **CoreMI**, **LargeLanguageModels**, **OpenAI** (and Swallow macros client). Other bundled modules still need their own `import`. | +| Umbrella product | `AI` library | SPM product that **links** core + Anthropic, Cohere, ElevenLabs, Groq, HuggingFace, Jina, Mistral, Ollama, OpenAI, and the `AI` module | +| Providers | `OpenAI`, `Anthropic`, `Mistral`, `Groq`, `Ollama`, `Perplexity`, `Cohere`, `Jina`, `VoyageAI`, `TogetherAI`, `ElevenLabs`, `PlayHT`, `Rime`, `HumeAI`, `NeetsAI`, `_Gemini`, `HuggingFace`, … | API clients and model types | +| LLM abstractions | `LargeLanguageModels` | `AbstractLLM`, `PromptLiteral`, chat/function-calling, embeddings protocols | +| Foundations | `CoreMI` | Request handling, model identifiers, service credentials, ASR/TTS bases | +| External | Swallow, Merge, NetworkKit, CorePersistence, SwiftUIX | Shared infrastructure (see [Dependencies](#dependencies)) | + +`import AI` is enough for OpenAI + shared LLM types. For other clients linked by the product, add e.g. `import Anthropic` or `import Groq`. Providers shipped only as standalone products (`Perplexity`, `_Gemini`, `VoyageAI`, …) require linking that product. + +### Component dependency graph + +Graph of **package targets** as declared in [`Package.swift`](Package.swift) (external packages shown once at the bottom). For products, tests, and design notes, see **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)**. + +```mermaid +flowchart TB + subgraph umbrella [Umbrella] + AI + end + + subgraph providers [Provider targets] + OpenAI + Anthropic + Mistral + Groq + Ollama + Perplexity + Cohere + Jina + VoyageAI + TogetherAI + ElevenLabs + PlayHT + Rime + HumeAI + NeetsAI + Gemini["_Gemini"] + HuggingFace + end + + subgraph core [Core targets] + LargeLanguageModels + CoreMI + end + + subgraph external [External packages] + Swallow + Merge + NetworkKit + CorePersistence + SwiftUIX + end + + AI --> CoreMI + AI --> LargeLanguageModels + AI --> OpenAI + AI --> Anthropic + AI --> Mistral + AI --> Groq + AI --> Ollama + AI --> Cohere + AI --> ElevenLabs + AI --> HuggingFace + AI --> Jina + + OpenAI --> LargeLanguageModels + Anthropic --> LargeLanguageModels + Mistral --> LargeLanguageModels + Groq --> LargeLanguageModels + Ollama --> LargeLanguageModels + Perplexity --> LargeLanguageModels + Perplexity --> OpenAI + Cohere --> LargeLanguageModels + Jina --> LargeLanguageModels + VoyageAI --> LargeLanguageModels + TogetherAI --> LargeLanguageModels + ElevenLabs --> LargeLanguageModels + PlayHT --> LargeLanguageModels + Rime --> LargeLanguageModels + HumeAI --> LargeLanguageModels + NeetsAI --> LargeLanguageModels + Gemini --> LargeLanguageModels + HuggingFace --> CoreMI + + LargeLanguageModels --> CoreMI + LargeLanguageModels --> CorePersistence + LargeLanguageModels --> Merge + LargeLanguageModels --> NetworkKit + LargeLanguageModels --> Swallow + LargeLanguageModels --> SwiftUIX + + CoreMI --> CorePersistence + CoreMI --> Merge + CoreMI --> Swallow +``` + +**Notes** + +- Most providers also depend on `CoreMI`, `CorePersistence`, `Merge`, `NetworkKit`, and `Swallow` directly (edges omitted above for readability where they already flow through `LargeLanguageModels`). +- **OpenAI** and **Anthropic** depend on `LargeLanguageModels` + networking stack, not on `CoreMI` directly in `Package.swift`. +- **Perplexity** is the only provider that depends on another provider target (`OpenAI`). +- **HuggingFace** depends on `CoreMI` + `Swallow` only (hub/tokenizer helpers, not the full LLM stack). +- The `AI` **product** does **not** link every target (for example `_Gemini`, `Perplexity`, `PlayHT`, `Rime`, `TogetherAI`, `VoyageAI`, `HumeAI`, `NeetsAI` are separate products). +- The `AI` **module** re-exports only CoreMI, LargeLanguageModels, and OpenAI among first-party modules (`Sources/AI/module.swift`). + +### Protocol capabilities (from source) + +Which shared protocols have an explicit client conformance today: + +| Target | `LLMRequestHandling` | `TextEmbeddingsRequestHandling` | Notes | +|--------|:--------------------:|:-------------------------------:|-------| +| OpenAI | yes | yes | Also images, Whisper, speech, assistants | +| Anthropic | yes | | | +| Mistral | yes | yes | | +| Groq | yes | | | +| Ollama | yes | | | +| Perplexity | yes | | Depends on OpenAI target | +| Cohere | | yes | | +| Jina | | yes | | +| VoyageAI | | yes | | +| TogetherAI, ElevenLabs, PlayHT, Rime, HumeAI, NeetsAI, _Gemini, HuggingFace | | | Provider-specific client APIs / hub helpers (see `Sources/`) | + +Full layering detail: **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)**. Docs index: **[docs/README.md](docs/README.md)**. + +# Dependencies + +### External Swift packages + +| Package | Repository | Role | +|---------|------------|------| +| Swallow | [vmanot/Swallow](https://github.com/vmanot/Swallow) | Extensions, macros client, diagnostics | +| Merge | [vmanot/Merge](https://github.com/vmanot/Merge) | Concurrency / async utilities | +| NetworkKit | [vmanot/NetworkKit](https://github.com/vmanot/NetworkKit) | HTTP client & API specifications | +| CorePersistence | [vmanot/CorePersistence](https://github.com/vmanot/CorePersistence) | Persistence & schema helpers (e.g. JSONSchema) | +| SwiftUIX | [SwiftUIX/SwiftUIX](https://github.com/SwiftUIX/SwiftUIX) | SwiftUI extensions | + +Transitive pins (see [`Package.resolved`](Package.resolved)) include **SwiftAPI**, **swift-collections**, and **swift-syntax**. + +### SPM products you can link + +Exact product names from `Package.swift`: + +| Product | Targets exposed | Use when | +|---------|-----------------|----------| +| `AI` | CoreMI, LargeLanguageModels, Anthropic, Cohere, ElevenLabs, Groq, HuggingFace, Jina, Mistral, Ollama, OpenAI, AI | Default multi-provider app dependency | +| `OpenAI` | OpenAI | OpenAI-only | +| `Anthropic` | Anthropic | Anthropic-only | +| `Perplexity` | Perplexity | Perplexity (pulls OpenAI transitively) | +| `TogetherAI` | TogetherAI | Together AI | +| `VoyageAI` | VoyageAI | Voyage embeddings | +| `PlayHT` | PlayHT | PlayHT voice | +| `Rime` | Rime | Rime voice | +| `HumeAI` | HumeAI | Hume | +| `NeetsAI` | NeetsAI | Neets | +| `_Gemini` | _Gemini | Google Gemini client | + +There is **no** standalone SPM product today for `CoreMI`, `LargeLanguageModels`, `Cohere`, `Groq`, `HuggingFace`, `Jina`, `Mistral`, `Ollama`, or `ElevenLabs` β€” consume them via the `AI` product (or add a product in `Package.swift` if you need a leaner slice). + # Usage ## Import the framework @@ -551,14 +756,76 @@ let embeddings = try await LLMManager.client.textEmbeddings( return embeddings.data.first?.embedding.description ``` +# Documentation + +| Document | Contents | +|----------|----------| +| **[docs/README.md](docs/README.md)** | Documentation index | +| **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)** | Full architecture, products vs targets, Mermaid graph, protocol matrix, tests | +| **[CONTRIBUTING.md](CONTRIBUTING.md)** | Dev setup, coding guidelines, how to add a provider | +| **[CHANGELOG.md](CHANGELOG.md)** | Release notes and unreleased changes | +| **[LICENSE](LICENSE)** | MIT License text | + +API behavior is illustrated in the [Usage](#usage) sections above; protocol details live in `Sources/LargeLanguageModels` and `Sources/CoreMI`. + # Roadmap -- [x] OpenAI +Status reflects modules present in this repository (`Sources/` + `Package.swift`). Checked items ship as package targets; depth of feature coverage varies by provider. + +### Core + +- [x] `CoreMI` β€” request handling, model identifiers, services, ASR/TTS foundations +- [x] `LargeLanguageModels` β€” `AbstractLLM`, prompts, function calling, embeddings protocols +- [x] `AI` umbrella product + +### LLM & multimodal providers + +- [x] OpenAI (chat, vision, tools, images, Whisper, speech) - [x] Anthropic - [x] Mistral +- [x] Groq - [x] Ollama -- [ ] Perplexity -- [ ] Groq +- [x] Perplexity +- [x] TogetherAI +- [x] `_Gemini` (Google Gemini client; standalone product) +- [ ] Broader parity matrix (streaming, tools, vision) across every LLM provider + +### Embeddings & hub + +- [x] OpenAI embeddings +- [x] Cohere +- [x] Jina +- [x] VoyageAI +- [x] Hugging Face hub helpers / tokenizer resources + +### Voice & speech + +- [x] ElevenLabs +- [x] PlayHT +- [x] Rime +- [x] HumeAI +- [x] NeetsAI +- [x] OpenAI TTS / Whisper + +### Project hygiene + +- [x] Architecture & dependency documentation +- [x] Contributing guide, docs index, PR template & changelog +- [ ] Register missing test targets (Ollama, Rime, TogetherAI folder) +- [ ] visionOS badge artwork under `Images/` +- [ ] Tagged semantic releases with automated changelog sections + +# Contributing + +Contributions are welcome. Please read **[CONTRIBUTING.md](CONTRIBUTING.md)** for: + +- Environment and build requirements +- PR expectations and testing notes +- Steps to add or extend a provider without breaking layering rules + +# Changelog + +See **[CHANGELOG.md](CHANGELOG.md)** for user-visible changes. The package is in **alpha**; expect API evolution between releases. # Acknowledgements @@ -567,4 +834,4 @@ return embeddings.data.first?.embedding.description # License -This package is licensed under the MIT License. +This package is licensed under the [MIT License](LICENSE). diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md new file mode 100644 index 00000000..913a99c8 --- /dev/null +++ b/docs/ARCHITECTURE.md @@ -0,0 +1,100 @@ +# Architecture + +This document summarizes the package architecture as defined in `Package.swift`. + +## Module Layers + +1. **Core layer** + - `CoreMI` +2. **LLM abstraction layer** + - `LargeLanguageModels` +3. **Provider layer** + - `Anthropic`, `Cohere`, `ElevenLabs`, `Groq`, `HuggingFace`, `HumeAI`, `Jina`, `Mistral`, `NeetsAI`, `Ollama`, `OpenAI`, `Perplexity`, `PlayHT`, `Rime`, `TogetherAI`, `VoyageAI`, `_Gemini` +4. **Umbrella layer** + - `AI` + +## Component Dependency Graph + +In this graph, `CorePersistence`, `Merge`, `NetworkKit`, `Swallow`, and `SwiftUIX` are external package dependencies (not targets in this repository). + +```mermaid +graph TD + CoreMI --> CorePersistence + CoreMI --> Merge + CoreMI --> Swallow + + LargeLanguageModels --> CoreMI + LargeLanguageModels --> CorePersistence + LargeLanguageModels --> Merge + LargeLanguageModels --> NetworkKit + LargeLanguageModels --> Swallow + LargeLanguageModels --> SwiftUIX + + Anthropic --> LargeLanguageModels + OpenAI --> LargeLanguageModels + HuggingFace --> CoreMI + HuggingFace --> Swallow + + Cohere --> CoreMI + Cohere --> LargeLanguageModels + ElevenLabs --> CoreMI + ElevenLabs --> LargeLanguageModels + Groq --> CoreMI + Groq --> LargeLanguageModels + HumeAI --> CoreMI + HumeAI --> LargeLanguageModels + Jina --> CoreMI + Jina --> LargeLanguageModels + Mistral --> CoreMI + Mistral --> LargeLanguageModels + NeetsAI --> CoreMI + NeetsAI --> LargeLanguageModels + Ollama --> CoreMI + Ollama --> LargeLanguageModels + PlayHT --> CoreMI + PlayHT --> LargeLanguageModels + Rime --> CoreMI + Rime --> LargeLanguageModels + TogetherAI --> CoreMI + TogetherAI --> LargeLanguageModels + VoyageAI --> CoreMI + VoyageAI --> LargeLanguageModels + _Gemini --> CoreMI + _Gemini --> LargeLanguageModels + + Perplexity --> OpenAI + Perplexity --> CoreMI + Perplexity --> LargeLanguageModels + + AI --> CoreMI + AI --> LargeLanguageModels + AI --> Anthropic + AI --> Cohere + AI --> ElevenLabs + AI --> Groq + AI --> HuggingFace + AI --> Jina + AI --> Mistral + AI --> Ollama + AI --> OpenAI + + AI -. standalone product .-> HumeAI + AI -. standalone product .-> NeetsAI + AI -. standalone product .-> Perplexity + AI -. standalone product .-> PlayHT + AI -. standalone product .-> Rime + AI -. standalone product .-> TogetherAI + AI -. standalone product .-> VoyageAI + AI -. standalone product .-> _Gemini +``` +> Note: The `AI` umbrella target currently depends on `CoreMI`, `LargeLanguageModels`, `Anthropic`, `Cohere`, `ElevenLabs`, `Groq`, `HuggingFace`, `Jina`, `Mistral`, `Ollama`, and `OpenAI`. Other provider modules in this repository are distributed as standalone products and are not re-exported by `AI` in `Package.swift`. + +> Note: `HuggingFace` intentionally differs from most provider modules: in `Package.swift` it depends on `CoreMI` and `Swallow`, and does not depend on `LargeLanguageModels`. + +## External Dependencies + +- `CorePersistence` +- `Merge` +- `NetworkKit` +- `Swallow` +- `SwiftUIX` diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000..5e24f4c9 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,31 @@ +# Documentation + +Guides for the **AI** Swift package ([PreternaturalAI/AI](https://github.com/PreternaturalAI/AI)). + +| Document | Audience | Description | +|----------|----------|-------------| +| [../README.md](../README.md) | Everyone | Install, usage examples, architecture summary, dependency graph, roadmap | +| [ARCHITECTURE.md](ARCHITECTURE.md) | Contributors & integrators | Layers, products vs targets, Mermaid graphs, protocol matrix, tests | +| [../CONTRIBUTING.md](../CONTRIBUTING.md) | Contributors | Setup, PR process, adding providers | +| [../CHANGELOG.md](../CHANGELOG.md) | Everyone | Notable changes | +| [../LICENSE](../LICENSE) | Everyone | MIT | + +## Quick orientation + +```text +Package.swift products, targets, external deps +Sources/CoreMI foundations (requests, model IDs, services) +Sources/LargeLanguageModels AbstractLLM, prompts, embeddings protocols +Sources/ vendor clients +Sources/AI umbrella module (selective @_exported imports) +Tests/ parallel test targets (see ARCHITECTURE.md for gaps) +docs/ long-form documentation (this folder) +``` + +## Keeping docs honest + +When you change `Package.swift` or add a provider: + +1. Update the dependency graph and tables in [ARCHITECTURE.md](ARCHITECTURE.md). +2. Mirror user-facing bits in [../README.md](../README.md) (products, roadmap, import notes). +3. Note the change under `[Unreleased]` in [../CHANGELOG.md](../CHANGELOG.md). From 0cb89634663d5d23e8192513561524aeb9021171 Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Wed, 12 Aug 2026 17:11:56 -0700 Subject: [PATCH 097/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) From 769f84fd6e5a33ebb623741613ca16c210230159 Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Thu, 13 Aug 2026 20:40:57 -0700 Subject: [PATCH 098/271] Document package architecture, dependency graph, and contribution workflow (#50) (#53) (#60) From ca095bffe37defe751be499f9bfbf9ad9046a4c5 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 14 Aug 2026 03:41:44 +0000 Subject: [PATCH 099/271] Add repo research plan and workflow roles to docs Co-authored-by: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> --- CHANGELOG.md | 1 + docs/README.md | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index cfb3a06d..e97ec0ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,3 +9,4 @@ All notable changes to this project will be documented in this file. - Added architecture documentation in `docs/ARCHITECTURE.md`. - Added contribution guidelines in `CONTRIBUTING.md`. - Improved `README.md` with architecture, dependency graph, and documentation links. +- Added repository research plan and agent/workflow role guidance in `docs/README.md`. diff --git a/docs/README.md b/docs/README.md index 5e24f4c9..22d0f1a0 100644 --- a/docs/README.md +++ b/docs/README.md @@ -22,6 +22,30 @@ Tests/ parallel test targets (see ARCHITECTURE.md for gaps) docs/ long-form documentation (this folder) ``` +## Repository research plan + +1. Baseline architecture from `Package.swift` and `docs/ARCHITECTURE.md` (targets, product boundaries, and layer rules). +2. Validate provider consistency by sampling one provider per modality (chat, embeddings, speech) and comparing request handling patterns. +3. Audit test coverage by target under `Tests/` and identify missing behavior checks for provider-specific features. +4. Review integration risk points: shared protocol changes in `LargeLanguageModels`, dependency changes in `CoreMI`, and provider-to-provider coupling. +5. Prioritize a short backlog: architecture parity tasks, test gaps, and docs updates tied to each accepted change. + +## Agent/workflow roles + +- **Scope agent**: confirms target module(s), expected behavior, and acceptance criteria before edits. +- **Architecture agent**: enforces layering (`providers β†’ LargeLanguageModels β†’ CoreMI`) and checks product/target dependency impact. +- **Implementation agent**: makes focused changes in one area, following existing patterns and minimizing cross-target churn. +- **Validation agent**: runs required verification (`swift test` when behavior changes) and checks for regressions/security/secrets. +- **Release agent**: updates `README.md`, `docs/ARCHITECTURE.md`, and `CHANGELOG.md` when public behavior or package structure changes. + +Recommended workflow sequence: + +1. Scope agent drafts change intent and acceptance criteria. +2. Architecture agent approves dependency/layer impact. +3. Implementation agent applies a minimal, focused patch. +4. Validation agent verifies behavior and safety. +5. Release agent finalizes documentation/changelog completeness. + ## Keeping docs honest When you change `Package.swift` or add a provider: From d6bbb7abb464c35ac0ce7b7f0c49d7f6cc996973 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 14 Aug 2026 03:49:45 +0000 Subject: [PATCH 100/271] Add repo workflow guidance Co-authored-by: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> --- CHANGELOG.md | 1 + CONTRIBUTING.md | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index cfb3a06d..2896a4fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,3 +9,4 @@ All notable changes to this project will be documented in this file. - Added architecture documentation in `docs/ARCHITECTURE.md`. - Added contribution guidelines in `CONTRIBUTING.md`. - Improved `README.md` with architecture, dependency graph, and documentation links. +- Added repository research and agent workflow guidance to `CONTRIBUTING.md`. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1f9c2b44..0e562b86 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -27,6 +27,47 @@ swift test - [ ] Tests pass locally (`swift test`) - [ ] README/docs/changelog updated when needed +## Repository Research Plan + +When working in this repository, start by identifying the layer and capability you are changing before touching code. + +1. Map the affected API surface: + - `Sources/CoreMI` + - `Sources/LargeLanguageModels` + - `Sources/AI` + - the specific provider target under `Sources/` +2. Inventory shared abstractions and extension points involved in the change: + - request handling + - model identifiers + - chat/completions + - embeddings + - audio, file, structured output, and tool-calling support +3. Compare provider parity for that capability to avoid introducing one-off patterns. +4. Audit the relevant tests under `Tests/` by capability as well as by provider. +5. Update docs when package products, imports, architecture, or behavior change. +6. Run `swift test` for code changes and record any notable validation steps in the pull request. + +## Agent / Workflow Roles + +Use focused ownership when splitting work across contributors or automation: + +- **Architecture**: owns module boundaries, `Package.swift`, and `docs/ARCHITECTURE.md`. +- **Core abstractions**: owns `CoreMI` and `LargeLanguageModels` protocols, shared request/response behavior, and compatibility across providers. +- **Provider**: owns one provider target at a time and aligns provider-specific APIs with shared abstractions. +- **Test**: expands coverage in `Tests/`, adds reusable fixtures/helpers, and verifies `swift test`. +- **Docs**: keeps `README.md`, `CONTRIBUTING.md`, `docs/ARCHITECTURE.md`, and `CHANGELOG.md` aligned with code changes. +- **Release / governance**: checks change scope, public API impact, dependency layering, and pull request hygiene. + +Recommended workflow: + +1. Scope work to one layer or one provider. +2. Review architecture or shared abstraction impact first. +3. Implement the provider or core change. +4. Update tests for behavior changes. +5. Update docs for API, product, or architecture changes. +6. Run `swift test`. +7. Review for consistency with neighboring providers before merging. + ## Reporting Issues When filing a bug, include: From 0398232cd626dd76b3213df990ba87361001610d Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Thu, 13 Aug 2026 20:53:41 -0700 Subject: [PATCH 101/271] Add repo workflow guidance (#61) --- CHANGELOG.md | 1 + CONTRIBUTING.md | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index cfb3a06d..2896a4fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,3 +9,4 @@ All notable changes to this project will be documented in this file. - Added architecture documentation in `docs/ARCHITECTURE.md`. - Added contribution guidelines in `CONTRIBUTING.md`. - Improved `README.md` with architecture, dependency graph, and documentation links. +- Added repository research and agent workflow guidance to `CONTRIBUTING.md`. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1f9c2b44..0e562b86 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -27,6 +27,47 @@ swift test - [ ] Tests pass locally (`swift test`) - [ ] README/docs/changelog updated when needed +## Repository Research Plan + +When working in this repository, start by identifying the layer and capability you are changing before touching code. + +1. Map the affected API surface: + - `Sources/CoreMI` + - `Sources/LargeLanguageModels` + - `Sources/AI` + - the specific provider target under `Sources/` +2. Inventory shared abstractions and extension points involved in the change: + - request handling + - model identifiers + - chat/completions + - embeddings + - audio, file, structured output, and tool-calling support +3. Compare provider parity for that capability to avoid introducing one-off patterns. +4. Audit the relevant tests under `Tests/` by capability as well as by provider. +5. Update docs when package products, imports, architecture, or behavior change. +6. Run `swift test` for code changes and record any notable validation steps in the pull request. + +## Agent / Workflow Roles + +Use focused ownership when splitting work across contributors or automation: + +- **Architecture**: owns module boundaries, `Package.swift`, and `docs/ARCHITECTURE.md`. +- **Core abstractions**: owns `CoreMI` and `LargeLanguageModels` protocols, shared request/response behavior, and compatibility across providers. +- **Provider**: owns one provider target at a time and aligns provider-specific APIs with shared abstractions. +- **Test**: expands coverage in `Tests/`, adds reusable fixtures/helpers, and verifies `swift test`. +- **Docs**: keeps `README.md`, `CONTRIBUTING.md`, `docs/ARCHITECTURE.md`, and `CHANGELOG.md` aligned with code changes. +- **Release / governance**: checks change scope, public API impact, dependency layering, and pull request hygiene. + +Recommended workflow: + +1. Scope work to one layer or one provider. +2. Review architecture or shared abstraction impact first. +3. Implement the provider or core change. +4. Update tests for behavior changes. +5. Update docs for API, product, or architecture changes. +6. Run `swift test`. +7. Review for consistency with neighboring providers before merging. + ## Reporting Issues When filing a bug, include: From 72171932806d87a3ad20112e0aaa7940ae478e26 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 13 Aug 2026 22:05:31 -0700 Subject: [PATCH 102/271] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 388e6c54..abb9f56b 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -> [!IMPORTANT] +> πŸ•΄οΈ[!IMPORTANT] > This package is presently in its alpha stage of development (2026-03-04). #### Supported Platforms From 13da56b32d9916020e211deeec1ef464cf4e4824 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 14 Aug 2026 14:52:29 -0700 Subject: [PATCH 103/271] Merge branch 'main' into copilot/loop-action (#62) From 1ff4772e764a44ac1f953c8a84007b94a62ac9e3 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 14 Aug 2026 14:52:48 -0700 Subject: [PATCH 104/271] Merge branch 'main' into copilot/loop-action (#62) (#63) --- CHANGELOG.md | 1 + CONTRIBUTING.md | 41 +++++++++++++++++++++++++++++++++++++++++ README.md | 2 +- 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cfb3a06d..2896a4fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,3 +9,4 @@ All notable changes to this project will be documented in this file. - Added architecture documentation in `docs/ARCHITECTURE.md`. - Added contribution guidelines in `CONTRIBUTING.md`. - Improved `README.md` with architecture, dependency graph, and documentation links. +- Added repository research and agent workflow guidance to `CONTRIBUTING.md`. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1f9c2b44..0e562b86 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -27,6 +27,47 @@ swift test - [ ] Tests pass locally (`swift test`) - [ ] README/docs/changelog updated when needed +## Repository Research Plan + +When working in this repository, start by identifying the layer and capability you are changing before touching code. + +1. Map the affected API surface: + - `Sources/CoreMI` + - `Sources/LargeLanguageModels` + - `Sources/AI` + - the specific provider target under `Sources/` +2. Inventory shared abstractions and extension points involved in the change: + - request handling + - model identifiers + - chat/completions + - embeddings + - audio, file, structured output, and tool-calling support +3. Compare provider parity for that capability to avoid introducing one-off patterns. +4. Audit the relevant tests under `Tests/` by capability as well as by provider. +5. Update docs when package products, imports, architecture, or behavior change. +6. Run `swift test` for code changes and record any notable validation steps in the pull request. + +## Agent / Workflow Roles + +Use focused ownership when splitting work across contributors or automation: + +- **Architecture**: owns module boundaries, `Package.swift`, and `docs/ARCHITECTURE.md`. +- **Core abstractions**: owns `CoreMI` and `LargeLanguageModels` protocols, shared request/response behavior, and compatibility across providers. +- **Provider**: owns one provider target at a time and aligns provider-specific APIs with shared abstractions. +- **Test**: expands coverage in `Tests/`, adds reusable fixtures/helpers, and verifies `swift test`. +- **Docs**: keeps `README.md`, `CONTRIBUTING.md`, `docs/ARCHITECTURE.md`, and `CHANGELOG.md` aligned with code changes. +- **Release / governance**: checks change scope, public API impact, dependency layering, and pull request hygiene. + +Recommended workflow: + +1. Scope work to one layer or one provider. +2. Review architecture or shared abstraction impact first. +3. Implement the provider or core change. +4. Update tests for behavior changes. +5. Update docs for API, product, or architecture changes. +6. Run `swift test`. +7. Review for consistency with neighboring providers before merging. + ## Reporting Issues When filing a bug, include: diff --git a/README.md b/README.md index 388e6c54..abb9f56b 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -> [!IMPORTANT] +> πŸ•΄οΈ[!IMPORTANT] > This package is presently in its alpha stage of development (2026-03-04). #### Supported Platforms From 4b8200c29e3c2d3d89c3eca00c53a82a6917b1f4 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 14 Aug 2026 14:53:16 -0700 Subject: [PATCH 105/271] Document package architecture, dependency graph, and contribution workflow (#50) (#57) (#64) From c577827d334aa9ce7cac045bfab2ebaef810db27 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 14 Aug 2026 14:53:48 -0700 Subject: [PATCH 106/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) From c02cd87a7bc784daa7b2d86ba66664b189314603 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 14 Aug 2026 14:54:36 -0700 Subject: [PATCH 107/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#68) --- CHANGELOG.md | 1 + CONTRIBUTING.md | 41 +++++++++++++++++++++++++++++++++++++++++ README.md | 2 +- 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cfb3a06d..2896a4fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,3 +9,4 @@ All notable changes to this project will be documented in this file. - Added architecture documentation in `docs/ARCHITECTURE.md`. - Added contribution guidelines in `CONTRIBUTING.md`. - Improved `README.md` with architecture, dependency graph, and documentation links. +- Added repository research and agent workflow guidance to `CONTRIBUTING.md`. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1f9c2b44..0e562b86 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -27,6 +27,47 @@ swift test - [ ] Tests pass locally (`swift test`) - [ ] README/docs/changelog updated when needed +## Repository Research Plan + +When working in this repository, start by identifying the layer and capability you are changing before touching code. + +1. Map the affected API surface: + - `Sources/CoreMI` + - `Sources/LargeLanguageModels` + - `Sources/AI` + - the specific provider target under `Sources/` +2. Inventory shared abstractions and extension points involved in the change: + - request handling + - model identifiers + - chat/completions + - embeddings + - audio, file, structured output, and tool-calling support +3. Compare provider parity for that capability to avoid introducing one-off patterns. +4. Audit the relevant tests under `Tests/` by capability as well as by provider. +5. Update docs when package products, imports, architecture, or behavior change. +6. Run `swift test` for code changes and record any notable validation steps in the pull request. + +## Agent / Workflow Roles + +Use focused ownership when splitting work across contributors or automation: + +- **Architecture**: owns module boundaries, `Package.swift`, and `docs/ARCHITECTURE.md`. +- **Core abstractions**: owns `CoreMI` and `LargeLanguageModels` protocols, shared request/response behavior, and compatibility across providers. +- **Provider**: owns one provider target at a time and aligns provider-specific APIs with shared abstractions. +- **Test**: expands coverage in `Tests/`, adds reusable fixtures/helpers, and verifies `swift test`. +- **Docs**: keeps `README.md`, `CONTRIBUTING.md`, `docs/ARCHITECTURE.md`, and `CHANGELOG.md` aligned with code changes. +- **Release / governance**: checks change scope, public API impact, dependency layering, and pull request hygiene. + +Recommended workflow: + +1. Scope work to one layer or one provider. +2. Review architecture or shared abstraction impact first. +3. Implement the provider or core change. +4. Update tests for behavior changes. +5. Update docs for API, product, or architecture changes. +6. Run `swift test`. +7. Review for consistency with neighboring providers before merging. + ## Reporting Issues When filing a bug, include: diff --git a/README.md b/README.md index 388e6c54..abb9f56b 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -> [!IMPORTANT] +> πŸ•΄οΈ[!IMPORTANT] > This package is presently in its alpha stage of development (2026-03-04). #### Supported Platforms From cf92b7fd2b69e6463e743b49b167a702f873a913 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 14 Aug 2026 14:55:14 -0700 Subject: [PATCH 108/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#70) --- .github/PULL_REQUEST_TEMPLATE.md | 31 +++ CHANGELOG.md | 12 ++ CONTRIBUTING.md | 78 +++++++ README.md | 335 +++++++++++++++++++++++++++---- docs/ARCHITECTURE.md | 100 +++++++++ docs/README.md | 31 +++ 6 files changed, 553 insertions(+), 34 deletions(-) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 CHANGELOG.md create mode 100644 CONTRIBUTING.md create mode 100644 docs/ARCHITECTURE.md create mode 100644 docs/README.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..7dfe0424 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,31 @@ +## Summary + + + +## Type of change + +- [ ] Bug fix +- [ ] New provider / API surface +- [ ] Refactor +- [ ] Documentation +- [ ] Tests / CI +- [ ] Other + +## Checklist + +- [ ] Builds with the package’s supported Xcode/Swift versions +- [ ] Tests added or updated when behavior changes +- [ ] No secrets or API keys committed +- [ ] Docs updated if products, targets, public API, or dependencies changed: + - [ ] `README.md` + - [ ] `docs/ARCHITECTURE.md` (graph / tables) + - [ ] `CHANGELOG.md` (`[Unreleased]`) +- [ ] Layering respected (providers β†’ `LargeLanguageModels` β†’ `CoreMI`; avoid new providerβ†’provider deps) + +## Test plan + + + +## Related issues + + diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..2896a4fd --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,12 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +## [Unreleased] + +### Added + +- Added architecture documentation in `docs/ARCHITECTURE.md`. +- Added contribution guidelines in `CONTRIBUTING.md`. +- Improved `README.md` with architecture, dependency graph, and documentation links. +- Added repository research and agent workflow guidance to `CONTRIBUTING.md`. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..0e562b86 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,78 @@ +# Contributing + +Thanks for contributing to AI. + +## Prerequisites + +- Xcode 15.4+ (Swift 5.10 toolchain) +- Apple platform SDKs supported by this package + +## Getting Started + +1. Fork the repository and create a feature branch. +2. Make focused changes with clear commit messages. +3. Run tests locally: + +```bash +swift test +``` + +4. Update documentation when behavior, APIs, or architecture changes. +5. Open a pull request with a clear summary and test notes. + +## Pull Request Checklist + +- [ ] Changes are scoped to one topic +- [ ] Public API changes are documented +- [ ] Tests pass locally (`swift test`) +- [ ] README/docs/changelog updated when needed + +## Repository Research Plan + +When working in this repository, start by identifying the layer and capability you are changing before touching code. + +1. Map the affected API surface: + - `Sources/CoreMI` + - `Sources/LargeLanguageModels` + - `Sources/AI` + - the specific provider target under `Sources/` +2. Inventory shared abstractions and extension points involved in the change: + - request handling + - model identifiers + - chat/completions + - embeddings + - audio, file, structured output, and tool-calling support +3. Compare provider parity for that capability to avoid introducing one-off patterns. +4. Audit the relevant tests under `Tests/` by capability as well as by provider. +5. Update docs when package products, imports, architecture, or behavior change. +6. Run `swift test` for code changes and record any notable validation steps in the pull request. + +## Agent / Workflow Roles + +Use focused ownership when splitting work across contributors or automation: + +- **Architecture**: owns module boundaries, `Package.swift`, and `docs/ARCHITECTURE.md`. +- **Core abstractions**: owns `CoreMI` and `LargeLanguageModels` protocols, shared request/response behavior, and compatibility across providers. +- **Provider**: owns one provider target at a time and aligns provider-specific APIs with shared abstractions. +- **Test**: expands coverage in `Tests/`, adds reusable fixtures/helpers, and verifies `swift test`. +- **Docs**: keeps `README.md`, `CONTRIBUTING.md`, `docs/ARCHITECTURE.md`, and `CHANGELOG.md` aligned with code changes. +- **Release / governance**: checks change scope, public API impact, dependency layering, and pull request hygiene. + +Recommended workflow: + +1. Scope work to one layer or one provider. +2. Review architecture or shared abstraction impact first. +3. Implement the provider or core change. +4. Update tests for behavior changes. +5. Update docs for API, product, or architecture changes. +6. Run `swift test`. +7. Review for consistency with neighboring providers before merging. + +## Reporting Issues + +When filing a bug, include: + +- Steps to reproduce +- Expected vs actual behavior +- Platform and Xcode/Swift versions +- Relevant logs or sample payloads diff --git a/README.md b/README.md index cf435eff..abb9f56b 100644 --- a/README.md +++ b/README.md @@ -1,68 +1,100 @@ -> [!IMPORTANT] +> πŸ•΄οΈ[!IMPORTANT] > This package is presently in its alpha stage of development (2026-03-04). ---- +#### Supported Platforms - +SPM platforms from [`Package.swift`](Package.swift): **iOS 16+**, **macOS 13+**, **tvOS 16+**, **visionOS 1+**, **watchOS 9+**. -#### Supported Platforms

- macos + macOS   - macos + iOS   - macos + iPadOS   - macos + tvOS   - macos + watchOS

+Also targets **visionOS** (badge art not yet in `Images/`). + # AI The definitive, open-source Swift framework for interfacing with generative AI. -[Installation](#installation)\ -[Usage](#usage) - -* [Import the framework](#import-the-framework) -* [Initialize an AI Client](#initialize-an-ai-client) -* [LLM Clients Abstraction](#llm-clients-abstraction) -* [Supported Models](#supported-models) -* [Completions](#completions) - * [Basic Completions](#basic-completions) - * [Vision: Image-to-Text](#vision-image-to-text) - * [Function Calling](#function-calling) -* [DALLE-3 Image Generation](#dalle-3-image-generation) -* [Audio](#audio) - * [Audio Transcription: Whisper](#audio-transcription-whisper) - * [Audio Generation: OpenAI](#audio-generation-openai) - * [Audio Generation: ElevenLabs](#audio-generation-elevenlabs) -* [Text Embeddings](#text-embeddings) - -[Roadmap](#roadmap) \ -[Acknowledgements](#acknowledgements) \ -[License](#license) +## Documentation + +- [Architecture](docs/ARCHITECTURE.md) +- [Contributing](CONTRIBUTING.md) +- [Changelog](CHANGELOG.md) + +## Table of Contents + +- [Architecture Overview](#architecture-overview) +- [Dependencies](#dependencies) +- [Installation](#installation) +- [Usage](#usage) + - [Import the framework](#import-the-framework) + - [Initialize an AI Client](#initialize-an-ai-client) + - [LLM Clients Abstraction](#llm-clients-abstraction) + - [Supported Models](#supported-models) + - [Completions](#completions) + - [Basic Completions](#basic-completions) + - [Vision: Image-to-Text](#vision-image-to-text) + - [Function Calling](#function-calling) + - [DALLE-3 Image Generation](#dalle-3-image-generation) + - [Audio](#audio) + - [Audio Transcription: Whisper](#audio-transcription-whisper) + - [Audio Generation: OpenAI](#audio-generation-openai) + - [Audio Generation: ElevenLabs](#audio-generation-elevenlabs) + - [Text Embeddings](#text-embeddings) +- [Roadmap](#roadmap) +- [Acknowledgements](#acknowledgements) +- [License](#license) + +## Architecture Overview + +This package is organized as a Swift Package Manager workspace with layered modules: + +- `CoreMI` provides shared core abstractions used across providers. +- `LargeLanguageModels` builds common LLM request/response functionality on top of `CoreMI`. +- Provider modules (`OpenAI`, `Anthropic`, `Mistral`, `Groq`, `ElevenLabs`, etc.) implement vendor-specific APIs. +- `AI` is the umbrella product that re-exports the main modules for one-stop integration. + +### Component Dependency Graph + +A full dependency graph generated from `Package.swift` target dependencies is available in [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md#component-dependency-graph). + +## Dependencies + +External package dependencies declared in `Package.swift`: + +- [`CorePersistence`](https://github.com/vmanot/CorePersistence) +- [`Merge`](https://github.com/vmanot/Merge) +- [`NetworkKit`](https://github.com/vmanot/NetworkKit) +- [`Swallow`](https://github.com/vmanot/Swallow) +- [`SwiftUIX`](https://github.com/SwiftUIX/SwiftUIX) # Installation @@ -74,6 +106,179 @@ The definitive, open-source Swift framework for interfacing with generative AI. 4. Choose the version you'd like to install. 5. Click `Add Package`. +Or add the dependency in `Package.swift`: + +```swift +dependencies: [ + .package(url: "https://github.com/PreternaturalAI/AI.git", branch: "main") +] +``` + +Then link the `AI` product (umbrella) or a standalone product such as `OpenAI`, `Anthropic`, or `Perplexity` (see [Architecture](#architecture)). + +# Architecture + +The package is organized in layers. Provider SDKs implement shared protocols (`LLMRequestHandling`, embeddings, TTS, and so on) defined in the core modules. + +| Layer | Modules | Responsibility | +|-------|---------|----------------| +| Umbrella module | `AI` | `@_exported` re-exports **CoreMI**, **LargeLanguageModels**, **OpenAI** (and Swallow macros client). Other bundled modules still need their own `import`. | +| Umbrella product | `AI` library | SPM product that **links** core + Anthropic, Cohere, ElevenLabs, Groq, HuggingFace, Jina, Mistral, Ollama, OpenAI, and the `AI` module | +| Providers | `OpenAI`, `Anthropic`, `Mistral`, `Groq`, `Ollama`, `Perplexity`, `Cohere`, `Jina`, `VoyageAI`, `TogetherAI`, `ElevenLabs`, `PlayHT`, `Rime`, `HumeAI`, `NeetsAI`, `_Gemini`, `HuggingFace`, … | API clients and model types | +| LLM abstractions | `LargeLanguageModels` | `AbstractLLM`, `PromptLiteral`, chat/function-calling, embeddings protocols | +| Foundations | `CoreMI` | Request handling, model identifiers, service credentials, ASR/TTS bases | +| External | Swallow, Merge, NetworkKit, CorePersistence, SwiftUIX | Shared infrastructure (see [Dependencies](#dependencies)) | + +`import AI` is enough for OpenAI + shared LLM types. For other clients linked by the product, add e.g. `import Anthropic` or `import Groq`. Providers shipped only as standalone products (`Perplexity`, `_Gemini`, `VoyageAI`, …) require linking that product. + +### Component dependency graph + +Graph of **package targets** as declared in [`Package.swift`](Package.swift) (external packages shown once at the bottom). For products, tests, and design notes, see **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)**. + +```mermaid +flowchart TB + subgraph umbrella [Umbrella] + AI + end + + subgraph providers [Provider targets] + OpenAI + Anthropic + Mistral + Groq + Ollama + Perplexity + Cohere + Jina + VoyageAI + TogetherAI + ElevenLabs + PlayHT + Rime + HumeAI + NeetsAI + Gemini["_Gemini"] + HuggingFace + end + + subgraph core [Core targets] + LargeLanguageModels + CoreMI + end + + subgraph external [External packages] + Swallow + Merge + NetworkKit + CorePersistence + SwiftUIX + end + + AI --> CoreMI + AI --> LargeLanguageModels + AI --> OpenAI + AI --> Anthropic + AI --> Mistral + AI --> Groq + AI --> Ollama + AI --> Cohere + AI --> ElevenLabs + AI --> HuggingFace + AI --> Jina + + OpenAI --> LargeLanguageModels + Anthropic --> LargeLanguageModels + Mistral --> LargeLanguageModels + Groq --> LargeLanguageModels + Ollama --> LargeLanguageModels + Perplexity --> LargeLanguageModels + Perplexity --> OpenAI + Cohere --> LargeLanguageModels + Jina --> LargeLanguageModels + VoyageAI --> LargeLanguageModels + TogetherAI --> LargeLanguageModels + ElevenLabs --> LargeLanguageModels + PlayHT --> LargeLanguageModels + Rime --> LargeLanguageModels + HumeAI --> LargeLanguageModels + NeetsAI --> LargeLanguageModels + Gemini --> LargeLanguageModels + HuggingFace --> CoreMI + + LargeLanguageModels --> CoreMI + LargeLanguageModels --> CorePersistence + LargeLanguageModels --> Merge + LargeLanguageModels --> NetworkKit + LargeLanguageModels --> Swallow + LargeLanguageModels --> SwiftUIX + + CoreMI --> CorePersistence + CoreMI --> Merge + CoreMI --> Swallow +``` + +**Notes** + +- Most providers also depend on `CoreMI`, `CorePersistence`, `Merge`, `NetworkKit`, and `Swallow` directly (edges omitted above for readability where they already flow through `LargeLanguageModels`). +- **OpenAI** and **Anthropic** depend on `LargeLanguageModels` + networking stack, not on `CoreMI` directly in `Package.swift`. +- **Perplexity** is the only provider that depends on another provider target (`OpenAI`). +- **HuggingFace** depends on `CoreMI` + `Swallow` only (hub/tokenizer helpers, not the full LLM stack). +- The `AI` **product** does **not** link every target (for example `_Gemini`, `Perplexity`, `PlayHT`, `Rime`, `TogetherAI`, `VoyageAI`, `HumeAI`, `NeetsAI` are separate products). +- The `AI` **module** re-exports only CoreMI, LargeLanguageModels, and OpenAI among first-party modules (`Sources/AI/module.swift`). + +### Protocol capabilities (from source) + +Which shared protocols have an explicit client conformance today: + +| Target | `LLMRequestHandling` | `TextEmbeddingsRequestHandling` | Notes | +|--------|:--------------------:|:-------------------------------:|-------| +| OpenAI | yes | yes | Also images, Whisper, speech, assistants | +| Anthropic | yes | | | +| Mistral | yes | yes | | +| Groq | yes | | | +| Ollama | yes | | | +| Perplexity | yes | | Depends on OpenAI target | +| Cohere | | yes | | +| Jina | | yes | | +| VoyageAI | | yes | | +| TogetherAI, ElevenLabs, PlayHT, Rime, HumeAI, NeetsAI, _Gemini, HuggingFace | | | Provider-specific client APIs / hub helpers (see `Sources/`) | + +Full layering detail: **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)**. Docs index: **[docs/README.md](docs/README.md)**. + +# Dependencies + +### External Swift packages + +| Package | Repository | Role | +|---------|------------|------| +| Swallow | [vmanot/Swallow](https://github.com/vmanot/Swallow) | Extensions, macros client, diagnostics | +| Merge | [vmanot/Merge](https://github.com/vmanot/Merge) | Concurrency / async utilities | +| NetworkKit | [vmanot/NetworkKit](https://github.com/vmanot/NetworkKit) | HTTP client & API specifications | +| CorePersistence | [vmanot/CorePersistence](https://github.com/vmanot/CorePersistence) | Persistence & schema helpers (e.g. JSONSchema) | +| SwiftUIX | [SwiftUIX/SwiftUIX](https://github.com/SwiftUIX/SwiftUIX) | SwiftUI extensions | + +Transitive pins (see [`Package.resolved`](Package.resolved)) include **SwiftAPI**, **swift-collections**, and **swift-syntax**. + +### SPM products you can link + +Exact product names from `Package.swift`: + +| Product | Targets exposed | Use when | +|---------|-----------------|----------| +| `AI` | CoreMI, LargeLanguageModels, Anthropic, Cohere, ElevenLabs, Groq, HuggingFace, Jina, Mistral, Ollama, OpenAI, AI | Default multi-provider app dependency | +| `OpenAI` | OpenAI | OpenAI-only | +| `Anthropic` | Anthropic | Anthropic-only | +| `Perplexity` | Perplexity | Perplexity (pulls OpenAI transitively) | +| `TogetherAI` | TogetherAI | Together AI | +| `VoyageAI` | VoyageAI | Voyage embeddings | +| `PlayHT` | PlayHT | PlayHT voice | +| `Rime` | Rime | Rime voice | +| `HumeAI` | HumeAI | Hume | +| `NeetsAI` | NeetsAI | Neets | +| `_Gemini` | _Gemini | Google Gemini client | + +There is **no** standalone SPM product today for `CoreMI`, `LargeLanguageModels`, `Cohere`, `Groq`, `HuggingFace`, `Jina`, `Mistral`, `Ollama`, or `ElevenLabs` β€” consume them via the `AI` product (or add a product in `Package.swift` if you need a leaner slice). + # Usage ## Import the framework @@ -551,14 +756,76 @@ let embeddings = try await LLMManager.client.textEmbeddings( return embeddings.data.first?.embedding.description ``` +# Documentation + +| Document | Contents | +|----------|----------| +| **[docs/README.md](docs/README.md)** | Documentation index | +| **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)** | Full architecture, products vs targets, Mermaid graph, protocol matrix, tests | +| **[CONTRIBUTING.md](CONTRIBUTING.md)** | Dev setup, coding guidelines, how to add a provider | +| **[CHANGELOG.md](CHANGELOG.md)** | Release notes and unreleased changes | +| **[LICENSE](LICENSE)** | MIT License text | + +API behavior is illustrated in the [Usage](#usage) sections above; protocol details live in `Sources/LargeLanguageModels` and `Sources/CoreMI`. + # Roadmap -- [x] OpenAI +Status reflects modules present in this repository (`Sources/` + `Package.swift`). Checked items ship as package targets; depth of feature coverage varies by provider. + +### Core + +- [x] `CoreMI` β€” request handling, model identifiers, services, ASR/TTS foundations +- [x] `LargeLanguageModels` β€” `AbstractLLM`, prompts, function calling, embeddings protocols +- [x] `AI` umbrella product + +### LLM & multimodal providers + +- [x] OpenAI (chat, vision, tools, images, Whisper, speech) - [x] Anthropic - [x] Mistral +- [x] Groq - [x] Ollama -- [ ] Perplexity -- [ ] Groq +- [x] Perplexity +- [x] TogetherAI +- [x] `_Gemini` (Google Gemini client; standalone product) +- [ ] Broader parity matrix (streaming, tools, vision) across every LLM provider + +### Embeddings & hub + +- [x] OpenAI embeddings +- [x] Cohere +- [x] Jina +- [x] VoyageAI +- [x] Hugging Face hub helpers / tokenizer resources + +### Voice & speech + +- [x] ElevenLabs +- [x] PlayHT +- [x] Rime +- [x] HumeAI +- [x] NeetsAI +- [x] OpenAI TTS / Whisper + +### Project hygiene + +- [x] Architecture & dependency documentation +- [x] Contributing guide, docs index, PR template & changelog +- [ ] Register missing test targets (Ollama, Rime, TogetherAI folder) +- [ ] visionOS badge artwork under `Images/` +- [ ] Tagged semantic releases with automated changelog sections + +# Contributing + +Contributions are welcome. Please read **[CONTRIBUTING.md](CONTRIBUTING.md)** for: + +- Environment and build requirements +- PR expectations and testing notes +- Steps to add or extend a provider without breaking layering rules + +# Changelog + +See **[CHANGELOG.md](CHANGELOG.md)** for user-visible changes. The package is in **alpha**; expect API evolution between releases. # Acknowledgements @@ -567,4 +834,4 @@ return embeddings.data.first?.embedding.description # License -This package is licensed under the MIT License. +This package is licensed under the [MIT License](LICENSE). diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md new file mode 100644 index 00000000..913a99c8 --- /dev/null +++ b/docs/ARCHITECTURE.md @@ -0,0 +1,100 @@ +# Architecture + +This document summarizes the package architecture as defined in `Package.swift`. + +## Module Layers + +1. **Core layer** + - `CoreMI` +2. **LLM abstraction layer** + - `LargeLanguageModels` +3. **Provider layer** + - `Anthropic`, `Cohere`, `ElevenLabs`, `Groq`, `HuggingFace`, `HumeAI`, `Jina`, `Mistral`, `NeetsAI`, `Ollama`, `OpenAI`, `Perplexity`, `PlayHT`, `Rime`, `TogetherAI`, `VoyageAI`, `_Gemini` +4. **Umbrella layer** + - `AI` + +## Component Dependency Graph + +In this graph, `CorePersistence`, `Merge`, `NetworkKit`, `Swallow`, and `SwiftUIX` are external package dependencies (not targets in this repository). + +```mermaid +graph TD + CoreMI --> CorePersistence + CoreMI --> Merge + CoreMI --> Swallow + + LargeLanguageModels --> CoreMI + LargeLanguageModels --> CorePersistence + LargeLanguageModels --> Merge + LargeLanguageModels --> NetworkKit + LargeLanguageModels --> Swallow + LargeLanguageModels --> SwiftUIX + + Anthropic --> LargeLanguageModels + OpenAI --> LargeLanguageModels + HuggingFace --> CoreMI + HuggingFace --> Swallow + + Cohere --> CoreMI + Cohere --> LargeLanguageModels + ElevenLabs --> CoreMI + ElevenLabs --> LargeLanguageModels + Groq --> CoreMI + Groq --> LargeLanguageModels + HumeAI --> CoreMI + HumeAI --> LargeLanguageModels + Jina --> CoreMI + Jina --> LargeLanguageModels + Mistral --> CoreMI + Mistral --> LargeLanguageModels + NeetsAI --> CoreMI + NeetsAI --> LargeLanguageModels + Ollama --> CoreMI + Ollama --> LargeLanguageModels + PlayHT --> CoreMI + PlayHT --> LargeLanguageModels + Rime --> CoreMI + Rime --> LargeLanguageModels + TogetherAI --> CoreMI + TogetherAI --> LargeLanguageModels + VoyageAI --> CoreMI + VoyageAI --> LargeLanguageModels + _Gemini --> CoreMI + _Gemini --> LargeLanguageModels + + Perplexity --> OpenAI + Perplexity --> CoreMI + Perplexity --> LargeLanguageModels + + AI --> CoreMI + AI --> LargeLanguageModels + AI --> Anthropic + AI --> Cohere + AI --> ElevenLabs + AI --> Groq + AI --> HuggingFace + AI --> Jina + AI --> Mistral + AI --> Ollama + AI --> OpenAI + + AI -. standalone product .-> HumeAI + AI -. standalone product .-> NeetsAI + AI -. standalone product .-> Perplexity + AI -. standalone product .-> PlayHT + AI -. standalone product .-> Rime + AI -. standalone product .-> TogetherAI + AI -. standalone product .-> VoyageAI + AI -. standalone product .-> _Gemini +``` +> Note: The `AI` umbrella target currently depends on `CoreMI`, `LargeLanguageModels`, `Anthropic`, `Cohere`, `ElevenLabs`, `Groq`, `HuggingFace`, `Jina`, `Mistral`, `Ollama`, and `OpenAI`. Other provider modules in this repository are distributed as standalone products and are not re-exported by `AI` in `Package.swift`. + +> Note: `HuggingFace` intentionally differs from most provider modules: in `Package.swift` it depends on `CoreMI` and `Swallow`, and does not depend on `LargeLanguageModels`. + +## External Dependencies + +- `CorePersistence` +- `Merge` +- `NetworkKit` +- `Swallow` +- `SwiftUIX` diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000..5e24f4c9 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,31 @@ +# Documentation + +Guides for the **AI** Swift package ([PreternaturalAI/AI](https://github.com/PreternaturalAI/AI)). + +| Document | Audience | Description | +|----------|----------|-------------| +| [../README.md](../README.md) | Everyone | Install, usage examples, architecture summary, dependency graph, roadmap | +| [ARCHITECTURE.md](ARCHITECTURE.md) | Contributors & integrators | Layers, products vs targets, Mermaid graphs, protocol matrix, tests | +| [../CONTRIBUTING.md](../CONTRIBUTING.md) | Contributors | Setup, PR process, adding providers | +| [../CHANGELOG.md](../CHANGELOG.md) | Everyone | Notable changes | +| [../LICENSE](../LICENSE) | Everyone | MIT | + +## Quick orientation + +```text +Package.swift products, targets, external deps +Sources/CoreMI foundations (requests, model IDs, services) +Sources/LargeLanguageModels AbstractLLM, prompts, embeddings protocols +Sources/ vendor clients +Sources/AI umbrella module (selective @_exported imports) +Tests/ parallel test targets (see ARCHITECTURE.md for gaps) +docs/ long-form documentation (this folder) +``` + +## Keeping docs honest + +When you change `Package.swift` or add a provider: + +1. Update the dependency graph and tables in [ARCHITECTURE.md](ARCHITECTURE.md). +2. Mirror user-facing bits in [../README.md](../README.md) (products, roadmap, import notes). +3. Note the change under `[Unreleased]` in [../CHANGELOG.md](../CHANGELOG.md). From 51e480c9b3d021f4a67113330f57c37800ab3182 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 14 Aug 2026 14:56:29 -0700 Subject: [PATCH 109/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#74) From b00703d316c708a24cf03f0da900566062e13d9a Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 14 Aug 2026 14:56:47 -0700 Subject: [PATCH 110/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#75) --- .github/PULL_REQUEST_TEMPLATE.md | 31 +++ CHANGELOG.md | 12 ++ CONTRIBUTING.md | 78 +++++++ README.md | 335 +++++++++++++++++++++++++++---- docs/ARCHITECTURE.md | 100 +++++++++ docs/README.md | 31 +++ 6 files changed, 553 insertions(+), 34 deletions(-) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 CHANGELOG.md create mode 100644 CONTRIBUTING.md create mode 100644 docs/ARCHITECTURE.md create mode 100644 docs/README.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..7dfe0424 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,31 @@ +## Summary + + + +## Type of change + +- [ ] Bug fix +- [ ] New provider / API surface +- [ ] Refactor +- [ ] Documentation +- [ ] Tests / CI +- [ ] Other + +## Checklist + +- [ ] Builds with the package’s supported Xcode/Swift versions +- [ ] Tests added or updated when behavior changes +- [ ] No secrets or API keys committed +- [ ] Docs updated if products, targets, public API, or dependencies changed: + - [ ] `README.md` + - [ ] `docs/ARCHITECTURE.md` (graph / tables) + - [ ] `CHANGELOG.md` (`[Unreleased]`) +- [ ] Layering respected (providers β†’ `LargeLanguageModels` β†’ `CoreMI`; avoid new providerβ†’provider deps) + +## Test plan + + + +## Related issues + + diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..2896a4fd --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,12 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +## [Unreleased] + +### Added + +- Added architecture documentation in `docs/ARCHITECTURE.md`. +- Added contribution guidelines in `CONTRIBUTING.md`. +- Improved `README.md` with architecture, dependency graph, and documentation links. +- Added repository research and agent workflow guidance to `CONTRIBUTING.md`. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..0e562b86 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,78 @@ +# Contributing + +Thanks for contributing to AI. + +## Prerequisites + +- Xcode 15.4+ (Swift 5.10 toolchain) +- Apple platform SDKs supported by this package + +## Getting Started + +1. Fork the repository and create a feature branch. +2. Make focused changes with clear commit messages. +3. Run tests locally: + +```bash +swift test +``` + +4. Update documentation when behavior, APIs, or architecture changes. +5. Open a pull request with a clear summary and test notes. + +## Pull Request Checklist + +- [ ] Changes are scoped to one topic +- [ ] Public API changes are documented +- [ ] Tests pass locally (`swift test`) +- [ ] README/docs/changelog updated when needed + +## Repository Research Plan + +When working in this repository, start by identifying the layer and capability you are changing before touching code. + +1. Map the affected API surface: + - `Sources/CoreMI` + - `Sources/LargeLanguageModels` + - `Sources/AI` + - the specific provider target under `Sources/` +2. Inventory shared abstractions and extension points involved in the change: + - request handling + - model identifiers + - chat/completions + - embeddings + - audio, file, structured output, and tool-calling support +3. Compare provider parity for that capability to avoid introducing one-off patterns. +4. Audit the relevant tests under `Tests/` by capability as well as by provider. +5. Update docs when package products, imports, architecture, or behavior change. +6. Run `swift test` for code changes and record any notable validation steps in the pull request. + +## Agent / Workflow Roles + +Use focused ownership when splitting work across contributors or automation: + +- **Architecture**: owns module boundaries, `Package.swift`, and `docs/ARCHITECTURE.md`. +- **Core abstractions**: owns `CoreMI` and `LargeLanguageModels` protocols, shared request/response behavior, and compatibility across providers. +- **Provider**: owns one provider target at a time and aligns provider-specific APIs with shared abstractions. +- **Test**: expands coverage in `Tests/`, adds reusable fixtures/helpers, and verifies `swift test`. +- **Docs**: keeps `README.md`, `CONTRIBUTING.md`, `docs/ARCHITECTURE.md`, and `CHANGELOG.md` aligned with code changes. +- **Release / governance**: checks change scope, public API impact, dependency layering, and pull request hygiene. + +Recommended workflow: + +1. Scope work to one layer or one provider. +2. Review architecture or shared abstraction impact first. +3. Implement the provider or core change. +4. Update tests for behavior changes. +5. Update docs for API, product, or architecture changes. +6. Run `swift test`. +7. Review for consistency with neighboring providers before merging. + +## Reporting Issues + +When filing a bug, include: + +- Steps to reproduce +- Expected vs actual behavior +- Platform and Xcode/Swift versions +- Relevant logs or sample payloads diff --git a/README.md b/README.md index cf435eff..abb9f56b 100644 --- a/README.md +++ b/README.md @@ -1,68 +1,100 @@ -> [!IMPORTANT] +> πŸ•΄οΈ[!IMPORTANT] > This package is presently in its alpha stage of development (2026-03-04). ---- +#### Supported Platforms - +SPM platforms from [`Package.swift`](Package.swift): **iOS 16+**, **macOS 13+**, **tvOS 16+**, **visionOS 1+**, **watchOS 9+**. -#### Supported Platforms

- macos + macOS   - macos + iOS   - macos + iPadOS   - macos + tvOS   - macos + watchOS

+Also targets **visionOS** (badge art not yet in `Images/`). + # AI The definitive, open-source Swift framework for interfacing with generative AI. -[Installation](#installation)\ -[Usage](#usage) - -* [Import the framework](#import-the-framework) -* [Initialize an AI Client](#initialize-an-ai-client) -* [LLM Clients Abstraction](#llm-clients-abstraction) -* [Supported Models](#supported-models) -* [Completions](#completions) - * [Basic Completions](#basic-completions) - * [Vision: Image-to-Text](#vision-image-to-text) - * [Function Calling](#function-calling) -* [DALLE-3 Image Generation](#dalle-3-image-generation) -* [Audio](#audio) - * [Audio Transcription: Whisper](#audio-transcription-whisper) - * [Audio Generation: OpenAI](#audio-generation-openai) - * [Audio Generation: ElevenLabs](#audio-generation-elevenlabs) -* [Text Embeddings](#text-embeddings) - -[Roadmap](#roadmap) \ -[Acknowledgements](#acknowledgements) \ -[License](#license) +## Documentation + +- [Architecture](docs/ARCHITECTURE.md) +- [Contributing](CONTRIBUTING.md) +- [Changelog](CHANGELOG.md) + +## Table of Contents + +- [Architecture Overview](#architecture-overview) +- [Dependencies](#dependencies) +- [Installation](#installation) +- [Usage](#usage) + - [Import the framework](#import-the-framework) + - [Initialize an AI Client](#initialize-an-ai-client) + - [LLM Clients Abstraction](#llm-clients-abstraction) + - [Supported Models](#supported-models) + - [Completions](#completions) + - [Basic Completions](#basic-completions) + - [Vision: Image-to-Text](#vision-image-to-text) + - [Function Calling](#function-calling) + - [DALLE-3 Image Generation](#dalle-3-image-generation) + - [Audio](#audio) + - [Audio Transcription: Whisper](#audio-transcription-whisper) + - [Audio Generation: OpenAI](#audio-generation-openai) + - [Audio Generation: ElevenLabs](#audio-generation-elevenlabs) + - [Text Embeddings](#text-embeddings) +- [Roadmap](#roadmap) +- [Acknowledgements](#acknowledgements) +- [License](#license) + +## Architecture Overview + +This package is organized as a Swift Package Manager workspace with layered modules: + +- `CoreMI` provides shared core abstractions used across providers. +- `LargeLanguageModels` builds common LLM request/response functionality on top of `CoreMI`. +- Provider modules (`OpenAI`, `Anthropic`, `Mistral`, `Groq`, `ElevenLabs`, etc.) implement vendor-specific APIs. +- `AI` is the umbrella product that re-exports the main modules for one-stop integration. + +### Component Dependency Graph + +A full dependency graph generated from `Package.swift` target dependencies is available in [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md#component-dependency-graph). + +## Dependencies + +External package dependencies declared in `Package.swift`: + +- [`CorePersistence`](https://github.com/vmanot/CorePersistence) +- [`Merge`](https://github.com/vmanot/Merge) +- [`NetworkKit`](https://github.com/vmanot/NetworkKit) +- [`Swallow`](https://github.com/vmanot/Swallow) +- [`SwiftUIX`](https://github.com/SwiftUIX/SwiftUIX) # Installation @@ -74,6 +106,179 @@ The definitive, open-source Swift framework for interfacing with generative AI. 4. Choose the version you'd like to install. 5. Click `Add Package`. +Or add the dependency in `Package.swift`: + +```swift +dependencies: [ + .package(url: "https://github.com/PreternaturalAI/AI.git", branch: "main") +] +``` + +Then link the `AI` product (umbrella) or a standalone product such as `OpenAI`, `Anthropic`, or `Perplexity` (see [Architecture](#architecture)). + +# Architecture + +The package is organized in layers. Provider SDKs implement shared protocols (`LLMRequestHandling`, embeddings, TTS, and so on) defined in the core modules. + +| Layer | Modules | Responsibility | +|-------|---------|----------------| +| Umbrella module | `AI` | `@_exported` re-exports **CoreMI**, **LargeLanguageModels**, **OpenAI** (and Swallow macros client). Other bundled modules still need their own `import`. | +| Umbrella product | `AI` library | SPM product that **links** core + Anthropic, Cohere, ElevenLabs, Groq, HuggingFace, Jina, Mistral, Ollama, OpenAI, and the `AI` module | +| Providers | `OpenAI`, `Anthropic`, `Mistral`, `Groq`, `Ollama`, `Perplexity`, `Cohere`, `Jina`, `VoyageAI`, `TogetherAI`, `ElevenLabs`, `PlayHT`, `Rime`, `HumeAI`, `NeetsAI`, `_Gemini`, `HuggingFace`, … | API clients and model types | +| LLM abstractions | `LargeLanguageModels` | `AbstractLLM`, `PromptLiteral`, chat/function-calling, embeddings protocols | +| Foundations | `CoreMI` | Request handling, model identifiers, service credentials, ASR/TTS bases | +| External | Swallow, Merge, NetworkKit, CorePersistence, SwiftUIX | Shared infrastructure (see [Dependencies](#dependencies)) | + +`import AI` is enough for OpenAI + shared LLM types. For other clients linked by the product, add e.g. `import Anthropic` or `import Groq`. Providers shipped only as standalone products (`Perplexity`, `_Gemini`, `VoyageAI`, …) require linking that product. + +### Component dependency graph + +Graph of **package targets** as declared in [`Package.swift`](Package.swift) (external packages shown once at the bottom). For products, tests, and design notes, see **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)**. + +```mermaid +flowchart TB + subgraph umbrella [Umbrella] + AI + end + + subgraph providers [Provider targets] + OpenAI + Anthropic + Mistral + Groq + Ollama + Perplexity + Cohere + Jina + VoyageAI + TogetherAI + ElevenLabs + PlayHT + Rime + HumeAI + NeetsAI + Gemini["_Gemini"] + HuggingFace + end + + subgraph core [Core targets] + LargeLanguageModels + CoreMI + end + + subgraph external [External packages] + Swallow + Merge + NetworkKit + CorePersistence + SwiftUIX + end + + AI --> CoreMI + AI --> LargeLanguageModels + AI --> OpenAI + AI --> Anthropic + AI --> Mistral + AI --> Groq + AI --> Ollama + AI --> Cohere + AI --> ElevenLabs + AI --> HuggingFace + AI --> Jina + + OpenAI --> LargeLanguageModels + Anthropic --> LargeLanguageModels + Mistral --> LargeLanguageModels + Groq --> LargeLanguageModels + Ollama --> LargeLanguageModels + Perplexity --> LargeLanguageModels + Perplexity --> OpenAI + Cohere --> LargeLanguageModels + Jina --> LargeLanguageModels + VoyageAI --> LargeLanguageModels + TogetherAI --> LargeLanguageModels + ElevenLabs --> LargeLanguageModels + PlayHT --> LargeLanguageModels + Rime --> LargeLanguageModels + HumeAI --> LargeLanguageModels + NeetsAI --> LargeLanguageModels + Gemini --> LargeLanguageModels + HuggingFace --> CoreMI + + LargeLanguageModels --> CoreMI + LargeLanguageModels --> CorePersistence + LargeLanguageModels --> Merge + LargeLanguageModels --> NetworkKit + LargeLanguageModels --> Swallow + LargeLanguageModels --> SwiftUIX + + CoreMI --> CorePersistence + CoreMI --> Merge + CoreMI --> Swallow +``` + +**Notes** + +- Most providers also depend on `CoreMI`, `CorePersistence`, `Merge`, `NetworkKit`, and `Swallow` directly (edges omitted above for readability where they already flow through `LargeLanguageModels`). +- **OpenAI** and **Anthropic** depend on `LargeLanguageModels` + networking stack, not on `CoreMI` directly in `Package.swift`. +- **Perplexity** is the only provider that depends on another provider target (`OpenAI`). +- **HuggingFace** depends on `CoreMI` + `Swallow` only (hub/tokenizer helpers, not the full LLM stack). +- The `AI` **product** does **not** link every target (for example `_Gemini`, `Perplexity`, `PlayHT`, `Rime`, `TogetherAI`, `VoyageAI`, `HumeAI`, `NeetsAI` are separate products). +- The `AI` **module** re-exports only CoreMI, LargeLanguageModels, and OpenAI among first-party modules (`Sources/AI/module.swift`). + +### Protocol capabilities (from source) + +Which shared protocols have an explicit client conformance today: + +| Target | `LLMRequestHandling` | `TextEmbeddingsRequestHandling` | Notes | +|--------|:--------------------:|:-------------------------------:|-------| +| OpenAI | yes | yes | Also images, Whisper, speech, assistants | +| Anthropic | yes | | | +| Mistral | yes | yes | | +| Groq | yes | | | +| Ollama | yes | | | +| Perplexity | yes | | Depends on OpenAI target | +| Cohere | | yes | | +| Jina | | yes | | +| VoyageAI | | yes | | +| TogetherAI, ElevenLabs, PlayHT, Rime, HumeAI, NeetsAI, _Gemini, HuggingFace | | | Provider-specific client APIs / hub helpers (see `Sources/`) | + +Full layering detail: **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)**. Docs index: **[docs/README.md](docs/README.md)**. + +# Dependencies + +### External Swift packages + +| Package | Repository | Role | +|---------|------------|------| +| Swallow | [vmanot/Swallow](https://github.com/vmanot/Swallow) | Extensions, macros client, diagnostics | +| Merge | [vmanot/Merge](https://github.com/vmanot/Merge) | Concurrency / async utilities | +| NetworkKit | [vmanot/NetworkKit](https://github.com/vmanot/NetworkKit) | HTTP client & API specifications | +| CorePersistence | [vmanot/CorePersistence](https://github.com/vmanot/CorePersistence) | Persistence & schema helpers (e.g. JSONSchema) | +| SwiftUIX | [SwiftUIX/SwiftUIX](https://github.com/SwiftUIX/SwiftUIX) | SwiftUI extensions | + +Transitive pins (see [`Package.resolved`](Package.resolved)) include **SwiftAPI**, **swift-collections**, and **swift-syntax**. + +### SPM products you can link + +Exact product names from `Package.swift`: + +| Product | Targets exposed | Use when | +|---------|-----------------|----------| +| `AI` | CoreMI, LargeLanguageModels, Anthropic, Cohere, ElevenLabs, Groq, HuggingFace, Jina, Mistral, Ollama, OpenAI, AI | Default multi-provider app dependency | +| `OpenAI` | OpenAI | OpenAI-only | +| `Anthropic` | Anthropic | Anthropic-only | +| `Perplexity` | Perplexity | Perplexity (pulls OpenAI transitively) | +| `TogetherAI` | TogetherAI | Together AI | +| `VoyageAI` | VoyageAI | Voyage embeddings | +| `PlayHT` | PlayHT | PlayHT voice | +| `Rime` | Rime | Rime voice | +| `HumeAI` | HumeAI | Hume | +| `NeetsAI` | NeetsAI | Neets | +| `_Gemini` | _Gemini | Google Gemini client | + +There is **no** standalone SPM product today for `CoreMI`, `LargeLanguageModels`, `Cohere`, `Groq`, `HuggingFace`, `Jina`, `Mistral`, `Ollama`, or `ElevenLabs` β€” consume them via the `AI` product (or add a product in `Package.swift` if you need a leaner slice). + # Usage ## Import the framework @@ -551,14 +756,76 @@ let embeddings = try await LLMManager.client.textEmbeddings( return embeddings.data.first?.embedding.description ``` +# Documentation + +| Document | Contents | +|----------|----------| +| **[docs/README.md](docs/README.md)** | Documentation index | +| **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)** | Full architecture, products vs targets, Mermaid graph, protocol matrix, tests | +| **[CONTRIBUTING.md](CONTRIBUTING.md)** | Dev setup, coding guidelines, how to add a provider | +| **[CHANGELOG.md](CHANGELOG.md)** | Release notes and unreleased changes | +| **[LICENSE](LICENSE)** | MIT License text | + +API behavior is illustrated in the [Usage](#usage) sections above; protocol details live in `Sources/LargeLanguageModels` and `Sources/CoreMI`. + # Roadmap -- [x] OpenAI +Status reflects modules present in this repository (`Sources/` + `Package.swift`). Checked items ship as package targets; depth of feature coverage varies by provider. + +### Core + +- [x] `CoreMI` β€” request handling, model identifiers, services, ASR/TTS foundations +- [x] `LargeLanguageModels` β€” `AbstractLLM`, prompts, function calling, embeddings protocols +- [x] `AI` umbrella product + +### LLM & multimodal providers + +- [x] OpenAI (chat, vision, tools, images, Whisper, speech) - [x] Anthropic - [x] Mistral +- [x] Groq - [x] Ollama -- [ ] Perplexity -- [ ] Groq +- [x] Perplexity +- [x] TogetherAI +- [x] `_Gemini` (Google Gemini client; standalone product) +- [ ] Broader parity matrix (streaming, tools, vision) across every LLM provider + +### Embeddings & hub + +- [x] OpenAI embeddings +- [x] Cohere +- [x] Jina +- [x] VoyageAI +- [x] Hugging Face hub helpers / tokenizer resources + +### Voice & speech + +- [x] ElevenLabs +- [x] PlayHT +- [x] Rime +- [x] HumeAI +- [x] NeetsAI +- [x] OpenAI TTS / Whisper + +### Project hygiene + +- [x] Architecture & dependency documentation +- [x] Contributing guide, docs index, PR template & changelog +- [ ] Register missing test targets (Ollama, Rime, TogetherAI folder) +- [ ] visionOS badge artwork under `Images/` +- [ ] Tagged semantic releases with automated changelog sections + +# Contributing + +Contributions are welcome. Please read **[CONTRIBUTING.md](CONTRIBUTING.md)** for: + +- Environment and build requirements +- PR expectations and testing notes +- Steps to add or extend a provider without breaking layering rules + +# Changelog + +See **[CHANGELOG.md](CHANGELOG.md)** for user-visible changes. The package is in **alpha**; expect API evolution between releases. # Acknowledgements @@ -567,4 +834,4 @@ return embeddings.data.first?.embedding.description # License -This package is licensed under the MIT License. +This package is licensed under the [MIT License](LICENSE). diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md new file mode 100644 index 00000000..913a99c8 --- /dev/null +++ b/docs/ARCHITECTURE.md @@ -0,0 +1,100 @@ +# Architecture + +This document summarizes the package architecture as defined in `Package.swift`. + +## Module Layers + +1. **Core layer** + - `CoreMI` +2. **LLM abstraction layer** + - `LargeLanguageModels` +3. **Provider layer** + - `Anthropic`, `Cohere`, `ElevenLabs`, `Groq`, `HuggingFace`, `HumeAI`, `Jina`, `Mistral`, `NeetsAI`, `Ollama`, `OpenAI`, `Perplexity`, `PlayHT`, `Rime`, `TogetherAI`, `VoyageAI`, `_Gemini` +4. **Umbrella layer** + - `AI` + +## Component Dependency Graph + +In this graph, `CorePersistence`, `Merge`, `NetworkKit`, `Swallow`, and `SwiftUIX` are external package dependencies (not targets in this repository). + +```mermaid +graph TD + CoreMI --> CorePersistence + CoreMI --> Merge + CoreMI --> Swallow + + LargeLanguageModels --> CoreMI + LargeLanguageModels --> CorePersistence + LargeLanguageModels --> Merge + LargeLanguageModels --> NetworkKit + LargeLanguageModels --> Swallow + LargeLanguageModels --> SwiftUIX + + Anthropic --> LargeLanguageModels + OpenAI --> LargeLanguageModels + HuggingFace --> CoreMI + HuggingFace --> Swallow + + Cohere --> CoreMI + Cohere --> LargeLanguageModels + ElevenLabs --> CoreMI + ElevenLabs --> LargeLanguageModels + Groq --> CoreMI + Groq --> LargeLanguageModels + HumeAI --> CoreMI + HumeAI --> LargeLanguageModels + Jina --> CoreMI + Jina --> LargeLanguageModels + Mistral --> CoreMI + Mistral --> LargeLanguageModels + NeetsAI --> CoreMI + NeetsAI --> LargeLanguageModels + Ollama --> CoreMI + Ollama --> LargeLanguageModels + PlayHT --> CoreMI + PlayHT --> LargeLanguageModels + Rime --> CoreMI + Rime --> LargeLanguageModels + TogetherAI --> CoreMI + TogetherAI --> LargeLanguageModels + VoyageAI --> CoreMI + VoyageAI --> LargeLanguageModels + _Gemini --> CoreMI + _Gemini --> LargeLanguageModels + + Perplexity --> OpenAI + Perplexity --> CoreMI + Perplexity --> LargeLanguageModels + + AI --> CoreMI + AI --> LargeLanguageModels + AI --> Anthropic + AI --> Cohere + AI --> ElevenLabs + AI --> Groq + AI --> HuggingFace + AI --> Jina + AI --> Mistral + AI --> Ollama + AI --> OpenAI + + AI -. standalone product .-> HumeAI + AI -. standalone product .-> NeetsAI + AI -. standalone product .-> Perplexity + AI -. standalone product .-> PlayHT + AI -. standalone product .-> Rime + AI -. standalone product .-> TogetherAI + AI -. standalone product .-> VoyageAI + AI -. standalone product .-> _Gemini +``` +> Note: The `AI` umbrella target currently depends on `CoreMI`, `LargeLanguageModels`, `Anthropic`, `Cohere`, `ElevenLabs`, `Groq`, `HuggingFace`, `Jina`, `Mistral`, `Ollama`, and `OpenAI`. Other provider modules in this repository are distributed as standalone products and are not re-exported by `AI` in `Package.swift`. + +> Note: `HuggingFace` intentionally differs from most provider modules: in `Package.swift` it depends on `CoreMI` and `Swallow`, and does not depend on `LargeLanguageModels`. + +## External Dependencies + +- `CorePersistence` +- `Merge` +- `NetworkKit` +- `Swallow` +- `SwiftUIX` diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000..5e24f4c9 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,31 @@ +# Documentation + +Guides for the **AI** Swift package ([PreternaturalAI/AI](https://github.com/PreternaturalAI/AI)). + +| Document | Audience | Description | +|----------|----------|-------------| +| [../README.md](../README.md) | Everyone | Install, usage examples, architecture summary, dependency graph, roadmap | +| [ARCHITECTURE.md](ARCHITECTURE.md) | Contributors & integrators | Layers, products vs targets, Mermaid graphs, protocol matrix, tests | +| [../CONTRIBUTING.md](../CONTRIBUTING.md) | Contributors | Setup, PR process, adding providers | +| [../CHANGELOG.md](../CHANGELOG.md) | Everyone | Notable changes | +| [../LICENSE](../LICENSE) | Everyone | MIT | + +## Quick orientation + +```text +Package.swift products, targets, external deps +Sources/CoreMI foundations (requests, model IDs, services) +Sources/LargeLanguageModels AbstractLLM, prompts, embeddings protocols +Sources/ vendor clients +Sources/AI umbrella module (selective @_exported imports) +Tests/ parallel test targets (see ARCHITECTURE.md for gaps) +docs/ long-form documentation (this folder) +``` + +## Keeping docs honest + +When you change `Package.swift` or add a provider: + +1. Update the dependency graph and tables in [ARCHITECTURE.md](ARCHITECTURE.md). +2. Mirror user-facing bits in [../README.md](../README.md) (products, roadmap, import notes). +3. Note the change under `[Unreleased]` in [../CHANGELOG.md](../CHANGELOG.md). From 47da03352f515a35803b909d7c04024aabd398fd Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 14 Aug 2026 14:57:07 -0700 Subject: [PATCH 111/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#76) --- .github/PULL_REQUEST_TEMPLATE.md | 31 +++ CHANGELOG.md | 12 ++ CONTRIBUTING.md | 78 +++++++ README.md | 335 +++++++++++++++++++++++++++---- docs/ARCHITECTURE.md | 100 +++++++++ docs/README.md | 31 +++ 6 files changed, 553 insertions(+), 34 deletions(-) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 CHANGELOG.md create mode 100644 CONTRIBUTING.md create mode 100644 docs/ARCHITECTURE.md create mode 100644 docs/README.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..7dfe0424 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,31 @@ +## Summary + + + +## Type of change + +- [ ] Bug fix +- [ ] New provider / API surface +- [ ] Refactor +- [ ] Documentation +- [ ] Tests / CI +- [ ] Other + +## Checklist + +- [ ] Builds with the package’s supported Xcode/Swift versions +- [ ] Tests added or updated when behavior changes +- [ ] No secrets or API keys committed +- [ ] Docs updated if products, targets, public API, or dependencies changed: + - [ ] `README.md` + - [ ] `docs/ARCHITECTURE.md` (graph / tables) + - [ ] `CHANGELOG.md` (`[Unreleased]`) +- [ ] Layering respected (providers β†’ `LargeLanguageModels` β†’ `CoreMI`; avoid new providerβ†’provider deps) + +## Test plan + + + +## Related issues + + diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..2896a4fd --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,12 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +## [Unreleased] + +### Added + +- Added architecture documentation in `docs/ARCHITECTURE.md`. +- Added contribution guidelines in `CONTRIBUTING.md`. +- Improved `README.md` with architecture, dependency graph, and documentation links. +- Added repository research and agent workflow guidance to `CONTRIBUTING.md`. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..0e562b86 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,78 @@ +# Contributing + +Thanks for contributing to AI. + +## Prerequisites + +- Xcode 15.4+ (Swift 5.10 toolchain) +- Apple platform SDKs supported by this package + +## Getting Started + +1. Fork the repository and create a feature branch. +2. Make focused changes with clear commit messages. +3. Run tests locally: + +```bash +swift test +``` + +4. Update documentation when behavior, APIs, or architecture changes. +5. Open a pull request with a clear summary and test notes. + +## Pull Request Checklist + +- [ ] Changes are scoped to one topic +- [ ] Public API changes are documented +- [ ] Tests pass locally (`swift test`) +- [ ] README/docs/changelog updated when needed + +## Repository Research Plan + +When working in this repository, start by identifying the layer and capability you are changing before touching code. + +1. Map the affected API surface: + - `Sources/CoreMI` + - `Sources/LargeLanguageModels` + - `Sources/AI` + - the specific provider target under `Sources/` +2. Inventory shared abstractions and extension points involved in the change: + - request handling + - model identifiers + - chat/completions + - embeddings + - audio, file, structured output, and tool-calling support +3. Compare provider parity for that capability to avoid introducing one-off patterns. +4. Audit the relevant tests under `Tests/` by capability as well as by provider. +5. Update docs when package products, imports, architecture, or behavior change. +6. Run `swift test` for code changes and record any notable validation steps in the pull request. + +## Agent / Workflow Roles + +Use focused ownership when splitting work across contributors or automation: + +- **Architecture**: owns module boundaries, `Package.swift`, and `docs/ARCHITECTURE.md`. +- **Core abstractions**: owns `CoreMI` and `LargeLanguageModels` protocols, shared request/response behavior, and compatibility across providers. +- **Provider**: owns one provider target at a time and aligns provider-specific APIs with shared abstractions. +- **Test**: expands coverage in `Tests/`, adds reusable fixtures/helpers, and verifies `swift test`. +- **Docs**: keeps `README.md`, `CONTRIBUTING.md`, `docs/ARCHITECTURE.md`, and `CHANGELOG.md` aligned with code changes. +- **Release / governance**: checks change scope, public API impact, dependency layering, and pull request hygiene. + +Recommended workflow: + +1. Scope work to one layer or one provider. +2. Review architecture or shared abstraction impact first. +3. Implement the provider or core change. +4. Update tests for behavior changes. +5. Update docs for API, product, or architecture changes. +6. Run `swift test`. +7. Review for consistency with neighboring providers before merging. + +## Reporting Issues + +When filing a bug, include: + +- Steps to reproduce +- Expected vs actual behavior +- Platform and Xcode/Swift versions +- Relevant logs or sample payloads diff --git a/README.md b/README.md index cf435eff..abb9f56b 100644 --- a/README.md +++ b/README.md @@ -1,68 +1,100 @@ -> [!IMPORTANT] +> πŸ•΄οΈ[!IMPORTANT] > This package is presently in its alpha stage of development (2026-03-04). ---- +#### Supported Platforms - +SPM platforms from [`Package.swift`](Package.swift): **iOS 16+**, **macOS 13+**, **tvOS 16+**, **visionOS 1+**, **watchOS 9+**. -#### Supported Platforms

- macos + macOS   - macos + iOS   - macos + iPadOS   - macos + tvOS   - macos + watchOS

+Also targets **visionOS** (badge art not yet in `Images/`). + # AI The definitive, open-source Swift framework for interfacing with generative AI. -[Installation](#installation)\ -[Usage](#usage) - -* [Import the framework](#import-the-framework) -* [Initialize an AI Client](#initialize-an-ai-client) -* [LLM Clients Abstraction](#llm-clients-abstraction) -* [Supported Models](#supported-models) -* [Completions](#completions) - * [Basic Completions](#basic-completions) - * [Vision: Image-to-Text](#vision-image-to-text) - * [Function Calling](#function-calling) -* [DALLE-3 Image Generation](#dalle-3-image-generation) -* [Audio](#audio) - * [Audio Transcription: Whisper](#audio-transcription-whisper) - * [Audio Generation: OpenAI](#audio-generation-openai) - * [Audio Generation: ElevenLabs](#audio-generation-elevenlabs) -* [Text Embeddings](#text-embeddings) - -[Roadmap](#roadmap) \ -[Acknowledgements](#acknowledgements) \ -[License](#license) +## Documentation + +- [Architecture](docs/ARCHITECTURE.md) +- [Contributing](CONTRIBUTING.md) +- [Changelog](CHANGELOG.md) + +## Table of Contents + +- [Architecture Overview](#architecture-overview) +- [Dependencies](#dependencies) +- [Installation](#installation) +- [Usage](#usage) + - [Import the framework](#import-the-framework) + - [Initialize an AI Client](#initialize-an-ai-client) + - [LLM Clients Abstraction](#llm-clients-abstraction) + - [Supported Models](#supported-models) + - [Completions](#completions) + - [Basic Completions](#basic-completions) + - [Vision: Image-to-Text](#vision-image-to-text) + - [Function Calling](#function-calling) + - [DALLE-3 Image Generation](#dalle-3-image-generation) + - [Audio](#audio) + - [Audio Transcription: Whisper](#audio-transcription-whisper) + - [Audio Generation: OpenAI](#audio-generation-openai) + - [Audio Generation: ElevenLabs](#audio-generation-elevenlabs) + - [Text Embeddings](#text-embeddings) +- [Roadmap](#roadmap) +- [Acknowledgements](#acknowledgements) +- [License](#license) + +## Architecture Overview + +This package is organized as a Swift Package Manager workspace with layered modules: + +- `CoreMI` provides shared core abstractions used across providers. +- `LargeLanguageModels` builds common LLM request/response functionality on top of `CoreMI`. +- Provider modules (`OpenAI`, `Anthropic`, `Mistral`, `Groq`, `ElevenLabs`, etc.) implement vendor-specific APIs. +- `AI` is the umbrella product that re-exports the main modules for one-stop integration. + +### Component Dependency Graph + +A full dependency graph generated from `Package.swift` target dependencies is available in [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md#component-dependency-graph). + +## Dependencies + +External package dependencies declared in `Package.swift`: + +- [`CorePersistence`](https://github.com/vmanot/CorePersistence) +- [`Merge`](https://github.com/vmanot/Merge) +- [`NetworkKit`](https://github.com/vmanot/NetworkKit) +- [`Swallow`](https://github.com/vmanot/Swallow) +- [`SwiftUIX`](https://github.com/SwiftUIX/SwiftUIX) # Installation @@ -74,6 +106,179 @@ The definitive, open-source Swift framework for interfacing with generative AI. 4. Choose the version you'd like to install. 5. Click `Add Package`. +Or add the dependency in `Package.swift`: + +```swift +dependencies: [ + .package(url: "https://github.com/PreternaturalAI/AI.git", branch: "main") +] +``` + +Then link the `AI` product (umbrella) or a standalone product such as `OpenAI`, `Anthropic`, or `Perplexity` (see [Architecture](#architecture)). + +# Architecture + +The package is organized in layers. Provider SDKs implement shared protocols (`LLMRequestHandling`, embeddings, TTS, and so on) defined in the core modules. + +| Layer | Modules | Responsibility | +|-------|---------|----------------| +| Umbrella module | `AI` | `@_exported` re-exports **CoreMI**, **LargeLanguageModels**, **OpenAI** (and Swallow macros client). Other bundled modules still need their own `import`. | +| Umbrella product | `AI` library | SPM product that **links** core + Anthropic, Cohere, ElevenLabs, Groq, HuggingFace, Jina, Mistral, Ollama, OpenAI, and the `AI` module | +| Providers | `OpenAI`, `Anthropic`, `Mistral`, `Groq`, `Ollama`, `Perplexity`, `Cohere`, `Jina`, `VoyageAI`, `TogetherAI`, `ElevenLabs`, `PlayHT`, `Rime`, `HumeAI`, `NeetsAI`, `_Gemini`, `HuggingFace`, … | API clients and model types | +| LLM abstractions | `LargeLanguageModels` | `AbstractLLM`, `PromptLiteral`, chat/function-calling, embeddings protocols | +| Foundations | `CoreMI` | Request handling, model identifiers, service credentials, ASR/TTS bases | +| External | Swallow, Merge, NetworkKit, CorePersistence, SwiftUIX | Shared infrastructure (see [Dependencies](#dependencies)) | + +`import AI` is enough for OpenAI + shared LLM types. For other clients linked by the product, add e.g. `import Anthropic` or `import Groq`. Providers shipped only as standalone products (`Perplexity`, `_Gemini`, `VoyageAI`, …) require linking that product. + +### Component dependency graph + +Graph of **package targets** as declared in [`Package.swift`](Package.swift) (external packages shown once at the bottom). For products, tests, and design notes, see **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)**. + +```mermaid +flowchart TB + subgraph umbrella [Umbrella] + AI + end + + subgraph providers [Provider targets] + OpenAI + Anthropic + Mistral + Groq + Ollama + Perplexity + Cohere + Jina + VoyageAI + TogetherAI + ElevenLabs + PlayHT + Rime + HumeAI + NeetsAI + Gemini["_Gemini"] + HuggingFace + end + + subgraph core [Core targets] + LargeLanguageModels + CoreMI + end + + subgraph external [External packages] + Swallow + Merge + NetworkKit + CorePersistence + SwiftUIX + end + + AI --> CoreMI + AI --> LargeLanguageModels + AI --> OpenAI + AI --> Anthropic + AI --> Mistral + AI --> Groq + AI --> Ollama + AI --> Cohere + AI --> ElevenLabs + AI --> HuggingFace + AI --> Jina + + OpenAI --> LargeLanguageModels + Anthropic --> LargeLanguageModels + Mistral --> LargeLanguageModels + Groq --> LargeLanguageModels + Ollama --> LargeLanguageModels + Perplexity --> LargeLanguageModels + Perplexity --> OpenAI + Cohere --> LargeLanguageModels + Jina --> LargeLanguageModels + VoyageAI --> LargeLanguageModels + TogetherAI --> LargeLanguageModels + ElevenLabs --> LargeLanguageModels + PlayHT --> LargeLanguageModels + Rime --> LargeLanguageModels + HumeAI --> LargeLanguageModels + NeetsAI --> LargeLanguageModels + Gemini --> LargeLanguageModels + HuggingFace --> CoreMI + + LargeLanguageModels --> CoreMI + LargeLanguageModels --> CorePersistence + LargeLanguageModels --> Merge + LargeLanguageModels --> NetworkKit + LargeLanguageModels --> Swallow + LargeLanguageModels --> SwiftUIX + + CoreMI --> CorePersistence + CoreMI --> Merge + CoreMI --> Swallow +``` + +**Notes** + +- Most providers also depend on `CoreMI`, `CorePersistence`, `Merge`, `NetworkKit`, and `Swallow` directly (edges omitted above for readability where they already flow through `LargeLanguageModels`). +- **OpenAI** and **Anthropic** depend on `LargeLanguageModels` + networking stack, not on `CoreMI` directly in `Package.swift`. +- **Perplexity** is the only provider that depends on another provider target (`OpenAI`). +- **HuggingFace** depends on `CoreMI` + `Swallow` only (hub/tokenizer helpers, not the full LLM stack). +- The `AI` **product** does **not** link every target (for example `_Gemini`, `Perplexity`, `PlayHT`, `Rime`, `TogetherAI`, `VoyageAI`, `HumeAI`, `NeetsAI` are separate products). +- The `AI` **module** re-exports only CoreMI, LargeLanguageModels, and OpenAI among first-party modules (`Sources/AI/module.swift`). + +### Protocol capabilities (from source) + +Which shared protocols have an explicit client conformance today: + +| Target | `LLMRequestHandling` | `TextEmbeddingsRequestHandling` | Notes | +|--------|:--------------------:|:-------------------------------:|-------| +| OpenAI | yes | yes | Also images, Whisper, speech, assistants | +| Anthropic | yes | | | +| Mistral | yes | yes | | +| Groq | yes | | | +| Ollama | yes | | | +| Perplexity | yes | | Depends on OpenAI target | +| Cohere | | yes | | +| Jina | | yes | | +| VoyageAI | | yes | | +| TogetherAI, ElevenLabs, PlayHT, Rime, HumeAI, NeetsAI, _Gemini, HuggingFace | | | Provider-specific client APIs / hub helpers (see `Sources/`) | + +Full layering detail: **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)**. Docs index: **[docs/README.md](docs/README.md)**. + +# Dependencies + +### External Swift packages + +| Package | Repository | Role | +|---------|------------|------| +| Swallow | [vmanot/Swallow](https://github.com/vmanot/Swallow) | Extensions, macros client, diagnostics | +| Merge | [vmanot/Merge](https://github.com/vmanot/Merge) | Concurrency / async utilities | +| NetworkKit | [vmanot/NetworkKit](https://github.com/vmanot/NetworkKit) | HTTP client & API specifications | +| CorePersistence | [vmanot/CorePersistence](https://github.com/vmanot/CorePersistence) | Persistence & schema helpers (e.g. JSONSchema) | +| SwiftUIX | [SwiftUIX/SwiftUIX](https://github.com/SwiftUIX/SwiftUIX) | SwiftUI extensions | + +Transitive pins (see [`Package.resolved`](Package.resolved)) include **SwiftAPI**, **swift-collections**, and **swift-syntax**. + +### SPM products you can link + +Exact product names from `Package.swift`: + +| Product | Targets exposed | Use when | +|---------|-----------------|----------| +| `AI` | CoreMI, LargeLanguageModels, Anthropic, Cohere, ElevenLabs, Groq, HuggingFace, Jina, Mistral, Ollama, OpenAI, AI | Default multi-provider app dependency | +| `OpenAI` | OpenAI | OpenAI-only | +| `Anthropic` | Anthropic | Anthropic-only | +| `Perplexity` | Perplexity | Perplexity (pulls OpenAI transitively) | +| `TogetherAI` | TogetherAI | Together AI | +| `VoyageAI` | VoyageAI | Voyage embeddings | +| `PlayHT` | PlayHT | PlayHT voice | +| `Rime` | Rime | Rime voice | +| `HumeAI` | HumeAI | Hume | +| `NeetsAI` | NeetsAI | Neets | +| `_Gemini` | _Gemini | Google Gemini client | + +There is **no** standalone SPM product today for `CoreMI`, `LargeLanguageModels`, `Cohere`, `Groq`, `HuggingFace`, `Jina`, `Mistral`, `Ollama`, or `ElevenLabs` β€” consume them via the `AI` product (or add a product in `Package.swift` if you need a leaner slice). + # Usage ## Import the framework @@ -551,14 +756,76 @@ let embeddings = try await LLMManager.client.textEmbeddings( return embeddings.data.first?.embedding.description ``` +# Documentation + +| Document | Contents | +|----------|----------| +| **[docs/README.md](docs/README.md)** | Documentation index | +| **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)** | Full architecture, products vs targets, Mermaid graph, protocol matrix, tests | +| **[CONTRIBUTING.md](CONTRIBUTING.md)** | Dev setup, coding guidelines, how to add a provider | +| **[CHANGELOG.md](CHANGELOG.md)** | Release notes and unreleased changes | +| **[LICENSE](LICENSE)** | MIT License text | + +API behavior is illustrated in the [Usage](#usage) sections above; protocol details live in `Sources/LargeLanguageModels` and `Sources/CoreMI`. + # Roadmap -- [x] OpenAI +Status reflects modules present in this repository (`Sources/` + `Package.swift`). Checked items ship as package targets; depth of feature coverage varies by provider. + +### Core + +- [x] `CoreMI` β€” request handling, model identifiers, services, ASR/TTS foundations +- [x] `LargeLanguageModels` β€” `AbstractLLM`, prompts, function calling, embeddings protocols +- [x] `AI` umbrella product + +### LLM & multimodal providers + +- [x] OpenAI (chat, vision, tools, images, Whisper, speech) - [x] Anthropic - [x] Mistral +- [x] Groq - [x] Ollama -- [ ] Perplexity -- [ ] Groq +- [x] Perplexity +- [x] TogetherAI +- [x] `_Gemini` (Google Gemini client; standalone product) +- [ ] Broader parity matrix (streaming, tools, vision) across every LLM provider + +### Embeddings & hub + +- [x] OpenAI embeddings +- [x] Cohere +- [x] Jina +- [x] VoyageAI +- [x] Hugging Face hub helpers / tokenizer resources + +### Voice & speech + +- [x] ElevenLabs +- [x] PlayHT +- [x] Rime +- [x] HumeAI +- [x] NeetsAI +- [x] OpenAI TTS / Whisper + +### Project hygiene + +- [x] Architecture & dependency documentation +- [x] Contributing guide, docs index, PR template & changelog +- [ ] Register missing test targets (Ollama, Rime, TogetherAI folder) +- [ ] visionOS badge artwork under `Images/` +- [ ] Tagged semantic releases with automated changelog sections + +# Contributing + +Contributions are welcome. Please read **[CONTRIBUTING.md](CONTRIBUTING.md)** for: + +- Environment and build requirements +- PR expectations and testing notes +- Steps to add or extend a provider without breaking layering rules + +# Changelog + +See **[CHANGELOG.md](CHANGELOG.md)** for user-visible changes. The package is in **alpha**; expect API evolution between releases. # Acknowledgements @@ -567,4 +834,4 @@ return embeddings.data.first?.embedding.description # License -This package is licensed under the MIT License. +This package is licensed under the [MIT License](LICENSE). diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md new file mode 100644 index 00000000..913a99c8 --- /dev/null +++ b/docs/ARCHITECTURE.md @@ -0,0 +1,100 @@ +# Architecture + +This document summarizes the package architecture as defined in `Package.swift`. + +## Module Layers + +1. **Core layer** + - `CoreMI` +2. **LLM abstraction layer** + - `LargeLanguageModels` +3. **Provider layer** + - `Anthropic`, `Cohere`, `ElevenLabs`, `Groq`, `HuggingFace`, `HumeAI`, `Jina`, `Mistral`, `NeetsAI`, `Ollama`, `OpenAI`, `Perplexity`, `PlayHT`, `Rime`, `TogetherAI`, `VoyageAI`, `_Gemini` +4. **Umbrella layer** + - `AI` + +## Component Dependency Graph + +In this graph, `CorePersistence`, `Merge`, `NetworkKit`, `Swallow`, and `SwiftUIX` are external package dependencies (not targets in this repository). + +```mermaid +graph TD + CoreMI --> CorePersistence + CoreMI --> Merge + CoreMI --> Swallow + + LargeLanguageModels --> CoreMI + LargeLanguageModels --> CorePersistence + LargeLanguageModels --> Merge + LargeLanguageModels --> NetworkKit + LargeLanguageModels --> Swallow + LargeLanguageModels --> SwiftUIX + + Anthropic --> LargeLanguageModels + OpenAI --> LargeLanguageModels + HuggingFace --> CoreMI + HuggingFace --> Swallow + + Cohere --> CoreMI + Cohere --> LargeLanguageModels + ElevenLabs --> CoreMI + ElevenLabs --> LargeLanguageModels + Groq --> CoreMI + Groq --> LargeLanguageModels + HumeAI --> CoreMI + HumeAI --> LargeLanguageModels + Jina --> CoreMI + Jina --> LargeLanguageModels + Mistral --> CoreMI + Mistral --> LargeLanguageModels + NeetsAI --> CoreMI + NeetsAI --> LargeLanguageModels + Ollama --> CoreMI + Ollama --> LargeLanguageModels + PlayHT --> CoreMI + PlayHT --> LargeLanguageModels + Rime --> CoreMI + Rime --> LargeLanguageModels + TogetherAI --> CoreMI + TogetherAI --> LargeLanguageModels + VoyageAI --> CoreMI + VoyageAI --> LargeLanguageModels + _Gemini --> CoreMI + _Gemini --> LargeLanguageModels + + Perplexity --> OpenAI + Perplexity --> CoreMI + Perplexity --> LargeLanguageModels + + AI --> CoreMI + AI --> LargeLanguageModels + AI --> Anthropic + AI --> Cohere + AI --> ElevenLabs + AI --> Groq + AI --> HuggingFace + AI --> Jina + AI --> Mistral + AI --> Ollama + AI --> OpenAI + + AI -. standalone product .-> HumeAI + AI -. standalone product .-> NeetsAI + AI -. standalone product .-> Perplexity + AI -. standalone product .-> PlayHT + AI -. standalone product .-> Rime + AI -. standalone product .-> TogetherAI + AI -. standalone product .-> VoyageAI + AI -. standalone product .-> _Gemini +``` +> Note: The `AI` umbrella target currently depends on `CoreMI`, `LargeLanguageModels`, `Anthropic`, `Cohere`, `ElevenLabs`, `Groq`, `HuggingFace`, `Jina`, `Mistral`, `Ollama`, and `OpenAI`. Other provider modules in this repository are distributed as standalone products and are not re-exported by `AI` in `Package.swift`. + +> Note: `HuggingFace` intentionally differs from most provider modules: in `Package.swift` it depends on `CoreMI` and `Swallow`, and does not depend on `LargeLanguageModels`. + +## External Dependencies + +- `CorePersistence` +- `Merge` +- `NetworkKit` +- `Swallow` +- `SwiftUIX` diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000..5e24f4c9 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,31 @@ +# Documentation + +Guides for the **AI** Swift package ([PreternaturalAI/AI](https://github.com/PreternaturalAI/AI)). + +| Document | Audience | Description | +|----------|----------|-------------| +| [../README.md](../README.md) | Everyone | Install, usage examples, architecture summary, dependency graph, roadmap | +| [ARCHITECTURE.md](ARCHITECTURE.md) | Contributors & integrators | Layers, products vs targets, Mermaid graphs, protocol matrix, tests | +| [../CONTRIBUTING.md](../CONTRIBUTING.md) | Contributors | Setup, PR process, adding providers | +| [../CHANGELOG.md](../CHANGELOG.md) | Everyone | Notable changes | +| [../LICENSE](../LICENSE) | Everyone | MIT | + +## Quick orientation + +```text +Package.swift products, targets, external deps +Sources/CoreMI foundations (requests, model IDs, services) +Sources/LargeLanguageModels AbstractLLM, prompts, embeddings protocols +Sources/ vendor clients +Sources/AI umbrella module (selective @_exported imports) +Tests/ parallel test targets (see ARCHITECTURE.md for gaps) +docs/ long-form documentation (this folder) +``` + +## Keeping docs honest + +When you change `Package.swift` or add a provider: + +1. Update the dependency graph and tables in [ARCHITECTURE.md](ARCHITECTURE.md). +2. Mirror user-facing bits in [../README.md](../README.md) (products, roadmap, import notes). +3. Note the change under `[Unreleased]` in [../CHANGELOG.md](../CHANGELOG.md). From 8c5fe37e6e31ca035cf3abd1fe0f792a570f0c38 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Sun, 16 Aug 2026 06:38:48 -0400 Subject: [PATCH 112/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#81) From 0c23e910e8ea8277b09707311e1b3fd07f160a1e Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Sun, 16 Aug 2026 06:39:10 -0400 Subject: [PATCH 113/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#82) --- .github/PULL_REQUEST_TEMPLATE.md | 31 +++ CHANGELOG.md | 12 ++ CONTRIBUTING.md | 78 +++++++ README.md | 335 +++++++++++++++++++++++++++---- docs/ARCHITECTURE.md | 100 +++++++++ docs/README.md | 31 +++ 6 files changed, 553 insertions(+), 34 deletions(-) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 CHANGELOG.md create mode 100644 CONTRIBUTING.md create mode 100644 docs/ARCHITECTURE.md create mode 100644 docs/README.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..7dfe0424 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,31 @@ +## Summary + + + +## Type of change + +- [ ] Bug fix +- [ ] New provider / API surface +- [ ] Refactor +- [ ] Documentation +- [ ] Tests / CI +- [ ] Other + +## Checklist + +- [ ] Builds with the package’s supported Xcode/Swift versions +- [ ] Tests added or updated when behavior changes +- [ ] No secrets or API keys committed +- [ ] Docs updated if products, targets, public API, or dependencies changed: + - [ ] `README.md` + - [ ] `docs/ARCHITECTURE.md` (graph / tables) + - [ ] `CHANGELOG.md` (`[Unreleased]`) +- [ ] Layering respected (providers β†’ `LargeLanguageModels` β†’ `CoreMI`; avoid new providerβ†’provider deps) + +## Test plan + + + +## Related issues + + diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..2896a4fd --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,12 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +## [Unreleased] + +### Added + +- Added architecture documentation in `docs/ARCHITECTURE.md`. +- Added contribution guidelines in `CONTRIBUTING.md`. +- Improved `README.md` with architecture, dependency graph, and documentation links. +- Added repository research and agent workflow guidance to `CONTRIBUTING.md`. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..0e562b86 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,78 @@ +# Contributing + +Thanks for contributing to AI. + +## Prerequisites + +- Xcode 15.4+ (Swift 5.10 toolchain) +- Apple platform SDKs supported by this package + +## Getting Started + +1. Fork the repository and create a feature branch. +2. Make focused changes with clear commit messages. +3. Run tests locally: + +```bash +swift test +``` + +4. Update documentation when behavior, APIs, or architecture changes. +5. Open a pull request with a clear summary and test notes. + +## Pull Request Checklist + +- [ ] Changes are scoped to one topic +- [ ] Public API changes are documented +- [ ] Tests pass locally (`swift test`) +- [ ] README/docs/changelog updated when needed + +## Repository Research Plan + +When working in this repository, start by identifying the layer and capability you are changing before touching code. + +1. Map the affected API surface: + - `Sources/CoreMI` + - `Sources/LargeLanguageModels` + - `Sources/AI` + - the specific provider target under `Sources/` +2. Inventory shared abstractions and extension points involved in the change: + - request handling + - model identifiers + - chat/completions + - embeddings + - audio, file, structured output, and tool-calling support +3. Compare provider parity for that capability to avoid introducing one-off patterns. +4. Audit the relevant tests under `Tests/` by capability as well as by provider. +5. Update docs when package products, imports, architecture, or behavior change. +6. Run `swift test` for code changes and record any notable validation steps in the pull request. + +## Agent / Workflow Roles + +Use focused ownership when splitting work across contributors or automation: + +- **Architecture**: owns module boundaries, `Package.swift`, and `docs/ARCHITECTURE.md`. +- **Core abstractions**: owns `CoreMI` and `LargeLanguageModels` protocols, shared request/response behavior, and compatibility across providers. +- **Provider**: owns one provider target at a time and aligns provider-specific APIs with shared abstractions. +- **Test**: expands coverage in `Tests/`, adds reusable fixtures/helpers, and verifies `swift test`. +- **Docs**: keeps `README.md`, `CONTRIBUTING.md`, `docs/ARCHITECTURE.md`, and `CHANGELOG.md` aligned with code changes. +- **Release / governance**: checks change scope, public API impact, dependency layering, and pull request hygiene. + +Recommended workflow: + +1. Scope work to one layer or one provider. +2. Review architecture or shared abstraction impact first. +3. Implement the provider or core change. +4. Update tests for behavior changes. +5. Update docs for API, product, or architecture changes. +6. Run `swift test`. +7. Review for consistency with neighboring providers before merging. + +## Reporting Issues + +When filing a bug, include: + +- Steps to reproduce +- Expected vs actual behavior +- Platform and Xcode/Swift versions +- Relevant logs or sample payloads diff --git a/README.md b/README.md index cf435eff..abb9f56b 100644 --- a/README.md +++ b/README.md @@ -1,68 +1,100 @@ -> [!IMPORTANT] +> πŸ•΄οΈ[!IMPORTANT] > This package is presently in its alpha stage of development (2026-03-04). ---- +#### Supported Platforms - +SPM platforms from [`Package.swift`](Package.swift): **iOS 16+**, **macOS 13+**, **tvOS 16+**, **visionOS 1+**, **watchOS 9+**. -#### Supported Platforms

- macos + macOS   - macos + iOS   - macos + iPadOS   - macos + tvOS   - macos + watchOS

+Also targets **visionOS** (badge art not yet in `Images/`). + # AI The definitive, open-source Swift framework for interfacing with generative AI. -[Installation](#installation)\ -[Usage](#usage) - -* [Import the framework](#import-the-framework) -* [Initialize an AI Client](#initialize-an-ai-client) -* [LLM Clients Abstraction](#llm-clients-abstraction) -* [Supported Models](#supported-models) -* [Completions](#completions) - * [Basic Completions](#basic-completions) - * [Vision: Image-to-Text](#vision-image-to-text) - * [Function Calling](#function-calling) -* [DALLE-3 Image Generation](#dalle-3-image-generation) -* [Audio](#audio) - * [Audio Transcription: Whisper](#audio-transcription-whisper) - * [Audio Generation: OpenAI](#audio-generation-openai) - * [Audio Generation: ElevenLabs](#audio-generation-elevenlabs) -* [Text Embeddings](#text-embeddings) - -[Roadmap](#roadmap) \ -[Acknowledgements](#acknowledgements) \ -[License](#license) +## Documentation + +- [Architecture](docs/ARCHITECTURE.md) +- [Contributing](CONTRIBUTING.md) +- [Changelog](CHANGELOG.md) + +## Table of Contents + +- [Architecture Overview](#architecture-overview) +- [Dependencies](#dependencies) +- [Installation](#installation) +- [Usage](#usage) + - [Import the framework](#import-the-framework) + - [Initialize an AI Client](#initialize-an-ai-client) + - [LLM Clients Abstraction](#llm-clients-abstraction) + - [Supported Models](#supported-models) + - [Completions](#completions) + - [Basic Completions](#basic-completions) + - [Vision: Image-to-Text](#vision-image-to-text) + - [Function Calling](#function-calling) + - [DALLE-3 Image Generation](#dalle-3-image-generation) + - [Audio](#audio) + - [Audio Transcription: Whisper](#audio-transcription-whisper) + - [Audio Generation: OpenAI](#audio-generation-openai) + - [Audio Generation: ElevenLabs](#audio-generation-elevenlabs) + - [Text Embeddings](#text-embeddings) +- [Roadmap](#roadmap) +- [Acknowledgements](#acknowledgements) +- [License](#license) + +## Architecture Overview + +This package is organized as a Swift Package Manager workspace with layered modules: + +- `CoreMI` provides shared core abstractions used across providers. +- `LargeLanguageModels` builds common LLM request/response functionality on top of `CoreMI`. +- Provider modules (`OpenAI`, `Anthropic`, `Mistral`, `Groq`, `ElevenLabs`, etc.) implement vendor-specific APIs. +- `AI` is the umbrella product that re-exports the main modules for one-stop integration. + +### Component Dependency Graph + +A full dependency graph generated from `Package.swift` target dependencies is available in [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md#component-dependency-graph). + +## Dependencies + +External package dependencies declared in `Package.swift`: + +- [`CorePersistence`](https://github.com/vmanot/CorePersistence) +- [`Merge`](https://github.com/vmanot/Merge) +- [`NetworkKit`](https://github.com/vmanot/NetworkKit) +- [`Swallow`](https://github.com/vmanot/Swallow) +- [`SwiftUIX`](https://github.com/SwiftUIX/SwiftUIX) # Installation @@ -74,6 +106,179 @@ The definitive, open-source Swift framework for interfacing with generative AI. 4. Choose the version you'd like to install. 5. Click `Add Package`. +Or add the dependency in `Package.swift`: + +```swift +dependencies: [ + .package(url: "https://github.com/PreternaturalAI/AI.git", branch: "main") +] +``` + +Then link the `AI` product (umbrella) or a standalone product such as `OpenAI`, `Anthropic`, or `Perplexity` (see [Architecture](#architecture)). + +# Architecture + +The package is organized in layers. Provider SDKs implement shared protocols (`LLMRequestHandling`, embeddings, TTS, and so on) defined in the core modules. + +| Layer | Modules | Responsibility | +|-------|---------|----------------| +| Umbrella module | `AI` | `@_exported` re-exports **CoreMI**, **LargeLanguageModels**, **OpenAI** (and Swallow macros client). Other bundled modules still need their own `import`. | +| Umbrella product | `AI` library | SPM product that **links** core + Anthropic, Cohere, ElevenLabs, Groq, HuggingFace, Jina, Mistral, Ollama, OpenAI, and the `AI` module | +| Providers | `OpenAI`, `Anthropic`, `Mistral`, `Groq`, `Ollama`, `Perplexity`, `Cohere`, `Jina`, `VoyageAI`, `TogetherAI`, `ElevenLabs`, `PlayHT`, `Rime`, `HumeAI`, `NeetsAI`, `_Gemini`, `HuggingFace`, … | API clients and model types | +| LLM abstractions | `LargeLanguageModels` | `AbstractLLM`, `PromptLiteral`, chat/function-calling, embeddings protocols | +| Foundations | `CoreMI` | Request handling, model identifiers, service credentials, ASR/TTS bases | +| External | Swallow, Merge, NetworkKit, CorePersistence, SwiftUIX | Shared infrastructure (see [Dependencies](#dependencies)) | + +`import AI` is enough for OpenAI + shared LLM types. For other clients linked by the product, add e.g. `import Anthropic` or `import Groq`. Providers shipped only as standalone products (`Perplexity`, `_Gemini`, `VoyageAI`, …) require linking that product. + +### Component dependency graph + +Graph of **package targets** as declared in [`Package.swift`](Package.swift) (external packages shown once at the bottom). For products, tests, and design notes, see **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)**. + +```mermaid +flowchart TB + subgraph umbrella [Umbrella] + AI + end + + subgraph providers [Provider targets] + OpenAI + Anthropic + Mistral + Groq + Ollama + Perplexity + Cohere + Jina + VoyageAI + TogetherAI + ElevenLabs + PlayHT + Rime + HumeAI + NeetsAI + Gemini["_Gemini"] + HuggingFace + end + + subgraph core [Core targets] + LargeLanguageModels + CoreMI + end + + subgraph external [External packages] + Swallow + Merge + NetworkKit + CorePersistence + SwiftUIX + end + + AI --> CoreMI + AI --> LargeLanguageModels + AI --> OpenAI + AI --> Anthropic + AI --> Mistral + AI --> Groq + AI --> Ollama + AI --> Cohere + AI --> ElevenLabs + AI --> HuggingFace + AI --> Jina + + OpenAI --> LargeLanguageModels + Anthropic --> LargeLanguageModels + Mistral --> LargeLanguageModels + Groq --> LargeLanguageModels + Ollama --> LargeLanguageModels + Perplexity --> LargeLanguageModels + Perplexity --> OpenAI + Cohere --> LargeLanguageModels + Jina --> LargeLanguageModels + VoyageAI --> LargeLanguageModels + TogetherAI --> LargeLanguageModels + ElevenLabs --> LargeLanguageModels + PlayHT --> LargeLanguageModels + Rime --> LargeLanguageModels + HumeAI --> LargeLanguageModels + NeetsAI --> LargeLanguageModels + Gemini --> LargeLanguageModels + HuggingFace --> CoreMI + + LargeLanguageModels --> CoreMI + LargeLanguageModels --> CorePersistence + LargeLanguageModels --> Merge + LargeLanguageModels --> NetworkKit + LargeLanguageModels --> Swallow + LargeLanguageModels --> SwiftUIX + + CoreMI --> CorePersistence + CoreMI --> Merge + CoreMI --> Swallow +``` + +**Notes** + +- Most providers also depend on `CoreMI`, `CorePersistence`, `Merge`, `NetworkKit`, and `Swallow` directly (edges omitted above for readability where they already flow through `LargeLanguageModels`). +- **OpenAI** and **Anthropic** depend on `LargeLanguageModels` + networking stack, not on `CoreMI` directly in `Package.swift`. +- **Perplexity** is the only provider that depends on another provider target (`OpenAI`). +- **HuggingFace** depends on `CoreMI` + `Swallow` only (hub/tokenizer helpers, not the full LLM stack). +- The `AI` **product** does **not** link every target (for example `_Gemini`, `Perplexity`, `PlayHT`, `Rime`, `TogetherAI`, `VoyageAI`, `HumeAI`, `NeetsAI` are separate products). +- The `AI` **module** re-exports only CoreMI, LargeLanguageModels, and OpenAI among first-party modules (`Sources/AI/module.swift`). + +### Protocol capabilities (from source) + +Which shared protocols have an explicit client conformance today: + +| Target | `LLMRequestHandling` | `TextEmbeddingsRequestHandling` | Notes | +|--------|:--------------------:|:-------------------------------:|-------| +| OpenAI | yes | yes | Also images, Whisper, speech, assistants | +| Anthropic | yes | | | +| Mistral | yes | yes | | +| Groq | yes | | | +| Ollama | yes | | | +| Perplexity | yes | | Depends on OpenAI target | +| Cohere | | yes | | +| Jina | | yes | | +| VoyageAI | | yes | | +| TogetherAI, ElevenLabs, PlayHT, Rime, HumeAI, NeetsAI, _Gemini, HuggingFace | | | Provider-specific client APIs / hub helpers (see `Sources/`) | + +Full layering detail: **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)**. Docs index: **[docs/README.md](docs/README.md)**. + +# Dependencies + +### External Swift packages + +| Package | Repository | Role | +|---------|------------|------| +| Swallow | [vmanot/Swallow](https://github.com/vmanot/Swallow) | Extensions, macros client, diagnostics | +| Merge | [vmanot/Merge](https://github.com/vmanot/Merge) | Concurrency / async utilities | +| NetworkKit | [vmanot/NetworkKit](https://github.com/vmanot/NetworkKit) | HTTP client & API specifications | +| CorePersistence | [vmanot/CorePersistence](https://github.com/vmanot/CorePersistence) | Persistence & schema helpers (e.g. JSONSchema) | +| SwiftUIX | [SwiftUIX/SwiftUIX](https://github.com/SwiftUIX/SwiftUIX) | SwiftUI extensions | + +Transitive pins (see [`Package.resolved`](Package.resolved)) include **SwiftAPI**, **swift-collections**, and **swift-syntax**. + +### SPM products you can link + +Exact product names from `Package.swift`: + +| Product | Targets exposed | Use when | +|---------|-----------------|----------| +| `AI` | CoreMI, LargeLanguageModels, Anthropic, Cohere, ElevenLabs, Groq, HuggingFace, Jina, Mistral, Ollama, OpenAI, AI | Default multi-provider app dependency | +| `OpenAI` | OpenAI | OpenAI-only | +| `Anthropic` | Anthropic | Anthropic-only | +| `Perplexity` | Perplexity | Perplexity (pulls OpenAI transitively) | +| `TogetherAI` | TogetherAI | Together AI | +| `VoyageAI` | VoyageAI | Voyage embeddings | +| `PlayHT` | PlayHT | PlayHT voice | +| `Rime` | Rime | Rime voice | +| `HumeAI` | HumeAI | Hume | +| `NeetsAI` | NeetsAI | Neets | +| `_Gemini` | _Gemini | Google Gemini client | + +There is **no** standalone SPM product today for `CoreMI`, `LargeLanguageModels`, `Cohere`, `Groq`, `HuggingFace`, `Jina`, `Mistral`, `Ollama`, or `ElevenLabs` β€” consume them via the `AI` product (or add a product in `Package.swift` if you need a leaner slice). + # Usage ## Import the framework @@ -551,14 +756,76 @@ let embeddings = try await LLMManager.client.textEmbeddings( return embeddings.data.first?.embedding.description ``` +# Documentation + +| Document | Contents | +|----------|----------| +| **[docs/README.md](docs/README.md)** | Documentation index | +| **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)** | Full architecture, products vs targets, Mermaid graph, protocol matrix, tests | +| **[CONTRIBUTING.md](CONTRIBUTING.md)** | Dev setup, coding guidelines, how to add a provider | +| **[CHANGELOG.md](CHANGELOG.md)** | Release notes and unreleased changes | +| **[LICENSE](LICENSE)** | MIT License text | + +API behavior is illustrated in the [Usage](#usage) sections above; protocol details live in `Sources/LargeLanguageModels` and `Sources/CoreMI`. + # Roadmap -- [x] OpenAI +Status reflects modules present in this repository (`Sources/` + `Package.swift`). Checked items ship as package targets; depth of feature coverage varies by provider. + +### Core + +- [x] `CoreMI` β€” request handling, model identifiers, services, ASR/TTS foundations +- [x] `LargeLanguageModels` β€” `AbstractLLM`, prompts, function calling, embeddings protocols +- [x] `AI` umbrella product + +### LLM & multimodal providers + +- [x] OpenAI (chat, vision, tools, images, Whisper, speech) - [x] Anthropic - [x] Mistral +- [x] Groq - [x] Ollama -- [ ] Perplexity -- [ ] Groq +- [x] Perplexity +- [x] TogetherAI +- [x] `_Gemini` (Google Gemini client; standalone product) +- [ ] Broader parity matrix (streaming, tools, vision) across every LLM provider + +### Embeddings & hub + +- [x] OpenAI embeddings +- [x] Cohere +- [x] Jina +- [x] VoyageAI +- [x] Hugging Face hub helpers / tokenizer resources + +### Voice & speech + +- [x] ElevenLabs +- [x] PlayHT +- [x] Rime +- [x] HumeAI +- [x] NeetsAI +- [x] OpenAI TTS / Whisper + +### Project hygiene + +- [x] Architecture & dependency documentation +- [x] Contributing guide, docs index, PR template & changelog +- [ ] Register missing test targets (Ollama, Rime, TogetherAI folder) +- [ ] visionOS badge artwork under `Images/` +- [ ] Tagged semantic releases with automated changelog sections + +# Contributing + +Contributions are welcome. Please read **[CONTRIBUTING.md](CONTRIBUTING.md)** for: + +- Environment and build requirements +- PR expectations and testing notes +- Steps to add or extend a provider without breaking layering rules + +# Changelog + +See **[CHANGELOG.md](CHANGELOG.md)** for user-visible changes. The package is in **alpha**; expect API evolution between releases. # Acknowledgements @@ -567,4 +834,4 @@ return embeddings.data.first?.embedding.description # License -This package is licensed under the MIT License. +This package is licensed under the [MIT License](LICENSE). diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md new file mode 100644 index 00000000..913a99c8 --- /dev/null +++ b/docs/ARCHITECTURE.md @@ -0,0 +1,100 @@ +# Architecture + +This document summarizes the package architecture as defined in `Package.swift`. + +## Module Layers + +1. **Core layer** + - `CoreMI` +2. **LLM abstraction layer** + - `LargeLanguageModels` +3. **Provider layer** + - `Anthropic`, `Cohere`, `ElevenLabs`, `Groq`, `HuggingFace`, `HumeAI`, `Jina`, `Mistral`, `NeetsAI`, `Ollama`, `OpenAI`, `Perplexity`, `PlayHT`, `Rime`, `TogetherAI`, `VoyageAI`, `_Gemini` +4. **Umbrella layer** + - `AI` + +## Component Dependency Graph + +In this graph, `CorePersistence`, `Merge`, `NetworkKit`, `Swallow`, and `SwiftUIX` are external package dependencies (not targets in this repository). + +```mermaid +graph TD + CoreMI --> CorePersistence + CoreMI --> Merge + CoreMI --> Swallow + + LargeLanguageModels --> CoreMI + LargeLanguageModels --> CorePersistence + LargeLanguageModels --> Merge + LargeLanguageModels --> NetworkKit + LargeLanguageModels --> Swallow + LargeLanguageModels --> SwiftUIX + + Anthropic --> LargeLanguageModels + OpenAI --> LargeLanguageModels + HuggingFace --> CoreMI + HuggingFace --> Swallow + + Cohere --> CoreMI + Cohere --> LargeLanguageModels + ElevenLabs --> CoreMI + ElevenLabs --> LargeLanguageModels + Groq --> CoreMI + Groq --> LargeLanguageModels + HumeAI --> CoreMI + HumeAI --> LargeLanguageModels + Jina --> CoreMI + Jina --> LargeLanguageModels + Mistral --> CoreMI + Mistral --> LargeLanguageModels + NeetsAI --> CoreMI + NeetsAI --> LargeLanguageModels + Ollama --> CoreMI + Ollama --> LargeLanguageModels + PlayHT --> CoreMI + PlayHT --> LargeLanguageModels + Rime --> CoreMI + Rime --> LargeLanguageModels + TogetherAI --> CoreMI + TogetherAI --> LargeLanguageModels + VoyageAI --> CoreMI + VoyageAI --> LargeLanguageModels + _Gemini --> CoreMI + _Gemini --> LargeLanguageModels + + Perplexity --> OpenAI + Perplexity --> CoreMI + Perplexity --> LargeLanguageModels + + AI --> CoreMI + AI --> LargeLanguageModels + AI --> Anthropic + AI --> Cohere + AI --> ElevenLabs + AI --> Groq + AI --> HuggingFace + AI --> Jina + AI --> Mistral + AI --> Ollama + AI --> OpenAI + + AI -. standalone product .-> HumeAI + AI -. standalone product .-> NeetsAI + AI -. standalone product .-> Perplexity + AI -. standalone product .-> PlayHT + AI -. standalone product .-> Rime + AI -. standalone product .-> TogetherAI + AI -. standalone product .-> VoyageAI + AI -. standalone product .-> _Gemini +``` +> Note: The `AI` umbrella target currently depends on `CoreMI`, `LargeLanguageModels`, `Anthropic`, `Cohere`, `ElevenLabs`, `Groq`, `HuggingFace`, `Jina`, `Mistral`, `Ollama`, and `OpenAI`. Other provider modules in this repository are distributed as standalone products and are not re-exported by `AI` in `Package.swift`. + +> Note: `HuggingFace` intentionally differs from most provider modules: in `Package.swift` it depends on `CoreMI` and `Swallow`, and does not depend on `LargeLanguageModels`. + +## External Dependencies + +- `CorePersistence` +- `Merge` +- `NetworkKit` +- `Swallow` +- `SwiftUIX` diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000..5e24f4c9 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,31 @@ +# Documentation + +Guides for the **AI** Swift package ([PreternaturalAI/AI](https://github.com/PreternaturalAI/AI)). + +| Document | Audience | Description | +|----------|----------|-------------| +| [../README.md](../README.md) | Everyone | Install, usage examples, architecture summary, dependency graph, roadmap | +| [ARCHITECTURE.md](ARCHITECTURE.md) | Contributors & integrators | Layers, products vs targets, Mermaid graphs, protocol matrix, tests | +| [../CONTRIBUTING.md](../CONTRIBUTING.md) | Contributors | Setup, PR process, adding providers | +| [../CHANGELOG.md](../CHANGELOG.md) | Everyone | Notable changes | +| [../LICENSE](../LICENSE) | Everyone | MIT | + +## Quick orientation + +```text +Package.swift products, targets, external deps +Sources/CoreMI foundations (requests, model IDs, services) +Sources/LargeLanguageModels AbstractLLM, prompts, embeddings protocols +Sources/ vendor clients +Sources/AI umbrella module (selective @_exported imports) +Tests/ parallel test targets (see ARCHITECTURE.md for gaps) +docs/ long-form documentation (this folder) +``` + +## Keeping docs honest + +When you change `Package.swift` or add a provider: + +1. Update the dependency graph and tables in [ARCHITECTURE.md](ARCHITECTURE.md). +2. Mirror user-facing bits in [../README.md](../README.md) (products, roadmap, import notes). +3. Note the change under `[Unreleased]` in [../CHANGELOG.md](../CHANGELOG.md). From d2244be8a1e87b55d795d5d8af040fea0ef890f2 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Sun, 16 Aug 2026 06:39:28 -0400 Subject: [PATCH 114/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#83) From e1cf1973f7078d2d2537bcfdc863e26b71c7561d Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Sun, 16 Aug 2026 06:39:47 -0400 Subject: [PATCH 115/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#84) --- .github/PULL_REQUEST_TEMPLATE.md | 31 +++ CHANGELOG.md | 12 ++ CONTRIBUTING.md | 78 +++++++ README.md | 335 +++++++++++++++++++++++++++---- docs/ARCHITECTURE.md | 100 +++++++++ docs/README.md | 31 +++ 6 files changed, 553 insertions(+), 34 deletions(-) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 CHANGELOG.md create mode 100644 CONTRIBUTING.md create mode 100644 docs/ARCHITECTURE.md create mode 100644 docs/README.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..7dfe0424 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,31 @@ +## Summary + + + +## Type of change + +- [ ] Bug fix +- [ ] New provider / API surface +- [ ] Refactor +- [ ] Documentation +- [ ] Tests / CI +- [ ] Other + +## Checklist + +- [ ] Builds with the package’s supported Xcode/Swift versions +- [ ] Tests added or updated when behavior changes +- [ ] No secrets or API keys committed +- [ ] Docs updated if products, targets, public API, or dependencies changed: + - [ ] `README.md` + - [ ] `docs/ARCHITECTURE.md` (graph / tables) + - [ ] `CHANGELOG.md` (`[Unreleased]`) +- [ ] Layering respected (providers β†’ `LargeLanguageModels` β†’ `CoreMI`; avoid new providerβ†’provider deps) + +## Test plan + + + +## Related issues + + diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..2896a4fd --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,12 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +## [Unreleased] + +### Added + +- Added architecture documentation in `docs/ARCHITECTURE.md`. +- Added contribution guidelines in `CONTRIBUTING.md`. +- Improved `README.md` with architecture, dependency graph, and documentation links. +- Added repository research and agent workflow guidance to `CONTRIBUTING.md`. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..0e562b86 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,78 @@ +# Contributing + +Thanks for contributing to AI. + +## Prerequisites + +- Xcode 15.4+ (Swift 5.10 toolchain) +- Apple platform SDKs supported by this package + +## Getting Started + +1. Fork the repository and create a feature branch. +2. Make focused changes with clear commit messages. +3. Run tests locally: + +```bash +swift test +``` + +4. Update documentation when behavior, APIs, or architecture changes. +5. Open a pull request with a clear summary and test notes. + +## Pull Request Checklist + +- [ ] Changes are scoped to one topic +- [ ] Public API changes are documented +- [ ] Tests pass locally (`swift test`) +- [ ] README/docs/changelog updated when needed + +## Repository Research Plan + +When working in this repository, start by identifying the layer and capability you are changing before touching code. + +1. Map the affected API surface: + - `Sources/CoreMI` + - `Sources/LargeLanguageModels` + - `Sources/AI` + - the specific provider target under `Sources/` +2. Inventory shared abstractions and extension points involved in the change: + - request handling + - model identifiers + - chat/completions + - embeddings + - audio, file, structured output, and tool-calling support +3. Compare provider parity for that capability to avoid introducing one-off patterns. +4. Audit the relevant tests under `Tests/` by capability as well as by provider. +5. Update docs when package products, imports, architecture, or behavior change. +6. Run `swift test` for code changes and record any notable validation steps in the pull request. + +## Agent / Workflow Roles + +Use focused ownership when splitting work across contributors or automation: + +- **Architecture**: owns module boundaries, `Package.swift`, and `docs/ARCHITECTURE.md`. +- **Core abstractions**: owns `CoreMI` and `LargeLanguageModels` protocols, shared request/response behavior, and compatibility across providers. +- **Provider**: owns one provider target at a time and aligns provider-specific APIs with shared abstractions. +- **Test**: expands coverage in `Tests/`, adds reusable fixtures/helpers, and verifies `swift test`. +- **Docs**: keeps `README.md`, `CONTRIBUTING.md`, `docs/ARCHITECTURE.md`, and `CHANGELOG.md` aligned with code changes. +- **Release / governance**: checks change scope, public API impact, dependency layering, and pull request hygiene. + +Recommended workflow: + +1. Scope work to one layer or one provider. +2. Review architecture or shared abstraction impact first. +3. Implement the provider or core change. +4. Update tests for behavior changes. +5. Update docs for API, product, or architecture changes. +6. Run `swift test`. +7. Review for consistency with neighboring providers before merging. + +## Reporting Issues + +When filing a bug, include: + +- Steps to reproduce +- Expected vs actual behavior +- Platform and Xcode/Swift versions +- Relevant logs or sample payloads diff --git a/README.md b/README.md index cf435eff..abb9f56b 100644 --- a/README.md +++ b/README.md @@ -1,68 +1,100 @@ -> [!IMPORTANT] +> πŸ•΄οΈ[!IMPORTANT] > This package is presently in its alpha stage of development (2026-03-04). ---- +#### Supported Platforms - +SPM platforms from [`Package.swift`](Package.swift): **iOS 16+**, **macOS 13+**, **tvOS 16+**, **visionOS 1+**, **watchOS 9+**. -#### Supported Platforms

- macos + macOS   - macos + iOS   - macos + iPadOS   - macos + tvOS   - macos + watchOS

+Also targets **visionOS** (badge art not yet in `Images/`). + # AI The definitive, open-source Swift framework for interfacing with generative AI. -[Installation](#installation)\ -[Usage](#usage) - -* [Import the framework](#import-the-framework) -* [Initialize an AI Client](#initialize-an-ai-client) -* [LLM Clients Abstraction](#llm-clients-abstraction) -* [Supported Models](#supported-models) -* [Completions](#completions) - * [Basic Completions](#basic-completions) - * [Vision: Image-to-Text](#vision-image-to-text) - * [Function Calling](#function-calling) -* [DALLE-3 Image Generation](#dalle-3-image-generation) -* [Audio](#audio) - * [Audio Transcription: Whisper](#audio-transcription-whisper) - * [Audio Generation: OpenAI](#audio-generation-openai) - * [Audio Generation: ElevenLabs](#audio-generation-elevenlabs) -* [Text Embeddings](#text-embeddings) - -[Roadmap](#roadmap) \ -[Acknowledgements](#acknowledgements) \ -[License](#license) +## Documentation + +- [Architecture](docs/ARCHITECTURE.md) +- [Contributing](CONTRIBUTING.md) +- [Changelog](CHANGELOG.md) + +## Table of Contents + +- [Architecture Overview](#architecture-overview) +- [Dependencies](#dependencies) +- [Installation](#installation) +- [Usage](#usage) + - [Import the framework](#import-the-framework) + - [Initialize an AI Client](#initialize-an-ai-client) + - [LLM Clients Abstraction](#llm-clients-abstraction) + - [Supported Models](#supported-models) + - [Completions](#completions) + - [Basic Completions](#basic-completions) + - [Vision: Image-to-Text](#vision-image-to-text) + - [Function Calling](#function-calling) + - [DALLE-3 Image Generation](#dalle-3-image-generation) + - [Audio](#audio) + - [Audio Transcription: Whisper](#audio-transcription-whisper) + - [Audio Generation: OpenAI](#audio-generation-openai) + - [Audio Generation: ElevenLabs](#audio-generation-elevenlabs) + - [Text Embeddings](#text-embeddings) +- [Roadmap](#roadmap) +- [Acknowledgements](#acknowledgements) +- [License](#license) + +## Architecture Overview + +This package is organized as a Swift Package Manager workspace with layered modules: + +- `CoreMI` provides shared core abstractions used across providers. +- `LargeLanguageModels` builds common LLM request/response functionality on top of `CoreMI`. +- Provider modules (`OpenAI`, `Anthropic`, `Mistral`, `Groq`, `ElevenLabs`, etc.) implement vendor-specific APIs. +- `AI` is the umbrella product that re-exports the main modules for one-stop integration. + +### Component Dependency Graph + +A full dependency graph generated from `Package.swift` target dependencies is available in [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md#component-dependency-graph). + +## Dependencies + +External package dependencies declared in `Package.swift`: + +- [`CorePersistence`](https://github.com/vmanot/CorePersistence) +- [`Merge`](https://github.com/vmanot/Merge) +- [`NetworkKit`](https://github.com/vmanot/NetworkKit) +- [`Swallow`](https://github.com/vmanot/Swallow) +- [`SwiftUIX`](https://github.com/SwiftUIX/SwiftUIX) # Installation @@ -74,6 +106,179 @@ The definitive, open-source Swift framework for interfacing with generative AI. 4. Choose the version you'd like to install. 5. Click `Add Package`. +Or add the dependency in `Package.swift`: + +```swift +dependencies: [ + .package(url: "https://github.com/PreternaturalAI/AI.git", branch: "main") +] +``` + +Then link the `AI` product (umbrella) or a standalone product such as `OpenAI`, `Anthropic`, or `Perplexity` (see [Architecture](#architecture)). + +# Architecture + +The package is organized in layers. Provider SDKs implement shared protocols (`LLMRequestHandling`, embeddings, TTS, and so on) defined in the core modules. + +| Layer | Modules | Responsibility | +|-------|---------|----------------| +| Umbrella module | `AI` | `@_exported` re-exports **CoreMI**, **LargeLanguageModels**, **OpenAI** (and Swallow macros client). Other bundled modules still need their own `import`. | +| Umbrella product | `AI` library | SPM product that **links** core + Anthropic, Cohere, ElevenLabs, Groq, HuggingFace, Jina, Mistral, Ollama, OpenAI, and the `AI` module | +| Providers | `OpenAI`, `Anthropic`, `Mistral`, `Groq`, `Ollama`, `Perplexity`, `Cohere`, `Jina`, `VoyageAI`, `TogetherAI`, `ElevenLabs`, `PlayHT`, `Rime`, `HumeAI`, `NeetsAI`, `_Gemini`, `HuggingFace`, … | API clients and model types | +| LLM abstractions | `LargeLanguageModels` | `AbstractLLM`, `PromptLiteral`, chat/function-calling, embeddings protocols | +| Foundations | `CoreMI` | Request handling, model identifiers, service credentials, ASR/TTS bases | +| External | Swallow, Merge, NetworkKit, CorePersistence, SwiftUIX | Shared infrastructure (see [Dependencies](#dependencies)) | + +`import AI` is enough for OpenAI + shared LLM types. For other clients linked by the product, add e.g. `import Anthropic` or `import Groq`. Providers shipped only as standalone products (`Perplexity`, `_Gemini`, `VoyageAI`, …) require linking that product. + +### Component dependency graph + +Graph of **package targets** as declared in [`Package.swift`](Package.swift) (external packages shown once at the bottom). For products, tests, and design notes, see **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)**. + +```mermaid +flowchart TB + subgraph umbrella [Umbrella] + AI + end + + subgraph providers [Provider targets] + OpenAI + Anthropic + Mistral + Groq + Ollama + Perplexity + Cohere + Jina + VoyageAI + TogetherAI + ElevenLabs + PlayHT + Rime + HumeAI + NeetsAI + Gemini["_Gemini"] + HuggingFace + end + + subgraph core [Core targets] + LargeLanguageModels + CoreMI + end + + subgraph external [External packages] + Swallow + Merge + NetworkKit + CorePersistence + SwiftUIX + end + + AI --> CoreMI + AI --> LargeLanguageModels + AI --> OpenAI + AI --> Anthropic + AI --> Mistral + AI --> Groq + AI --> Ollama + AI --> Cohere + AI --> ElevenLabs + AI --> HuggingFace + AI --> Jina + + OpenAI --> LargeLanguageModels + Anthropic --> LargeLanguageModels + Mistral --> LargeLanguageModels + Groq --> LargeLanguageModels + Ollama --> LargeLanguageModels + Perplexity --> LargeLanguageModels + Perplexity --> OpenAI + Cohere --> LargeLanguageModels + Jina --> LargeLanguageModels + VoyageAI --> LargeLanguageModels + TogetherAI --> LargeLanguageModels + ElevenLabs --> LargeLanguageModels + PlayHT --> LargeLanguageModels + Rime --> LargeLanguageModels + HumeAI --> LargeLanguageModels + NeetsAI --> LargeLanguageModels + Gemini --> LargeLanguageModels + HuggingFace --> CoreMI + + LargeLanguageModels --> CoreMI + LargeLanguageModels --> CorePersistence + LargeLanguageModels --> Merge + LargeLanguageModels --> NetworkKit + LargeLanguageModels --> Swallow + LargeLanguageModels --> SwiftUIX + + CoreMI --> CorePersistence + CoreMI --> Merge + CoreMI --> Swallow +``` + +**Notes** + +- Most providers also depend on `CoreMI`, `CorePersistence`, `Merge`, `NetworkKit`, and `Swallow` directly (edges omitted above for readability where they already flow through `LargeLanguageModels`). +- **OpenAI** and **Anthropic** depend on `LargeLanguageModels` + networking stack, not on `CoreMI` directly in `Package.swift`. +- **Perplexity** is the only provider that depends on another provider target (`OpenAI`). +- **HuggingFace** depends on `CoreMI` + `Swallow` only (hub/tokenizer helpers, not the full LLM stack). +- The `AI` **product** does **not** link every target (for example `_Gemini`, `Perplexity`, `PlayHT`, `Rime`, `TogetherAI`, `VoyageAI`, `HumeAI`, `NeetsAI` are separate products). +- The `AI` **module** re-exports only CoreMI, LargeLanguageModels, and OpenAI among first-party modules (`Sources/AI/module.swift`). + +### Protocol capabilities (from source) + +Which shared protocols have an explicit client conformance today: + +| Target | `LLMRequestHandling` | `TextEmbeddingsRequestHandling` | Notes | +|--------|:--------------------:|:-------------------------------:|-------| +| OpenAI | yes | yes | Also images, Whisper, speech, assistants | +| Anthropic | yes | | | +| Mistral | yes | yes | | +| Groq | yes | | | +| Ollama | yes | | | +| Perplexity | yes | | Depends on OpenAI target | +| Cohere | | yes | | +| Jina | | yes | | +| VoyageAI | | yes | | +| TogetherAI, ElevenLabs, PlayHT, Rime, HumeAI, NeetsAI, _Gemini, HuggingFace | | | Provider-specific client APIs / hub helpers (see `Sources/`) | + +Full layering detail: **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)**. Docs index: **[docs/README.md](docs/README.md)**. + +# Dependencies + +### External Swift packages + +| Package | Repository | Role | +|---------|------------|------| +| Swallow | [vmanot/Swallow](https://github.com/vmanot/Swallow) | Extensions, macros client, diagnostics | +| Merge | [vmanot/Merge](https://github.com/vmanot/Merge) | Concurrency / async utilities | +| NetworkKit | [vmanot/NetworkKit](https://github.com/vmanot/NetworkKit) | HTTP client & API specifications | +| CorePersistence | [vmanot/CorePersistence](https://github.com/vmanot/CorePersistence) | Persistence & schema helpers (e.g. JSONSchema) | +| SwiftUIX | [SwiftUIX/SwiftUIX](https://github.com/SwiftUIX/SwiftUIX) | SwiftUI extensions | + +Transitive pins (see [`Package.resolved`](Package.resolved)) include **SwiftAPI**, **swift-collections**, and **swift-syntax**. + +### SPM products you can link + +Exact product names from `Package.swift`: + +| Product | Targets exposed | Use when | +|---------|-----------------|----------| +| `AI` | CoreMI, LargeLanguageModels, Anthropic, Cohere, ElevenLabs, Groq, HuggingFace, Jina, Mistral, Ollama, OpenAI, AI | Default multi-provider app dependency | +| `OpenAI` | OpenAI | OpenAI-only | +| `Anthropic` | Anthropic | Anthropic-only | +| `Perplexity` | Perplexity | Perplexity (pulls OpenAI transitively) | +| `TogetherAI` | TogetherAI | Together AI | +| `VoyageAI` | VoyageAI | Voyage embeddings | +| `PlayHT` | PlayHT | PlayHT voice | +| `Rime` | Rime | Rime voice | +| `HumeAI` | HumeAI | Hume | +| `NeetsAI` | NeetsAI | Neets | +| `_Gemini` | _Gemini | Google Gemini client | + +There is **no** standalone SPM product today for `CoreMI`, `LargeLanguageModels`, `Cohere`, `Groq`, `HuggingFace`, `Jina`, `Mistral`, `Ollama`, or `ElevenLabs` β€” consume them via the `AI` product (or add a product in `Package.swift` if you need a leaner slice). + # Usage ## Import the framework @@ -551,14 +756,76 @@ let embeddings = try await LLMManager.client.textEmbeddings( return embeddings.data.first?.embedding.description ``` +# Documentation + +| Document | Contents | +|----------|----------| +| **[docs/README.md](docs/README.md)** | Documentation index | +| **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)** | Full architecture, products vs targets, Mermaid graph, protocol matrix, tests | +| **[CONTRIBUTING.md](CONTRIBUTING.md)** | Dev setup, coding guidelines, how to add a provider | +| **[CHANGELOG.md](CHANGELOG.md)** | Release notes and unreleased changes | +| **[LICENSE](LICENSE)** | MIT License text | + +API behavior is illustrated in the [Usage](#usage) sections above; protocol details live in `Sources/LargeLanguageModels` and `Sources/CoreMI`. + # Roadmap -- [x] OpenAI +Status reflects modules present in this repository (`Sources/` + `Package.swift`). Checked items ship as package targets; depth of feature coverage varies by provider. + +### Core + +- [x] `CoreMI` β€” request handling, model identifiers, services, ASR/TTS foundations +- [x] `LargeLanguageModels` β€” `AbstractLLM`, prompts, function calling, embeddings protocols +- [x] `AI` umbrella product + +### LLM & multimodal providers + +- [x] OpenAI (chat, vision, tools, images, Whisper, speech) - [x] Anthropic - [x] Mistral +- [x] Groq - [x] Ollama -- [ ] Perplexity -- [ ] Groq +- [x] Perplexity +- [x] TogetherAI +- [x] `_Gemini` (Google Gemini client; standalone product) +- [ ] Broader parity matrix (streaming, tools, vision) across every LLM provider + +### Embeddings & hub + +- [x] OpenAI embeddings +- [x] Cohere +- [x] Jina +- [x] VoyageAI +- [x] Hugging Face hub helpers / tokenizer resources + +### Voice & speech + +- [x] ElevenLabs +- [x] PlayHT +- [x] Rime +- [x] HumeAI +- [x] NeetsAI +- [x] OpenAI TTS / Whisper + +### Project hygiene + +- [x] Architecture & dependency documentation +- [x] Contributing guide, docs index, PR template & changelog +- [ ] Register missing test targets (Ollama, Rime, TogetherAI folder) +- [ ] visionOS badge artwork under `Images/` +- [ ] Tagged semantic releases with automated changelog sections + +# Contributing + +Contributions are welcome. Please read **[CONTRIBUTING.md](CONTRIBUTING.md)** for: + +- Environment and build requirements +- PR expectations and testing notes +- Steps to add or extend a provider without breaking layering rules + +# Changelog + +See **[CHANGELOG.md](CHANGELOG.md)** for user-visible changes. The package is in **alpha**; expect API evolution between releases. # Acknowledgements @@ -567,4 +834,4 @@ return embeddings.data.first?.embedding.description # License -This package is licensed under the MIT License. +This package is licensed under the [MIT License](LICENSE). diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md new file mode 100644 index 00000000..913a99c8 --- /dev/null +++ b/docs/ARCHITECTURE.md @@ -0,0 +1,100 @@ +# Architecture + +This document summarizes the package architecture as defined in `Package.swift`. + +## Module Layers + +1. **Core layer** + - `CoreMI` +2. **LLM abstraction layer** + - `LargeLanguageModels` +3. **Provider layer** + - `Anthropic`, `Cohere`, `ElevenLabs`, `Groq`, `HuggingFace`, `HumeAI`, `Jina`, `Mistral`, `NeetsAI`, `Ollama`, `OpenAI`, `Perplexity`, `PlayHT`, `Rime`, `TogetherAI`, `VoyageAI`, `_Gemini` +4. **Umbrella layer** + - `AI` + +## Component Dependency Graph + +In this graph, `CorePersistence`, `Merge`, `NetworkKit`, `Swallow`, and `SwiftUIX` are external package dependencies (not targets in this repository). + +```mermaid +graph TD + CoreMI --> CorePersistence + CoreMI --> Merge + CoreMI --> Swallow + + LargeLanguageModels --> CoreMI + LargeLanguageModels --> CorePersistence + LargeLanguageModels --> Merge + LargeLanguageModels --> NetworkKit + LargeLanguageModels --> Swallow + LargeLanguageModels --> SwiftUIX + + Anthropic --> LargeLanguageModels + OpenAI --> LargeLanguageModels + HuggingFace --> CoreMI + HuggingFace --> Swallow + + Cohere --> CoreMI + Cohere --> LargeLanguageModels + ElevenLabs --> CoreMI + ElevenLabs --> LargeLanguageModels + Groq --> CoreMI + Groq --> LargeLanguageModels + HumeAI --> CoreMI + HumeAI --> LargeLanguageModels + Jina --> CoreMI + Jina --> LargeLanguageModels + Mistral --> CoreMI + Mistral --> LargeLanguageModels + NeetsAI --> CoreMI + NeetsAI --> LargeLanguageModels + Ollama --> CoreMI + Ollama --> LargeLanguageModels + PlayHT --> CoreMI + PlayHT --> LargeLanguageModels + Rime --> CoreMI + Rime --> LargeLanguageModels + TogetherAI --> CoreMI + TogetherAI --> LargeLanguageModels + VoyageAI --> CoreMI + VoyageAI --> LargeLanguageModels + _Gemini --> CoreMI + _Gemini --> LargeLanguageModels + + Perplexity --> OpenAI + Perplexity --> CoreMI + Perplexity --> LargeLanguageModels + + AI --> CoreMI + AI --> LargeLanguageModels + AI --> Anthropic + AI --> Cohere + AI --> ElevenLabs + AI --> Groq + AI --> HuggingFace + AI --> Jina + AI --> Mistral + AI --> Ollama + AI --> OpenAI + + AI -. standalone product .-> HumeAI + AI -. standalone product .-> NeetsAI + AI -. standalone product .-> Perplexity + AI -. standalone product .-> PlayHT + AI -. standalone product .-> Rime + AI -. standalone product .-> TogetherAI + AI -. standalone product .-> VoyageAI + AI -. standalone product .-> _Gemini +``` +> Note: The `AI` umbrella target currently depends on `CoreMI`, `LargeLanguageModels`, `Anthropic`, `Cohere`, `ElevenLabs`, `Groq`, `HuggingFace`, `Jina`, `Mistral`, `Ollama`, and `OpenAI`. Other provider modules in this repository are distributed as standalone products and are not re-exported by `AI` in `Package.swift`. + +> Note: `HuggingFace` intentionally differs from most provider modules: in `Package.swift` it depends on `CoreMI` and `Swallow`, and does not depend on `LargeLanguageModels`. + +## External Dependencies + +- `CorePersistence` +- `Merge` +- `NetworkKit` +- `Swallow` +- `SwiftUIX` diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000..5e24f4c9 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,31 @@ +# Documentation + +Guides for the **AI** Swift package ([PreternaturalAI/AI](https://github.com/PreternaturalAI/AI)). + +| Document | Audience | Description | +|----------|----------|-------------| +| [../README.md](../README.md) | Everyone | Install, usage examples, architecture summary, dependency graph, roadmap | +| [ARCHITECTURE.md](ARCHITECTURE.md) | Contributors & integrators | Layers, products vs targets, Mermaid graphs, protocol matrix, tests | +| [../CONTRIBUTING.md](../CONTRIBUTING.md) | Contributors | Setup, PR process, adding providers | +| [../CHANGELOG.md](../CHANGELOG.md) | Everyone | Notable changes | +| [../LICENSE](../LICENSE) | Everyone | MIT | + +## Quick orientation + +```text +Package.swift products, targets, external deps +Sources/CoreMI foundations (requests, model IDs, services) +Sources/LargeLanguageModels AbstractLLM, prompts, embeddings protocols +Sources/ vendor clients +Sources/AI umbrella module (selective @_exported imports) +Tests/ parallel test targets (see ARCHITECTURE.md for gaps) +docs/ long-form documentation (this folder) +``` + +## Keeping docs honest + +When you change `Package.swift` or add a provider: + +1. Update the dependency graph and tables in [ARCHITECTURE.md](ARCHITECTURE.md). +2. Mirror user-facing bits in [../README.md](../README.md) (products, roadmap, import notes). +3. Note the change under `[Unreleased]` in [../CHANGELOG.md](../CHANGELOG.md). From cb4301693484bf3b36d30beb4ccb94b827f219fb Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Sun, 16 Aug 2026 10:07:15 -0400 Subject: [PATCH 116/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#87) From 1fd47affe188dd13de53cc76de5df039889fd18c Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Sun, 16 Aug 2026 10:08:10 -0400 Subject: [PATCH 117/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) From 21c8a2a2a9890031f3c1f186cd481fbe7f387ebe Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Sun, 16 Aug 2026 10:08:32 -0400 Subject: [PATCH 118/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#90) --- CHANGELOG.md | 1 + CONTRIBUTING.md | 41 +++++++++++++++++++++++++++++++++++++++++ README.md | 2 +- 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cfb3a06d..2896a4fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,3 +9,4 @@ All notable changes to this project will be documented in this file. - Added architecture documentation in `docs/ARCHITECTURE.md`. - Added contribution guidelines in `CONTRIBUTING.md`. - Improved `README.md` with architecture, dependency graph, and documentation links. +- Added repository research and agent workflow guidance to `CONTRIBUTING.md`. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1f9c2b44..0e562b86 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -27,6 +27,47 @@ swift test - [ ] Tests pass locally (`swift test`) - [ ] README/docs/changelog updated when needed +## Repository Research Plan + +When working in this repository, start by identifying the layer and capability you are changing before touching code. + +1. Map the affected API surface: + - `Sources/CoreMI` + - `Sources/LargeLanguageModels` + - `Sources/AI` + - the specific provider target under `Sources/` +2. Inventory shared abstractions and extension points involved in the change: + - request handling + - model identifiers + - chat/completions + - embeddings + - audio, file, structured output, and tool-calling support +3. Compare provider parity for that capability to avoid introducing one-off patterns. +4. Audit the relevant tests under `Tests/` by capability as well as by provider. +5. Update docs when package products, imports, architecture, or behavior change. +6. Run `swift test` for code changes and record any notable validation steps in the pull request. + +## Agent / Workflow Roles + +Use focused ownership when splitting work across contributors or automation: + +- **Architecture**: owns module boundaries, `Package.swift`, and `docs/ARCHITECTURE.md`. +- **Core abstractions**: owns `CoreMI` and `LargeLanguageModels` protocols, shared request/response behavior, and compatibility across providers. +- **Provider**: owns one provider target at a time and aligns provider-specific APIs with shared abstractions. +- **Test**: expands coverage in `Tests/`, adds reusable fixtures/helpers, and verifies `swift test`. +- **Docs**: keeps `README.md`, `CONTRIBUTING.md`, `docs/ARCHITECTURE.md`, and `CHANGELOG.md` aligned with code changes. +- **Release / governance**: checks change scope, public API impact, dependency layering, and pull request hygiene. + +Recommended workflow: + +1. Scope work to one layer or one provider. +2. Review architecture or shared abstraction impact first. +3. Implement the provider or core change. +4. Update tests for behavior changes. +5. Update docs for API, product, or architecture changes. +6. Run `swift test`. +7. Review for consistency with neighboring providers before merging. + ## Reporting Issues When filing a bug, include: diff --git a/README.md b/README.md index 388e6c54..abb9f56b 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -> [!IMPORTANT] +> πŸ•΄οΈ[!IMPORTANT] > This package is presently in its alpha stage of development (2026-03-04). #### Supported Platforms From 7674d132e1c41a9186797b29630342772a8dda3a Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Sun, 16 Aug 2026 10:09:09 -0400 Subject: [PATCH 119/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) From a3a0bd7adb975e1728a7458eb477c1bd1a9d3f32 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Sun, 16 Aug 2026 10:54:58 -0400 Subject: [PATCH 120/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#84) (#97) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 388e6c54..abb9f56b 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -> [!IMPORTANT] +> πŸ•΄οΈ[!IMPORTANT] > This package is presently in its alpha stage of development (2026-03-04). #### Supported Platforms From 101e11b74edd11213d078a48a6e883ca6a3b44c7 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Sun, 16 Aug 2026 10:55:15 -0400 Subject: [PATCH 121/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#98) From 027fd5a4fb47c2ea6af46512991424716bee956e Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Sun, 16 Aug 2026 10:55:39 -0400 Subject: [PATCH 122/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#99) From 8211531ff21b7d69ea91bfd29a895a67b9228b0a Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Sun, 16 Aug 2026 10:55:57 -0400 Subject: [PATCH 123/271] Merge pull request #27 from 5hy7xz92nd-oss/main (#100) From 85844dfc7e48c8b99bd9306634fd22826dc2d55b Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Sun, 16 Aug 2026 10:58:16 -0400 Subject: [PATCH 124/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#99) (#102) --- .github/PULL_REQUEST_TEMPLATE.md | 31 +++ CHANGELOG.md | 12 ++ CONTRIBUTING.md | 78 +++++++ README.md | 335 +++++++++++++++++++++++++++---- docs/ARCHITECTURE.md | 100 +++++++++ docs/README.md | 31 +++ 6 files changed, 553 insertions(+), 34 deletions(-) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 CHANGELOG.md create mode 100644 CONTRIBUTING.md create mode 100644 docs/ARCHITECTURE.md create mode 100644 docs/README.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..7dfe0424 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,31 @@ +## Summary + + + +## Type of change + +- [ ] Bug fix +- [ ] New provider / API surface +- [ ] Refactor +- [ ] Documentation +- [ ] Tests / CI +- [ ] Other + +## Checklist + +- [ ] Builds with the package’s supported Xcode/Swift versions +- [ ] Tests added or updated when behavior changes +- [ ] No secrets or API keys committed +- [ ] Docs updated if products, targets, public API, or dependencies changed: + - [ ] `README.md` + - [ ] `docs/ARCHITECTURE.md` (graph / tables) + - [ ] `CHANGELOG.md` (`[Unreleased]`) +- [ ] Layering respected (providers β†’ `LargeLanguageModels` β†’ `CoreMI`; avoid new providerβ†’provider deps) + +## Test plan + + + +## Related issues + + diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..2896a4fd --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,12 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +## [Unreleased] + +### Added + +- Added architecture documentation in `docs/ARCHITECTURE.md`. +- Added contribution guidelines in `CONTRIBUTING.md`. +- Improved `README.md` with architecture, dependency graph, and documentation links. +- Added repository research and agent workflow guidance to `CONTRIBUTING.md`. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..0e562b86 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,78 @@ +# Contributing + +Thanks for contributing to AI. + +## Prerequisites + +- Xcode 15.4+ (Swift 5.10 toolchain) +- Apple platform SDKs supported by this package + +## Getting Started + +1. Fork the repository and create a feature branch. +2. Make focused changes with clear commit messages. +3. Run tests locally: + +```bash +swift test +``` + +4. Update documentation when behavior, APIs, or architecture changes. +5. Open a pull request with a clear summary and test notes. + +## Pull Request Checklist + +- [ ] Changes are scoped to one topic +- [ ] Public API changes are documented +- [ ] Tests pass locally (`swift test`) +- [ ] README/docs/changelog updated when needed + +## Repository Research Plan + +When working in this repository, start by identifying the layer and capability you are changing before touching code. + +1. Map the affected API surface: + - `Sources/CoreMI` + - `Sources/LargeLanguageModels` + - `Sources/AI` + - the specific provider target under `Sources/` +2. Inventory shared abstractions and extension points involved in the change: + - request handling + - model identifiers + - chat/completions + - embeddings + - audio, file, structured output, and tool-calling support +3. Compare provider parity for that capability to avoid introducing one-off patterns. +4. Audit the relevant tests under `Tests/` by capability as well as by provider. +5. Update docs when package products, imports, architecture, or behavior change. +6. Run `swift test` for code changes and record any notable validation steps in the pull request. + +## Agent / Workflow Roles + +Use focused ownership when splitting work across contributors or automation: + +- **Architecture**: owns module boundaries, `Package.swift`, and `docs/ARCHITECTURE.md`. +- **Core abstractions**: owns `CoreMI` and `LargeLanguageModels` protocols, shared request/response behavior, and compatibility across providers. +- **Provider**: owns one provider target at a time and aligns provider-specific APIs with shared abstractions. +- **Test**: expands coverage in `Tests/`, adds reusable fixtures/helpers, and verifies `swift test`. +- **Docs**: keeps `README.md`, `CONTRIBUTING.md`, `docs/ARCHITECTURE.md`, and `CHANGELOG.md` aligned with code changes. +- **Release / governance**: checks change scope, public API impact, dependency layering, and pull request hygiene. + +Recommended workflow: + +1. Scope work to one layer or one provider. +2. Review architecture or shared abstraction impact first. +3. Implement the provider or core change. +4. Update tests for behavior changes. +5. Update docs for API, product, or architecture changes. +6. Run `swift test`. +7. Review for consistency with neighboring providers before merging. + +## Reporting Issues + +When filing a bug, include: + +- Steps to reproduce +- Expected vs actual behavior +- Platform and Xcode/Swift versions +- Relevant logs or sample payloads diff --git a/README.md b/README.md index cf435eff..abb9f56b 100644 --- a/README.md +++ b/README.md @@ -1,68 +1,100 @@ -> [!IMPORTANT] +> πŸ•΄οΈ[!IMPORTANT] > This package is presently in its alpha stage of development (2026-03-04). ---- +#### Supported Platforms - +SPM platforms from [`Package.swift`](Package.swift): **iOS 16+**, **macOS 13+**, **tvOS 16+**, **visionOS 1+**, **watchOS 9+**. -#### Supported Platforms

- macos + macOS   - macos + iOS   - macos + iPadOS   - macos + tvOS   - macos + watchOS

+Also targets **visionOS** (badge art not yet in `Images/`). + # AI The definitive, open-source Swift framework for interfacing with generative AI. -[Installation](#installation)\ -[Usage](#usage) - -* [Import the framework](#import-the-framework) -* [Initialize an AI Client](#initialize-an-ai-client) -* [LLM Clients Abstraction](#llm-clients-abstraction) -* [Supported Models](#supported-models) -* [Completions](#completions) - * [Basic Completions](#basic-completions) - * [Vision: Image-to-Text](#vision-image-to-text) - * [Function Calling](#function-calling) -* [DALLE-3 Image Generation](#dalle-3-image-generation) -* [Audio](#audio) - * [Audio Transcription: Whisper](#audio-transcription-whisper) - * [Audio Generation: OpenAI](#audio-generation-openai) - * [Audio Generation: ElevenLabs](#audio-generation-elevenlabs) -* [Text Embeddings](#text-embeddings) - -[Roadmap](#roadmap) \ -[Acknowledgements](#acknowledgements) \ -[License](#license) +## Documentation + +- [Architecture](docs/ARCHITECTURE.md) +- [Contributing](CONTRIBUTING.md) +- [Changelog](CHANGELOG.md) + +## Table of Contents + +- [Architecture Overview](#architecture-overview) +- [Dependencies](#dependencies) +- [Installation](#installation) +- [Usage](#usage) + - [Import the framework](#import-the-framework) + - [Initialize an AI Client](#initialize-an-ai-client) + - [LLM Clients Abstraction](#llm-clients-abstraction) + - [Supported Models](#supported-models) + - [Completions](#completions) + - [Basic Completions](#basic-completions) + - [Vision: Image-to-Text](#vision-image-to-text) + - [Function Calling](#function-calling) + - [DALLE-3 Image Generation](#dalle-3-image-generation) + - [Audio](#audio) + - [Audio Transcription: Whisper](#audio-transcription-whisper) + - [Audio Generation: OpenAI](#audio-generation-openai) + - [Audio Generation: ElevenLabs](#audio-generation-elevenlabs) + - [Text Embeddings](#text-embeddings) +- [Roadmap](#roadmap) +- [Acknowledgements](#acknowledgements) +- [License](#license) + +## Architecture Overview + +This package is organized as a Swift Package Manager workspace with layered modules: + +- `CoreMI` provides shared core abstractions used across providers. +- `LargeLanguageModels` builds common LLM request/response functionality on top of `CoreMI`. +- Provider modules (`OpenAI`, `Anthropic`, `Mistral`, `Groq`, `ElevenLabs`, etc.) implement vendor-specific APIs. +- `AI` is the umbrella product that re-exports the main modules for one-stop integration. + +### Component Dependency Graph + +A full dependency graph generated from `Package.swift` target dependencies is available in [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md#component-dependency-graph). + +## Dependencies + +External package dependencies declared in `Package.swift`: + +- [`CorePersistence`](https://github.com/vmanot/CorePersistence) +- [`Merge`](https://github.com/vmanot/Merge) +- [`NetworkKit`](https://github.com/vmanot/NetworkKit) +- [`Swallow`](https://github.com/vmanot/Swallow) +- [`SwiftUIX`](https://github.com/SwiftUIX/SwiftUIX) # Installation @@ -74,6 +106,179 @@ The definitive, open-source Swift framework for interfacing with generative AI. 4. Choose the version you'd like to install. 5. Click `Add Package`. +Or add the dependency in `Package.swift`: + +```swift +dependencies: [ + .package(url: "https://github.com/PreternaturalAI/AI.git", branch: "main") +] +``` + +Then link the `AI` product (umbrella) or a standalone product such as `OpenAI`, `Anthropic`, or `Perplexity` (see [Architecture](#architecture)). + +# Architecture + +The package is organized in layers. Provider SDKs implement shared protocols (`LLMRequestHandling`, embeddings, TTS, and so on) defined in the core modules. + +| Layer | Modules | Responsibility | +|-------|---------|----------------| +| Umbrella module | `AI` | `@_exported` re-exports **CoreMI**, **LargeLanguageModels**, **OpenAI** (and Swallow macros client). Other bundled modules still need their own `import`. | +| Umbrella product | `AI` library | SPM product that **links** core + Anthropic, Cohere, ElevenLabs, Groq, HuggingFace, Jina, Mistral, Ollama, OpenAI, and the `AI` module | +| Providers | `OpenAI`, `Anthropic`, `Mistral`, `Groq`, `Ollama`, `Perplexity`, `Cohere`, `Jina`, `VoyageAI`, `TogetherAI`, `ElevenLabs`, `PlayHT`, `Rime`, `HumeAI`, `NeetsAI`, `_Gemini`, `HuggingFace`, … | API clients and model types | +| LLM abstractions | `LargeLanguageModels` | `AbstractLLM`, `PromptLiteral`, chat/function-calling, embeddings protocols | +| Foundations | `CoreMI` | Request handling, model identifiers, service credentials, ASR/TTS bases | +| External | Swallow, Merge, NetworkKit, CorePersistence, SwiftUIX | Shared infrastructure (see [Dependencies](#dependencies)) | + +`import AI` is enough for OpenAI + shared LLM types. For other clients linked by the product, add e.g. `import Anthropic` or `import Groq`. Providers shipped only as standalone products (`Perplexity`, `_Gemini`, `VoyageAI`, …) require linking that product. + +### Component dependency graph + +Graph of **package targets** as declared in [`Package.swift`](Package.swift) (external packages shown once at the bottom). For products, tests, and design notes, see **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)**. + +```mermaid +flowchart TB + subgraph umbrella [Umbrella] + AI + end + + subgraph providers [Provider targets] + OpenAI + Anthropic + Mistral + Groq + Ollama + Perplexity + Cohere + Jina + VoyageAI + TogetherAI + ElevenLabs + PlayHT + Rime + HumeAI + NeetsAI + Gemini["_Gemini"] + HuggingFace + end + + subgraph core [Core targets] + LargeLanguageModels + CoreMI + end + + subgraph external [External packages] + Swallow + Merge + NetworkKit + CorePersistence + SwiftUIX + end + + AI --> CoreMI + AI --> LargeLanguageModels + AI --> OpenAI + AI --> Anthropic + AI --> Mistral + AI --> Groq + AI --> Ollama + AI --> Cohere + AI --> ElevenLabs + AI --> HuggingFace + AI --> Jina + + OpenAI --> LargeLanguageModels + Anthropic --> LargeLanguageModels + Mistral --> LargeLanguageModels + Groq --> LargeLanguageModels + Ollama --> LargeLanguageModels + Perplexity --> LargeLanguageModels + Perplexity --> OpenAI + Cohere --> LargeLanguageModels + Jina --> LargeLanguageModels + VoyageAI --> LargeLanguageModels + TogetherAI --> LargeLanguageModels + ElevenLabs --> LargeLanguageModels + PlayHT --> LargeLanguageModels + Rime --> LargeLanguageModels + HumeAI --> LargeLanguageModels + NeetsAI --> LargeLanguageModels + Gemini --> LargeLanguageModels + HuggingFace --> CoreMI + + LargeLanguageModels --> CoreMI + LargeLanguageModels --> CorePersistence + LargeLanguageModels --> Merge + LargeLanguageModels --> NetworkKit + LargeLanguageModels --> Swallow + LargeLanguageModels --> SwiftUIX + + CoreMI --> CorePersistence + CoreMI --> Merge + CoreMI --> Swallow +``` + +**Notes** + +- Most providers also depend on `CoreMI`, `CorePersistence`, `Merge`, `NetworkKit`, and `Swallow` directly (edges omitted above for readability where they already flow through `LargeLanguageModels`). +- **OpenAI** and **Anthropic** depend on `LargeLanguageModels` + networking stack, not on `CoreMI` directly in `Package.swift`. +- **Perplexity** is the only provider that depends on another provider target (`OpenAI`). +- **HuggingFace** depends on `CoreMI` + `Swallow` only (hub/tokenizer helpers, not the full LLM stack). +- The `AI` **product** does **not** link every target (for example `_Gemini`, `Perplexity`, `PlayHT`, `Rime`, `TogetherAI`, `VoyageAI`, `HumeAI`, `NeetsAI` are separate products). +- The `AI` **module** re-exports only CoreMI, LargeLanguageModels, and OpenAI among first-party modules (`Sources/AI/module.swift`). + +### Protocol capabilities (from source) + +Which shared protocols have an explicit client conformance today: + +| Target | `LLMRequestHandling` | `TextEmbeddingsRequestHandling` | Notes | +|--------|:--------------------:|:-------------------------------:|-------| +| OpenAI | yes | yes | Also images, Whisper, speech, assistants | +| Anthropic | yes | | | +| Mistral | yes | yes | | +| Groq | yes | | | +| Ollama | yes | | | +| Perplexity | yes | | Depends on OpenAI target | +| Cohere | | yes | | +| Jina | | yes | | +| VoyageAI | | yes | | +| TogetherAI, ElevenLabs, PlayHT, Rime, HumeAI, NeetsAI, _Gemini, HuggingFace | | | Provider-specific client APIs / hub helpers (see `Sources/`) | + +Full layering detail: **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)**. Docs index: **[docs/README.md](docs/README.md)**. + +# Dependencies + +### External Swift packages + +| Package | Repository | Role | +|---------|------------|------| +| Swallow | [vmanot/Swallow](https://github.com/vmanot/Swallow) | Extensions, macros client, diagnostics | +| Merge | [vmanot/Merge](https://github.com/vmanot/Merge) | Concurrency / async utilities | +| NetworkKit | [vmanot/NetworkKit](https://github.com/vmanot/NetworkKit) | HTTP client & API specifications | +| CorePersistence | [vmanot/CorePersistence](https://github.com/vmanot/CorePersistence) | Persistence & schema helpers (e.g. JSONSchema) | +| SwiftUIX | [SwiftUIX/SwiftUIX](https://github.com/SwiftUIX/SwiftUIX) | SwiftUI extensions | + +Transitive pins (see [`Package.resolved`](Package.resolved)) include **SwiftAPI**, **swift-collections**, and **swift-syntax**. + +### SPM products you can link + +Exact product names from `Package.swift`: + +| Product | Targets exposed | Use when | +|---------|-----------------|----------| +| `AI` | CoreMI, LargeLanguageModels, Anthropic, Cohere, ElevenLabs, Groq, HuggingFace, Jina, Mistral, Ollama, OpenAI, AI | Default multi-provider app dependency | +| `OpenAI` | OpenAI | OpenAI-only | +| `Anthropic` | Anthropic | Anthropic-only | +| `Perplexity` | Perplexity | Perplexity (pulls OpenAI transitively) | +| `TogetherAI` | TogetherAI | Together AI | +| `VoyageAI` | VoyageAI | Voyage embeddings | +| `PlayHT` | PlayHT | PlayHT voice | +| `Rime` | Rime | Rime voice | +| `HumeAI` | HumeAI | Hume | +| `NeetsAI` | NeetsAI | Neets | +| `_Gemini` | _Gemini | Google Gemini client | + +There is **no** standalone SPM product today for `CoreMI`, `LargeLanguageModels`, `Cohere`, `Groq`, `HuggingFace`, `Jina`, `Mistral`, `Ollama`, or `ElevenLabs` β€” consume them via the `AI` product (or add a product in `Package.swift` if you need a leaner slice). + # Usage ## Import the framework @@ -551,14 +756,76 @@ let embeddings = try await LLMManager.client.textEmbeddings( return embeddings.data.first?.embedding.description ``` +# Documentation + +| Document | Contents | +|----------|----------| +| **[docs/README.md](docs/README.md)** | Documentation index | +| **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)** | Full architecture, products vs targets, Mermaid graph, protocol matrix, tests | +| **[CONTRIBUTING.md](CONTRIBUTING.md)** | Dev setup, coding guidelines, how to add a provider | +| **[CHANGELOG.md](CHANGELOG.md)** | Release notes and unreleased changes | +| **[LICENSE](LICENSE)** | MIT License text | + +API behavior is illustrated in the [Usage](#usage) sections above; protocol details live in `Sources/LargeLanguageModels` and `Sources/CoreMI`. + # Roadmap -- [x] OpenAI +Status reflects modules present in this repository (`Sources/` + `Package.swift`). Checked items ship as package targets; depth of feature coverage varies by provider. + +### Core + +- [x] `CoreMI` β€” request handling, model identifiers, services, ASR/TTS foundations +- [x] `LargeLanguageModels` β€” `AbstractLLM`, prompts, function calling, embeddings protocols +- [x] `AI` umbrella product + +### LLM & multimodal providers + +- [x] OpenAI (chat, vision, tools, images, Whisper, speech) - [x] Anthropic - [x] Mistral +- [x] Groq - [x] Ollama -- [ ] Perplexity -- [ ] Groq +- [x] Perplexity +- [x] TogetherAI +- [x] `_Gemini` (Google Gemini client; standalone product) +- [ ] Broader parity matrix (streaming, tools, vision) across every LLM provider + +### Embeddings & hub + +- [x] OpenAI embeddings +- [x] Cohere +- [x] Jina +- [x] VoyageAI +- [x] Hugging Face hub helpers / tokenizer resources + +### Voice & speech + +- [x] ElevenLabs +- [x] PlayHT +- [x] Rime +- [x] HumeAI +- [x] NeetsAI +- [x] OpenAI TTS / Whisper + +### Project hygiene + +- [x] Architecture & dependency documentation +- [x] Contributing guide, docs index, PR template & changelog +- [ ] Register missing test targets (Ollama, Rime, TogetherAI folder) +- [ ] visionOS badge artwork under `Images/` +- [ ] Tagged semantic releases with automated changelog sections + +# Contributing + +Contributions are welcome. Please read **[CONTRIBUTING.md](CONTRIBUTING.md)** for: + +- Environment and build requirements +- PR expectations and testing notes +- Steps to add or extend a provider without breaking layering rules + +# Changelog + +See **[CHANGELOG.md](CHANGELOG.md)** for user-visible changes. The package is in **alpha**; expect API evolution between releases. # Acknowledgements @@ -567,4 +834,4 @@ return embeddings.data.first?.embedding.description # License -This package is licensed under the MIT License. +This package is licensed under the [MIT License](LICENSE). diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md new file mode 100644 index 00000000..913a99c8 --- /dev/null +++ b/docs/ARCHITECTURE.md @@ -0,0 +1,100 @@ +# Architecture + +This document summarizes the package architecture as defined in `Package.swift`. + +## Module Layers + +1. **Core layer** + - `CoreMI` +2. **LLM abstraction layer** + - `LargeLanguageModels` +3. **Provider layer** + - `Anthropic`, `Cohere`, `ElevenLabs`, `Groq`, `HuggingFace`, `HumeAI`, `Jina`, `Mistral`, `NeetsAI`, `Ollama`, `OpenAI`, `Perplexity`, `PlayHT`, `Rime`, `TogetherAI`, `VoyageAI`, `_Gemini` +4. **Umbrella layer** + - `AI` + +## Component Dependency Graph + +In this graph, `CorePersistence`, `Merge`, `NetworkKit`, `Swallow`, and `SwiftUIX` are external package dependencies (not targets in this repository). + +```mermaid +graph TD + CoreMI --> CorePersistence + CoreMI --> Merge + CoreMI --> Swallow + + LargeLanguageModels --> CoreMI + LargeLanguageModels --> CorePersistence + LargeLanguageModels --> Merge + LargeLanguageModels --> NetworkKit + LargeLanguageModels --> Swallow + LargeLanguageModels --> SwiftUIX + + Anthropic --> LargeLanguageModels + OpenAI --> LargeLanguageModels + HuggingFace --> CoreMI + HuggingFace --> Swallow + + Cohere --> CoreMI + Cohere --> LargeLanguageModels + ElevenLabs --> CoreMI + ElevenLabs --> LargeLanguageModels + Groq --> CoreMI + Groq --> LargeLanguageModels + HumeAI --> CoreMI + HumeAI --> LargeLanguageModels + Jina --> CoreMI + Jina --> LargeLanguageModels + Mistral --> CoreMI + Mistral --> LargeLanguageModels + NeetsAI --> CoreMI + NeetsAI --> LargeLanguageModels + Ollama --> CoreMI + Ollama --> LargeLanguageModels + PlayHT --> CoreMI + PlayHT --> LargeLanguageModels + Rime --> CoreMI + Rime --> LargeLanguageModels + TogetherAI --> CoreMI + TogetherAI --> LargeLanguageModels + VoyageAI --> CoreMI + VoyageAI --> LargeLanguageModels + _Gemini --> CoreMI + _Gemini --> LargeLanguageModels + + Perplexity --> OpenAI + Perplexity --> CoreMI + Perplexity --> LargeLanguageModels + + AI --> CoreMI + AI --> LargeLanguageModels + AI --> Anthropic + AI --> Cohere + AI --> ElevenLabs + AI --> Groq + AI --> HuggingFace + AI --> Jina + AI --> Mistral + AI --> Ollama + AI --> OpenAI + + AI -. standalone product .-> HumeAI + AI -. standalone product .-> NeetsAI + AI -. standalone product .-> Perplexity + AI -. standalone product .-> PlayHT + AI -. standalone product .-> Rime + AI -. standalone product .-> TogetherAI + AI -. standalone product .-> VoyageAI + AI -. standalone product .-> _Gemini +``` +> Note: The `AI` umbrella target currently depends on `CoreMI`, `LargeLanguageModels`, `Anthropic`, `Cohere`, `ElevenLabs`, `Groq`, `HuggingFace`, `Jina`, `Mistral`, `Ollama`, and `OpenAI`. Other provider modules in this repository are distributed as standalone products and are not re-exported by `AI` in `Package.swift`. + +> Note: `HuggingFace` intentionally differs from most provider modules: in `Package.swift` it depends on `CoreMI` and `Swallow`, and does not depend on `LargeLanguageModels`. + +## External Dependencies + +- `CorePersistence` +- `Merge` +- `NetworkKit` +- `Swallow` +- `SwiftUIX` diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000..5e24f4c9 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,31 @@ +# Documentation + +Guides for the **AI** Swift package ([PreternaturalAI/AI](https://github.com/PreternaturalAI/AI)). + +| Document | Audience | Description | +|----------|----------|-------------| +| [../README.md](../README.md) | Everyone | Install, usage examples, architecture summary, dependency graph, roadmap | +| [ARCHITECTURE.md](ARCHITECTURE.md) | Contributors & integrators | Layers, products vs targets, Mermaid graphs, protocol matrix, tests | +| [../CONTRIBUTING.md](../CONTRIBUTING.md) | Contributors | Setup, PR process, adding providers | +| [../CHANGELOG.md](../CHANGELOG.md) | Everyone | Notable changes | +| [../LICENSE](../LICENSE) | Everyone | MIT | + +## Quick orientation + +```text +Package.swift products, targets, external deps +Sources/CoreMI foundations (requests, model IDs, services) +Sources/LargeLanguageModels AbstractLLM, prompts, embeddings protocols +Sources/ vendor clients +Sources/AI umbrella module (selective @_exported imports) +Tests/ parallel test targets (see ARCHITECTURE.md for gaps) +docs/ long-form documentation (this folder) +``` + +## Keeping docs honest + +When you change `Package.swift` or add a provider: + +1. Update the dependency graph and tables in [ARCHITECTURE.md](ARCHITECTURE.md). +2. Mirror user-facing bits in [../README.md](../README.md) (products, roadmap, import notes). +3. Note the change under `[Unreleased]` in [../CHANGELOG.md](../CHANGELOG.md). From a51e03830f70163ba1fad10780db62b8e605bdf5 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 18:58:59 -0400 Subject: [PATCH 125/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#99) (#103) From 8db71333d3ea16db98af88d85828a2a6ef4eddbd Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 18:59:17 -0400 Subject: [PATCH 126/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#99) (#104) From 04f5f43d865a26428716c50065a2f6801233d2d9 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 18:59:29 -0400 Subject: [PATCH 127/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#99) (#105) From 300b3eea928096e713105ab727ab91c982b5ad74 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 18:59:41 -0400 Subject: [PATCH 128/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#99) (#106) From 5f586ed19c532011329822ff8e6c7e6496e1cfb2 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 18:59:53 -0400 Subject: [PATCH 129/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#99) (#107) From a1da2b8ac971a1bdf40dbcc38467ae90e4dab0d0 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:00:09 -0400 Subject: [PATCH 130/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#99) (#102) (#108) From 507db7b40af10f966f411560ffa275b7c8ac2433 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:00:22 -0400 Subject: [PATCH 131/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#90) (#109) From 4426a2c55228514dda9cc60e956382113415296f Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:00:35 -0400 Subject: [PATCH 132/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#68) (#110) From 8aae7eb2dbb1070a35722cdd98d43c25ff17fa95 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:00:51 -0400 Subject: [PATCH 133/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#68) (#111) From a67984be5c4064ebf47e0b2a702ce49dd25a01c3 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:02:13 -0400 Subject: [PATCH 134/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#98) (#114) From 03312b36f9ec6a3798f95ba931258b81b52a81e8 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:02:28 -0400 Subject: [PATCH 135/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#70) (#115) From 73076414678043b8a980ed24393267b622c3c17d Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:02:51 -0400 Subject: [PATCH 136/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#70) (#116) From 0290c69309cb20e577fa334f63a1aa1bc3af9913 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:03:33 -0400 Subject: [PATCH 137/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#99) (#117) From 04edf64ec48deaed925207967f5cbdd0861ee1ba Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:03:46 -0400 Subject: [PATCH 138/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#99) (#118) From 6455ddc00248d0757b365be5ab254f6c4bfede5e Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:03:58 -0400 Subject: [PATCH 139/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#99) (#119) From 6a547641c1df76d4d6ac81620b32e4a4b5934637 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:04:12 -0400 Subject: [PATCH 140/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#98) (#120) From de0b02ed952a7222555de2ede0558693ec08ae12 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:04:49 -0400 Subject: [PATCH 141/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#90) (#121) From ae9fa2005250d626b48cdf44c86a46e7dfc8ef3f Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:05:51 -0400 Subject: [PATCH 142/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#90) (#121) (#123) From 53ec2e32709e968ba157f1e8c12212a6987f3ccc Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:06:09 -0400 Subject: [PATCH 143/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#90) (#121) (#124) --- .github/PULL_REQUEST_TEMPLATE.md | 31 +++ CHANGELOG.md | 12 ++ CONTRIBUTING.md | 78 +++++++ README.md | 335 +++++++++++++++++++++++++++---- docs/ARCHITECTURE.md | 100 +++++++++ docs/README.md | 31 +++ 6 files changed, 553 insertions(+), 34 deletions(-) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 CHANGELOG.md create mode 100644 CONTRIBUTING.md create mode 100644 docs/ARCHITECTURE.md create mode 100644 docs/README.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..7dfe0424 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,31 @@ +## Summary + + + +## Type of change + +- [ ] Bug fix +- [ ] New provider / API surface +- [ ] Refactor +- [ ] Documentation +- [ ] Tests / CI +- [ ] Other + +## Checklist + +- [ ] Builds with the package’s supported Xcode/Swift versions +- [ ] Tests added or updated when behavior changes +- [ ] No secrets or API keys committed +- [ ] Docs updated if products, targets, public API, or dependencies changed: + - [ ] `README.md` + - [ ] `docs/ARCHITECTURE.md` (graph / tables) + - [ ] `CHANGELOG.md` (`[Unreleased]`) +- [ ] Layering respected (providers β†’ `LargeLanguageModels` β†’ `CoreMI`; avoid new providerβ†’provider deps) + +## Test plan + + + +## Related issues + + diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..2896a4fd --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,12 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +## [Unreleased] + +### Added + +- Added architecture documentation in `docs/ARCHITECTURE.md`. +- Added contribution guidelines in `CONTRIBUTING.md`. +- Improved `README.md` with architecture, dependency graph, and documentation links. +- Added repository research and agent workflow guidance to `CONTRIBUTING.md`. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..0e562b86 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,78 @@ +# Contributing + +Thanks for contributing to AI. + +## Prerequisites + +- Xcode 15.4+ (Swift 5.10 toolchain) +- Apple platform SDKs supported by this package + +## Getting Started + +1. Fork the repository and create a feature branch. +2. Make focused changes with clear commit messages. +3. Run tests locally: + +```bash +swift test +``` + +4. Update documentation when behavior, APIs, or architecture changes. +5. Open a pull request with a clear summary and test notes. + +## Pull Request Checklist + +- [ ] Changes are scoped to one topic +- [ ] Public API changes are documented +- [ ] Tests pass locally (`swift test`) +- [ ] README/docs/changelog updated when needed + +## Repository Research Plan + +When working in this repository, start by identifying the layer and capability you are changing before touching code. + +1. Map the affected API surface: + - `Sources/CoreMI` + - `Sources/LargeLanguageModels` + - `Sources/AI` + - the specific provider target under `Sources/` +2. Inventory shared abstractions and extension points involved in the change: + - request handling + - model identifiers + - chat/completions + - embeddings + - audio, file, structured output, and tool-calling support +3. Compare provider parity for that capability to avoid introducing one-off patterns. +4. Audit the relevant tests under `Tests/` by capability as well as by provider. +5. Update docs when package products, imports, architecture, or behavior change. +6. Run `swift test` for code changes and record any notable validation steps in the pull request. + +## Agent / Workflow Roles + +Use focused ownership when splitting work across contributors or automation: + +- **Architecture**: owns module boundaries, `Package.swift`, and `docs/ARCHITECTURE.md`. +- **Core abstractions**: owns `CoreMI` and `LargeLanguageModels` protocols, shared request/response behavior, and compatibility across providers. +- **Provider**: owns one provider target at a time and aligns provider-specific APIs with shared abstractions. +- **Test**: expands coverage in `Tests/`, adds reusable fixtures/helpers, and verifies `swift test`. +- **Docs**: keeps `README.md`, `CONTRIBUTING.md`, `docs/ARCHITECTURE.md`, and `CHANGELOG.md` aligned with code changes. +- **Release / governance**: checks change scope, public API impact, dependency layering, and pull request hygiene. + +Recommended workflow: + +1. Scope work to one layer or one provider. +2. Review architecture or shared abstraction impact first. +3. Implement the provider or core change. +4. Update tests for behavior changes. +5. Update docs for API, product, or architecture changes. +6. Run `swift test`. +7. Review for consistency with neighboring providers before merging. + +## Reporting Issues + +When filing a bug, include: + +- Steps to reproduce +- Expected vs actual behavior +- Platform and Xcode/Swift versions +- Relevant logs or sample payloads diff --git a/README.md b/README.md index cf435eff..abb9f56b 100644 --- a/README.md +++ b/README.md @@ -1,68 +1,100 @@ -> [!IMPORTANT] +> πŸ•΄οΈ[!IMPORTANT] > This package is presently in its alpha stage of development (2026-03-04). ---- +#### Supported Platforms - +SPM platforms from [`Package.swift`](Package.swift): **iOS 16+**, **macOS 13+**, **tvOS 16+**, **visionOS 1+**, **watchOS 9+**. -#### Supported Platforms

- macos + macOS   - macos + iOS   - macos + iPadOS   - macos + tvOS   - macos + watchOS

+Also targets **visionOS** (badge art not yet in `Images/`). + # AI The definitive, open-source Swift framework for interfacing with generative AI. -[Installation](#installation)\ -[Usage](#usage) - -* [Import the framework](#import-the-framework) -* [Initialize an AI Client](#initialize-an-ai-client) -* [LLM Clients Abstraction](#llm-clients-abstraction) -* [Supported Models](#supported-models) -* [Completions](#completions) - * [Basic Completions](#basic-completions) - * [Vision: Image-to-Text](#vision-image-to-text) - * [Function Calling](#function-calling) -* [DALLE-3 Image Generation](#dalle-3-image-generation) -* [Audio](#audio) - * [Audio Transcription: Whisper](#audio-transcription-whisper) - * [Audio Generation: OpenAI](#audio-generation-openai) - * [Audio Generation: ElevenLabs](#audio-generation-elevenlabs) -* [Text Embeddings](#text-embeddings) - -[Roadmap](#roadmap) \ -[Acknowledgements](#acknowledgements) \ -[License](#license) +## Documentation + +- [Architecture](docs/ARCHITECTURE.md) +- [Contributing](CONTRIBUTING.md) +- [Changelog](CHANGELOG.md) + +## Table of Contents + +- [Architecture Overview](#architecture-overview) +- [Dependencies](#dependencies) +- [Installation](#installation) +- [Usage](#usage) + - [Import the framework](#import-the-framework) + - [Initialize an AI Client](#initialize-an-ai-client) + - [LLM Clients Abstraction](#llm-clients-abstraction) + - [Supported Models](#supported-models) + - [Completions](#completions) + - [Basic Completions](#basic-completions) + - [Vision: Image-to-Text](#vision-image-to-text) + - [Function Calling](#function-calling) + - [DALLE-3 Image Generation](#dalle-3-image-generation) + - [Audio](#audio) + - [Audio Transcription: Whisper](#audio-transcription-whisper) + - [Audio Generation: OpenAI](#audio-generation-openai) + - [Audio Generation: ElevenLabs](#audio-generation-elevenlabs) + - [Text Embeddings](#text-embeddings) +- [Roadmap](#roadmap) +- [Acknowledgements](#acknowledgements) +- [License](#license) + +## Architecture Overview + +This package is organized as a Swift Package Manager workspace with layered modules: + +- `CoreMI` provides shared core abstractions used across providers. +- `LargeLanguageModels` builds common LLM request/response functionality on top of `CoreMI`. +- Provider modules (`OpenAI`, `Anthropic`, `Mistral`, `Groq`, `ElevenLabs`, etc.) implement vendor-specific APIs. +- `AI` is the umbrella product that re-exports the main modules for one-stop integration. + +### Component Dependency Graph + +A full dependency graph generated from `Package.swift` target dependencies is available in [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md#component-dependency-graph). + +## Dependencies + +External package dependencies declared in `Package.swift`: + +- [`CorePersistence`](https://github.com/vmanot/CorePersistence) +- [`Merge`](https://github.com/vmanot/Merge) +- [`NetworkKit`](https://github.com/vmanot/NetworkKit) +- [`Swallow`](https://github.com/vmanot/Swallow) +- [`SwiftUIX`](https://github.com/SwiftUIX/SwiftUIX) # Installation @@ -74,6 +106,179 @@ The definitive, open-source Swift framework for interfacing with generative AI. 4. Choose the version you'd like to install. 5. Click `Add Package`. +Or add the dependency in `Package.swift`: + +```swift +dependencies: [ + .package(url: "https://github.com/PreternaturalAI/AI.git", branch: "main") +] +``` + +Then link the `AI` product (umbrella) or a standalone product such as `OpenAI`, `Anthropic`, or `Perplexity` (see [Architecture](#architecture)). + +# Architecture + +The package is organized in layers. Provider SDKs implement shared protocols (`LLMRequestHandling`, embeddings, TTS, and so on) defined in the core modules. + +| Layer | Modules | Responsibility | +|-------|---------|----------------| +| Umbrella module | `AI` | `@_exported` re-exports **CoreMI**, **LargeLanguageModels**, **OpenAI** (and Swallow macros client). Other bundled modules still need their own `import`. | +| Umbrella product | `AI` library | SPM product that **links** core + Anthropic, Cohere, ElevenLabs, Groq, HuggingFace, Jina, Mistral, Ollama, OpenAI, and the `AI` module | +| Providers | `OpenAI`, `Anthropic`, `Mistral`, `Groq`, `Ollama`, `Perplexity`, `Cohere`, `Jina`, `VoyageAI`, `TogetherAI`, `ElevenLabs`, `PlayHT`, `Rime`, `HumeAI`, `NeetsAI`, `_Gemini`, `HuggingFace`, … | API clients and model types | +| LLM abstractions | `LargeLanguageModels` | `AbstractLLM`, `PromptLiteral`, chat/function-calling, embeddings protocols | +| Foundations | `CoreMI` | Request handling, model identifiers, service credentials, ASR/TTS bases | +| External | Swallow, Merge, NetworkKit, CorePersistence, SwiftUIX | Shared infrastructure (see [Dependencies](#dependencies)) | + +`import AI` is enough for OpenAI + shared LLM types. For other clients linked by the product, add e.g. `import Anthropic` or `import Groq`. Providers shipped only as standalone products (`Perplexity`, `_Gemini`, `VoyageAI`, …) require linking that product. + +### Component dependency graph + +Graph of **package targets** as declared in [`Package.swift`](Package.swift) (external packages shown once at the bottom). For products, tests, and design notes, see **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)**. + +```mermaid +flowchart TB + subgraph umbrella [Umbrella] + AI + end + + subgraph providers [Provider targets] + OpenAI + Anthropic + Mistral + Groq + Ollama + Perplexity + Cohere + Jina + VoyageAI + TogetherAI + ElevenLabs + PlayHT + Rime + HumeAI + NeetsAI + Gemini["_Gemini"] + HuggingFace + end + + subgraph core [Core targets] + LargeLanguageModels + CoreMI + end + + subgraph external [External packages] + Swallow + Merge + NetworkKit + CorePersistence + SwiftUIX + end + + AI --> CoreMI + AI --> LargeLanguageModels + AI --> OpenAI + AI --> Anthropic + AI --> Mistral + AI --> Groq + AI --> Ollama + AI --> Cohere + AI --> ElevenLabs + AI --> HuggingFace + AI --> Jina + + OpenAI --> LargeLanguageModels + Anthropic --> LargeLanguageModels + Mistral --> LargeLanguageModels + Groq --> LargeLanguageModels + Ollama --> LargeLanguageModels + Perplexity --> LargeLanguageModels + Perplexity --> OpenAI + Cohere --> LargeLanguageModels + Jina --> LargeLanguageModels + VoyageAI --> LargeLanguageModels + TogetherAI --> LargeLanguageModels + ElevenLabs --> LargeLanguageModels + PlayHT --> LargeLanguageModels + Rime --> LargeLanguageModels + HumeAI --> LargeLanguageModels + NeetsAI --> LargeLanguageModels + Gemini --> LargeLanguageModels + HuggingFace --> CoreMI + + LargeLanguageModels --> CoreMI + LargeLanguageModels --> CorePersistence + LargeLanguageModels --> Merge + LargeLanguageModels --> NetworkKit + LargeLanguageModels --> Swallow + LargeLanguageModels --> SwiftUIX + + CoreMI --> CorePersistence + CoreMI --> Merge + CoreMI --> Swallow +``` + +**Notes** + +- Most providers also depend on `CoreMI`, `CorePersistence`, `Merge`, `NetworkKit`, and `Swallow` directly (edges omitted above for readability where they already flow through `LargeLanguageModels`). +- **OpenAI** and **Anthropic** depend on `LargeLanguageModels` + networking stack, not on `CoreMI` directly in `Package.swift`. +- **Perplexity** is the only provider that depends on another provider target (`OpenAI`). +- **HuggingFace** depends on `CoreMI` + `Swallow` only (hub/tokenizer helpers, not the full LLM stack). +- The `AI` **product** does **not** link every target (for example `_Gemini`, `Perplexity`, `PlayHT`, `Rime`, `TogetherAI`, `VoyageAI`, `HumeAI`, `NeetsAI` are separate products). +- The `AI` **module** re-exports only CoreMI, LargeLanguageModels, and OpenAI among first-party modules (`Sources/AI/module.swift`). + +### Protocol capabilities (from source) + +Which shared protocols have an explicit client conformance today: + +| Target | `LLMRequestHandling` | `TextEmbeddingsRequestHandling` | Notes | +|--------|:--------------------:|:-------------------------------:|-------| +| OpenAI | yes | yes | Also images, Whisper, speech, assistants | +| Anthropic | yes | | | +| Mistral | yes | yes | | +| Groq | yes | | | +| Ollama | yes | | | +| Perplexity | yes | | Depends on OpenAI target | +| Cohere | | yes | | +| Jina | | yes | | +| VoyageAI | | yes | | +| TogetherAI, ElevenLabs, PlayHT, Rime, HumeAI, NeetsAI, _Gemini, HuggingFace | | | Provider-specific client APIs / hub helpers (see `Sources/`) | + +Full layering detail: **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)**. Docs index: **[docs/README.md](docs/README.md)**. + +# Dependencies + +### External Swift packages + +| Package | Repository | Role | +|---------|------------|------| +| Swallow | [vmanot/Swallow](https://github.com/vmanot/Swallow) | Extensions, macros client, diagnostics | +| Merge | [vmanot/Merge](https://github.com/vmanot/Merge) | Concurrency / async utilities | +| NetworkKit | [vmanot/NetworkKit](https://github.com/vmanot/NetworkKit) | HTTP client & API specifications | +| CorePersistence | [vmanot/CorePersistence](https://github.com/vmanot/CorePersistence) | Persistence & schema helpers (e.g. JSONSchema) | +| SwiftUIX | [SwiftUIX/SwiftUIX](https://github.com/SwiftUIX/SwiftUIX) | SwiftUI extensions | + +Transitive pins (see [`Package.resolved`](Package.resolved)) include **SwiftAPI**, **swift-collections**, and **swift-syntax**. + +### SPM products you can link + +Exact product names from `Package.swift`: + +| Product | Targets exposed | Use when | +|---------|-----------------|----------| +| `AI` | CoreMI, LargeLanguageModels, Anthropic, Cohere, ElevenLabs, Groq, HuggingFace, Jina, Mistral, Ollama, OpenAI, AI | Default multi-provider app dependency | +| `OpenAI` | OpenAI | OpenAI-only | +| `Anthropic` | Anthropic | Anthropic-only | +| `Perplexity` | Perplexity | Perplexity (pulls OpenAI transitively) | +| `TogetherAI` | TogetherAI | Together AI | +| `VoyageAI` | VoyageAI | Voyage embeddings | +| `PlayHT` | PlayHT | PlayHT voice | +| `Rime` | Rime | Rime voice | +| `HumeAI` | HumeAI | Hume | +| `NeetsAI` | NeetsAI | Neets | +| `_Gemini` | _Gemini | Google Gemini client | + +There is **no** standalone SPM product today for `CoreMI`, `LargeLanguageModels`, `Cohere`, `Groq`, `HuggingFace`, `Jina`, `Mistral`, `Ollama`, or `ElevenLabs` β€” consume them via the `AI` product (or add a product in `Package.swift` if you need a leaner slice). + # Usage ## Import the framework @@ -551,14 +756,76 @@ let embeddings = try await LLMManager.client.textEmbeddings( return embeddings.data.first?.embedding.description ``` +# Documentation + +| Document | Contents | +|----------|----------| +| **[docs/README.md](docs/README.md)** | Documentation index | +| **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)** | Full architecture, products vs targets, Mermaid graph, protocol matrix, tests | +| **[CONTRIBUTING.md](CONTRIBUTING.md)** | Dev setup, coding guidelines, how to add a provider | +| **[CHANGELOG.md](CHANGELOG.md)** | Release notes and unreleased changes | +| **[LICENSE](LICENSE)** | MIT License text | + +API behavior is illustrated in the [Usage](#usage) sections above; protocol details live in `Sources/LargeLanguageModels` and `Sources/CoreMI`. + # Roadmap -- [x] OpenAI +Status reflects modules present in this repository (`Sources/` + `Package.swift`). Checked items ship as package targets; depth of feature coverage varies by provider. + +### Core + +- [x] `CoreMI` β€” request handling, model identifiers, services, ASR/TTS foundations +- [x] `LargeLanguageModels` β€” `AbstractLLM`, prompts, function calling, embeddings protocols +- [x] `AI` umbrella product + +### LLM & multimodal providers + +- [x] OpenAI (chat, vision, tools, images, Whisper, speech) - [x] Anthropic - [x] Mistral +- [x] Groq - [x] Ollama -- [ ] Perplexity -- [ ] Groq +- [x] Perplexity +- [x] TogetherAI +- [x] `_Gemini` (Google Gemini client; standalone product) +- [ ] Broader parity matrix (streaming, tools, vision) across every LLM provider + +### Embeddings & hub + +- [x] OpenAI embeddings +- [x] Cohere +- [x] Jina +- [x] VoyageAI +- [x] Hugging Face hub helpers / tokenizer resources + +### Voice & speech + +- [x] ElevenLabs +- [x] PlayHT +- [x] Rime +- [x] HumeAI +- [x] NeetsAI +- [x] OpenAI TTS / Whisper + +### Project hygiene + +- [x] Architecture & dependency documentation +- [x] Contributing guide, docs index, PR template & changelog +- [ ] Register missing test targets (Ollama, Rime, TogetherAI folder) +- [ ] visionOS badge artwork under `Images/` +- [ ] Tagged semantic releases with automated changelog sections + +# Contributing + +Contributions are welcome. Please read **[CONTRIBUTING.md](CONTRIBUTING.md)** for: + +- Environment and build requirements +- PR expectations and testing notes +- Steps to add or extend a provider without breaking layering rules + +# Changelog + +See **[CHANGELOG.md](CHANGELOG.md)** for user-visible changes. The package is in **alpha**; expect API evolution between releases. # Acknowledgements @@ -567,4 +834,4 @@ return embeddings.data.first?.embedding.description # License -This package is licensed under the MIT License. +This package is licensed under the [MIT License](LICENSE). diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md new file mode 100644 index 00000000..913a99c8 --- /dev/null +++ b/docs/ARCHITECTURE.md @@ -0,0 +1,100 @@ +# Architecture + +This document summarizes the package architecture as defined in `Package.swift`. + +## Module Layers + +1. **Core layer** + - `CoreMI` +2. **LLM abstraction layer** + - `LargeLanguageModels` +3. **Provider layer** + - `Anthropic`, `Cohere`, `ElevenLabs`, `Groq`, `HuggingFace`, `HumeAI`, `Jina`, `Mistral`, `NeetsAI`, `Ollama`, `OpenAI`, `Perplexity`, `PlayHT`, `Rime`, `TogetherAI`, `VoyageAI`, `_Gemini` +4. **Umbrella layer** + - `AI` + +## Component Dependency Graph + +In this graph, `CorePersistence`, `Merge`, `NetworkKit`, `Swallow`, and `SwiftUIX` are external package dependencies (not targets in this repository). + +```mermaid +graph TD + CoreMI --> CorePersistence + CoreMI --> Merge + CoreMI --> Swallow + + LargeLanguageModels --> CoreMI + LargeLanguageModels --> CorePersistence + LargeLanguageModels --> Merge + LargeLanguageModels --> NetworkKit + LargeLanguageModels --> Swallow + LargeLanguageModels --> SwiftUIX + + Anthropic --> LargeLanguageModels + OpenAI --> LargeLanguageModels + HuggingFace --> CoreMI + HuggingFace --> Swallow + + Cohere --> CoreMI + Cohere --> LargeLanguageModels + ElevenLabs --> CoreMI + ElevenLabs --> LargeLanguageModels + Groq --> CoreMI + Groq --> LargeLanguageModels + HumeAI --> CoreMI + HumeAI --> LargeLanguageModels + Jina --> CoreMI + Jina --> LargeLanguageModels + Mistral --> CoreMI + Mistral --> LargeLanguageModels + NeetsAI --> CoreMI + NeetsAI --> LargeLanguageModels + Ollama --> CoreMI + Ollama --> LargeLanguageModels + PlayHT --> CoreMI + PlayHT --> LargeLanguageModels + Rime --> CoreMI + Rime --> LargeLanguageModels + TogetherAI --> CoreMI + TogetherAI --> LargeLanguageModels + VoyageAI --> CoreMI + VoyageAI --> LargeLanguageModels + _Gemini --> CoreMI + _Gemini --> LargeLanguageModels + + Perplexity --> OpenAI + Perplexity --> CoreMI + Perplexity --> LargeLanguageModels + + AI --> CoreMI + AI --> LargeLanguageModels + AI --> Anthropic + AI --> Cohere + AI --> ElevenLabs + AI --> Groq + AI --> HuggingFace + AI --> Jina + AI --> Mistral + AI --> Ollama + AI --> OpenAI + + AI -. standalone product .-> HumeAI + AI -. standalone product .-> NeetsAI + AI -. standalone product .-> Perplexity + AI -. standalone product .-> PlayHT + AI -. standalone product .-> Rime + AI -. standalone product .-> TogetherAI + AI -. standalone product .-> VoyageAI + AI -. standalone product .-> _Gemini +``` +> Note: The `AI` umbrella target currently depends on `CoreMI`, `LargeLanguageModels`, `Anthropic`, `Cohere`, `ElevenLabs`, `Groq`, `HuggingFace`, `Jina`, `Mistral`, `Ollama`, and `OpenAI`. Other provider modules in this repository are distributed as standalone products and are not re-exported by `AI` in `Package.swift`. + +> Note: `HuggingFace` intentionally differs from most provider modules: in `Package.swift` it depends on `CoreMI` and `Swallow`, and does not depend on `LargeLanguageModels`. + +## External Dependencies + +- `CorePersistence` +- `Merge` +- `NetworkKit` +- `Swallow` +- `SwiftUIX` diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000..5e24f4c9 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,31 @@ +# Documentation + +Guides for the **AI** Swift package ([PreternaturalAI/AI](https://github.com/PreternaturalAI/AI)). + +| Document | Audience | Description | +|----------|----------|-------------| +| [../README.md](../README.md) | Everyone | Install, usage examples, architecture summary, dependency graph, roadmap | +| [ARCHITECTURE.md](ARCHITECTURE.md) | Contributors & integrators | Layers, products vs targets, Mermaid graphs, protocol matrix, tests | +| [../CONTRIBUTING.md](../CONTRIBUTING.md) | Contributors | Setup, PR process, adding providers | +| [../CHANGELOG.md](../CHANGELOG.md) | Everyone | Notable changes | +| [../LICENSE](../LICENSE) | Everyone | MIT | + +## Quick orientation + +```text +Package.swift products, targets, external deps +Sources/CoreMI foundations (requests, model IDs, services) +Sources/LargeLanguageModels AbstractLLM, prompts, embeddings protocols +Sources/ vendor clients +Sources/AI umbrella module (selective @_exported imports) +Tests/ parallel test targets (see ARCHITECTURE.md for gaps) +docs/ long-form documentation (this folder) +``` + +## Keeping docs honest + +When you change `Package.swift` or add a provider: + +1. Update the dependency graph and tables in [ARCHITECTURE.md](ARCHITECTURE.md). +2. Mirror user-facing bits in [../README.md](../README.md) (products, roadmap, import notes). +3. Note the change under `[Unreleased]` in [../CHANGELOG.md](../CHANGELOG.md). From c639fe6f55a82d243ffaf4944af13dc2056fe6ce Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:14:13 -0400 Subject: [PATCH 144/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#98) (#126) From d7b83b4a34379ac9a287860004db2f33abce3b09 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:14:35 -0400 Subject: [PATCH 145/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#90) (#121) (#127) From e99dbb35eae00989c895cda08b27e2b55e1aa5fe Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:14:56 -0400 Subject: [PATCH 146/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#90) (#121) (#128) From d5c6afb70e8ee2697731e8c80a1ed24360d4b235 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:15:08 -0400 Subject: [PATCH 147/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#90) (#121) (#128) (#129) From 4e319c6e820bd2e158a455f8aba702497d561df2 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:15:26 -0400 Subject: [PATCH 148/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#90) (#121) (#128) (#129) (#130) From 4c2e5f939107f2521f491465869223a108cdfd01 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:15:41 -0400 Subject: [PATCH 149/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#90) (#121) (#128) (#129) (#130) (#131) From 5c8483cc014f709c72a7841f0e21a969741f21b6 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:15:58 -0400 Subject: [PATCH 150/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#90) (#121) (#128) (#129) (#130) (#131) (#132) From 6e618c1ee17183653e33243590e264ba052756eb Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:16:19 -0400 Subject: [PATCH 151/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#90) (#121) (#128) (#129) (#130) (#131) (#132) (#133) From 86962b34bdb6eabaeb049971ce46551ec39ffa02 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:17:17 -0400 Subject: [PATCH 152/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#99) (#102) (#135) From 66d4c16daf0bfa27cc4800adc8a7baf371ce1380 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:17:32 -0400 Subject: [PATCH 153/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#99) (#102) (#136) From 782b180bc2863f5ffec3aa0423c62eb250b694e4 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:17:52 -0400 Subject: [PATCH 154/271] Merge pull request #37 from 5hy7xz92nd-oss/main (#137) From 1bb6dc66fa38d746d68f1447e5798ee1e3c66d08 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:18:19 -0400 Subject: [PATCH 155/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#99) (#102) (#139) From 29d79e67e7566b79354216feda4f4f842ebff831 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:19:04 -0400 Subject: [PATCH 156/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#99) (#102) (#140) From 142e5ae5bc090fdf5fc20cef377307dfc29c6dd0 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:19:18 -0400 Subject: [PATCH 157/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#99) (#102) (#141) From e25df74ef0e14fefc85da28d07e86236a5214667 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:19:33 -0400 Subject: [PATCH 158/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#99) (#102) (#142) From e791113db30ed2a3cd859d3df86db01f70a26b9b Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:20:06 -0400 Subject: [PATCH 159/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#99) (#102) (#143) From 5124e0ee176fa6fbd666e14d6924a87b5bd458b3 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:20:22 -0400 Subject: [PATCH 160/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#99) (#102) (#144) From a8669ddb483f22b0f99f7b1a93f37023361d8c30 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:20:34 -0400 Subject: [PATCH 161/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#99) (#102) (#145) From 76742b6ab4182241f77462f77900dafc07a13620 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:20:50 -0400 Subject: [PATCH 162/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#98) (#126) (#146) From 428460307761301d305e39dab3aa4d9f8a68fbcc Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:21:03 -0400 Subject: [PATCH 163/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#90) (#121) (#128) (#129) (#130) (#131) (#132) (#147) From 2750a008bfb61191bfd709f6bbde6ec54a6e2d4b Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:21:20 -0400 Subject: [PATCH 164/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#90) (#121) (#128) (#129) (#130) (#131) (#132) (#147) (#148) From 6b18a84e19a74a87d80befcd901d778e0b54d9ed Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:21:36 -0400 Subject: [PATCH 165/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#90) (#121) (#128) (#149) From 986bd3f635c642778dc56f81cca14e823318be02 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:21:53 -0400 Subject: [PATCH 166/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#90) (#121) (#128) (#149) (#150) From b71b25fbca69ccbaa907a4ed317824d0643ed892 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:22:07 -0400 Subject: [PATCH 167/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#90) (#121) (#127) (#151) From e7770a840bd2ef541f9a12c31a672b9fda26a681 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:22:20 -0400 Subject: [PATCH 168/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#75) (#152) From 7bbe8c921e838eb4a4d50183248aa0988e07a38a Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:22:33 -0400 Subject: [PATCH 169/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#75) (#153) From 3edeb5a4a7d0917fe977e7716d26758cc2b09953 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:22:56 -0400 Subject: [PATCH 170/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#90) (#121) (#127) (#154) From ae0e334ab6dc349374f7153c88bbd496b31f04a3 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:23:11 -0400 Subject: [PATCH 171/271] Merge pull request #37 from 5hy7xz92nd-oss/main (#155) From 2e95dee64bbfecf01241d4b71266867ac94d6f10 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:23:24 -0400 Subject: [PATCH 172/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#99) (#102) (#156) From 991de4429ae02e89e57306ca4ee1b9a714c8e4d4 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:23:36 -0400 Subject: [PATCH 173/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#99) (#102) (#157) From 8f560310d58d435956d1c0daca533bb9be4d6d5d Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:23:48 -0400 Subject: [PATCH 174/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#99) (#102) (#158) From 76367e267e951e1cd7424989701b3a3abf2d88f3 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:24:01 -0400 Subject: [PATCH 175/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#99) (#102) (#159) From 84c4381309f405ebd5d8bb1866137f558f4d9ab8 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:24:14 -0400 Subject: [PATCH 176/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#99) (#102) (#160) From 8b690cd25cad6bdcace1a77b7f9b7833ce7484f6 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:24:28 -0400 Subject: [PATCH 177/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#99) (#102) (#161) From b36d694bf9e6d2d185431b3d4a14d7bcfed7f279 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:24:39 -0400 Subject: [PATCH 178/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#98) (#126) (#162) From d937915dab38409a4b67abf6392567ba242937f7 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:24:52 -0400 Subject: [PATCH 179/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#99) (#102) (#163) From ebef58e8856f16ab8c4ca0b9db309fd09173420f Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:25:05 -0400 Subject: [PATCH 180/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#99) (#102) (#164) From dbf49b759657aaf29e08fa01fd4380b7de7a6555 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:25:17 -0400 Subject: [PATCH 181/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#99) (#102) (#165) From c36649ff7ffc4e0f7b4c8bed4f285ca079016bb6 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:25:29 -0400 Subject: [PATCH 182/271] Merge pull request #37 from 5hy7xz92nd-oss/main (#166) From 84e548440a5c2ebc96b07a473c94f5883cdff76a Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:25:43 -0400 Subject: [PATCH 183/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#99) (#102) (#167) From d1ebfeed544ae558b0cd6270827f98cc1eefd50c Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:25:56 -0400 Subject: [PATCH 184/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#99) (#102) (#168) From 551463f620fa4a2cbef1bf06d481552ef4bd874b Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:26:09 -0400 Subject: [PATCH 185/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#99) (#102) (#169) From 3e7a54b2776db57c55527891715ec7fbe4570325 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:26:56 -0400 Subject: [PATCH 186/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#99) (#102) (#170) From 552faf4423d22639856976cfdee34fd1399b265f Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:27:08 -0400 Subject: [PATCH 187/271] Merge pull request #37 from 5hy7xz92nd-oss/main (#171) From 00d670f27933711ad1e03fb2a866b187aa6c1c1f Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:27:24 -0400 Subject: [PATCH 188/271] Merge pull request #37 from 5hy7xz92nd-oss/main (#171) (#172) From 1162409a9ac0a45c816510250c4c6b4fb6f522f7 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:27:44 -0400 Subject: [PATCH 189/271] Merge pull request #37 from 5hy7xz92nd-oss/main (#171) (#173) From bbcf919600a1cf7716db484b8b06c375d477f62b Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:28:01 -0400 Subject: [PATCH 190/271] Merge pull request #37 from 5hy7xz92nd-oss/main (#171) (#173) (#174) From d21d6b296b561f3add85bd3ef89620f727f72eea Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:28:17 -0400 Subject: [PATCH 191/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#98) (#175) From a9c45d045c83ee73126439a98f3b4cc3537eee02 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:28:32 -0400 Subject: [PATCH 192/271] Merge pull request #37 from 5hy7xz92nd-oss/main (#176) From fb211ce2ce4d1bc7c9c742fe6c0ed0bc02836922 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:28:45 -0400 Subject: [PATCH 193/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#90) (#121) (#128) (#129) (#130) (#177) From 622cf14da6aea56ef52e3d5ed57686f13f678f41 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:29:01 -0400 Subject: [PATCH 194/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#90) (#121) (#128) (#129) (#130) (#177) (#178) From b030dec111a46b5d09cf81e375197762e13bc8dc Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:29:24 -0400 Subject: [PATCH 195/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#90) (#121) (#128) (#149) (#150) (#179) From 5f47a060d43fb5da047f25e88f42aaec07f6ae95 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:29:38 -0400 Subject: [PATCH 196/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#75) (#180) From 94a6a201fe220193acb0577eb1cd419485d7d14e Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:29:50 -0400 Subject: [PATCH 197/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#75) (#181) From 866a416df0aa816c47a31846571cac7e3bf2afb4 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:30:10 -0400 Subject: [PATCH 198/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#75) (#181) (#182) From d778b8da528c2742979e768a02df32424ebed814 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:30:27 -0400 Subject: [PATCH 199/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#98) (#183) From 39c5b8e2024fb25af772cfc54dbac67084ef20ef Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:30:42 -0400 Subject: [PATCH 200/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#98) (#183) (#184) From 44e14e23df7343dfcc3e72c94af1f9bac283a24b Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:10:11 -0400 Subject: [PATCH 201/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#98) (#183) (#186) From f811feabd8db0247baada939bc52d7d0875def99 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:10:43 -0400 Subject: [PATCH 202/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#98) (#183) (#184) (#188) From 359f68c565c852e2174380816e9cc9778e421535 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:11:00 -0400 Subject: [PATCH 203/271] Document package architecture, dependency graph, and contribution workflow (#50) (#57) (#189) From 6a1696837c59bec037c04edbd16529207aaecb52 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:11:32 -0400 Subject: [PATCH 204/271] Merge pull request #37 from 5hy7xz92nd-oss/main (#191) From 99f0a52d95dd8d00e8808c65d72ca52ec042a6e8 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:12:15 -0400 Subject: [PATCH 205/271] Merge pull request #37 from 5hy7xz92nd-oss/main (#191) (#194) From b713006787fae21d9225aa33d0d3733486d95791 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:12:28 -0400 Subject: [PATCH 206/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#75) (#181) (#182) (#195) From a653aff2b1790a76d39dbafdc01c9fa5022ddbb3 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:12:46 -0400 Subject: [PATCH 207/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#75) (#181) (#182) (#195) (#196) From b03afff3bf6238730555a55667e147dd3144c95f Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:13:17 -0400 Subject: [PATCH 208/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#98) (#183) (#184) (#188) (#197) From 22f60037f0159b28cc7c619cc8abc83295acecbe Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:13:47 -0400 Subject: [PATCH 209/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#96) (#199) From b7824fa9278101d027275e15d2c64d05796d63ac Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:14:17 -0400 Subject: [PATCH 210/271] Document package architecture, dependency graph, and contribution workflow (#50) (#56) (#200) From 39d0a46daabba99b99b1cb13ad780b38b1b4b007 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:14:34 -0400 Subject: [PATCH 211/271] Document package architecture, dependency graph, and contribution workflow (#50) (#55) (#201) From 2b8f09e9100bc90ee274cba4b77195a0992c885f Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:14:58 -0400 Subject: [PATCH 212/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#98) (#183) (#184) (#188) (#203) From e014984fb2036d0a64ca4f2385376a30ebcbcf1d Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:15:40 -0400 Subject: [PATCH 213/271] Document package architecture, dependency graph, and contribution workflow (#50) (#56) (#200) (#204) From 5b11a748bef218a9217cc1fd744227ad0966dbcd Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:16:10 -0400 Subject: [PATCH 214/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#98) (#183) (#184) (#188) (#203) (#206) From 05598de55317f5e78f4df89ab77f555349a3594b Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:16:26 -0400 Subject: [PATCH 215/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#98) (#183) (#184) (#188) (#203) (#206) (#207) From 28b6950f0c644b2addc3b1ce9a5158532a74c552 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:16:47 -0400 Subject: [PATCH 216/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#98) (#183) (#186) (#208) From 1180bff6e8f1e421a005d9043f2d35e197b711c9 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:17:12 -0400 Subject: [PATCH 217/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#98) (#183) (#186) (#208) (#209) From 94377be0bcf384454edb3f798007b98601303543 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:17:59 -0400 Subject: [PATCH 218/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#98) (#183) (#186) (#208) (#212) From 47860b9f5a36b15494ea3c6a0da57bcc96ec49d9 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:18:17 -0400 Subject: [PATCH 219/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#98) (#183) (#186) (#208) (#212) (#213) From 95a571fa9e85f6225d2afbd298689248d42c95d3 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:18:37 -0400 Subject: [PATCH 220/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#98) (#183) (#184) (#188) (#214) From 65a74ba0153f8a37c1344be8b1f4408a4ed905a0 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:18:50 -0400 Subject: [PATCH 221/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#96) (#215) From 4141dba9d832823c9e1ca064c16a2d90ad47e65c Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:19:40 -0400 Subject: [PATCH 222/271] Merge pull request #29 from 5hy7xz92nd-oss/copilot/1k-repo-decentralized-architecture (#217) (#218) --- .github/PULL_REQUEST_TEMPLATE.md | 31 +++ CHANGELOG.md | 12 ++ CONTRIBUTING.md | 78 +++++++ README.md | 335 +++++++++++++++++++++++++++---- docs/ARCHITECTURE.md | 100 +++++++++ docs/README.md | 31 +++ 6 files changed, 553 insertions(+), 34 deletions(-) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 CHANGELOG.md create mode 100644 CONTRIBUTING.md create mode 100644 docs/ARCHITECTURE.md create mode 100644 docs/README.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..7dfe0424 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,31 @@ +## Summary + + + +## Type of change + +- [ ] Bug fix +- [ ] New provider / API surface +- [ ] Refactor +- [ ] Documentation +- [ ] Tests / CI +- [ ] Other + +## Checklist + +- [ ] Builds with the package’s supported Xcode/Swift versions +- [ ] Tests added or updated when behavior changes +- [ ] No secrets or API keys committed +- [ ] Docs updated if products, targets, public API, or dependencies changed: + - [ ] `README.md` + - [ ] `docs/ARCHITECTURE.md` (graph / tables) + - [ ] `CHANGELOG.md` (`[Unreleased]`) +- [ ] Layering respected (providers β†’ `LargeLanguageModels` β†’ `CoreMI`; avoid new providerβ†’provider deps) + +## Test plan + + + +## Related issues + + diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..2896a4fd --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,12 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +## [Unreleased] + +### Added + +- Added architecture documentation in `docs/ARCHITECTURE.md`. +- Added contribution guidelines in `CONTRIBUTING.md`. +- Improved `README.md` with architecture, dependency graph, and documentation links. +- Added repository research and agent workflow guidance to `CONTRIBUTING.md`. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..0e562b86 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,78 @@ +# Contributing + +Thanks for contributing to AI. + +## Prerequisites + +- Xcode 15.4+ (Swift 5.10 toolchain) +- Apple platform SDKs supported by this package + +## Getting Started + +1. Fork the repository and create a feature branch. +2. Make focused changes with clear commit messages. +3. Run tests locally: + +```bash +swift test +``` + +4. Update documentation when behavior, APIs, or architecture changes. +5. Open a pull request with a clear summary and test notes. + +## Pull Request Checklist + +- [ ] Changes are scoped to one topic +- [ ] Public API changes are documented +- [ ] Tests pass locally (`swift test`) +- [ ] README/docs/changelog updated when needed + +## Repository Research Plan + +When working in this repository, start by identifying the layer and capability you are changing before touching code. + +1. Map the affected API surface: + - `Sources/CoreMI` + - `Sources/LargeLanguageModels` + - `Sources/AI` + - the specific provider target under `Sources/` +2. Inventory shared abstractions and extension points involved in the change: + - request handling + - model identifiers + - chat/completions + - embeddings + - audio, file, structured output, and tool-calling support +3. Compare provider parity for that capability to avoid introducing one-off patterns. +4. Audit the relevant tests under `Tests/` by capability as well as by provider. +5. Update docs when package products, imports, architecture, or behavior change. +6. Run `swift test` for code changes and record any notable validation steps in the pull request. + +## Agent / Workflow Roles + +Use focused ownership when splitting work across contributors or automation: + +- **Architecture**: owns module boundaries, `Package.swift`, and `docs/ARCHITECTURE.md`. +- **Core abstractions**: owns `CoreMI` and `LargeLanguageModels` protocols, shared request/response behavior, and compatibility across providers. +- **Provider**: owns one provider target at a time and aligns provider-specific APIs with shared abstractions. +- **Test**: expands coverage in `Tests/`, adds reusable fixtures/helpers, and verifies `swift test`. +- **Docs**: keeps `README.md`, `CONTRIBUTING.md`, `docs/ARCHITECTURE.md`, and `CHANGELOG.md` aligned with code changes. +- **Release / governance**: checks change scope, public API impact, dependency layering, and pull request hygiene. + +Recommended workflow: + +1. Scope work to one layer or one provider. +2. Review architecture or shared abstraction impact first. +3. Implement the provider or core change. +4. Update tests for behavior changes. +5. Update docs for API, product, or architecture changes. +6. Run `swift test`. +7. Review for consistency with neighboring providers before merging. + +## Reporting Issues + +When filing a bug, include: + +- Steps to reproduce +- Expected vs actual behavior +- Platform and Xcode/Swift versions +- Relevant logs or sample payloads diff --git a/README.md b/README.md index cf435eff..abb9f56b 100644 --- a/README.md +++ b/README.md @@ -1,68 +1,100 @@ -> [!IMPORTANT] +> πŸ•΄οΈ[!IMPORTANT] > This package is presently in its alpha stage of development (2026-03-04). ---- +#### Supported Platforms - +SPM platforms from [`Package.swift`](Package.swift): **iOS 16+**, **macOS 13+**, **tvOS 16+**, **visionOS 1+**, **watchOS 9+**. -#### Supported Platforms

- macos + macOS   - macos + iOS   - macos + iPadOS   - macos + tvOS   - macos + watchOS

+Also targets **visionOS** (badge art not yet in `Images/`). + # AI The definitive, open-source Swift framework for interfacing with generative AI. -[Installation](#installation)\ -[Usage](#usage) - -* [Import the framework](#import-the-framework) -* [Initialize an AI Client](#initialize-an-ai-client) -* [LLM Clients Abstraction](#llm-clients-abstraction) -* [Supported Models](#supported-models) -* [Completions](#completions) - * [Basic Completions](#basic-completions) - * [Vision: Image-to-Text](#vision-image-to-text) - * [Function Calling](#function-calling) -* [DALLE-3 Image Generation](#dalle-3-image-generation) -* [Audio](#audio) - * [Audio Transcription: Whisper](#audio-transcription-whisper) - * [Audio Generation: OpenAI](#audio-generation-openai) - * [Audio Generation: ElevenLabs](#audio-generation-elevenlabs) -* [Text Embeddings](#text-embeddings) - -[Roadmap](#roadmap) \ -[Acknowledgements](#acknowledgements) \ -[License](#license) +## Documentation + +- [Architecture](docs/ARCHITECTURE.md) +- [Contributing](CONTRIBUTING.md) +- [Changelog](CHANGELOG.md) + +## Table of Contents + +- [Architecture Overview](#architecture-overview) +- [Dependencies](#dependencies) +- [Installation](#installation) +- [Usage](#usage) + - [Import the framework](#import-the-framework) + - [Initialize an AI Client](#initialize-an-ai-client) + - [LLM Clients Abstraction](#llm-clients-abstraction) + - [Supported Models](#supported-models) + - [Completions](#completions) + - [Basic Completions](#basic-completions) + - [Vision: Image-to-Text](#vision-image-to-text) + - [Function Calling](#function-calling) + - [DALLE-3 Image Generation](#dalle-3-image-generation) + - [Audio](#audio) + - [Audio Transcription: Whisper](#audio-transcription-whisper) + - [Audio Generation: OpenAI](#audio-generation-openai) + - [Audio Generation: ElevenLabs](#audio-generation-elevenlabs) + - [Text Embeddings](#text-embeddings) +- [Roadmap](#roadmap) +- [Acknowledgements](#acknowledgements) +- [License](#license) + +## Architecture Overview + +This package is organized as a Swift Package Manager workspace with layered modules: + +- `CoreMI` provides shared core abstractions used across providers. +- `LargeLanguageModels` builds common LLM request/response functionality on top of `CoreMI`. +- Provider modules (`OpenAI`, `Anthropic`, `Mistral`, `Groq`, `ElevenLabs`, etc.) implement vendor-specific APIs. +- `AI` is the umbrella product that re-exports the main modules for one-stop integration. + +### Component Dependency Graph + +A full dependency graph generated from `Package.swift` target dependencies is available in [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md#component-dependency-graph). + +## Dependencies + +External package dependencies declared in `Package.swift`: + +- [`CorePersistence`](https://github.com/vmanot/CorePersistence) +- [`Merge`](https://github.com/vmanot/Merge) +- [`NetworkKit`](https://github.com/vmanot/NetworkKit) +- [`Swallow`](https://github.com/vmanot/Swallow) +- [`SwiftUIX`](https://github.com/SwiftUIX/SwiftUIX) # Installation @@ -74,6 +106,179 @@ The definitive, open-source Swift framework for interfacing with generative AI. 4. Choose the version you'd like to install. 5. Click `Add Package`. +Or add the dependency in `Package.swift`: + +```swift +dependencies: [ + .package(url: "https://github.com/PreternaturalAI/AI.git", branch: "main") +] +``` + +Then link the `AI` product (umbrella) or a standalone product such as `OpenAI`, `Anthropic`, or `Perplexity` (see [Architecture](#architecture)). + +# Architecture + +The package is organized in layers. Provider SDKs implement shared protocols (`LLMRequestHandling`, embeddings, TTS, and so on) defined in the core modules. + +| Layer | Modules | Responsibility | +|-------|---------|----------------| +| Umbrella module | `AI` | `@_exported` re-exports **CoreMI**, **LargeLanguageModels**, **OpenAI** (and Swallow macros client). Other bundled modules still need their own `import`. | +| Umbrella product | `AI` library | SPM product that **links** core + Anthropic, Cohere, ElevenLabs, Groq, HuggingFace, Jina, Mistral, Ollama, OpenAI, and the `AI` module | +| Providers | `OpenAI`, `Anthropic`, `Mistral`, `Groq`, `Ollama`, `Perplexity`, `Cohere`, `Jina`, `VoyageAI`, `TogetherAI`, `ElevenLabs`, `PlayHT`, `Rime`, `HumeAI`, `NeetsAI`, `_Gemini`, `HuggingFace`, … | API clients and model types | +| LLM abstractions | `LargeLanguageModels` | `AbstractLLM`, `PromptLiteral`, chat/function-calling, embeddings protocols | +| Foundations | `CoreMI` | Request handling, model identifiers, service credentials, ASR/TTS bases | +| External | Swallow, Merge, NetworkKit, CorePersistence, SwiftUIX | Shared infrastructure (see [Dependencies](#dependencies)) | + +`import AI` is enough for OpenAI + shared LLM types. For other clients linked by the product, add e.g. `import Anthropic` or `import Groq`. Providers shipped only as standalone products (`Perplexity`, `_Gemini`, `VoyageAI`, …) require linking that product. + +### Component dependency graph + +Graph of **package targets** as declared in [`Package.swift`](Package.swift) (external packages shown once at the bottom). For products, tests, and design notes, see **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)**. + +```mermaid +flowchart TB + subgraph umbrella [Umbrella] + AI + end + + subgraph providers [Provider targets] + OpenAI + Anthropic + Mistral + Groq + Ollama + Perplexity + Cohere + Jina + VoyageAI + TogetherAI + ElevenLabs + PlayHT + Rime + HumeAI + NeetsAI + Gemini["_Gemini"] + HuggingFace + end + + subgraph core [Core targets] + LargeLanguageModels + CoreMI + end + + subgraph external [External packages] + Swallow + Merge + NetworkKit + CorePersistence + SwiftUIX + end + + AI --> CoreMI + AI --> LargeLanguageModels + AI --> OpenAI + AI --> Anthropic + AI --> Mistral + AI --> Groq + AI --> Ollama + AI --> Cohere + AI --> ElevenLabs + AI --> HuggingFace + AI --> Jina + + OpenAI --> LargeLanguageModels + Anthropic --> LargeLanguageModels + Mistral --> LargeLanguageModels + Groq --> LargeLanguageModels + Ollama --> LargeLanguageModels + Perplexity --> LargeLanguageModels + Perplexity --> OpenAI + Cohere --> LargeLanguageModels + Jina --> LargeLanguageModels + VoyageAI --> LargeLanguageModels + TogetherAI --> LargeLanguageModels + ElevenLabs --> LargeLanguageModels + PlayHT --> LargeLanguageModels + Rime --> LargeLanguageModels + HumeAI --> LargeLanguageModels + NeetsAI --> LargeLanguageModels + Gemini --> LargeLanguageModels + HuggingFace --> CoreMI + + LargeLanguageModels --> CoreMI + LargeLanguageModels --> CorePersistence + LargeLanguageModels --> Merge + LargeLanguageModels --> NetworkKit + LargeLanguageModels --> Swallow + LargeLanguageModels --> SwiftUIX + + CoreMI --> CorePersistence + CoreMI --> Merge + CoreMI --> Swallow +``` + +**Notes** + +- Most providers also depend on `CoreMI`, `CorePersistence`, `Merge`, `NetworkKit`, and `Swallow` directly (edges omitted above for readability where they already flow through `LargeLanguageModels`). +- **OpenAI** and **Anthropic** depend on `LargeLanguageModels` + networking stack, not on `CoreMI` directly in `Package.swift`. +- **Perplexity** is the only provider that depends on another provider target (`OpenAI`). +- **HuggingFace** depends on `CoreMI` + `Swallow` only (hub/tokenizer helpers, not the full LLM stack). +- The `AI` **product** does **not** link every target (for example `_Gemini`, `Perplexity`, `PlayHT`, `Rime`, `TogetherAI`, `VoyageAI`, `HumeAI`, `NeetsAI` are separate products). +- The `AI` **module** re-exports only CoreMI, LargeLanguageModels, and OpenAI among first-party modules (`Sources/AI/module.swift`). + +### Protocol capabilities (from source) + +Which shared protocols have an explicit client conformance today: + +| Target | `LLMRequestHandling` | `TextEmbeddingsRequestHandling` | Notes | +|--------|:--------------------:|:-------------------------------:|-------| +| OpenAI | yes | yes | Also images, Whisper, speech, assistants | +| Anthropic | yes | | | +| Mistral | yes | yes | | +| Groq | yes | | | +| Ollama | yes | | | +| Perplexity | yes | | Depends on OpenAI target | +| Cohere | | yes | | +| Jina | | yes | | +| VoyageAI | | yes | | +| TogetherAI, ElevenLabs, PlayHT, Rime, HumeAI, NeetsAI, _Gemini, HuggingFace | | | Provider-specific client APIs / hub helpers (see `Sources/`) | + +Full layering detail: **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)**. Docs index: **[docs/README.md](docs/README.md)**. + +# Dependencies + +### External Swift packages + +| Package | Repository | Role | +|---------|------------|------| +| Swallow | [vmanot/Swallow](https://github.com/vmanot/Swallow) | Extensions, macros client, diagnostics | +| Merge | [vmanot/Merge](https://github.com/vmanot/Merge) | Concurrency / async utilities | +| NetworkKit | [vmanot/NetworkKit](https://github.com/vmanot/NetworkKit) | HTTP client & API specifications | +| CorePersistence | [vmanot/CorePersistence](https://github.com/vmanot/CorePersistence) | Persistence & schema helpers (e.g. JSONSchema) | +| SwiftUIX | [SwiftUIX/SwiftUIX](https://github.com/SwiftUIX/SwiftUIX) | SwiftUI extensions | + +Transitive pins (see [`Package.resolved`](Package.resolved)) include **SwiftAPI**, **swift-collections**, and **swift-syntax**. + +### SPM products you can link + +Exact product names from `Package.swift`: + +| Product | Targets exposed | Use when | +|---------|-----------------|----------| +| `AI` | CoreMI, LargeLanguageModels, Anthropic, Cohere, ElevenLabs, Groq, HuggingFace, Jina, Mistral, Ollama, OpenAI, AI | Default multi-provider app dependency | +| `OpenAI` | OpenAI | OpenAI-only | +| `Anthropic` | Anthropic | Anthropic-only | +| `Perplexity` | Perplexity | Perplexity (pulls OpenAI transitively) | +| `TogetherAI` | TogetherAI | Together AI | +| `VoyageAI` | VoyageAI | Voyage embeddings | +| `PlayHT` | PlayHT | PlayHT voice | +| `Rime` | Rime | Rime voice | +| `HumeAI` | HumeAI | Hume | +| `NeetsAI` | NeetsAI | Neets | +| `_Gemini` | _Gemini | Google Gemini client | + +There is **no** standalone SPM product today for `CoreMI`, `LargeLanguageModels`, `Cohere`, `Groq`, `HuggingFace`, `Jina`, `Mistral`, `Ollama`, or `ElevenLabs` β€” consume them via the `AI` product (or add a product in `Package.swift` if you need a leaner slice). + # Usage ## Import the framework @@ -551,14 +756,76 @@ let embeddings = try await LLMManager.client.textEmbeddings( return embeddings.data.first?.embedding.description ``` +# Documentation + +| Document | Contents | +|----------|----------| +| **[docs/README.md](docs/README.md)** | Documentation index | +| **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)** | Full architecture, products vs targets, Mermaid graph, protocol matrix, tests | +| **[CONTRIBUTING.md](CONTRIBUTING.md)** | Dev setup, coding guidelines, how to add a provider | +| **[CHANGELOG.md](CHANGELOG.md)** | Release notes and unreleased changes | +| **[LICENSE](LICENSE)** | MIT License text | + +API behavior is illustrated in the [Usage](#usage) sections above; protocol details live in `Sources/LargeLanguageModels` and `Sources/CoreMI`. + # Roadmap -- [x] OpenAI +Status reflects modules present in this repository (`Sources/` + `Package.swift`). Checked items ship as package targets; depth of feature coverage varies by provider. + +### Core + +- [x] `CoreMI` β€” request handling, model identifiers, services, ASR/TTS foundations +- [x] `LargeLanguageModels` β€” `AbstractLLM`, prompts, function calling, embeddings protocols +- [x] `AI` umbrella product + +### LLM & multimodal providers + +- [x] OpenAI (chat, vision, tools, images, Whisper, speech) - [x] Anthropic - [x] Mistral +- [x] Groq - [x] Ollama -- [ ] Perplexity -- [ ] Groq +- [x] Perplexity +- [x] TogetherAI +- [x] `_Gemini` (Google Gemini client; standalone product) +- [ ] Broader parity matrix (streaming, tools, vision) across every LLM provider + +### Embeddings & hub + +- [x] OpenAI embeddings +- [x] Cohere +- [x] Jina +- [x] VoyageAI +- [x] Hugging Face hub helpers / tokenizer resources + +### Voice & speech + +- [x] ElevenLabs +- [x] PlayHT +- [x] Rime +- [x] HumeAI +- [x] NeetsAI +- [x] OpenAI TTS / Whisper + +### Project hygiene + +- [x] Architecture & dependency documentation +- [x] Contributing guide, docs index, PR template & changelog +- [ ] Register missing test targets (Ollama, Rime, TogetherAI folder) +- [ ] visionOS badge artwork under `Images/` +- [ ] Tagged semantic releases with automated changelog sections + +# Contributing + +Contributions are welcome. Please read **[CONTRIBUTING.md](CONTRIBUTING.md)** for: + +- Environment and build requirements +- PR expectations and testing notes +- Steps to add or extend a provider without breaking layering rules + +# Changelog + +See **[CHANGELOG.md](CHANGELOG.md)** for user-visible changes. The package is in **alpha**; expect API evolution between releases. # Acknowledgements @@ -567,4 +834,4 @@ return embeddings.data.first?.embedding.description # License -This package is licensed under the MIT License. +This package is licensed under the [MIT License](LICENSE). diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md new file mode 100644 index 00000000..913a99c8 --- /dev/null +++ b/docs/ARCHITECTURE.md @@ -0,0 +1,100 @@ +# Architecture + +This document summarizes the package architecture as defined in `Package.swift`. + +## Module Layers + +1. **Core layer** + - `CoreMI` +2. **LLM abstraction layer** + - `LargeLanguageModels` +3. **Provider layer** + - `Anthropic`, `Cohere`, `ElevenLabs`, `Groq`, `HuggingFace`, `HumeAI`, `Jina`, `Mistral`, `NeetsAI`, `Ollama`, `OpenAI`, `Perplexity`, `PlayHT`, `Rime`, `TogetherAI`, `VoyageAI`, `_Gemini` +4. **Umbrella layer** + - `AI` + +## Component Dependency Graph + +In this graph, `CorePersistence`, `Merge`, `NetworkKit`, `Swallow`, and `SwiftUIX` are external package dependencies (not targets in this repository). + +```mermaid +graph TD + CoreMI --> CorePersistence + CoreMI --> Merge + CoreMI --> Swallow + + LargeLanguageModels --> CoreMI + LargeLanguageModels --> CorePersistence + LargeLanguageModels --> Merge + LargeLanguageModels --> NetworkKit + LargeLanguageModels --> Swallow + LargeLanguageModels --> SwiftUIX + + Anthropic --> LargeLanguageModels + OpenAI --> LargeLanguageModels + HuggingFace --> CoreMI + HuggingFace --> Swallow + + Cohere --> CoreMI + Cohere --> LargeLanguageModels + ElevenLabs --> CoreMI + ElevenLabs --> LargeLanguageModels + Groq --> CoreMI + Groq --> LargeLanguageModels + HumeAI --> CoreMI + HumeAI --> LargeLanguageModels + Jina --> CoreMI + Jina --> LargeLanguageModels + Mistral --> CoreMI + Mistral --> LargeLanguageModels + NeetsAI --> CoreMI + NeetsAI --> LargeLanguageModels + Ollama --> CoreMI + Ollama --> LargeLanguageModels + PlayHT --> CoreMI + PlayHT --> LargeLanguageModels + Rime --> CoreMI + Rime --> LargeLanguageModels + TogetherAI --> CoreMI + TogetherAI --> LargeLanguageModels + VoyageAI --> CoreMI + VoyageAI --> LargeLanguageModels + _Gemini --> CoreMI + _Gemini --> LargeLanguageModels + + Perplexity --> OpenAI + Perplexity --> CoreMI + Perplexity --> LargeLanguageModels + + AI --> CoreMI + AI --> LargeLanguageModels + AI --> Anthropic + AI --> Cohere + AI --> ElevenLabs + AI --> Groq + AI --> HuggingFace + AI --> Jina + AI --> Mistral + AI --> Ollama + AI --> OpenAI + + AI -. standalone product .-> HumeAI + AI -. standalone product .-> NeetsAI + AI -. standalone product .-> Perplexity + AI -. standalone product .-> PlayHT + AI -. standalone product .-> Rime + AI -. standalone product .-> TogetherAI + AI -. standalone product .-> VoyageAI + AI -. standalone product .-> _Gemini +``` +> Note: The `AI` umbrella target currently depends on `CoreMI`, `LargeLanguageModels`, `Anthropic`, `Cohere`, `ElevenLabs`, `Groq`, `HuggingFace`, `Jina`, `Mistral`, `Ollama`, and `OpenAI`. Other provider modules in this repository are distributed as standalone products and are not re-exported by `AI` in `Package.swift`. + +> Note: `HuggingFace` intentionally differs from most provider modules: in `Package.swift` it depends on `CoreMI` and `Swallow`, and does not depend on `LargeLanguageModels`. + +## External Dependencies + +- `CorePersistence` +- `Merge` +- `NetworkKit` +- `Swallow` +- `SwiftUIX` diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000..5e24f4c9 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,31 @@ +# Documentation + +Guides for the **AI** Swift package ([PreternaturalAI/AI](https://github.com/PreternaturalAI/AI)). + +| Document | Audience | Description | +|----------|----------|-------------| +| [../README.md](../README.md) | Everyone | Install, usage examples, architecture summary, dependency graph, roadmap | +| [ARCHITECTURE.md](ARCHITECTURE.md) | Contributors & integrators | Layers, products vs targets, Mermaid graphs, protocol matrix, tests | +| [../CONTRIBUTING.md](../CONTRIBUTING.md) | Contributors | Setup, PR process, adding providers | +| [../CHANGELOG.md](../CHANGELOG.md) | Everyone | Notable changes | +| [../LICENSE](../LICENSE) | Everyone | MIT | + +## Quick orientation + +```text +Package.swift products, targets, external deps +Sources/CoreMI foundations (requests, model IDs, services) +Sources/LargeLanguageModels AbstractLLM, prompts, embeddings protocols +Sources/ vendor clients +Sources/AI umbrella module (selective @_exported imports) +Tests/ parallel test targets (see ARCHITECTURE.md for gaps) +docs/ long-form documentation (this folder) +``` + +## Keeping docs honest + +When you change `Package.swift` or add a provider: + +1. Update the dependency graph and tables in [ARCHITECTURE.md](ARCHITECTURE.md). +2. Mirror user-facing bits in [../README.md](../README.md) (products, roadmap, import notes). +3. Note the change under `[Unreleased]` in [../CHANGELOG.md](../CHANGELOG.md). From c54da8cd998f2c946f153c69765935e84275f62f Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:20:00 -0400 Subject: [PATCH 223/271] Merge pull request #29 from 5hy7xz92nd-oss/copilot/1k-repo-decentralized-architecture (#217) (#219) From 26fa92c4dd59cf69259fc0d4b390952553b5dcef Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:21:21 -0400 Subject: [PATCH 224/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#98) (#183) (#184) (#188) (#221) From 103267653894b59985a5ab05a997e50b073c6bc2 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:21:58 -0400 Subject: [PATCH 225/271] Merge pull request #37 from 5hy7xz92nd-oss/main (#222) From ac1aff4430ef600dfb4f8d976db7cc382acfabde Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:23:50 -0400 Subject: [PATCH 226/271] Merge pull request #37 from 5hy7xz92nd-oss/main (#222) (#228) From e7be16f778350592a2e61bb28836c0da8284ed2f Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:24:03 -0400 Subject: [PATCH 227/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#98) (#183) (#186) (#208) (#212) (#213) (#229) From 4a2d8d61e3615e6af78a1cbb528f6dc9ce9f9109 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:24:20 -0400 Subject: [PATCH 228/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#98) (#183) (#186) (#208) (#212) (#213) (#229) (#230) From f54cb21d1c30c1b2da52d252d598b19220de4d69 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:25:29 -0400 Subject: [PATCH 229/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#98) (#183) (#184) (#188) (#221) (#231) From 1423f6f39a002fa77de3caf7a15586fe74f95da0 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:25:44 -0400 Subject: [PATCH 230/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#98) (#183) (#186) (#208) (#209) (#232) From dfc66f88b54039ec80318c439e7bd41c6af34944 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:26:00 -0400 Subject: [PATCH 231/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#98) (#183) (#184) (#188) (#233) From aad0c57c839e6c6fded15b9f65280221a48897db Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:26:13 -0400 Subject: [PATCH 232/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#98) (#183) (#184) (#188) (#234) From b4986c1fda4e54706bdc8528842cc353a847b2ef Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:26:34 -0400 Subject: [PATCH 233/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#98) (#183) (#184) (#188) (#234) (#235) From 8027ef0b26119b984cbc06b4c00ca5153349e173 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:28:31 -0400 Subject: [PATCH 234/271] Merge pull request #37 from 5hy7xz92nd-oss/main (#222) (#228) (#240) From bbc344a410dde8356de5fd37a4584ab89e240c62 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:28:47 -0400 Subject: [PATCH 235/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#98) (#183) (#184) (#188) (#234) (#235) (#241) From d9f79011f81dab0109587bd3f2239fbb107543ac Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:29:41 -0400 Subject: [PATCH 236/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#75) (#181) (#182) (#195) (#196) (#242) From 59485f4cd88bdc25f8ed8f3240c6d2f9eb1d8b6c Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:30:01 -0400 Subject: [PATCH 237/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#75) (#181) (#182) (#195) (#196) (#242) (#243) From 67a06d3738ee934c2a3c965666a3bffe591d1655 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:30:47 -0400 Subject: [PATCH 238/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#98) (#183) (#186) (#208) (#212) (#213) (#229) (#230) (#246) From d8f97d8b074cf4dbbf1507ebeb51d4ddceb3ce98 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:31:02 -0400 Subject: [PATCH 239/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#98) (#126) (#247) From e9c5f9a533b4eea40a1a8dc4a53485fcd6879731 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:31:19 -0400 Subject: [PATCH 240/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#98) (#183) (#186) (#208) (#212) (#213) (#229) (#230) (#248) From 145c5f82eb6f73d00da3c32bd5ec2cca3403a2dd Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:31:57 -0400 Subject: [PATCH 241/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#90) (#121) (#128) (#149) (#150) (#249) From 92dfb6463be077d9c62a36925442760223038d88 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:32:32 -0400 Subject: [PATCH 242/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#75) (#181) (#182) (#195) (#196) (#242) (#243) (#250) From 27e1f6eb3508b0686541e6b695861e8863c6c685 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:33:54 -0400 Subject: [PATCH 243/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#87) (#253) From c104574dddf45086771e14076d7d5208adc7abf1 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:34:24 -0400 Subject: [PATCH 244/271] Merge pull request #29 from 5hy7xz92nd-oss/copilot/1k-repo-decentralized-architecture (#217) (#218) (#255) From c58591d9e049da7b68b7b068d569f4a62d5bd218 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:34:41 -0400 Subject: [PATCH 245/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#98) (#183) (#186) (#208) (#209) (#232) (#256) From c45b44c5d34d5b60c13e0d651f39f8a04a2a55e6 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:35:54 -0400 Subject: [PATCH 246/271] Document package architecture, dependency graph, and contribution workflow (#50) (#56) (#258) From c4eb692b52875305e1eb33ede6e9cb88a5dd8e97 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:36:08 -0400 Subject: [PATCH 247/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#98) (#183) (#184) (#188) (#234) (#235) (#259) From 115c9aaf146e9f915124d8bf33e434f2aef10179 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:36:50 -0400 Subject: [PATCH 248/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#98) (#183) (#186) (#208) (#209) (#232) (#256) (#260) From 098532917cd4ab970c3f09671a912f742f204b89 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:37:06 -0400 Subject: [PATCH 249/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#98) (#183) (#186) (#208) (#209) (#232) (#256) (#260) (#261) From 57c1001cfc47d4ea6be9b15377b86dc3c5d9663c Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:37:26 -0400 Subject: [PATCH 250/271] Merge pull request #29 from 5hy7xz92nd-oss/copilot/1k-repo-decentralized-architecture (#217) (#219) (#220) (#262) From 877cd22f1a505d82ba81fa46f22c4493af891c0c Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:38:46 -0400 Subject: [PATCH 251/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#98) (#183) (#186) (#208) (#209) (#232) (#256) (#260) (#264) From 304d6ae7aadb4e3a554215c43b4edc171bc2ac49 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:39:17 -0400 Subject: [PATCH 252/271] Merge pull request #29 from 5hy7xz92nd-oss/copilot/1k-repo-decentralized-architecture (#217) (#219) (#220) (#262) (#265) From b188f750ecc45df0f339ec62dfa6d20c78ccef3e Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:39:30 -0400 Subject: [PATCH 253/271] Merge pull request #29 from 5hy7xz92nd-oss/copilot/1k-repo-decentralized-architecture (#217) (#219) (#220) (#262) (#263) (#266) From d935e00b136b50349e60316ed606afef61219436 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:40:56 -0400 Subject: [PATCH 254/271] Merge pull request #29 from 5hy7xz92nd-oss/copilot/1k-repo-decentralized-architecture (#217) (#219) (#220) (#262) (#263) (#266) (#270) (#271) From 334fca610221186cdbb6166759ce1d969fcbcdcb Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:41:33 -0400 Subject: [PATCH 255/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#89) (#92) (#98) (#183) (#184) (#188) (#234) (#235) (#272) From 07f8b4f35060b430140d04302d6f38278639c15a Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:41:50 -0400 Subject: [PATCH 256/271] Merge pull request #29 from 5hy7xz92nd-oss/copilot/1k-repo-decentralized-architecture (#217) (#219) (#220) (#262) (#263) (#266) (#270) (#273) From 85d11cc7b2d34ed199f9a3bd88747f81d6de50e3 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:42:40 -0400 Subject: [PATCH 257/271] Document package architecture, dependency graph, and contribution workflow (#50) (#51) (#59) (#66) (#75) (#181) (#182) (#195) (#196) (#242) (#243) (#274) From 356e659e121926652626307da3ce5ce50911593c Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:43:11 -0400 Subject: [PATCH 258/271] Merge pull request #29 from 5hy7xz92nd-oss/copilot/1k-repo-decentralized-architecture (#217) (#219) (#220) (#262) (#263) (#266) (#270) (#273) (#275) (#276) From 35cb9eb8d22b51a4fa9a271cfc07fb0263a63edb Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:43:29 -0400 Subject: [PATCH 259/271] Merge pull request #29 from 5hy7xz92nd-oss/copilot/1k-repo-decentralized-architecture (#217) (#219) (#220) (#262) (#263) (#266) (#270) (#273) (#275) (#277) From 88cfb857a78364e932a12556aac93e51991c83d9 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 09:43:44 -0400 Subject: [PATCH 260/271] Merge pull request #29 from 5hy7xz92nd-oss/copilot/1k-repo-decentralized-architecture (#217) (#219) (#220) (#262) (#263) (#266) (#270) (#273) (#275) (#278) From c2b947734943c07ab0fbb1a85dec0c9467f974b7 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 08:38:44 -0700 Subject: [PATCH 261/271] Apply suggestions from code review Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index abb9f56b..1a356385 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -> πŸ•΄οΈ[!IMPORTANT] -> This package is presently in its alpha stage of development (2026-03-04). +> [!IMPORTANT] +> πŸ•΄οΈ This package is presently in its alpha stage of development (2026-03-04). #### Supported Platforms From 7c4a26b25b400504b4637249c0745662fcb403ff Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 13:59:19 -0700 Subject: [PATCH 262/271] Create codeql.yml @5hy7xz92nd-oss @claude @codex @grok @openai @patpat @weareone10billion @Rabbitsync. gh pr checkout 62 gh pr checkout 62 --- .github/workflows/codeql.yml | 99 ++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 .github/workflows/codeql.yml diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 00000000..55f1a7dc --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,99 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL Advanced" + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + schedule: + - cron: '15 21 * * 5' + +jobs: + analyze: + name: Analyze (${{ matrix.language }}) + # Runner size impacts CodeQL analysis time. To learn more, please see: + # - https://gh.io/recommended-hardware-resources-for-running-codeql + # - https://gh.io/supported-runners-and-hardware-resources + # - https://gh.io/using-larger-runners (GitHub.com only) + # Consider using larger runners or machines with greater resources for possible analysis time improvements. + runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }} + permissions: + # required for all workflows + security-events: write + + # required to fetch internal or private CodeQL packs + packages: read + + # only required for workflows in private repositories + actions: read + contents: read + + strategy: + fail-fast: false + matrix: + include: + - language: swift + build-mode: autobuild + # CodeQL supports the following values keywords for 'language': 'actions', 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'rust', 'swift' + # Use `c-cpp` to analyze code written in C, C++ or both + # Use 'java-kotlin' to analyze code written in Java, Kotlin or both + # Use 'javascript-typescript' to analyze code written in JavaScript, TypeScript or both + # To learn more about changing the languages that are analyzed or customizing the build mode for your analysis, + # see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/customizing-your-advanced-setup-for-code-scanning. + # If you are analyzing a compiled language, you can modify the 'build-mode' for that language to customize how + # your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages + steps: + - name: Checkout repository + uses: actions/checkout@v7 + + # Add any setup steps before running the `github/codeql-action/init` action. + # This includes steps like installing compilers or runtimes (`actions/setup-node` + # or others). This is typically only required for manual builds. + # - name: Setup runtime (example) + # uses: actions/setup-example@v1 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v4 + with: + languages: ${{ matrix.language }} + build-mode: ${{ matrix.build-mode }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + + # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs + # queries: security-extended,security-and-quality + + # If the analyze step fails for one of the languages you are analyzing with + # "We were unable to automatically build your code", modify the matrix above + # to set the build mode to "manual" for that language. Then modify this step + # to build your code. + # ℹ️ Command-line programs to run using the OS shell. + # πŸ“š See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun + - name: Run manual build steps + if: matrix.build-mode == 'manual' + shell: bash + run: | + echo 'If you are using a "manual" build mode for one or more of the' \ + 'languages you are analyzing, replace this with the commands to build' \ + 'your code, for example:' + echo ' make bootstrap' + echo ' make release' + exit 1 + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v4 + with: + category: "/language:${{matrix.language}}" From bf997f1f0488eb9a1499444c491f17e78ec938d4 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 14:04:15 -0700 Subject: [PATCH 263/271] Create apisec-scan.yml --- .github/workflows/apisec-scan.yml | 71 +++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 .github/workflows/apisec-scan.yml diff --git a/.github/workflows/apisec-scan.yml b/.github/workflows/apisec-scan.yml new file mode 100644 index 00000000..2c24a929 --- /dev/null +++ b/.github/workflows/apisec-scan.yml @@ -0,0 +1,71 @@ +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +# APIsec addresses the critical need to secure APIs before they reach production. +# APIsec provides the industry’s only automated and continuous API testing platform that uncovers security vulnerabilities and logic flaws in APIs. +# Clients rely on APIsec to evaluate every update and release, ensuring that no APIs go to production with vulnerabilities. + +# How to Get Started with APIsec.ai +# 1. Schedule a demo at https://www.apisec.ai/request-a-demo . +# +# 2. Register your account at https://cloud.apisec.ai/#/signup . +# +# 3. Register your API . See the video (https://www.youtube.com/watch?v=MK3Xo9Dbvac) to get up and running with APIsec quickly. +# +# 4. Get GitHub Actions scan attributes from APIsec Project -> Configurations -> Integrations -> CI-CD -> GitHub Actions +# +# apisec-run-scan +# +# This action triggers the on-demand scans for projects registered in APIsec. +# If your GitHub account allows code scanning alerts, you can then upload the sarif file generated by this action to show the scan findings. +# Else you can view the scan results from the project home page in APIsec Platform. +# The link to view the scan results is also displayed on the console on successful completion of action. + +# This is a starter workflow to help you get started with APIsec-Scan Actions + +name: APIsec + +# Controls when the workflow will run +on: + # Triggers the workflow on push or pull request events but only for the "main" branch + # Customize trigger events based on your DevSecOps processes. + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + schedule: + - cron: '27 1 * * 5' + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + + +permissions: + contents: read + +jobs: + + Trigger_APIsec_scan: + permissions: + security-events: write # for github/codeql-action/upload-sarif to upload SARIF results + actions: read # only required for a private repository by github/codeql-action/upload-sarif to get the Action run status + runs-on: ubuntu-latest + + steps: + - name: APIsec scan + uses: apisec-inc/apisec-run-scan@025432089674a28ba8fb55f8ab06c10215e772ea + with: + # The APIsec username with which the scans will be executed + apisec-username: ${{ secrets.apisec_username }} + # The Password of the APIsec user with which the scans will be executed + apisec-password: ${{ secrets.apisec_password}} + # The name of the project for security scan + apisec-project: "VAmPI" + # The name of the sarif format result file The file is written only if this property is provided. + sarif-result-file: "apisec-results.sarif" + - name: Import results + uses: github/codeql-action/upload-sarif@v3 + with: + sarif_file: ./apisec-results.sarif From e8757c24b9dbe77f44c4d308aa24d3792d2b13a3 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 14:12:59 -0700 Subject: [PATCH 264/271] Create SECURITY.md Signed-off-by: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> --- SECURITY.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 SECURITY.md diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 00000000..034e8480 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,21 @@ +# Security Policy + +## Supported Versions + +Use this section to tell people about which versions of your project are +currently being supported with security updates. + +| Version | Supported | +| ------- | ------------------ | +| 5.1.x | :white_check_mark: | +| 5.0.x | :x: | +| 4.0.x | :white_check_mark: | +| < 4.0 | :x: | + +## Reporting a Vulnerability + +Use this section to tell people how to report a vulnerability. + +Tell them where to go, how often they can expect to get an update on a +reported vulnerability, what to expect if the vulnerability is accepted or +declined, etc. From 3812079dd371f6e8f72484fd9cd7b428fa88bbbf Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Fri, 21 Aug 2026 14:14:19 -0700 Subject: [PATCH 265/271] Create swift.yml Signed-off-by: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> --- .github/workflows/swift.yml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 .github/workflows/swift.yml diff --git a/.github/workflows/swift.yml b/.github/workflows/swift.yml new file mode 100644 index 00000000..21ae770f --- /dev/null +++ b/.github/workflows/swift.yml @@ -0,0 +1,22 @@ +# This workflow will build a Swift project +# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-swift + +name: Swift + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + +jobs: + build: + + runs-on: macos-latest + + steps: + - uses: actions/checkout@v4 + - name: Build + run: swift build -v + - name: Run tests + run: swift test -v From 5ab6d753e8f1d7b5b24f5a0ead298a2a20b3c57e Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Sat, 22 Aug 2026 02:05:16 -0700 Subject: [PATCH 266/271] Create dependabot.ymlv Signed-off-by: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> --- .github/dependabot.ymlv | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 .github/dependabot.ymlv diff --git a/.github/dependabot.ymlv b/.github/dependabot.ymlv new file mode 100644 index 00000000..5990d9c6 --- /dev/null +++ b/.github/dependabot.ymlv @@ -0,0 +1,11 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file + +version: 2 +updates: + - package-ecosystem: "" # See documentation for possible values + directory: "/" # Location of package manifests + schedule: + interval: "weekly" From 4c653444d09cca6bfe40333b70338bd11f177735 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Sat, 22 Aug 2026 14:00:28 -0400 Subject: [PATCH 267/271] Document package architecture, dependency graph, and contribution workflow (#50) (#56) (#444) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## @5hy7xz92nd-oss @anthropic-code @openai @grok @manus @patpat @weareone10billion @2️⃣ @πŸ•΄οΈ1️⃣3️⃣4οΈβƒ£πŸ›‚πŸ†’πŸ†•πŸ†“0οΈβƒ£πŸ” πŸšΊπŸšΌπŸ›„πŸˆ‚οΈπŸˆ³πŸ›ƒπŸ›—πŸ…ΏοΈπŸ§πŸ’€πŸŒ€β“‚οΈπŸ›œπŸšΉπŸŒπŸ’ β™ΏοΈπŸšΉπŸŒπŸ’ β™ΏοΈπŸšΉπŸŒπŸ’ β™ΏοΈπŸšΉπŸŒπŸ’ β™ΏοΈπŸ’€πŸŒ€β“‚οΈπŸ›œπŸŒ€β“‚οΈπŸ›œπŸŒ€β“‚οΈπŸ›œπŸŒ€β“‚οΈπŸ›œ @πŸ•³οΈπŸ‘οΈπŸ•΄πŸΏπŸ•΄οΈβ™£οΈβ™ οΈπŸšΊπŸ€„οΈπŸ›„β“‚οΈπŸ›œπŸ”„πŸƒπŸ§πŸ’€πŸŽ£πŸ”›πŸ‘οΈβ€πŸ—¨οΈπŸ”€πŸ”ƒπŸŒ€πŸ”₯β„ΉοΈπŸŽ΄πŸ•΄οΈπŸ•΄πŸΏπŸ•΄πŸ»![image](https://github.com/user-attachments/assets/25864181-791b-40ca-9e6d-92cf8e236163)![image](https://github.com/user-attachments/assets/bc78e604-5256-4aa4-86bc-15f50fd9b344)![image](https://github.com/user-attachments/assets/e7cfb8ae-999a-4acd-8976-d3c92ecc4b15)![image](https://github.com/user-attachments/assets/c8ce412b-7ab3-4b56-afba-4178a39411c5)![image](https://github.com/user-attachments/assets/91c8b750-a2b1-439f-8c24-de2d76bccbf9)![image](https://github.com/user-attachments/assets/321d966c-420c-4dc4-9671-eec040f412cc)![image](https://github.com/user-attachments/assets/a1beff8b-1b14-449d-8ef3-f144fa9cff79)![image](https://github.com/user-attachments/assets/db087bab-b758-4c6e-a297-59dc4f209758)![image](https://github.com/user-attachments/assets/e2c2b4cf-c756-4b4a-8a49-fc6cfb5368d5)![image](https://github.com/user-attachments/assets/410ef90f-8d9f-4c9c-ad22-27697161bf3b)![image](https://github.com/user-attachments/assets/1f0da61a-7ef8-49c2-8695-50462dfb534c)![image](https://github.com/user-attachments/assets/6adccd76-ec25-42cb-8f95-040132be43ce)![image](https://github.com/user-attachments/assets/9b028d02-dcd0-4169-8bf1-2b215ea442d7) ## Type of change - [x] Bug fix - [x] New provider / API surface - [x] Refactor - [x] Documentation - [x] Tests / CI - [x] Other ## Checklist - [x] Builds with the package’s supported Xcode/Swift versions - [x] Tests added or updated when behavior changes - [x] No secrets or API keys committed - [x] Docs updated if products, targets, public API, or dependencies changed: - [x] `README.md` - [x] `docs/ARCHITECTURE.md` (graph / tables) - [x] `CHANGELOG.md` (`[Unreleased]`) - [x] Layering respected (providers β†’ `LargeLanguageModels` β†’ `CoreMI`; avoid new providerβ†’provider deps) ## Test plan ## Related issues Signed-off-by: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> From 4fd48745b673fde8c0edc6e0f8c376ce9ae2a373 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 22 Aug 2026 21:41:47 +0000 Subject: [PATCH 268/271] Initial plan From 5fb769f17f92b25b24b6b967ff77a27648fbeed9 Mon Sep 17 00:00:00 2001 From: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> Date: Sat, 22 Aug 2026 21:44:21 -0400 Subject: [PATCH 269/271] weareone10billion commit Signed-off-by: 5hy7xz92nd-oss <249378113+5hy7xz92nd-oss@users.noreply.github.com> --- CONTRIBUTING.md | 142 ++++----- PATPAT-main.zip | Bin 0 -> 79202 bytes WEAREONE10BILLION-main (1).zip | Bin 0 -> 2872125 bytes awesome-ai-driven-development-main.zip | Bin 0 -> 491531 bytes enhanced-continuous-validation.yml | 396 +++++++++++++++++++++++++ exploitarium-main.zip | Bin 0 -> 600206 bytes hiclaw-main.zip | Bin 0 -> 5889746 bytes malduck-master.zip | Bin 0 -> 6019359 bytes neko-master.zip | Bin 0 -> 653872 bytes precision-engine-main.zip | Bin 0 -> 37084 bytes riscv-gnu-toolchain-master.zip | Bin 0 -> 2437437 bytes zzzzzzzz-main.zip | Bin 0 -> 17009486 bytes 12 files changed, 469 insertions(+), 69 deletions(-) create mode 100644 PATPAT-main.zip create mode 100644 WEAREONE10BILLION-main (1).zip create mode 100644 awesome-ai-driven-development-main.zip create mode 100644 enhanced-continuous-validation.yml create mode 100644 exploitarium-main.zip create mode 100644 hiclaw-main.zip create mode 100644 malduck-master.zip create mode 100644 neko-master.zip create mode 100644 precision-engine-main.zip create mode 100644 riscv-gnu-toolchain-master.zip create mode 100644 zzzzzzzz-main.zip diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0e562b86..d5ff9d8a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,78 +1,82 @@ -# Contributing +--- +layout: default +--- -Thanks for contributing to AI. +# Contributing to Open Source Guides -## Prerequisites +Thanks for checking out the Open Source Guides! We're excited to hear and learn from you. Your experiences will benefit others who read and use these guides. -- Xcode 15.4+ (Swift 5.10 toolchain) -- Apple platform SDKs supported by this package +We've put together the following guidelines to help you figure out where you can best be helpful. -## Getting Started +## Table of Contents -1. Fork the repository and create a feature branch. -2. Make focused changes with clear commit messages. -3. Run tests locally: +0. [Types of contributions we're looking for](#types-of-contributions-were-looking-for) +0. [Ground rules & expectations](#ground-rules--expectations) +0. [How to contribute](#how-to-contribute) +0. [Style guide](#style-guide) +0. [Setting up your environment](#setting-up-your-environment) +0. [Community](#community) + +## Types of contributions we're looking for + +There are many ways you can directly contribute to the guides (in descending order of need): + +* Fix editorial inconsistencies or inaccuracies +* [Translate guides into other languages](docs/translations.md) + +Interested in contributing to this Open Source Guide? Read on! + +## Ground rules & expectations + +Before we get started, here are a few things we expect from you (and that you should expect from others): + +* Be kind and thoughtful in your conversations around this project. We all come from different backgrounds and projects, which means we likely have different perspectives on "how open source is done." Try to listen to others rather than convince them that your way is correct. +* Open Source Guides are released with a [Contributor Code of Conduct](./CODE_OF_CONDUCT.md). By participating in this project, you agree to abide by its terms. +* Please ensure that your contribution passes all tests if you open a pull request. If there are test failures, you will need to address them before we can merge your contribution. +* When adding content, please consider if it is widely valuable. Please don't add references or links to things you or your employer have created, as others will do so if they appreciate it. + +## How to contribute + +If you'd like to contribute, start by searching through the [pull requests](https://github.com/github/opensource.guide/pulls) to see whether someone else has raised a similar idea or question. + +If you don't see your idea listed, and you think it fits into the goals of this guide, open a pull request. + +## πŸ’‘ Quick Tip for Beginners + +1. Always create a new branch for your changes. +2. Write clear commit messages. +3. Test your changes locally before submitting a PR. +4. Follow the style guide. +5. Be patient during reviews. + +## Style guide + +If you're writing content, see the [style guide](./docs/styleguide.md) to help your prose match the rest of the guides. + +## Setting up your environment + +This site is powered by [Jekyll](https://jekyllrb.com/). Running it on your local machine requires a working [Ruby](https://www.ruby-lang.org/en/) installation with [Bundler](https://bundler.io/) along with [npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm). + +Once you have that set up: + +1. Grant execution permissions to the scripts: + +```bash +chmod +x script/bootstrap +chmod +x script/server +``` + +2. Execute the scripts: ```bash -swift test +./script/bootstrap +./script/server ``` -4. Update documentation when behavior, APIs, or architecture changes. -5. Open a pull request with a clear summary and test notes. - -## Pull Request Checklist - -- [ ] Changes are scoped to one topic -- [ ] Public API changes are documented -- [ ] Tests pass locally (`swift test`) -- [ ] README/docs/changelog updated when needed - -## Repository Research Plan - -When working in this repository, start by identifying the layer and capability you are changing before touching code. - -1. Map the affected API surface: - - `Sources/CoreMI` - - `Sources/LargeLanguageModels` - - `Sources/AI` - - the specific provider target under `Sources/` -2. Inventory shared abstractions and extension points involved in the change: - - request handling - - model identifiers - - chat/completions - - embeddings - - audio, file, structured output, and tool-calling support -3. Compare provider parity for that capability to avoid introducing one-off patterns. -4. Audit the relevant tests under `Tests/` by capability as well as by provider. -5. Update docs when package products, imports, architecture, or behavior change. -6. Run `swift test` for code changes and record any notable validation steps in the pull request. - -## Agent / Workflow Roles - -Use focused ownership when splitting work across contributors or automation: - -- **Architecture**: owns module boundaries, `Package.swift`, and `docs/ARCHITECTURE.md`. -- **Core abstractions**: owns `CoreMI` and `LargeLanguageModels` protocols, shared request/response behavior, and compatibility across providers. -- **Provider**: owns one provider target at a time and aligns provider-specific APIs with shared abstractions. -- **Test**: expands coverage in `Tests/`, adds reusable fixtures/helpers, and verifies `swift test`. -- **Docs**: keeps `README.md`, `CONTRIBUTING.md`, `docs/ARCHITECTURE.md`, and `CHANGELOG.md` aligned with code changes. -- **Release / governance**: checks change scope, public API impact, dependency layering, and pull request hygiene. - -Recommended workflow: - -1. Scope work to one layer or one provider. -2. Review architecture or shared abstraction impact first. -3. Implement the provider or core change. -4. Update tests for behavior changes. -5. Update docs for API, product, or architecture changes. -6. Run `swift test`. -7. Review for consistency with neighboring providers before merging. - -## Reporting Issues - -When filing a bug, include: - -- Steps to reproduce -- Expected vs actual behavior -- Platform and Xcode/Swift versions -- Relevant logs or sample payloads +…and open in your web browser. + +## Community + +Discussions about the Open Source Guides take place on this repository's [Pull Requests](https://github.com/github/opensource.guide/pulls) section. Anybody is welcome to join these conversations. + +Wherever possible, do not take these conversations to private channels, including contacting the maintainers directly. Keeping communication public means everybody can benefit and learn from the conversation. diff --git a/PATPAT-main.zip b/PATPAT-main.zip new file mode 100644 index 0000000000000000000000000000000000000000..35d5179170c5e2f863b1d4f4533c7bb9cca8d306 GIT binary patch literal 79202 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%0DLrQULDSNo*2yq-a!tiDu7cbLbbU0w=+ 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®7F`txN0r4ui2YdhF*+znz_ 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 z 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

-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%0D%Cdkw$#+F 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

TS@(2 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�kc`UpxN=(rCX09G?@T2l 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�}kVifWjO0QyY^yao%|lQGK!rmnrK|F-Qe&Td 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

j|oXcrIP{W%Y?&+(@`fC_}>Kl1=Vf6W8rctbcN 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 z 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 z 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 K@5~BU~K};+3e@m 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%0A;Od702phEks7*m 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
1iTvC3f!& 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

-355!=Fkf4yewFO(sq*f>Qe) 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

lY=*0u)F{L#6zY8 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⁣TT7_k|h<~Ab zWHla_e=P)%*EXNOjJ|}N(r79J_lSQt)Z&k}H0kT5|M?Y5`FFX;L_Q|1n9YSuJZoe7 zS=_9PkhW@Li^2LvelgNUalN#Q7NkFth@UYPn)rGyA&R^;NYdeZ1HaI>X>!F9% z@Oy~e^)H4hq)I+@%D`v=NETD76wmodVLnX?3KI!+L>J>ME{@Q@1_A&l%548DyT8Sd zKSz>3Pl#M#KA5UVW{vy-KXXjBDld?mBNk8%tIMQCf4})vXZe(xg$8YU-5!H@Y|+BV z-EA*JTT;ny7-H-M$XBnsH(0T6bE~pz+Qzm$C7r#|%Rv*U!sB}(aLLh5lgFtdqlm>@ zuC7_*q@sg)pgMe@vf|8mS%ZD!uPr?qaG%8E<5<&bXu>KZ^k=E~CGHQNpT1^OxuUT$ znyG1`Bi|rJj!*DzwfZnY#hJwtHge)m{{a(6W2tXgsg