@friendliai/ai-provider 1.0.2 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @friendliai/ai-provider
2
2
 
3
+ ## 1.0.3
4
+
5
+ ### Patch Changes
6
+
7
+ - df0f0b8: Fix finishReason format to match AI SDK v6 requirements and add proper text/reasoning event lifecycle
8
+
3
9
  ## 1.0.2
4
10
 
5
11
  ### Patch Changes
package/dist/index.js CHANGED
@@ -34,7 +34,7 @@ var import_provider_utils5 = require("@ai-sdk/provider-utils");
34
34
  var import_internal = require("@ai-sdk/openai-compatible/internal");
35
35
  var import_provider3 = require("@ai-sdk/provider");
36
36
  var import_provider_utils2 = require("@ai-sdk/provider-utils");
37
- var import_zod2 = require("zod");
37
+ var import_v4 = require("zod/v4");
38
38
 
39
39
  // src/friendli-error.ts
40
40
  var import_provider = require("@ai-sdk/provider");
@@ -413,8 +413,10 @@ var FriendliAIChatLanguageModel = class {
413
413
  fetch: this.config.fetch
414
414
  });
415
415
  const toolCalls = [];
416
- let finishReason = "other";
417
- let rawFinishReason;
416
+ let finishReason = {
417
+ unified: "other",
418
+ raw: void 0
419
+ };
418
420
  const usage = {
419
421
  completionTokens: void 0,
420
422
  completionTokensDetails: {
@@ -443,7 +445,7 @@ var FriendliAIChatLanguageModel = class {
443
445
  transform(chunk, controller) {
444
446
  var _a2, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q;
445
447
  if (!chunk.success) {
446
- finishReason = "error";
448
+ finishReason = { unified: "error", raw: void 0 };
447
449
  controller.enqueue({ type: "error", error: chunk.error });
448
450
  return;
449
451
  }
@@ -474,7 +476,7 @@ var FriendliAIChatLanguageModel = class {
474
476
  });
475
477
  break;
476
478
  case "ERRORED":
477
- finishReason = "error";
479
+ finishReason = { unified: "error", raw: void 0 };
478
480
  controller.enqueue({
479
481
  type: "tool-result",
480
482
  toolCallId,
@@ -484,7 +486,7 @@ var FriendliAIChatLanguageModel = class {
484
486
  });
485
487
  break;
486
488
  default:
487
- finishReason = "error";
489
+ finishReason = { unified: "error", raw: void 0 };
488
490
  controller.enqueue({
489
491
  type: "error",
490
492
  error: new Error(`Unsupported tool call status: ${value.status}`)
@@ -494,12 +496,12 @@ var FriendliAIChatLanguageModel = class {
494
496
  }
495
497
  const chunkErrorMessage = getChunkErrorMessage(value);
496
498
  if (chunkErrorMessage != null) {
497
- finishReason = "error";
499
+ finishReason = { unified: "error", raw: void 0 };
498
500
  controller.enqueue({ type: "error", error: chunkErrorMessage });
499
501
  return;
500
502
  }
501
503
  if (!isOpenAIChatChunk(value)) {
502
- finishReason = "error";
504
+ finishReason = { unified: "error", raw: void 0 };
503
505
  controller.enqueue({
504
506
  type: "error",
505
507
  error: new Error("Unsupported chunk shape")
@@ -540,8 +542,10 @@ var FriendliAIChatLanguageModel = class {
540
542
  }
541
543
  const choice = chunkValue.choices[0];
542
544
  if ((choice == null ? void 0 : choice.finish_reason) != null) {
543
- rawFinishReason = choice.finish_reason;
544
- finishReason = (0, import_internal.mapOpenAICompatibleFinishReason)(choice.finish_reason);
545
+ finishReason = {
546
+ unified: (0, import_internal.mapOpenAICompatibleFinishReason)(choice.finish_reason),
547
+ raw: choice.finish_reason
548
+ };
545
549
  }
546
550
  if ((choice == null ? void 0 : choice.delta) == null) {
547
551
  return;
@@ -677,10 +681,7 @@ var FriendliAIChatLanguageModel = class {
677
681
  }
678
682
  controller.enqueue({
679
683
  type: "finish",
680
- finishReason: {
681
- unified: finishReason,
682
- raw: rawFinishReason
683
- },
684
+ finishReason,
684
685
  usage: {
685
686
  inputTokens: {
686
687
  total: (_a2 = usage.promptTokens) != null ? _a2 : void 0,
@@ -704,121 +705,121 @@ var FriendliAIChatLanguageModel = class {
704
705
  };
705
706
  }
706
707
  };
707
- var openaiCompatibleTokenUsageSchema = import_zod2.z.object({
708
- prompt_tokens: import_zod2.z.number().nullish(),
709
- completion_tokens: import_zod2.z.number().nullish(),
710
- total_tokens: import_zod2.z.number().nullish(),
711
- prompt_tokens_details: import_zod2.z.object({
712
- cached_tokens: import_zod2.z.number().nullish()
708
+ var openaiCompatibleTokenUsageSchema = import_v4.z.object({
709
+ prompt_tokens: import_v4.z.number().nullish(),
710
+ completion_tokens: import_v4.z.number().nullish(),
711
+ total_tokens: import_v4.z.number().nullish(),
712
+ prompt_tokens_details: import_v4.z.object({
713
+ cached_tokens: import_v4.z.number().nullish()
713
714
  }).nullish(),
714
- completion_tokens_details: import_zod2.z.object({
715
- reasoning_tokens: import_zod2.z.number().nullish(),
716
- accepted_prediction_tokens: import_zod2.z.number().nullish(),
717
- rejected_prediction_tokens: import_zod2.z.number().nullish()
715
+ completion_tokens_details: import_v4.z.object({
716
+ reasoning_tokens: import_v4.z.number().nullish(),
717
+ accepted_prediction_tokens: import_v4.z.number().nullish(),
718
+ rejected_prediction_tokens: import_v4.z.number().nullish()
718
719
  }).nullish()
719
720
  }).nullish();
720
- var OpenAICompatibleChatResponseSchema = import_zod2.z.object({
721
- id: import_zod2.z.string().nullish(),
722
- created: import_zod2.z.number().nullish(),
723
- model: import_zod2.z.string().nullish(),
724
- choices: import_zod2.z.array(
725
- import_zod2.z.object({
726
- message: import_zod2.z.object({
727
- role: import_zod2.z.literal("assistant").nullish(),
728
- content: import_zod2.z.string().nullish(),
729
- reasoning_content: import_zod2.z.string().nullish(),
730
- tool_calls: import_zod2.z.array(
731
- import_zod2.z.object({
732
- id: import_zod2.z.string().nullish(),
733
- type: import_zod2.z.literal("function"),
734
- function: import_zod2.z.object({
735
- name: import_zod2.z.string(),
736
- arguments: import_zod2.z.string()
721
+ var OpenAICompatibleChatResponseSchema = import_v4.z.object({
722
+ id: import_v4.z.string().nullish(),
723
+ created: import_v4.z.number().nullish(),
724
+ model: import_v4.z.string().nullish(),
725
+ choices: import_v4.z.array(
726
+ import_v4.z.object({
727
+ message: import_v4.z.object({
728
+ role: import_v4.z.literal("assistant").nullish(),
729
+ content: import_v4.z.string().nullish(),
730
+ reasoning_content: import_v4.z.string().nullish(),
731
+ tool_calls: import_v4.z.array(
732
+ import_v4.z.object({
733
+ id: import_v4.z.string().nullish(),
734
+ type: import_v4.z.literal("function"),
735
+ function: import_v4.z.object({
736
+ name: import_v4.z.string(),
737
+ arguments: import_v4.z.string()
737
738
  })
738
739
  })
739
740
  ).nullish()
740
741
  }),
741
- finish_reason: import_zod2.z.string().nullish()
742
+ finish_reason: import_v4.z.string().nullish()
742
743
  })
743
744
  ),
744
745
  usage: openaiCompatibleTokenUsageSchema
745
746
  });
746
- var createOpenAICompatibleChatChunkSchema = (errorSchema) => import_zod2.z.union([
747
- import_zod2.z.object({
748
- id: import_zod2.z.string().nullish(),
749
- created: import_zod2.z.number().nullish(),
750
- model: import_zod2.z.string().nullish(),
751
- choices: import_zod2.z.array(
752
- import_zod2.z.object({
753
- delta: import_zod2.z.object({
754
- role: import_zod2.z.enum(["assistant"]).nullish(),
755
- content: import_zod2.z.string().nullish(),
756
- reasoning_content: import_zod2.z.string().nullish(),
757
- tool_calls: import_zod2.z.array(
758
- import_zod2.z.object({
759
- index: import_zod2.z.number(),
760
- id: import_zod2.z.string().nullish(),
761
- type: import_zod2.z.literal("function").nullish(),
762
- function: import_zod2.z.object({
763
- name: import_zod2.z.string().nullish(),
764
- arguments: import_zod2.z.string().nullish()
747
+ var createOpenAICompatibleChatChunkSchema = (errorSchema) => import_v4.z.union([
748
+ import_v4.z.object({
749
+ id: import_v4.z.string().nullish(),
750
+ created: import_v4.z.number().nullish(),
751
+ model: import_v4.z.string().nullish(),
752
+ choices: import_v4.z.array(
753
+ import_v4.z.object({
754
+ delta: import_v4.z.object({
755
+ role: import_v4.z.enum(["assistant"]).nullish(),
756
+ content: import_v4.z.string().nullish(),
757
+ reasoning_content: import_v4.z.string().nullish(),
758
+ tool_calls: import_v4.z.array(
759
+ import_v4.z.object({
760
+ index: import_v4.z.number(),
761
+ id: import_v4.z.string().nullish(),
762
+ type: import_v4.z.literal("function").nullish(),
763
+ function: import_v4.z.object({
764
+ name: import_v4.z.string().nullish(),
765
+ arguments: import_v4.z.string().nullish()
765
766
  })
766
767
  })
767
768
  ).nullish()
768
769
  }).nullish(),
769
- finish_reason: import_zod2.z.string().nullish()
770
+ finish_reason: import_v4.z.string().nullish()
770
771
  })
771
772
  ),
772
773
  usage: openaiCompatibleTokenUsageSchema
773
774
  }),
774
- import_zod2.z.object({
775
- name: import_zod2.z.string(),
776
- status: import_zod2.z.enum(["ENDED", "STARTED", "ERRORED", "UPDATING"]),
777
- message: import_zod2.z.null(),
778
- parameters: import_zod2.z.array(
779
- import_zod2.z.object({
780
- name: import_zod2.z.string(),
781
- value: import_zod2.z.string()
775
+ import_v4.z.object({
776
+ name: import_v4.z.string(),
777
+ status: import_v4.z.enum(["ENDED", "STARTED", "ERRORED", "UPDATING"]),
778
+ message: import_v4.z.null(),
779
+ parameters: import_v4.z.array(
780
+ import_v4.z.object({
781
+ name: import_v4.z.string(),
782
+ value: import_v4.z.string()
782
783
  })
783
784
  ),
784
- result: import_zod2.z.string().nullable(),
785
- error: import_zod2.z.object({
786
- type: import_zod2.z.enum(["INVALID_PARAMETER", "UNKNOWN"]),
787
- msg: import_zod2.z.string()
785
+ result: import_v4.z.string().nullable(),
786
+ error: import_v4.z.object({
787
+ type: import_v4.z.enum(["INVALID_PARAMETER", "UNKNOWN"]),
788
+ msg: import_v4.z.string()
788
789
  }).nullable(),
789
- timestamp: import_zod2.z.number(),
790
- usage: import_zod2.z.null(),
791
- tool_call_id: import_zod2.z.string().nullable()
790
+ timestamp: import_v4.z.number(),
791
+ usage: import_v4.z.null(),
792
+ tool_call_id: import_v4.z.string().nullable()
792
793
  }),
793
794
  errorSchema
794
795
  ]);
795
- var friendliProviderOptionsSchema = import_zod2.z.object({
796
+ var friendliProviderOptionsSchema = import_v4.z.object({
796
797
  /**
797
798
  * Whether to enable parallel function calling during tool use. Default to true.
798
799
  */
799
- parallelToolCalls: import_zod2.z.boolean().nullish(),
800
+ parallelToolCalls: import_v4.z.boolean().nullish(),
800
801
  /**
801
802
  * BETA FEATURE: You can write a regular expression to force output that satisfies that regular expression.
802
803
  */
803
804
  // regex: z.instanceof(RegExp).nullish(),
804
- regex: import_zod2.z.string().nullish(),
805
- chat_template_kwargs: import_zod2.z.record(import_zod2.z.string(), import_zod2.z.any()).nullish(),
805
+ regex: import_v4.z.string().nullish(),
806
+ chat_template_kwargs: import_v4.z.record(import_v4.z.string(), import_v4.z.any()).nullish(),
806
807
  /**
807
808
  * A scaling factor used to determine the minimum token probability threshold.
808
809
  */
809
- minP: import_zod2.z.number().nullish(),
810
+ minP: import_v4.z.number().nullish(),
810
811
  /**
811
812
  * Penalizes tokens that have already appeared in the generated result.
812
813
  */
813
- repetitionPenalty: import_zod2.z.number().nullish(),
814
+ repetitionPenalty: import_v4.z.number().nullish(),
814
815
  /**
815
816
  * A probability threshold used to identify “top choice” tokens for exclusion in XTC sampling.
816
817
  */
817
- xtcThreshold: import_zod2.z.number().nullish(),
818
+ xtcThreshold: import_v4.z.number().nullish(),
818
819
  /**
819
820
  * The probability that XTC (Exclude Top Choices) filtering will be applied for each sampling decision.
820
821
  */
821
- xtcProbability: import_zod2.z.number().nullish()
822
+ xtcProbability: import_v4.z.number().nullish()
822
823
  });
823
824
 
824
825
  // src/friendli-settings.ts
@@ -850,9 +851,9 @@ var FriendliAIServerlessModelIds = [
850
851
 
851
852
  // src/friendli-tools.ts
852
853
  var import_provider_utils3 = require("@ai-sdk/provider-utils");
853
- var import_zod3 = require("zod");
854
- var inputSchema = import_zod3.z.object({}).loose();
855
- var outputSchema = import_zod3.z.unknown();
854
+ var import_zod2 = require("zod");
855
+ var inputSchema = import_zod2.z.object({}).loose();
856
+ var outputSchema = import_zod2.z.unknown();
856
857
  var webSearchTool = (0, import_provider_utils3.createProviderToolFactoryWithOutputSchema)({
857
858
  id: "friendli.web:search",
858
859
  inputSchema,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/friendli-provider.ts","../src/friendli-chat-language-model.ts","../src/friendli-error.ts","../src/friendli-prepare-tools.ts","../src/friendli-settings.ts","../src/friendli-tools.ts","../src/get-available-models.ts"],"sourcesContent":["export type { FriendliAIErrorData } from './friendli-error';\nexport type { FriendliAIProvider, FriendliAIProviderSettings } from './friendli-provider';\nexport { createFriendli, friendli } from './friendli-provider';\nexport type {\n FriendliAvailableModel,\n FriendliAvailableModelsResponse,\n} from './get-available-models';\n","import { OpenAICompatibleCompletionLanguageModel } from '@ai-sdk/openai-compatible';\nimport {\n EmbeddingModelV3,\n ImageModelV3,\n LanguageModelV3,\n NoSuchModelError,\n ProviderV3,\n SpeechModelV3,\n TranscriptionModelV3,\n} from '@ai-sdk/provider';\nimport { FetchFunction, loadApiKey, withoutTrailingSlash } from '@ai-sdk/provider-utils';\n\nimport { FriendliAIChatLanguageModel } from './friendli-chat-language-model';\nimport { friendliaiErrorStructure } from './friendli-error';\nimport {\n FriendliAILanguageModelId,\n FriendliAIServerlessModelId,\n FriendliAIServerlessModelIds,\n} from './friendli-settings';\nimport { friendliTools } from './friendli-tools';\nimport type { FriendliAvailableModelsResponse } from './get-available-models';\nimport { getAvailableModelsImpl } from './get-available-models';\n\nexport interface FriendliAIProviderSettings {\n /**\n * FriendliAI API key. (FRIENDLI_TOKEN)\n */\n apiKey?: string;\n /**\n * Base URL for the API calls.\n */\n baseURL?: string | 'auto' | 'dedicated' | 'serverless' | 'serverless-tools';\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string>;\n /**\n * FriendliAI Team ID.\n */\n teamId?: string;\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept requests,\n * or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n /**\n * Whether to include usage information in the response.\n */\n includeUsage?: boolean;\n}\n\nexport interface FriendliAIProvider extends ProviderV3 {\n /**\n * Creates a model for text generation.\n */\n (modelId: FriendliAILanguageModelId): LanguageModelV3;\n /**\n * Creates a chat model for text generation.\n */\n languageModel(modelId: FriendliAILanguageModelId): LanguageModelV3;\n /**\n * Creates a chat model for text generation.\n */\n chat(modelId: FriendliAILanguageModelId): LanguageModelV3;\n /**\n * Creates a completion model for text generation.\n */\n completion(modelId: FriendliAILanguageModelId): LanguageModelV3;\n /**\n * Creates an embedding model for text generation.\n * TODO: Implement for Dedicated users\n */\n embedding(modelId: string & {}): LanguageModelV3;\n embeddingModel(modelId: string & {}): LanguageModelV3;\n /**\n * Returns the available models and their metadata.\n */\n getAvailableModels(options?: { graphqlURL?: string }): Promise<FriendliAvailableModelsResponse>;\n embedding(modelId: string & {}): EmbeddingModelV3;\n embeddingModel(modelId: string & {}): EmbeddingModelV3;\n /**\n * Creates a model for image generation.\n * TODO: Implement for Dedicated users\n */\n imageModel(modelId: string & {}): ImageModelV3;\n\n /**\n * Creates a model for transcription.\n * TODO: Implement for Dedicated users\n */\n transcription(modelId: string & {}): TranscriptionModelV3;\n\n /**\n * Creates a model for speech generation.\n * TODO: Implement for Dedicated users\n */\n speech(modelId: string & {}): SpeechModelV3;\n\n /**\n * Friendli-specific tools.\n */\n tools: typeof friendliTools;\n}\n\n/**\nCreate an FriendliAI provider instance.\n */\nexport function createFriendli(options: FriendliAIProviderSettings = {}): FriendliAIProvider {\n const getHeaders = () => ({\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'FRIENDLI_TOKEN',\n description: 'FRIENDLI_TOKEN',\n })}`,\n 'X-Friendli-Team': options.teamId,\n ...options.headers,\n });\n\n const baseURLAutoSelect = (\n modelId: string,\n baseURL: string | 'dedicated' | 'serverless' | 'serverless-tools' | undefined\n ): {\n baseURL: string;\n type: 'dedicated' | 'serverless' | 'serverless-tools' | 'custom';\n } => {\n const FriendliBaseURL = {\n serverless: 'https://api.friendli.ai/serverless/v1',\n serverless_tools: 'https://api.friendli.ai/serverless/tools/v1',\n dedicated: 'https://api.friendli.ai/dedicated/v1',\n };\n\n // Ignore options if baseURL is specified\n const customBaseURL = withoutTrailingSlash(baseURL);\n if (\n typeof customBaseURL === 'string' &&\n customBaseURL !== 'dedicated' &&\n customBaseURL !== 'serverless' &&\n customBaseURL !== 'serverless-tools'\n ) {\n return { baseURL: customBaseURL, type: 'custom' };\n }\n\n switch (baseURL) {\n case 'dedicated':\n return {\n baseURL: FriendliBaseURL.dedicated,\n type: 'dedicated',\n };\n case 'serverless':\n return {\n baseURL: FriendliBaseURL.serverless,\n type: 'serverless',\n };\n case 'serverless-tools':\n return {\n baseURL: FriendliBaseURL.serverless_tools,\n type: 'serverless-tools',\n };\n default:\n if (FriendliAIServerlessModelIds.includes(modelId as FriendliAIServerlessModelId)) {\n return {\n baseURL: FriendliBaseURL.serverless,\n type: 'serverless',\n };\n } else {\n return {\n baseURL: FriendliBaseURL.dedicated,\n type: 'dedicated',\n };\n }\n }\n };\n\n const createLanguageModel = (modelId: FriendliAILanguageModelId) => {\n const { baseURL, type } = baseURLAutoSelect(modelId, options.baseURL);\n\n return new FriendliAIChatLanguageModel(modelId, {\n provider: `friendliai.${type}.chat`,\n url: ({ path }: { path: string }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n includeUsage: options.includeUsage,\n });\n };\n\n const createCompletionModel = (modelId: FriendliAILanguageModelId) => {\n const { baseURL, type } = baseURLAutoSelect(modelId, options.baseURL);\n\n return new OpenAICompatibleCompletionLanguageModel(modelId, {\n provider: `friendliai.${type}.completion`,\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n errorStructure: friendliaiErrorStructure,\n });\n };\n\n const createTextEmbeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'embeddingModel' });\n };\n const createImageModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'imageModel' });\n };\n const createTranscriptionModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'languageModel' });\n };\n const createSpeechModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'languageModel' });\n };\n\n const provider = (modelId: FriendliAILanguageModelId) => createLanguageModel(modelId);\n\n provider.languageModel = createLanguageModel;\n provider.chat = createLanguageModel;\n provider.completion = createCompletionModel;\n\n // TODO: Implement for Dedicated users\n provider.embedding = createTextEmbeddingModel;\n provider.embeddingModel = createTextEmbeddingModel;\n (provider as unknown as FriendliAIProvider).getAvailableModels = async (opts?: {\n graphqlURL?: string;\n }) => {\n const defaultURL = 'https://api-internal.friendli.ai/api/graphql';\n const graphqlURL = opts?.graphqlURL ?? defaultURL;\n const apiKey = options.apiKey;\n const teamId = options.teamId;\n const headers = options.headers;\n return getAvailableModelsImpl({ apiKey, teamId, headers, graphqlURL });\n };\n provider.imageModel = createImageModel;\n provider.transcription = createTranscriptionModel;\n provider.speech = createSpeechModel;\n\n provider.tools = friendliTools;\n\n // 'getAvailableModels' is declared here.\n return provider as unknown as FriendliAIProvider;\n}\n\n/**\n * Default FriendliAI provider instance.\n */\nexport const friendli = createFriendli();\n","import { MetadataExtractor, ProviderErrorStructure } from '@ai-sdk/openai-compatible';\nimport {\n convertToOpenAICompatibleChatMessages,\n getResponseMetadata,\n mapOpenAICompatibleFinishReason,\n} from '@ai-sdk/openai-compatible/internal';\nimport {\n APICallError,\n InvalidResponseDataError,\n LanguageModelV3,\n LanguageModelV3Content,\n LanguageModelV3FinishReason,\n LanguageModelV3StreamPart,\n SharedV3ProviderMetadata,\n SharedV3Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createEventSourceResponseHandler,\n createJsonResponseHandler,\n FetchFunction,\n generateId,\n isParsableJson,\n ParseResult,\n parseProviderOptions,\n postJsonToApi,\n ResponseHandler,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod';\n\nimport {\n friendliaiErrorSchema,\n friendliaiErrorStructure,\n friendliaiFailedResponseHandler,\n} from './friendli-error';\nimport { prepareTools } from './friendli-prepare-tools';\nimport { FriendliAILanguageModelId } from './friendli-settings';\n\nexport type OpenAICompatibleChatConfig = {\n provider: string;\n headers: () => Record<string, string | undefined>;\n url: (options: { modelId: string; path: string }) => string;\n fetch?: FetchFunction;\n includeUsage?: boolean;\n errorStructure?: ProviderErrorStructure<z.infer<typeof friendliaiErrorSchema>>;\n metadataExtractor?: MetadataExtractor;\n\n /**\n * Whether the model supports structured outputs.\n */\n supportsStructuredOutputs?: boolean;\n\n /**\n * The supported URLs for the model.\n */\n supportedUrls?: () => LanguageModelV3['supportedUrls'];\n};\n\ntype HostedToolExecutionChunk = {\n name: string;\n status: 'ENDED' | 'STARTED' | 'ERRORED' | 'UPDATING';\n message: null;\n parameters: Array<{ name: string; value: string }>;\n result: string | null;\n error: { type: 'INVALID_PARAMETER' | 'UNKNOWN'; msg: string } | null;\n timestamp: number;\n usage: null;\n tool_call_id: string | null;\n};\n\ntype OpenAIChatUsage = {\n prompt_tokens?: number | null;\n completion_tokens?: number | null;\n total_tokens?: number | null;\n prompt_tokens_details?: { cached_tokens?: number | null } | null;\n completion_tokens_details?: {\n reasoning_tokens?: number | null;\n accepted_prediction_tokens?: number | null;\n rejected_prediction_tokens?: number | null;\n } | null;\n};\n\ntype OpenAIChatToolCallDelta = {\n index: number;\n id?: string | null;\n type?: 'function' | null;\n function?: { name?: string | null; arguments?: string | null } | null;\n};\n\ntype OpenAIChatDelta = {\n role?: 'assistant' | null;\n content?: string | null;\n reasoning_content?: string | null;\n tool_calls?: OpenAIChatToolCallDelta[] | null;\n};\n\ntype OpenAIChatChoice = {\n delta?: OpenAIChatDelta | null;\n finish_reason?: string | null;\n};\n\ntype OpenAIChatChunk = {\n id?: string | null;\n created?: number | null;\n model?: string | null;\n choices: OpenAIChatChoice[];\n usage?: OpenAIChatUsage | null;\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value != null;\n}\n\nfunction isHostedToolExecutionChunk(value: unknown): value is HostedToolExecutionChunk {\n if (!isRecord(value)) return false;\n return (\n typeof value.status === 'string' &&\n typeof value.name === 'string' &&\n Array.isArray(value.parameters)\n );\n}\n\nfunction getChunkErrorMessage(value: unknown): string | undefined {\n if (!isRecord(value)) return undefined;\n\n if (typeof value.message === 'string') {\n return value.message;\n }\n\n const nestedError = value.error;\n if (isRecord(nestedError) && typeof nestedError.message === 'string') {\n return nestedError.message;\n }\n\n return undefined;\n}\n\nfunction isOpenAIChatChunk(value: unknown): value is OpenAIChatChunk {\n if (!isRecord(value)) return false;\n return Array.isArray(value.choices);\n}\n\nexport class FriendliAIChatLanguageModel implements LanguageModelV3 {\n readonly specificationVersion = 'v3';\n\n readonly supportsStructuredOutputs: boolean;\n\n readonly modelId: FriendliAILanguageModelId;\n // readonly settings: FriendliAIChatSettings\n\n private readonly config: OpenAICompatibleChatConfig;\n private readonly failedResponseHandler: ResponseHandler<APICallError>;\n private readonly chunkSchema; // type inferred via constructor\n\n constructor(modelId: FriendliAILanguageModelId, config: OpenAICompatibleChatConfig) {\n this.modelId = modelId;\n // this.settings = settings\n this.config = config;\n\n const errorStructure = friendliaiErrorStructure;\n this.chunkSchema = createOpenAICompatibleChatChunkSchema(errorStructure.errorSchema);\n\n this.failedResponseHandler = friendliaiFailedResponseHandler;\n\n this.supportsStructuredOutputs = config.supportsStructuredOutputs ?? true;\n }\n\n get provider(): string {\n return this.config.provider;\n }\n\n get supportedUrls() {\n return this.config.supportedUrls?.() ?? {};\n }\n private async getArgs({\n prompt,\n maxOutputTokens,\n temperature,\n topP,\n topK,\n frequencyPenalty,\n presencePenalty,\n providerOptions,\n stopSequences,\n responseFormat,\n seed,\n toolChoice,\n tools,\n stream,\n }: Parameters<LanguageModelV3['doGenerate']>[0] & {\n stream: boolean;\n }) {\n const warnings: SharedV3Warning[] = [];\n\n const friendliOptions = await parseProviderOptions({\n provider: 'friendliai',\n providerOptions,\n schema: friendliProviderOptionsSchema,\n });\n\n const legacyFriendliOptions = await parseProviderOptions({\n provider: 'friendli',\n providerOptions,\n schema: friendliProviderOptionsSchema,\n });\n\n const options = {\n ...legacyFriendliOptions,\n ...friendliOptions,\n };\n\n if (\n responseFormat?.type === 'json' &&\n responseFormat.schema != null &&\n !this.supportsStructuredOutputs\n ) {\n warnings.push({\n type: 'unsupported',\n feature: 'responseFormat',\n details: 'JSON response format schema is only supported with structuredOutputs',\n });\n }\n\n const {\n tools: openaiTools,\n toolChoice: openaiToolChoice,\n toolWarnings,\n } = prepareTools({\n tools,\n toolChoice,\n });\n\n const isToolsPresent = openaiTools != null && openaiTools.length > 0;\n\n if (isToolsPresent && (responseFormat != null || options?.regex != null)) {\n warnings.push({\n type: 'unsupported',\n feature: 'responseFormat',\n details: 'response_format is not supported when tools are present.',\n });\n }\n\n return {\n args: {\n // >>> hard-coded default options >>>\n parse_reasoning: true,\n // <<< hard-coded default options <<<\n\n model: this.modelId,\n\n // standardized settings:\n stream: stream,\n max_tokens: maxOutputTokens,\n temperature,\n top_p: topP,\n top_k: topK,\n frequency_penalty: frequencyPenalty,\n presence_penalty: presencePenalty,\n response_format:\n isToolsPresent === false\n ? responseFormat?.type === 'json'\n ? this.supportsStructuredOutputs === true && responseFormat.schema != null\n ? {\n type: 'json_schema',\n json_schema: {\n schema: responseFormat.schema,\n name: responseFormat.name ?? 'response',\n description: responseFormat.description,\n },\n }\n : { type: 'json_object' }\n : options?.regex != null\n ? {\n type: 'regex',\n schema: options.regex,\n }\n : undefined\n : undefined,\n\n stop: stopSequences,\n seed,\n\n min_p: options?.minP,\n repetition_penalty: options?.repetitionPenalty,\n xtc_threshold: options?.xtcThreshold,\n xtc_probability: options?.xtcProbability,\n\n ...(options?.chat_template_kwargs\n ? { chat_template_kwargs: options.chat_template_kwargs }\n : {}),\n\n // messages:\n messages: convertToOpenAICompatibleChatMessages(prompt),\n\n // tools:\n tools: openaiTools,\n tool_choice: openaiToolChoice,\n parallel_tool_calls: options?.parallelToolCalls,\n },\n warnings: [...warnings, ...toolWarnings],\n };\n }\n\n async doGenerate(\n options: Parameters<LanguageModelV3['doGenerate']>[0]\n ): Promise<Awaited<ReturnType<LanguageModelV3['doGenerate']>>> {\n const { args, warnings } = await this.getArgs({ ...options, stream: false });\n\n const body = JSON.stringify(args);\n\n const {\n responseHeaders,\n value: responseBody,\n rawValue: rawResponse,\n } = await postJsonToApi({\n url: this.config.url({\n path: '/chat/completions',\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers(), options.headers),\n body: args,\n failedResponseHandler: this.failedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(OpenAICompatibleChatResponseSchema),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const choice = responseBody.choices[0];\n const content: Array<LanguageModelV3Content> = [];\n\n // text content:\n const text = choice.message.content;\n if (text != null && text.length > 0) {\n content.push({ type: 'text', text });\n }\n\n // reasoning content:\n const reasoning = choice.message.reasoning_content;\n if (reasoning != null && reasoning.length > 0) {\n content.push({\n type: 'reasoning',\n text: reasoning,\n });\n }\n\n // tool calls:\n if (choice.message.tool_calls != null) {\n for (const toolCall of choice.message.tool_calls) {\n content.push({\n type: 'tool-call',\n toolCallId: toolCall.id ?? generateId(),\n toolName: toolCall.function.name,\n input: toolCall.function.arguments!,\n });\n }\n }\n\n return {\n content,\n finishReason: {\n unified: mapOpenAICompatibleFinishReason(choice.finish_reason),\n raw: choice.finish_reason ?? undefined,\n },\n usage: {\n inputTokens: {\n total: responseBody.usage?.prompt_tokens ?? undefined,\n noCache: undefined,\n cacheRead: responseBody.usage?.prompt_tokens_details?.cached_tokens ?? undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: responseBody.usage?.completion_tokens ?? undefined,\n text: undefined,\n reasoning: responseBody.usage?.completion_tokens_details?.reasoning_tokens ?? undefined,\n },\n },\n // providerMetadata,\n request: { body },\n response: {\n ...getResponseMetadata(responseBody),\n headers: responseHeaders,\n body: rawResponse,\n },\n warnings,\n };\n }\n\n async doStream(\n options: Parameters<LanguageModelV3['doStream']>[0]\n ): Promise<Awaited<ReturnType<LanguageModelV3['doStream']>>> {\n const { args, warnings } = await this.getArgs({ ...options, stream: true });\n\n const body = {\n ...args,\n stream: true,\n\n // only include stream_options when in strict compatibility mode:\n stream_options: this.config.includeUsage ? { include_usage: true } : undefined,\n };\n\n const metadataExtractor = this.config.metadataExtractor?.createStreamExtractor();\n\n const { responseHeaders, value: response } = await postJsonToApi({\n url: this.config.url({\n path: '/chat/completions',\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers(), options.headers),\n body,\n failedResponseHandler: this.failedResponseHandler,\n successfulResponseHandler: createEventSourceResponseHandler(this.chunkSchema),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const toolCalls: Array<{\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n hasFinished: boolean;\n }> = [];\n\n let finishReason: LanguageModelV3FinishReason['unified'] = 'other';\n let rawFinishReason: string | undefined;\n const usage: {\n completionTokens: number | undefined;\n completionTokensDetails: {\n reasoningTokens: number | undefined;\n acceptedPredictionTokens: number | undefined;\n rejectedPredictionTokens: number | undefined;\n };\n promptTokens: number | undefined;\n promptTokensDetails: {\n cachedTokens: number | undefined;\n };\n totalTokens: number | undefined;\n } = {\n completionTokens: undefined,\n completionTokensDetails: {\n reasoningTokens: undefined,\n acceptedPredictionTokens: undefined,\n rejectedPredictionTokens: undefined,\n },\n promptTokens: undefined,\n promptTokensDetails: {\n cachedTokens: undefined,\n },\n totalTokens: undefined,\n };\n let isFirstChunk = true;\n const providerOptionsName = 'friendliai';\n\n // Track IDs for part-finish events\n let currentTextId: string | null = null;\n let currentReasoningId: string | null = null;\n\n return {\n stream: response.pipeThrough(\n new TransformStream<\n ParseResult<z.infer<typeof this.chunkSchema>>,\n LanguageModelV3StreamPart\n >({\n start(controller) {\n controller.enqueue({ type: 'stream-start', warnings });\n },\n\n // NOTE: Chunk values can contain OpenAI-compatible deltas, hosted tool events, and error events.\n // We narrow with type guards for safe handling.\n transform(chunk, controller) {\n // handle failed chunk parsing / validation:\n if (!chunk.success) {\n finishReason = 'error';\n controller.enqueue({ type: 'error', error: chunk.error });\n return;\n }\n const value: unknown = chunk.value;\n\n metadataExtractor?.processChunk(chunk.rawValue);\n\n // hosted tool execution case\n if (isHostedToolExecutionChunk(value)) {\n const toolCallId = value.tool_call_id ?? generateId();\n switch (value.status) {\n case 'STARTED':\n controller.enqueue({\n type: 'tool-call',\n toolCallId,\n toolName: value.name,\n input: JSON.stringify(\n Object.fromEntries(value.parameters.map((p) => [p.name, p.value]))\n ),\n providerExecuted: true,\n });\n break;\n\n case 'UPDATING':\n // Optionally handle progress if needed, but LanguageModelV3StreamPart doesn't have a direct \"progress\" type for tools\n break;\n\n case 'ENDED':\n controller.enqueue({\n type: 'tool-result',\n toolCallId,\n toolName: value.name,\n result: value.result ?? '',\n });\n break;\n\n case 'ERRORED':\n finishReason = 'error';\n controller.enqueue({\n type: 'tool-result',\n toolCallId,\n toolName: value.name,\n result: value.error?.msg ?? 'Unknown error',\n isError: true,\n });\n break;\n\n default:\n finishReason = 'error';\n controller.enqueue({\n type: 'error',\n error: new Error(`Unsupported tool call status: ${value.status}`),\n });\n }\n return;\n }\n\n const chunkErrorMessage = getChunkErrorMessage(value);\n if (chunkErrorMessage != null) {\n finishReason = 'error';\n controller.enqueue({ type: 'error', error: chunkErrorMessage });\n return;\n }\n\n if (!isOpenAIChatChunk(value)) {\n finishReason = 'error';\n controller.enqueue({\n type: 'error',\n error: new Error('Unsupported chunk shape'),\n });\n return;\n }\n\n const chunkValue = value;\n\n if (isFirstChunk) {\n isFirstChunk = false;\n\n controller.enqueue({\n type: 'response-metadata',\n ...getResponseMetadata(chunkValue),\n });\n }\n\n if (chunkValue.usage != null) {\n const {\n prompt_tokens,\n completion_tokens,\n total_tokens,\n prompt_tokens_details,\n completion_tokens_details,\n } = chunkValue.usage;\n\n usage.promptTokens = prompt_tokens ?? undefined;\n usage.completionTokens = completion_tokens ?? undefined;\n usage.totalTokens = total_tokens ?? undefined;\n if (completion_tokens_details?.reasoning_tokens != null) {\n usage.completionTokensDetails.reasoningTokens =\n completion_tokens_details?.reasoning_tokens;\n }\n if (completion_tokens_details?.accepted_prediction_tokens != null) {\n usage.completionTokensDetails.acceptedPredictionTokens =\n completion_tokens_details?.accepted_prediction_tokens;\n }\n if (completion_tokens_details?.rejected_prediction_tokens != null) {\n usage.completionTokensDetails.rejectedPredictionTokens =\n completion_tokens_details?.rejected_prediction_tokens;\n }\n if (prompt_tokens_details?.cached_tokens != null) {\n usage.promptTokensDetails.cachedTokens = prompt_tokens_details?.cached_tokens;\n }\n }\n\n const choice = chunkValue.choices[0];\n\n if (choice?.finish_reason != null) {\n rawFinishReason = choice.finish_reason;\n finishReason = mapOpenAICompatibleFinishReason(choice.finish_reason);\n }\n\n if (choice?.delta == null) {\n return;\n }\n\n const delta = choice.delta;\n\n // enqueue reasoning before text deltas:\n if (delta.reasoning_content != null) {\n if (currentReasoningId == null) {\n currentReasoningId = generateId();\n // Enqueue reasoning-start event for the first reasoning delta\n controller.enqueue({\n type: 'reasoning-start',\n id: currentReasoningId,\n });\n }\n controller.enqueue({\n type: 'reasoning-delta',\n id: currentReasoningId,\n delta: delta.reasoning_content,\n });\n }\n\n if (delta.content != null) {\n if (currentTextId == null) {\n currentTextId = generateId();\n // Enqueue text-start event for the first text delta\n controller.enqueue({\n type: 'text-start',\n id: currentTextId,\n });\n }\n controller.enqueue({\n type: 'text-delta',\n id: currentTextId,\n delta: delta.content,\n });\n }\n\n if (delta.tool_calls != null) {\n for (const toolCallDelta of delta.tool_calls) {\n const index = toolCallDelta.index;\n // Tool call start. FriendliAI returns all information except the arguments in the first chunk.\n if (toolCalls[index] == null) {\n if (toolCallDelta.type !== 'function') {\n throw new InvalidResponseDataError({\n data: toolCallDelta,\n message: `Expected 'function' type.`,\n });\n }\n\n if (toolCallDelta.id == null) {\n throw new InvalidResponseDataError({\n data: toolCallDelta,\n message: `Expected 'id' to be a string.`,\n });\n }\n\n if (toolCallDelta.function?.name == null) {\n throw new InvalidResponseDataError({\n data: toolCallDelta,\n message: `Expected 'function.name' to be a string.`,\n });\n }\n\n toolCalls[index] = {\n id: toolCallDelta.id,\n type: 'function',\n function: {\n name: toolCallDelta.function.name,\n arguments: toolCallDelta.function.arguments ?? '',\n },\n hasFinished: false,\n };\n\n const toolCall = toolCalls[index];\n\n if (toolCall.function?.name != null && toolCall.function?.arguments != null) {\n // send delta if the argument text has already started:\n if (toolCall.function.arguments.length > 0) {\n controller.enqueue({\n type: 'tool-input-delta',\n id: toolCall.id,\n delta: toolCall.function.arguments,\n });\n }\n\n // check if tool call is complete\n // (some providers send the full tool call in one chunk):\n if (isParsableJson(toolCall.function.arguments)) {\n controller.enqueue({\n type: 'tool-call',\n toolCallId: toolCall.id ?? generateId(),\n toolName: toolCall.function.name,\n input: toolCall.function.arguments,\n });\n toolCall.hasFinished = true;\n }\n }\n\n continue;\n }\n\n // existing tool call, merge if not finished\n const toolCall = toolCalls[index];\n\n if (toolCall.hasFinished) {\n continue;\n }\n\n if (toolCallDelta.function?.arguments != null) {\n toolCall.function!.arguments += toolCallDelta.function?.arguments ?? '';\n }\n\n // send delta\n controller.enqueue({\n type: 'tool-input-delta',\n id: toolCall.id,\n delta: toolCallDelta.function?.arguments ?? '',\n });\n\n // check if tool call is complete\n if (\n toolCall.function?.name != null &&\n toolCall.function?.arguments != null &&\n isParsableJson(toolCall.function.arguments)\n ) {\n controller.enqueue({\n type: 'tool-call',\n toolCallId: toolCall.id ?? generateId(),\n toolName: toolCall.function.name,\n input: toolCall.function.arguments,\n });\n toolCall.hasFinished = true;\n }\n }\n }\n },\n\n flush(controller) {\n // Enqueue end events before finish event\n if (currentReasoningId != null) {\n controller.enqueue({\n type: 'reasoning-end',\n id: currentReasoningId,\n });\n }\n\n if (currentTextId != null) {\n controller.enqueue({\n type: 'text-end',\n id: currentTextId,\n });\n }\n\n const providerMetadata: SharedV3ProviderMetadata = {\n [providerOptionsName]: {},\n ...metadataExtractor?.buildMetadata(),\n };\n if (usage.completionTokensDetails.acceptedPredictionTokens != null) {\n providerMetadata[providerOptionsName].acceptedPredictionTokens =\n usage.completionTokensDetails.acceptedPredictionTokens;\n }\n if (usage.completionTokensDetails.rejectedPredictionTokens != null) {\n providerMetadata[providerOptionsName].rejectedPredictionTokens =\n usage.completionTokensDetails.rejectedPredictionTokens;\n }\n\n controller.enqueue({\n type: 'finish',\n finishReason: {\n unified: finishReason,\n raw: rawFinishReason,\n },\n usage: {\n inputTokens: {\n total: usage.promptTokens ?? undefined,\n noCache: undefined,\n cacheRead: usage.promptTokensDetails.cachedTokens ?? undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: usage.completionTokens ?? undefined,\n text: undefined,\n reasoning: usage.completionTokensDetails.reasoningTokens ?? undefined,\n },\n },\n providerMetadata,\n });\n },\n })\n ),\n request: { body },\n response: { headers: responseHeaders },\n };\n }\n}\n\nconst openaiCompatibleTokenUsageSchema = z\n .object({\n prompt_tokens: z.number().nullish(),\n completion_tokens: z.number().nullish(),\n total_tokens: z.number().nullish(),\n prompt_tokens_details: z\n .object({\n cached_tokens: z.number().nullish(),\n })\n .nullish(),\n completion_tokens_details: z\n .object({\n reasoning_tokens: z.number().nullish(),\n accepted_prediction_tokens: z.number().nullish(),\n rejected_prediction_tokens: z.number().nullish(),\n })\n .nullish(),\n })\n .nullish();\n\n// limited version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nconst OpenAICompatibleChatResponseSchema = z.object({\n id: z.string().nullish(),\n created: z.number().nullish(),\n model: z.string().nullish(),\n choices: z.array(\n z.object({\n message: z.object({\n role: z.literal('assistant').nullish(),\n content: z.string().nullish(),\n reasoning_content: z.string().nullish(),\n tool_calls: z\n .array(\n z.object({\n id: z.string().nullish(),\n type: z.literal('function'),\n function: z.object({\n name: z.string(),\n arguments: z.string(),\n }),\n })\n )\n .nullish(),\n }),\n finish_reason: z.string().nullish(),\n })\n ),\n usage: openaiCompatibleTokenUsageSchema,\n});\n\n// limited version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nconst createOpenAICompatibleChatChunkSchema = <ERROR_SCHEMA extends z.ZodType>(\n errorSchema: ERROR_SCHEMA\n) =>\n z.union([\n z.object({\n id: z.string().nullish(),\n created: z.number().nullish(),\n model: z.string().nullish(),\n choices: z.array(\n z.object({\n delta: z\n .object({\n role: z.enum(['assistant']).nullish(),\n content: z.string().nullish(),\n reasoning_content: z.string().nullish(),\n tool_calls: z\n .array(\n z.object({\n index: z.number(),\n id: z.string().nullish(),\n type: z.literal('function').nullish(),\n function: z.object({\n name: z.string().nullish(),\n arguments: z.string().nullish(),\n }),\n })\n )\n .nullish(),\n })\n .nullish(),\n finish_reason: z.string().nullish(),\n })\n ),\n usage: openaiCompatibleTokenUsageSchema,\n }),\n z.object({\n name: z.string(),\n status: z.enum(['ENDED', 'STARTED', 'ERRORED', 'UPDATING']),\n message: z.null(),\n parameters: z.array(\n z.object({\n name: z.string(),\n value: z.string(),\n })\n ),\n result: z.string().nullable(),\n error: z\n .object({\n type: z.enum(['INVALID_PARAMETER', 'UNKNOWN']),\n msg: z.string(),\n })\n .nullable(),\n timestamp: z.number(),\n usage: z.null(),\n tool_call_id: z.string().nullable(),\n }),\n errorSchema,\n ]);\n\nconst friendliProviderOptionsSchema = z.object({\n /**\n * Whether to enable parallel function calling during tool use. Default to true.\n */\n parallelToolCalls: z.boolean().nullish(),\n\n /**\n * BETA FEATURE: You can write a regular expression to force output that satisfies that regular expression.\n */\n // regex: z.instanceof(RegExp).nullish(),\n regex: z.string().nullish(),\n\n chat_template_kwargs: z.record(z.string(), z.any()).nullish(),\n\n /**\n * A scaling factor used to determine the minimum token probability threshold.\n */\n minP: z.number().nullish(),\n\n /**\n * Penalizes tokens that have already appeared in the generated result.\n */\n repetitionPenalty: z.number().nullish(),\n\n /**\n * A probability threshold used to identify “top choice” tokens for exclusion in XTC sampling.\n */\n xtcThreshold: z.number().nullish(),\n\n /**\n * The probability that XTC (Exclude Top Choices) filtering will be applied for each sampling decision.\n */\n xtcProbability: z.number().nullish(),\n});\n\nexport type FriendliProviderOptions = z.infer<typeof friendliProviderOptionsSchema>;\n","import { ProviderErrorStructure } from '@ai-sdk/openai-compatible';\nimport { APICallError } from '@ai-sdk/provider';\nimport { type ResponseHandler, safeParseJSON } from '@ai-sdk/provider-utils';\nimport { z } from 'zod';\n\nconst friendliErrorResponseSchema = z.object({\n message: z.string(),\n error: z.record(z.string(), z.any()).optional(),\n});\n\nconst openAIStyleErrorResponseSchema = z\n .object({\n error: z\n .object({\n message: z.string(),\n })\n .loose(),\n })\n .loose();\n\nexport const friendliaiErrorSchema = z.union([\n // OpenAI/OpenRouter style error: { \"error\": { \"message\": \"...\" } }\n openAIStyleErrorResponseSchema,\n // Friendli style error: { \"message\": \"...\", \"error\": { ... } }\n friendliErrorResponseSchema,\n]);\n\nexport type FriendliAIErrorData = z.infer<typeof friendliaiErrorSchema>;\n\nexport const friendliaiErrorStructure: ProviderErrorStructure<FriendliAIErrorData> = {\n errorSchema: friendliaiErrorSchema,\n errorToMessage: (data) => {\n if (\n typeof data === 'object' &&\n data != null &&\n 'error' in data &&\n typeof data.error === 'object' &&\n data.error != null &&\n 'message' in data.error &&\n typeof data.error.message === 'string'\n ) {\n return data.error.message;\n }\n\n if (\n typeof data === 'object' &&\n data != null &&\n 'message' in data &&\n typeof data.message === 'string'\n ) {\n return data.message;\n }\n\n return 'Unknown error';\n },\n};\n\nexport const friendliaiFailedResponseHandler: ResponseHandler<APICallError> = async ({\n response,\n url,\n requestBodyValues,\n}) => {\n const responseBody = await response.text();\n const responseHeaders: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n responseHeaders[key] = value;\n });\n\n const baseErrorOptions = {\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody,\n } as const;\n\n const trimmedBody = responseBody.trim();\n\n if (trimmedBody === '') {\n const fallback = response.statusText || `Request failed with status ${response.status}`;\n return {\n responseHeaders,\n value: new APICallError({\n message: fallback,\n ...baseErrorOptions,\n }),\n };\n }\n\n const parsedError = await safeParseJSON({\n text: responseBody,\n schema: friendliaiErrorSchema,\n });\n\n if (parsedError.success) {\n return {\n responseHeaders,\n value: new APICallError({\n message: friendliaiErrorStructure.errorToMessage(parsedError.value),\n data: parsedError.value,\n ...baseErrorOptions,\n }),\n };\n }\n\n const fallback =\n trimmedBody || response.statusText || `Request failed with status ${response.status}`;\n\n return {\n responseHeaders,\n value: new APICallError({\n message: fallback,\n cause: parsedError.error,\n ...baseErrorOptions,\n }),\n };\n};\n","import {\n LanguageModelV3CallOptions,\n SharedV3Warning,\n UnsupportedFunctionalityError,\n} from '@ai-sdk/provider';\n\nexport function prepareTools({\n tools,\n toolChoice,\n}: {\n tools: LanguageModelV3CallOptions['tools'];\n toolChoice?: LanguageModelV3CallOptions['toolChoice'];\n}): {\n tools:\n | undefined\n | Array<{\n type: string;\n files?: string[];\n }>\n | Array<{\n type: 'function';\n function: {\n name: string;\n description: string | undefined;\n parameters: unknown;\n };\n }>;\n toolChoice:\n | { type: 'function'; function: { name: string } }\n | 'auto'\n | 'none'\n | 'required'\n | undefined;\n toolWarnings: SharedV3Warning[];\n} {\n // when the tools array is empty, change it to undefined to prevent errors:\n tools = tools?.length ? tools : undefined;\n\n const toolWarnings: SharedV3Warning[] = [];\n\n if (tools == null) {\n return { tools: undefined, toolChoice: undefined, toolWarnings };\n }\n\n const openaiCompatTools: Array<\n | {\n type: 'function';\n function: {\n name: string;\n description: string | undefined;\n parameters: unknown;\n };\n }\n | {\n type: string;\n }\n > = [];\n\n for (const tool of tools) {\n if (tool.type === 'provider') {\n openaiCompatTools.push({\n // NOTE: Friendli tool-assisted API expects provider tool types like \"web:search\".\n // We derive it from the provider tool id (e.g. \"friendli.web:search\" -> \"web:search\")\n // instead of tool.name (often \"web_search\").\n type: tool.id.split('.')[1] ?? 'unknown',\n });\n } else {\n openaiCompatTools.push({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n },\n });\n }\n }\n\n if (toolChoice == null) {\n return { tools: openaiCompatTools, toolChoice: undefined, toolWarnings };\n }\n\n const type = toolChoice.type;\n\n switch (type) {\n case 'auto':\n case 'none':\n case 'required':\n return { tools: openaiCompatTools, toolChoice: type, toolWarnings };\n case 'tool':\n return {\n tools: openaiCompatTools,\n toolChoice: {\n type: 'function',\n function: { name: toolChoice.toolName },\n },\n toolWarnings,\n };\n default: {\n const _exhaustiveCheck: never = type;\n throw new UnsupportedFunctionalityError({\n functionality: `tool choice type: ${_exhaustiveCheck}`,\n });\n }\n }\n}\n","// https://friendli.ai/product/serverless-endpoints\n// Below is just a subset of the available models.\nexport const FriendliAIServerlessModelIds = [\n 'LGAI-EXAONE/K-EXAONE-236B-A23B',\n 'MiniMaxAI/MiniMax-M2',\n 'zai-org/GLM-4.6',\n 'LGAI-EXAONE/EXAONE-4.0.1-32B',\n 'skt/A.X-4.0',\n 'skt/A.X-3.1',\n 'naver-hyperclovax/HyperCLOVAX-SEED-Think-14B',\n 'deepseek-ai/DeepSeek-V3.1',\n 'deepseek-ai/DeepSeek-R1-0528',\n 'meta-llama/Llama-4-Maverick-17B-128E-Instruct',\n 'meta-llama/Llama-4-Scout-17B-16E-Instruct',\n 'meta-llama/Llama-3.3-70B-Instruct',\n 'meta-llama-3.3-70b-instruct',\n 'meta-llama/Llama-3.1-8B-Instruct',\n 'meta-llama-3.1-8b-instruct',\n 'Qwen/Qwen3-235B-A22B-Thinking-2507',\n 'Qwen/Qwen3-235B-A22B-Instruct-2507',\n 'Qwen/Qwen3-30B-A3B',\n 'Qwen/Qwen3-32B',\n 'google/gemma-3-27b-it',\n 'mistralai/Mistral-Small-3.1-24B-Instruct-2503',\n 'mistralai/Devstral-Small-2505',\n 'mistralai/Magistral-Small-2506',\n] as const;\n\nexport type FriendliAIServerlessModelId = (typeof FriendliAIServerlessModelIds)[number];\n\nexport type FriendliAILanguageModelId = FriendliAIServerlessModelId | (string & {});\n","import { createProviderToolFactoryWithOutputSchema, type Tool } from '@ai-sdk/provider-utils';\nimport { z } from 'zod';\n\n/**\n * Friendli built-in tools for serverless tool-assisted API.\n *\n * @remarks\n * These tools are currently in **Beta**. While we strive to provide a stable\n * and reliable experience, this feature is still under active development.\n *\n * @see https://friendli.ai/docs/guides/serverless_endpoints/tool-assisted-api\n */\n\nconst inputSchema = z.object({}).loose();\nconst outputSchema = z.unknown();\n\nexport const webSearchTool = createProviderToolFactoryWithOutputSchema({\n id: 'friendli.web:search',\n inputSchema,\n outputSchema,\n});\n\nexport const webUrlTool = createProviderToolFactoryWithOutputSchema({\n id: 'friendli.web:url',\n inputSchema,\n outputSchema,\n});\n\nexport const mathCalendarTool = createProviderToolFactoryWithOutputSchema({\n id: 'friendli.math:calendar',\n inputSchema,\n outputSchema,\n});\n\nexport const mathStatisticsTool = createProviderToolFactoryWithOutputSchema({\n id: 'friendli.math:statistics',\n inputSchema,\n outputSchema,\n});\n\nexport const mathCalculatorTool = createProviderToolFactoryWithOutputSchema({\n id: 'friendli.math:calculator',\n inputSchema,\n outputSchema,\n});\n\nexport const codePythonInterpreterTool = createProviderToolFactoryWithOutputSchema({\n id: 'friendli.code:python-interpreter',\n inputSchema,\n outputSchema,\n});\n\nexport const linkupSearchTool = createProviderToolFactoryWithOutputSchema({\n id: 'friendli.linkup:search',\n inputSchema,\n outputSchema,\n});\n\n/**\n * Web search tool - searches the web for information.\n * @beta\n */\nfunction webSearch(): Tool {\n return webSearchTool({});\n}\n\n/**\n * Web URL tool - fetches content from a specific URL.\n * @beta\n */\nfunction webUrl(): Tool {\n return webUrlTool({});\n}\n\n/**\n * Math calendar tool - performs calendar-related calculations.\n * @beta\n */\nfunction mathCalendar(): Tool {\n return mathCalendarTool({});\n}\n\n/**\n * Math statistics tool - performs statistical calculations.\n * @beta\n */\nfunction mathStatistics(): Tool {\n return mathStatisticsTool({});\n}\n\n/**\n * Math calculator tool - performs arithmetic calculations.\n * @beta\n */\nfunction mathCalculator(): Tool {\n return mathCalculatorTool({});\n}\n\n/**\n * Python interpreter tool - executes Python code.\n * @beta\n */\nfunction codePythonInterpreter(): Tool {\n return codePythonInterpreterTool({});\n}\n\n/**\n * Linkup search tool - searches the web for real-time information with citations.\n * @see https://www.linkup.so\n */\nfunction linkupSearch(): Tool {\n return linkupSearchTool({});\n}\n\nexport const friendliTools = {\n webSearch,\n webUrl,\n mathCalendar,\n mathStatistics,\n mathCalculator,\n codePythonInterpreter,\n linkupSearch,\n};\n","import { loadApiKey } from '@ai-sdk/provider-utils';\n\ntype Pricing = {\n inputToken?: number;\n outputToken?: number;\n responseTime?: number;\n unitType?: 'TOKEN' | 'SECOND';\n currency?: string;\n unit?: string;\n};\n\nexport type FriendliAvailableModel = {\n id: string;\n name?: string | null;\n description?: string | null;\n pricing?: Pricing;\n warm?: boolean;\n cold?: boolean;\n contextLength?: number | null;\n};\n\nexport type FriendliAvailableModelsResponse = {\n models: FriendliAvailableModel[];\n};\n\ntype GraphQLResponse<T> = {\n data?: T;\n errors?: Array<{ message: string }>;\n};\n\nconst DEFAULT_GRAPHQL_URL = 'https://api-internal.friendli.ai/api/graphql';\n\nasync function postGraphQL<T>(\n url: string,\n body: {\n query: string;\n variables?: Record<string, unknown>;\n operationName?: string;\n },\n headers: Record<string, string>\n): Promise<GraphQLResponse<T>> {\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n body: JSON.stringify(body),\n });\n\n let json: GraphQLResponse<T>;\n try {\n json = await res.json();\n } catch (err) {\n console.error(\n 'Failed to parse JSON response from Friendli API:',\n err,\n 'Status:',\n res.status,\n res.statusText\n );\n throw new Error(\n `Failed to parse JSON response from Friendli API: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n return json;\n}\n\ntype ServerlessEndpointEdge = {\n id: string;\n name?: string | null;\n status?: 'WARM' | 'COLD' | string | null;\n price?: {\n inputPrice?: number | null;\n outputPrice?: number | null;\n unit?: string | null;\n responseTimePrice?: number | null;\n priceUnitType?: 'TOKEN' | 'SECOND' | null;\n } | null;\n contextLength?: number | null;\n};\n\ntype ServerlessEndpointsQuery = {\n serverlessEndpoints?: {\n edges?: ServerlessEndpointEdge[];\n } | null;\n};\n\nfunction normalizePriceUnit(unit?: string | null): string | undefined {\n if (!unit) return undefined;\n return unit;\n}\n\nexport async function getAvailableModelsImpl(options: {\n apiKey?: string;\n teamId?: string;\n headers?: Record<string, string>;\n graphqlURL?: string;\n}): Promise<FriendliAvailableModelsResponse> {\n let token: string | undefined;\n try {\n token =\n options.apiKey ??\n loadApiKey({\n apiKey: undefined,\n environmentVariableName: 'FRIENDLI_TOKEN',\n description: 'FRIENDLI_TOKEN',\n });\n } catch {\n token = undefined;\n }\n\n const headers: Record<string, string> = {\n ...(token ? { Authorization: `Bearer ${token}` } : {}),\n ...(options.teamId ? { 'X-Friendli-Team': options.teamId } : {}),\n ...(options.headers ?? {}),\n };\n\n const url = options.graphqlURL ?? DEFAULT_GRAPHQL_URL;\n\n const query = `\n query Edges {\n serverlessEndpoints {\n edges {\n ... on ServerlessChatEndpointCatalog {\n id\n name\n status\n price {\n inputPrice\n outputPrice\n unit\n responseTimePrice\n priceUnitType\n }\n contextLength\n }\n }\n }\n }\n `;\n\n const resp = await postGraphQL<ServerlessEndpointsQuery>(\n url,\n { query, variables: {}, operationName: 'Edges' },\n headers\n );\n\n if (resp.errors && resp.errors.length > 0) {\n throw new Error(\n `getAvailableModels: GraphQL error: ${resp.errors.map((e) => e.message).join('; ')}`\n );\n }\n\n const edges = resp.data?.serverlessEndpoints?.edges ?? [];\n\n const models: FriendliAvailableModel[] = edges.map((e) => {\n const warm = e.status === 'WARM';\n const pricing: Pricing | undefined = e.price\n ? {\n inputToken: e.price.inputPrice ?? undefined,\n outputToken: e.price.outputPrice ?? undefined,\n responseTime: e.price.responseTimePrice ?? undefined,\n unitType: (e.price.priceUnitType ?? undefined) as 'TOKEN' | 'SECOND' | undefined,\n unit: normalizePriceUnit(e.price.unit),\n currency: 'USD',\n }\n : undefined;\n\n return {\n id: e.id,\n name: e.name ?? undefined,\n description: undefined,\n pricing,\n warm,\n cold: warm === false,\n contextLength: e.contextLength ?? undefined,\n };\n });\n\n return { models };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,+BAAwD;AACxD,IAAAA,mBAQO;AACP,IAAAC,yBAAgE;;;ACThE,sBAIO;AACP,IAAAC,mBASO;AACP,IAAAC,yBAWO;AACP,IAAAC,cAAkB;;;AC3BlB,sBAA6B;AAC7B,4BAAoD;AACpD,iBAAkB;AAElB,IAAM,8BAA8B,aAAE,OAAO;AAAA,EAC3C,SAAS,aAAE,OAAO;AAAA,EAClB,OAAO,aAAE,OAAO,aAAE,OAAO,GAAG,aAAE,IAAI,CAAC,EAAE,SAAS;AAChD,CAAC;AAED,IAAM,iCAAiC,aACpC,OAAO;AAAA,EACN,OAAO,aACJ,OAAO;AAAA,IACN,SAAS,aAAE,OAAO;AAAA,EACpB,CAAC,EACA,MAAM;AACX,CAAC,EACA,MAAM;AAEF,IAAM,wBAAwB,aAAE,MAAM;AAAA;AAAA,EAE3C;AAAA;AAAA,EAEA;AACF,CAAC;AAIM,IAAM,2BAAwE;AAAA,EACnF,aAAa;AAAA,EACb,gBAAgB,CAAC,SAAS;AACxB,QACE,OAAO,SAAS,YAChB,QAAQ,QACR,WAAW,QACX,OAAO,KAAK,UAAU,YACtB,KAAK,SAAS,QACd,aAAa,KAAK,SAClB,OAAO,KAAK,MAAM,YAAY,UAC9B;AACA,aAAO,KAAK,MAAM;AAAA,IACpB;AAEA,QACE,OAAO,SAAS,YAChB,QAAQ,QACR,aAAa,QACb,OAAO,KAAK,YAAY,UACxB;AACA,aAAO,KAAK;AAAA,IACd;AAEA,WAAO;AAAA,EACT;AACF;AAEO,IAAM,kCAAiE,OAAO;AAAA,EACnF;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,eAAe,MAAM,SAAS,KAAK;AACzC,QAAM,kBAA0C,CAAC;AACjD,WAAS,QAAQ,QAAQ,CAAC,OAAO,QAAQ;AACvC,oBAAgB,GAAG,IAAI;AAAA,EACzB,CAAC;AAED,QAAM,mBAAmB;AAAA,IACvB;AAAA,IACA;AAAA,IACA,YAAY,SAAS;AAAA,IACrB;AAAA,IACA;AAAA,EACF;AAEA,QAAM,cAAc,aAAa,KAAK;AAEtC,MAAI,gBAAgB,IAAI;AACtB,UAAMC,YAAW,SAAS,cAAc,8BAA8B,SAAS,MAAM;AACrF,WAAO;AAAA,MACL;AAAA,MACA,OAAO,IAAI,6BAAa;AAAA,QACtB,SAASA;AAAA,QACT,GAAG;AAAA,MACL,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,cAAc,UAAM,qCAAc;AAAA,IACtC,MAAM;AAAA,IACN,QAAQ;AAAA,EACV,CAAC;AAED,MAAI,YAAY,SAAS;AACvB,WAAO;AAAA,MACL;AAAA,MACA,OAAO,IAAI,6BAAa;AAAA,QACtB,SAAS,yBAAyB,eAAe,YAAY,KAAK;AAAA,QAClE,MAAM,YAAY;AAAA,QAClB,GAAG;AAAA,MACL,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,WACJ,eAAe,SAAS,cAAc,8BAA8B,SAAS,MAAM;AAErF,SAAO;AAAA,IACL;AAAA,IACA,OAAO,IAAI,6BAAa;AAAA,MACtB,SAAS;AAAA,MACT,OAAO,YAAY;AAAA,MACnB,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AACF;;;ACpHA,IAAAC,mBAIO;AAEA,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AACF,GAyBE;AAlCF;AAoCE,WAAQ,+BAAO,UAAS,QAAQ;AAEhC,QAAM,eAAkC,CAAC;AAEzC,MAAI,SAAS,MAAM;AACjB,WAAO,EAAE,OAAO,QAAW,YAAY,QAAW,aAAa;AAAA,EACjE;AAEA,QAAM,oBAYF,CAAC;AAEL,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,SAAS,YAAY;AAC5B,wBAAkB,KAAK;AAAA;AAAA;AAAA;AAAA,QAIrB,OAAM,UAAK,GAAG,MAAM,GAAG,EAAE,CAAC,MAApB,YAAyB;AAAA,MACjC,CAAC;AAAA,IACH,OAAO;AACL,wBAAkB,KAAK;AAAA,QACrB,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM,KAAK;AAAA,UACX,aAAa,KAAK;AAAA,UAClB,YAAY,KAAK;AAAA,QACnB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,cAAc,MAAM;AACtB,WAAO,EAAE,OAAO,mBAAmB,YAAY,QAAW,aAAa;AAAA,EACzE;AAEA,QAAM,OAAO,WAAW;AAExB,UAAQ,MAAM;AAAA,IACZ,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,EAAE,OAAO,mBAAmB,YAAY,MAAM,aAAa;AAAA,IACpE,KAAK;AACH,aAAO;AAAA,QACL,OAAO;AAAA,QACP,YAAY;AAAA,UACV,MAAM;AAAA,UACN,UAAU,EAAE,MAAM,WAAW,SAAS;AAAA,QACxC;AAAA,QACA;AAAA,MACF;AAAA,IACF,SAAS;AACP,YAAM,mBAA0B;AAChC,YAAM,IAAI,+CAA8B;AAAA,QACtC,eAAe,qBAAqB,gBAAgB;AAAA,MACtD,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;AFIA,SAAS,SAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,SAAS;AAC/C;AAEA,SAAS,2BAA2B,OAAmD;AACrF,MAAI,CAAC,SAAS,KAAK,EAAG,QAAO;AAC7B,SACE,OAAO,MAAM,WAAW,YACxB,OAAO,MAAM,SAAS,YACtB,MAAM,QAAQ,MAAM,UAAU;AAElC;AAEA,SAAS,qBAAqB,OAAoC;AAChE,MAAI,CAAC,SAAS,KAAK,EAAG,QAAO;AAE7B,MAAI,OAAO,MAAM,YAAY,UAAU;AACrC,WAAO,MAAM;AAAA,EACf;AAEA,QAAM,cAAc,MAAM;AAC1B,MAAI,SAAS,WAAW,KAAK,OAAO,YAAY,YAAY,UAAU;AACpE,WAAO,YAAY;AAAA,EACrB;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,OAA0C;AACnE,MAAI,CAAC,SAAS,KAAK,EAAG,QAAO;AAC7B,SAAO,MAAM,QAAQ,MAAM,OAAO;AACpC;AAEO,IAAM,8BAAN,MAA6D;AAAA;AAAA,EAYlE,YAAY,SAAoC,QAAoC;AAXpF,SAAS,uBAAuB;AA/IlC;AA2JI,SAAK,UAAU;AAEf,SAAK,SAAS;AAEd,UAAM,iBAAiB;AACvB,SAAK,cAAc,sCAAsC,eAAe,WAAW;AAEnF,SAAK,wBAAwB;AAE7B,SAAK,6BAA4B,YAAO,8BAAP,YAAoC;AAAA,EACvE;AAAA,EAEA,IAAI,WAAmB;AACrB,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,IAAI,gBAAgB;AA3KtB;AA4KI,YAAO,sBAAK,QAAO,kBAAZ,4CAAiC,CAAC;AAAA,EAC3C;AAAA,EACA,MAAc,QAAQ;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAEG;AA/LL;AAgMI,UAAM,WAA8B,CAAC;AAErC,UAAM,kBAAkB,UAAM,6CAAqB;AAAA,MACjD,UAAU;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,IACV,CAAC;AAED,UAAM,wBAAwB,UAAM,6CAAqB;AAAA,MACvD,UAAU;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,IACV,CAAC;AAED,UAAM,UAAU;AAAA,MACd,GAAG;AAAA,MACH,GAAG;AAAA,IACL;AAEA,SACE,iDAAgB,UAAS,UACzB,eAAe,UAAU,QACzB,CAAC,KAAK,2BACN;AACA,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,UAAM;AAAA,MACJ,OAAO;AAAA,MACP,YAAY;AAAA,MACZ;AAAA,IACF,IAAI,aAAa;AAAA,MACf;AAAA,MACA;AAAA,IACF,CAAC;AAED,UAAM,iBAAiB,eAAe,QAAQ,YAAY,SAAS;AAEnE,QAAI,mBAAmB,kBAAkB,SAAQ,mCAAS,UAAS,OAAO;AACxE,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,MACL,MAAM;AAAA;AAAA,QAEJ,iBAAiB;AAAA;AAAA,QAGjB,OAAO,KAAK;AAAA;AAAA,QAGZ;AAAA,QACA,YAAY;AAAA,QACZ;AAAA,QACA,OAAO;AAAA,QACP,OAAO;AAAA,QACP,mBAAmB;AAAA,QACnB,kBAAkB;AAAA,QAClB,iBACE,mBAAmB,SACf,iDAAgB,UAAS,SACvB,KAAK,8BAA8B,QAAQ,eAAe,UAAU,OAClE;AAAA,UACE,MAAM;AAAA,UACN,aAAa;AAAA,YACX,QAAQ,eAAe;AAAA,YACvB,OAAM,oBAAe,SAAf,YAAuB;AAAA,YAC7B,aAAa,eAAe;AAAA,UAC9B;AAAA,QACF,IACA,EAAE,MAAM,cAAc,KACxB,mCAAS,UAAS,OAChB;AAAA,UACE,MAAM;AAAA,UACN,QAAQ,QAAQ;AAAA,QAClB,IACA,SACJ;AAAA,QAEN,MAAM;AAAA,QACN;AAAA,QAEA,OAAO,mCAAS;AAAA,QAChB,oBAAoB,mCAAS;AAAA,QAC7B,eAAe,mCAAS;AAAA,QACxB,iBAAiB,mCAAS;AAAA,QAE1B,IAAI,mCAAS,wBACT,EAAE,sBAAsB,QAAQ,qBAAqB,IACrD,CAAC;AAAA;AAAA,QAGL,cAAU,uDAAsC,MAAM;AAAA;AAAA,QAGtD,OAAO;AAAA,QACP,aAAa;AAAA,QACb,qBAAqB,mCAAS;AAAA,MAChC;AAAA,MACA,UAAU,CAAC,GAAG,UAAU,GAAG,YAAY;AAAA,IACzC;AAAA,EACF;AAAA,EAEA,MAAM,WACJ,SAC6D;AAjTjE;AAkTI,UAAM,EAAE,MAAM,SAAS,IAAI,MAAM,KAAK,QAAQ,EAAE,GAAG,SAAS,QAAQ,MAAM,CAAC;AAE3E,UAAM,OAAO,KAAK,UAAU,IAAI;AAEhC,UAAM;AAAA,MACJ;AAAA,MACA,OAAO;AAAA,MACP,UAAU;AAAA,IACZ,IAAI,UAAM,sCAAc;AAAA,MACtB,KAAK,KAAK,OAAO,IAAI;AAAA,QACnB,MAAM;AAAA,QACN,SAAS,KAAK;AAAA,MAChB,CAAC;AAAA,MACD,aAAS,uCAAe,KAAK,OAAO,QAAQ,GAAG,QAAQ,OAAO;AAAA,MAC9D,MAAM;AAAA,MACN,uBAAuB,KAAK;AAAA,MAC5B,+BAA2B,kDAA0B,kCAAkC;AAAA,MACvF,aAAa,QAAQ;AAAA,MACrB,OAAO,KAAK,OAAO;AAAA,IACrB,CAAC;AAED,UAAM,SAAS,aAAa,QAAQ,CAAC;AACrC,UAAM,UAAyC,CAAC;AAGhD,UAAM,OAAO,OAAO,QAAQ;AAC5B,QAAI,QAAQ,QAAQ,KAAK,SAAS,GAAG;AACnC,cAAQ,KAAK,EAAE,MAAM,QAAQ,KAAK,CAAC;AAAA,IACrC;AAGA,UAAM,YAAY,OAAO,QAAQ;AACjC,QAAI,aAAa,QAAQ,UAAU,SAAS,GAAG;AAC7C,cAAQ,KAAK;AAAA,QACX,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAGA,QAAI,OAAO,QAAQ,cAAc,MAAM;AACrC,iBAAW,YAAY,OAAO,QAAQ,YAAY;AAChD,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,aAAY,cAAS,OAAT,gBAAe,mCAAW;AAAA,UACtC,UAAU,SAAS,SAAS;AAAA,UAC5B,OAAO,SAAS,SAAS;AAAA,QAC3B,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA,cAAc;AAAA,QACZ,aAAS,iDAAgC,OAAO,aAAa;AAAA,QAC7D,MAAK,YAAO,kBAAP,YAAwB;AAAA,MAC/B;AAAA,MACA,OAAO;AAAA,QACL,aAAa;AAAA,UACX,QAAO,wBAAa,UAAb,mBAAoB,kBAApB,YAAqC;AAAA,UAC5C,SAAS;AAAA,UACT,YAAW,8BAAa,UAAb,mBAAoB,0BAApB,mBAA2C,kBAA3C,YAA4D;AAAA,UACvE,YAAY;AAAA,QACd;AAAA,QACA,cAAc;AAAA,UACZ,QAAO,wBAAa,UAAb,mBAAoB,sBAApB,YAAyC;AAAA,UAChD,MAAM;AAAA,UACN,YAAW,8BAAa,UAAb,mBAAoB,8BAApB,mBAA+C,qBAA/C,YAAmE;AAAA,QAChF;AAAA,MACF;AAAA;AAAA,MAEA,SAAS,EAAE,KAAK;AAAA,MAChB,UAAU;AAAA,QACR,OAAG,qCAAoB,YAAY;AAAA,QACnC,SAAS;AAAA,QACT,MAAM;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,SACJ,SAC2D;AArY/D;AAsYI,UAAM,EAAE,MAAM,SAAS,IAAI,MAAM,KAAK,QAAQ,EAAE,GAAG,SAAS,QAAQ,KAAK,CAAC;AAE1E,UAAM,OAAO;AAAA,MACX,GAAG;AAAA,MACH,QAAQ;AAAA;AAAA,MAGR,gBAAgB,KAAK,OAAO,eAAe,EAAE,eAAe,KAAK,IAAI;AAAA,IACvE;AAEA,UAAM,qBAAoB,UAAK,OAAO,sBAAZ,mBAA+B;AAEzD,UAAM,EAAE,iBAAiB,OAAO,SAAS,IAAI,UAAM,sCAAc;AAAA,MAC/D,KAAK,KAAK,OAAO,IAAI;AAAA,QACnB,MAAM;AAAA,QACN,SAAS,KAAK;AAAA,MAChB,CAAC;AAAA,MACD,aAAS,uCAAe,KAAK,OAAO,QAAQ,GAAG,QAAQ,OAAO;AAAA,MAC9D;AAAA,MACA,uBAAuB,KAAK;AAAA,MAC5B,+BAA2B,yDAAiC,KAAK,WAAW;AAAA,MAC5E,aAAa,QAAQ;AAAA,MACrB,OAAO,KAAK,OAAO;AAAA,IACrB,CAAC;AAED,UAAM,YAQD,CAAC;AAEN,QAAI,eAAuD;AAC3D,QAAI;AACJ,UAAM,QAYF;AAAA,MACF,kBAAkB;AAAA,MAClB,yBAAyB;AAAA,QACvB,iBAAiB;AAAA,QACjB,0BAA0B;AAAA,QAC1B,0BAA0B;AAAA,MAC5B;AAAA,MACA,cAAc;AAAA,MACd,qBAAqB;AAAA,QACnB,cAAc;AAAA,MAChB;AAAA,MACA,aAAa;AAAA,IACf;AACA,QAAI,eAAe;AACnB,UAAM,sBAAsB;AAG5B,QAAI,gBAA+B;AACnC,QAAI,qBAAoC;AAExC,WAAO;AAAA,MACL,QAAQ,SAAS;AAAA,QACf,IAAI,gBAGF;AAAA,UACA,MAAM,YAAY;AAChB,uBAAW,QAAQ,EAAE,MAAM,gBAAgB,SAAS,CAAC;AAAA,UACvD;AAAA;AAAA;AAAA,UAIA,UAAU,OAAO,YAAY;AAvdvC,gBAAAC,KAAA;AAydY,gBAAI,CAAC,MAAM,SAAS;AAClB,6BAAe;AACf,yBAAW,QAAQ,EAAE,MAAM,SAAS,OAAO,MAAM,MAAM,CAAC;AACxD;AAAA,YACF;AACA,kBAAM,QAAiB,MAAM;AAE7B,mEAAmB,aAAa,MAAM;AAGtC,gBAAI,2BAA2B,KAAK,GAAG;AACrC,oBAAM,cAAaA,MAAA,MAAM,iBAAN,OAAAA,UAAsB,mCAAW;AACpD,sBAAQ,MAAM,QAAQ;AAAA,gBACpB,KAAK;AACH,6BAAW,QAAQ;AAAA,oBACjB,MAAM;AAAA,oBACN;AAAA,oBACA,UAAU,MAAM;AAAA,oBAChB,OAAO,KAAK;AAAA,sBACV,OAAO,YAAY,MAAM,WAAW,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AAAA,oBACnE;AAAA,oBACA,kBAAkB;AAAA,kBACpB,CAAC;AACD;AAAA,gBAEF,KAAK;AAEH;AAAA,gBAEF,KAAK;AACH,6BAAW,QAAQ;AAAA,oBACjB,MAAM;AAAA,oBACN;AAAA,oBACA,UAAU,MAAM;AAAA,oBAChB,SAAQ,WAAM,WAAN,YAAgB;AAAA,kBAC1B,CAAC;AACD;AAAA,gBAEF,KAAK;AACH,iCAAe;AACf,6BAAW,QAAQ;AAAA,oBACjB,MAAM;AAAA,oBACN;AAAA,oBACA,UAAU,MAAM;AAAA,oBAChB,SAAQ,iBAAM,UAAN,mBAAa,QAAb,YAAoB;AAAA,oBAC5B,SAAS;AAAA,kBACX,CAAC;AACD;AAAA,gBAEF;AACE,iCAAe;AACf,6BAAW,QAAQ;AAAA,oBACjB,MAAM;AAAA,oBACN,OAAO,IAAI,MAAM,iCAAiC,MAAM,MAAM,EAAE;AAAA,kBAClE,CAAC;AAAA,cACL;AACA;AAAA,YACF;AAEA,kBAAM,oBAAoB,qBAAqB,KAAK;AACpD,gBAAI,qBAAqB,MAAM;AAC7B,6BAAe;AACf,yBAAW,QAAQ,EAAE,MAAM,SAAS,OAAO,kBAAkB,CAAC;AAC9D;AAAA,YACF;AAEA,gBAAI,CAAC,kBAAkB,KAAK,GAAG;AAC7B,6BAAe;AACf,yBAAW,QAAQ;AAAA,gBACjB,MAAM;AAAA,gBACN,OAAO,IAAI,MAAM,yBAAyB;AAAA,cAC5C,CAAC;AACD;AAAA,YACF;AAEA,kBAAM,aAAa;AAEnB,gBAAI,cAAc;AAChB,6BAAe;AAEf,yBAAW,QAAQ;AAAA,gBACjB,MAAM;AAAA,gBACN,OAAG,qCAAoB,UAAU;AAAA,cACnC,CAAC;AAAA,YACH;AAEA,gBAAI,WAAW,SAAS,MAAM;AAC5B,oBAAM;AAAA,gBACJ;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cACF,IAAI,WAAW;AAEf,oBAAM,eAAe,wCAAiB;AACtC,oBAAM,mBAAmB,gDAAqB;AAC9C,oBAAM,cAAc,sCAAgB;AACpC,mBAAI,uEAA2B,qBAAoB,MAAM;AACvD,sBAAM,wBAAwB,kBAC5B,uEAA2B;AAAA,cAC/B;AACA,mBAAI,uEAA2B,+BAA8B,MAAM;AACjE,sBAAM,wBAAwB,2BAC5B,uEAA2B;AAAA,cAC/B;AACA,mBAAI,uEAA2B,+BAA8B,MAAM;AACjE,sBAAM,wBAAwB,2BAC5B,uEAA2B;AAAA,cAC/B;AACA,mBAAI,+DAAuB,kBAAiB,MAAM;AAChD,sBAAM,oBAAoB,eAAe,+DAAuB;AAAA,cAClE;AAAA,YACF;AAEA,kBAAM,SAAS,WAAW,QAAQ,CAAC;AAEnC,iBAAI,iCAAQ,kBAAiB,MAAM;AACjC,gCAAkB,OAAO;AACzB,iCAAe,iDAAgC,OAAO,aAAa;AAAA,YACrE;AAEA,iBAAI,iCAAQ,UAAS,MAAM;AACzB;AAAA,YACF;AAEA,kBAAM,QAAQ,OAAO;AAGrB,gBAAI,MAAM,qBAAqB,MAAM;AACnC,kBAAI,sBAAsB,MAAM;AAC9B,yCAAqB,mCAAW;AAEhC,2BAAW,QAAQ;AAAA,kBACjB,MAAM;AAAA,kBACN,IAAI;AAAA,gBACN,CAAC;AAAA,cACH;AACA,yBAAW,QAAQ;AAAA,gBACjB,MAAM;AAAA,gBACN,IAAI;AAAA,gBACJ,OAAO,MAAM;AAAA,cACf,CAAC;AAAA,YACH;AAEA,gBAAI,MAAM,WAAW,MAAM;AACzB,kBAAI,iBAAiB,MAAM;AACzB,oCAAgB,mCAAW;AAE3B,2BAAW,QAAQ;AAAA,kBACjB,MAAM;AAAA,kBACN,IAAI;AAAA,gBACN,CAAC;AAAA,cACH;AACA,yBAAW,QAAQ;AAAA,gBACjB,MAAM;AAAA,gBACN,IAAI;AAAA,gBACJ,OAAO,MAAM;AAAA,cACf,CAAC;AAAA,YACH;AAEA,gBAAI,MAAM,cAAc,MAAM;AAC5B,yBAAW,iBAAiB,MAAM,YAAY;AAC5C,sBAAM,QAAQ,cAAc;AAE5B,oBAAI,UAAU,KAAK,KAAK,MAAM;AAC5B,sBAAI,cAAc,SAAS,YAAY;AACrC,0BAAM,IAAI,0CAAyB;AAAA,sBACjC,MAAM;AAAA,sBACN,SAAS;AAAA,oBACX,CAAC;AAAA,kBACH;AAEA,sBAAI,cAAc,MAAM,MAAM;AAC5B,0BAAM,IAAI,0CAAyB;AAAA,sBACjC,MAAM;AAAA,sBACN,SAAS;AAAA,oBACX,CAAC;AAAA,kBACH;AAEA,wBAAI,mBAAc,aAAd,mBAAwB,SAAQ,MAAM;AACxC,0BAAM,IAAI,0CAAyB;AAAA,sBACjC,MAAM;AAAA,sBACN,SAAS;AAAA,oBACX,CAAC;AAAA,kBACH;AAEA,4BAAU,KAAK,IAAI;AAAA,oBACjB,IAAI,cAAc;AAAA,oBAClB,MAAM;AAAA,oBACN,UAAU;AAAA,sBACR,MAAM,cAAc,SAAS;AAAA,sBAC7B,YAAW,mBAAc,SAAS,cAAvB,YAAoC;AAAA,oBACjD;AAAA,oBACA,aAAa;AAAA,kBACf;AAEA,wBAAMC,YAAW,UAAU,KAAK;AAEhC,wBAAI,KAAAA,UAAS,aAAT,mBAAmB,SAAQ,UAAQ,KAAAA,UAAS,aAAT,mBAAmB,cAAa,MAAM;AAE3E,wBAAIA,UAAS,SAAS,UAAU,SAAS,GAAG;AAC1C,iCAAW,QAAQ;AAAA,wBACjB,MAAM;AAAA,wBACN,IAAIA,UAAS;AAAA,wBACb,OAAOA,UAAS,SAAS;AAAA,sBAC3B,CAAC;AAAA,oBACH;AAIA,4BAAI,uCAAeA,UAAS,SAAS,SAAS,GAAG;AAC/C,iCAAW,QAAQ;AAAA,wBACjB,MAAM;AAAA,wBACN,aAAY,KAAAA,UAAS,OAAT,gBAAe,mCAAW;AAAA,wBACtC,UAAUA,UAAS,SAAS;AAAA,wBAC5B,OAAOA,UAAS,SAAS;AAAA,sBAC3B,CAAC;AACD,sBAAAA,UAAS,cAAc;AAAA,oBACzB;AAAA,kBACF;AAEA;AAAA,gBACF;AAGA,sBAAM,WAAW,UAAU,KAAK;AAEhC,oBAAI,SAAS,aAAa;AACxB;AAAA,gBACF;AAEA,sBAAI,mBAAc,aAAd,mBAAwB,cAAa,MAAM;AAC7C,2BAAS,SAAU,cAAa,yBAAc,aAAd,mBAAwB,cAAxB,YAAqC;AAAA,gBACvE;AAGA,2BAAW,QAAQ;AAAA,kBACjB,MAAM;AAAA,kBACN,IAAI,SAAS;AAAA,kBACb,QAAO,yBAAc,aAAd,mBAAwB,cAAxB,YAAqC;AAAA,gBAC9C,CAAC;AAGD,sBACE,cAAS,aAAT,mBAAmB,SAAQ,UAC3B,cAAS,aAAT,mBAAmB,cAAa,YAChC,uCAAe,SAAS,SAAS,SAAS,GAC1C;AACA,6BAAW,QAAQ;AAAA,oBACjB,MAAM;AAAA,oBACN,aAAY,cAAS,OAAT,gBAAe,mCAAW;AAAA,oBACtC,UAAU,SAAS,SAAS;AAAA,oBAC5B,OAAO,SAAS,SAAS;AAAA,kBAC3B,CAAC;AACD,2BAAS,cAAc;AAAA,gBACzB;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,UAEA,MAAM,YAAY;AA9tB5B,gBAAAD,KAAA;AAguBY,gBAAI,sBAAsB,MAAM;AAC9B,yBAAW,QAAQ;AAAA,gBACjB,MAAM;AAAA,gBACN,IAAI;AAAA,cACN,CAAC;AAAA,YACH;AAEA,gBAAI,iBAAiB,MAAM;AACzB,yBAAW,QAAQ;AAAA,gBACjB,MAAM;AAAA,gBACN,IAAI;AAAA,cACN,CAAC;AAAA,YACH;AAEA,kBAAM,mBAA6C;AAAA,cACjD,CAAC,mBAAmB,GAAG,CAAC;AAAA,cACxB,GAAG,uDAAmB;AAAA,YACxB;AACA,gBAAI,MAAM,wBAAwB,4BAA4B,MAAM;AAClE,+BAAiB,mBAAmB,EAAE,2BACpC,MAAM,wBAAwB;AAAA,YAClC;AACA,gBAAI,MAAM,wBAAwB,4BAA4B,MAAM;AAClE,+BAAiB,mBAAmB,EAAE,2BACpC,MAAM,wBAAwB;AAAA,YAClC;AAEA,uBAAW,QAAQ;AAAA,cACjB,MAAM;AAAA,cACN,cAAc;AAAA,gBACZ,SAAS;AAAA,gBACT,KAAK;AAAA,cACP;AAAA,cACA,OAAO;AAAA,gBACL,aAAa;AAAA,kBACX,QAAOA,MAAA,MAAM,iBAAN,OAAAA,MAAsB;AAAA,kBAC7B,SAAS;AAAA,kBACT,YAAW,WAAM,oBAAoB,iBAA1B,YAA0C;AAAA,kBACrD,YAAY;AAAA,gBACd;AAAA,gBACA,cAAc;AAAA,kBACZ,QAAO,WAAM,qBAAN,YAA0B;AAAA,kBACjC,MAAM;AAAA,kBACN,YAAW,WAAM,wBAAwB,oBAA9B,YAAiD;AAAA,gBAC9D;AAAA,cACF;AAAA,cACA;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA,SAAS,EAAE,KAAK;AAAA,MAChB,UAAU,EAAE,SAAS,gBAAgB;AAAA,IACvC;AAAA,EACF;AACF;AAEA,IAAM,mCAAmC,cACtC,OAAO;AAAA,EACN,eAAe,cAAE,OAAO,EAAE,QAAQ;AAAA,EAClC,mBAAmB,cAAE,OAAO,EAAE,QAAQ;AAAA,EACtC,cAAc,cAAE,OAAO,EAAE,QAAQ;AAAA,EACjC,uBAAuB,cACpB,OAAO;AAAA,IACN,eAAe,cAAE,OAAO,EAAE,QAAQ;AAAA,EACpC,CAAC,EACA,QAAQ;AAAA,EACX,2BAA2B,cACxB,OAAO;AAAA,IACN,kBAAkB,cAAE,OAAO,EAAE,QAAQ;AAAA,IACrC,4BAA4B,cAAE,OAAO,EAAE,QAAQ;AAAA,IAC/C,4BAA4B,cAAE,OAAO,EAAE,QAAQ;AAAA,EACjD,CAAC,EACA,QAAQ;AACb,CAAC,EACA,QAAQ;AAIX,IAAM,qCAAqC,cAAE,OAAO;AAAA,EAClD,IAAI,cAAE,OAAO,EAAE,QAAQ;AAAA,EACvB,SAAS,cAAE,OAAO,EAAE,QAAQ;AAAA,EAC5B,OAAO,cAAE,OAAO,EAAE,QAAQ;AAAA,EAC1B,SAAS,cAAE;AAAA,IACT,cAAE,OAAO;AAAA,MACP,SAAS,cAAE,OAAO;AAAA,QAChB,MAAM,cAAE,QAAQ,WAAW,EAAE,QAAQ;AAAA,QACrC,SAAS,cAAE,OAAO,EAAE,QAAQ;AAAA,QAC5B,mBAAmB,cAAE,OAAO,EAAE,QAAQ;AAAA,QACtC,YAAY,cACT;AAAA,UACC,cAAE,OAAO;AAAA,YACP,IAAI,cAAE,OAAO,EAAE,QAAQ;AAAA,YACvB,MAAM,cAAE,QAAQ,UAAU;AAAA,YAC1B,UAAU,cAAE,OAAO;AAAA,cACjB,MAAM,cAAE,OAAO;AAAA,cACf,WAAW,cAAE,OAAO;AAAA,YACtB,CAAC;AAAA,UACH,CAAC;AAAA,QACH,EACC,QAAQ;AAAA,MACb,CAAC;AAAA,MACD,eAAe,cAAE,OAAO,EAAE,QAAQ;AAAA,IACpC,CAAC;AAAA,EACH;AAAA,EACA,OAAO;AACT,CAAC;AAID,IAAM,wCAAwC,CAC5C,gBAEA,cAAE,MAAM;AAAA,EACN,cAAE,OAAO;AAAA,IACP,IAAI,cAAE,OAAO,EAAE,QAAQ;AAAA,IACvB,SAAS,cAAE,OAAO,EAAE,QAAQ;AAAA,IAC5B,OAAO,cAAE,OAAO,EAAE,QAAQ;AAAA,IAC1B,SAAS,cAAE;AAAA,MACT,cAAE,OAAO;AAAA,QACP,OAAO,cACJ,OAAO;AAAA,UACN,MAAM,cAAE,KAAK,CAAC,WAAW,CAAC,EAAE,QAAQ;AAAA,UACpC,SAAS,cAAE,OAAO,EAAE,QAAQ;AAAA,UAC5B,mBAAmB,cAAE,OAAO,EAAE,QAAQ;AAAA,UACtC,YAAY,cACT;AAAA,YACC,cAAE,OAAO;AAAA,cACP,OAAO,cAAE,OAAO;AAAA,cAChB,IAAI,cAAE,OAAO,EAAE,QAAQ;AAAA,cACvB,MAAM,cAAE,QAAQ,UAAU,EAAE,QAAQ;AAAA,cACpC,UAAU,cAAE,OAAO;AAAA,gBACjB,MAAM,cAAE,OAAO,EAAE,QAAQ;AAAA,gBACzB,WAAW,cAAE,OAAO,EAAE,QAAQ;AAAA,cAChC,CAAC;AAAA,YACH,CAAC;AAAA,UACH,EACC,QAAQ;AAAA,QACb,CAAC,EACA,QAAQ;AAAA,QACX,eAAe,cAAE,OAAO,EAAE,QAAQ;AAAA,MACpC,CAAC;AAAA,IACH;AAAA,IACA,OAAO;AAAA,EACT,CAAC;AAAA,EACD,cAAE,OAAO;AAAA,IACP,MAAM,cAAE,OAAO;AAAA,IACf,QAAQ,cAAE,KAAK,CAAC,SAAS,WAAW,WAAW,UAAU,CAAC;AAAA,IAC1D,SAAS,cAAE,KAAK;AAAA,IAChB,YAAY,cAAE;AAAA,MACZ,cAAE,OAAO;AAAA,QACP,MAAM,cAAE,OAAO;AAAA,QACf,OAAO,cAAE,OAAO;AAAA,MAClB,CAAC;AAAA,IACH;AAAA,IACA,QAAQ,cAAE,OAAO,EAAE,SAAS;AAAA,IAC5B,OAAO,cACJ,OAAO;AAAA,MACN,MAAM,cAAE,KAAK,CAAC,qBAAqB,SAAS,CAAC;AAAA,MAC7C,KAAK,cAAE,OAAO;AAAA,IAChB,CAAC,EACA,SAAS;AAAA,IACZ,WAAW,cAAE,OAAO;AAAA,IACpB,OAAO,cAAE,KAAK;AAAA,IACd,cAAc,cAAE,OAAO,EAAE,SAAS;AAAA,EACpC,CAAC;AAAA,EACD;AACF,CAAC;AAEH,IAAM,gCAAgC,cAAE,OAAO;AAAA;AAAA;AAAA;AAAA,EAI7C,mBAAmB,cAAE,QAAQ,EAAE,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMvC,OAAO,cAAE,OAAO,EAAE,QAAQ;AAAA,EAE1B,sBAAsB,cAAE,OAAO,cAAE,OAAO,GAAG,cAAE,IAAI,CAAC,EAAE,QAAQ;AAAA;AAAA;AAAA;AAAA,EAK5D,MAAM,cAAE,OAAO,EAAE,QAAQ;AAAA;AAAA;AAAA;AAAA,EAKzB,mBAAmB,cAAE,OAAO,EAAE,QAAQ;AAAA;AAAA;AAAA;AAAA,EAKtC,cAAc,cAAE,OAAO,EAAE,QAAQ;AAAA;AAAA;AAAA;AAAA,EAKjC,gBAAgB,cAAE,OAAO,EAAE,QAAQ;AACrC,CAAC;;;AGx6BM,IAAM,+BAA+B;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;AC1BA,IAAAE,yBAAqE;AACrE,IAAAC,cAAkB;AAYlB,IAAM,cAAc,cAAE,OAAO,CAAC,CAAC,EAAE,MAAM;AACvC,IAAM,eAAe,cAAE,QAAQ;AAExB,IAAM,oBAAgB,kEAA0C;AAAA,EACrE,IAAI;AAAA,EACJ;AAAA,EACA;AACF,CAAC;AAEM,IAAM,iBAAa,kEAA0C;AAAA,EAClE,IAAI;AAAA,EACJ;AAAA,EACA;AACF,CAAC;AAEM,IAAM,uBAAmB,kEAA0C;AAAA,EACxE,IAAI;AAAA,EACJ;AAAA,EACA;AACF,CAAC;AAEM,IAAM,yBAAqB,kEAA0C;AAAA,EAC1E,IAAI;AAAA,EACJ;AAAA,EACA;AACF,CAAC;AAEM,IAAM,yBAAqB,kEAA0C;AAAA,EAC1E,IAAI;AAAA,EACJ;AAAA,EACA;AACF,CAAC;AAEM,IAAM,gCAA4B,kEAA0C;AAAA,EACjF,IAAI;AAAA,EACJ;AAAA,EACA;AACF,CAAC;AAEM,IAAM,uBAAmB,kEAA0C;AAAA,EACxE,IAAI;AAAA,EACJ;AAAA,EACA;AACF,CAAC;AAMD,SAAS,YAAkB;AACzB,SAAO,cAAc,CAAC,CAAC;AACzB;AAMA,SAAS,SAAe;AACtB,SAAO,WAAW,CAAC,CAAC;AACtB;AAMA,SAAS,eAAqB;AAC5B,SAAO,iBAAiB,CAAC,CAAC;AAC5B;AAMA,SAAS,iBAAuB;AAC9B,SAAO,mBAAmB,CAAC,CAAC;AAC9B;AAMA,SAAS,iBAAuB;AAC9B,SAAO,mBAAmB,CAAC,CAAC;AAC9B;AAMA,SAAS,wBAA8B;AACrC,SAAO,0BAA0B,CAAC,CAAC;AACrC;AAMA,SAAS,eAAqB;AAC5B,SAAO,iBAAiB,CAAC,CAAC;AAC5B;AAEO,IAAM,gBAAgB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;AC1HA,IAAAC,yBAA2B;AA8B3B,IAAM,sBAAsB;AAE5B,eAAe,YACb,KACA,MAKA,SAC6B;AAC7B,QAAM,MAAM,MAAM,MAAM,KAAK;AAAA,IAC3B,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,GAAG;AAAA,IACL;AAAA,IACA,MAAM,KAAK,UAAU,IAAI;AAAA,EAC3B,CAAC;AAED,MAAI;AACJ,MAAI;AACF,WAAO,MAAM,IAAI,KAAK;AAAA,EACxB,SAAS,KAAK;AACZ,YAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA,IAAI;AAAA,MACJ,IAAI;AAAA,IACN;AACA,UAAM,IAAI;AAAA,MACR,oDAAoD,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IACtG;AAAA,EACF;AACA,SAAO;AACT;AAsBA,SAAS,mBAAmB,MAA0C;AACpE,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO;AACT;AAEA,eAAsB,uBAAuB,SAKA;AAlG7C;AAmGE,MAAI;AACJ,MAAI;AACF,aACE,aAAQ,WAAR,gBACA,mCAAW;AAAA,MACT,QAAQ;AAAA,MACR,yBAAyB;AAAA,MACzB,aAAa;AAAA,IACf,CAAC;AAAA,EACL,SAAQ;AACN,YAAQ;AAAA,EACV;AAEA,QAAM,UAAkC;AAAA,IACtC,GAAI,QAAQ,EAAE,eAAe,UAAU,KAAK,GAAG,IAAI,CAAC;AAAA,IACpD,GAAI,QAAQ,SAAS,EAAE,mBAAmB,QAAQ,OAAO,IAAI,CAAC;AAAA,IAC9D,IAAI,aAAQ,YAAR,YAAmB,CAAC;AAAA,EAC1B;AAEA,QAAM,OAAM,aAAQ,eAAR,YAAsB;AAElC,QAAM,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsBd,QAAM,OAAO,MAAM;AAAA,IACjB;AAAA,IACA,EAAE,OAAO,WAAW,CAAC,GAAG,eAAe,QAAQ;AAAA,IAC/C;AAAA,EACF;AAEA,MAAI,KAAK,UAAU,KAAK,OAAO,SAAS,GAAG;AACzC,UAAM,IAAI;AAAA,MACR,sCAAsC,KAAK,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,IACpF;AAAA,EACF;AAEA,QAAM,SAAQ,sBAAK,SAAL,mBAAW,wBAAX,mBAAgC,UAAhC,YAAyC,CAAC;AAExD,QAAM,SAAmC,MAAM,IAAI,CAAC,MAAM;AA5J5D,QAAAC,KAAAC,KAAAC,KAAAC,KAAAC,KAAAC;AA6JI,UAAM,OAAO,EAAE,WAAW;AAC1B,UAAM,UAA+B,EAAE,QACnC;AAAA,MACE,aAAYL,MAAA,EAAE,MAAM,eAAR,OAAAA,MAAsB;AAAA,MAClC,cAAaC,MAAA,EAAE,MAAM,gBAAR,OAAAA,MAAuB;AAAA,MACpC,eAAcC,MAAA,EAAE,MAAM,sBAAR,OAAAA,MAA6B;AAAA,MAC3C,WAAWC,MAAA,EAAE,MAAM,kBAAR,OAAAA,MAAyB;AAAA,MACpC,MAAM,mBAAmB,EAAE,MAAM,IAAI;AAAA,MACrC,UAAU;AAAA,IACZ,IACA;AAEJ,WAAO;AAAA,MACL,IAAI,EAAE;AAAA,MACN,OAAMC,MAAA,EAAE,SAAF,OAAAA,MAAU;AAAA,MAChB,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA,MAAM,SAAS;AAAA,MACf,gBAAeC,MAAA,EAAE,kBAAF,OAAAA,MAAmB;AAAA,IACpC;AAAA,EACF,CAAC;AAED,SAAO,EAAE,OAAO;AAClB;;;AN1EO,SAAS,eAAe,UAAsC,CAAC,GAAuB;AAC3F,QAAM,aAAa,OAAO;AAAA,IACxB,eAAe,cAAU,mCAAW;AAAA,MAClC,QAAQ,QAAQ;AAAA,MAChB,yBAAyB;AAAA,MACzB,aAAa;AAAA,IACf,CAAC,CAAC;AAAA,IACF,mBAAmB,QAAQ;AAAA,IAC3B,GAAG,QAAQ;AAAA,EACb;AAEA,QAAM,oBAAoB,CACxB,SACA,YAIG;AACH,UAAM,kBAAkB;AAAA,MACtB,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,WAAW;AAAA,IACb;AAGA,UAAM,oBAAgB,6CAAqB,OAAO;AAClD,QACE,OAAO,kBAAkB,YACzB,kBAAkB,eAClB,kBAAkB,gBAClB,kBAAkB,oBAClB;AACA,aAAO,EAAE,SAAS,eAAe,MAAM,SAAS;AAAA,IAClD;AAEA,YAAQ,SAAS;AAAA,MACf,KAAK;AACH,eAAO;AAAA,UACL,SAAS,gBAAgB;AAAA,UACzB,MAAM;AAAA,QACR;AAAA,MACF,KAAK;AACH,eAAO;AAAA,UACL,SAAS,gBAAgB;AAAA,UACzB,MAAM;AAAA,QACR;AAAA,MACF,KAAK;AACH,eAAO;AAAA,UACL,SAAS,gBAAgB;AAAA,UACzB,MAAM;AAAA,QACR;AAAA,MACF;AACE,YAAI,6BAA6B,SAAS,OAAsC,GAAG;AACjF,iBAAO;AAAA,YACL,SAAS,gBAAgB;AAAA,YACzB,MAAM;AAAA,UACR;AAAA,QACF,OAAO;AACL,iBAAO;AAAA,YACL,SAAS,gBAAgB;AAAA,YACzB,MAAM;AAAA,UACR;AAAA,QACF;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,sBAAsB,CAAC,YAAuC;AAClE,UAAM,EAAE,SAAS,KAAK,IAAI,kBAAkB,SAAS,QAAQ,OAAO;AAEpE,WAAO,IAAI,4BAA4B,SAAS;AAAA,MAC9C,UAAU,cAAc,IAAI;AAAA,MAC5B,KAAK,CAAC,EAAE,KAAK,MAAwB,GAAG,OAAO,GAAG,IAAI;AAAA,MACtD,SAAS;AAAA,MACT,OAAO,QAAQ;AAAA,MACf,cAAc,QAAQ;AAAA,IACxB,CAAC;AAAA,EACH;AAEA,QAAM,wBAAwB,CAAC,YAAuC;AACpE,UAAM,EAAE,SAAS,KAAK,IAAI,kBAAkB,SAAS,QAAQ,OAAO;AAEpE,WAAO,IAAI,iEAAwC,SAAS;AAAA,MAC1D,UAAU,cAAc,IAAI;AAAA,MAC5B,KAAK,CAAC,EAAE,KAAK,MAAM,GAAG,OAAO,GAAG,IAAI;AAAA,MACpC,SAAS;AAAA,MACT,OAAO,QAAQ;AAAA,MACf,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AAEA,QAAM,2BAA2B,CAAC,YAAoB;AACpD,UAAM,IAAI,kCAAiB,EAAE,SAAS,WAAW,iBAAiB,CAAC;AAAA,EACrE;AACA,QAAM,mBAAmB,CAAC,YAAoB;AAC5C,UAAM,IAAI,kCAAiB,EAAE,SAAS,WAAW,aAAa,CAAC;AAAA,EACjE;AACA,QAAM,2BAA2B,CAAC,YAAoB;AACpD,UAAM,IAAI,kCAAiB,EAAE,SAAS,WAAW,gBAAgB,CAAC;AAAA,EACpE;AACA,QAAM,oBAAoB,CAAC,YAAoB;AAC7C,UAAM,IAAI,kCAAiB,EAAE,SAAS,WAAW,gBAAgB,CAAC;AAAA,EACpE;AAEA,QAAM,WAAW,CAAC,YAAuC,oBAAoB,OAAO;AAEpF,WAAS,gBAAgB;AACzB,WAAS,OAAO;AAChB,WAAS,aAAa;AAGtB,WAAS,YAAY;AACrB,WAAS,iBAAiB;AAC1B,EAAC,SAA2C,qBAAqB,OAAO,SAElE;AA7NR;AA8NI,UAAM,aAAa;AACnB,UAAM,cAAa,kCAAM,eAAN,YAAoB;AACvC,UAAM,SAAS,QAAQ;AACvB,UAAM,SAAS,QAAQ;AACvB,UAAM,UAAU,QAAQ;AACxB,WAAO,uBAAuB,EAAE,QAAQ,QAAQ,SAAS,WAAW,CAAC;AAAA,EACvE;AACA,WAAS,aAAa;AACtB,WAAS,gBAAgB;AACzB,WAAS,SAAS;AAElB,WAAS,QAAQ;AAGjB,SAAO;AACT;AAKO,IAAM,WAAW,eAAe;","names":["import_provider","import_provider_utils","import_provider","import_provider_utils","import_zod","fallback","import_provider","_a","toolCall","import_provider_utils","import_zod","import_provider_utils","_a","_b","_c","_d","_e","_f"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/friendli-provider.ts","../src/friendli-chat-language-model.ts","../src/friendli-error.ts","../src/friendli-prepare-tools.ts","../src/friendli-settings.ts","../src/friendli-tools.ts","../src/get-available-models.ts"],"sourcesContent":["export type { FriendliAIErrorData } from './friendli-error';\nexport type { FriendliAIProvider, FriendliAIProviderSettings } from './friendli-provider';\nexport { createFriendli, friendli } from './friendli-provider';\nexport type {\n FriendliAvailableModel,\n FriendliAvailableModelsResponse,\n} from './get-available-models';\n","import { OpenAICompatibleCompletionLanguageModel } from '@ai-sdk/openai-compatible';\nimport {\n EmbeddingModelV3,\n ImageModelV3,\n LanguageModelV3,\n NoSuchModelError,\n ProviderV3,\n SpeechModelV3,\n TranscriptionModelV3,\n} from '@ai-sdk/provider';\nimport { FetchFunction, loadApiKey, withoutTrailingSlash } from '@ai-sdk/provider-utils';\n\nimport { FriendliAIChatLanguageModel } from './friendli-chat-language-model';\nimport { friendliaiErrorStructure } from './friendli-error';\nimport {\n FriendliAILanguageModelId,\n FriendliAIServerlessModelId,\n FriendliAIServerlessModelIds,\n} from './friendli-settings';\nimport { friendliTools } from './friendli-tools';\nimport type { FriendliAvailableModelsResponse } from './get-available-models';\nimport { getAvailableModelsImpl } from './get-available-models';\n\nexport interface FriendliAIProviderSettings {\n /**\n * FriendliAI API key. (FRIENDLI_TOKEN)\n */\n apiKey?: string;\n /**\n * Base URL for the API calls.\n */\n baseURL?: string | 'auto' | 'dedicated' | 'serverless' | 'serverless-tools';\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string>;\n /**\n * FriendliAI Team ID.\n */\n teamId?: string;\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept requests,\n * or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n /**\n * Whether to include usage information in the response.\n */\n includeUsage?: boolean;\n}\n\nexport interface FriendliAIProvider extends ProviderV3 {\n /**\n * Creates a model for text generation.\n */\n (modelId: FriendliAILanguageModelId): LanguageModelV3;\n /**\n * Creates a chat model for text generation.\n */\n languageModel(modelId: FriendliAILanguageModelId): LanguageModelV3;\n /**\n * Creates a chat model for text generation.\n */\n chat(modelId: FriendliAILanguageModelId): LanguageModelV3;\n /**\n * Creates a completion model for text generation.\n */\n completion(modelId: FriendliAILanguageModelId): LanguageModelV3;\n /**\n * Creates an embedding model for text generation.\n * TODO: Implement for Dedicated users\n */\n embedding(modelId: string & {}): LanguageModelV3;\n embeddingModel(modelId: string & {}): LanguageModelV3;\n /**\n * Returns the available models and their metadata.\n */\n getAvailableModels(options?: { graphqlURL?: string }): Promise<FriendliAvailableModelsResponse>;\n embedding(modelId: string & {}): EmbeddingModelV3;\n embeddingModel(modelId: string & {}): EmbeddingModelV3;\n /**\n * Creates a model for image generation.\n * TODO: Implement for Dedicated users\n */\n imageModel(modelId: string & {}): ImageModelV3;\n\n /**\n * Creates a model for transcription.\n * TODO: Implement for Dedicated users\n */\n transcription(modelId: string & {}): TranscriptionModelV3;\n\n /**\n * Creates a model for speech generation.\n * TODO: Implement for Dedicated users\n */\n speech(modelId: string & {}): SpeechModelV3;\n\n /**\n * Friendli-specific tools.\n */\n tools: typeof friendliTools;\n}\n\n/**\nCreate an FriendliAI provider instance.\n */\nexport function createFriendli(options: FriendliAIProviderSettings = {}): FriendliAIProvider {\n const getHeaders = () => ({\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'FRIENDLI_TOKEN',\n description: 'FRIENDLI_TOKEN',\n })}`,\n 'X-Friendli-Team': options.teamId,\n ...options.headers,\n });\n\n const baseURLAutoSelect = (\n modelId: string,\n baseURL: string | 'dedicated' | 'serverless' | 'serverless-tools' | undefined\n ): {\n baseURL: string;\n type: 'dedicated' | 'serverless' | 'serverless-tools' | 'custom';\n } => {\n const FriendliBaseURL = {\n serverless: 'https://api.friendli.ai/serverless/v1',\n serverless_tools: 'https://api.friendli.ai/serverless/tools/v1',\n dedicated: 'https://api.friendli.ai/dedicated/v1',\n };\n\n // Ignore options if baseURL is specified\n const customBaseURL = withoutTrailingSlash(baseURL);\n if (\n typeof customBaseURL === 'string' &&\n customBaseURL !== 'dedicated' &&\n customBaseURL !== 'serverless' &&\n customBaseURL !== 'serverless-tools'\n ) {\n return { baseURL: customBaseURL, type: 'custom' };\n }\n\n switch (baseURL) {\n case 'dedicated':\n return {\n baseURL: FriendliBaseURL.dedicated,\n type: 'dedicated',\n };\n case 'serverless':\n return {\n baseURL: FriendliBaseURL.serverless,\n type: 'serverless',\n };\n case 'serverless-tools':\n return {\n baseURL: FriendliBaseURL.serverless_tools,\n type: 'serverless-tools',\n };\n default:\n if (FriendliAIServerlessModelIds.includes(modelId as FriendliAIServerlessModelId)) {\n return {\n baseURL: FriendliBaseURL.serverless,\n type: 'serverless',\n };\n } else {\n return {\n baseURL: FriendliBaseURL.dedicated,\n type: 'dedicated',\n };\n }\n }\n };\n\n const createLanguageModel = (modelId: FriendliAILanguageModelId) => {\n const { baseURL, type } = baseURLAutoSelect(modelId, options.baseURL);\n\n return new FriendliAIChatLanguageModel(modelId, {\n provider: `friendliai.${type}.chat`,\n url: ({ path }: { path: string }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n includeUsage: options.includeUsage,\n });\n };\n\n const createCompletionModel = (modelId: FriendliAILanguageModelId) => {\n const { baseURL, type } = baseURLAutoSelect(modelId, options.baseURL);\n\n return new OpenAICompatibleCompletionLanguageModel(modelId, {\n provider: `friendliai.${type}.completion`,\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n errorStructure: friendliaiErrorStructure,\n });\n };\n\n const createTextEmbeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'embeddingModel' });\n };\n const createImageModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'imageModel' });\n };\n const createTranscriptionModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'languageModel' });\n };\n const createSpeechModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'languageModel' });\n };\n\n const provider = (modelId: FriendliAILanguageModelId) => createLanguageModel(modelId);\n\n provider.languageModel = createLanguageModel;\n provider.chat = createLanguageModel;\n provider.completion = createCompletionModel;\n\n // TODO: Implement for Dedicated users\n provider.embedding = createTextEmbeddingModel;\n provider.embeddingModel = createTextEmbeddingModel;\n (provider as unknown as FriendliAIProvider).getAvailableModels = async (opts?: {\n graphqlURL?: string;\n }) => {\n const defaultURL = 'https://api-internal.friendli.ai/api/graphql';\n const graphqlURL = opts?.graphqlURL ?? defaultURL;\n const apiKey = options.apiKey;\n const teamId = options.teamId;\n const headers = options.headers;\n return getAvailableModelsImpl({ apiKey, teamId, headers, graphqlURL });\n };\n provider.imageModel = createImageModel;\n provider.transcription = createTranscriptionModel;\n provider.speech = createSpeechModel;\n\n provider.tools = friendliTools;\n\n // 'getAvailableModels' is declared here.\n return provider as unknown as FriendliAIProvider;\n}\n\n/**\n * Default FriendliAI provider instance.\n */\nexport const friendli = createFriendli();\n","import { MetadataExtractor, ProviderErrorStructure } from '@ai-sdk/openai-compatible';\nimport {\n convertToOpenAICompatibleChatMessages,\n getResponseMetadata,\n mapOpenAICompatibleFinishReason,\n} from '@ai-sdk/openai-compatible/internal';\nimport {\n APICallError,\n InvalidResponseDataError,\n LanguageModelV3,\n LanguageModelV3Content,\n LanguageModelV3FinishReason,\n LanguageModelV3StreamPart,\n SharedV3ProviderMetadata,\n SharedV3Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createEventSourceResponseHandler,\n createJsonResponseHandler,\n FetchFunction,\n generateId,\n isParsableJson,\n ParseResult,\n parseProviderOptions,\n postJsonToApi,\n ResponseHandler,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nimport {\n friendliaiErrorSchema,\n friendliaiErrorStructure,\n friendliaiFailedResponseHandler,\n} from './friendli-error';\nimport { prepareTools } from './friendli-prepare-tools';\nimport { FriendliAILanguageModelId } from './friendli-settings';\n\nexport type OpenAICompatibleChatConfig = {\n provider: string;\n headers: () => Record<string, string | undefined>;\n url: (options: { modelId: string; path: string }) => string;\n fetch?: FetchFunction;\n includeUsage?: boolean;\n errorStructure?: ProviderErrorStructure<z.infer<typeof friendliaiErrorSchema>>;\n metadataExtractor?: MetadataExtractor;\n\n /**\n * Whether the model supports structured outputs.\n */\n supportsStructuredOutputs?: boolean;\n\n /**\n * The supported URLs for the model.\n */\n supportedUrls?: () => LanguageModelV3['supportedUrls'];\n};\n\ntype HostedToolExecutionChunk = {\n name: string;\n status: 'ENDED' | 'STARTED' | 'ERRORED' | 'UPDATING';\n message: null;\n parameters: Array<{ name: string; value: string }>;\n result: string | null;\n error: { type: 'INVALID_PARAMETER' | 'UNKNOWN'; msg: string } | null;\n timestamp: number;\n usage: null;\n tool_call_id: string | null;\n};\n\ntype OpenAIChatUsage = {\n prompt_tokens?: number | null;\n completion_tokens?: number | null;\n total_tokens?: number | null;\n prompt_tokens_details?: { cached_tokens?: number | null } | null;\n completion_tokens_details?: {\n reasoning_tokens?: number | null;\n accepted_prediction_tokens?: number | null;\n rejected_prediction_tokens?: number | null;\n } | null;\n};\n\ntype OpenAIChatToolCallDelta = {\n index: number;\n id?: string | null;\n type?: 'function' | null;\n function?: { name?: string | null; arguments?: string | null } | null;\n};\n\ntype OpenAIChatDelta = {\n role?: 'assistant' | null;\n content?: string | null;\n reasoning_content?: string | null;\n tool_calls?: OpenAIChatToolCallDelta[] | null;\n};\n\ntype OpenAIChatChoice = {\n delta?: OpenAIChatDelta | null;\n finish_reason?: string | null;\n};\n\ntype OpenAIChatChunk = {\n id?: string | null;\n created?: number | null;\n model?: string | null;\n choices: OpenAIChatChoice[];\n usage?: OpenAIChatUsage | null;\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value != null;\n}\n\nfunction isHostedToolExecutionChunk(value: unknown): value is HostedToolExecutionChunk {\n if (!isRecord(value)) return false;\n return (\n typeof value.status === 'string' &&\n typeof value.name === 'string' &&\n Array.isArray(value.parameters)\n );\n}\n\nfunction getChunkErrorMessage(value: unknown): string | undefined {\n if (!isRecord(value)) return undefined;\n\n if (typeof value.message === 'string') {\n return value.message;\n }\n\n const nestedError = value.error;\n if (isRecord(nestedError) && typeof nestedError.message === 'string') {\n return nestedError.message;\n }\n\n return undefined;\n}\n\nfunction isOpenAIChatChunk(value: unknown): value is OpenAIChatChunk {\n if (!isRecord(value)) return false;\n return Array.isArray(value.choices);\n}\n\nexport class FriendliAIChatLanguageModel implements LanguageModelV3 {\n readonly specificationVersion = 'v3';\n\n readonly supportsStructuredOutputs: boolean;\n\n readonly modelId: FriendliAILanguageModelId;\n // readonly settings: FriendliAIChatSettings\n\n private readonly config: OpenAICompatibleChatConfig;\n private readonly failedResponseHandler: ResponseHandler<APICallError>;\n private readonly chunkSchema; // type inferred via constructor\n\n constructor(modelId: FriendliAILanguageModelId, config: OpenAICompatibleChatConfig) {\n this.modelId = modelId;\n // this.settings = settings\n this.config = config;\n\n const errorStructure = friendliaiErrorStructure;\n this.chunkSchema = createOpenAICompatibleChatChunkSchema(errorStructure.errorSchema);\n\n this.failedResponseHandler = friendliaiFailedResponseHandler;\n\n this.supportsStructuredOutputs = config.supportsStructuredOutputs ?? true;\n }\n\n get provider(): string {\n return this.config.provider;\n }\n\n get supportedUrls() {\n return this.config.supportedUrls?.() ?? {};\n }\n private async getArgs({\n prompt,\n maxOutputTokens,\n temperature,\n topP,\n topK,\n frequencyPenalty,\n presencePenalty,\n providerOptions,\n stopSequences,\n responseFormat,\n seed,\n toolChoice,\n tools,\n stream,\n }: Parameters<LanguageModelV3['doGenerate']>[0] & {\n stream: boolean;\n }) {\n const warnings: SharedV3Warning[] = [];\n\n const friendliOptions = await parseProviderOptions({\n provider: 'friendliai',\n providerOptions,\n schema: friendliProviderOptionsSchema,\n });\n\n const legacyFriendliOptions = await parseProviderOptions({\n provider: 'friendli',\n providerOptions,\n schema: friendliProviderOptionsSchema,\n });\n\n const options = {\n ...legacyFriendliOptions,\n ...friendliOptions,\n };\n\n if (\n responseFormat?.type === 'json' &&\n responseFormat.schema != null &&\n !this.supportsStructuredOutputs\n ) {\n warnings.push({\n type: 'unsupported',\n feature: 'responseFormat',\n details: 'JSON response format schema is only supported with structuredOutputs',\n });\n }\n\n const {\n tools: openaiTools,\n toolChoice: openaiToolChoice,\n toolWarnings,\n } = prepareTools({\n tools,\n toolChoice,\n });\n\n const isToolsPresent = openaiTools != null && openaiTools.length > 0;\n\n if (isToolsPresent && (responseFormat != null || options?.regex != null)) {\n warnings.push({\n type: 'unsupported',\n feature: 'responseFormat',\n details: 'response_format is not supported when tools are present.',\n });\n }\n\n return {\n args: {\n // >>> hard-coded default options >>>\n parse_reasoning: true,\n // <<< hard-coded default options <<<\n\n model: this.modelId,\n\n // standardized settings:\n stream: stream,\n max_tokens: maxOutputTokens,\n temperature,\n top_p: topP,\n top_k: topK,\n frequency_penalty: frequencyPenalty,\n presence_penalty: presencePenalty,\n response_format:\n isToolsPresent === false\n ? responseFormat?.type === 'json'\n ? this.supportsStructuredOutputs === true && responseFormat.schema != null\n ? {\n type: 'json_schema',\n json_schema: {\n schema: responseFormat.schema,\n name: responseFormat.name ?? 'response',\n description: responseFormat.description,\n },\n }\n : { type: 'json_object' }\n : options?.regex != null\n ? {\n type: 'regex',\n schema: options.regex,\n }\n : undefined\n : undefined,\n\n stop: stopSequences,\n seed,\n\n min_p: options?.minP,\n repetition_penalty: options?.repetitionPenalty,\n xtc_threshold: options?.xtcThreshold,\n xtc_probability: options?.xtcProbability,\n\n ...(options?.chat_template_kwargs\n ? { chat_template_kwargs: options.chat_template_kwargs }\n : {}),\n\n // messages:\n messages: convertToOpenAICompatibleChatMessages(prompt),\n\n // tools:\n tools: openaiTools,\n tool_choice: openaiToolChoice,\n parallel_tool_calls: options?.parallelToolCalls,\n },\n warnings: [...warnings, ...toolWarnings],\n };\n }\n\n async doGenerate(\n options: Parameters<LanguageModelV3['doGenerate']>[0]\n ): Promise<Awaited<ReturnType<LanguageModelV3['doGenerate']>>> {\n const { args, warnings } = await this.getArgs({ ...options, stream: false });\n\n const body = JSON.stringify(args);\n\n const {\n responseHeaders,\n value: responseBody,\n rawValue: rawResponse,\n } = await postJsonToApi({\n url: this.config.url({\n path: '/chat/completions',\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers(), options.headers),\n body: args,\n failedResponseHandler: this.failedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(OpenAICompatibleChatResponseSchema),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const choice = responseBody.choices[0];\n const content: Array<LanguageModelV3Content> = [];\n\n // text content:\n const text = choice.message.content;\n if (text != null && text.length > 0) {\n content.push({ type: 'text', text });\n }\n\n // reasoning content:\n const reasoning = choice.message.reasoning_content;\n if (reasoning != null && reasoning.length > 0) {\n content.push({\n type: 'reasoning',\n text: reasoning,\n });\n }\n\n // tool calls:\n if (choice.message.tool_calls != null) {\n for (const toolCall of choice.message.tool_calls) {\n content.push({\n type: 'tool-call',\n toolCallId: toolCall.id ?? generateId(),\n toolName: toolCall.function.name,\n input: toolCall.function.arguments!,\n });\n }\n }\n\n return {\n content,\n finishReason: {\n unified: mapOpenAICompatibleFinishReason(choice.finish_reason),\n raw: choice.finish_reason ?? undefined,\n },\n usage: {\n inputTokens: {\n total: responseBody.usage?.prompt_tokens ?? undefined,\n noCache: undefined,\n cacheRead: responseBody.usage?.prompt_tokens_details?.cached_tokens ?? undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: responseBody.usage?.completion_tokens ?? undefined,\n text: undefined,\n reasoning: responseBody.usage?.completion_tokens_details?.reasoning_tokens ?? undefined,\n },\n },\n // providerMetadata,\n request: { body },\n response: {\n ...getResponseMetadata(responseBody),\n headers: responseHeaders,\n body: rawResponse,\n },\n warnings,\n };\n }\n\n async doStream(\n options: Parameters<LanguageModelV3['doStream']>[0]\n ): Promise<Awaited<ReturnType<LanguageModelV3['doStream']>>> {\n const { args, warnings } = await this.getArgs({ ...options, stream: true });\n\n const body = {\n ...args,\n stream: true,\n\n // only include stream_options when in strict compatibility mode:\n stream_options: this.config.includeUsage ? { include_usage: true } : undefined,\n };\n\n const metadataExtractor = this.config.metadataExtractor?.createStreamExtractor();\n\n const { responseHeaders, value: response } = await postJsonToApi({\n url: this.config.url({\n path: '/chat/completions',\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers(), options.headers),\n body,\n failedResponseHandler: this.failedResponseHandler,\n successfulResponseHandler: createEventSourceResponseHandler(this.chunkSchema),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const toolCalls: Array<{\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n hasFinished: boolean;\n }> = [];\n\n let finishReason: LanguageModelV3FinishReason = {\n unified: 'other',\n raw: undefined,\n };\n const usage: {\n completionTokens: number | undefined;\n completionTokensDetails: {\n reasoningTokens: number | undefined;\n acceptedPredictionTokens: number | undefined;\n rejectedPredictionTokens: number | undefined;\n };\n promptTokens: number | undefined;\n promptTokensDetails: {\n cachedTokens: number | undefined;\n };\n totalTokens: number | undefined;\n } = {\n completionTokens: undefined,\n completionTokensDetails: {\n reasoningTokens: undefined,\n acceptedPredictionTokens: undefined,\n rejectedPredictionTokens: undefined,\n },\n promptTokens: undefined,\n promptTokensDetails: {\n cachedTokens: undefined,\n },\n totalTokens: undefined,\n };\n let isFirstChunk = true;\n const providerOptionsName = 'friendliai';\n\n // Track IDs for text and reasoning events\n let currentTextId: string | null = null;\n let currentReasoningId: string | null = null;\n\n return {\n stream: response.pipeThrough(\n new TransformStream<\n ParseResult<z.infer<typeof this.chunkSchema>>,\n LanguageModelV3StreamPart\n >({\n start(controller) {\n controller.enqueue({ type: 'stream-start', warnings });\n },\n\n // NOTE: Chunk values can contain OpenAI-compatible deltas, hosted tool events, and error events.\n // We narrow with type guards for safe handling.\n transform(chunk, controller) {\n // handle failed chunk parsing / validation:\n if (!chunk.success) {\n finishReason = { unified: 'error', raw: undefined };\n controller.enqueue({ type: 'error', error: chunk.error });\n return;\n }\n const value: unknown = chunk.value;\n\n metadataExtractor?.processChunk(chunk.rawValue);\n\n // hosted tool execution case\n if (isHostedToolExecutionChunk(value)) {\n const toolCallId = value.tool_call_id ?? generateId();\n switch (value.status) {\n case 'STARTED':\n controller.enqueue({\n type: 'tool-call',\n toolCallId,\n toolName: value.name,\n input: JSON.stringify(\n Object.fromEntries(value.parameters.map((p) => [p.name, p.value]))\n ),\n providerExecuted: true,\n });\n break;\n\n case 'UPDATING':\n // Optionally handle progress if needed, but LanguageModelV3StreamPart doesn't have a direct \"progress\" type for tools\n break;\n\n case 'ENDED':\n controller.enqueue({\n type: 'tool-result',\n toolCallId,\n toolName: value.name,\n result: value.result ?? '',\n });\n break;\n\n case 'ERRORED':\n finishReason = { unified: 'error', raw: undefined };\n controller.enqueue({\n type: 'tool-result',\n toolCallId,\n toolName: value.name,\n result: value.error?.msg ?? 'Unknown error',\n isError: true,\n });\n break;\n\n default:\n finishReason = { unified: 'error', raw: undefined };\n controller.enqueue({\n type: 'error',\n error: new Error(`Unsupported tool call status: ${value.status}`),\n });\n }\n return;\n }\n\n const chunkErrorMessage = getChunkErrorMessage(value);\n if (chunkErrorMessage != null) {\n finishReason = { unified: 'error', raw: undefined };\n controller.enqueue({ type: 'error', error: chunkErrorMessage });\n return;\n }\n\n if (!isOpenAIChatChunk(value)) {\n finishReason = { unified: 'error', raw: undefined };\n controller.enqueue({\n type: 'error',\n error: new Error('Unsupported chunk shape'),\n });\n return;\n }\n\n const chunkValue = value;\n\n if (isFirstChunk) {\n isFirstChunk = false;\n\n controller.enqueue({\n type: 'response-metadata',\n ...getResponseMetadata(chunkValue),\n });\n }\n\n if (chunkValue.usage != null) {\n const {\n prompt_tokens,\n completion_tokens,\n total_tokens,\n prompt_tokens_details,\n completion_tokens_details,\n } = chunkValue.usage;\n\n usage.promptTokens = prompt_tokens ?? undefined;\n usage.completionTokens = completion_tokens ?? undefined;\n usage.totalTokens = total_tokens ?? undefined;\n if (completion_tokens_details?.reasoning_tokens != null) {\n usage.completionTokensDetails.reasoningTokens =\n completion_tokens_details?.reasoning_tokens;\n }\n if (completion_tokens_details?.accepted_prediction_tokens != null) {\n usage.completionTokensDetails.acceptedPredictionTokens =\n completion_tokens_details?.accepted_prediction_tokens;\n }\n if (completion_tokens_details?.rejected_prediction_tokens != null) {\n usage.completionTokensDetails.rejectedPredictionTokens =\n completion_tokens_details?.rejected_prediction_tokens;\n }\n if (prompt_tokens_details?.cached_tokens != null) {\n usage.promptTokensDetails.cachedTokens = prompt_tokens_details?.cached_tokens;\n }\n }\n\n const choice = chunkValue.choices[0];\n\n if (choice?.finish_reason != null) {\n finishReason = {\n unified: mapOpenAICompatibleFinishReason(choice.finish_reason),\n raw: choice.finish_reason,\n };\n }\n\n if (choice?.delta == null) {\n return;\n }\n\n const delta = choice.delta;\n\n // enqueue reasoning before text deltas:\n if (delta.reasoning_content != null) {\n if (currentReasoningId == null) {\n currentReasoningId = generateId();\n // Enqueue reasoning-start event for the first reasoning delta\n controller.enqueue({\n type: 'reasoning-start',\n id: currentReasoningId,\n });\n }\n controller.enqueue({\n type: 'reasoning-delta',\n id: currentReasoningId,\n delta: delta.reasoning_content,\n });\n }\n\n if (delta.content != null) {\n if (currentTextId == null) {\n currentTextId = generateId();\n // Enqueue text-start event for the first text delta\n controller.enqueue({\n type: 'text-start',\n id: currentTextId,\n });\n }\n controller.enqueue({\n type: 'text-delta',\n id: currentTextId,\n delta: delta.content,\n });\n }\n\n if (delta.tool_calls != null) {\n for (const toolCallDelta of delta.tool_calls) {\n const index = toolCallDelta.index;\n // Tool call start. FriendliAI returns all information except the arguments in the first chunk.\n if (toolCalls[index] == null) {\n if (toolCallDelta.type !== 'function') {\n throw new InvalidResponseDataError({\n data: toolCallDelta,\n message: `Expected 'function' type.`,\n });\n }\n\n if (toolCallDelta.id == null) {\n throw new InvalidResponseDataError({\n data: toolCallDelta,\n message: `Expected 'id' to be a string.`,\n });\n }\n\n if (toolCallDelta.function?.name == null) {\n throw new InvalidResponseDataError({\n data: toolCallDelta,\n message: `Expected 'function.name' to be a string.`,\n });\n }\n\n toolCalls[index] = {\n id: toolCallDelta.id,\n type: 'function',\n function: {\n name: toolCallDelta.function.name,\n arguments: toolCallDelta.function.arguments ?? '',\n },\n hasFinished: false,\n };\n\n const toolCall = toolCalls[index];\n\n if (toolCall.function?.name != null && toolCall.function?.arguments != null) {\n // send delta if the argument text has already started:\n if (toolCall.function.arguments.length > 0) {\n controller.enqueue({\n type: 'tool-input-delta',\n id: toolCall.id,\n delta: toolCall.function.arguments,\n });\n }\n\n // check if tool call is complete\n // (some providers send the full tool call in one chunk):\n if (isParsableJson(toolCall.function.arguments)) {\n controller.enqueue({\n type: 'tool-call',\n toolCallId: toolCall.id ?? generateId(),\n toolName: toolCall.function.name,\n input: toolCall.function.arguments,\n });\n toolCall.hasFinished = true;\n }\n }\n\n continue;\n }\n\n // existing tool call, merge if not finished\n const toolCall = toolCalls[index];\n\n if (toolCall.hasFinished) {\n continue;\n }\n\n if (toolCallDelta.function?.arguments != null) {\n toolCall.function!.arguments += toolCallDelta.function?.arguments ?? '';\n }\n\n // send delta\n controller.enqueue({\n type: 'tool-input-delta',\n id: toolCall.id,\n delta: toolCallDelta.function?.arguments ?? '',\n });\n\n // check if tool call is complete\n if (\n toolCall.function?.name != null &&\n toolCall.function?.arguments != null &&\n isParsableJson(toolCall.function.arguments)\n ) {\n controller.enqueue({\n type: 'tool-call',\n toolCallId: toolCall.id ?? generateId(),\n toolName: toolCall.function.name,\n input: toolCall.function.arguments,\n });\n toolCall.hasFinished = true;\n }\n }\n }\n },\n\n flush(controller) {\n // Emit end events before finish\n if (currentReasoningId != null) {\n controller.enqueue({\n type: 'reasoning-end',\n id: currentReasoningId,\n });\n }\n\n if (currentTextId != null) {\n controller.enqueue({\n type: 'text-end',\n id: currentTextId,\n });\n }\n\n const providerMetadata: SharedV3ProviderMetadata = {\n [providerOptionsName]: {},\n ...metadataExtractor?.buildMetadata(),\n };\n if (usage.completionTokensDetails.acceptedPredictionTokens != null) {\n providerMetadata[providerOptionsName].acceptedPredictionTokens =\n usage.completionTokensDetails.acceptedPredictionTokens;\n }\n if (usage.completionTokensDetails.rejectedPredictionTokens != null) {\n providerMetadata[providerOptionsName].rejectedPredictionTokens =\n usage.completionTokensDetails.rejectedPredictionTokens;\n }\n\n controller.enqueue({\n type: 'finish',\n finishReason,\n usage: {\n inputTokens: {\n total: usage.promptTokens ?? undefined,\n noCache: undefined,\n cacheRead: usage.promptTokensDetails.cachedTokens ?? undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: usage.completionTokens ?? undefined,\n text: undefined,\n reasoning: usage.completionTokensDetails.reasoningTokens ?? undefined,\n },\n },\n providerMetadata,\n });\n },\n })\n ),\n request: { body },\n response: { headers: responseHeaders },\n };\n }\n}\n\nconst openaiCompatibleTokenUsageSchema = z\n .object({\n prompt_tokens: z.number().nullish(),\n completion_tokens: z.number().nullish(),\n total_tokens: z.number().nullish(),\n prompt_tokens_details: z\n .object({\n cached_tokens: z.number().nullish(),\n })\n .nullish(),\n completion_tokens_details: z\n .object({\n reasoning_tokens: z.number().nullish(),\n accepted_prediction_tokens: z.number().nullish(),\n rejected_prediction_tokens: z.number().nullish(),\n })\n .nullish(),\n })\n .nullish();\n\n// limited version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nconst OpenAICompatibleChatResponseSchema = z.object({\n id: z.string().nullish(),\n created: z.number().nullish(),\n model: z.string().nullish(),\n choices: z.array(\n z.object({\n message: z.object({\n role: z.literal('assistant').nullish(),\n content: z.string().nullish(),\n reasoning_content: z.string().nullish(),\n tool_calls: z\n .array(\n z.object({\n id: z.string().nullish(),\n type: z.literal('function'),\n function: z.object({\n name: z.string(),\n arguments: z.string(),\n }),\n })\n )\n .nullish(),\n }),\n finish_reason: z.string().nullish(),\n })\n ),\n usage: openaiCompatibleTokenUsageSchema,\n});\n\n// limited version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nconst createOpenAICompatibleChatChunkSchema = <ERROR_SCHEMA extends z.ZodType>(\n errorSchema: ERROR_SCHEMA\n) =>\n z.union([\n z.object({\n id: z.string().nullish(),\n created: z.number().nullish(),\n model: z.string().nullish(),\n choices: z.array(\n z.object({\n delta: z\n .object({\n role: z.enum(['assistant']).nullish(),\n content: z.string().nullish(),\n reasoning_content: z.string().nullish(),\n tool_calls: z\n .array(\n z.object({\n index: z.number(),\n id: z.string().nullish(),\n type: z.literal('function').nullish(),\n function: z.object({\n name: z.string().nullish(),\n arguments: z.string().nullish(),\n }),\n })\n )\n .nullish(),\n })\n .nullish(),\n finish_reason: z.string().nullish(),\n })\n ),\n usage: openaiCompatibleTokenUsageSchema,\n }),\n z.object({\n name: z.string(),\n status: z.enum(['ENDED', 'STARTED', 'ERRORED', 'UPDATING']),\n message: z.null(),\n parameters: z.array(\n z.object({\n name: z.string(),\n value: z.string(),\n })\n ),\n result: z.string().nullable(),\n error: z\n .object({\n type: z.enum(['INVALID_PARAMETER', 'UNKNOWN']),\n msg: z.string(),\n })\n .nullable(),\n timestamp: z.number(),\n usage: z.null(),\n tool_call_id: z.string().nullable(),\n }),\n errorSchema,\n ]);\n\nconst friendliProviderOptionsSchema = z.object({\n /**\n * Whether to enable parallel function calling during tool use. Default to true.\n */\n parallelToolCalls: z.boolean().nullish(),\n\n /**\n * BETA FEATURE: You can write a regular expression to force output that satisfies that regular expression.\n */\n // regex: z.instanceof(RegExp).nullish(),\n regex: z.string().nullish(),\n\n chat_template_kwargs: z.record(z.string(), z.any()).nullish(),\n\n /**\n * A scaling factor used to determine the minimum token probability threshold.\n */\n minP: z.number().nullish(),\n\n /**\n * Penalizes tokens that have already appeared in the generated result.\n */\n repetitionPenalty: z.number().nullish(),\n\n /**\n * A probability threshold used to identify “top choice” tokens for exclusion in XTC sampling.\n */\n xtcThreshold: z.number().nullish(),\n\n /**\n * The probability that XTC (Exclude Top Choices) filtering will be applied for each sampling decision.\n */\n xtcProbability: z.number().nullish(),\n});\n\nexport type FriendliProviderOptions = z.infer<typeof friendliProviderOptionsSchema>;\n","import { ProviderErrorStructure } from '@ai-sdk/openai-compatible';\nimport { APICallError } from '@ai-sdk/provider';\nimport { type ResponseHandler, safeParseJSON } from '@ai-sdk/provider-utils';\nimport { z } from 'zod';\n\nconst friendliErrorResponseSchema = z.object({\n message: z.string(),\n error: z.record(z.string(), z.any()).optional(),\n});\n\nconst openAIStyleErrorResponseSchema = z\n .object({\n error: z\n .object({\n message: z.string(),\n })\n .loose(),\n })\n .loose();\n\nexport const friendliaiErrorSchema = z.union([\n // OpenAI/OpenRouter style error: { \"error\": { \"message\": \"...\" } }\n openAIStyleErrorResponseSchema,\n // Friendli style error: { \"message\": \"...\", \"error\": { ... } }\n friendliErrorResponseSchema,\n]);\n\nexport type FriendliAIErrorData = z.infer<typeof friendliaiErrorSchema>;\n\nexport const friendliaiErrorStructure: ProviderErrorStructure<FriendliAIErrorData> = {\n errorSchema: friendliaiErrorSchema,\n errorToMessage: (data) => {\n if (\n typeof data === 'object' &&\n data != null &&\n 'error' in data &&\n typeof data.error === 'object' &&\n data.error != null &&\n 'message' in data.error &&\n typeof data.error.message === 'string'\n ) {\n return data.error.message;\n }\n\n if (\n typeof data === 'object' &&\n data != null &&\n 'message' in data &&\n typeof data.message === 'string'\n ) {\n return data.message;\n }\n\n return 'Unknown error';\n },\n};\n\nexport const friendliaiFailedResponseHandler: ResponseHandler<APICallError> = async ({\n response,\n url,\n requestBodyValues,\n}) => {\n const responseBody = await response.text();\n const responseHeaders: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n responseHeaders[key] = value;\n });\n\n const baseErrorOptions = {\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody,\n } as const;\n\n const trimmedBody = responseBody.trim();\n\n if (trimmedBody === '') {\n const fallback = response.statusText || `Request failed with status ${response.status}`;\n return {\n responseHeaders,\n value: new APICallError({\n message: fallback,\n ...baseErrorOptions,\n }),\n };\n }\n\n const parsedError = await safeParseJSON({\n text: responseBody,\n schema: friendliaiErrorSchema,\n });\n\n if (parsedError.success) {\n return {\n responseHeaders,\n value: new APICallError({\n message: friendliaiErrorStructure.errorToMessage(parsedError.value),\n data: parsedError.value,\n ...baseErrorOptions,\n }),\n };\n }\n\n const fallback =\n trimmedBody || response.statusText || `Request failed with status ${response.status}`;\n\n return {\n responseHeaders,\n value: new APICallError({\n message: fallback,\n cause: parsedError.error,\n ...baseErrorOptions,\n }),\n };\n};\n","import {\n LanguageModelV3CallOptions,\n SharedV3Warning,\n UnsupportedFunctionalityError,\n} from '@ai-sdk/provider';\n\nexport function prepareTools({\n tools,\n toolChoice,\n}: {\n tools: LanguageModelV3CallOptions['tools'];\n toolChoice?: LanguageModelV3CallOptions['toolChoice'];\n}): {\n tools:\n | undefined\n | Array<{\n type: string;\n files?: string[];\n }>\n | Array<{\n type: 'function';\n function: {\n name: string;\n description: string | undefined;\n parameters: unknown;\n };\n }>;\n toolChoice:\n | { type: 'function'; function: { name: string } }\n | 'auto'\n | 'none'\n | 'required'\n | undefined;\n toolWarnings: SharedV3Warning[];\n} {\n // when the tools array is empty, change it to undefined to prevent errors:\n tools = tools?.length ? tools : undefined;\n\n const toolWarnings: SharedV3Warning[] = [];\n\n if (tools == null) {\n return { tools: undefined, toolChoice: undefined, toolWarnings };\n }\n\n const openaiCompatTools: Array<\n | {\n type: 'function';\n function: {\n name: string;\n description: string | undefined;\n parameters: unknown;\n };\n }\n | {\n type: string;\n }\n > = [];\n\n for (const tool of tools) {\n if (tool.type === 'provider') {\n openaiCompatTools.push({\n // NOTE: Friendli tool-assisted API expects provider tool types like \"web:search\".\n // We derive it from the provider tool id (e.g. \"friendli.web:search\" -> \"web:search\")\n // instead of tool.name (often \"web_search\").\n type: tool.id.split('.')[1] ?? 'unknown',\n });\n } else {\n openaiCompatTools.push({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n },\n });\n }\n }\n\n if (toolChoice == null) {\n return { tools: openaiCompatTools, toolChoice: undefined, toolWarnings };\n }\n\n const type = toolChoice.type;\n\n switch (type) {\n case 'auto':\n case 'none':\n case 'required':\n return { tools: openaiCompatTools, toolChoice: type, toolWarnings };\n case 'tool':\n return {\n tools: openaiCompatTools,\n toolChoice: {\n type: 'function',\n function: { name: toolChoice.toolName },\n },\n toolWarnings,\n };\n default: {\n const _exhaustiveCheck: never = type;\n throw new UnsupportedFunctionalityError({\n functionality: `tool choice type: ${_exhaustiveCheck}`,\n });\n }\n }\n}\n","// https://friendli.ai/product/serverless-endpoints\n// Below is just a subset of the available models.\nexport const FriendliAIServerlessModelIds = [\n 'LGAI-EXAONE/K-EXAONE-236B-A23B',\n 'MiniMaxAI/MiniMax-M2',\n 'zai-org/GLM-4.6',\n 'LGAI-EXAONE/EXAONE-4.0.1-32B',\n 'skt/A.X-4.0',\n 'skt/A.X-3.1',\n 'naver-hyperclovax/HyperCLOVAX-SEED-Think-14B',\n 'deepseek-ai/DeepSeek-V3.1',\n 'deepseek-ai/DeepSeek-R1-0528',\n 'meta-llama/Llama-4-Maverick-17B-128E-Instruct',\n 'meta-llama/Llama-4-Scout-17B-16E-Instruct',\n 'meta-llama/Llama-3.3-70B-Instruct',\n 'meta-llama-3.3-70b-instruct',\n 'meta-llama/Llama-3.1-8B-Instruct',\n 'meta-llama-3.1-8b-instruct',\n 'Qwen/Qwen3-235B-A22B-Thinking-2507',\n 'Qwen/Qwen3-235B-A22B-Instruct-2507',\n 'Qwen/Qwen3-30B-A3B',\n 'Qwen/Qwen3-32B',\n 'google/gemma-3-27b-it',\n 'mistralai/Mistral-Small-3.1-24B-Instruct-2503',\n 'mistralai/Devstral-Small-2505',\n 'mistralai/Magistral-Small-2506',\n] as const;\n\nexport type FriendliAIServerlessModelId = (typeof FriendliAIServerlessModelIds)[number];\n\nexport type FriendliAILanguageModelId = FriendliAIServerlessModelId | (string & {});\n","import { createProviderToolFactoryWithOutputSchema, type Tool } from '@ai-sdk/provider-utils';\nimport { z } from 'zod';\n\n/**\n * Friendli built-in tools for serverless tool-assisted API.\n *\n * @remarks\n * These tools are currently in **Beta**. While we strive to provide a stable\n * and reliable experience, this feature is still under active development.\n *\n * @see https://friendli.ai/docs/guides/serverless_endpoints/tool-assisted-api\n */\n\nconst inputSchema = z.object({}).loose();\nconst outputSchema = z.unknown();\n\nexport const webSearchTool = createProviderToolFactoryWithOutputSchema({\n id: 'friendli.web:search',\n inputSchema,\n outputSchema,\n});\n\nexport const webUrlTool = createProviderToolFactoryWithOutputSchema({\n id: 'friendli.web:url',\n inputSchema,\n outputSchema,\n});\n\nexport const mathCalendarTool = createProviderToolFactoryWithOutputSchema({\n id: 'friendli.math:calendar',\n inputSchema,\n outputSchema,\n});\n\nexport const mathStatisticsTool = createProviderToolFactoryWithOutputSchema({\n id: 'friendli.math:statistics',\n inputSchema,\n outputSchema,\n});\n\nexport const mathCalculatorTool = createProviderToolFactoryWithOutputSchema({\n id: 'friendli.math:calculator',\n inputSchema,\n outputSchema,\n});\n\nexport const codePythonInterpreterTool = createProviderToolFactoryWithOutputSchema({\n id: 'friendli.code:python-interpreter',\n inputSchema,\n outputSchema,\n});\n\nexport const linkupSearchTool = createProviderToolFactoryWithOutputSchema({\n id: 'friendli.linkup:search',\n inputSchema,\n outputSchema,\n});\n\n/**\n * Web search tool - searches the web for information.\n * @beta\n */\nfunction webSearch(): Tool {\n return webSearchTool({});\n}\n\n/**\n * Web URL tool - fetches content from a specific URL.\n * @beta\n */\nfunction webUrl(): Tool {\n return webUrlTool({});\n}\n\n/**\n * Math calendar tool - performs calendar-related calculations.\n * @beta\n */\nfunction mathCalendar(): Tool {\n return mathCalendarTool({});\n}\n\n/**\n * Math statistics tool - performs statistical calculations.\n * @beta\n */\nfunction mathStatistics(): Tool {\n return mathStatisticsTool({});\n}\n\n/**\n * Math calculator tool - performs arithmetic calculations.\n * @beta\n */\nfunction mathCalculator(): Tool {\n return mathCalculatorTool({});\n}\n\n/**\n * Python interpreter tool - executes Python code.\n * @beta\n */\nfunction codePythonInterpreter(): Tool {\n return codePythonInterpreterTool({});\n}\n\n/**\n * Linkup search tool - searches the web for real-time information with citations.\n * @see https://www.linkup.so\n */\nfunction linkupSearch(): Tool {\n return linkupSearchTool({});\n}\n\nexport const friendliTools = {\n webSearch,\n webUrl,\n mathCalendar,\n mathStatistics,\n mathCalculator,\n codePythonInterpreter,\n linkupSearch,\n};\n","import { loadApiKey } from '@ai-sdk/provider-utils';\n\ntype Pricing = {\n inputToken?: number;\n outputToken?: number;\n responseTime?: number;\n unitType?: 'TOKEN' | 'SECOND';\n currency?: string;\n unit?: string;\n};\n\nexport type FriendliAvailableModel = {\n id: string;\n name?: string | null;\n description?: string | null;\n pricing?: Pricing;\n warm?: boolean;\n cold?: boolean;\n contextLength?: number | null;\n};\n\nexport type FriendliAvailableModelsResponse = {\n models: FriendliAvailableModel[];\n};\n\ntype GraphQLResponse<T> = {\n data?: T;\n errors?: Array<{ message: string }>;\n};\n\nconst DEFAULT_GRAPHQL_URL = 'https://api-internal.friendli.ai/api/graphql';\n\nasync function postGraphQL<T>(\n url: string,\n body: {\n query: string;\n variables?: Record<string, unknown>;\n operationName?: string;\n },\n headers: Record<string, string>\n): Promise<GraphQLResponse<T>> {\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n body: JSON.stringify(body),\n });\n\n let json: GraphQLResponse<T>;\n try {\n json = await res.json();\n } catch (err) {\n console.error(\n 'Failed to parse JSON response from Friendli API:',\n err,\n 'Status:',\n res.status,\n res.statusText\n );\n throw new Error(\n `Failed to parse JSON response from Friendli API: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n return json;\n}\n\ntype ServerlessEndpointEdge = {\n id: string;\n name?: string | null;\n status?: 'WARM' | 'COLD' | string | null;\n price?: {\n inputPrice?: number | null;\n outputPrice?: number | null;\n unit?: string | null;\n responseTimePrice?: number | null;\n priceUnitType?: 'TOKEN' | 'SECOND' | null;\n } | null;\n contextLength?: number | null;\n};\n\ntype ServerlessEndpointsQuery = {\n serverlessEndpoints?: {\n edges?: ServerlessEndpointEdge[];\n } | null;\n};\n\nfunction normalizePriceUnit(unit?: string | null): string | undefined {\n if (!unit) return undefined;\n return unit;\n}\n\nexport async function getAvailableModelsImpl(options: {\n apiKey?: string;\n teamId?: string;\n headers?: Record<string, string>;\n graphqlURL?: string;\n}): Promise<FriendliAvailableModelsResponse> {\n let token: string | undefined;\n try {\n token =\n options.apiKey ??\n loadApiKey({\n apiKey: undefined,\n environmentVariableName: 'FRIENDLI_TOKEN',\n description: 'FRIENDLI_TOKEN',\n });\n } catch {\n token = undefined;\n }\n\n const headers: Record<string, string> = {\n ...(token ? { Authorization: `Bearer ${token}` } : {}),\n ...(options.teamId ? { 'X-Friendli-Team': options.teamId } : {}),\n ...(options.headers ?? {}),\n };\n\n const url = options.graphqlURL ?? DEFAULT_GRAPHQL_URL;\n\n const query = `\n query Edges {\n serverlessEndpoints {\n edges {\n ... on ServerlessChatEndpointCatalog {\n id\n name\n status\n price {\n inputPrice\n outputPrice\n unit\n responseTimePrice\n priceUnitType\n }\n contextLength\n }\n }\n }\n }\n `;\n\n const resp = await postGraphQL<ServerlessEndpointsQuery>(\n url,\n { query, variables: {}, operationName: 'Edges' },\n headers\n );\n\n if (resp.errors && resp.errors.length > 0) {\n throw new Error(\n `getAvailableModels: GraphQL error: ${resp.errors.map((e) => e.message).join('; ')}`\n );\n }\n\n const edges = resp.data?.serverlessEndpoints?.edges ?? [];\n\n const models: FriendliAvailableModel[] = edges.map((e) => {\n const warm = e.status === 'WARM';\n const pricing: Pricing | undefined = e.price\n ? {\n inputToken: e.price.inputPrice ?? undefined,\n outputToken: e.price.outputPrice ?? undefined,\n responseTime: e.price.responseTimePrice ?? undefined,\n unitType: (e.price.priceUnitType ?? undefined) as 'TOKEN' | 'SECOND' | undefined,\n unit: normalizePriceUnit(e.price.unit),\n currency: 'USD',\n }\n : undefined;\n\n return {\n id: e.id,\n name: e.name ?? undefined,\n description: undefined,\n pricing,\n warm,\n cold: warm === false,\n contextLength: e.contextLength ?? undefined,\n };\n });\n\n return { models };\n}\n"],"mappings":"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","names":["import_provider","import_provider_utils","import_provider","import_provider_utils","fallback","import_provider","_a","toolCall","import_provider_utils","import_zod","import_provider_utils","_a","_b","_c","_d","_e","_f"]}
package/dist/index.mjs CHANGED
@@ -23,7 +23,7 @@ import {
23
23
  parseProviderOptions,
24
24
  postJsonToApi
25
25
  } from "@ai-sdk/provider-utils";
26
- import { z as z2 } from "zod";
26
+ import { z as z2 } from "zod/v4";
27
27
 
28
28
  // src/friendli-error.ts
29
29
  import { APICallError } from "@ai-sdk/provider";
@@ -404,8 +404,10 @@ var FriendliAIChatLanguageModel = class {
404
404
  fetch: this.config.fetch
405
405
  });
406
406
  const toolCalls = [];
407
- let finishReason = "other";
408
- let rawFinishReason;
407
+ let finishReason = {
408
+ unified: "other",
409
+ raw: void 0
410
+ };
409
411
  const usage = {
410
412
  completionTokens: void 0,
411
413
  completionTokensDetails: {
@@ -434,7 +436,7 @@ var FriendliAIChatLanguageModel = class {
434
436
  transform(chunk, controller) {
435
437
  var _a2, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q;
436
438
  if (!chunk.success) {
437
- finishReason = "error";
439
+ finishReason = { unified: "error", raw: void 0 };
438
440
  controller.enqueue({ type: "error", error: chunk.error });
439
441
  return;
440
442
  }
@@ -465,7 +467,7 @@ var FriendliAIChatLanguageModel = class {
465
467
  });
466
468
  break;
467
469
  case "ERRORED":
468
- finishReason = "error";
470
+ finishReason = { unified: "error", raw: void 0 };
469
471
  controller.enqueue({
470
472
  type: "tool-result",
471
473
  toolCallId,
@@ -475,7 +477,7 @@ var FriendliAIChatLanguageModel = class {
475
477
  });
476
478
  break;
477
479
  default:
478
- finishReason = "error";
480
+ finishReason = { unified: "error", raw: void 0 };
479
481
  controller.enqueue({
480
482
  type: "error",
481
483
  error: new Error(`Unsupported tool call status: ${value.status}`)
@@ -485,12 +487,12 @@ var FriendliAIChatLanguageModel = class {
485
487
  }
486
488
  const chunkErrorMessage = getChunkErrorMessage(value);
487
489
  if (chunkErrorMessage != null) {
488
- finishReason = "error";
490
+ finishReason = { unified: "error", raw: void 0 };
489
491
  controller.enqueue({ type: "error", error: chunkErrorMessage });
490
492
  return;
491
493
  }
492
494
  if (!isOpenAIChatChunk(value)) {
493
- finishReason = "error";
495
+ finishReason = { unified: "error", raw: void 0 };
494
496
  controller.enqueue({
495
497
  type: "error",
496
498
  error: new Error("Unsupported chunk shape")
@@ -531,8 +533,10 @@ var FriendliAIChatLanguageModel = class {
531
533
  }
532
534
  const choice = chunkValue.choices[0];
533
535
  if ((choice == null ? void 0 : choice.finish_reason) != null) {
534
- rawFinishReason = choice.finish_reason;
535
- finishReason = mapOpenAICompatibleFinishReason(choice.finish_reason);
536
+ finishReason = {
537
+ unified: mapOpenAICompatibleFinishReason(choice.finish_reason),
538
+ raw: choice.finish_reason
539
+ };
536
540
  }
537
541
  if ((choice == null ? void 0 : choice.delta) == null) {
538
542
  return;
@@ -668,10 +672,7 @@ var FriendliAIChatLanguageModel = class {
668
672
  }
669
673
  controller.enqueue({
670
674
  type: "finish",
671
- finishReason: {
672
- unified: finishReason,
673
- raw: rawFinishReason
674
- },
675
+ finishReason,
675
676
  usage: {
676
677
  inputTokens: {
677
678
  total: (_a2 = usage.promptTokens) != null ? _a2 : void 0,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/friendli-provider.ts","../src/friendli-chat-language-model.ts","../src/friendli-error.ts","../src/friendli-prepare-tools.ts","../src/friendli-settings.ts","../src/friendli-tools.ts","../src/get-available-models.ts"],"sourcesContent":["import { OpenAICompatibleCompletionLanguageModel } from '@ai-sdk/openai-compatible';\nimport {\n EmbeddingModelV3,\n ImageModelV3,\n LanguageModelV3,\n NoSuchModelError,\n ProviderV3,\n SpeechModelV3,\n TranscriptionModelV3,\n} from '@ai-sdk/provider';\nimport { FetchFunction, loadApiKey, withoutTrailingSlash } from '@ai-sdk/provider-utils';\n\nimport { FriendliAIChatLanguageModel } from './friendli-chat-language-model';\nimport { friendliaiErrorStructure } from './friendli-error';\nimport {\n FriendliAILanguageModelId,\n FriendliAIServerlessModelId,\n FriendliAIServerlessModelIds,\n} from './friendli-settings';\nimport { friendliTools } from './friendli-tools';\nimport type { FriendliAvailableModelsResponse } from './get-available-models';\nimport { getAvailableModelsImpl } from './get-available-models';\n\nexport interface FriendliAIProviderSettings {\n /**\n * FriendliAI API key. (FRIENDLI_TOKEN)\n */\n apiKey?: string;\n /**\n * Base URL for the API calls.\n */\n baseURL?: string | 'auto' | 'dedicated' | 'serverless' | 'serverless-tools';\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string>;\n /**\n * FriendliAI Team ID.\n */\n teamId?: string;\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept requests,\n * or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n /**\n * Whether to include usage information in the response.\n */\n includeUsage?: boolean;\n}\n\nexport interface FriendliAIProvider extends ProviderV3 {\n /**\n * Creates a model for text generation.\n */\n (modelId: FriendliAILanguageModelId): LanguageModelV3;\n /**\n * Creates a chat model for text generation.\n */\n languageModel(modelId: FriendliAILanguageModelId): LanguageModelV3;\n /**\n * Creates a chat model for text generation.\n */\n chat(modelId: FriendliAILanguageModelId): LanguageModelV3;\n /**\n * Creates a completion model for text generation.\n */\n completion(modelId: FriendliAILanguageModelId): LanguageModelV3;\n /**\n * Creates an embedding model for text generation.\n * TODO: Implement for Dedicated users\n */\n embedding(modelId: string & {}): LanguageModelV3;\n embeddingModel(modelId: string & {}): LanguageModelV3;\n /**\n * Returns the available models and their metadata.\n */\n getAvailableModels(options?: { graphqlURL?: string }): Promise<FriendliAvailableModelsResponse>;\n embedding(modelId: string & {}): EmbeddingModelV3;\n embeddingModel(modelId: string & {}): EmbeddingModelV3;\n /**\n * Creates a model for image generation.\n * TODO: Implement for Dedicated users\n */\n imageModel(modelId: string & {}): ImageModelV3;\n\n /**\n * Creates a model for transcription.\n * TODO: Implement for Dedicated users\n */\n transcription(modelId: string & {}): TranscriptionModelV3;\n\n /**\n * Creates a model for speech generation.\n * TODO: Implement for Dedicated users\n */\n speech(modelId: string & {}): SpeechModelV3;\n\n /**\n * Friendli-specific tools.\n */\n tools: typeof friendliTools;\n}\n\n/**\nCreate an FriendliAI provider instance.\n */\nexport function createFriendli(options: FriendliAIProviderSettings = {}): FriendliAIProvider {\n const getHeaders = () => ({\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'FRIENDLI_TOKEN',\n description: 'FRIENDLI_TOKEN',\n })}`,\n 'X-Friendli-Team': options.teamId,\n ...options.headers,\n });\n\n const baseURLAutoSelect = (\n modelId: string,\n baseURL: string | 'dedicated' | 'serverless' | 'serverless-tools' | undefined\n ): {\n baseURL: string;\n type: 'dedicated' | 'serverless' | 'serverless-tools' | 'custom';\n } => {\n const FriendliBaseURL = {\n serverless: 'https://api.friendli.ai/serverless/v1',\n serverless_tools: 'https://api.friendli.ai/serverless/tools/v1',\n dedicated: 'https://api.friendli.ai/dedicated/v1',\n };\n\n // Ignore options if baseURL is specified\n const customBaseURL = withoutTrailingSlash(baseURL);\n if (\n typeof customBaseURL === 'string' &&\n customBaseURL !== 'dedicated' &&\n customBaseURL !== 'serverless' &&\n customBaseURL !== 'serverless-tools'\n ) {\n return { baseURL: customBaseURL, type: 'custom' };\n }\n\n switch (baseURL) {\n case 'dedicated':\n return {\n baseURL: FriendliBaseURL.dedicated,\n type: 'dedicated',\n };\n case 'serverless':\n return {\n baseURL: FriendliBaseURL.serverless,\n type: 'serverless',\n };\n case 'serverless-tools':\n return {\n baseURL: FriendliBaseURL.serverless_tools,\n type: 'serverless-tools',\n };\n default:\n if (FriendliAIServerlessModelIds.includes(modelId as FriendliAIServerlessModelId)) {\n return {\n baseURL: FriendliBaseURL.serverless,\n type: 'serverless',\n };\n } else {\n return {\n baseURL: FriendliBaseURL.dedicated,\n type: 'dedicated',\n };\n }\n }\n };\n\n const createLanguageModel = (modelId: FriendliAILanguageModelId) => {\n const { baseURL, type } = baseURLAutoSelect(modelId, options.baseURL);\n\n return new FriendliAIChatLanguageModel(modelId, {\n provider: `friendliai.${type}.chat`,\n url: ({ path }: { path: string }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n includeUsage: options.includeUsage,\n });\n };\n\n const createCompletionModel = (modelId: FriendliAILanguageModelId) => {\n const { baseURL, type } = baseURLAutoSelect(modelId, options.baseURL);\n\n return new OpenAICompatibleCompletionLanguageModel(modelId, {\n provider: `friendliai.${type}.completion`,\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n errorStructure: friendliaiErrorStructure,\n });\n };\n\n const createTextEmbeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'embeddingModel' });\n };\n const createImageModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'imageModel' });\n };\n const createTranscriptionModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'languageModel' });\n };\n const createSpeechModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'languageModel' });\n };\n\n const provider = (modelId: FriendliAILanguageModelId) => createLanguageModel(modelId);\n\n provider.languageModel = createLanguageModel;\n provider.chat = createLanguageModel;\n provider.completion = createCompletionModel;\n\n // TODO: Implement for Dedicated users\n provider.embedding = createTextEmbeddingModel;\n provider.embeddingModel = createTextEmbeddingModel;\n (provider as unknown as FriendliAIProvider).getAvailableModels = async (opts?: {\n graphqlURL?: string;\n }) => {\n const defaultURL = 'https://api-internal.friendli.ai/api/graphql';\n const graphqlURL = opts?.graphqlURL ?? defaultURL;\n const apiKey = options.apiKey;\n const teamId = options.teamId;\n const headers = options.headers;\n return getAvailableModelsImpl({ apiKey, teamId, headers, graphqlURL });\n };\n provider.imageModel = createImageModel;\n provider.transcription = createTranscriptionModel;\n provider.speech = createSpeechModel;\n\n provider.tools = friendliTools;\n\n // 'getAvailableModels' is declared here.\n return provider as unknown as FriendliAIProvider;\n}\n\n/**\n * Default FriendliAI provider instance.\n */\nexport const friendli = createFriendli();\n","import { MetadataExtractor, ProviderErrorStructure } from '@ai-sdk/openai-compatible';\nimport {\n convertToOpenAICompatibleChatMessages,\n getResponseMetadata,\n mapOpenAICompatibleFinishReason,\n} from '@ai-sdk/openai-compatible/internal';\nimport {\n APICallError,\n InvalidResponseDataError,\n LanguageModelV3,\n LanguageModelV3Content,\n LanguageModelV3FinishReason,\n LanguageModelV3StreamPart,\n SharedV3ProviderMetadata,\n SharedV3Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createEventSourceResponseHandler,\n createJsonResponseHandler,\n FetchFunction,\n generateId,\n isParsableJson,\n ParseResult,\n parseProviderOptions,\n postJsonToApi,\n ResponseHandler,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod';\n\nimport {\n friendliaiErrorSchema,\n friendliaiErrorStructure,\n friendliaiFailedResponseHandler,\n} from './friendli-error';\nimport { prepareTools } from './friendli-prepare-tools';\nimport { FriendliAILanguageModelId } from './friendli-settings';\n\nexport type OpenAICompatibleChatConfig = {\n provider: string;\n headers: () => Record<string, string | undefined>;\n url: (options: { modelId: string; path: string }) => string;\n fetch?: FetchFunction;\n includeUsage?: boolean;\n errorStructure?: ProviderErrorStructure<z.infer<typeof friendliaiErrorSchema>>;\n metadataExtractor?: MetadataExtractor;\n\n /**\n * Whether the model supports structured outputs.\n */\n supportsStructuredOutputs?: boolean;\n\n /**\n * The supported URLs for the model.\n */\n supportedUrls?: () => LanguageModelV3['supportedUrls'];\n};\n\ntype HostedToolExecutionChunk = {\n name: string;\n status: 'ENDED' | 'STARTED' | 'ERRORED' | 'UPDATING';\n message: null;\n parameters: Array<{ name: string; value: string }>;\n result: string | null;\n error: { type: 'INVALID_PARAMETER' | 'UNKNOWN'; msg: string } | null;\n timestamp: number;\n usage: null;\n tool_call_id: string | null;\n};\n\ntype OpenAIChatUsage = {\n prompt_tokens?: number | null;\n completion_tokens?: number | null;\n total_tokens?: number | null;\n prompt_tokens_details?: { cached_tokens?: number | null } | null;\n completion_tokens_details?: {\n reasoning_tokens?: number | null;\n accepted_prediction_tokens?: number | null;\n rejected_prediction_tokens?: number | null;\n } | null;\n};\n\ntype OpenAIChatToolCallDelta = {\n index: number;\n id?: string | null;\n type?: 'function' | null;\n function?: { name?: string | null; arguments?: string | null } | null;\n};\n\ntype OpenAIChatDelta = {\n role?: 'assistant' | null;\n content?: string | null;\n reasoning_content?: string | null;\n tool_calls?: OpenAIChatToolCallDelta[] | null;\n};\n\ntype OpenAIChatChoice = {\n delta?: OpenAIChatDelta | null;\n finish_reason?: string | null;\n};\n\ntype OpenAIChatChunk = {\n id?: string | null;\n created?: number | null;\n model?: string | null;\n choices: OpenAIChatChoice[];\n usage?: OpenAIChatUsage | null;\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value != null;\n}\n\nfunction isHostedToolExecutionChunk(value: unknown): value is HostedToolExecutionChunk {\n if (!isRecord(value)) return false;\n return (\n typeof value.status === 'string' &&\n typeof value.name === 'string' &&\n Array.isArray(value.parameters)\n );\n}\n\nfunction getChunkErrorMessage(value: unknown): string | undefined {\n if (!isRecord(value)) return undefined;\n\n if (typeof value.message === 'string') {\n return value.message;\n }\n\n const nestedError = value.error;\n if (isRecord(nestedError) && typeof nestedError.message === 'string') {\n return nestedError.message;\n }\n\n return undefined;\n}\n\nfunction isOpenAIChatChunk(value: unknown): value is OpenAIChatChunk {\n if (!isRecord(value)) return false;\n return Array.isArray(value.choices);\n}\n\nexport class FriendliAIChatLanguageModel implements LanguageModelV3 {\n readonly specificationVersion = 'v3';\n\n readonly supportsStructuredOutputs: boolean;\n\n readonly modelId: FriendliAILanguageModelId;\n // readonly settings: FriendliAIChatSettings\n\n private readonly config: OpenAICompatibleChatConfig;\n private readonly failedResponseHandler: ResponseHandler<APICallError>;\n private readonly chunkSchema; // type inferred via constructor\n\n constructor(modelId: FriendliAILanguageModelId, config: OpenAICompatibleChatConfig) {\n this.modelId = modelId;\n // this.settings = settings\n this.config = config;\n\n const errorStructure = friendliaiErrorStructure;\n this.chunkSchema = createOpenAICompatibleChatChunkSchema(errorStructure.errorSchema);\n\n this.failedResponseHandler = friendliaiFailedResponseHandler;\n\n this.supportsStructuredOutputs = config.supportsStructuredOutputs ?? true;\n }\n\n get provider(): string {\n return this.config.provider;\n }\n\n get supportedUrls() {\n return this.config.supportedUrls?.() ?? {};\n }\n private async getArgs({\n prompt,\n maxOutputTokens,\n temperature,\n topP,\n topK,\n frequencyPenalty,\n presencePenalty,\n providerOptions,\n stopSequences,\n responseFormat,\n seed,\n toolChoice,\n tools,\n stream,\n }: Parameters<LanguageModelV3['doGenerate']>[0] & {\n stream: boolean;\n }) {\n const warnings: SharedV3Warning[] = [];\n\n const friendliOptions = await parseProviderOptions({\n provider: 'friendliai',\n providerOptions,\n schema: friendliProviderOptionsSchema,\n });\n\n const legacyFriendliOptions = await parseProviderOptions({\n provider: 'friendli',\n providerOptions,\n schema: friendliProviderOptionsSchema,\n });\n\n const options = {\n ...legacyFriendliOptions,\n ...friendliOptions,\n };\n\n if (\n responseFormat?.type === 'json' &&\n responseFormat.schema != null &&\n !this.supportsStructuredOutputs\n ) {\n warnings.push({\n type: 'unsupported',\n feature: 'responseFormat',\n details: 'JSON response format schema is only supported with structuredOutputs',\n });\n }\n\n const {\n tools: openaiTools,\n toolChoice: openaiToolChoice,\n toolWarnings,\n } = prepareTools({\n tools,\n toolChoice,\n });\n\n const isToolsPresent = openaiTools != null && openaiTools.length > 0;\n\n if (isToolsPresent && (responseFormat != null || options?.regex != null)) {\n warnings.push({\n type: 'unsupported',\n feature: 'responseFormat',\n details: 'response_format is not supported when tools are present.',\n });\n }\n\n return {\n args: {\n // >>> hard-coded default options >>>\n parse_reasoning: true,\n // <<< hard-coded default options <<<\n\n model: this.modelId,\n\n // standardized settings:\n stream: stream,\n max_tokens: maxOutputTokens,\n temperature,\n top_p: topP,\n top_k: topK,\n frequency_penalty: frequencyPenalty,\n presence_penalty: presencePenalty,\n response_format:\n isToolsPresent === false\n ? responseFormat?.type === 'json'\n ? this.supportsStructuredOutputs === true && responseFormat.schema != null\n ? {\n type: 'json_schema',\n json_schema: {\n schema: responseFormat.schema,\n name: responseFormat.name ?? 'response',\n description: responseFormat.description,\n },\n }\n : { type: 'json_object' }\n : options?.regex != null\n ? {\n type: 'regex',\n schema: options.regex,\n }\n : undefined\n : undefined,\n\n stop: stopSequences,\n seed,\n\n min_p: options?.minP,\n repetition_penalty: options?.repetitionPenalty,\n xtc_threshold: options?.xtcThreshold,\n xtc_probability: options?.xtcProbability,\n\n ...(options?.chat_template_kwargs\n ? { chat_template_kwargs: options.chat_template_kwargs }\n : {}),\n\n // messages:\n messages: convertToOpenAICompatibleChatMessages(prompt),\n\n // tools:\n tools: openaiTools,\n tool_choice: openaiToolChoice,\n parallel_tool_calls: options?.parallelToolCalls,\n },\n warnings: [...warnings, ...toolWarnings],\n };\n }\n\n async doGenerate(\n options: Parameters<LanguageModelV3['doGenerate']>[0]\n ): Promise<Awaited<ReturnType<LanguageModelV3['doGenerate']>>> {\n const { args, warnings } = await this.getArgs({ ...options, stream: false });\n\n const body = JSON.stringify(args);\n\n const {\n responseHeaders,\n value: responseBody,\n rawValue: rawResponse,\n } = await postJsonToApi({\n url: this.config.url({\n path: '/chat/completions',\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers(), options.headers),\n body: args,\n failedResponseHandler: this.failedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(OpenAICompatibleChatResponseSchema),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const choice = responseBody.choices[0];\n const content: Array<LanguageModelV3Content> = [];\n\n // text content:\n const text = choice.message.content;\n if (text != null && text.length > 0) {\n content.push({ type: 'text', text });\n }\n\n // reasoning content:\n const reasoning = choice.message.reasoning_content;\n if (reasoning != null && reasoning.length > 0) {\n content.push({\n type: 'reasoning',\n text: reasoning,\n });\n }\n\n // tool calls:\n if (choice.message.tool_calls != null) {\n for (const toolCall of choice.message.tool_calls) {\n content.push({\n type: 'tool-call',\n toolCallId: toolCall.id ?? generateId(),\n toolName: toolCall.function.name,\n input: toolCall.function.arguments!,\n });\n }\n }\n\n return {\n content,\n finishReason: {\n unified: mapOpenAICompatibleFinishReason(choice.finish_reason),\n raw: choice.finish_reason ?? undefined,\n },\n usage: {\n inputTokens: {\n total: responseBody.usage?.prompt_tokens ?? undefined,\n noCache: undefined,\n cacheRead: responseBody.usage?.prompt_tokens_details?.cached_tokens ?? undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: responseBody.usage?.completion_tokens ?? undefined,\n text: undefined,\n reasoning: responseBody.usage?.completion_tokens_details?.reasoning_tokens ?? undefined,\n },\n },\n // providerMetadata,\n request: { body },\n response: {\n ...getResponseMetadata(responseBody),\n headers: responseHeaders,\n body: rawResponse,\n },\n warnings,\n };\n }\n\n async doStream(\n options: Parameters<LanguageModelV3['doStream']>[0]\n ): Promise<Awaited<ReturnType<LanguageModelV3['doStream']>>> {\n const { args, warnings } = await this.getArgs({ ...options, stream: true });\n\n const body = {\n ...args,\n stream: true,\n\n // only include stream_options when in strict compatibility mode:\n stream_options: this.config.includeUsage ? { include_usage: true } : undefined,\n };\n\n const metadataExtractor = this.config.metadataExtractor?.createStreamExtractor();\n\n const { responseHeaders, value: response } = await postJsonToApi({\n url: this.config.url({\n path: '/chat/completions',\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers(), options.headers),\n body,\n failedResponseHandler: this.failedResponseHandler,\n successfulResponseHandler: createEventSourceResponseHandler(this.chunkSchema),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const toolCalls: Array<{\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n hasFinished: boolean;\n }> = [];\n\n let finishReason: LanguageModelV3FinishReason['unified'] = 'other';\n let rawFinishReason: string | undefined;\n const usage: {\n completionTokens: number | undefined;\n completionTokensDetails: {\n reasoningTokens: number | undefined;\n acceptedPredictionTokens: number | undefined;\n rejectedPredictionTokens: number | undefined;\n };\n promptTokens: number | undefined;\n promptTokensDetails: {\n cachedTokens: number | undefined;\n };\n totalTokens: number | undefined;\n } = {\n completionTokens: undefined,\n completionTokensDetails: {\n reasoningTokens: undefined,\n acceptedPredictionTokens: undefined,\n rejectedPredictionTokens: undefined,\n },\n promptTokens: undefined,\n promptTokensDetails: {\n cachedTokens: undefined,\n },\n totalTokens: undefined,\n };\n let isFirstChunk = true;\n const providerOptionsName = 'friendliai';\n\n // Track IDs for part-finish events\n let currentTextId: string | null = null;\n let currentReasoningId: string | null = null;\n\n return {\n stream: response.pipeThrough(\n new TransformStream<\n ParseResult<z.infer<typeof this.chunkSchema>>,\n LanguageModelV3StreamPart\n >({\n start(controller) {\n controller.enqueue({ type: 'stream-start', warnings });\n },\n\n // NOTE: Chunk values can contain OpenAI-compatible deltas, hosted tool events, and error events.\n // We narrow with type guards for safe handling.\n transform(chunk, controller) {\n // handle failed chunk parsing / validation:\n if (!chunk.success) {\n finishReason = 'error';\n controller.enqueue({ type: 'error', error: chunk.error });\n return;\n }\n const value: unknown = chunk.value;\n\n metadataExtractor?.processChunk(chunk.rawValue);\n\n // hosted tool execution case\n if (isHostedToolExecutionChunk(value)) {\n const toolCallId = value.tool_call_id ?? generateId();\n switch (value.status) {\n case 'STARTED':\n controller.enqueue({\n type: 'tool-call',\n toolCallId,\n toolName: value.name,\n input: JSON.stringify(\n Object.fromEntries(value.parameters.map((p) => [p.name, p.value]))\n ),\n providerExecuted: true,\n });\n break;\n\n case 'UPDATING':\n // Optionally handle progress if needed, but LanguageModelV3StreamPart doesn't have a direct \"progress\" type for tools\n break;\n\n case 'ENDED':\n controller.enqueue({\n type: 'tool-result',\n toolCallId,\n toolName: value.name,\n result: value.result ?? '',\n });\n break;\n\n case 'ERRORED':\n finishReason = 'error';\n controller.enqueue({\n type: 'tool-result',\n toolCallId,\n toolName: value.name,\n result: value.error?.msg ?? 'Unknown error',\n isError: true,\n });\n break;\n\n default:\n finishReason = 'error';\n controller.enqueue({\n type: 'error',\n error: new Error(`Unsupported tool call status: ${value.status}`),\n });\n }\n return;\n }\n\n const chunkErrorMessage = getChunkErrorMessage(value);\n if (chunkErrorMessage != null) {\n finishReason = 'error';\n controller.enqueue({ type: 'error', error: chunkErrorMessage });\n return;\n }\n\n if (!isOpenAIChatChunk(value)) {\n finishReason = 'error';\n controller.enqueue({\n type: 'error',\n error: new Error('Unsupported chunk shape'),\n });\n return;\n }\n\n const chunkValue = value;\n\n if (isFirstChunk) {\n isFirstChunk = false;\n\n controller.enqueue({\n type: 'response-metadata',\n ...getResponseMetadata(chunkValue),\n });\n }\n\n if (chunkValue.usage != null) {\n const {\n prompt_tokens,\n completion_tokens,\n total_tokens,\n prompt_tokens_details,\n completion_tokens_details,\n } = chunkValue.usage;\n\n usage.promptTokens = prompt_tokens ?? undefined;\n usage.completionTokens = completion_tokens ?? undefined;\n usage.totalTokens = total_tokens ?? undefined;\n if (completion_tokens_details?.reasoning_tokens != null) {\n usage.completionTokensDetails.reasoningTokens =\n completion_tokens_details?.reasoning_tokens;\n }\n if (completion_tokens_details?.accepted_prediction_tokens != null) {\n usage.completionTokensDetails.acceptedPredictionTokens =\n completion_tokens_details?.accepted_prediction_tokens;\n }\n if (completion_tokens_details?.rejected_prediction_tokens != null) {\n usage.completionTokensDetails.rejectedPredictionTokens =\n completion_tokens_details?.rejected_prediction_tokens;\n }\n if (prompt_tokens_details?.cached_tokens != null) {\n usage.promptTokensDetails.cachedTokens = prompt_tokens_details?.cached_tokens;\n }\n }\n\n const choice = chunkValue.choices[0];\n\n if (choice?.finish_reason != null) {\n rawFinishReason = choice.finish_reason;\n finishReason = mapOpenAICompatibleFinishReason(choice.finish_reason);\n }\n\n if (choice?.delta == null) {\n return;\n }\n\n const delta = choice.delta;\n\n // enqueue reasoning before text deltas:\n if (delta.reasoning_content != null) {\n if (currentReasoningId == null) {\n currentReasoningId = generateId();\n // Enqueue reasoning-start event for the first reasoning delta\n controller.enqueue({\n type: 'reasoning-start',\n id: currentReasoningId,\n });\n }\n controller.enqueue({\n type: 'reasoning-delta',\n id: currentReasoningId,\n delta: delta.reasoning_content,\n });\n }\n\n if (delta.content != null) {\n if (currentTextId == null) {\n currentTextId = generateId();\n // Enqueue text-start event for the first text delta\n controller.enqueue({\n type: 'text-start',\n id: currentTextId,\n });\n }\n controller.enqueue({\n type: 'text-delta',\n id: currentTextId,\n delta: delta.content,\n });\n }\n\n if (delta.tool_calls != null) {\n for (const toolCallDelta of delta.tool_calls) {\n const index = toolCallDelta.index;\n // Tool call start. FriendliAI returns all information except the arguments in the first chunk.\n if (toolCalls[index] == null) {\n if (toolCallDelta.type !== 'function') {\n throw new InvalidResponseDataError({\n data: toolCallDelta,\n message: `Expected 'function' type.`,\n });\n }\n\n if (toolCallDelta.id == null) {\n throw new InvalidResponseDataError({\n data: toolCallDelta,\n message: `Expected 'id' to be a string.`,\n });\n }\n\n if (toolCallDelta.function?.name == null) {\n throw new InvalidResponseDataError({\n data: toolCallDelta,\n message: `Expected 'function.name' to be a string.`,\n });\n }\n\n toolCalls[index] = {\n id: toolCallDelta.id,\n type: 'function',\n function: {\n name: toolCallDelta.function.name,\n arguments: toolCallDelta.function.arguments ?? '',\n },\n hasFinished: false,\n };\n\n const toolCall = toolCalls[index];\n\n if (toolCall.function?.name != null && toolCall.function?.arguments != null) {\n // send delta if the argument text has already started:\n if (toolCall.function.arguments.length > 0) {\n controller.enqueue({\n type: 'tool-input-delta',\n id: toolCall.id,\n delta: toolCall.function.arguments,\n });\n }\n\n // check if tool call is complete\n // (some providers send the full tool call in one chunk):\n if (isParsableJson(toolCall.function.arguments)) {\n controller.enqueue({\n type: 'tool-call',\n toolCallId: toolCall.id ?? generateId(),\n toolName: toolCall.function.name,\n input: toolCall.function.arguments,\n });\n toolCall.hasFinished = true;\n }\n }\n\n continue;\n }\n\n // existing tool call, merge if not finished\n const toolCall = toolCalls[index];\n\n if (toolCall.hasFinished) {\n continue;\n }\n\n if (toolCallDelta.function?.arguments != null) {\n toolCall.function!.arguments += toolCallDelta.function?.arguments ?? '';\n }\n\n // send delta\n controller.enqueue({\n type: 'tool-input-delta',\n id: toolCall.id,\n delta: toolCallDelta.function?.arguments ?? '',\n });\n\n // check if tool call is complete\n if (\n toolCall.function?.name != null &&\n toolCall.function?.arguments != null &&\n isParsableJson(toolCall.function.arguments)\n ) {\n controller.enqueue({\n type: 'tool-call',\n toolCallId: toolCall.id ?? generateId(),\n toolName: toolCall.function.name,\n input: toolCall.function.arguments,\n });\n toolCall.hasFinished = true;\n }\n }\n }\n },\n\n flush(controller) {\n // Enqueue end events before finish event\n if (currentReasoningId != null) {\n controller.enqueue({\n type: 'reasoning-end',\n id: currentReasoningId,\n });\n }\n\n if (currentTextId != null) {\n controller.enqueue({\n type: 'text-end',\n id: currentTextId,\n });\n }\n\n const providerMetadata: SharedV3ProviderMetadata = {\n [providerOptionsName]: {},\n ...metadataExtractor?.buildMetadata(),\n };\n if (usage.completionTokensDetails.acceptedPredictionTokens != null) {\n providerMetadata[providerOptionsName].acceptedPredictionTokens =\n usage.completionTokensDetails.acceptedPredictionTokens;\n }\n if (usage.completionTokensDetails.rejectedPredictionTokens != null) {\n providerMetadata[providerOptionsName].rejectedPredictionTokens =\n usage.completionTokensDetails.rejectedPredictionTokens;\n }\n\n controller.enqueue({\n type: 'finish',\n finishReason: {\n unified: finishReason,\n raw: rawFinishReason,\n },\n usage: {\n inputTokens: {\n total: usage.promptTokens ?? undefined,\n noCache: undefined,\n cacheRead: usage.promptTokensDetails.cachedTokens ?? undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: usage.completionTokens ?? undefined,\n text: undefined,\n reasoning: usage.completionTokensDetails.reasoningTokens ?? undefined,\n },\n },\n providerMetadata,\n });\n },\n })\n ),\n request: { body },\n response: { headers: responseHeaders },\n };\n }\n}\n\nconst openaiCompatibleTokenUsageSchema = z\n .object({\n prompt_tokens: z.number().nullish(),\n completion_tokens: z.number().nullish(),\n total_tokens: z.number().nullish(),\n prompt_tokens_details: z\n .object({\n cached_tokens: z.number().nullish(),\n })\n .nullish(),\n completion_tokens_details: z\n .object({\n reasoning_tokens: z.number().nullish(),\n accepted_prediction_tokens: z.number().nullish(),\n rejected_prediction_tokens: z.number().nullish(),\n })\n .nullish(),\n })\n .nullish();\n\n// limited version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nconst OpenAICompatibleChatResponseSchema = z.object({\n id: z.string().nullish(),\n created: z.number().nullish(),\n model: z.string().nullish(),\n choices: z.array(\n z.object({\n message: z.object({\n role: z.literal('assistant').nullish(),\n content: z.string().nullish(),\n reasoning_content: z.string().nullish(),\n tool_calls: z\n .array(\n z.object({\n id: z.string().nullish(),\n type: z.literal('function'),\n function: z.object({\n name: z.string(),\n arguments: z.string(),\n }),\n })\n )\n .nullish(),\n }),\n finish_reason: z.string().nullish(),\n })\n ),\n usage: openaiCompatibleTokenUsageSchema,\n});\n\n// limited version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nconst createOpenAICompatibleChatChunkSchema = <ERROR_SCHEMA extends z.ZodType>(\n errorSchema: ERROR_SCHEMA\n) =>\n z.union([\n z.object({\n id: z.string().nullish(),\n created: z.number().nullish(),\n model: z.string().nullish(),\n choices: z.array(\n z.object({\n delta: z\n .object({\n role: z.enum(['assistant']).nullish(),\n content: z.string().nullish(),\n reasoning_content: z.string().nullish(),\n tool_calls: z\n .array(\n z.object({\n index: z.number(),\n id: z.string().nullish(),\n type: z.literal('function').nullish(),\n function: z.object({\n name: z.string().nullish(),\n arguments: z.string().nullish(),\n }),\n })\n )\n .nullish(),\n })\n .nullish(),\n finish_reason: z.string().nullish(),\n })\n ),\n usage: openaiCompatibleTokenUsageSchema,\n }),\n z.object({\n name: z.string(),\n status: z.enum(['ENDED', 'STARTED', 'ERRORED', 'UPDATING']),\n message: z.null(),\n parameters: z.array(\n z.object({\n name: z.string(),\n value: z.string(),\n })\n ),\n result: z.string().nullable(),\n error: z\n .object({\n type: z.enum(['INVALID_PARAMETER', 'UNKNOWN']),\n msg: z.string(),\n })\n .nullable(),\n timestamp: z.number(),\n usage: z.null(),\n tool_call_id: z.string().nullable(),\n }),\n errorSchema,\n ]);\n\nconst friendliProviderOptionsSchema = z.object({\n /**\n * Whether to enable parallel function calling during tool use. Default to true.\n */\n parallelToolCalls: z.boolean().nullish(),\n\n /**\n * BETA FEATURE: You can write a regular expression to force output that satisfies that regular expression.\n */\n // regex: z.instanceof(RegExp).nullish(),\n regex: z.string().nullish(),\n\n chat_template_kwargs: z.record(z.string(), z.any()).nullish(),\n\n /**\n * A scaling factor used to determine the minimum token probability threshold.\n */\n minP: z.number().nullish(),\n\n /**\n * Penalizes tokens that have already appeared in the generated result.\n */\n repetitionPenalty: z.number().nullish(),\n\n /**\n * A probability threshold used to identify “top choice” tokens for exclusion in XTC sampling.\n */\n xtcThreshold: z.number().nullish(),\n\n /**\n * The probability that XTC (Exclude Top Choices) filtering will be applied for each sampling decision.\n */\n xtcProbability: z.number().nullish(),\n});\n\nexport type FriendliProviderOptions = z.infer<typeof friendliProviderOptionsSchema>;\n","import { ProviderErrorStructure } from '@ai-sdk/openai-compatible';\nimport { APICallError } from '@ai-sdk/provider';\nimport { type ResponseHandler, safeParseJSON } from '@ai-sdk/provider-utils';\nimport { z } from 'zod';\n\nconst friendliErrorResponseSchema = z.object({\n message: z.string(),\n error: z.record(z.string(), z.any()).optional(),\n});\n\nconst openAIStyleErrorResponseSchema = z\n .object({\n error: z\n .object({\n message: z.string(),\n })\n .loose(),\n })\n .loose();\n\nexport const friendliaiErrorSchema = z.union([\n // OpenAI/OpenRouter style error: { \"error\": { \"message\": \"...\" } }\n openAIStyleErrorResponseSchema,\n // Friendli style error: { \"message\": \"...\", \"error\": { ... } }\n friendliErrorResponseSchema,\n]);\n\nexport type FriendliAIErrorData = z.infer<typeof friendliaiErrorSchema>;\n\nexport const friendliaiErrorStructure: ProviderErrorStructure<FriendliAIErrorData> = {\n errorSchema: friendliaiErrorSchema,\n errorToMessage: (data) => {\n if (\n typeof data === 'object' &&\n data != null &&\n 'error' in data &&\n typeof data.error === 'object' &&\n data.error != null &&\n 'message' in data.error &&\n typeof data.error.message === 'string'\n ) {\n return data.error.message;\n }\n\n if (\n typeof data === 'object' &&\n data != null &&\n 'message' in data &&\n typeof data.message === 'string'\n ) {\n return data.message;\n }\n\n return 'Unknown error';\n },\n};\n\nexport const friendliaiFailedResponseHandler: ResponseHandler<APICallError> = async ({\n response,\n url,\n requestBodyValues,\n}) => {\n const responseBody = await response.text();\n const responseHeaders: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n responseHeaders[key] = value;\n });\n\n const baseErrorOptions = {\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody,\n } as const;\n\n const trimmedBody = responseBody.trim();\n\n if (trimmedBody === '') {\n const fallback = response.statusText || `Request failed with status ${response.status}`;\n return {\n responseHeaders,\n value: new APICallError({\n message: fallback,\n ...baseErrorOptions,\n }),\n };\n }\n\n const parsedError = await safeParseJSON({\n text: responseBody,\n schema: friendliaiErrorSchema,\n });\n\n if (parsedError.success) {\n return {\n responseHeaders,\n value: new APICallError({\n message: friendliaiErrorStructure.errorToMessage(parsedError.value),\n data: parsedError.value,\n ...baseErrorOptions,\n }),\n };\n }\n\n const fallback =\n trimmedBody || response.statusText || `Request failed with status ${response.status}`;\n\n return {\n responseHeaders,\n value: new APICallError({\n message: fallback,\n cause: parsedError.error,\n ...baseErrorOptions,\n }),\n };\n};\n","import {\n LanguageModelV3CallOptions,\n SharedV3Warning,\n UnsupportedFunctionalityError,\n} from '@ai-sdk/provider';\n\nexport function prepareTools({\n tools,\n toolChoice,\n}: {\n tools: LanguageModelV3CallOptions['tools'];\n toolChoice?: LanguageModelV3CallOptions['toolChoice'];\n}): {\n tools:\n | undefined\n | Array<{\n type: string;\n files?: string[];\n }>\n | Array<{\n type: 'function';\n function: {\n name: string;\n description: string | undefined;\n parameters: unknown;\n };\n }>;\n toolChoice:\n | { type: 'function'; function: { name: string } }\n | 'auto'\n | 'none'\n | 'required'\n | undefined;\n toolWarnings: SharedV3Warning[];\n} {\n // when the tools array is empty, change it to undefined to prevent errors:\n tools = tools?.length ? tools : undefined;\n\n const toolWarnings: SharedV3Warning[] = [];\n\n if (tools == null) {\n return { tools: undefined, toolChoice: undefined, toolWarnings };\n }\n\n const openaiCompatTools: Array<\n | {\n type: 'function';\n function: {\n name: string;\n description: string | undefined;\n parameters: unknown;\n };\n }\n | {\n type: string;\n }\n > = [];\n\n for (const tool of tools) {\n if (tool.type === 'provider') {\n openaiCompatTools.push({\n // NOTE: Friendli tool-assisted API expects provider tool types like \"web:search\".\n // We derive it from the provider tool id (e.g. \"friendli.web:search\" -> \"web:search\")\n // instead of tool.name (often \"web_search\").\n type: tool.id.split('.')[1] ?? 'unknown',\n });\n } else {\n openaiCompatTools.push({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n },\n });\n }\n }\n\n if (toolChoice == null) {\n return { tools: openaiCompatTools, toolChoice: undefined, toolWarnings };\n }\n\n const type = toolChoice.type;\n\n switch (type) {\n case 'auto':\n case 'none':\n case 'required':\n return { tools: openaiCompatTools, toolChoice: type, toolWarnings };\n case 'tool':\n return {\n tools: openaiCompatTools,\n toolChoice: {\n type: 'function',\n function: { name: toolChoice.toolName },\n },\n toolWarnings,\n };\n default: {\n const _exhaustiveCheck: never = type;\n throw new UnsupportedFunctionalityError({\n functionality: `tool choice type: ${_exhaustiveCheck}`,\n });\n }\n }\n}\n","// https://friendli.ai/product/serverless-endpoints\n// Below is just a subset of the available models.\nexport const FriendliAIServerlessModelIds = [\n 'LGAI-EXAONE/K-EXAONE-236B-A23B',\n 'MiniMaxAI/MiniMax-M2',\n 'zai-org/GLM-4.6',\n 'LGAI-EXAONE/EXAONE-4.0.1-32B',\n 'skt/A.X-4.0',\n 'skt/A.X-3.1',\n 'naver-hyperclovax/HyperCLOVAX-SEED-Think-14B',\n 'deepseek-ai/DeepSeek-V3.1',\n 'deepseek-ai/DeepSeek-R1-0528',\n 'meta-llama/Llama-4-Maverick-17B-128E-Instruct',\n 'meta-llama/Llama-4-Scout-17B-16E-Instruct',\n 'meta-llama/Llama-3.3-70B-Instruct',\n 'meta-llama-3.3-70b-instruct',\n 'meta-llama/Llama-3.1-8B-Instruct',\n 'meta-llama-3.1-8b-instruct',\n 'Qwen/Qwen3-235B-A22B-Thinking-2507',\n 'Qwen/Qwen3-235B-A22B-Instruct-2507',\n 'Qwen/Qwen3-30B-A3B',\n 'Qwen/Qwen3-32B',\n 'google/gemma-3-27b-it',\n 'mistralai/Mistral-Small-3.1-24B-Instruct-2503',\n 'mistralai/Devstral-Small-2505',\n 'mistralai/Magistral-Small-2506',\n] as const;\n\nexport type FriendliAIServerlessModelId = (typeof FriendliAIServerlessModelIds)[number];\n\nexport type FriendliAILanguageModelId = FriendliAIServerlessModelId | (string & {});\n","import { createProviderToolFactoryWithOutputSchema, type Tool } from '@ai-sdk/provider-utils';\nimport { z } from 'zod';\n\n/**\n * Friendli built-in tools for serverless tool-assisted API.\n *\n * @remarks\n * These tools are currently in **Beta**. While we strive to provide a stable\n * and reliable experience, this feature is still under active development.\n *\n * @see https://friendli.ai/docs/guides/serverless_endpoints/tool-assisted-api\n */\n\nconst inputSchema = z.object({}).loose();\nconst outputSchema = z.unknown();\n\nexport const webSearchTool = createProviderToolFactoryWithOutputSchema({\n id: 'friendli.web:search',\n inputSchema,\n outputSchema,\n});\n\nexport const webUrlTool = createProviderToolFactoryWithOutputSchema({\n id: 'friendli.web:url',\n inputSchema,\n outputSchema,\n});\n\nexport const mathCalendarTool = createProviderToolFactoryWithOutputSchema({\n id: 'friendli.math:calendar',\n inputSchema,\n outputSchema,\n});\n\nexport const mathStatisticsTool = createProviderToolFactoryWithOutputSchema({\n id: 'friendli.math:statistics',\n inputSchema,\n outputSchema,\n});\n\nexport const mathCalculatorTool = createProviderToolFactoryWithOutputSchema({\n id: 'friendli.math:calculator',\n inputSchema,\n outputSchema,\n});\n\nexport const codePythonInterpreterTool = createProviderToolFactoryWithOutputSchema({\n id: 'friendli.code:python-interpreter',\n inputSchema,\n outputSchema,\n});\n\nexport const linkupSearchTool = createProviderToolFactoryWithOutputSchema({\n id: 'friendli.linkup:search',\n inputSchema,\n outputSchema,\n});\n\n/**\n * Web search tool - searches the web for information.\n * @beta\n */\nfunction webSearch(): Tool {\n return webSearchTool({});\n}\n\n/**\n * Web URL tool - fetches content from a specific URL.\n * @beta\n */\nfunction webUrl(): Tool {\n return webUrlTool({});\n}\n\n/**\n * Math calendar tool - performs calendar-related calculations.\n * @beta\n */\nfunction mathCalendar(): Tool {\n return mathCalendarTool({});\n}\n\n/**\n * Math statistics tool - performs statistical calculations.\n * @beta\n */\nfunction mathStatistics(): Tool {\n return mathStatisticsTool({});\n}\n\n/**\n * Math calculator tool - performs arithmetic calculations.\n * @beta\n */\nfunction mathCalculator(): Tool {\n return mathCalculatorTool({});\n}\n\n/**\n * Python interpreter tool - executes Python code.\n * @beta\n */\nfunction codePythonInterpreter(): Tool {\n return codePythonInterpreterTool({});\n}\n\n/**\n * Linkup search tool - searches the web for real-time information with citations.\n * @see https://www.linkup.so\n */\nfunction linkupSearch(): Tool {\n return linkupSearchTool({});\n}\n\nexport const friendliTools = {\n webSearch,\n webUrl,\n mathCalendar,\n mathStatistics,\n mathCalculator,\n codePythonInterpreter,\n linkupSearch,\n};\n","import { loadApiKey } from '@ai-sdk/provider-utils';\n\ntype Pricing = {\n inputToken?: number;\n outputToken?: number;\n responseTime?: number;\n unitType?: 'TOKEN' | 'SECOND';\n currency?: string;\n unit?: string;\n};\n\nexport type FriendliAvailableModel = {\n id: string;\n name?: string | null;\n description?: string | null;\n pricing?: Pricing;\n warm?: boolean;\n cold?: boolean;\n contextLength?: number | null;\n};\n\nexport type FriendliAvailableModelsResponse = {\n models: FriendliAvailableModel[];\n};\n\ntype GraphQLResponse<T> = {\n data?: T;\n errors?: Array<{ message: string }>;\n};\n\nconst DEFAULT_GRAPHQL_URL = 'https://api-internal.friendli.ai/api/graphql';\n\nasync function postGraphQL<T>(\n url: string,\n body: {\n query: string;\n variables?: Record<string, unknown>;\n operationName?: string;\n },\n headers: Record<string, string>\n): Promise<GraphQLResponse<T>> {\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n body: JSON.stringify(body),\n });\n\n let json: GraphQLResponse<T>;\n try {\n json = await res.json();\n } catch (err) {\n console.error(\n 'Failed to parse JSON response from Friendli API:',\n err,\n 'Status:',\n res.status,\n res.statusText\n );\n throw new Error(\n `Failed to parse JSON response from Friendli API: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n return json;\n}\n\ntype ServerlessEndpointEdge = {\n id: string;\n name?: string | null;\n status?: 'WARM' | 'COLD' | string | null;\n price?: {\n inputPrice?: number | null;\n outputPrice?: number | null;\n unit?: string | null;\n responseTimePrice?: number | null;\n priceUnitType?: 'TOKEN' | 'SECOND' | null;\n } | null;\n contextLength?: number | null;\n};\n\ntype ServerlessEndpointsQuery = {\n serverlessEndpoints?: {\n edges?: ServerlessEndpointEdge[];\n } | null;\n};\n\nfunction normalizePriceUnit(unit?: string | null): string | undefined {\n if (!unit) return undefined;\n return unit;\n}\n\nexport async function getAvailableModelsImpl(options: {\n apiKey?: string;\n teamId?: string;\n headers?: Record<string, string>;\n graphqlURL?: string;\n}): Promise<FriendliAvailableModelsResponse> {\n let token: string | undefined;\n try {\n token =\n options.apiKey ??\n loadApiKey({\n apiKey: undefined,\n environmentVariableName: 'FRIENDLI_TOKEN',\n description: 'FRIENDLI_TOKEN',\n });\n } catch {\n token = undefined;\n }\n\n const headers: Record<string, string> = {\n ...(token ? { Authorization: `Bearer ${token}` } : {}),\n ...(options.teamId ? { 'X-Friendli-Team': options.teamId } : {}),\n ...(options.headers ?? {}),\n };\n\n const url = options.graphqlURL ?? DEFAULT_GRAPHQL_URL;\n\n const query = `\n query Edges {\n serverlessEndpoints {\n edges {\n ... on ServerlessChatEndpointCatalog {\n id\n name\n status\n price {\n inputPrice\n outputPrice\n unit\n responseTimePrice\n priceUnitType\n }\n contextLength\n }\n }\n }\n }\n `;\n\n const resp = await postGraphQL<ServerlessEndpointsQuery>(\n url,\n { query, variables: {}, operationName: 'Edges' },\n headers\n );\n\n if (resp.errors && resp.errors.length > 0) {\n throw new Error(\n `getAvailableModels: GraphQL error: ${resp.errors.map((e) => e.message).join('; ')}`\n );\n }\n\n const edges = resp.data?.serverlessEndpoints?.edges ?? [];\n\n const models: FriendliAvailableModel[] = edges.map((e) => {\n const warm = e.status === 'WARM';\n const pricing: Pricing | undefined = e.price\n ? {\n inputToken: e.price.inputPrice ?? undefined,\n outputToken: e.price.outputPrice ?? undefined,\n responseTime: e.price.responseTimePrice ?? undefined,\n unitType: (e.price.priceUnitType ?? undefined) as 'TOKEN' | 'SECOND' | undefined,\n unit: normalizePriceUnit(e.price.unit),\n currency: 'USD',\n }\n : undefined;\n\n return {\n id: e.id,\n name: e.name ?? undefined,\n description: undefined,\n pricing,\n warm,\n cold: warm === false,\n contextLength: e.contextLength ?? undefined,\n };\n });\n\n return { models };\n}\n"],"mappings":"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","names":["loadApiKey","z","fallback","_a","toolCall","z","z","_a","_b","_c","_d","_e","_f","loadApiKey"]}
1
+ {"version":3,"sources":["../src/friendli-provider.ts","../src/friendli-chat-language-model.ts","../src/friendli-error.ts","../src/friendli-prepare-tools.ts","../src/friendli-settings.ts","../src/friendli-tools.ts","../src/get-available-models.ts"],"sourcesContent":["import { OpenAICompatibleCompletionLanguageModel } from '@ai-sdk/openai-compatible';\nimport {\n EmbeddingModelV3,\n ImageModelV3,\n LanguageModelV3,\n NoSuchModelError,\n ProviderV3,\n SpeechModelV3,\n TranscriptionModelV3,\n} from '@ai-sdk/provider';\nimport { FetchFunction, loadApiKey, withoutTrailingSlash } from '@ai-sdk/provider-utils';\n\nimport { FriendliAIChatLanguageModel } from './friendli-chat-language-model';\nimport { friendliaiErrorStructure } from './friendli-error';\nimport {\n FriendliAILanguageModelId,\n FriendliAIServerlessModelId,\n FriendliAIServerlessModelIds,\n} from './friendli-settings';\nimport { friendliTools } from './friendli-tools';\nimport type { FriendliAvailableModelsResponse } from './get-available-models';\nimport { getAvailableModelsImpl } from './get-available-models';\n\nexport interface FriendliAIProviderSettings {\n /**\n * FriendliAI API key. (FRIENDLI_TOKEN)\n */\n apiKey?: string;\n /**\n * Base URL for the API calls.\n */\n baseURL?: string | 'auto' | 'dedicated' | 'serverless' | 'serverless-tools';\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string>;\n /**\n * FriendliAI Team ID.\n */\n teamId?: string;\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept requests,\n * or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n /**\n * Whether to include usage information in the response.\n */\n includeUsage?: boolean;\n}\n\nexport interface FriendliAIProvider extends ProviderV3 {\n /**\n * Creates a model for text generation.\n */\n (modelId: FriendliAILanguageModelId): LanguageModelV3;\n /**\n * Creates a chat model for text generation.\n */\n languageModel(modelId: FriendliAILanguageModelId): LanguageModelV3;\n /**\n * Creates a chat model for text generation.\n */\n chat(modelId: FriendliAILanguageModelId): LanguageModelV3;\n /**\n * Creates a completion model for text generation.\n */\n completion(modelId: FriendliAILanguageModelId): LanguageModelV3;\n /**\n * Creates an embedding model for text generation.\n * TODO: Implement for Dedicated users\n */\n embedding(modelId: string & {}): LanguageModelV3;\n embeddingModel(modelId: string & {}): LanguageModelV3;\n /**\n * Returns the available models and their metadata.\n */\n getAvailableModels(options?: { graphqlURL?: string }): Promise<FriendliAvailableModelsResponse>;\n embedding(modelId: string & {}): EmbeddingModelV3;\n embeddingModel(modelId: string & {}): EmbeddingModelV3;\n /**\n * Creates a model for image generation.\n * TODO: Implement for Dedicated users\n */\n imageModel(modelId: string & {}): ImageModelV3;\n\n /**\n * Creates a model for transcription.\n * TODO: Implement for Dedicated users\n */\n transcription(modelId: string & {}): TranscriptionModelV3;\n\n /**\n * Creates a model for speech generation.\n * TODO: Implement for Dedicated users\n */\n speech(modelId: string & {}): SpeechModelV3;\n\n /**\n * Friendli-specific tools.\n */\n tools: typeof friendliTools;\n}\n\n/**\nCreate an FriendliAI provider instance.\n */\nexport function createFriendli(options: FriendliAIProviderSettings = {}): FriendliAIProvider {\n const getHeaders = () => ({\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'FRIENDLI_TOKEN',\n description: 'FRIENDLI_TOKEN',\n })}`,\n 'X-Friendli-Team': options.teamId,\n ...options.headers,\n });\n\n const baseURLAutoSelect = (\n modelId: string,\n baseURL: string | 'dedicated' | 'serverless' | 'serverless-tools' | undefined\n ): {\n baseURL: string;\n type: 'dedicated' | 'serverless' | 'serverless-tools' | 'custom';\n } => {\n const FriendliBaseURL = {\n serverless: 'https://api.friendli.ai/serverless/v1',\n serverless_tools: 'https://api.friendli.ai/serverless/tools/v1',\n dedicated: 'https://api.friendli.ai/dedicated/v1',\n };\n\n // Ignore options if baseURL is specified\n const customBaseURL = withoutTrailingSlash(baseURL);\n if (\n typeof customBaseURL === 'string' &&\n customBaseURL !== 'dedicated' &&\n customBaseURL !== 'serverless' &&\n customBaseURL !== 'serverless-tools'\n ) {\n return { baseURL: customBaseURL, type: 'custom' };\n }\n\n switch (baseURL) {\n case 'dedicated':\n return {\n baseURL: FriendliBaseURL.dedicated,\n type: 'dedicated',\n };\n case 'serverless':\n return {\n baseURL: FriendliBaseURL.serverless,\n type: 'serverless',\n };\n case 'serverless-tools':\n return {\n baseURL: FriendliBaseURL.serverless_tools,\n type: 'serverless-tools',\n };\n default:\n if (FriendliAIServerlessModelIds.includes(modelId as FriendliAIServerlessModelId)) {\n return {\n baseURL: FriendliBaseURL.serverless,\n type: 'serverless',\n };\n } else {\n return {\n baseURL: FriendliBaseURL.dedicated,\n type: 'dedicated',\n };\n }\n }\n };\n\n const createLanguageModel = (modelId: FriendliAILanguageModelId) => {\n const { baseURL, type } = baseURLAutoSelect(modelId, options.baseURL);\n\n return new FriendliAIChatLanguageModel(modelId, {\n provider: `friendliai.${type}.chat`,\n url: ({ path }: { path: string }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n includeUsage: options.includeUsage,\n });\n };\n\n const createCompletionModel = (modelId: FriendliAILanguageModelId) => {\n const { baseURL, type } = baseURLAutoSelect(modelId, options.baseURL);\n\n return new OpenAICompatibleCompletionLanguageModel(modelId, {\n provider: `friendliai.${type}.completion`,\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n errorStructure: friendliaiErrorStructure,\n });\n };\n\n const createTextEmbeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'embeddingModel' });\n };\n const createImageModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'imageModel' });\n };\n const createTranscriptionModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'languageModel' });\n };\n const createSpeechModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'languageModel' });\n };\n\n const provider = (modelId: FriendliAILanguageModelId) => createLanguageModel(modelId);\n\n provider.languageModel = createLanguageModel;\n provider.chat = createLanguageModel;\n provider.completion = createCompletionModel;\n\n // TODO: Implement for Dedicated users\n provider.embedding = createTextEmbeddingModel;\n provider.embeddingModel = createTextEmbeddingModel;\n (provider as unknown as FriendliAIProvider).getAvailableModels = async (opts?: {\n graphqlURL?: string;\n }) => {\n const defaultURL = 'https://api-internal.friendli.ai/api/graphql';\n const graphqlURL = opts?.graphqlURL ?? defaultURL;\n const apiKey = options.apiKey;\n const teamId = options.teamId;\n const headers = options.headers;\n return getAvailableModelsImpl({ apiKey, teamId, headers, graphqlURL });\n };\n provider.imageModel = createImageModel;\n provider.transcription = createTranscriptionModel;\n provider.speech = createSpeechModel;\n\n provider.tools = friendliTools;\n\n // 'getAvailableModels' is declared here.\n return provider as unknown as FriendliAIProvider;\n}\n\n/**\n * Default FriendliAI provider instance.\n */\nexport const friendli = createFriendli();\n","import { MetadataExtractor, ProviderErrorStructure } from '@ai-sdk/openai-compatible';\nimport {\n convertToOpenAICompatibleChatMessages,\n getResponseMetadata,\n mapOpenAICompatibleFinishReason,\n} from '@ai-sdk/openai-compatible/internal';\nimport {\n APICallError,\n InvalidResponseDataError,\n LanguageModelV3,\n LanguageModelV3Content,\n LanguageModelV3FinishReason,\n LanguageModelV3StreamPart,\n SharedV3ProviderMetadata,\n SharedV3Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createEventSourceResponseHandler,\n createJsonResponseHandler,\n FetchFunction,\n generateId,\n isParsableJson,\n ParseResult,\n parseProviderOptions,\n postJsonToApi,\n ResponseHandler,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nimport {\n friendliaiErrorSchema,\n friendliaiErrorStructure,\n friendliaiFailedResponseHandler,\n} from './friendli-error';\nimport { prepareTools } from './friendli-prepare-tools';\nimport { FriendliAILanguageModelId } from './friendli-settings';\n\nexport type OpenAICompatibleChatConfig = {\n provider: string;\n headers: () => Record<string, string | undefined>;\n url: (options: { modelId: string; path: string }) => string;\n fetch?: FetchFunction;\n includeUsage?: boolean;\n errorStructure?: ProviderErrorStructure<z.infer<typeof friendliaiErrorSchema>>;\n metadataExtractor?: MetadataExtractor;\n\n /**\n * Whether the model supports structured outputs.\n */\n supportsStructuredOutputs?: boolean;\n\n /**\n * The supported URLs for the model.\n */\n supportedUrls?: () => LanguageModelV3['supportedUrls'];\n};\n\ntype HostedToolExecutionChunk = {\n name: string;\n status: 'ENDED' | 'STARTED' | 'ERRORED' | 'UPDATING';\n message: null;\n parameters: Array<{ name: string; value: string }>;\n result: string | null;\n error: { type: 'INVALID_PARAMETER' | 'UNKNOWN'; msg: string } | null;\n timestamp: number;\n usage: null;\n tool_call_id: string | null;\n};\n\ntype OpenAIChatUsage = {\n prompt_tokens?: number | null;\n completion_tokens?: number | null;\n total_tokens?: number | null;\n prompt_tokens_details?: { cached_tokens?: number | null } | null;\n completion_tokens_details?: {\n reasoning_tokens?: number | null;\n accepted_prediction_tokens?: number | null;\n rejected_prediction_tokens?: number | null;\n } | null;\n};\n\ntype OpenAIChatToolCallDelta = {\n index: number;\n id?: string | null;\n type?: 'function' | null;\n function?: { name?: string | null; arguments?: string | null } | null;\n};\n\ntype OpenAIChatDelta = {\n role?: 'assistant' | null;\n content?: string | null;\n reasoning_content?: string | null;\n tool_calls?: OpenAIChatToolCallDelta[] | null;\n};\n\ntype OpenAIChatChoice = {\n delta?: OpenAIChatDelta | null;\n finish_reason?: string | null;\n};\n\ntype OpenAIChatChunk = {\n id?: string | null;\n created?: number | null;\n model?: string | null;\n choices: OpenAIChatChoice[];\n usage?: OpenAIChatUsage | null;\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value != null;\n}\n\nfunction isHostedToolExecutionChunk(value: unknown): value is HostedToolExecutionChunk {\n if (!isRecord(value)) return false;\n return (\n typeof value.status === 'string' &&\n typeof value.name === 'string' &&\n Array.isArray(value.parameters)\n );\n}\n\nfunction getChunkErrorMessage(value: unknown): string | undefined {\n if (!isRecord(value)) return undefined;\n\n if (typeof value.message === 'string') {\n return value.message;\n }\n\n const nestedError = value.error;\n if (isRecord(nestedError) && typeof nestedError.message === 'string') {\n return nestedError.message;\n }\n\n return undefined;\n}\n\nfunction isOpenAIChatChunk(value: unknown): value is OpenAIChatChunk {\n if (!isRecord(value)) return false;\n return Array.isArray(value.choices);\n}\n\nexport class FriendliAIChatLanguageModel implements LanguageModelV3 {\n readonly specificationVersion = 'v3';\n\n readonly supportsStructuredOutputs: boolean;\n\n readonly modelId: FriendliAILanguageModelId;\n // readonly settings: FriendliAIChatSettings\n\n private readonly config: OpenAICompatibleChatConfig;\n private readonly failedResponseHandler: ResponseHandler<APICallError>;\n private readonly chunkSchema; // type inferred via constructor\n\n constructor(modelId: FriendliAILanguageModelId, config: OpenAICompatibleChatConfig) {\n this.modelId = modelId;\n // this.settings = settings\n this.config = config;\n\n const errorStructure = friendliaiErrorStructure;\n this.chunkSchema = createOpenAICompatibleChatChunkSchema(errorStructure.errorSchema);\n\n this.failedResponseHandler = friendliaiFailedResponseHandler;\n\n this.supportsStructuredOutputs = config.supportsStructuredOutputs ?? true;\n }\n\n get provider(): string {\n return this.config.provider;\n }\n\n get supportedUrls() {\n return this.config.supportedUrls?.() ?? {};\n }\n private async getArgs({\n prompt,\n maxOutputTokens,\n temperature,\n topP,\n topK,\n frequencyPenalty,\n presencePenalty,\n providerOptions,\n stopSequences,\n responseFormat,\n seed,\n toolChoice,\n tools,\n stream,\n }: Parameters<LanguageModelV3['doGenerate']>[0] & {\n stream: boolean;\n }) {\n const warnings: SharedV3Warning[] = [];\n\n const friendliOptions = await parseProviderOptions({\n provider: 'friendliai',\n providerOptions,\n schema: friendliProviderOptionsSchema,\n });\n\n const legacyFriendliOptions = await parseProviderOptions({\n provider: 'friendli',\n providerOptions,\n schema: friendliProviderOptionsSchema,\n });\n\n const options = {\n ...legacyFriendliOptions,\n ...friendliOptions,\n };\n\n if (\n responseFormat?.type === 'json' &&\n responseFormat.schema != null &&\n !this.supportsStructuredOutputs\n ) {\n warnings.push({\n type: 'unsupported',\n feature: 'responseFormat',\n details: 'JSON response format schema is only supported with structuredOutputs',\n });\n }\n\n const {\n tools: openaiTools,\n toolChoice: openaiToolChoice,\n toolWarnings,\n } = prepareTools({\n tools,\n toolChoice,\n });\n\n const isToolsPresent = openaiTools != null && openaiTools.length > 0;\n\n if (isToolsPresent && (responseFormat != null || options?.regex != null)) {\n warnings.push({\n type: 'unsupported',\n feature: 'responseFormat',\n details: 'response_format is not supported when tools are present.',\n });\n }\n\n return {\n args: {\n // >>> hard-coded default options >>>\n parse_reasoning: true,\n // <<< hard-coded default options <<<\n\n model: this.modelId,\n\n // standardized settings:\n stream: stream,\n max_tokens: maxOutputTokens,\n temperature,\n top_p: topP,\n top_k: topK,\n frequency_penalty: frequencyPenalty,\n presence_penalty: presencePenalty,\n response_format:\n isToolsPresent === false\n ? responseFormat?.type === 'json'\n ? this.supportsStructuredOutputs === true && responseFormat.schema != null\n ? {\n type: 'json_schema',\n json_schema: {\n schema: responseFormat.schema,\n name: responseFormat.name ?? 'response',\n description: responseFormat.description,\n },\n }\n : { type: 'json_object' }\n : options?.regex != null\n ? {\n type: 'regex',\n schema: options.regex,\n }\n : undefined\n : undefined,\n\n stop: stopSequences,\n seed,\n\n min_p: options?.minP,\n repetition_penalty: options?.repetitionPenalty,\n xtc_threshold: options?.xtcThreshold,\n xtc_probability: options?.xtcProbability,\n\n ...(options?.chat_template_kwargs\n ? { chat_template_kwargs: options.chat_template_kwargs }\n : {}),\n\n // messages:\n messages: convertToOpenAICompatibleChatMessages(prompt),\n\n // tools:\n tools: openaiTools,\n tool_choice: openaiToolChoice,\n parallel_tool_calls: options?.parallelToolCalls,\n },\n warnings: [...warnings, ...toolWarnings],\n };\n }\n\n async doGenerate(\n options: Parameters<LanguageModelV3['doGenerate']>[0]\n ): Promise<Awaited<ReturnType<LanguageModelV3['doGenerate']>>> {\n const { args, warnings } = await this.getArgs({ ...options, stream: false });\n\n const body = JSON.stringify(args);\n\n const {\n responseHeaders,\n value: responseBody,\n rawValue: rawResponse,\n } = await postJsonToApi({\n url: this.config.url({\n path: '/chat/completions',\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers(), options.headers),\n body: args,\n failedResponseHandler: this.failedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(OpenAICompatibleChatResponseSchema),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const choice = responseBody.choices[0];\n const content: Array<LanguageModelV3Content> = [];\n\n // text content:\n const text = choice.message.content;\n if (text != null && text.length > 0) {\n content.push({ type: 'text', text });\n }\n\n // reasoning content:\n const reasoning = choice.message.reasoning_content;\n if (reasoning != null && reasoning.length > 0) {\n content.push({\n type: 'reasoning',\n text: reasoning,\n });\n }\n\n // tool calls:\n if (choice.message.tool_calls != null) {\n for (const toolCall of choice.message.tool_calls) {\n content.push({\n type: 'tool-call',\n toolCallId: toolCall.id ?? generateId(),\n toolName: toolCall.function.name,\n input: toolCall.function.arguments!,\n });\n }\n }\n\n return {\n content,\n finishReason: {\n unified: mapOpenAICompatibleFinishReason(choice.finish_reason),\n raw: choice.finish_reason ?? undefined,\n },\n usage: {\n inputTokens: {\n total: responseBody.usage?.prompt_tokens ?? undefined,\n noCache: undefined,\n cacheRead: responseBody.usage?.prompt_tokens_details?.cached_tokens ?? undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: responseBody.usage?.completion_tokens ?? undefined,\n text: undefined,\n reasoning: responseBody.usage?.completion_tokens_details?.reasoning_tokens ?? undefined,\n },\n },\n // providerMetadata,\n request: { body },\n response: {\n ...getResponseMetadata(responseBody),\n headers: responseHeaders,\n body: rawResponse,\n },\n warnings,\n };\n }\n\n async doStream(\n options: Parameters<LanguageModelV3['doStream']>[0]\n ): Promise<Awaited<ReturnType<LanguageModelV3['doStream']>>> {\n const { args, warnings } = await this.getArgs({ ...options, stream: true });\n\n const body = {\n ...args,\n stream: true,\n\n // only include stream_options when in strict compatibility mode:\n stream_options: this.config.includeUsage ? { include_usage: true } : undefined,\n };\n\n const metadataExtractor = this.config.metadataExtractor?.createStreamExtractor();\n\n const { responseHeaders, value: response } = await postJsonToApi({\n url: this.config.url({\n path: '/chat/completions',\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers(), options.headers),\n body,\n failedResponseHandler: this.failedResponseHandler,\n successfulResponseHandler: createEventSourceResponseHandler(this.chunkSchema),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const toolCalls: Array<{\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n hasFinished: boolean;\n }> = [];\n\n let finishReason: LanguageModelV3FinishReason = {\n unified: 'other',\n raw: undefined,\n };\n const usage: {\n completionTokens: number | undefined;\n completionTokensDetails: {\n reasoningTokens: number | undefined;\n acceptedPredictionTokens: number | undefined;\n rejectedPredictionTokens: number | undefined;\n };\n promptTokens: number | undefined;\n promptTokensDetails: {\n cachedTokens: number | undefined;\n };\n totalTokens: number | undefined;\n } = {\n completionTokens: undefined,\n completionTokensDetails: {\n reasoningTokens: undefined,\n acceptedPredictionTokens: undefined,\n rejectedPredictionTokens: undefined,\n },\n promptTokens: undefined,\n promptTokensDetails: {\n cachedTokens: undefined,\n },\n totalTokens: undefined,\n };\n let isFirstChunk = true;\n const providerOptionsName = 'friendliai';\n\n // Track IDs for text and reasoning events\n let currentTextId: string | null = null;\n let currentReasoningId: string | null = null;\n\n return {\n stream: response.pipeThrough(\n new TransformStream<\n ParseResult<z.infer<typeof this.chunkSchema>>,\n LanguageModelV3StreamPart\n >({\n start(controller) {\n controller.enqueue({ type: 'stream-start', warnings });\n },\n\n // NOTE: Chunk values can contain OpenAI-compatible deltas, hosted tool events, and error events.\n // We narrow with type guards for safe handling.\n transform(chunk, controller) {\n // handle failed chunk parsing / validation:\n if (!chunk.success) {\n finishReason = { unified: 'error', raw: undefined };\n controller.enqueue({ type: 'error', error: chunk.error });\n return;\n }\n const value: unknown = chunk.value;\n\n metadataExtractor?.processChunk(chunk.rawValue);\n\n // hosted tool execution case\n if (isHostedToolExecutionChunk(value)) {\n const toolCallId = value.tool_call_id ?? generateId();\n switch (value.status) {\n case 'STARTED':\n controller.enqueue({\n type: 'tool-call',\n toolCallId,\n toolName: value.name,\n input: JSON.stringify(\n Object.fromEntries(value.parameters.map((p) => [p.name, p.value]))\n ),\n providerExecuted: true,\n });\n break;\n\n case 'UPDATING':\n // Optionally handle progress if needed, but LanguageModelV3StreamPart doesn't have a direct \"progress\" type for tools\n break;\n\n case 'ENDED':\n controller.enqueue({\n type: 'tool-result',\n toolCallId,\n toolName: value.name,\n result: value.result ?? '',\n });\n break;\n\n case 'ERRORED':\n finishReason = { unified: 'error', raw: undefined };\n controller.enqueue({\n type: 'tool-result',\n toolCallId,\n toolName: value.name,\n result: value.error?.msg ?? 'Unknown error',\n isError: true,\n });\n break;\n\n default:\n finishReason = { unified: 'error', raw: undefined };\n controller.enqueue({\n type: 'error',\n error: new Error(`Unsupported tool call status: ${value.status}`),\n });\n }\n return;\n }\n\n const chunkErrorMessage = getChunkErrorMessage(value);\n if (chunkErrorMessage != null) {\n finishReason = { unified: 'error', raw: undefined };\n controller.enqueue({ type: 'error', error: chunkErrorMessage });\n return;\n }\n\n if (!isOpenAIChatChunk(value)) {\n finishReason = { unified: 'error', raw: undefined };\n controller.enqueue({\n type: 'error',\n error: new Error('Unsupported chunk shape'),\n });\n return;\n }\n\n const chunkValue = value;\n\n if (isFirstChunk) {\n isFirstChunk = false;\n\n controller.enqueue({\n type: 'response-metadata',\n ...getResponseMetadata(chunkValue),\n });\n }\n\n if (chunkValue.usage != null) {\n const {\n prompt_tokens,\n completion_tokens,\n total_tokens,\n prompt_tokens_details,\n completion_tokens_details,\n } = chunkValue.usage;\n\n usage.promptTokens = prompt_tokens ?? undefined;\n usage.completionTokens = completion_tokens ?? undefined;\n usage.totalTokens = total_tokens ?? undefined;\n if (completion_tokens_details?.reasoning_tokens != null) {\n usage.completionTokensDetails.reasoningTokens =\n completion_tokens_details?.reasoning_tokens;\n }\n if (completion_tokens_details?.accepted_prediction_tokens != null) {\n usage.completionTokensDetails.acceptedPredictionTokens =\n completion_tokens_details?.accepted_prediction_tokens;\n }\n if (completion_tokens_details?.rejected_prediction_tokens != null) {\n usage.completionTokensDetails.rejectedPredictionTokens =\n completion_tokens_details?.rejected_prediction_tokens;\n }\n if (prompt_tokens_details?.cached_tokens != null) {\n usage.promptTokensDetails.cachedTokens = prompt_tokens_details?.cached_tokens;\n }\n }\n\n const choice = chunkValue.choices[0];\n\n if (choice?.finish_reason != null) {\n finishReason = {\n unified: mapOpenAICompatibleFinishReason(choice.finish_reason),\n raw: choice.finish_reason,\n };\n }\n\n if (choice?.delta == null) {\n return;\n }\n\n const delta = choice.delta;\n\n // enqueue reasoning before text deltas:\n if (delta.reasoning_content != null) {\n if (currentReasoningId == null) {\n currentReasoningId = generateId();\n // Enqueue reasoning-start event for the first reasoning delta\n controller.enqueue({\n type: 'reasoning-start',\n id: currentReasoningId,\n });\n }\n controller.enqueue({\n type: 'reasoning-delta',\n id: currentReasoningId,\n delta: delta.reasoning_content,\n });\n }\n\n if (delta.content != null) {\n if (currentTextId == null) {\n currentTextId = generateId();\n // Enqueue text-start event for the first text delta\n controller.enqueue({\n type: 'text-start',\n id: currentTextId,\n });\n }\n controller.enqueue({\n type: 'text-delta',\n id: currentTextId,\n delta: delta.content,\n });\n }\n\n if (delta.tool_calls != null) {\n for (const toolCallDelta of delta.tool_calls) {\n const index = toolCallDelta.index;\n // Tool call start. FriendliAI returns all information except the arguments in the first chunk.\n if (toolCalls[index] == null) {\n if (toolCallDelta.type !== 'function') {\n throw new InvalidResponseDataError({\n data: toolCallDelta,\n message: `Expected 'function' type.`,\n });\n }\n\n if (toolCallDelta.id == null) {\n throw new InvalidResponseDataError({\n data: toolCallDelta,\n message: `Expected 'id' to be a string.`,\n });\n }\n\n if (toolCallDelta.function?.name == null) {\n throw new InvalidResponseDataError({\n data: toolCallDelta,\n message: `Expected 'function.name' to be a string.`,\n });\n }\n\n toolCalls[index] = {\n id: toolCallDelta.id,\n type: 'function',\n function: {\n name: toolCallDelta.function.name,\n arguments: toolCallDelta.function.arguments ?? '',\n },\n hasFinished: false,\n };\n\n const toolCall = toolCalls[index];\n\n if (toolCall.function?.name != null && toolCall.function?.arguments != null) {\n // send delta if the argument text has already started:\n if (toolCall.function.arguments.length > 0) {\n controller.enqueue({\n type: 'tool-input-delta',\n id: toolCall.id,\n delta: toolCall.function.arguments,\n });\n }\n\n // check if tool call is complete\n // (some providers send the full tool call in one chunk):\n if (isParsableJson(toolCall.function.arguments)) {\n controller.enqueue({\n type: 'tool-call',\n toolCallId: toolCall.id ?? generateId(),\n toolName: toolCall.function.name,\n input: toolCall.function.arguments,\n });\n toolCall.hasFinished = true;\n }\n }\n\n continue;\n }\n\n // existing tool call, merge if not finished\n const toolCall = toolCalls[index];\n\n if (toolCall.hasFinished) {\n continue;\n }\n\n if (toolCallDelta.function?.arguments != null) {\n toolCall.function!.arguments += toolCallDelta.function?.arguments ?? '';\n }\n\n // send delta\n controller.enqueue({\n type: 'tool-input-delta',\n id: toolCall.id,\n delta: toolCallDelta.function?.arguments ?? '',\n });\n\n // check if tool call is complete\n if (\n toolCall.function?.name != null &&\n toolCall.function?.arguments != null &&\n isParsableJson(toolCall.function.arguments)\n ) {\n controller.enqueue({\n type: 'tool-call',\n toolCallId: toolCall.id ?? generateId(),\n toolName: toolCall.function.name,\n input: toolCall.function.arguments,\n });\n toolCall.hasFinished = true;\n }\n }\n }\n },\n\n flush(controller) {\n // Emit end events before finish\n if (currentReasoningId != null) {\n controller.enqueue({\n type: 'reasoning-end',\n id: currentReasoningId,\n });\n }\n\n if (currentTextId != null) {\n controller.enqueue({\n type: 'text-end',\n id: currentTextId,\n });\n }\n\n const providerMetadata: SharedV3ProviderMetadata = {\n [providerOptionsName]: {},\n ...metadataExtractor?.buildMetadata(),\n };\n if (usage.completionTokensDetails.acceptedPredictionTokens != null) {\n providerMetadata[providerOptionsName].acceptedPredictionTokens =\n usage.completionTokensDetails.acceptedPredictionTokens;\n }\n if (usage.completionTokensDetails.rejectedPredictionTokens != null) {\n providerMetadata[providerOptionsName].rejectedPredictionTokens =\n usage.completionTokensDetails.rejectedPredictionTokens;\n }\n\n controller.enqueue({\n type: 'finish',\n finishReason,\n usage: {\n inputTokens: {\n total: usage.promptTokens ?? undefined,\n noCache: undefined,\n cacheRead: usage.promptTokensDetails.cachedTokens ?? undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: usage.completionTokens ?? undefined,\n text: undefined,\n reasoning: usage.completionTokensDetails.reasoningTokens ?? undefined,\n },\n },\n providerMetadata,\n });\n },\n })\n ),\n request: { body },\n response: { headers: responseHeaders },\n };\n }\n}\n\nconst openaiCompatibleTokenUsageSchema = z\n .object({\n prompt_tokens: z.number().nullish(),\n completion_tokens: z.number().nullish(),\n total_tokens: z.number().nullish(),\n prompt_tokens_details: z\n .object({\n cached_tokens: z.number().nullish(),\n })\n .nullish(),\n completion_tokens_details: z\n .object({\n reasoning_tokens: z.number().nullish(),\n accepted_prediction_tokens: z.number().nullish(),\n rejected_prediction_tokens: z.number().nullish(),\n })\n .nullish(),\n })\n .nullish();\n\n// limited version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nconst OpenAICompatibleChatResponseSchema = z.object({\n id: z.string().nullish(),\n created: z.number().nullish(),\n model: z.string().nullish(),\n choices: z.array(\n z.object({\n message: z.object({\n role: z.literal('assistant').nullish(),\n content: z.string().nullish(),\n reasoning_content: z.string().nullish(),\n tool_calls: z\n .array(\n z.object({\n id: z.string().nullish(),\n type: z.literal('function'),\n function: z.object({\n name: z.string(),\n arguments: z.string(),\n }),\n })\n )\n .nullish(),\n }),\n finish_reason: z.string().nullish(),\n })\n ),\n usage: openaiCompatibleTokenUsageSchema,\n});\n\n// limited version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nconst createOpenAICompatibleChatChunkSchema = <ERROR_SCHEMA extends z.ZodType>(\n errorSchema: ERROR_SCHEMA\n) =>\n z.union([\n z.object({\n id: z.string().nullish(),\n created: z.number().nullish(),\n model: z.string().nullish(),\n choices: z.array(\n z.object({\n delta: z\n .object({\n role: z.enum(['assistant']).nullish(),\n content: z.string().nullish(),\n reasoning_content: z.string().nullish(),\n tool_calls: z\n .array(\n z.object({\n index: z.number(),\n id: z.string().nullish(),\n type: z.literal('function').nullish(),\n function: z.object({\n name: z.string().nullish(),\n arguments: z.string().nullish(),\n }),\n })\n )\n .nullish(),\n })\n .nullish(),\n finish_reason: z.string().nullish(),\n })\n ),\n usage: openaiCompatibleTokenUsageSchema,\n }),\n z.object({\n name: z.string(),\n status: z.enum(['ENDED', 'STARTED', 'ERRORED', 'UPDATING']),\n message: z.null(),\n parameters: z.array(\n z.object({\n name: z.string(),\n value: z.string(),\n })\n ),\n result: z.string().nullable(),\n error: z\n .object({\n type: z.enum(['INVALID_PARAMETER', 'UNKNOWN']),\n msg: z.string(),\n })\n .nullable(),\n timestamp: z.number(),\n usage: z.null(),\n tool_call_id: z.string().nullable(),\n }),\n errorSchema,\n ]);\n\nconst friendliProviderOptionsSchema = z.object({\n /**\n * Whether to enable parallel function calling during tool use. Default to true.\n */\n parallelToolCalls: z.boolean().nullish(),\n\n /**\n * BETA FEATURE: You can write a regular expression to force output that satisfies that regular expression.\n */\n // regex: z.instanceof(RegExp).nullish(),\n regex: z.string().nullish(),\n\n chat_template_kwargs: z.record(z.string(), z.any()).nullish(),\n\n /**\n * A scaling factor used to determine the minimum token probability threshold.\n */\n minP: z.number().nullish(),\n\n /**\n * Penalizes tokens that have already appeared in the generated result.\n */\n repetitionPenalty: z.number().nullish(),\n\n /**\n * A probability threshold used to identify “top choice” tokens for exclusion in XTC sampling.\n */\n xtcThreshold: z.number().nullish(),\n\n /**\n * The probability that XTC (Exclude Top Choices) filtering will be applied for each sampling decision.\n */\n xtcProbability: z.number().nullish(),\n});\n\nexport type FriendliProviderOptions = z.infer<typeof friendliProviderOptionsSchema>;\n","import { ProviderErrorStructure } from '@ai-sdk/openai-compatible';\nimport { APICallError } from '@ai-sdk/provider';\nimport { type ResponseHandler, safeParseJSON } from '@ai-sdk/provider-utils';\nimport { z } from 'zod';\n\nconst friendliErrorResponseSchema = z.object({\n message: z.string(),\n error: z.record(z.string(), z.any()).optional(),\n});\n\nconst openAIStyleErrorResponseSchema = z\n .object({\n error: z\n .object({\n message: z.string(),\n })\n .loose(),\n })\n .loose();\n\nexport const friendliaiErrorSchema = z.union([\n // OpenAI/OpenRouter style error: { \"error\": { \"message\": \"...\" } }\n openAIStyleErrorResponseSchema,\n // Friendli style error: { \"message\": \"...\", \"error\": { ... } }\n friendliErrorResponseSchema,\n]);\n\nexport type FriendliAIErrorData = z.infer<typeof friendliaiErrorSchema>;\n\nexport const friendliaiErrorStructure: ProviderErrorStructure<FriendliAIErrorData> = {\n errorSchema: friendliaiErrorSchema,\n errorToMessage: (data) => {\n if (\n typeof data === 'object' &&\n data != null &&\n 'error' in data &&\n typeof data.error === 'object' &&\n data.error != null &&\n 'message' in data.error &&\n typeof data.error.message === 'string'\n ) {\n return data.error.message;\n }\n\n if (\n typeof data === 'object' &&\n data != null &&\n 'message' in data &&\n typeof data.message === 'string'\n ) {\n return data.message;\n }\n\n return 'Unknown error';\n },\n};\n\nexport const friendliaiFailedResponseHandler: ResponseHandler<APICallError> = async ({\n response,\n url,\n requestBodyValues,\n}) => {\n const responseBody = await response.text();\n const responseHeaders: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n responseHeaders[key] = value;\n });\n\n const baseErrorOptions = {\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody,\n } as const;\n\n const trimmedBody = responseBody.trim();\n\n if (trimmedBody === '') {\n const fallback = response.statusText || `Request failed with status ${response.status}`;\n return {\n responseHeaders,\n value: new APICallError({\n message: fallback,\n ...baseErrorOptions,\n }),\n };\n }\n\n const parsedError = await safeParseJSON({\n text: responseBody,\n schema: friendliaiErrorSchema,\n });\n\n if (parsedError.success) {\n return {\n responseHeaders,\n value: new APICallError({\n message: friendliaiErrorStructure.errorToMessage(parsedError.value),\n data: parsedError.value,\n ...baseErrorOptions,\n }),\n };\n }\n\n const fallback =\n trimmedBody || response.statusText || `Request failed with status ${response.status}`;\n\n return {\n responseHeaders,\n value: new APICallError({\n message: fallback,\n cause: parsedError.error,\n ...baseErrorOptions,\n }),\n };\n};\n","import {\n LanguageModelV3CallOptions,\n SharedV3Warning,\n UnsupportedFunctionalityError,\n} from '@ai-sdk/provider';\n\nexport function prepareTools({\n tools,\n toolChoice,\n}: {\n tools: LanguageModelV3CallOptions['tools'];\n toolChoice?: LanguageModelV3CallOptions['toolChoice'];\n}): {\n tools:\n | undefined\n | Array<{\n type: string;\n files?: string[];\n }>\n | Array<{\n type: 'function';\n function: {\n name: string;\n description: string | undefined;\n parameters: unknown;\n };\n }>;\n toolChoice:\n | { type: 'function'; function: { name: string } }\n | 'auto'\n | 'none'\n | 'required'\n | undefined;\n toolWarnings: SharedV3Warning[];\n} {\n // when the tools array is empty, change it to undefined to prevent errors:\n tools = tools?.length ? tools : undefined;\n\n const toolWarnings: SharedV3Warning[] = [];\n\n if (tools == null) {\n return { tools: undefined, toolChoice: undefined, toolWarnings };\n }\n\n const openaiCompatTools: Array<\n | {\n type: 'function';\n function: {\n name: string;\n description: string | undefined;\n parameters: unknown;\n };\n }\n | {\n type: string;\n }\n > = [];\n\n for (const tool of tools) {\n if (tool.type === 'provider') {\n openaiCompatTools.push({\n // NOTE: Friendli tool-assisted API expects provider tool types like \"web:search\".\n // We derive it from the provider tool id (e.g. \"friendli.web:search\" -> \"web:search\")\n // instead of tool.name (often \"web_search\").\n type: tool.id.split('.')[1] ?? 'unknown',\n });\n } else {\n openaiCompatTools.push({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n },\n });\n }\n }\n\n if (toolChoice == null) {\n return { tools: openaiCompatTools, toolChoice: undefined, toolWarnings };\n }\n\n const type = toolChoice.type;\n\n switch (type) {\n case 'auto':\n case 'none':\n case 'required':\n return { tools: openaiCompatTools, toolChoice: type, toolWarnings };\n case 'tool':\n return {\n tools: openaiCompatTools,\n toolChoice: {\n type: 'function',\n function: { name: toolChoice.toolName },\n },\n toolWarnings,\n };\n default: {\n const _exhaustiveCheck: never = type;\n throw new UnsupportedFunctionalityError({\n functionality: `tool choice type: ${_exhaustiveCheck}`,\n });\n }\n }\n}\n","// https://friendli.ai/product/serverless-endpoints\n// Below is just a subset of the available models.\nexport const FriendliAIServerlessModelIds = [\n 'LGAI-EXAONE/K-EXAONE-236B-A23B',\n 'MiniMaxAI/MiniMax-M2',\n 'zai-org/GLM-4.6',\n 'LGAI-EXAONE/EXAONE-4.0.1-32B',\n 'skt/A.X-4.0',\n 'skt/A.X-3.1',\n 'naver-hyperclovax/HyperCLOVAX-SEED-Think-14B',\n 'deepseek-ai/DeepSeek-V3.1',\n 'deepseek-ai/DeepSeek-R1-0528',\n 'meta-llama/Llama-4-Maverick-17B-128E-Instruct',\n 'meta-llama/Llama-4-Scout-17B-16E-Instruct',\n 'meta-llama/Llama-3.3-70B-Instruct',\n 'meta-llama-3.3-70b-instruct',\n 'meta-llama/Llama-3.1-8B-Instruct',\n 'meta-llama-3.1-8b-instruct',\n 'Qwen/Qwen3-235B-A22B-Thinking-2507',\n 'Qwen/Qwen3-235B-A22B-Instruct-2507',\n 'Qwen/Qwen3-30B-A3B',\n 'Qwen/Qwen3-32B',\n 'google/gemma-3-27b-it',\n 'mistralai/Mistral-Small-3.1-24B-Instruct-2503',\n 'mistralai/Devstral-Small-2505',\n 'mistralai/Magistral-Small-2506',\n] as const;\n\nexport type FriendliAIServerlessModelId = (typeof FriendliAIServerlessModelIds)[number];\n\nexport type FriendliAILanguageModelId = FriendliAIServerlessModelId | (string & {});\n","import { createProviderToolFactoryWithOutputSchema, type Tool } from '@ai-sdk/provider-utils';\nimport { z } from 'zod';\n\n/**\n * Friendli built-in tools for serverless tool-assisted API.\n *\n * @remarks\n * These tools are currently in **Beta**. While we strive to provide a stable\n * and reliable experience, this feature is still under active development.\n *\n * @see https://friendli.ai/docs/guides/serverless_endpoints/tool-assisted-api\n */\n\nconst inputSchema = z.object({}).loose();\nconst outputSchema = z.unknown();\n\nexport const webSearchTool = createProviderToolFactoryWithOutputSchema({\n id: 'friendli.web:search',\n inputSchema,\n outputSchema,\n});\n\nexport const webUrlTool = createProviderToolFactoryWithOutputSchema({\n id: 'friendli.web:url',\n inputSchema,\n outputSchema,\n});\n\nexport const mathCalendarTool = createProviderToolFactoryWithOutputSchema({\n id: 'friendli.math:calendar',\n inputSchema,\n outputSchema,\n});\n\nexport const mathStatisticsTool = createProviderToolFactoryWithOutputSchema({\n id: 'friendli.math:statistics',\n inputSchema,\n outputSchema,\n});\n\nexport const mathCalculatorTool = createProviderToolFactoryWithOutputSchema({\n id: 'friendli.math:calculator',\n inputSchema,\n outputSchema,\n});\n\nexport const codePythonInterpreterTool = createProviderToolFactoryWithOutputSchema({\n id: 'friendli.code:python-interpreter',\n inputSchema,\n outputSchema,\n});\n\nexport const linkupSearchTool = createProviderToolFactoryWithOutputSchema({\n id: 'friendli.linkup:search',\n inputSchema,\n outputSchema,\n});\n\n/**\n * Web search tool - searches the web for information.\n * @beta\n */\nfunction webSearch(): Tool {\n return webSearchTool({});\n}\n\n/**\n * Web URL tool - fetches content from a specific URL.\n * @beta\n */\nfunction webUrl(): Tool {\n return webUrlTool({});\n}\n\n/**\n * Math calendar tool - performs calendar-related calculations.\n * @beta\n */\nfunction mathCalendar(): Tool {\n return mathCalendarTool({});\n}\n\n/**\n * Math statistics tool - performs statistical calculations.\n * @beta\n */\nfunction mathStatistics(): Tool {\n return mathStatisticsTool({});\n}\n\n/**\n * Math calculator tool - performs arithmetic calculations.\n * @beta\n */\nfunction mathCalculator(): Tool {\n return mathCalculatorTool({});\n}\n\n/**\n * Python interpreter tool - executes Python code.\n * @beta\n */\nfunction codePythonInterpreter(): Tool {\n return codePythonInterpreterTool({});\n}\n\n/**\n * Linkup search tool - searches the web for real-time information with citations.\n * @see https://www.linkup.so\n */\nfunction linkupSearch(): Tool {\n return linkupSearchTool({});\n}\n\nexport const friendliTools = {\n webSearch,\n webUrl,\n mathCalendar,\n mathStatistics,\n mathCalculator,\n codePythonInterpreter,\n linkupSearch,\n};\n","import { loadApiKey } from '@ai-sdk/provider-utils';\n\ntype Pricing = {\n inputToken?: number;\n outputToken?: number;\n responseTime?: number;\n unitType?: 'TOKEN' | 'SECOND';\n currency?: string;\n unit?: string;\n};\n\nexport type FriendliAvailableModel = {\n id: string;\n name?: string | null;\n description?: string | null;\n pricing?: Pricing;\n warm?: boolean;\n cold?: boolean;\n contextLength?: number | null;\n};\n\nexport type FriendliAvailableModelsResponse = {\n models: FriendliAvailableModel[];\n};\n\ntype GraphQLResponse<T> = {\n data?: T;\n errors?: Array<{ message: string }>;\n};\n\nconst DEFAULT_GRAPHQL_URL = 'https://api-internal.friendli.ai/api/graphql';\n\nasync function postGraphQL<T>(\n url: string,\n body: {\n query: string;\n variables?: Record<string, unknown>;\n operationName?: string;\n },\n headers: Record<string, string>\n): Promise<GraphQLResponse<T>> {\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n body: JSON.stringify(body),\n });\n\n let json: GraphQLResponse<T>;\n try {\n json = await res.json();\n } catch (err) {\n console.error(\n 'Failed to parse JSON response from Friendli API:',\n err,\n 'Status:',\n res.status,\n res.statusText\n );\n throw new Error(\n `Failed to parse JSON response from Friendli API: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n return json;\n}\n\ntype ServerlessEndpointEdge = {\n id: string;\n name?: string | null;\n status?: 'WARM' | 'COLD' | string | null;\n price?: {\n inputPrice?: number | null;\n outputPrice?: number | null;\n unit?: string | null;\n responseTimePrice?: number | null;\n priceUnitType?: 'TOKEN' | 'SECOND' | null;\n } | null;\n contextLength?: number | null;\n};\n\ntype ServerlessEndpointsQuery = {\n serverlessEndpoints?: {\n edges?: ServerlessEndpointEdge[];\n } | null;\n};\n\nfunction normalizePriceUnit(unit?: string | null): string | undefined {\n if (!unit) return undefined;\n return unit;\n}\n\nexport async function getAvailableModelsImpl(options: {\n apiKey?: string;\n teamId?: string;\n headers?: Record<string, string>;\n graphqlURL?: string;\n}): Promise<FriendliAvailableModelsResponse> {\n let token: string | undefined;\n try {\n token =\n options.apiKey ??\n loadApiKey({\n apiKey: undefined,\n environmentVariableName: 'FRIENDLI_TOKEN',\n description: 'FRIENDLI_TOKEN',\n });\n } catch {\n token = undefined;\n }\n\n const headers: Record<string, string> = {\n ...(token ? { Authorization: `Bearer ${token}` } : {}),\n ...(options.teamId ? { 'X-Friendli-Team': options.teamId } : {}),\n ...(options.headers ?? {}),\n };\n\n const url = options.graphqlURL ?? DEFAULT_GRAPHQL_URL;\n\n const query = `\n query Edges {\n serverlessEndpoints {\n edges {\n ... on ServerlessChatEndpointCatalog {\n id\n name\n status\n price {\n inputPrice\n outputPrice\n unit\n responseTimePrice\n priceUnitType\n }\n contextLength\n }\n }\n }\n }\n `;\n\n const resp = await postGraphQL<ServerlessEndpointsQuery>(\n url,\n { query, variables: {}, operationName: 'Edges' },\n headers\n );\n\n if (resp.errors && resp.errors.length > 0) {\n throw new Error(\n `getAvailableModels: GraphQL error: ${resp.errors.map((e) => e.message).join('; ')}`\n );\n }\n\n const edges = resp.data?.serverlessEndpoints?.edges ?? [];\n\n const models: FriendliAvailableModel[] = edges.map((e) => {\n const warm = e.status === 'WARM';\n const pricing: Pricing | undefined = e.price\n ? {\n inputToken: e.price.inputPrice ?? undefined,\n outputToken: e.price.outputPrice ?? undefined,\n responseTime: e.price.responseTimePrice ?? undefined,\n unitType: (e.price.priceUnitType ?? undefined) as 'TOKEN' | 'SECOND' | undefined,\n unit: normalizePriceUnit(e.price.unit),\n currency: 'USD',\n }\n : undefined;\n\n return {\n id: e.id,\n name: e.name ?? undefined,\n description: undefined,\n pricing,\n warm,\n cold: warm === false,\n contextLength: e.contextLength ?? undefined,\n };\n });\n\n return { models };\n}\n"],"mappings":"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","names":["loadApiKey","z","fallback","_a","toolCall","z","z","_a","_b","_c","_d","_e","_f","loadApiKey"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@friendliai/ai-provider",
3
- "version": "1.0.2",
3
+ "version": "1.0.3",
4
4
  "license": "Apache-2.0",
5
5
  "sideEffects": false,
6
6
  "main": "./dist/index.js",