@providerprotocol/ai 0.0.16 → 0.0.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,29 @@
1
- import { b as Provider, d as ModelReference, a as LLMHandler } from '../provider-vTZ74u-w.js';
1
+ import { d as Provider, f as ModelReference, b as LLMHandler, c as EmbeddingHandler } from '../provider-D5MO3-pS.js';
2
+
3
+ /**
4
+ * @fileoverview OpenRouter Embeddings API Handler
5
+ *
6
+ * This module implements the embedding handler for OpenRouter's embeddings API.
7
+ * OpenRouter provides access to multiple embedding providers through an OpenAI-compatible endpoint.
8
+ *
9
+ * @see {@link https://openrouter.ai/docs/api/reference/embeddings OpenRouter Embeddings API Reference}
10
+ * @module providers/openrouter/embed
11
+ */
12
+
13
+ /**
14
+ * OpenRouter embedding parameters.
15
+ * Passed through unchanged to the API.
16
+ */
17
+ interface OpenRouterEmbedParams {
18
+ /** Output dimensions (model-dependent) */
19
+ dimensions?: number;
20
+ /** Encoding format: 'float' or 'base64' */
21
+ encoding_format?: 'float' | 'base64';
22
+ /** A unique identifier representing your end-user */
23
+ user?: string;
24
+ /** Input type hint for some models */
25
+ input_type?: string;
26
+ }
2
27
 
3
28
  /**
4
29
  * OpenRouter-specific types for the Unified Provider Protocol.
@@ -289,10 +314,11 @@ interface OpenRouterProvider extends Provider<OpenRouterProviderOptions> {
289
314
  readonly version: string;
290
315
  /**
291
316
  * Supported modalities for this provider.
292
- * OpenRouter currently only supports LLM (text generation).
317
+ * OpenRouter supports LLM (text generation) and Embedding.
293
318
  */
294
319
  readonly modalities: {
295
320
  llm: LLMHandler<OpenRouterLLMParamsUnion>;
321
+ embedding: EmbeddingHandler<OpenRouterEmbedParams>;
296
322
  };
297
323
  }
298
324
  /**
@@ -346,4 +372,4 @@ interface OpenRouterProvider extends Provider<OpenRouterProviderOptions> {
346
372
  */
347
373
  declare const openrouter: OpenRouterProvider;
348
374
 
349
- export { type OpenRouterAPIMode, type OpenRouterCompletionsParams, type OpenRouterConfig, type OpenRouterModelOptions, type OpenRouterModelReference, type OpenRouterProviderPreferences, type OpenRouterResponsesParams, openrouter };
375
+ export { type OpenRouterAPIMode, type OpenRouterCompletionsParams, type OpenRouterConfig, type OpenRouterEmbedParams, type OpenRouterModelOptions, type OpenRouterModelReference, type OpenRouterProviderPreferences, type OpenRouterResponsesParams, openrouter };
@@ -1336,11 +1336,121 @@ function createResponsesLLMHandler() {
1336
1336
  };
1337
1337
  }
1338
1338
 
