{"version":3,"file":"llm-client.mjs","sources":["webpack://@tarko/model-provider/./src/llm-client.ts"],"sourcesContent":["/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { TokenJS } from '@tarko/llm-client';\nimport { OpenAI } from 'openai';\nimport { LLMRequest, AgentModel } from './types';\nimport type { ChatCompletionCreateParamsBase } from './third-party';\n\n// Providers that should not be added to extended model list\nconst NATIVE_PROVIDERS = new Set(['openrouter', 'openai-compatible', 'azure-openai']);\n\nexport type LLMRequestInterceptor = (\n  provider: string,\n  request: LLMRequest,\n  baseURL?: string,\n) => ChatCompletionCreateParamsBase;\n\n/**\n * Create LLM Client based on current model configuration\n *\n * @param agentModel Resolved model configuration\n * @param requestInterceptor Optional request interceptor for modifying requests\n * @returns OpenAI-compatible client\n */\nexport function createLLMClient(\n  agentModel: AgentModel,\n  requestInterceptor?: LLMRequestInterceptor,\n): OpenAI {\n  const { provider, id, baseProvider, baseURL, apiKey, headers, params } = agentModel;\n\n  const client = new TokenJS({\n    apiKey,\n    baseURL,\n    defaultHeaders: headers,\n  });\n\n  // Add extended model support for non-native providers\n  if (baseProvider && !NATIVE_PROVIDERS.has(baseProvider)) {\n    // Safely extend model list with type assertion\n    const extendableClient = client as unknown as {\n      extendModelList: (\n        provider: string,\n        model: string,\n        capabilities: Record<string, boolean>,\n      ) => void;\n    };\n\n    if (typeof extendableClient.extendModelList === 'function') {\n      extendableClient.extendModelList(baseProvider, id, {\n        streaming: true,\n        json: true,\n        toolCalls: true,\n        images: true,\n      });\n    }\n  }\n\n  // Create OpenAI-compatible interface\n  return {\n    chat: {\n      completions: {\n        async create(requestParams: ChatCompletionCreateParamsBase) {\n          const requestPayload = {\n            ...requestParams,\n            provider,\n            model: id,\n            // Merge experimental params directly into request body\n            ...params,\n          };\n\n          const finalRequest = requestInterceptor\n            ? requestInterceptor(provider, requestPayload, baseURL)\n            : requestPayload;\n\n          return client.chat.completions.create({\n            ...finalRequest,\n            provider: baseProvider || 'openai',\n          });\n        },\n      },\n    },\n  } as unknown as OpenAI;\n}\n"],"names":["NATIVE_PROVIDERS","Set","createLLMClient","agentModel","requestInterceptor","provider","id","baseProvider","baseURL","apiKey","headers","params","client","TokenJS","extendableClient","requestParams","requestPayload","finalRequest"],"mappings":";;;;;AAWA,MAAMA,mBAAmB,IAAIC,IAAI;IAAC;IAAc;IAAqB;CAAe;AAe7E,SAASC,gBACdC,UAAsB,EACtBC,kBAA0C;IAE1C,MAAM,EAAEC,QAAQ,EAAEC,EAAE,EAAEC,YAAY,EAAEC,OAAO,EAAEC,MAAM,EAAEC,OAAO,EAAEC,MAAM,EAAE,GAAGR;IAEzE,MAAMS,SAAS,IAAIC,QAAQ;QACzBJ;QACAD;QACA,gBAAgBE;IAClB;IAGA,IAAIH,gBAAgB,CAACP,iBAAiB,GAAG,CAACO,eAAe;QAEvD,MAAMO,mBAAmBF;QAQzB,IAAI,AAA4C,cAA5C,OAAOE,iBAAiB,eAAe,EACzCA,iBAAiB,eAAe,CAACP,cAAcD,IAAI;YACjD,WAAW;YACX,MAAM;YACN,WAAW;YACX,QAAQ;QACV;IAEJ;IAGA,OAAO;QACL,MAAM;YACJ,aAAa;gBACX,MAAM,QAAOS,aAA6C;oBACxD,MAAMC,iBAAiB;wBACrB,GAAGD,aAAa;wBAChBV;wBACA,OAAOC;wBAEP,GAAGK,MAAM;oBACX;oBAEA,MAAMM,eAAeb,qBACjBA,mBAAmBC,UAAUW,gBAAgBR,WAC7CQ;oBAEJ,OAAOJ,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;wBACpC,GAAGK,YAAY;wBACf,UAAUV,gBAAgB;oBAC5B;gBACF;YACF;QACF;IACF;AACF"}