docs/adding-provider.md
This guide documents all the steps and files that need to be modified when adding a new AI provider to the Chatbox application.
Adding a new provider involves modifying approximately 7-8 files across the codebase. The implementation follows a consistent pattern, making it straightforward to add support for new AI models.
File: /src/shared/types.ts
Add your provider to the ModelProviderEnum:
export enum ModelProviderEnum {
// ... existing providers
YourProvider = 'your-provider',
}
File: /src/shared/models/your-provider.ts
Create a new file implementing your provider's API. Most providers can extend the base OpenAI-compatible class:
import { OpenAICompatible } from './openai-compatible'
export class YourProvider extends OpenAICompatible {
name = 'YourProvider'
constructor(apiKey: string, apiHost: string) {
super(apiKey, apiHost)
}
}
For providers with custom APIs, extend AbstractAISdk directly and implement required methods.
File: /src/shared/models/index.ts
Add three entries:
import { YourProvider } from './your-provider'
getModel() function:case ModelProviderEnum.YourProvider:
return new YourProvider(apiKey, apiHost)
aiProviderNameHash:export const aiProviderNameHash = {
// ... existing entries
[ModelProviderEnum.YourProvider]: 'Your Provider Name',
}
AIModelProviderMenuOptionList if it should appear in selection menus:export const AIModelProviderMenuOptionList = [
// ... existing entries
{ value: ModelProviderEnum.YourProvider, label: 'Your Provider' },
]
File: /src/shared/defaults.ts
Add your provider configuration to the SystemProviders array:
{
id: ModelProviderEnum.YourProvider,
name: 'Your Provider',
type: ModelProviderType.OpenAI, // OpenAI | Gemini | Claude
defaultSettings: {
apiHost: 'https://api.yourprovider.com',
models: [
{
modelId: 'model-1',
capabilities: ['vision', 'tool_use'], // optional
contextWindow: 128_000, // optional
},
],
},
}
Note: See existing providers in defaults.ts for more examples.
File: /src/renderer/packages/model-setting-utils/your-provider-setting-util.ts
Create a settings utility class:
import { BaseModelSettingUtil } from './base-model-setting-util'
import { ModelProviderEnum } from '@/shared/types'
export class YourProviderSettingUtil extends BaseModelSettingUtil {
provider = ModelProviderEnum.YourProvider
// Add any provider-specific validation or configuration methods
}
File: /src/renderer/packages/model-setting-utils/index.ts
Add your utility to the getModelSettingUtil() function:
import { YourProviderSettingUtil } from './your-provider-setting-util'
export function getModelSettingUtil(provider: ModelProviderEnum): BaseModelSettingUtil {
const hash = {
// ... existing entries
[ModelProviderEnum.YourProvider]: new YourProviderSettingUtil(),
}
return hash[provider] || new BaseModelSettingUtil()
}
SVG Icon - File: /src/renderer/components/icons/ProviderIcon.tsx
Add an SVG icon component in the switch statement:
case ModelProviderEnum.YourProvider:
return (
<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" {...props}>
</svg>
)
PNG Icon - File: /src/renderer/static/icons/providers/your-provider.png
Add a 36x36 PNG icon for the provider list display.
If your provider requires custom UI text, add translations to the appropriate locale files in /src/renderer/i18n/locales/.
Create test files for your provider implementation:
/src/shared/models/your-provider.test.ts/src/renderer/packages/model-setting-utils/your-provider-setting-util.test.tsIf your provider needs custom settings beyond API key and host, you may need to create a custom component in /src/renderer/routes/settings/provider/. However, most providers work with the default settings page.
The VolcEngine provider was recently added following this pattern:
types.ts/src/shared/models/volcengine.ts extending OpenAICompatible/src/shared/models/index.tsdefaults.ts with chat modelsAfter implementing:
npm run lint:fix to ensure code style consistencynpm run check for TypeScript validationnpm run devOpenAICompatible if they follow OpenAI's API formatsupportContinuous: true for streaming supportfunctionCall: true on models that support function callingapiHost in defaults should not include /v1 suffix (added automatically)