@friendliai/ai-provider 1.1.8 → 1.1.10

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,18 @@
1
1
  # @friendliai/ai-provider
2
2
 
3
+ ## 1.1.10
4
+
5
+ ### Patch Changes
6
+
7
+ - e177dc2: Add GLM-5.1 to FSE model list
8
+
9
+ ## 1.1.9
10
+
11
+ ### Patch Changes
12
+
13
+ - 6e806c2: update whisper-large-v3
14
+ - 6e806c2: update get-available-model
15
+
3
16
  ## 1.1.8
4
17
 
5
18
  ### Patch Changes
@@ -77,6 +90,7 @@
77
90
  This change fixes the streaming implementation to properly comply with the AI SDK v6 LanguageModelV3 protocol:
78
91
 
79
92
  **Fixed Issues:**
93
+
80
94
  - Added missing `text-start` and `reasoning-start` events at the beginning of content blocks
81
95
  - Changed incorrect event types from `text-part-finish` to `text-end` and `reasoning-part-finish` to `reasoning-end`
82
96
  - Implemented consistent ID tracking across the entire content block lifecycle
package/dist/index.d.mts CHANGED
@@ -12,7 +12,7 @@ declare const friendliaiErrorSchema: z.ZodUnion<readonly [z.ZodObject<{
12
12
  }, z.core.$strip>]>;
13
13
  type FriendliAIErrorData = z.infer<typeof friendliaiErrorSchema>;
14
14
 
15
- declare const FriendliAIServerlessModelIds: readonly ["LGAI-EXAONE/K-EXAONE-236B-A23B", "MiniMaxAI/MiniMax-M2.5", "MiniMaxAI/MiniMax-M2.1", "zai-org/GLM-5", "zai-org/GLM-4.7", "meta-llama/Llama-3.3-70B-Instruct", "meta-llama-3.3-70b-instruct", "meta-llama/Llama-3.1-8B-Instruct", "meta-llama-3.1-8b-instruct", "Qwen/Qwen3-235B-A22B-Instruct-2507", "Qwen/Qwen3-30B-A3B", "deepseek-ai/DeepSeek-V3.2", "deepseek-ai/DeepSeek-V3.1"];
15
+ declare const FriendliAIServerlessModelIds: readonly ["openai/whisper-large-v3", "LGAI-EXAONE/K-EXAONE-236B-A23B", "MiniMaxAI/MiniMax-M2.5", "MiniMaxAI/MiniMax-M2.1", "zai-org/GLM-5.1", "zai-org/GLM-5", "zai-org/GLM-4.7", "meta-llama/Llama-3.3-70B-Instruct", "meta-llama-3.3-70b-instruct", "meta-llama/Llama-3.1-8B-Instruct", "meta-llama-3.1-8b-instruct", "Qwen/Qwen3-235B-A22B-Instruct-2507", "Qwen/Qwen3-30B-A3B", "deepseek-ai/DeepSeek-V3.2", "deepseek-ai/DeepSeek-V3.1"];
16
16
  type FriendliAIServerlessModelId = (typeof FriendliAIServerlessModelIds)[number];
17
17
  type FriendliAILanguageModelId = FriendliAIServerlessModelId | (string & {});
18
18
 
@@ -66,7 +66,8 @@ type Pricing = {
66
66
  cachedInputToken?: number;
67
67
  outputToken?: number;
68
68
  responseTime?: number;
69
- unitType?: 'TOKEN' | 'SECOND';
69
+ audioMinute?: number;
70
+ unitType?: 'TOKEN' | 'SECOND' | 'AUDIO_MINUTE';
70
71
  currency?: string;
71
72
  unit?: string;
72
73
  };
package/dist/index.d.ts CHANGED
@@ -12,7 +12,7 @@ declare const friendliaiErrorSchema: z.ZodUnion<readonly [z.ZodObject<{
12
12
  }, z.core.$strip>]>;
13
13
  type FriendliAIErrorData = z.infer<typeof friendliaiErrorSchema>;
14
14
 
