@lastbrain/module-ai 2.0.26 → 2.0.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -1
- package/dist/ai.build.config.d.ts.map +1 -1
- package/dist/ai.build.config.js +508 -9
- package/dist/api/admin/ai-provider-models/[id].d.ts +18 -0
- package/dist/api/admin/ai-provider-models/[id].d.ts.map +1 -0
- package/dist/api/admin/ai-provider-models/[id].js +58 -0
- package/dist/api/admin/ai-provider-models.d.ts +20 -0
- package/dist/api/admin/ai-provider-models.d.ts.map +1 -0
- package/dist/api/admin/ai-provider-models.js +26 -0
- package/dist/api/admin/ai-providers/[key].d.ts +18 -0
- package/dist/api/admin/ai-providers/[key].d.ts.map +1 -0
- package/dist/api/admin/ai-providers/[key].js +55 -0
- package/dist/api/admin/ai-providers.d.ts +20 -0
- package/dist/api/admin/ai-providers.d.ts.map +1 -0
- package/dist/api/admin/ai-providers.js +26 -0
- package/dist/api/admin/billing-analytics.d.ts +43 -0
- package/dist/api/admin/billing-analytics.d.ts.map +1 -0
- package/dist/api/admin/billing-analytics.js +144 -0
- package/dist/api/admin/global-ai-settings.d.ts +14 -0
- package/dist/api/admin/global-ai-settings.d.ts.map +1 -0
- package/dist/api/admin/global-ai-settings.js +63 -0
- package/dist/api/admin/token-packs/[id].d.ts.map +1 -1
- package/dist/api/admin/token-packs/[id].js +3 -2
- package/dist/api/admin/token-packs.d.ts.map +1 -1
- package/dist/api/admin/token-packs.js +3 -2
- package/dist/api/admin/user-monthly-details.d.ts +49 -0
- package/dist/api/admin/user-monthly-details.d.ts.map +1 -0
- package/dist/api/admin/user-monthly-details.js +140 -0
- package/dist/api/admin/user-quota.d.ts +21 -0
- package/dist/api/admin/user-quota.d.ts.map +1 -0
- package/dist/api/admin/user-quota.js +59 -0
- package/dist/api/admin/user-token/[id].d.ts.map +1 -1
- package/dist/api/admin/user-token/[id].js +2 -1
- package/dist/api/admin/user-token.d.ts +5 -2
- package/dist/api/admin/user-token.d.ts.map +1 -1
- package/dist/api/admin/user-token.js +91 -17
- package/dist/api/admin/user-usage-by-model.d.ts +22 -0
- package/dist/api/admin/user-usage-by-model.d.ts.map +1 -0
- package/dist/api/admin/user-usage-by-model.js +78 -0
- package/dist/api/admin/user-wallet-analytics.d.ts +15 -0
- package/dist/api/admin/user-wallet-analytics.d.ts.map +1 -0
- package/dist/api/admin/user-wallet-analytics.js +67 -0
- package/dist/api/admin/wallet-repair/route.d.ts +30 -0
- package/dist/api/admin/wallet-repair/route.d.ts.map +1 -0
- package/dist/api/admin/wallet-repair/route.js +63 -0
- package/dist/api/auth/ai-model-settings.d.ts +21 -0
- package/dist/api/auth/ai-model-settings.d.ts.map +1 -0
- package/dist/api/auth/ai-model-settings.js +86 -0
- package/dist/api/auth/ai-settings.d.ts +17 -0
- package/dist/api/auth/ai-settings.d.ts.map +1 -0
- package/dist/api/auth/ai-settings.js +87 -0
- package/dist/api/auth/api-keys/[id].d.ts +17 -0
- package/dist/api/auth/api-keys/[id].d.ts.map +1 -0
- package/dist/api/auth/api-keys/[id].js +66 -0
- package/dist/api/auth/api-keys.d.ts +19 -0
- package/dist/api/auth/api-keys.d.ts.map +1 -0
- package/dist/api/auth/api-keys.js +94 -0
- package/dist/api/auth/create-checkout.d.ts +1 -1
- package/dist/api/auth/create-checkout.d.ts.map +1 -1
- package/dist/api/auth/create-checkout.js +8 -6
- package/dist/api/auth/generate-image.d.ts +2 -2
- package/dist/api/auth/generate-image.d.ts.map +1 -1
- package/dist/api/auth/generate-image.js +404 -104
- package/dist/api/auth/generate-text.d.ts +3 -2
- package/dist/api/auth/generate-text.d.ts.map +1 -1
- package/dist/api/auth/generate-text.js +130 -58
- package/dist/api/auth/process-ocr.d.ts +9 -0
- package/dist/api/auth/process-ocr.d.ts.map +1 -0
- package/dist/api/auth/process-ocr.js +43 -0
- package/dist/api/auth/prompts/stats.d.ts +14 -0
- package/dist/api/auth/prompts/stats.d.ts.map +1 -0
- package/dist/api/auth/prompts/stats.js +46 -0
- package/dist/api/auth/prompts.d.ts +26 -0
- package/dist/api/auth/prompts.d.ts.map +1 -0
- package/dist/api/auth/prompts.js +175 -0
- package/dist/api/auth/token-balance.d.ts +26 -0
- package/dist/api/auth/token-balance.d.ts.map +1 -0
- package/dist/api/auth/token-balance.js +47 -0
- package/dist/api/auth/token-checkout.d.ts.map +1 -1
- package/dist/api/auth/token-checkout.js +22 -4
- package/dist/api/auth/token-packs.d.ts.map +1 -1
- package/dist/api/auth/token-packs.js +2 -1
- package/dist/api/auth/usage-by-model.d.ts +25 -0
- package/dist/api/auth/usage-by-model.d.ts.map +1 -0
- package/dist/api/auth/usage-by-model.js +95 -0
- package/dist/api/auth/usage.d.ts +26 -0
- package/dist/api/auth/usage.d.ts.map +1 -0
- package/dist/api/auth/usage.js +127 -0
- package/dist/api/auth/user-tokens.d.ts.map +1 -1
- package/dist/api/auth/user-tokens.js +36 -2
- package/dist/api/auth/wallet/route.d.ts +17 -0
- package/dist/api/auth/wallet/route.d.ts.map +1 -0
- package/dist/api/auth/wallet/route.js +68 -0
- package/dist/api/auth/wallet.d.ts +16 -0
- package/dist/api/auth/wallet.d.ts.map +1 -0
- package/dist/api/auth/wallet.js +71 -0
- package/dist/api/public/gateway-models.d.ts +25 -0
- package/dist/api/public/gateway-models.d.ts.map +1 -0
- package/dist/api/public/gateway-models.js +49 -0
- package/dist/api/public/pricing-summary.d.ts +46 -0
- package/dist/api/public/pricing-summary.d.ts.map +1 -0
- package/dist/api/public/pricing-summary.js +70 -0
- package/dist/api/public/prompts/[id]/stats.d.ts +15 -0
- package/dist/api/public/prompts/[id]/stats.d.ts.map +1 -0
- package/dist/api/public/prompts/[id]/stats.js +37 -0
- package/dist/api/public/prompts/[id]/view.d.ts +15 -0
- package/dist/api/public/prompts/[id]/view.d.ts.map +1 -0
- package/dist/api/public/prompts/[id]/view.js +41 -0
- package/dist/api/public/prompts/slug/[slug].d.ts +15 -0
- package/dist/api/public/prompts/slug/[slug].d.ts.map +1 -0
- package/dist/api/public/prompts/slug/[slug].js +40 -0
- package/dist/api/public/prompts/user/[username].d.ts +17 -0
- package/dist/api/public/prompts/user/[username].d.ts.map +1 -0
- package/dist/api/public/prompts/user/[username].js +51 -0
- package/dist/api/public/prompts.d.ts +15 -0
- package/dist/api/public/prompts.d.ts.map +1 -0
- package/dist/api/public/prompts.js +45 -0
- package/dist/api/public/token-packs.d.ts +11 -0
- package/dist/api/public/token-packs.d.ts.map +1 -0
- package/dist/api/public/token-packs.js +25 -0
- package/dist/api/public/token-pricing.d.ts +44 -0
- package/dist/api/public/token-pricing.d.ts.map +1 -0
- package/dist/api/public/token-pricing.js +168 -0
- package/dist/api/public/v1/_lib/artifacts.d.ts +52 -0
- package/dist/api/public/v1/_lib/artifacts.d.ts.map +1 -0
- package/dist/api/public/v1/_lib/artifacts.js +217 -0
- package/dist/api/public/v1/_lib/auth.d.ts +43 -0
- package/dist/api/public/v1/_lib/auth.d.ts.map +1 -0
- package/dist/api/public/v1/_lib/auth.js +108 -0
- package/dist/api/public/v1/_lib/errors.d.ts +17 -0
- package/dist/api/public/v1/_lib/errors.d.ts.map +1 -0
- package/dist/api/public/v1/_lib/errors.js +16 -0
- package/dist/api/public/v1/_lib/log.d.ts +29 -0
- package/dist/api/public/v1/_lib/log.d.ts.map +1 -0
- package/dist/api/public/v1/_lib/log.js +68 -0
- package/dist/api/public/v1/_lib/quota.d.ts +24 -0
- package/dist/api/public/v1/_lib/quota.d.ts.map +1 -0
- package/dist/api/public/v1/_lib/quota.js +118 -0
- package/dist/api/public/v1/_lib/router.d.ts +54 -0
- package/dist/api/public/v1/_lib/router.d.ts.map +1 -0
- package/dist/api/public/v1/_lib/router.js +119 -0
- package/dist/api/public/v1/connect.d.ts +20 -0
- package/dist/api/public/v1/connect.d.ts.map +1 -0
- package/dist/api/public/v1/connect.js +119 -0
- package/dist/api/public/v1/doc.d.ts +239 -0
- package/dist/api/public/v1/doc.d.ts.map +1 -0
- package/dist/api/public/v1/doc.js +253 -0
- package/dist/api/public/v1/history/[id].d.ts +92 -0
- package/dist/api/public/v1/history/[id].d.ts.map +1 -0
- package/dist/api/public/v1/history/[id].js +176 -0
- package/dist/api/public/v1/history.d.ts +30 -0
- package/dist/api/public/v1/history.d.ts.map +1 -0
- package/dist/api/public/v1/history.js +142 -0
- package/dist/api/public/v1/image-ai.d.ts +24 -0
- package/dist/api/public/v1/image-ai.d.ts.map +1 -0
- package/dist/api/public/v1/image-ai.js +233 -0
- package/dist/api/public/v1/prompts.d.ts +19 -0
- package/dist/api/public/v1/prompts.d.ts.map +1 -0
- package/dist/api/public/v1/prompts.js +107 -0
- package/dist/api/public/v1/provider.d.ts +16 -0
- package/dist/api/public/v1/provider.d.ts.map +1 -0
- package/dist/api/public/v1/provider.js +130 -0
- package/dist/api/public/v1/purchase.d.ts +11 -0
- package/dist/api/public/v1/purchase.d.ts.map +1 -0
- package/dist/api/public/v1/purchase.js +18 -0
- package/dist/api/public/v1/status.d.ts +35 -0
- package/dist/api/public/v1/status.d.ts.map +1 -0
- package/dist/api/public/v1/status.js +163 -0
- package/dist/api/public/v1/text-ai.d.ts +26 -0
- package/dist/api/public/v1/text-ai.d.ts.map +1 -0
- package/dist/api/public/v1/text-ai.js +239 -0
- package/dist/api/public/webhook.d.ts.map +1 -1
- package/dist/api/public/webhook.js +50 -39
- package/dist/api/track-usage.d.ts +12 -0
- package/dist/api/track-usage.d.ts.map +1 -0
- package/dist/api/track-usage.js +37 -0
- package/dist/components/Doc.d.ts.map +1 -1
- package/dist/components/Doc.js +1 -1
- package/dist/components/DocUsageCustom.js +6 -6
- package/dist/components/admin/UserTokenTab.d.ts.map +1 -1
- package/dist/components/admin/UserTokenTab.js +170 -23
- package/dist/components/auth/AuthDashboardAi.d.ts +2 -0
- package/dist/components/auth/AuthDashboardAi.d.ts.map +1 -0
- package/dist/components/auth/AuthDashboardAi.js +53 -0
- package/dist/docs/REFACTORING_BILLING_GUIDE.d.ts +277 -0
- package/dist/docs/REFACTORING_BILLING_GUIDE.d.ts.map +1 -0
- package/dist/docs/REFACTORING_BILLING_GUIDE.js +276 -0
- package/dist/index.d.ts +15 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -1
- package/dist/scripts/migrate-tokens-to-wallet.d.ts +13 -0
- package/dist/scripts/migrate-tokens-to-wallet.d.ts.map +1 -0
- package/dist/scripts/migrate-tokens-to-wallet.js +165 -0
- package/dist/server/__tests__/billing.test.d.ts +5 -0
- package/dist/server/__tests__/billing.test.d.ts.map +1 -0
- package/dist/server/__tests__/billing.test.js +223 -0
- package/dist/server/ai-client.d.ts +59 -0
- package/dist/server/ai-client.d.ts.map +1 -0
- package/dist/server/ai-client.js +111 -0
- package/dist/server/ai-generation-service.d.ts +66 -0
- package/dist/server/ai-generation-service.d.ts.map +1 -0
- package/dist/server/ai-generation-service.js +274 -0
- package/dist/server/billing.d.ts +200 -0
- package/dist/server/billing.d.ts.map +1 -0
- package/dist/server/billing.js +488 -0
- package/dist/server/gateway-service.d.ts +13 -0
- package/dist/server/gateway-service.d.ts.map +1 -0
- package/dist/server/gateway-service.js +161 -0
- package/dist/server/global-settings.d.ts +16 -0
- package/dist/server/global-settings.d.ts.map +1 -0
- package/dist/server/global-settings.js +42 -0
- package/dist/server/model-filter.d.ts +25 -0
- package/dist/server/model-filter.d.ts.map +1 -0
- package/dist/server/model-filter.js +240 -0
- package/dist/server/ocr.d.ts +39 -0
- package/dist/server/ocr.d.ts.map +1 -0
- package/dist/server/ocr.js +280 -0
- package/dist/server/openai-client.d.ts +19 -0
- package/dist/server/openai-client.d.ts.map +1 -0
- package/dist/server/openai-client.js +26 -0
- package/dist/server/pricing-config.d.ts +18 -0
- package/dist/server/pricing-config.d.ts.map +1 -0
- package/dist/server/pricing-config.js +94 -0
- package/dist/server/pricing-validator.d.ts +41 -0
- package/dist/server/pricing-validator.d.ts.map +1 -0
- package/dist/server/pricing-validator.js +113 -0
- package/dist/server/pricing.d.ts +121 -0
- package/dist/server/pricing.d.ts.map +1 -0
- package/dist/server/pricing.js +225 -0
- package/dist/server/quota.d.ts +66 -0
- package/dist/server/quota.d.ts.map +1 -0
- package/dist/server/quota.js +538 -0
- package/dist/server/wallet-repair.d.ts +32 -0
- package/dist/server/wallet-repair.d.ts.map +1 -0
- package/dist/server/wallet-repair.js +189 -0
- package/dist/server.d.ts +13 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +87 -16
- package/dist/sitemap/handlers/prompts.d.ts +6 -0
- package/dist/sitemap/handlers/prompts.d.ts.map +1 -0
- package/dist/sitemap/handlers/prompts.js +72 -0
- package/dist/sitemap/handlers/users.d.ts +6 -0
- package/dist/sitemap/handlers/users.d.ts.map +1 -0
- package/dist/sitemap/handlers/users.js +80 -0
- package/dist/sitemap/manifest.d.ts +8 -0
- package/dist/sitemap/manifest.d.ts.map +1 -0
- package/dist/sitemap/manifest.js +27 -0
- package/dist/types/gateway.d.ts +40 -0
- package/dist/types/gateway.d.ts.map +1 -0
- package/dist/types/gateway.js +4 -0
- package/dist/types/quota.d.ts +74 -0
- package/dist/types/quota.d.ts.map +1 -0
- package/dist/types/quota.js +11 -0
- package/dist/utils/date.d.ts +7 -0
- package/dist/utils/date.d.ts.map +1 -0
- package/dist/utils/date.js +17 -0
- package/dist/web/admin/AdminTokenPacksPage.js +1 -1
- package/dist/web/admin/BillingAnalyticsPage.d.ts +2 -0
- package/dist/web/admin/BillingAnalyticsPage.d.ts.map +1 -0
- package/dist/web/admin/BillingAnalyticsPage.js +141 -0
- package/dist/web/admin/GlobalAISettingsPage.d.ts +2 -0
- package/dist/web/admin/GlobalAISettingsPage.d.ts.map +1 -0
- package/dist/web/admin/GlobalAISettingsPage.js +93 -0
- package/dist/web/admin/UserTokenPage.d.ts.map +1 -1
- package/dist/web/admin/UserTokenPage.js +20 -7
- package/dist/web/auth/AISettingsPage.d.ts +2 -0
- package/dist/web/auth/AISettingsPage.d.ts.map +1 -0
- package/dist/web/auth/AISettingsPage.js +258 -0
- package/dist/web/auth/APIKeysPage.d.ts +2 -0
- package/dist/web/auth/APIKeysPage.d.ts.map +1 -0
- package/dist/web/auth/APIKeysPage.js +154 -0
- package/dist/web/auth/HistoryPage.d.ts +2 -0
- package/dist/web/auth/HistoryPage.d.ts.map +1 -0
- package/dist/web/auth/HistoryPage.js +279 -0
- package/dist/web/auth/PromptsPage.d.ts +5 -0
- package/dist/web/auth/PromptsPage.d.ts.map +1 -0
- package/dist/web/auth/PromptsPage.js +137 -0
- package/dist/web/auth/TokenPage.d.ts.map +1 -1
- package/dist/web/auth/TokenPage.js +88 -31
- package/dist/web/auth/UsageAndTokensPage.d.ts +2 -0
- package/dist/web/auth/UsageAndTokensPage.d.ts.map +1 -0
- package/dist/web/auth/UsageAndTokensPage.js +157 -0
- package/dist/web/auth/UsagePage.d.ts +2 -0
- package/dist/web/auth/UsagePage.d.ts.map +1 -0
- package/dist/web/auth/UsagePage.js +62 -0
- package/dist/web/auth/components/ApiKeyFilterSelect.d.ts +13 -0
- package/dist/web/auth/components/ApiKeyFilterSelect.d.ts.map +1 -0
- package/dist/web/auth/components/ApiKeyFilterSelect.js +16 -0
- package/dist/web/auth/components/ModelUsageTable.d.ts +19 -0
- package/dist/web/auth/components/ModelUsageTable.d.ts.map +1 -0
- package/dist/web/auth/components/ModelUsageTable.js +37 -0
- package/dist/web/auth/components/PurchaseButton.d.ts +7 -0
- package/dist/web/auth/components/PurchaseButton.d.ts.map +1 -0
- package/dist/web/auth/components/PurchaseButton.js +13 -0
- package/dist/web/auth/components/TokenHistoryCard.d.ts +20 -0
- package/dist/web/auth/components/TokenHistoryCard.d.ts.map +1 -0
- package/dist/web/auth/components/TokenHistoryCard.js +76 -0
- package/dist/web/auth/components/TokenKpiGrid.d.ts +24 -0
- package/dist/web/auth/components/TokenKpiGrid.d.ts.map +1 -0
- package/dist/web/auth/components/TokenKpiGrid.js +38 -0
- package/dist/web/auth/components/UsageByDayChart.d.ts +11 -0
- package/dist/web/auth/components/UsageByDayChart.d.ts.map +1 -0
- package/dist/web/auth/components/UsageByDayChart.js +32 -0
- package/dist/web/auth/components/UsageByModelBarChart.d.ts +12 -0
- package/dist/web/auth/components/UsageByModelBarChart.d.ts.map +1 -0
- package/dist/web/auth/components/UsageByModelBarChart.js +32 -0
- package/dist/web/auth/components/WalletStatusCard.d.ts +9 -0
- package/dist/web/auth/components/WalletStatusCard.d.ts.map +1 -0
- package/dist/web/auth/components/WalletStatusCard.js +50 -0
- package/dist/web/components/ImageGenerative.d.ts +3 -1
- package/dist/web/components/ImageGenerative.d.ts.map +1 -1
- package/dist/web/components/ImageGenerative.js +139 -52
- package/dist/web/components/TextareaGenerative.d.ts +3 -1
- package/dist/web/components/TextareaGenerative.d.ts.map +1 -1
- package/dist/web/components/TextareaGenerative.js +10 -5
- package/dist/web/public/PromptDetailPage.d.ts +25 -0
- package/dist/web/public/PromptDetailPage.d.ts.map +1 -0
- package/dist/web/public/PromptDetailPage.js +71 -0
- package/dist/web/public/PromptDetailPageServer.d.ts +15 -0
- package/dist/web/public/PromptDetailPageServer.d.ts.map +1 -0
- package/dist/web/public/PromptDetailPageServer.js +68 -0
- package/dist/web/public/PublicPromptsPage.d.ts +5 -0
- package/dist/web/public/PublicPromptsPage.d.ts.map +1 -0
- package/dist/web/public/PublicPromptsPage.js +110 -0
- package/dist/web/public/PurchaseTokensPage.d.ts +2 -0
- package/dist/web/public/PurchaseTokensPage.d.ts.map +1 -0
- package/dist/web/public/PurchaseTokensPage.js +98 -0
- package/dist/web/public/UserAvatar.d.ts +13 -0
- package/dist/web/public/UserAvatar.d.ts.map +1 -0
- package/dist/web/public/UserAvatar.js +13 -0
- package/dist/web/public/UserDetailPageServer.d.ts +15 -0
- package/dist/web/public/UserDetailPageServer.d.ts.map +1 -0
- package/dist/web/public/UserDetailPageServer.js +31 -0
- package/dist/web/public/UserPromptsPage.d.ts +9 -0
- package/dist/web/public/UserPromptsPage.d.ts.map +1 -0
- package/dist/web/public/UserPromptsPage.js +112 -0
- package/dist/web/public/UserPromptsPageServer.d.ts +15 -0
- package/dist/web/public/UserPromptsPageServer.d.ts.map +1 -0
- package/dist/web/public/UserPromptsPageServer.js +31 -0
- package/package.json +18 -9
- package/supabase/migrations/20251125000000_ai_tokens.sql +7 -0
- package/supabase/migrations/20260123100002_user_token_quota_monthly copy.sql +173 -0
- package/supabase/migrations/20260128100003_update_and_add_table.sql +368 -0
- package/supabase/migrations/20260128120000_seed_providers_models.sql +78 -0
- package/supabase/migrations/20260128131405_add_api_key_id_to_ledgers.sql +41 -0
- package/supabase/migrations/20260128140000_ai_artifacts_storage.sql +99 -0
- package/supabase/migrations/20260128140002_ai_user_settings.sql +57 -0
- package/supabase/migrations/20260128150000_drop_ai_user_settings.sql +21 -0
- package/supabase/migrations/20260128160000_wallet_billing_system.sql +192 -0
- package/supabase/migrations/20260128160001_wallet_rpc_functions.sql +165 -0
- package/supabase/migrations/20260128170000_add_pack_coef_to_token_packs.sql +30 -0
- package/supabase/migrations/20260129120000_wallet_view_rpc.sql +41 -0
- package/supabase/migrations/20260129220003_update_pack_margins.sql +31 -0
- package/supabase/migrations/20260129330004_ai_user_prompts.sql +151 -0
- package/supabase/migrations/20260129330005_ai_prompts_ip_tracking.sql +92 -0
- package/supabase/migrations/20260129330006_ai_prompts_slug.sql +64 -0
- package/supabase/migrations/20260129330007_ai_prompts_view_slug.sql +26 -0
- package/supabase/migrations/20260129440000_ai_prompts_view_username.sql +33 -0
- package/supabase/migrations/20260129450000_ai_prompts_add_lang.sql +40 -0
- package/supabase/migrations/20260131000000_extract_model_prompt_in_ledger.sql +92 -0
- package/supabase/migrations/20260131140000_fix_duplicate_purchases.sql +64 -0
- package/supabase/migrations/20260201120000_module-ai_default_models.sql +63 -0
- package/supabase/migrations/20260201130000_module-ai_remove_provider_tables.sql +17 -0
- package/supabase/migrations-down/20251217120000_user_token_quota_monthly.sql +34 -0
- package/supabase/migrations-down/20260128131405_add_api_key_id_to_ledgers.sql +25 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DEPRECATED: Admin API for single ai_provider_model CRUD
|
|
3
|
+
* @deprecated Tables ai_providers and ai_provider_models have been removed.
|
|
4
|
+
* Use /api/ai/admin/global-ai-settings instead.
|
|
5
|
+
*
|
|
6
|
+
* PUT /api/ai/admin/ai-provider-models/[id] - Update model
|
|
7
|
+
* DELETE /api/ai/admin/ai-provider-models/[id] - Delete model
|
|
8
|
+
*/
|
|
9
|
+
import { NextResponse } from "next/server";
|
|
10
|
+
import { logger } from "@lastbrain/core";
|
|
11
|
+
export async function PUT(request, { params }) {
|
|
12
|
+
logger.warn("[ai-provider-models/id] DEPRECATED endpoint called - tables no longer exist");
|
|
13
|
+
return NextResponse.json({
|
|
14
|
+
error: "This endpoint is deprecated. Tables ai_providers and ai_provider_models have been removed. Use /api/ai/admin/global-ai-settings to manage default models.",
|
|
15
|
+
deprecated: true
|
|
16
|
+
}, { status: 410 });
|
|
17
|
+
}
|
|
18
|
+
export async function DELETE(request, { params }) {
|
|
19
|
+
logger.warn("[ai-provider-models/id] DEPRECATED endpoint called - tables no longer exist");
|
|
20
|
+
return NextResponse.json({
|
|
21
|
+
error: "This endpoint is deprecated. Tables ai_providers and ai_provider_models have been removed. Use /api/ai/admin/global-ai-settings to manage default models.",
|
|
22
|
+
deprecated: true
|
|
23
|
+
}, { status: 410 });
|
|
24
|
+
from("ai_provider_models")
|
|
25
|
+
.update(validation.data)
|
|
26
|
+
.eq("id", id)
|
|
27
|
+
.select()
|
|
28
|
+
.single();
|
|
29
|
+
if (error) {
|
|
30
|
+
logger.error("[ai-provider-models] Error updating model", error);
|
|
31
|
+
return NextResponse.json({ error: error.message }, { status: 500 });
|
|
32
|
+
}
|
|
33
|
+
return NextResponse.json({ data });
|
|
34
|
+
}
|
|
35
|
+
try { }
|
|
36
|
+
catch (error) {
|
|
37
|
+
logger.error("[ai-provider-models] Unexpected error", error);
|
|
38
|
+
return NextResponse.json({ error: error.message }, { status: 500 });
|
|
39
|
+
}
|
|
40
|
+
export async function DELETE(request, { params }) {
|
|
41
|
+
try {
|
|
42
|
+
const { id } = await params;
|
|
43
|
+
const supabase = await getSupabaseServiceClient();
|
|
44
|
+
const { error } = await supabase
|
|
45
|
+
.from("ai_provider_models")
|
|
46
|
+
.delete()
|
|
47
|
+
.eq("id", id);
|
|
48
|
+
if (error) {
|
|
49
|
+
logger.error("[ai-provider-models] Error deleting model", error);
|
|
50
|
+
return NextResponse.json({ error: error.message }, { status: 500 });
|
|
51
|
+
}
|
|
52
|
+
return NextResponse.json({ success: true });
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
logger.error("[ai-provider-models] Unexpected error", error);
|
|
56
|
+
return NextResponse.json({ error: error.message }, { status: 500 });
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DEPRECATED: Admin API for ai_provider_models CRUD
|
|
3
|
+
* @deprecated Tables ai_providers and ai_provider_models have been removed.
|
|
4
|
+
* We now query Vercel AI Gateway directly for available models.
|
|
5
|
+
* Global defaults are managed via ai_global_settings table.
|
|
6
|
+
* Use /api/ai/admin/global-ai-settings instead.
|
|
7
|
+
*
|
|
8
|
+
* GET /api/ai/admin/ai-provider-models - List all models
|
|
9
|
+
* POST /api/ai/admin/ai-provider-models - Create model
|
|
10
|
+
*/
|
|
11
|
+
import { NextRequest, NextResponse } from "next/server";
|
|
12
|
+
export declare function GET(request: NextRequest): Promise<NextResponse<{
|
|
13
|
+
error: string;
|
|
14
|
+
deprecated: boolean;
|
|
15
|
+
}>>;
|
|
16
|
+
export declare function POST(request: NextRequest): Promise<NextResponse<{
|
|
17
|
+
error: string;
|
|
18
|
+
deprecated: boolean;
|
|
19
|
+
}>>;
|
|
20
|
+
//# sourceMappingURL=ai-provider-models.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-provider-models.d.ts","sourceRoot":"","sources":["../../../src/api/admin/ai-provider-models.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGxD,wBAAsB,GAAG,CAAC,OAAO,EAAE,WAAW;;;IAY7C;AAED,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW;;;IAY9C"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DEPRECATED: Admin API for ai_provider_models CRUD
|
|
3
|
+
* @deprecated Tables ai_providers and ai_provider_models have been removed.
|
|
4
|
+
* We now query Vercel AI Gateway directly for available models.
|
|
5
|
+
* Global defaults are managed via ai_global_settings table.
|
|
6
|
+
* Use /api/ai/admin/global-ai-settings instead.
|
|
7
|
+
*
|
|
8
|
+
* GET /api/ai/admin/ai-provider-models - List all models
|
|
9
|
+
* POST /api/ai/admin/ai-provider-models - Create model
|
|
10
|
+
*/
|
|
11
|
+
import { NextResponse } from "next/server";
|
|
12
|
+
import { logger } from "@lastbrain/core";
|
|
13
|
+
export async function GET(request) {
|
|
14
|
+
logger.warn("[ai-provider-models] DEPRECATED endpoint called - tables no longer exist");
|
|
15
|
+
return NextResponse.json({
|
|
16
|
+
error: "This endpoint is deprecated. Tables ai_providers and ai_provider_models have been removed. Use /api/ai/admin/global-ai-settings to manage default models.",
|
|
17
|
+
deprecated: true,
|
|
18
|
+
}, { status: 410 });
|
|
19
|
+
}
|
|
20
|
+
export async function POST(request) {
|
|
21
|
+
logger.warn("[ai-provider-models] DEPRECATED endpoint called - tables no longer exist");
|
|
22
|
+
return NextResponse.json({
|
|
23
|
+
error: "This endpoint is deprecated. Tables ai_providers and ai_provider_models have been removed. Use /api/ai/admin/global-ai-settings to manage default models.",
|
|
24
|
+
deprecated: true,
|
|
25
|
+
}, { status: 410 });
|
|
26
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DEPRECATED: Admin API for single ai_provider CRUD
|
|
3
|
+
* @deprecated Tables ai_providers and ai_provider_models have been removed.
|
|
4
|
+
* Use /api/ai/admin/global-ai-settings instead.
|
|
5
|
+
*
|
|
6
|
+
* PUT /api/ai/admin/ai-providers/[key] - Update provider
|
|
7
|
+
* DELETE /api/ai/admin/ai-providers/[key] - Delete provider
|
|
8
|
+
*/
|
|
9
|
+
import { NextRequest, NextResponse } from "next/server";
|
|
10
|
+
export declare function PUT(request: NextRequest, { params }: {
|
|
11
|
+
params: Promise<{
|
|
12
|
+
key: string;
|
|
13
|
+
}>;
|
|
14
|
+
}): Promise<NextResponse<{
|
|
15
|
+
error: string;
|
|
16
|
+
deprecated: boolean;
|
|
17
|
+
}>>;
|
|
18
|
+
//# sourceMappingURL=%5Bkey%5D.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"[key].d.ts","sourceRoot":"","sources":["../../../../src/api/admin/ai-providers/[key].ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGxD,wBAAsB,GAAG,CACvB,OAAO,EAAE,WAAW,EACpB,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE;;;IAUjD"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DEPRECATED: Admin API for single ai_provider CRUD
|
|
3
|
+
* @deprecated Tables ai_providers and ai_provider_models have been removed.
|
|
4
|
+
* Use /api/ai/admin/global-ai-settings instead.
|
|
5
|
+
*
|
|
6
|
+
* PUT /api/ai/admin/ai-providers/[key] - Update provider
|
|
7
|
+
* DELETE /api/ai/admin/ai-providers/[key] - Delete provider
|
|
8
|
+
*/
|
|
9
|
+
import { NextResponse } from "next/server";
|
|
10
|
+
import { logger } from "@lastbrain/core";
|
|
11
|
+
export async function PUT(request, { params }) {
|
|
12
|
+
logger.warn("[ai-providers/key] DEPRECATED endpoint called - tables no longer exist");
|
|
13
|
+
return NextResponse.json({
|
|
14
|
+
error: "This endpoint is deprecated. Tables ai_providers and ai_provider_models have been removed. Use /api/ai/admin/global-ai-settings to manage default models.",
|
|
15
|
+
deprecated: true
|
|
16
|
+
}, { status: 410 });
|
|
17
|
+
}
|
|
18
|
+
export async function DELETE(request, { params }) {
|
|
19
|
+
logger.warn("[ai-providers/key] DEPRECATED endpoint called - tables no longer exist");
|
|
20
|
+
return NextResponse.json({
|
|
21
|
+
error: "This endpoint is deprecated. Tables ai_providers and ai_provider_models have been removed. Use /api/ai/admin/global-ai-settings to manage default models.",
|
|
22
|
+
deprecated: true
|
|
23
|
+
}, { status: 410 });
|
|
24
|
+
select()
|
|
25
|
+
.single();
|
|
26
|
+
if (error) {
|
|
27
|
+
logger.error("[ai-providers] Error updating provider", error);
|
|
28
|
+
return NextResponse.json({ error: error.message }, { status: 500 });
|
|
29
|
+
}
|
|
30
|
+
return NextResponse.json({ data });
|
|
31
|
+
}
|
|
32
|
+
try { }
|
|
33
|
+
catch (error) {
|
|
34
|
+
logger.error("[ai-providers] Unexpected error", error);
|
|
35
|
+
return NextResponse.json({ error: error.message }, { status: 500 });
|
|
36
|
+
}
|
|
37
|
+
export async function DELETE(request, { params }) {
|
|
38
|
+
try {
|
|
39
|
+
const { key } = await params;
|
|
40
|
+
const supabase = await getSupabaseServiceClient();
|
|
41
|
+
const { error } = await supabase
|
|
42
|
+
.from("ai_providers")
|
|
43
|
+
.delete()
|
|
44
|
+
.eq("key", key);
|
|
45
|
+
if (error) {
|
|
46
|
+
logger.error("[ai-providers] Error deleting provider", error);
|
|
47
|
+
return NextResponse.json({ error: error.message }, { status: 500 });
|
|
48
|
+
}
|
|
49
|
+
return NextResponse.json({ success: true });
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
logger.error("[ai-providers] Unexpected error", error);
|
|
53
|
+
return NextResponse.json({ error: error.message }, { status: 500 });
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DEPRECATED: Admin API for ai_providers CRUD
|
|
3
|
+
* @deprecated Tables ai_providers and ai_provider_models have been removed.
|
|
4
|
+
* We now query Vercel AI Gateway directly for available models.
|
|
5
|
+
* Global defaults are managed via ai_global_settings table.
|
|
6
|
+
* Use /api/ai/admin/global-ai-settings instead.
|
|
7
|
+
*
|
|
8
|
+
* GET /api/ai/admin/ai-providers - List all providers
|
|
9
|
+
* POST /api/ai/admin/ai-providers - Create provider
|
|
10
|
+
*/
|
|
11
|
+
import { NextRequest, NextResponse } from "next/server";
|
|
12
|
+
export declare function GET(request: NextRequest): Promise<NextResponse<{
|
|
13
|
+
error: string;
|
|
14
|
+
deprecated: boolean;
|
|
15
|
+
}>>;
|
|
16
|
+
export declare function POST(request: NextRequest): Promise<NextResponse<{
|
|
17
|
+
error: string;
|
|
18
|
+
deprecated: boolean;
|
|
19
|
+
}>>;
|
|
20
|
+
//# sourceMappingURL=ai-providers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-providers.d.ts","sourceRoot":"","sources":["../../../src/api/admin/ai-providers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGxD,wBAAsB,GAAG,CAAC,OAAO,EAAE,WAAW;;;IAY7C;AAED,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW;;;IAY9C"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DEPRECATED: Admin API for ai_providers CRUD
|
|
3
|
+
* @deprecated Tables ai_providers and ai_provider_models have been removed.
|
|
4
|
+
* We now query Vercel AI Gateway directly for available models.
|
|
5
|
+
* Global defaults are managed via ai_global_settings table.
|
|
6
|
+
* Use /api/ai/admin/global-ai-settings instead.
|
|
7
|
+
*
|
|
8
|
+
* GET /api/ai/admin/ai-providers - List all providers
|
|
9
|
+
* POST /api/ai/admin/ai-providers - Create provider
|
|
10
|
+
*/
|
|
11
|
+
import { NextResponse } from "next/server";
|
|
12
|
+
import { logger } from "@lastbrain/core";
|
|
13
|
+
export async function GET(request) {
|
|
14
|
+
logger.warn("[ai-providers] DEPRECATED endpoint called - tables no longer exist");
|
|
15
|
+
return NextResponse.json({
|
|
16
|
+
error: "This endpoint is deprecated. Tables ai_providers and ai_provider_models have been removed. Use /api/ai/admin/global-ai-settings to manage default models.",
|
|
17
|
+
deprecated: true,
|
|
18
|
+
}, { status: 410 });
|
|
19
|
+
}
|
|
20
|
+
export async function POST(request) {
|
|
21
|
+
logger.warn("[ai-providers] DEPRECATED endpoint called - tables no longer exist");
|
|
22
|
+
return NextResponse.json({
|
|
23
|
+
error: "This endpoint is deprecated. Tables ai_providers and ai_provider_models have been removed. Use /api/ai/admin/global-ai-settings to manage default models.",
|
|
24
|
+
deprecated: true,
|
|
25
|
+
}, { status: 410 });
|
|
26
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { NextRequest, NextResponse } from "next/server";
|
|
2
|
+
/**
|
|
3
|
+
* GET /api/ai/admin/billing-analytics
|
|
4
|
+
* Returns billing analytics: total CA, cost, margin per user and global
|
|
5
|
+
* Now uses the new USD wallet system instead of legacy token ledger
|
|
6
|
+
*/
|
|
7
|
+
export declare function GET(_request: NextRequest): Promise<NextResponse<{
|
|
8
|
+
users: {
|
|
9
|
+
userId: string;
|
|
10
|
+
email: string | undefined;
|
|
11
|
+
tokensAdded: number;
|
|
12
|
+
tokensUsed: number;
|
|
13
|
+
totalPurchaseUsd: number;
|
|
14
|
+
totalProviderCostUsd: number;
|
|
15
|
+
totalGiftBudgetUsd: number;
|
|
16
|
+
totalCharges: number;
|
|
17
|
+
realMarginUsd: number;
|
|
18
|
+
realMarginPercent: number;
|
|
19
|
+
totalSellUsd: number;
|
|
20
|
+
totalMarginUsd: number;
|
|
21
|
+
marginPercent: number;
|
|
22
|
+
avgPackCoef: number;
|
|
23
|
+
walletProviderBudgetUsd: number;
|
|
24
|
+
walletSellValueUsd: number;
|
|
25
|
+
lastActivity: any;
|
|
26
|
+
hasActivity: boolean;
|
|
27
|
+
}[];
|
|
28
|
+
global: {
|
|
29
|
+
totalPurchaseUsd: number;
|
|
30
|
+
totalProviderCostUsd: number;
|
|
31
|
+
totalGiftBudgetUsd: number;
|
|
32
|
+
totalCharges: number;
|
|
33
|
+
realMarginUsd: number;
|
|
34
|
+
avgRealMarginPercent: number;
|
|
35
|
+
totalSellUsd: number;
|
|
36
|
+
totalMarginUsd: number;
|
|
37
|
+
avgMarginPercent: number;
|
|
38
|
+
totalUsers: number;
|
|
39
|
+
};
|
|
40
|
+
}> | NextResponse<{
|
|
41
|
+
error: any;
|
|
42
|
+
}>>;
|
|
43
|
+
//# sourceMappingURL=billing-analytics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"billing-analytics.d.ts","sourceRoot":"","sources":["../../../src/api/admin/billing-analytics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIxD;;;;GAIG;AACH,wBAAsB,GAAG,CAAC,QAAQ,EAAE,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAkN9C"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { NextResponse } from "next/server";
|
|
2
|
+
import { getSupabaseServiceClient } from "@lastbrain/core/server";
|
|
3
|
+
import { logger } from "@lastbrain/core";
|
|
4
|
+
/**
|
|
5
|
+
* GET /api/ai/admin/billing-analytics
|
|
6
|
+
* Returns billing analytics: total CA, cost, margin per user and global
|
|
7
|
+
* Now uses the new USD wallet system instead of legacy token ledger
|
|
8
|
+
*/
|
|
9
|
+
export async function GET(_request) {
|
|
10
|
+
try {
|
|
11
|
+
const supabase = getSupabaseServiceClient();
|
|
12
|
+
// Auth is already verified by middleware (superadmin required)
|
|
13
|
+
// Get all users
|
|
14
|
+
const { data: authUsers, error: usersError } = await supabase.auth.admin.listUsers();
|
|
15
|
+
if (usersError) {
|
|
16
|
+
logger.error("[Billing Analytics] Failed to fetch users:", usersError);
|
|
17
|
+
throw usersError;
|
|
18
|
+
}
|
|
19
|
+
// Get wallet states for all users
|
|
20
|
+
const { data: walletRows, error: walletError } = await supabase
|
|
21
|
+
.from("user_token_wallet")
|
|
22
|
+
.select("user_id, wallet_provider_budget_usd, wallet_sell_value_usd, created_at");
|
|
23
|
+
if (walletError) {
|
|
24
|
+
logger.error("[Billing Analytics] Failed to fetch wallets:", walletError);
|
|
25
|
+
throw walletError;
|
|
26
|
+
}
|
|
27
|
+
const wallets = new Map((walletRows || []).map((w) => [
|
|
28
|
+
w.user_id,
|
|
29
|
+
{
|
|
30
|
+
walletProviderBudgetUsd: parseFloat(w.wallet_provider_budget_usd) || 0,
|
|
31
|
+
walletSellValueUsd: parseFloat(w.wallet_sell_value_usd) || 0,
|
|
32
|
+
createdAt: w.created_at,
|
|
33
|
+
},
|
|
34
|
+
]));
|
|
35
|
+
// Get AI usage costs from user_token_ledger (real provider costs)
|
|
36
|
+
const { data: ledgerRows, error: ledgerError } = await supabase
|
|
37
|
+
.from("user_token_ledger")
|
|
38
|
+
.select("owner_id, type, provider_cost_usd, sell_usd, provider_budget_added_usd, ts")
|
|
39
|
+
.in("type", ["use", "purchase", "gift", "signup_bonus"])
|
|
40
|
+
.order("ts", { ascending: false });
|
|
41
|
+
if (ledgerError) {
|
|
42
|
+
logger.error("[Billing Analytics] Failed to fetch ledger:", ledgerError);
|
|
43
|
+
throw ledgerError;
|
|
44
|
+
}
|
|
45
|
+
const ledger = ledgerRows || [];
|
|
46
|
+
// Calculate stats per user
|
|
47
|
+
const userAnalytics = authUsers.users.map((user) => {
|
|
48
|
+
const userId = user.id;
|
|
49
|
+
const wallet = wallets.get(userId);
|
|
50
|
+
const userLedger = ledger.filter((l) => l.owner_id === userId);
|
|
51
|
+
// Separate by type
|
|
52
|
+
const purchases = userLedger.filter((l) => l.type === "purchase");
|
|
53
|
+
const usages = userLedger.filter((l) => l.type === "use");
|
|
54
|
+
const gifts = userLedger.filter((l) => l.type === "gift" || l.type === "signup_bonus");
|
|
55
|
+
// CA réel = achats uniquement
|
|
56
|
+
const totalPurchaseUsd = purchases.reduce((sum, l) => sum + (parseFloat(l.sell_usd) || 0), 0);
|
|
57
|
+
// Coût utilisation = provider costs
|
|
58
|
+
const totalProviderCostUsd = usages.reduce((sum, l) => sum + (parseFloat(l.provider_cost_usd) || 0), 0);
|
|
59
|
+
// Budget offert = budget fournisseur ajouté via gifts (non consommé)
|
|
60
|
+
const totalGiftBudgetUsd = gifts.reduce((sum, l) => sum + (parseFloat(l.provider_budget_added_usd) || 0), 0);
|
|
61
|
+
// Total sell value (what was charged to user for usage)
|
|
62
|
+
const totalSellUsd = usages.reduce((sum, l) => sum + (parseFloat(l.sell_usd) || 0), 0);
|
|
63
|
+
// Current wallet state
|
|
64
|
+
const currentSellValue = wallet?.walletSellValueUsd || 0;
|
|
65
|
+
const currentProviderBudget = wallet?.walletProviderBudgetUsd || 0;
|
|
66
|
+
// Calcul de la marge réelle
|
|
67
|
+
// Charges = UNIQUEMENT les usages consommés (pas les budgets offerts)
|
|
68
|
+
const totalCharges = totalProviderCostUsd;
|
|
69
|
+
// Marge réelle = CA (achats) - Charges (consommation réelle)
|
|
70
|
+
const realMarginUsd = totalPurchaseUsd - totalCharges;
|
|
71
|
+
const realMarginPercent = totalPurchaseUsd > 0 ? (realMarginUsd / totalPurchaseUsd) * 100 : 0;
|
|
72
|
+
// Ancienne marge (sur utilisation seulement, pour compatibilité)
|
|
73
|
+
const totalMarginUsd = totalSellUsd - totalProviderCostUsd;
|
|
74
|
+
const marginPercent = totalSellUsd > 0 ? (totalMarginUsd / totalSellUsd) * 100 : 0;
|
|
75
|
+
const hasActivity = wallet !== undefined ||
|
|
76
|
+
totalProviderCostUsd > 0 ||
|
|
77
|
+
totalPurchaseUsd > 0;
|
|
78
|
+
return {
|
|
79
|
+
userId,
|
|
80
|
+
email: user.email,
|
|
81
|
+
tokensAdded: 0, // Legacy field (tokens system deprecated)
|
|
82
|
+
tokensUsed: 0, // Legacy field (tokens system deprecated)
|
|
83
|
+
totalPurchaseUsd: parseFloat(totalPurchaseUsd.toFixed(4)), // CA réel
|
|
84
|
+
totalProviderCostUsd: parseFloat(totalProviderCostUsd.toFixed(4)), // Coût utilisation
|
|
85
|
+
totalGiftBudgetUsd: parseFloat(totalGiftBudgetUsd.toFixed(4)), // Budget offert (non consommé)
|
|
86
|
+
totalCharges: parseFloat(totalCharges.toFixed(4)), // = totalProviderCostUsd
|
|
87
|
+
realMarginUsd: parseFloat(realMarginUsd.toFixed(4)), // Marge réelle
|
|
88
|
+
realMarginPercent: parseFloat(realMarginPercent.toFixed(2)), // % marge réelle
|
|
89
|
+
// Anciennes valeurs (compatibilité)
|
|
90
|
+
totalSellUsd: parseFloat(totalSellUsd.toFixed(4)),
|
|
91
|
+
totalMarginUsd: parseFloat(totalMarginUsd.toFixed(4)),
|
|
92
|
+
marginPercent: parseFloat(marginPercent.toFixed(2)),
|
|
93
|
+
avgPackCoef: 0, // Legacy field (tokens system deprecated)
|
|
94
|
+
walletProviderBudgetUsd: parseFloat(currentProviderBudget.toFixed(4)),
|
|
95
|
+
walletSellValueUsd: parseFloat(currentSellValue.toFixed(4)),
|
|
96
|
+
lastActivity: userLedger.length > 0 ? userLedger[0].ts : wallet?.createdAt || null,
|
|
97
|
+
hasActivity,
|
|
98
|
+
};
|
|
99
|
+
});
|
|
100
|
+
// Filter out users with no activity
|
|
101
|
+
const activeUsers = userAnalytics.filter((u) => u.hasActivity);
|
|
102
|
+
// Calculate global stats (marge réelle)
|
|
103
|
+
const globalStats = {
|
|
104
|
+
totalUsers: activeUsers.length,
|
|
105
|
+
totalPurchaseUsd: activeUsers.reduce((sum, u) => sum + u.totalPurchaseUsd, 0),
|
|
106
|
+
totalProviderCostUsd: activeUsers.reduce((sum, u) => sum + u.totalProviderCostUsd, 0),
|
|
107
|
+
totalGiftBudgetUsd: activeUsers.reduce((sum, u) => sum + u.totalGiftBudgetUsd, 0),
|
|
108
|
+
totalCharges: activeUsers.reduce((sum, u) => sum + u.totalCharges, 0),
|
|
109
|
+
realMarginUsd: activeUsers.reduce((sum, u) => sum + u.realMarginUsd, 0),
|
|
110
|
+
// Anciennes valeurs
|
|
111
|
+
totalSellUsd: activeUsers.reduce((sum, u) => sum + u.totalSellUsd, 0),
|
|
112
|
+
totalMarginUsd: activeUsers.reduce((sum, u) => sum + u.totalMarginUsd, 0),
|
|
113
|
+
avgMarginPercent: activeUsers.length > 0
|
|
114
|
+
? activeUsers.reduce((sum, u) => sum + u.marginPercent, 0) /
|
|
115
|
+
activeUsers.length
|
|
116
|
+
: 0,
|
|
117
|
+
avgRealMarginPercent: activeUsers.length > 0
|
|
118
|
+
? activeUsers.reduce((sum, u) => sum + u.realMarginPercent, 0) /
|
|
119
|
+
activeUsers.length
|
|
120
|
+
: 0,
|
|
121
|
+
};
|
|
122
|
+
logger.info(`[Billing Analytics] Fetched analytics for ${activeUsers.length} active users (USD wallet system)`);
|
|
123
|
+
return NextResponse.json({
|
|
124
|
+
users: activeUsers,
|
|
125
|
+
global: {
|
|
126
|
+
...globalStats,
|
|
127
|
+
totalPurchaseUsd: parseFloat(globalStats.totalPurchaseUsd.toFixed(2)),
|
|
128
|
+
totalProviderCostUsd: parseFloat(globalStats.totalProviderCostUsd.toFixed(2)),
|
|
129
|
+
totalGiftBudgetUsd: parseFloat(globalStats.totalGiftBudgetUsd.toFixed(2)),
|
|
130
|
+
totalCharges: parseFloat(globalStats.totalCharges.toFixed(2)),
|
|
131
|
+
realMarginUsd: parseFloat(globalStats.realMarginUsd.toFixed(2)),
|
|
132
|
+
avgRealMarginPercent: parseFloat(globalStats.avgRealMarginPercent.toFixed(2)),
|
|
133
|
+
// Anciennes valeurs
|
|
134
|
+
totalSellUsd: parseFloat(globalStats.totalSellUsd.toFixed(2)),
|
|
135
|
+
totalMarginUsd: parseFloat(globalStats.totalMarginUsd.toFixed(2)),
|
|
136
|
+
avgMarginPercent: parseFloat(globalStats.avgMarginPercent.toFixed(2)),
|
|
137
|
+
},
|
|
138
|
+
}, { status: 200 });
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
logger.error("[Billing Analytics] Error:", error);
|
|
142
|
+
return NextResponse.json({ error: error.message || "Internal server error" }, { status: 500 });
|
|
143
|
+
}
|
|
144
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { NextRequest, NextResponse } from "next/server";
|
|
2
|
+
/**
|
|
3
|
+
* GET /api/ai/admin/global-ai-settings
|
|
4
|
+
* Retrieve global AI configuration (default models)
|
|
5
|
+
* Auth checked by middleware (superadmin only)
|
|
6
|
+
*/
|
|
7
|
+
export declare function GET(): Promise<NextResponse<any>>;
|
|
8
|
+
/**
|
|
9
|
+
* PUT /api/ai/admin/global-ai-settings
|
|
10
|
+
* Update global AI configuration (superadmin only)
|
|
11
|
+
* Auth checked by middleware (superadmin only)
|
|
12
|
+
*/
|
|
13
|
+
export declare function PUT(req: NextRequest): Promise<NextResponse<any>>;
|
|
14
|
+
//# sourceMappingURL=global-ai-settings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global-ai-settings.d.ts","sourceRoot":"","sources":["../../../src/api/admin/global-ai-settings.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAExD;;;;GAIG;AACH,wBAAsB,GAAG,+BAgBxB;AAED;;;;GAIG;AACH,wBAAsB,GAAG,CAAC,GAAG,EAAE,WAAW,8BA4DzC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { logger } from "@lastbrain/core";
|
|
2
|
+
import { getSupabaseServerClient, getSupabaseServiceClient, } from "@lastbrain/core/server";
|
|
3
|
+
import { NextResponse } from "next/server";
|
|
4
|
+
/**
|
|
5
|
+
* GET /api/ai/admin/global-ai-settings
|
|
6
|
+
* Retrieve global AI configuration (default models)
|
|
7
|
+
* Auth checked by middleware (superadmin only)
|
|
8
|
+
*/
|
|
9
|
+
export async function GET() {
|
|
10
|
+
// Auth already checked by middleware for /admin routes
|
|
11
|
+
const supabase = getSupabaseServiceClient();
|
|
12
|
+
const { data, error } = await supabase
|
|
13
|
+
.from("ai_global_settings")
|
|
14
|
+
.select("*")
|
|
15
|
+
.eq("id", 1)
|
|
16
|
+
.single();
|
|
17
|
+
if (error) {
|
|
18
|
+
logger.error("[global-ai-settings] Error fetching global settings:", error);
|
|
19
|
+
return NextResponse.json({ error: error.message }, { status: 500 });
|
|
20
|
+
}
|
|
21
|
+
return NextResponse.json(data);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* PUT /api/ai/admin/global-ai-settings
|
|
25
|
+
* Update global AI configuration (superadmin only)
|
|
26
|
+
* Auth checked by middleware (superadmin only)
|
|
27
|
+
*/
|
|
28
|
+
export async function PUT(req) {
|
|
29
|
+
// Auth already checked by middleware for /admin routes
|
|
30
|
+
// Get user for updated_by field
|
|
31
|
+
const supabaseAuth = await getSupabaseServerClient();
|
|
32
|
+
const { data: { user }, } = await supabaseAuth.auth.getUser();
|
|
33
|
+
const body = await req.json();
|
|
34
|
+
const { default_text_provider, default_text_model, default_image_provider, default_image_model, max_tokens_per_call, } = body;
|
|
35
|
+
// Validation basique
|
|
36
|
+
if (!default_text_provider || !default_text_model) {
|
|
37
|
+
return NextResponse.json({ error: "Text provider and model required" }, { status: 400 });
|
|
38
|
+
}
|
|
39
|
+
if (!default_image_provider || !default_image_model) {
|
|
40
|
+
return NextResponse.json({ error: "Image provider and model required" }, { status: 400 });
|
|
41
|
+
}
|
|
42
|
+
// Use service client for update
|
|
43
|
+
const supabase = getSupabaseServiceClient();
|
|
44
|
+
const { data, error } = await supabase
|
|
45
|
+
.from("ai_global_settings")
|
|
46
|
+
.update({
|
|
47
|
+
default_text_provider,
|
|
48
|
+
default_text_model,
|
|
49
|
+
default_image_provider,
|
|
50
|
+
default_image_model,
|
|
51
|
+
max_tokens_per_call: max_tokens_per_call || 16384,
|
|
52
|
+
updated_by: user?.id || null,
|
|
53
|
+
})
|
|
54
|
+
.eq("id", 1)
|
|
55
|
+
.select()
|
|
56
|
+
.single();
|
|
57
|
+
if (error) {
|
|
58
|
+
logger.error("[global-ai-settings] Error updating settings:", error);
|
|
59
|
+
return NextResponse.json({ error: error.message }, { status: 500 });
|
|
60
|
+
}
|
|
61
|
+
logger.info(`[global-ai-settings] ✅ Global defaults updated - Text: ${default_text_provider}/${default_text_model}, Image: ${default_image_provider}/${default_image_model}`);
|
|
62
|
+
return NextResponse.json(data);
|
|
63
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"[id].d.ts","sourceRoot":"","sources":["../../../../src/api/admin/token-packs/[id].ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"[id].d.ts","sourceRoot":"","sources":["../../../../src/api/admin/token-packs/[id].ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAexD;;;GAGG;AACH,wBAAsB,GAAG,CACvB,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE;;;;IAwB7C;AAED;;;GAGG;AACH,wBAAsB,MAAM,CAC1B,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE;;;;IAkB7C"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { NextResponse } from "next/server";
|
|
2
2
|
import { getSupabaseServiceClient } from "@lastbrain/core/server";
|
|
3
|
+
import { logger } from "@lastbrain/core";
|
|
3
4
|
/**
|
|
4
5
|
* PUT /api/ai/admin/token-packs/[id]
|
|
5
6
|
* Update a token pack
|
|
@@ -20,7 +21,7 @@ export async function PUT(request, context) {
|
|
|
20
21
|
return NextResponse.json({ data }, { status: 200 });
|
|
21
22
|
}
|
|
22
23
|
catch (error) {
|
|
23
|
-
|
|
24
|
+
logger.error("[Admin Token Packs] PUT error:", error);
|
|
24
25
|
return NextResponse.json({ error: error.message || "Erreur lors de la mise à jour du pack" }, { status: 500 });
|
|
25
26
|
}
|
|
26
27
|
}
|
|
@@ -38,7 +39,7 @@ export async function DELETE(request, context) {
|
|
|
38
39
|
return NextResponse.json({ success: true }, { status: 200 });
|
|
39
40
|
}
|
|
40
41
|
catch (error) {
|
|
41
|
-
|
|
42
|
+
logger.error("[Admin Token Packs] DELETE error:", error);
|
|
42
43
|
return NextResponse.json({ error: error.message || "Erreur lors de la suppression du pack" }, { status: 500 });
|
|
43
44
|
}
|
|
44
45
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-packs.d.ts","sourceRoot":"","sources":["../../../src/api/admin/token-packs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"token-packs.d.ts","sourceRoot":"","sources":["../../../src/api/admin/token-packs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAgBxD;;;GAGG;AACH,wBAAsB,GAAG;;;;IAmBxB;AAED;;;GAGG;AACH,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW;;;;IAgD9C"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { NextResponse } from "next/server";
|
|
2
2
|
import { getSupabaseServiceClient } from "@lastbrain/core/server";
|
|
3
|
+
import { logger } from "@lastbrain/core";
|
|
3
4
|
/**
|
|
4
5
|
* GET /api/ai/admin/token-packs
|
|
5
6
|
* List all token packs (including inactive)
|
|
@@ -16,7 +17,7 @@ export async function GET() {
|
|
|
16
17
|
return NextResponse.json({ data }, { status: 200 });
|
|
17
18
|
}
|
|
18
19
|
catch (error) {
|
|
19
|
-
|
|
20
|
+
logger.error("[Admin Token Packs] GET error:", error);
|
|
20
21
|
return NextResponse.json({ error: error.message || "Erreur lors de la récupération des packs" }, { status: 500 });
|
|
21
22
|
}
|
|
22
23
|
}
|
|
@@ -51,7 +52,7 @@ export async function POST(request) {
|
|
|
51
52
|
return NextResponse.json({ data }, { status: 201 });
|
|
52
53
|
}
|
|
53
54
|
catch (error) {
|
|
54
|
-
|
|
55
|
+
logger.error("[Admin Token Packs] POST error:", error);
|
|
55
56
|
return NextResponse.json({ error: error.message || "Erreur lors de la création du pack" }, { status: 500 });
|
|
56
57
|
}
|
|
57
58
|
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GET /api/ai/admin/user-monthly-details?userId=xxx&month=2026-01
|
|
3
|
+
* Get detailed monthly usage for a specific user
|
|
4
|
+
*/
|
|
5
|
+
import { NextRequest, NextResponse } from "next/server";
|
|
6
|
+
export declare function GET(request: NextRequest): Promise<NextResponse<{
|
|
7
|
+
error: string;
|
|
8
|
+
}> | NextResponse<{
|
|
9
|
+
user: {
|
|
10
|
+
id: string;
|
|
11
|
+
email: string;
|
|
12
|
+
};
|
|
13
|
+
month: string;
|
|
14
|
+
summary: {
|
|
15
|
+
totalPurchases: number;
|
|
16
|
+
totalGifts: number;
|
|
17
|
+
totalUsages: number;
|
|
18
|
+
totalPurchaseUsd: number;
|
|
19
|
+
totalProviderCostUsd: number;
|
|
20
|
+
totalGiftBudgetUsd: number;
|
|
21
|
+
totalCharges: number;
|
|
22
|
+
realMarginUsd: number;
|
|
23
|
+
realMarginPercent: number;
|
|
24
|
+
totalSellUsd: number;
|
|
25
|
+
totalMarginUsd: number;
|
|
26
|
+
marginPercent: number;
|
|
27
|
+
};
|
|
28
|
+
usageByAction: {
|
|
29
|
+
avgCostPerCall: number;
|
|
30
|
+
count: number;
|
|
31
|
+
providerCostUsd: number;
|
|
32
|
+
sellUsd: number;
|
|
33
|
+
marginUsd: number;
|
|
34
|
+
actionType: string;
|
|
35
|
+
}[];
|
|
36
|
+
recentEntries: {
|
|
37
|
+
created_at: any;
|
|
38
|
+
type: any;
|
|
39
|
+
debit_tokens: any;
|
|
40
|
+
provider_cost_usd: any;
|
|
41
|
+
sell_usd: any;
|
|
42
|
+
margin_usd: any;
|
|
43
|
+
model: any;
|
|
44
|
+
provider: any;
|
|
45
|
+
meta: any;
|
|
46
|
+
provider_budget_added_usd: any;
|
|
47
|
+
}[];
|
|
48
|
+
}>>;
|
|
49
|
+
//# sourceMappingURL=user-monthly-details.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-monthly-details.d.ts","sourceRoot":"","sources":["../../../src/api/admin/user-monthly-details.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIxD,wBAAsB,GAAG,CAAC,OAAO,EAAE,WAAW;;;;;;;;;;;;;;;;;;;;;;;;eA8F/B,MAAM;yBACI,MAAM;iBACd,MAAM;mBACJ,MAAM;;;;;;;;;;;;;;;IA+FxB"}
|