Add FirePass provider support for Kimi K2.5 Turbo

- Add new 'firepass' provider type alongside anthropic, openai, openrouter
- FirePass uses Fireworks AI's endpoint for Kimi K2.5 Turbo model
- Subscription billing model ($7/week) with 256K context window
- Anthropic API compatible (uses Anthropic SDK with custom baseURL)

Changes:
- providers.ts: Add firepass detection and base URL handling
- auth.ts: Add FirePass API key management (FIREPASS_API_KEY or FIREWORKS_API_KEY)
- config.ts: Add firepassApiKey and firepass auth provider
- client.ts: Add firepass client creation with custom baseURL
- http.ts: Add firepass auth headers
- modelStrings.ts: Return Kimi K2.5 Turbo model ID for firepass
- model.ts: Add Kimi display name handling and default model logic
- modelOptions.ts: Simplified model picker for firepass (Kimi K2.5 Turbo only)
- status.tsx: Display FirePass in status bar
- login.tsx: Add FirePass option to provider selection
- FirepassLoginFlow.tsx: New component for FirePass login flow

Usage:
1. Run /login and select "FirePass"
2. Enter your Fireworks API key
3. Model picker shows Kimi K2.5 Turbo
This commit is contained in:
Jonathan Evans
2026-04-01 13:56:12 -07:00
Unverified
parent c9c145cf97
commit 061251984e
11 changed files with 389 additions and 8 deletions

View File

@@ -45,6 +45,7 @@ export type ModelOption = {
export function getDefaultOptionForUser(fastMode = false): ModelOption {
const provider = getAPIProvider()
const isOpenAI = provider === 'openai'
const isFirepass = provider === 'firepass'
if (process.env.USER_TYPE === 'ant') {
const currentModel = renderDefaultModelSetting(
getDefaultMainLoopModelSetting(),
@@ -68,6 +69,14 @@ export function getDefaultOptionForUser(fastMode = false): ModelOption {
// PAYG
const is3P = provider !== 'firstParty'
if (isFirepass) {
return {
value: null,
label: 'Default (recommended)',
description: 'Use Kimi K2.5 Turbo (FirePass subscription)',
descriptionForModel: 'Kimi K2.5 Turbo - FirePass subscription with 256K context',
}
}
return {
value: null,
label: 'Default (recommended)',
@@ -109,6 +118,16 @@ function getSonnet46Option(): ModelOption {
'GPT-5.4 - recommended for most coding and agentic tasks on OpenAI',
}
}
if (provider === 'firepass') {
const firepassModel = getModelStrings().sonnet46
return {
value: firepassModel,
label: 'Kimi K2.5 Turbo',
description: 'Kimi K2.5 Turbo · FirePass subscription model',
descriptionForModel:
'Kimi K2.5 Turbo - FirePass subscription with 256K context, no per-token charges',
}
}
return {
value: is3P ? getModelStrings().sonnet46 : 'sonnet',
label: 'Sonnet',
@@ -156,6 +175,16 @@ function getOpus46Option(fastMode = false): ModelOption {
'GPT-5.4 - most capable OpenAI model for complex coding work',
}
}
if (provider === 'firepass') {
const firepassModel = getModelStrings().opus46
return {
value: firepassModel,
label: 'Kimi K2.5 Turbo',
description: 'Kimi K2.5 Turbo · FirePass subscription model',
descriptionForModel:
'Kimi K2.5 Turbo - FirePass subscription with 256K context, no per-token charges',
}
}
return {
value: is3P ? getModelStrings().opus46 : 'opus',
label: 'Opus',
@@ -176,6 +205,17 @@ export function getSonnet46_1MOption(): ModelOption {
'GPT-5.4 for long-running OpenAI sessions and large codebases',
}
}
if (provider === 'firepass') {
// FirePass Kimi has 256K context, no need for separate 1M option
const firepassModel = getModelStrings().sonnet46
return {
value: firepassModel,
label: 'Kimi K2.5 Turbo',
description: 'Kimi K2.5 Turbo · 256K context included',
descriptionForModel:
'Kimi K2.5 Turbo - 256K context window for long sessions',
}
}
return {
value: is3P ? getModelStrings().sonnet46 + '[1m]' : 'sonnet[1m]',
label: 'Sonnet (1M context)',
@@ -197,6 +237,17 @@ export function getOpus46_1MOption(fastMode = false): ModelOption {
'GPT-5.4 for long-running OpenAI sessions and large codebases',
}
}
if (provider === 'firepass') {
// FirePass Kimi has 256K context, no need for separate 1M option
const firepassModel = getModelStrings().opus46
return {
value: firepassModel,
label: 'Kimi K2.5 Turbo',
description: 'Kimi K2.5 Turbo · 256K context included',
descriptionForModel:
'Kimi K2.5 Turbo - 256K context window for long sessions',
}
}
return {
value: is3P ? getModelStrings().opus46 + '[1m]' : 'opus[1m]',
label: 'Opus (1M context)',
@@ -234,6 +285,16 @@ function getHaiku45Option(): ModelOption {
'GPT-5.4 Mini - fastest OpenAI option for quick answers and lightweight tasks',
}
}
if (provider === 'firepass') {
const firepassModel = getModelStrings().haiku45
return {
value: firepassModel,
label: 'Kimi K2.5 Turbo',
description: 'Kimi K2.5 Turbo · FirePass subscription model',
descriptionForModel:
'Kimi K2.5 Turbo - FirePass subscription with 256K context, no per-token charges',
}
}
return {
value: 'haiku',
label: 'Haiku',
@@ -255,6 +316,16 @@ function getHaiku35Option(): ModelOption {
'GPT-5.4 Mini - lower latency OpenAI model for simple tasks',
}
}
if (provider === 'firepass') {
const firepassModel = getModelStrings().haiku35
return {
value: firepassModel,
label: 'Kimi K2.5 Turbo',
description: 'Kimi K2.5 Turbo · FirePass subscription model',
descriptionForModel:
'Kimi K2.5 Turbo - FirePass subscription with 256K context, no per-token charges',
}
}
return {
value: 'haiku',
label: 'Haiku',
@@ -405,6 +476,19 @@ function getModelOptionsBase(fastMode = false): ModelOption[] {
return payg1POptions
}
// FirePass: Simple list with just Kimi K2.5 Turbo
if (getAPIProvider() === 'firepass') {
const firepassModel = getModelStrings().sonnet46
return [
getDefaultOptionForUser(fastMode),
{
value: firepassModel,
label: 'Kimi K2.5 Turbo',
description: 'Kimi K2.5 Turbo · 256K context, subscription billing',
},
]
}
// PAYG 3P: Default (Sonnet 4.5) + Sonnet (3P custom) or Sonnet 4.6/1M + Opus (3P custom) or Opus 4.1/Opus 4.6/Opus1M + Haiku + Opus 4.1
const payg3pOptions = [getDefaultOptionForUser(fastMode)]