Skip to content

Commit e53c79f

Browse files
avianionclaude
andcommitted
feat: add Avian as a new LLM provider
Add Avian (avian.io) as a provider for accessing open-source models including DeepSeek V3.2, Kimi K2.5, GLM-5, and MiniMax M2.5 via an OpenAI-compatible API at api.avian.io/v1. Supports both static model list and dynamic model discovery via the /v1/models endpoint. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 2e254ac commit e53c79f

3 files changed

Lines changed: 105 additions & 0 deletions

File tree

.env.example

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@
1212
# Get your API key from: https://console.anthropic.com/
1313
ANTHROPIC_API_KEY=your_anthropic_api_key_here
1414

15+
# Avian (Fast inference for open-source models)
16+
# Get your API key from: https://avian.io
17+
AVIAN_API_KEY=your_avian_api_key_here
18+
1519
# Cerebras (High-performance inference)
1620
# Get your API key from: https://cloud.cerebras.ai/settings
1721
CEREBRAS_API_KEY=your_cerebras_api_key_here
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
import { BaseProvider } from '~/lib/modules/llm/base-provider';
2+
import type { ModelInfo } from '~/lib/modules/llm/types';
3+
import type { IProviderSetting } from '~/types/model';
4+
import type { LanguageModelV1 } from 'ai';
5+
import { createOpenAI } from '@ai-sdk/openai';
6+
7+
export default class AvianProvider extends BaseProvider {
8+
name = 'Avian';
9+
getApiKeyLink = 'https://avian.io';
10+
11+
config = {
12+
apiTokenKey: 'AVIAN_API_KEY',
13+
};
14+
15+
staticModels: ModelInfo[] = [
16+
{ name: 'deepseek/deepseek-v3.2', label: 'DeepSeek V3.2', provider: 'Avian', maxTokenAllowed: 128000 },
17+
{ name: 'moonshotai/kimi-k2.5', label: 'Kimi K2.5', provider: 'Avian', maxTokenAllowed: 128000 },
18+
{ name: 'z-ai/glm-5', label: 'GLM-5', provider: 'Avian', maxTokenAllowed: 128000 },
19+
{ name: 'minimax/minimax-m2.5', label: 'MiniMax M2.5', provider: 'Avian', maxTokenAllowed: 128000 },
20+
];
21+
22+
async getDynamicModels(
23+
apiKeys?: Record<string, string>,
24+
settings?: IProviderSetting,
25+
serverEnv?: Record<string, string>,
26+
): Promise<ModelInfo[]> {
27+
const { apiKey } = this.getProviderBaseUrlAndKey({
28+
apiKeys,
29+
providerSettings: settings,
30+
serverEnv: serverEnv as any,
31+
defaultBaseUrlKey: '',
32+
defaultApiTokenKey: 'AVIAN_API_KEY',
33+
});
34+
35+
if (!apiKey) {
36+
return [];
37+
}
38+
39+
try {
40+
const response = await fetch('https://api.avian.io/v1/models', {
41+
headers: {
42+
Authorization: `Bearer ${apiKey}`,
43+
},
44+
signal: this.createTimeoutSignal(5000),
45+
});
46+
47+
if (!response.ok) {
48+
console.error(`Avian API error: ${response.statusText}`);
49+
return [];
50+
}
51+
52+
const data = (await response.json()) as any;
53+
const staticModelIds = this.staticModels.map((m) => m.name);
54+
55+
const dynamicModels =
56+
data.data
57+
?.filter((model: any) => !staticModelIds.includes(model.id))
58+
.map((m: any) => ({
59+
name: m.id,
60+
label: `${m.id} (Dynamic)`,
61+
provider: this.name,
62+
maxTokenAllowed: 128000,
63+
})) || [];
64+
65+
return dynamicModels;
66+
} catch (error) {
67+
console.error(`Failed to fetch Avian models:`, error);
68+
return [];
69+
}
70+
}
71+
72+
getModelInstance(options: {
73+
model: string;
74+
serverEnv: Env;
75+
apiKeys?: Record<string, string>;
76+
providerSettings?: Record<string, IProviderSetting>;
77+
}): LanguageModelV1 {
78+
const { model, serverEnv, apiKeys, providerSettings } = options;
79+
80+
const { apiKey } = this.getProviderBaseUrlAndKey({
81+
apiKeys,
82+
providerSettings: providerSettings?.[this.name],
83+
serverEnv: serverEnv as any,
84+
defaultBaseUrlKey: '',
85+
defaultApiTokenKey: 'AVIAN_API_KEY',
86+
});
87+
88+
if (!apiKey) {
89+
throw new Error(`Missing API key for ${this.name} provider`);
90+
}
91+
92+
const openai = createOpenAI({
93+
baseURL: 'https://api.avian.io/v1',
94+
apiKey,
95+
});
96+
97+
return openai(model);
98+
}
99+
}

app/lib/modules/llm/registry.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import AnthropicProvider from './providers/anthropic';
2+
import AvianProvider from './providers/avian';
23
import CerebrasProvider from './providers/cerebras';
34
import CohereProvider from './providers/cohere';
45
import DeepseekProvider from './providers/deepseek';
@@ -23,6 +24,7 @@ import ZaiProvider from './providers/z-ai';
2324

2425
export {
2526
AnthropicProvider,
27+
AvianProvider,
2628
CerebrasProvider,
2729
CohereProvider,
2830
DeepseekProvider,

0 commit comments

Comments
 (0)