15
- declare const FriendliAIServerlessModelIds: readonly ["LGAI-EXAONE/K-EXAONE-236B-A23B", "MiniMaxAI/MiniMax-M2.5", "MiniMaxAI/MiniMax-M2.1", "zai-org/GLM-5", "zai-org/GLM-4.7", "meta-llama/Llama-3.3-70B-Instruct", "meta-llama-3.3-70b-instruct", "meta-llama/Llama-3.1-8B-Instruct", "meta-llama-3.1-8b-instruct", "Qwen/Qwen3-235B-A22B-Instruct-2507", "Qwen/Qwen3-30B-A3B", "deepseek-ai/DeepSeek-V3.2", "deepseek-ai/DeepSeek-V3.1"];
15
+ declare const FriendliAIServerlessModelIds: readonly ["openai/whisper-large-v3", "LGAI-EXAONE/K-EXAONE-236B-A23B", "MiniMaxAI/MiniMax-M2.5", "MiniMaxAI/MiniMax-M2.1", "zai-org/GLM-5.1", "zai-org/GLM-5", "zai-org/GLM-4.7", "meta-llama/Llama-3.3-70B-Instruct", "meta-llama-3.3-70b-instruct", "meta-llama/Llama-3.1-8B-Instruct", "meta-llama-3.1-8b-instruct", "Qwen/Qwen3-235B-A22B-Instruct-2507", "Qwen/Qwen3-30B-A3B", "deepseek-ai/DeepSeek-V3.2", "deepseek-ai/DeepSeek-V3.1"];
16
16
  type FriendliAIServerlessModelId = (typeof FriendliAIServerlessModelIds)[number];
17
17
  type FriendliAILanguageModelId = FriendliAIServerlessModelId | (string & {});
18
18
 
@@ -66,7 +66,8 @@ type Pricing = {
66
66
  cachedInputToken?: number;
67
67
  outputToken?: number;
68
68
  responseTime?: number;
69
- unitType?: 'TOKEN' | 'SECOND';
69
+ audioMinute?: number;
70
+ unitType?: 'TOKEN' | 'SECOND' | 'AUDIO_MINUTE';
70
71
  currency?: string;
71
72
  unit?: string;
72
73
  };
