8a66b9086a
- Started from ac75faa (initial E4B-MarkBase integration)
- Kept Sources/ (all engine code) + Package.swift + .gitignore
- Removed all ad-hoc tests, documentation, scripts, Python files
- Added Tests/00_Unit/ (MathTest, TokenizerTest, SamplerTest)
- Added .gitea/workflows/ci.yaml (build + unit tests + lint)
- Added Scripts/check_resources.sh (memory-aware test runner)
- Added Tests/Manifest.json (resource requirements for all tests)
- Focus: 4-bit quantized models only
113 lines
3.4 KiB
Swift
113 lines
3.4 KiB
Swift
import Foundation
|
|
|
|
// ─────────────────────────────────────────────────────────────
|
|
// Embeddings API Models
|
|
// OpenAI Compatible Format
|
|
// ─────────────────────────────────────────────────────────────
|
|
|
|
/// Embeddings request
|
|
public struct EmbeddingsRequest: Codable {
|
|
public let model: String
|
|
public let input: InputType
|
|
public let encoding_format: String?
|
|
|
|
public enum InputType: Codable, Sendable {
|
|
case string(String)
|
|
case strings([String])
|
|
case tokens([Int])
|
|
case tokensList([[Int]])
|
|
|
|
public init(from decoder: Decoder) throws {
|
|
let container = try decoder.singleValueContainer()
|
|
|
|
if let string = try? container.decode(String.self) {
|
|
self = .string(string)
|
|
} else if let strings = try? container.decode([String].self) {
|
|
self = .strings(strings)
|
|
} else if let tokens = try? container.decode([Int].self) {
|
|
self = .tokens(tokens)
|
|
} else if let tokensList = try? container.decode([[Int]].self) {
|
|
self = .tokensList(tokensList)
|
|
} else {
|
|
throw DecodingError.dataCorruptedError(
|
|
in: container,
|
|
debugDescription: "Invalid input type"
|
|
)
|
|
}
|
|
}
|
|
|
|
public func encode(to encoder: Encoder) throws {
|
|
var container = encoder.singleValueContainer()
|
|
|
|
switch self {
|
|
case .string(let string):
|
|
try container.encode(string)
|
|
case .strings(let strings):
|
|
try container.encode(strings)
|
|
case .tokens(let tokens):
|
|
try container.encode(tokens)
|
|
case .tokensList(let tokensList):
|
|
try container.encode(tokensList)
|
|
}
|
|
}
|
|
}
|
|
|
|
public init(
|
|
model: String,
|
|
input: InputType,
|
|
encoding_format: String? = nil
|
|
) {
|
|
self.model = model
|
|
self.input = input
|
|
self.encoding_format = encoding_format
|
|
}
|
|
}
|
|
|
|
/// Embeddings response
|
|
public struct EmbeddingsResponse: Codable, Sendable {
|
|
public let object: String
|
|
public let data: [EmbeddingData]
|
|
public let model: String
|
|
public let usage: EmbeddingUsage
|
|
|
|
public init(
|
|
object: String = "list",
|
|
data: [EmbeddingData],
|
|
model: String,
|
|
usage: EmbeddingUsage
|
|
) {
|
|
self.object = object
|
|
self.data = data
|
|
self.model = model
|
|
self.usage = usage
|
|
}
|
|
}
|
|
|
|
/// Single embedding data
|
|
public struct EmbeddingData: Codable, Sendable {
|
|
public let object: String
|
|
public let index: Int
|
|
public let embedding: [Float]
|
|
|
|
public init(
|
|
object: String = "embedding",
|
|
index: Int,
|
|
embedding: [Float]
|
|
) {
|
|
self.object = object
|
|
self.index = index
|
|
self.embedding = embedding
|
|
}
|
|
}
|
|
|
|
/// Embedding usage
|
|
public struct EmbeddingUsage: Codable, Sendable {
|
|
public let prompt_tokens: Int
|
|
public let total_tokens: Int
|
|
|
|
public init(prompt_tokens: Int, total_tokens: Int) {
|
|
self.prompt_tokens = prompt_tokens
|
|
self.total_tokens = total_tokens
|
|
}
|
|
}
|