@nyrra/foundry-ai
Version:
Thin Palantir Foundry provider adapters and model catalog for the Vercel AI SDK.
1 lines • 6.85 kB
Source Map (JSON)
{"version":3,"sources":["../../src/providers/third-party.ts"],"sourcesContent":["import { createOpenAI } from '@ai-sdk/openai';\nimport { NoSuchModelError } from 'ai';\nimport { resolveFoundryConfig } from '../config.js';\nimport { type FoundryLanguageModel, wrapFoundryLanguageModel } from '../middleware.js';\nimport { resolveModelTarget } from '../models/catalog.js';\nimport type { ThirdPartyModelId } from '../models/third-party-models.js';\nimport type { FoundryConfig } from '../types.js';\n\nexport interface FoundryThirdPartyProvider {\n (modelId: ThirdPartyModelId): FoundryLanguageModel;\n specificationVersion: FoundryLanguageModel['specificationVersion'];\n languageModel(modelId: ThirdPartyModelId): FoundryLanguageModel;\n embeddingModel(modelId: string): never;\n imageModel(modelId: string): never;\n}\n\n/** Routes known third-party aliases and RIDs through their verified Foundry proxy. */\nexport function createFoundryThirdParty(config: FoundryConfig): FoundryThirdPartyProvider {\n const resolved = resolveFoundryConfig(config, 'createFoundryThirdParty');\n const providerId = 'foundry-third-party';\n const headers = {\n ...(resolved.attributionRid ? { attribution: resolved.attributionRid } : {}),\n ...(resolved.traceParent ? { traceParent: resolved.traceParent } : {}),\n ...(resolved.traceState ? { traceState: resolved.traceState } : {}),\n };\n const createProxy = (family: 'openai' | 'xai') =>\n createOpenAI({\n apiKey: resolved.token,\n baseURL: `${resolved.foundryUrl}/api/v2/llm/proxy/${family}/v1`,\n headers,\n name: providerId,\n ...(family === 'xai' ? { fetch: createXaiProxyFetch() } : {}),\n });\n const openai = createProxy('openai');\n const xai = createProxy('xai');\n\n const createLanguageModel = (modelId: ThirdPartyModelId): FoundryLanguageModel => {\n const { rid, metadata } = resolveModelTarget(modelId);\n if (metadata?.provider !== 'third-party' || metadata.transport == null) {\n throw new NoSuchModelError({ modelId, modelType: 'languageModel' });\n }\n if (metadata.transport === 'unavailable') {\n throw new NoSuchModelError({\n modelId,\n modelType: 'languageModel',\n message: `${modelId} is enrolled in Foundry, but has no verified provider-compatible proxy route. See docs/third-party-model-support.md.`,\n });\n }\n const model =\n metadata.transport === 'openai-chat'\n ? openai.chat(rid)\n : metadata.transport === 'xai-responses'\n ? xai.responses(rid)\n : openai.responses(rid);\n return wrapFoundryLanguageModel(model, {\n modelId,\n providerId,\n transformParams: (params) => {\n const options = params.providerOptions?.openai ?? {};\n if (options.store === true) {\n throw new Error(\n 'Foundry third-party models do not support providerOptions.openai.store=true.',\n );\n }\n return {\n ...params,\n providerOptions: {\n ...params.providerOptions,\n openai: { ...options, store: metadata.transport === 'openai-chat' ? undefined : false },\n },\n };\n },\n });\n };\n\n const provider = createLanguageModel as FoundryThirdPartyProvider;\n provider.specificationVersion = openai.specificationVersion;\n provider.languageModel = createLanguageModel;\n provider.embeddingModel = (modelId) => {\n throw new NoSuchModelError({ modelId, modelType: 'embeddingModel' });\n };\n provider.imageModel = (modelId) => {\n throw new NoSuchModelError({ modelId, modelType: 'imageModel' });\n };\n return provider;\n}\n\n// Foundry's beta xAI proxy accepts assistant text as a string, but rejects\n// the output_text content parts emitted by the OpenAI Responses serializer.\nfunction createXaiProxyFetch(): typeof fetch {\n return async (input, init) => {\n const request = new Request(input, init);\n const body = (await request.json()) as Record<string, unknown>;\n if (Array.isArray(body.input)) {\n body.input = body.input.map((item: { role?: string; content?: unknown; id?: string }) => {\n if (item.role !== 'assistant' || !Array.isArray(item.content)) return item;\n if (\n !item.content.every(\n (part) => part.type === 'output_text' && typeof part.text === 'string',\n )\n )\n return item;\n const { id: _id, ...message } = item;\n return { ...message, content: item.content.map((part) => part.text).join('') };\n });\n }\n return fetch(new Request(request, { body: JSON.stringify(body) }));\n };\n}\n"],"mappings":"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","names":[]}