UNPKG

@nyrra/foundry-ai

Version:

Thin Palantir Foundry provider adapters and model catalog for the Vercel AI SDK.

94 lines (93 loc) 3.52 kB
import { wrapFoundryLanguageModel } from "../chunk-NF2EPQB5.mjs"; import { resolveFoundryConfig, resolveModelTarget } from "../chunk-7OARDNWY.mjs"; // src/providers/third-party.ts import { createOpenAI } from "@ai-sdk/openai"; import { NoSuchModelError } from "ai"; function createFoundryThirdParty(config) { const resolved = resolveFoundryConfig(config, "createFoundryThirdParty"); const providerId = "foundry-third-party"; const headers = { ...resolved.attributionRid ? { attribution: resolved.attributionRid } : {}, ...resolved.traceParent ? { traceParent: resolved.traceParent } : {}, ...resolved.traceState ? { traceState: resolved.traceState } : {} }; const createProxy = (family) => createOpenAI({ apiKey: resolved.token, baseURL: `${resolved.foundryUrl}/api/v2/llm/proxy/${family}/v1`, headers, name: providerId, ...family === "xai" ? { fetch: createXaiProxyFetch() } : {} }); const openai = createProxy("openai"); const xai = createProxy("xai"); const createLanguageModel = (modelId) => { const { rid, metadata } = resolveModelTarget(modelId); if (metadata?.provider !== "third-party" || metadata.transport == null) { throw new NoSuchModelError({ modelId, modelType: "languageModel" }); } if (metadata.transport === "unavailable") { throw new NoSuchModelError({ modelId, modelType: "languageModel", message: `${modelId} is enrolled in Foundry, but has no verified provider-compatible proxy route. See docs/third-party-model-support.md.` }); } const model = metadata.transport === "openai-chat" ? openai.chat(rid) : metadata.transport === "xai-responses" ? xai.responses(rid) : openai.responses(rid); return wrapFoundryLanguageModel(model, { modelId, providerId, transformParams: (params) => { const options = params.providerOptions?.openai ?? {}; if (options.store === true) { throw new Error( "Foundry third-party models do not support providerOptions.openai.store=true." ); } return { ...params, providerOptions: { ...params.providerOptions, openai: { ...options, store: metadata.transport === "openai-chat" ? void 0 : false } } }; } }); }; const provider = createLanguageModel; provider.specificationVersion = openai.specificationVersion; provider.languageModel = createLanguageModel; provider.embeddingModel = (modelId) => { throw new NoSuchModelError({ modelId, modelType: "embeddingModel" }); }; provider.imageModel = (modelId) => { throw new NoSuchModelError({ modelId, modelType: "imageModel" }); }; return provider; } function createXaiProxyFetch() { return async (input, init) => { const request = new Request(input, init); const body = await request.json(); if (Array.isArray(body.input)) { body.input = body.input.map((item) => { if (item.role !== "assistant" || !Array.isArray(item.content)) return item; if (!item.content.every( (part) => part.type === "output_text" && typeof part.text === "string" )) return item; const { id: _id, ...message } = item; return { ...message, content: item.content.map((part) => part.text).join("") }; }); } return fetch(new Request(request, { body: JSON.stringify(body) })); }; } export { createFoundryThirdParty }; //# sourceMappingURL=third-party.mjs.map