@nyrra/foundry-ai
Version:
Thin Palantir Foundry provider adapters and model catalog for the Vercel AI SDK.
94 lines (93 loc) • 3.52 kB
JavaScript
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