{"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":[]}