Skip to content

Commit 57ea625

Browse files
DarinVerheijkeellipsis-dev[bot]cte
authored
feat: Featherless provider (#7235)
Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> Co-authored-by: cte <[email protected]>
1 parent c608392 commit 57ea625

38 files changed

+583
-11
lines changed

.github/ISSUE_TEMPLATE/bug_report.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ body:
2525
- AWS Bedrock
2626
- Chutes AI
2727
- DeepSeek
28+
- Featherless AI
2829
- Fireworks AI
2930
- Glama
3031
- Google Gemini

packages/types/npm/package.metadata.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@roo-code/types",
3-
"version": "1.53.0",
3+
"version": "1.55.0",
44
"description": "TypeScript type definitions for Roo Code.",
55
"publishConfig": {
66
"access": "public",

packages/types/src/global-settings.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,7 @@ export const SECRET_STATE_KEYS = [
196196
"sambaNovaApiKey",
197197
"zaiApiKey",
198198
"fireworksApiKey",
199+
"featherlessApiKey",
199200
"ioIntelligenceApiKey",
200201
] as const satisfies readonly (keyof ProviderSettings)[]
201202
export type SecretState = Pick<ProviderSettings, (typeof SECRET_STATE_KEYS)[number]>

packages/types/src/provider-settings.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ export const providerNames = [
4646
"sambanova",
4747
"zai",
4848
"fireworks",
49+
"featherless",
4950
"io-intelligence",
5051
"roo",
5152
] as const
@@ -284,6 +285,10 @@ const fireworksSchema = apiModelIdProviderModelSchema.extend({
284285
fireworksApiKey: z.string().optional(),
285286
})
286287

288+
const featherlessSchema = apiModelIdProviderModelSchema.extend({
289+
featherlessApiKey: z.string().optional(),
290+
})
291+
287292
const ioIntelligenceSchema = apiModelIdProviderModelSchema.extend({
288293
ioIntelligenceModelId: z.string().optional(),
289294
ioIntelligenceApiKey: z.string().optional(),
@@ -328,6 +333,7 @@ export const providerSettingsSchemaDiscriminated = z.discriminatedUnion("apiProv
328333
sambaNovaSchema.merge(z.object({ apiProvider: z.literal("sambanova") })),
329334
zaiSchema.merge(z.object({ apiProvider: z.literal("zai") })),
330335
fireworksSchema.merge(z.object({ apiProvider: z.literal("fireworks") })),
336+
featherlessSchema.merge(z.object({ apiProvider: z.literal("featherless") })),
331337
ioIntelligenceSchema.merge(z.object({ apiProvider: z.literal("io-intelligence") })),
332338
rooSchema.merge(z.object({ apiProvider: z.literal("roo") })),
333339
defaultSchema,
@@ -365,6 +371,7 @@ export const providerSettingsSchema = z.object({
365371
...sambaNovaSchema.shape,
366372
...zaiSchema.shape,
367373
...fireworksSchema.shape,
374+
...featherlessSchema.shape,
368375
...ioIntelligenceSchema.shape,
369376
...rooSchema.shape,
370377
...codebaseIndexProviderSchema.shape,
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import type { ModelInfo } from "../model.js"
2+
3+
export type FeatherlessModelId =
4+
| "deepseek-ai/DeepSeek-V3-0324"
5+
| "deepseek-ai/DeepSeek-R1-0528"
6+
| "moonshotai/Kimi-K2-Instruct"
7+
| "openai/gpt-oss-120b"
8+
| "Qwen/Qwen3-Coder-480B-A35B-Instruct"
9+
10+
export const featherlessModels = {
11+
"deepseek-ai/DeepSeek-V3-0324": {
12+
maxTokens: 4096,
13+
contextWindow: 32678,
14+
supportsImages: false,
15+
supportsPromptCache: false,
16+
inputPrice: 0,
17+
outputPrice: 0,
18+
description: "DeepSeek V3 0324 model.",
19+
},
20+
"deepseek-ai/DeepSeek-R1-0528": {
21+
maxTokens: 4096,
22+
contextWindow: 32678,
23+
supportsImages: false,
24+
supportsPromptCache: false,
25+
inputPrice: 0,
26+
outputPrice: 0,
27+
description: "DeepSeek R1 0528 model.",
28+
},
29+
"moonshotai/Kimi-K2-Instruct": {
30+
maxTokens: 4096,
31+
contextWindow: 32678,
32+
supportsImages: false,
33+
supportsPromptCache: false,
34+
inputPrice: 0,
35+
outputPrice: 0,
36+
description: "Kimi K2 Instruct model.",
37+
},
38+
"openai/gpt-oss-120b": {
39+
maxTokens: 4096,
40+
contextWindow: 32678,
41+
supportsImages: false,
42+
supportsPromptCache: false,
43+
inputPrice: 0,
44+
outputPrice: 0,
45+
description: "GPT-OSS 120B model.",
46+
},
47+
"Qwen/Qwen3-Coder-480B-A35B-Instruct": {
48+
maxTokens: 4096,
49+
contextWindow: 32678,
50+
supportsImages: false,
51+
supportsPromptCache: false,
52+
inputPrice: 0,
53+
outputPrice: 0,
54+
description: "Qwen3 Coder 480B A35B Instruct model.",
55+
},
56+
} as const satisfies Record<string, ModelInfo>
57+
58+
export const featherlessDefaultModelId: FeatherlessModelId = "deepseek-ai/DeepSeek-R1-0528"

packages/types/src/providers/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,4 @@ export * from "./doubao.js"
2626
export * from "./zai.js"
2727
export * from "./fireworks.js"
2828
export * from "./roo.js"
29+
export * from "./featherless.js"

pnpm-lock.yaml

Lines changed: 9 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/api/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import {
3636
ZAiHandler,
3737
FireworksHandler,
3838
RooHandler,
39+
FeatherlessHandler,
3940
} from "./providers"
4041
import { NativeOllamaHandler } from "./providers/native-ollama"
4142

@@ -143,6 +144,8 @@ export function buildApiHandler(configuration: ProviderSettings): ApiHandler {
143144
return new IOIntelligenceHandler(options)
144145
case "roo":
145146
return new RooHandler(options)
147+
case "featherless":
148+
return new FeatherlessHandler(options)
146149
default:
147150
apiProvider satisfies "gemini-cli" | undefined
148151
return new AnthropicHandler(options)

0 commit comments

Comments
 (0)