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:
Antigravity
2026-07-16 20:43:18 +00:00
parent 704fed1191
commit 556a0b2f3f
77 changed files with 35745 additions and 10430 deletions

View File

@@ -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 };