package/dist/index.js CHANGED
@@ -855,9 +855,11 @@ var friendliProviderOptionsSchema = import_v4.z.object({
855
855
 
856
856
  // src/friendli-settings.ts
857
857
  var FriendliAIServerlessModelIds = [
858
+ "openai/whisper-large-v3",
858
859
  "LGAI-EXAONE/K-EXAONE-236B-A23B",
859
860
  "MiniMaxAI/MiniMax-M2.5",
860
861
  "MiniMaxAI/MiniMax-M2.1",
862
+ "zai-org/GLM-5.1",
861
863
  "zai-org/GLM-5",
862
864
  "zai-org/GLM-4.7",
863
865
  "meta-llama/Llama-3.3-70B-Instruct",
@@ -1004,6 +1006,7 @@ async function getAvailableModelsImpl(options) {
1004
1006
  inputPrice
1005
1007
  cachedInputPrice
1006
1008
  outputPrice
1009
+ audioMinutePrice
1007
1010
  unit
1008
1011
  responseTimePrice
1009
1012
  priceUnitType
@@ -1026,25 +1029,26 @@ async function getAvailableModelsImpl(options) {
1026
1029
  }
1027
1030
  const edges = (_f = (_e = (_d = resp.data) == null ? void 0 : _d.serverlessEndpoints) == null ? void 0 : _e.edges) != null ? _f : [];
1028
1031
  const models = edges.map((e) => {
1029
- var _a2, _b2, _c2, _d2, _e2, _f2, _g;
1032
+ var _a2, _b2, _c2, _d2, _e2, _f2, _g, _h;
1030
1033
  const warm = e.status === "WARM";
1031
1034
  const pricing = e.price ? {
1032
1035
  inputToken: (_a2 = e.price.inputPrice) != null ? _a2 : void 0,
1033
1036
  cachedInputToken: (_b2 = e.price.cachedInputPrice) != null ? _b2 : void 0,
1034
1037
  outputToken: (_c2 = e.price.outputPrice) != null ? _c2 : void 0,
1035
1038
  responseTime: (_d2 = e.price.responseTimePrice) != null ? _d2 : void 0,
1036
- unitType: (_e2 = e.price.priceUnitType) != null ? _e2 : void 0,
1039
+ audioMinute: (_e2 = e.price.audioMinutePrice) != null ? _e2 : void 0,
1040
+ unitType: (_f2 = e.price.priceUnitType) != null ? _f2 : void 0,
1037
1041
  unit: normalizePriceUnit(e.price.unit),
1038
1042
  currency: "USD"
1039
1043
  } : void 0;
1040
1044
  return {
1041
1045
  id: e.id,
1042
- name: (_f2 = e.name) != null ? _f2 : void 0,
1046
+ name: (_g = e.name) != null ? _g : void 0,
1043
1047
  description: void 0,
1044
1048
  pricing,
1045
1049
  warm,
1046
1050
  cold: warm === false,
1047
- contextLength: (_g = e.contextLength) != null ? _g : void 0
1051
+ contextLength: (_h = e.contextLength) != null ? _h : void 0
1048
1052
  };
1049
1053
  });
1050
1054
  return { models };
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 convertOpenAICompatibleChatUsage,\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 LanguageModelV3Prompt,\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 tryWrapFriendliJsonEnvelopeError,\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\n/**\n * Adds reasoning_content field to assistant messages for interleaved thinking support.\n * This enables models like MiniMax-M2.5, GLM-5 to maintain reasoning context across conversation turns.\n *\n * Note: We use `reasoning_content` which is consistent with FriendliAI's response format.\n */\nfunction addReasoningToMessages<T extends Array<{ role: string; reasoning_content?: string }>>(\n prompt: LanguageModelV3Prompt,\n messages: T\n): T {\n // Track assistant message indices in both arrays\n let promptAssistantIndex = 0;\n\n for (const promptMessage of prompt) {\n if (promptMessage.role === 'assistant') {\n // Extract reasoning from the original prompt\n const reasoningText = promptMessage.content\n .filter((part): part is { type: 'reasoning'; text: string } => part.type === 'reasoning')\n .map((part) => part.text)\n .join('\\n');\n\n if (reasoningText) {\n // Find the corresponding assistant message in converted messages\n let messagesAssistantIndex = 0;\n for (let i = 0; i < messages.length; i++) {\n if (messages[i].role === 'assistant') {\n if (messagesAssistantIndex === promptAssistantIndex) {\n messages[i].reasoning_content = reasoningText;\n break;\n }\n messagesAssistantIndex++;\n }\n }\n }\n promptAssistantIndex++;\n }\n }\n\n return messages;\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 // Use addReasoningToMessages to include reasoning_content in assistant messages\n // for interleaved thinking support\n messages: addReasoningToMessages(prompt, 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 response = await (async () => {\n try {\n return 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 } catch (error) {\n const wrappedError = await tryWrapFriendliJsonEnvelopeError(error);\n\n if (wrappedError != null) {\n throw wrappedError;\n }\n\n throw error;\n }\n })();\n\n const { responseHeaders, value: responseBody, rawValue: rawResponse } = response;\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: convertOpenAICompatibleChatUsage(responseBody.usage),\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 let usage: z.infer<typeof openaiCompatibleTokenUsageSchema> | undefined = undefined;\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 if (options.includeRawChunks) {\n controller.enqueue({ type: 'raw', rawValue: chunk.rawValue });\n }\n\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 usage = chunkValue.usage;\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 controller.enqueue({\n type: 'tool-input-start',\n id: toolCallDelta.id,\n toolName: toolCallDelta.function.name,\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-input-end',\n id: toolCall.id,\n });\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 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-input-end',\n id: toolCall.id,\n });\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 for (const toolCall of toolCalls.filter(\n (pendingToolCall) => !pendingToolCall.hasFinished\n )) {\n controller.enqueue({\n type: 'tool-input-end',\n id: toolCall.id,\n });\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 }\n\n const providerMetadata: SharedV3ProviderMetadata = {\n [providerOptionsName]: {},\n ...metadataExtractor?.buildMetadata(),\n };\n if (usage?.completion_tokens_details?.accepted_prediction_tokens != null) {\n providerMetadata[providerOptionsName].acceptedPredictionTokens =\n usage.completion_tokens_details.accepted_prediction_tokens;\n }\n if (usage?.completion_tokens_details?.rejected_prediction_tokens != null) {\n providerMetadata[providerOptionsName].rejectedPredictionTokens =\n usage.completion_tokens_details.rejected_prediction_tokens;\n }\n\n controller.enqueue({\n type: 'finish',\n finishReason,\n usage: convertOpenAICompatibleChatUsage(usage),\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\nexport const tryWrapFriendliJsonEnvelopeError = async (\n error: unknown\n): Promise<APICallError | undefined> => {\n if (!APICallError.isInstance(error)) {\n return undefined;\n }\n\n const responseBody = error.responseBody;\n\n if (typeof responseBody !== 'string' || responseBody.trim() === '') {\n return undefined;\n }\n\n const parsedError = await safeParseJSON({\n text: responseBody,\n schema: friendliaiErrorSchema,\n });\n\n if (!parsedError.success) {\n return undefined;\n }\n\n return new APICallError({\n message: friendliaiErrorStructure.errorToMessage(parsedError.value),\n url: error.url,\n requestBodyValues: error.requestBodyValues,\n statusCode: error.statusCode,\n responseHeaders: error.responseHeaders,\n responseBody: error.responseBody,\n cause: error,\n isRetryable: error.isRetryable,\n data: parsedError.value,\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.5',\n 'MiniMaxAI/MiniMax-M2.1',\n 'zai-org/GLM-5',\n 'zai-org/GLM-4.7',\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-Instruct-2507',\n 'Qwen/Qwen3-30B-A3B',\n 'deepseek-ai/DeepSeek-V3.2',\n 'deepseek-ai/DeepSeek-V3.1',\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 cachedInputToken?: 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 cachedInputPrice?: 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 cachedInputPrice\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 cachedInputToken: e.price.cachedInputPrice ?? 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"]}
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 convertOpenAICompatibleChatUsage,\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 LanguageModelV3Prompt,\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 tryWrapFriendliJsonEnvelopeError,\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\n/**\n * Adds reasoning_content field to assistant messages for interleaved thinking support.\n * This enables models like MiniMax-M2.5, GLM-5.1 to maintain reasoning context across conversation turns.\n *\n * Note: We use `reasoning_content` which is consistent with FriendliAI's response format.\n */\nfunction addReasoningToMessages<T extends Array<{ role: string; reasoning_content?: string }>>(\n prompt: LanguageModelV3Prompt,\n messages: T\n): T {\n // Track assistant message indices in both arrays\n let promptAssistantIndex = 0;\n\n for (const promptMessage of prompt) {\n if (promptMessage.role === 'assistant') {\n // Extract reasoning from the original prompt\n const reasoningText = promptMessage.content\n .filter((part): part is { type: 'reasoning'; text: string } => part.type === 'reasoning')\n .map((part) => part.text)\n .join('\\n');\n\n if (reasoningText) {\n // Find the corresponding assistant message in converted messages\n let messagesAssistantIndex = 0;\n for (let i = 0; i < messages.length; i++) {\n if (messages[i].role === 'assistant') {\n if (messagesAssistantIndex === promptAssistantIndex) {\n messages[i].reasoning_content = reasoningText;\n break;\n }\n messagesAssistantIndex++;\n }\n }\n }\n promptAssistantIndex++;\n }\n }\n\n return messages;\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 // Use addReasoningToMessages to include reasoning_content in assistant messages\n // for interleaved thinking support\n messages: addReasoningToMessages(prompt, 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 response = await (async () => {\n try {\n return 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 } catch (error) {\n const wrappedError = await tryWrapFriendliJsonEnvelopeError(error);\n\n if (wrappedError != null) {\n throw wrappedError;\n }\n\n throw error;\n }\n })();\n\n const { responseHeaders, value: responseBody, rawValue: rawResponse } = response;\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: convertOpenAICompatibleChatUsage(responseBody.usage),\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 let usage: z.infer<typeof openaiCompatibleTokenUsageSchema> | undefined = undefined;\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 if (options.includeRawChunks) {\n controller.enqueue({ type: 'raw', rawValue: chunk.rawValue });\n }\n\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 usage = chunkValue.usage;\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 controller.enqueue({\n type: 'tool-input-start',\n id: toolCallDelta.id,\n toolName: toolCallDelta.function.name,\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-input-end',\n id: toolCall.id,\n });\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 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-input-end',\n id: toolCall.id,\n });\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 for (const toolCall of toolCalls.filter(\n (pendingToolCall) => !pendingToolCall.hasFinished\n )) {\n controller.enqueue({\n type: 'tool-input-end',\n id: toolCall.id,\n });\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 }\n\n const providerMetadata: SharedV3ProviderMetadata = {\n [providerOptionsName]: {},\n ...metadataExtractor?.buildMetadata(),\n };\n if (usage?.completion_tokens_details?.accepted_prediction_tokens != null) {\n providerMetadata[providerOptionsName].acceptedPredictionTokens =\n usage.completion_tokens_details.accepted_prediction_tokens;\n }\n if (usage?.completion_tokens_details?.rejected_prediction_tokens != null) {\n providerMetadata[providerOptionsName].rejectedPredictionTokens =\n usage.completion_tokens_details.rejected_prediction_tokens;\n }\n\n controller.enqueue({\n type: 'finish',\n finishReason,\n usage: convertOpenAICompatibleChatUsage(usage),\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\nexport const tryWrapFriendliJsonEnvelopeError = async (\n error: unknown\n): Promise<APICallError | undefined> => {\n if (!APICallError.isInstance(error)) {\n return undefined;\n }\n\n const responseBody = error.responseBody;\n\n if (typeof responseBody !== 'string' || responseBody.trim() === '') {\n return undefined;\n }\n\n const parsedError = await safeParseJSON({\n text: responseBody,\n schema: friendliaiErrorSchema,\n });\n\n if (!parsedError.success) {\n return undefined;\n }\n\n return new APICallError({\n message: friendliaiErrorStructure.errorToMessage(parsedError.value),\n url: error.url,\n requestBodyValues: error.requestBodyValues,\n statusCode: error.statusCode,\n responseHeaders: error.responseHeaders,\n responseBody: error.responseBody,\n cause: error,\n isRetryable: error.isRetryable,\n data: parsedError.value,\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 'openai/whisper-large-v3',\n 'LGAI-EXAONE/K-EXAONE-236B-A23B',\n 'MiniMaxAI/MiniMax-M2.5',\n 'MiniMaxAI/MiniMax-M2.1',\n 'zai-org/GLM-5.1',\n 'zai-org/GLM-5',\n 'zai-org/GLM-4.7',\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-Instruct-2507',\n 'Qwen/Qwen3-30B-A3B',\n 'deepseek-ai/DeepSeek-V3.2',\n 'deepseek-ai/DeepSeek-V3.1',\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 cachedInputToken?: number;\n outputToken?: number;\n responseTime?: number;\n audioMinute?: number;\n unitType?: 'TOKEN' | 'SECOND' | 'AUDIO_MINUTE';\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 cachedInputPrice?: number | null;\n outputPrice?: number | null;\n audioMinutePrice?: number | null;\n unit?: string | null;\n responseTimePrice?: number | null;\n priceUnitType?: 'TOKEN' | 'SECOND' | 'AUDIO_MINUTE' | 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 cachedInputPrice\n outputPrice\n audioMinutePrice\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 cachedInputToken: e.price.cachedInputPrice ?? undefined,\n outputToken: e.price.outputPrice ?? undefined,\n responseTime: e.price.responseTimePrice ?? undefined,\n audioMinute: e.price.audioMinutePrice ?? undefined,\n unitType: (e.price.priceUnitType ?? undefined) as\n | 'TOKEN'\n | 'SECOND'\n | 'AUDIO_MINUTE'\n | 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
@@ -847,9 +847,11 @@ var friendliProviderOptionsSchema = z2.object({
847
847
 
848
848
  // src/friendli-settings.ts
849
849
  var FriendliAIServerlessModelIds = [
850
+ "openai/whisper-large-v3",
850
851
  "LGAI-EXAONE/K-EXAONE-236B-A23B",
851
852
  "MiniMaxAI/MiniMax-M2.5",
852
853
  "MiniMaxAI/MiniMax-M2.1",
854
+ "zai-org/GLM-5.1",
853
855
  "zai-org/GLM-5",
854
856
  "zai-org/GLM-4.7",
855
857
  "meta-llama/Llama-3.3-70B-Instruct",
@@ -996,6 +998,7 @@ async function getAvailableModelsImpl(options) {
996
998
  inputPrice
997
999
  cachedInputPrice
998
1000
  outputPrice
1001
+ audioMinutePrice
999
1002
  unit
1000
1003
  responseTimePrice
1001
1004
  priceUnitType
@@ -1018,25 +1021,26 @@ async function getAvailableModelsImpl(options) {
1018
1021
  }
1019
1022
  const edges = (_f = (_e = (_d = resp.data) == null ? void 0 : _d.serverlessEndpoints) == null ? void 0 : _e.edges) != null ? _f : [];
1020
1023
  const models = edges.map((e) => {
1021
- var _a2, _b2, _c2, _d2, _e2, _f2, _g;
1024
+ var _a2, _b2, _c2, _d2, _e2, _f2, _g, _h;
1022
1025
  const warm = e.status === "WARM";
1023
1026
  const pricing = e.price ? {
1024
1027
  inputToken: (_a2 = e.price.inputPrice) != null ? _a2 : void 0,
1025
1028
  cachedInputToken: (_b2 = e.price.cachedInputPrice) != null ? _b2 : void 0,
1026
1029
  outputToken: (_c2 = e.price.outputPrice) != null ? _c2 : void 0,
1027
1030
  responseTime: (_d2 = e.price.responseTimePrice) != null ? _d2 : void 0,
1028
- unitType: (_e2 = e.price.priceUnitType) != null ? _e2 : void 0,
1031
+ audioMinute: (_e2 = e.price.audioMinutePrice) != null ? _e2 : void 0,
1032
+ unitType: (_f2 = e.price.priceUnitType) != null ? _f2 : void 0,
1029
1033
  unit: normalizePriceUnit(e.price.unit),
1030
1034
  currency: "USD"
1031
1035
  } : void 0;
1032
1036
  return {
1033
1037
  id: e.id,
1034
- name: (_f2 = e.name) != null ? _f2 : void 0,
1038
+ name: (_g = e.name) != null ? _g : void 0,
1035
1039
  description: void 0,
1036
1040
  pricing,
1037
1041
  warm,
1038
1042
  cold: warm === false,
1039
- contextLength: (_g = e.contextLength) != null ? _g : void 0
1043
+ contextLength: (_h = e.contextLength) != null ? _h : void 0
1040
1044
  };
1041
1045
  });
1042
1046
  return { models };
@@ -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 convertOpenAICompatibleChatUsage,\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 LanguageModelV3Prompt,\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 tryWrapFriendliJsonEnvelopeError,\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\n/**\n * Adds reasoning_content field to assistant messages for interleaved thinking support.\n * This enables models like MiniMax-M2.5, GLM-5 to maintain reasoning context across conversation turns.\n *\n * Note: We use `reasoning_content` which is consistent with FriendliAI's response format.\n */\nfunction addReasoningToMessages<T extends Array<{ role: string; reasoning_content?: string }>>(\n prompt: LanguageModelV3Prompt,\n messages: T\n): T {\n // Track assistant message indices in both arrays\n let promptAssistantIndex = 0;\n\n for (const promptMessage of prompt) {\n if (promptMessage.role === 'assistant') {\n // Extract reasoning from the original prompt\n const reasoningText = promptMessage.content\n .filter((part): part is { type: 'reasoning'; text: string } => part.type === 'reasoning')\n .map((part) => part.text)\n .join('\\n');\n\n if (reasoningText) {\n // Find the corresponding assistant message in converted messages\n let messagesAssistantIndex = 0;\n for (let i = 0; i < messages.length; i++) {\n if (messages[i].role === 'assistant') {\n if (messagesAssistantIndex === promptAssistantIndex) {\n messages[i].reasoning_content = reasoningText;\n break;\n }\n messagesAssistantIndex++;\n }\n }\n }\n promptAssistantIndex++;\n }\n }\n\n return messages;\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 // Use addReasoningToMessages to include reasoning_content in assistant messages\n // for interleaved thinking support\n messages: addReasoningToMessages(prompt, 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 response = await (async () => {\n try {\n return 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 } catch (error) {\n const wrappedError = await tryWrapFriendliJsonEnvelopeError(error);\n\n if (wrappedError != null) {\n throw wrappedError;\n }\n\n throw error;\n }\n })();\n\n const { responseHeaders, value: responseBody, rawValue: rawResponse } = response;\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: convertOpenAICompatibleChatUsage(responseBody.usage),\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 let usage: z.infer<typeof openaiCompatibleTokenUsageSchema> | undefined = undefined;\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 if (options.includeRawChunks) {\n controller.enqueue({ type: 'raw', rawValue: chunk.rawValue });\n }\n\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 usage = chunkValue.usage;\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 controller.enqueue({\n type: 'tool-input-start',\n id: toolCallDelta.id,\n toolName: toolCallDelta.function.name,\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-input-end',\n id: toolCall.id,\n });\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 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-input-end',\n id: toolCall.id,\n });\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 for (const toolCall of toolCalls.filter(\n (pendingToolCall) => !pendingToolCall.hasFinished\n )) {\n controller.enqueue({\n type: 'tool-input-end',\n id: toolCall.id,\n });\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 }\n\n const providerMetadata: SharedV3ProviderMetadata = {\n [providerOptionsName]: {},\n ...metadataExtractor?.buildMetadata(),\n };\n if (usage?.completion_tokens_details?.accepted_prediction_tokens != null) {\n providerMetadata[providerOptionsName].acceptedPredictionTokens =\n usage.completion_tokens_details.accepted_prediction_tokens;\n }\n if (usage?.completion_tokens_details?.rejected_prediction_tokens != null) {\n providerMetadata[providerOptionsName].rejectedPredictionTokens =\n usage.completion_tokens_details.rejected_prediction_tokens;\n }\n\n controller.enqueue({\n type: 'finish',\n finishReason,\n usage: convertOpenAICompatibleChatUsage(usage),\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\nexport const tryWrapFriendliJsonEnvelopeError = async (\n error: unknown\n): Promise<APICallError | undefined> => {\n if (!APICallError.isInstance(error)) {\n return undefined;\n }\n\n const responseBody = error.responseBody;\n\n if (typeof responseBody !== 'string' || responseBody.trim() === '') {\n return undefined;\n }\n\n const parsedError = await safeParseJSON({\n text: responseBody,\n schema: friendliaiErrorSchema,\n });\n\n if (!parsedError.success) {\n return undefined;\n }\n\n return new APICallError({\n message: friendliaiErrorStructure.errorToMessage(parsedError.value),\n url: error.url,\n requestBodyValues: error.requestBodyValues,\n statusCode: error.statusCode,\n responseHeaders: error.responseHeaders,\n responseBody: error.responseBody,\n cause: error,\n isRetryable: error.isRetryable,\n data: parsedError.value,\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.5',\n 'MiniMaxAI/MiniMax-M2.1',\n 'zai-org/GLM-5',\n 'zai-org/GLM-4.7',\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-Instruct-2507',\n 'Qwen/Qwen3-30B-A3B',\n 'deepseek-ai/DeepSeek-V3.2',\n 'deepseek-ai/DeepSeek-V3.1',\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 cachedInputToken?: 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 cachedInputPrice?: 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 cachedInputPrice\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 cachedInputToken: e.price.cachedInputPrice ?? 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 convertOpenAICompatibleChatUsage,\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 LanguageModelV3Prompt,\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 tryWrapFriendliJsonEnvelopeError,\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\n/**\n * Adds reasoning_content field to assistant messages for interleaved thinking support.\n * This enables models like MiniMax-M2.5, GLM-5.1 to maintain reasoning context across conversation turns.\n *\n * Note: We use `reasoning_content` which is consistent with FriendliAI's response format.\n */\nfunction addReasoningToMessages<T extends Array<{ role: string; reasoning_content?: string }>>(\n prompt: LanguageModelV3Prompt,\n messages: T\n): T {\n // Track assistant message indices in both arrays\n let promptAssistantIndex = 0;\n\n for (const promptMessage of prompt) {\n if (promptMessage.role === 'assistant') {\n // Extract reasoning from the original prompt\n const reasoningText = promptMessage.content\n .filter((part): part is { type: 'reasoning'; text: string } => part.type === 'reasoning')\n .map((part) => part.text)\n .join('\\n');\n\n if (reasoningText) {\n // Find the corresponding assistant message in converted messages\n let messagesAssistantIndex = 0;\n for (let i = 0; i < messages.length; i++) {\n if (messages[i].role === 'assistant') {\n if (messagesAssistantIndex === promptAssistantIndex) {\n messages[i].reasoning_content = reasoningText;\n break;\n }\n messagesAssistantIndex++;\n }\n }\n }\n promptAssistantIndex++;\n }\n }\n\n return messages;\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 // Use addReasoningToMessages to include reasoning_content in assistant messages\n // for interleaved thinking support\n messages: addReasoningToMessages(prompt, 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 response = await (async () => {\n try {\n return 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 } catch (error) {\n const wrappedError = await tryWrapFriendliJsonEnvelopeError(error);\n\n if (wrappedError != null) {\n throw wrappedError;\n }\n\n throw error;\n }\n })();\n\n const { responseHeaders, value: responseBody, rawValue: rawResponse } = response;\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: convertOpenAICompatibleChatUsage(responseBody.usage),\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 let usage: z.infer<typeof openaiCompatibleTokenUsageSchema> | undefined = undefined;\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 if (options.includeRawChunks) {\n controller.enqueue({ type: 'raw', rawValue: chunk.rawValue });\n }\n\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 usage = chunkValue.usage;\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 controller.enqueue({\n type: 'tool-input-start',\n id: toolCallDelta.id,\n toolName: toolCallDelta.function.name,\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-input-end',\n id: toolCall.id,\n });\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 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-input-end',\n id: toolCall.id,\n });\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 for (const toolCall of toolCalls.filter(\n (pendingToolCall) => !pendingToolCall.hasFinished\n )) {\n controller.enqueue({\n type: 'tool-input-end',\n id: toolCall.id,\n });\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 }\n\n const providerMetadata: SharedV3ProviderMetadata = {\n [providerOptionsName]: {},\n ...metadataExtractor?.buildMetadata(),\n };\n if (usage?.completion_tokens_details?.accepted_prediction_tokens != null) {\n providerMetadata[providerOptionsName].acceptedPredictionTokens =\n usage.completion_tokens_details.accepted_prediction_tokens;\n }\n if (usage?.completion_tokens_details?.rejected_prediction_tokens != null) {\n providerMetadata[providerOptionsName].rejectedPredictionTokens =\n usage.completion_tokens_details.rejected_prediction_tokens;\n }\n\n controller.enqueue({\n type: 'finish',\n finishReason,\n usage: convertOpenAICompatibleChatUsage(usage),\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\nexport const tryWrapFriendliJsonEnvelopeError = async (\n error: unknown\n): Promise<APICallError | undefined> => {\n if (!APICallError.isInstance(error)) {\n return undefined;\n }\n\n const responseBody = error.responseBody;\n\n if (typeof responseBody !== 'string' || responseBody.trim() === '') {\n return undefined;\n }\n\n const parsedError = await safeParseJSON({\n text: responseBody,\n schema: friendliaiErrorSchema,\n });\n\n if (!parsedError.success) {\n return undefined;\n }\n\n return new APICallError({\n message: friendliaiErrorStructure.errorToMessage(parsedError.value),\n url: error.url,\n requestBodyValues: error.requestBodyValues,\n statusCode: error.statusCode,\n responseHeaders: error.responseHeaders,\n responseBody: error.responseBody,\n cause: error,\n isRetryable: error.isRetryable,\n data: parsedError.value,\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 'openai/whisper-large-v3',\n 'LGAI-EXAONE/K-EXAONE-236B-A23B',\n 'MiniMaxAI/MiniMax-M2.5',\n 'MiniMaxAI/MiniMax-M2.1',\n 'zai-org/GLM-5.1',\n 'zai-org/GLM-5',\n 'zai-org/GLM-4.7',\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-Instruct-2507',\n 'Qwen/Qwen3-30B-A3B',\n 'deepseek-ai/DeepSeek-V3.2',\n 'deepseek-ai/DeepSeek-V3.1',\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 cachedInputToken?: number;\n outputToken?: number;\n responseTime?: number;\n audioMinute?: number;\n unitType?: 'TOKEN' | 'SECOND' | 'AUDIO_MINUTE';\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 cachedInputPrice?: number | null;\n outputPrice?: number | null;\n audioMinutePrice?: number | null;\n unit?: string | null;\n responseTimePrice?: number | null;\n priceUnitType?: 'TOKEN' | 'SECOND' | 'AUDIO_MINUTE' | 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 cachedInputPrice\n outputPrice\n audioMinutePrice\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 cachedInputToken: e.price.cachedInputPrice ?? undefined,\n outputToken: e.price.outputPrice ?? undefined,\n responseTime: e.price.responseTimePrice ?? undefined,\n audioMinute: e.price.audioMinutePrice ?? undefined,\n unitType: (e.price.priceUnitType ?? undefined) as\n | 'TOKEN'\n | 'SECOND'\n | 'AUDIO_MINUTE'\n | 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.1.8",
3
+ "version": "1.1.10",
4
4
  "license": "Apache-2.0",
5
5
  "sideEffects": false,
6
6
  "main": "./dist/index.js",
@@ -24,18 +24,18 @@
24
24
  }
25
25
  },
26
26
  "dependencies": {
27
- "@ai-sdk/openai-compatible": "2.0.30",
27
+ "@ai-sdk/openai-compatible": "2.0.40",
28
28
  "@ai-sdk/provider": "3.0.8",
29
- "@ai-sdk/provider-utils": "4.0.15"
29
+ "@ai-sdk/provider-utils": "4.0.23"
30
30
  },
31
31
  "devDependencies": {
32
32
  "@ai-sdk/test-server": "^1.0.3",
33
33
  "@edge-runtime/vm": "^5.0.0",
34
- "@types/node": "^25.0.8",
35
- "globals": "^17.0.0",
34
+ "@types/node": "^25.5.2",
35
+ "globals": "^17.4.0",
36
36
  "tsup": "^8.5.1",
37
- "typescript": "5.9.3",
38
- "zod": "^4.3.5"
37
+ "typescript": "6.0.2",
38
+ "zod": "^4.3.6"
39
39
  },
40
40
  "peerDependencies": {
41
41
  "zod": "^3.25.76 || ^4.1.12"