import Foundation import Hummingbird actor HealthState { private var ready = false func markReady() { ready = true } func isReady() -> Bool { ready } } func buildRouter(service: EmbedService, health: HealthState) -> Router { let router = Router() router.get("/healthz") { _, _ -> Response in let ready = await health.isReady() let status: HTTPResponse.Status = ready ? .ok : .serviceUnavailable let body = ready ? "ok" : "warming" var response = Response(status: status, body: .init(byteBuffer: .init(string: body))) response.headers[.contentType] = "text/plain" return response } router.post("/embed") { request, context -> Response in let req = try await request.decode(as: EmbedRequest.self, context: context) if req.texts.isEmpty { throw HTTPError(.badRequest, message: "texts must be non-empty") } let size = req.size ?? .s06 let vectors = try await service.embed( texts: req.texts, kind: req.input_type, size: size) let dim = vectors.first?.count ?? 0 let resp = EmbedResponse(vectors: vectors, dim: dim, model: size.label) let data = try JSONEncoder().encode(resp) var response = Response( status: .ok, body: .init(byteBuffer: .init(bytes: data)) ) response.headers[.contentType] = "application/json" return response } return router }