| import { sanitizeErrorMessage } from "@omniroute/open-sse/utils/error.ts";
|
| import { createEmbeddingResponse } from "@/lib/embeddings/service";
|
| import type { EmbeddingResult, EmbeddingError } from "./types";
|
|
|
| export async function embedRemote(
|
| text: string,
|
| model: string
|
| ): Promise<EmbeddingResult | EmbeddingError> {
|
| const t0 = Date.now();
|
|
|
| let resp: Response;
|
| try {
|
| resp = await createEmbeddingResponse({ model, input: text });
|
| } catch (err: unknown) {
|
|
|
| const isTimeout =
|
| err instanceof Error &&
|
| (err.name === "AbortError" || err.message.toLowerCase().includes("timeout"));
|
| return {
|
| source: "remote",
|
| model,
|
| reason: isTimeout ? "timeout" : "request_failed",
|
| message: sanitizeErrorMessage(err instanceof Error ? err.message : String(err)),
|
| };
|
| }
|
|
|
| if (!resp.ok) {
|
| const status = resp.status;
|
| if (status === 401 || status === 403) {
|
| return {
|
| source: "remote",
|
| model,
|
| reason: "no_key",
|
| message: sanitizeErrorMessage(`Embedding provider returned ${status}`),
|
| };
|
| }
|
| if (status === 429) {
|
| return {
|
| source: "remote",
|
| model,
|
| reason: "rate_limited",
|
| message: sanitizeErrorMessage(`Embedding provider returned 429 (rate limited)`),
|
| };
|
| }
|
| return {
|
| source: "remote",
|
| model,
|
| reason: "request_failed",
|
| message: sanitizeErrorMessage(`Embedding provider returned HTTP ${status}`),
|
| };
|
| }
|
|
|
| let json: unknown;
|
| try {
|
| json = await resp.json();
|
| } catch (err: unknown) {
|
| return {
|
| source: "remote",
|
| model,
|
| reason: "request_failed",
|
| message: sanitizeErrorMessage(
|
| err instanceof Error ? err.message : "Failed to parse embedding response"
|
| ),
|
| };
|
| }
|
|
|
| try {
|
| const data = (json as { data?: Array<{ embedding: number[] }> }).data;
|
| if (!Array.isArray(data) || data.length === 0 || !Array.isArray(data[0].embedding)) {
|
| return {
|
| source: "remote",
|
| model,
|
| reason: "request_failed",
|
| message: sanitizeErrorMessage("Unexpected embedding response shape: missing data[0].embedding"),
|
| };
|
| }
|
| const rawVec = data[0].embedding as number[];
|
| const vector = new Float32Array(rawVec);
|
| return {
|
| vector,
|
| source: "remote",
|
| model,
|
| dimensions: vector.length,
|
| latencyMs: Date.now() - t0,
|
| cached: false,
|
| };
|
| } catch (err: unknown) {
|
| return {
|
| source: "remote",
|
| model,
|
| reason: "request_failed",
|
| message: sanitizeErrorMessage(err instanceof Error ? err.message : "Embedding parse error"),
|
| };
|
| }
|
| }
|
|
|