mirror of
https://github.com/stackblitz-labs/bolt.diy
synced 2025-06-26 18:26:38 +00:00
Add support for OPENAI_LIKE_API_MODELS
Define OPENAI_LIKE_API_MODELS=path/to/model1:limit;path/to/model2:limit;path/to/model3:limit Helps construct model list when the endpoint does not support /models/ request.
This commit is contained in:
parent
d0d9818964
commit
840f35cbbc
@ -10,10 +10,47 @@ export default class OpenAILikeProvider extends BaseProvider {
|
|||||||
config = {
|
config = {
|
||||||
baseUrlKey: 'OPENAI_LIKE_API_BASE_URL',
|
baseUrlKey: 'OPENAI_LIKE_API_BASE_URL',
|
||||||
apiTokenKey: 'OPENAI_LIKE_API_KEY',
|
apiTokenKey: 'OPENAI_LIKE_API_KEY',
|
||||||
|
modelKey: 'OPENAI_LIKE_API_MODELS',
|
||||||
};
|
};
|
||||||
|
|
||||||
staticModels: ModelInfo[] = [];
|
staticModels: ModelInfo[] = [];
|
||||||
|
|
||||||
|
getEnvDefinedModels(serverEnv: Record<string, string> = {}): ModelInfo[] {
|
||||||
|
const models = serverEnv[this.config.modelKey] || process.env[this.config.modelKey];
|
||||||
|
console.debug(`${this.name}: ${this.config.modelKey}=${models}`);
|
||||||
|
|
||||||
|
const mklabel = (model: string) => {
|
||||||
|
let parts = model.split('/').reverse() || [];
|
||||||
|
parts = parts.filter((p) => p && !p.includes('accounts') && !p.includes('models'));
|
||||||
|
|
||||||
|
let label = parts.join('-');
|
||||||
|
|
||||||
|
if (parts.length >= 2) {
|
||||||
|
label = `${parts.shift()} (${parts.join(', ')})`;
|
||||||
|
}
|
||||||
|
|
||||||
|
return label.toLowerCase().replace(/\b\w/g, (match) => match.toUpperCase());
|
||||||
|
};
|
||||||
|
|
||||||
|
const ret =
|
||||||
|
models?.split(';').map((model) => {
|
||||||
|
const parts = model.split(':');
|
||||||
|
const name = (parts.length && parts.shift()?.trim()) || 'parse-error';
|
||||||
|
const ret = {
|
||||||
|
name,
|
||||||
|
label: mklabel(name),
|
||||||
|
provider: this.name,
|
||||||
|
maxTokenAllowed: parseInt(parts.shift() || '0'),
|
||||||
|
};
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}) || [];
|
||||||
|
|
||||||
|
console.debug(`${this.name}: Parsed Models: `, ...ret);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
async getDynamicModels(
|
async getDynamicModels(
|
||||||
apiKeys?: Record<string, string>,
|
apiKeys?: Record<string, string>,
|
||||||
settings?: IProviderSetting,
|
settings?: IProviderSetting,
|
||||||
@ -34,17 +71,29 @@ export default class OpenAILikeProvider extends BaseProvider {
|
|||||||
const response = await fetch(`${baseUrl}/models`, {
|
const response = await fetch(`${baseUrl}/models`, {
|
||||||
headers: {
|
headers: {
|
||||||
Authorization: `Bearer ${apiKey}`,
|
Authorization: `Bearer ${apiKey}`,
|
||||||
|
ContentType: 'application/json',
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const res = (await response.json()) as any;
|
let ret = [];
|
||||||
|
|
||||||
return res.data.map((model: any) => ({
|
try {
|
||||||
name: model.id,
|
const json = (await response.json()) as any;
|
||||||
label: model.id,
|
ret = json.data.map((model: any) => ({
|
||||||
provider: this.name,
|
name: model.id,
|
||||||
maxTokenAllowed: 8000,
|
label: model.id,
|
||||||
}));
|
provider: this.name,
|
||||||
|
maxTokenAllowed: 8000,
|
||||||
|
}));
|
||||||
|
} catch {
|
||||||
|
if (response.headers.has('x-error-message')) {
|
||||||
|
const xerr = response.headers.get('x-error-message');
|
||||||
|
console.debug(`${this.name}: ${xerr}`);
|
||||||
|
ret = this.getEnvDefinedModels(serverEnv);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
getModelInstance(options: {
|
getModelInstance(options: {
|
||||||
|
Loading…
Reference in New Issue
Block a user