1339
+ // src/providers/openrouter/embed.ts
1340
+ var OPENROUTER_EMBEDDINGS_API_URL = "https://openrouter.ai/api/v1/embeddings";
1341
+ function getDefaultDimensions(modelId) {
1342
+ if (modelId.includes("text-embedding-3-large")) {
1343
+ return 3072;
1344
+ }
1345
+ if (modelId.includes("text-embedding-3-small") || modelId.includes("ada-002")) {
1346
+ return 1536;
1347
+ }
1348
+ if (modelId.includes("gemini-embedding")) {
1349
+ return 3072;
1350
+ }
1351
+ return 1536;
1352
+ }
1353
+ function createEmbeddingHandler() {
1354
+ let providerRef = null;
1355
+ return {
1356
+ supportedInputs: ["text"],
1357
+ _setProvider(provider) {
1358
+ providerRef = provider;
1359
+ },
1360
+ bind(modelId) {
1361
+ if (!providerRef) {
1362
+ throw new UPPError(
1363
+ "Provider reference not set. Handler must be used with createProvider().",
1364
+ "INVALID_REQUEST",
1365
+ "openrouter",
1366
+ "embedding"
1367
+ );
1368
+ }
1369
+ const model = {
1370
+ modelId,
1371
+ maxBatchSize: 2048,
1372
+ maxInputLength: 8191,
1373
+ dimensions: getDefaultDimensions(modelId),
1374
+ get provider() {
1375
+ return providerRef;
1376
+ },
1377
+ async embed(request) {
1378
+ const apiKey = await resolveApiKey(
1379
+ request.config,
1380
+ "OPENROUTER_API_KEY",
1381
+ "openrouter",
1382
+ "embedding"
1383
+ );
1384
+ const baseUrl = request.config.baseUrl ?? OPENROUTER_EMBEDDINGS_API_URL;
1385
+ const inputTexts = request.inputs.map((input) => {
1386
+ if (typeof input === "string") {
1387
+ return input;
1388
+ }
1389
+ if ("text" in input) {
1390
+ return input.text;
1391
+ }
1392
+ throw new UPPError(
1393
+ "OpenRouter embeddings only support text input",
1394
+ "INVALID_REQUEST",
1395
+ "openrouter",
1396
+ "embedding"
1397
+ );
1398
+ });
1399
+ const body = {
1400
+ model: modelId,
1401
+ input: inputTexts
1402
+ };
1403
+ if (request.params?.dimensions !== void 0) {
1404
+ body.dimensions = request.params.dimensions;
1405
+ }
1406
+ if (request.params?.encoding_format !== void 0) {
1407
+ body.encoding_format = request.params.encoding_format;
1408
+ }
1409
+ if (request.params?.user !== void 0) {
1410
+ body.user = request.params.user;
1411
+ }
1412
+ if (request.params?.input_type !== void 0) {
1413
+ body.input_type = request.params.input_type;
1414
+ }
1415
+ const headers = {
1416
+ "Content-Type": "application/json",
1417
+ Authorization: `Bearer ${apiKey}`
1418
+ };
1419
+ if (request.config.headers) {
1420
+ for (const [key, value] of Object.entries(request.config.headers)) {
1421
+ if (value !== void 0) {
1422
+ headers[key] = value;
1423
+ }
1424
+ }
1425
+ }
1426
+ const response = await doFetch(baseUrl, {
1427
+ method: "POST",
1428
+ headers,
1429
+ body: JSON.stringify(body),
1430
+ signal: request.signal
1431
+ }, request.config, "openrouter", "embedding");
1432
+ const data = await response.json();
1433
+ return {
1434
+ embeddings: data.data.map((d) => ({
1435
+ vector: d.embedding,
1436
+ index: d.index
1437
+ })),
1438
+ usage: { totalTokens: data.usage.total_tokens },
1439
+ metadata: data.usage.cost !== void 0 ? { cost: data.usage.cost } : void 0
1440
+ };
1441
+ }
1442
+ };
1443
+ return model;
1444
+ }
1445
+ };
1446
+ }
1447
+
1339
1448
  // src/providers/openrouter/index.ts
1340
1449
  function createOpenRouterProvider() {
1341
1450
  let currentApiMode = "completions";
1342
1451
  const completionsHandler = createCompletionsLLMHandler();
1343
1452
  const responsesHandler = createResponsesLLMHandler();
1453
+ const embeddingHandler = createEmbeddingHandler();
1344
1454
  const fn = function(modelId, options) {
1345
1455
  const apiMode = options?.api ?? "completions";
1346
1456
  currentApiMode = apiMode;
@@ -1349,7 +1459,8 @@ function createOpenRouterProvider() {
1349
1459
  const modalities = {
1350
1460
  get llm() {
1351
1461
  return currentApiMode === "responses" ? responsesHandler : completionsHandler;
1352
- }
1462
+ },
1463
+ embedding: embeddingHandler
1353
1464
  };
1354
1465
  Object.defineProperties(fn, {
1355
1466
  name: {
@@ -1371,6 +1482,7 @@ function createOpenRouterProvider() {
1371
1482
  const provider = fn;
1372
1483
  completionsHandler._setProvider?.(provider);
1373
1484
  responsesHandler._setProvider?.(provider);
1485
+ embeddingHandler._setProvider?.(provider);
1374
1486
  return provider;
1375
1487
  }
1376
1488
  var openrouter = createOpenRouterProvider();