feat(credits): solde IA unique (option M), packs Stripe et polish billing
Un pot de crédits global (BASIC 100 / PRO 1 000 / BUSINESS 4 000) remplace les seaux par fonction côté débit. Packs one-shot S/M/L, admin sans seaux legacy, usage multi-features, hints de coût, anti-flash thème et hydratation admin. Inclut aussi le pipeline slides renforcé et la page publique polishée.
This commit is contained in:
@@ -281,5 +281,40 @@ export function getChatProvider(config?: Record<string, string>): AIProvider {
|
||||
return getProviderInstance(route.providerType as ProviderType, cfg, route.modelName, route.embeddingModelName, route.ollamaBaseUrl);
|
||||
}
|
||||
|
||||
/**
|
||||
* Provider for slide deck generation.
|
||||
* Uses AI_PROVIDER_SLIDES + AI_MODEL_SLIDES when both are set in admin.
|
||||
* If only AI_MODEL_SLIDES is set, reuses the chat provider with that exact model id.
|
||||
* Otherwise falls back to the chat route — never rewrites or invents model names.
|
||||
*/
|
||||
export function getSlidesProvider(config?: Record<string, string>): AIProvider {
|
||||
const cfg = config || {};
|
||||
const slidesModel = (cfg.AI_MODEL_SLIDES || process.env.AI_MODEL_SLIDES || '').trim();
|
||||
const slidesProvider = (cfg.AI_PROVIDER_SLIDES || process.env.AI_PROVIDER_SLIDES || '').trim();
|
||||
const route = resolveAiRoute('chat', cfg);
|
||||
|
||||
if (slidesModel && slidesProvider) {
|
||||
return getProviderInstance(
|
||||
slidesProvider as ProviderType,
|
||||
cfg,
|
||||
slidesModel,
|
||||
route.embeddingModelName,
|
||||
route.ollamaBaseUrl,
|
||||
);
|
||||
}
|
||||
|
||||
if (slidesModel) {
|
||||
return getProviderInstance(
|
||||
route.providerType as ProviderType,
|
||||
cfg,
|
||||
slidesModel,
|
||||
route.embeddingModelName,
|
||||
route.ollamaBaseUrl,
|
||||
);
|
||||
}
|
||||
|
||||
return getChatProvider(cfg);
|
||||
}
|
||||
|
||||
// Export for use by admin settings form and deploy scripts
|
||||
export { getProviderConfigKeys };
|
||||
|
||||
Reference in New Issue
Block a user