Skip to content
Open
1 change: 1 addition & 0 deletions packages/types/src/global-settings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,7 @@ export const SECRET_STATE_KEYS = [
"sambaNovaApiKey",
"zaiApiKey",
"fireworksApiKey",
"friendliApiKey",
"vercelAiGatewayApiKey",
"opencodeGoApiKey",
"basetenApiKey",
Expand Down
14 changes: 14 additions & 0 deletions packages/types/src/provider-settings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
bedrockModels,
deepSeekModels,
fireworksModels,
friendliModels,
geminiModels,
mistralModels,
moonshotModels,
Expand Down Expand Up @@ -119,6 +120,7 @@ export const providerNames = [
"baseten",
"deepseek",
"fireworks",
"friendli",
"gemini",
"gemini-cli",
"mistral",
Expand Down Expand Up @@ -393,6 +395,10 @@ const fireworksSchema = apiModelIdProviderModelSchema.extend({
fireworksApiKey: z.string().optional(),
})

const friendliSchema = apiModelIdProviderModelSchema.extend({
friendliApiKey: z.string().optional(),
})

const qwenCodeSchema = apiModelIdProviderModelSchema.extend({
qwenCodeOauthPath: z.string().optional(),
})
Expand Down Expand Up @@ -449,6 +455,7 @@ export const providerSettingsSchemaDiscriminated = z.discriminatedUnion("apiProv
sambaNovaSchema.merge(z.object({ apiProvider: z.literal("sambanova") })),
zaiSchema.merge(z.object({ apiProvider: z.literal("zai") })),
fireworksSchema.merge(z.object({ apiProvider: z.literal("fireworks") })),
friendliSchema.merge(z.object({ apiProvider: z.literal("friendli") })),
qwenCodeSchema.merge(z.object({ apiProvider: z.literal("qwen-code") })),
vercelAiGatewaySchema.merge(z.object({ apiProvider: z.literal("vercel-ai-gateway") })),
opencodeGoSchema.merge(z.object({ apiProvider: z.literal("opencode-go") })),
Expand Down Expand Up @@ -485,6 +492,7 @@ export const providerSettingsSchema = z.object({
...sambaNovaSchema.shape,
...zaiSchema.shape,
...fireworksSchema.shape,
...friendliSchema.shape,
...qwenCodeSchema.shape,
...vercelAiGatewaySchema.shape,
...opencodeGoSchema.shape,
Expand Down Expand Up @@ -565,6 +573,7 @@ export const modelIdKeysByProvider: Record<TypicalProvider, ModelIdKey> = {
sambanova: "apiModelId",
zai: "apiModelId",
fireworks: "apiModelId",
friendli: "apiModelId",
"vercel-ai-gateway": "vercelAiGatewayModelId",
"opencode-go": "opencodeGoModelId",
"zoo-gateway": "zooGatewayModelId",
Expand Down Expand Up @@ -638,6 +647,11 @@ export const MODELS_BY_PROVIDER: Record<
label: "Fireworks",
models: Object.keys(fireworksModels),
},
friendli: {
id: "friendli",
label: "Friendli",
models: Object.keys(friendliModels),
},
gemini: {
id: "gemini",
label: "Google Gemini",
Expand Down
63 changes: 63 additions & 0 deletions packages/types/src/providers/friendli.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import type { ModelInfo } from "../model.js"

export type FriendliModelId =
| "zai-org/GLM-5.2"
| "zai-org/GLM-5.1"
| "deepseek-ai/DeepSeek-V3.2"
| "MiniMaxAI/MiniMax-M2.5"

export const friendliDefaultModelId: FriendliModelId = "zai-org/GLM-5.2"

// Pricing sourced from https://friendli.ai/api/public/model-apis (per 1M tokens).
export const friendliModels = {
"zai-org/GLM-5.2": {
maxTokens: 131_072,
contextWindow: 1_000_000,
supportsImages: false,
supportsPromptCache: true,
supportsMaxTokens: true,
inputPrice: 1.4,
outputPrice: 4.4,
cacheWritesPrice: 0,
cacheReadsPrice: 0.26,
description:
"GLM-5.2 is Zhipu's flagship model with a 1M context window and 128k max output, served via Friendli Model APIs. It delivers top-tier long-context reasoning, coding, and agentic performance for extended engineering sessions.",
},
"zai-org/GLM-5.1": {
maxTokens: 131_072,
contextWindow: 200_000,
supportsImages: false,
supportsPromptCache: true,
supportsMaxTokens: true,
inputPrice: 1.4,
outputPrice: 4.4,
cacheWritesPrice: 0,
cacheReadsPrice: 0.26,
description:
"GLM-5.1 is Zhipu's most capable model with a 200k context window and 128k max output, served via Friendli Model APIs. It delivers top-tier reasoning, coding, and agentic performance.",
},
"deepseek-ai/DeepSeek-V3.2": {
maxTokens: 16384,
contextWindow: 163_840,
supportsImages: false,
supportsPromptCache: true,
inputPrice: 0.5,
outputPrice: 1.5,
cacheWritesPrice: 0,
cacheReadsPrice: 0.25,
description:
"DeepSeek V3.2 is the latest iteration of the V3 model family with enhanced reasoning capabilities, improved code generation, and better instruction following, served via Friendli Model APIs.",
},
"MiniMaxAI/MiniMax-M2.5": {
maxTokens: 4096,
contextWindow: 204_800,
supportsImages: false,
supportsPromptCache: true,
inputPrice: 0.3,
outputPrice: 1.2,
cacheWritesPrice: 0,
cacheReadsPrice: 0.06,
description:
"MiniMax M2.5 is a high-performance language model with a 204.8K context window, optimized for long-context understanding and generation tasks, served via Friendli Model APIs.",
},
} as const satisfies Record<string, ModelInfo>
4 changes: 4 additions & 0 deletions packages/types/src/providers/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ export * from "./baseten.js"
export * from "./bedrock.js"
export * from "./deepseek.js"
export * from "./fireworks.js"
export * from "./friendli.js"
export * from "./gemini.js"
export * from "./lite-llm.js"
export * from "./lm-studio.js"
Expand Down Expand Up @@ -33,6 +34,7 @@ import { basetenDefaultModelId } from "./baseten.js"
import { bedrockDefaultModelId } from "./bedrock.js"
import { deepSeekDefaultModelId } from "./deepseek.js"
import { fireworksDefaultModelId } from "./fireworks.js"
import { friendliDefaultModelId } from "./friendli.js"
import { geminiDefaultModelId } from "./gemini.js"
import { litellmDefaultModelId } from "./lite-llm.js"
import { mistralDefaultModelId } from "./mistral.js"
Expand Down Expand Up @@ -111,6 +113,8 @@ export function getProviderDefaultModelId(
return sambaNovaDefaultModelId
case "fireworks":
return fireworksDefaultModelId
case "friendli":
return friendliDefaultModelId
case "qwen-code":
return qwenCodeDefaultModelId
case "poe":
Expand Down
3 changes: 3 additions & 0 deletions src/api/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import {
SambaNovaHandler,
ZAiHandler,
FireworksHandler,
FriendliHandler,
VercelAiGatewayHandler,
OpencodeGoHandler,
ZooGatewayHandler,
Expand Down Expand Up @@ -182,6 +183,8 @@ export function buildApiHandler(configuration: ProviderSettings): ApiHandler {
return new ZAiHandler(options)
case "fireworks":
return new FireworksHandler(options)
case "friendli":
return new FriendliHandler(options)
case "vercel-ai-gateway":
return new VercelAiGatewayHandler(options)
case "opencode-go":
Expand Down
Loading
Loading