diff --git a/web/default/src/features/usage-logs/lib/utils.ts b/web/default/src/features/usage-logs/lib/utils.ts
index 22a648f87f1b..9e16b434d736 100644
--- a/web/default/src/features/usage-logs/lib/utils.ts
+++ b/web/default/src/features/usage-logs/lib/utils.ts
@@ -31,6 +31,7 @@ import {
LOG_TYPES,
DISPLAYABLE_LOG_TYPES,
TIMING_LOG_TYPES,
+ LOG_TYPE_ENUM,
} from '../constants'
import type {
GetLogsParams,
@@ -259,18 +260,31 @@ export function buildApiParams(config: {
export async function fetchLogsByCategory(
config: FetchLogsConfig
): Promise {
- const { logCategory, isAdmin, page, pageSize, searchParams, columnFilters } =
- config
+ const {
+ logCategory,
+ isAdmin,
+ adminOverride = false,
+ page,
+ pageSize,
+ searchParams,
+ columnFilters,
+ } = config
+ const hasAllLogAccess = isAdmin || adminOverride
- if (logCategory === 'common') {
+ if (logCategory === 'common' || logCategory === 'audit') {
const params = buildApiParams({
page,
pageSize,
searchParams,
columnFilters,
- isAdmin,
+ isAdmin: hasAllLogAccess,
})
- return isAdmin ? await getAllLogs(params) : await getUserLogs(params)
+ if (logCategory === 'audit') {
+ params.type = LOG_TYPE_ENUM.MANAGE
+ }
+ return hasAllLogAccess
+ ? await getAllLogs(params)
+ : await getUserLogs(params)
}
// For drawing and task logs
diff --git a/web/default/src/features/usage-logs/section-registry.tsx b/web/default/src/features/usage-logs/section-registry.tsx
index 4bd2ce6522de..4a6d901b5ff7 100644
--- a/web/default/src/features/usage-logs/section-registry.tsx
+++ b/web/default/src/features/usage-logs/section-registry.tsx
@@ -27,6 +27,11 @@ const USAGE_LOGS_SECTIONS = [
titleKey: 'Common Logs',
build: () => null, // Content is rendered directly in the page component
},
+ {
+ id: 'audit',
+ titleKey: 'Audit Logs',
+ build: () => null, // Content is rendered directly in the page component
+ },
{
id: 'drawing',
titleKey: 'Drawing Logs',
diff --git a/web/default/src/features/usage-logs/types.ts b/web/default/src/features/usage-logs/types.ts
index 1681f99d41f4..7b9eeb00e73a 100644
--- a/web/default/src/features/usage-logs/types.ts
+++ b/web/default/src/features/usage-logs/types.ts
@@ -28,7 +28,7 @@ import type { UsageLog } from './data/schema'
/**
* Log category for different log types
*/
-export type LogCategory = 'common' | 'drawing' | 'task'
+export type LogCategory = 'common' | 'audit' | 'drawing' | 'task'
// ============================================================================
// Filter Types
@@ -357,6 +357,7 @@ export interface GetTaskLogsParams {
export interface FetchLogsConfig {
logCategory: LogCategory
isAdmin: boolean
+ adminOverride?: boolean
page: number
pageSize: number
searchParams: Record
diff --git a/web/default/src/hooks/use-sidebar-config.ts b/web/default/src/hooks/use-sidebar-config.ts
index 5bc7fbad2383..ce11c8c9d68a 100644
--- a/web/default/src/hooks/use-sidebar-config.ts
+++ b/web/default/src/hooks/use-sidebar-config.ts
@@ -17,9 +17,10 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { useMemo } from 'react'
-import { useAuthStore } from '@/stores/auth-store'
-import { useStatus } from '@/hooks/use-status'
+
import type { NavGroup, NavItem } from '@/components/layout/types'
+import { useStatus } from '@/hooks/use-status'
+import { useAuthStore } from '@/stores/auth-store'
type SidebarSectionConfig = {
enabled: boolean
@@ -102,10 +103,12 @@ const URL_TO_CONFIG_MAP: Record = {
'/keys': { section: 'console', module: 'token' },
'/usage-logs': { section: 'console', module: 'log' },
'/usage-logs/common': { section: 'console', module: 'log' },
+ '/usage-logs/audit': { section: 'admin', module: 'setting' },
'/usage-logs/drawing': { section: 'console', module: 'midjourney' },
'/usage-logs/task': { section: 'console', module: 'task' },
'/wallet': { section: 'personal', module: 'topup' },
'/profile': { section: 'personal', module: 'personal' },
+ '/marketplace': { section: 'console', module: 'detail' },
'/channels': { section: 'admin', module: 'channel' },
'/models': { section: 'admin', module: 'models' },
'/models/metadata': { section: 'admin', module: 'models' },
@@ -113,6 +116,9 @@ const URL_TO_CONFIG_MAP: Record = {
'/users': { section: 'admin', module: 'user' },
'/redemption-codes': { section: 'admin', module: 'redemption' },
'/subscriptions': { section: 'admin', module: 'subscription' },
+ '/provider-console': { section: 'admin', module: 'models' },
+ '/finance': { section: 'admin', module: 'setting' },
+ '/rbac': { section: 'admin', module: 'user' },
'/system-settings': { section: 'admin', module: 'setting' },
'/system-settings/site': { section: 'admin', module: 'setting' },
}
diff --git a/web/default/src/hooks/use-sidebar-data.ts b/web/default/src/hooks/use-sidebar-data.ts
index 0ecfe3dd7840..9d5994eb1c1a 100644
--- a/web/default/src/hooks/use-sidebar-data.ts
+++ b/web/default/src/hooks/use-sidebar-data.ts
@@ -21,11 +21,15 @@ import {
Box,
CreditCard,
FileText,
+ FileSearch,
FlaskConical,
+ HandCoins,
Key,
LayoutDashboard,
ListTodo,
MessageSquare,
+ ShieldCheck,
+ Store,
Radio,
Settings,
Ticket,
@@ -34,6 +38,7 @@ import {
Wallet,
} from 'lucide-react'
import { useTranslation } from 'react-i18next'
+
import { type SidebarData } from '@/components/layout/types'
/**
@@ -87,6 +92,11 @@ export function useSidebarData(): SidebarData {
url: '/usage-logs/common',
icon: FileText,
},
+ {
+ title: t('Model Marketplace'),
+ url: '/marketplace',
+ icon: Store,
+ },
{
title: t('Task Logs'),
url: '/usage-logs/task',
@@ -131,6 +141,26 @@ export function useSidebarData(): SidebarData {
url: '/users',
icon: Users,
},
+ {
+ title: t('Provider Console'),
+ url: '/provider-console',
+ icon: Store,
+ },
+ {
+ title: t('Finance Foundation'),
+ url: '/finance',
+ icon: HandCoins,
+ },
+ {
+ title: t('Roles & Permissions'),
+ url: '/rbac',
+ icon: ShieldCheck,
+ },
+ {
+ title: t('Audit Logs'),
+ url: '/usage-logs/audit',
+ icon: FileSearch,
+ },
{
title: t('Redemption Codes'),
url: '/redemption-codes',
diff --git a/web/default/src/hooks/use-sidebar-view.ts b/web/default/src/hooks/use-sidebar-view.ts
index 1b430db5d73f..d613caee032c 100644
--- a/web/default/src/hooks/use-sidebar-view.ts
+++ b/web/default/src/hooks/use-sidebar-view.ts
@@ -16,13 +16,16 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import { useMemo } from 'react'
import { useLocation } from '@tanstack/react-router'
+import { useMemo } from 'react'
import { useTranslation } from 'react-i18next'
-import { useAuthStore } from '@/stores/auth-store'
-import { ROLE } from '@/lib/roles'
+
import { resolveSidebarView } from '@/components/layout/lib/sidebar-view-registry'
import type { NavGroup, ResolvedSidebarView } from '@/components/layout/types'
+import { hasAnyPermission, hasPermission, PERMISSION } from '@/lib/rbac'
+import { ROLE } from '@/lib/roles'
+import { useAuthStore } from '@/stores/auth-store'
+
import { useSidebarConfig } from './use-sidebar-config'
import { useSidebarData } from './use-sidebar-data'
@@ -46,15 +49,43 @@ export function useSidebarView(): ResolvedSidebarView {
const { t } = useTranslation()
const pathname = useLocation({ select: (l) => l.pathname })
const userRole = useAuthStore((s) => s.auth.user?.role)
+ const user = useAuthStore((s) => s.auth.user)
const rootSidebarData = useSidebarData()
const configFilteredRoot = useSidebarConfig(rootSidebarData.navGroups)
const rootNavGroups = useMemo(() => {
const isAdmin = userRole !== undefined && userRole >= ROLE.ADMIN
- return configFilteredRoot.filter((group) =>
- group.id === 'admin' ? isAdmin : true
- )
- }, [configFilteredRoot, userRole])
+ return configFilteredRoot
+ .filter((group) => (group.id === 'admin' ? isAdmin : true))
+ .map((group) => ({
+ ...group,
+ items: group.items.filter((item) => {
+ if ('url' in item && item.url === '/marketplace') {
+ return hasPermission(user, PERMISSION.MARKETPLACE_VIEW)
+ }
+ if ('url' in item && item.url === '/provider-console') {
+ return hasAnyPermission(user, [
+ PERMISSION.PROVIDER_MANAGE,
+ PERMISSION.PROVIDER_SELF_MANAGE,
+ ])
+ }
+ if ('url' in item && item.url === '/finance') {
+ return hasAnyPermission(user, [
+ PERMISSION.FINANCE_MANAGE,
+ PERMISSION.FINANCE_VIEW,
+ ])
+ }
+ if ('url' in item && item.url === '/rbac') {
+ return hasPermission(user, PERMISSION.RBAC_MANAGE)
+ }
+ if ('url' in item && item.url === '/usage-logs/audit') {
+ return hasPermission(user, PERMISSION.AUDIT_VIEW)
+ }
+ return true
+ }),
+ }))
+ .filter((group) => group.items.length > 0)
+ }, [configFilteredRoot, userRole, user])
const view = resolveSidebarView(pathname)
diff --git a/web/default/src/i18n/locales/en.json b/web/default/src/i18n/locales/en.json
index c1c0e9ca5f61..dd6797872360 100644
--- a/web/default/src/i18n/locales/en.json
+++ b/web/default/src/i18n/locales/en.json
@@ -351,6 +351,7 @@
"API Addresses": "API Addresses",
"API Base URL (Important: Not Chat API) *": "API Base URL (Important: Not Chat API) *",
"API Base URL *": "API Base URL *",
+ "API Configuration": "API Configuration",
"API Endpoints": "API Endpoints",
"API Info": "API Info",
"API info added. Click \"Save Settings\" to apply.": "API info added. Click \"Save Settings\" to apply.",
@@ -402,6 +403,7 @@
"Apply reset": "Apply reset",
"Apply Sync": "Apply Sync",
"Applying...": "Applying...",
+ "Approved models can later be listed for users.": "Approved models can later be listed for users.",
"Approx.": "Approx.",
"apps": "apps",
"Apps": "Apps",
@@ -580,10 +582,12 @@
"Billing Mode": "Billing Mode",
"Billing Process": "Billing Process",
"Billing Source": "Billing Source",
+ "Billing Type": "Billing Type",
"Bind": "Bind",
"Bind a Pancake store + product": "Bind a Pancake store + product",
"Bind an email address to your account.": "Bind an email address to your account.",
"Bind Email": "Bind Email",
+ "Bind extra platform roles while preserving legacy role levels.": "Bind extra platform roles while preserving legacy role levels.",
"Bind Telegram Account": "Bind Telegram Account",
"Bind WeChat Account": "Bind WeChat Account",
"Binding Information": "Binding Information",
@@ -623,6 +627,7 @@
"Built for developers,": "Built for developers,",
"Built-in": "Built-in",
"Built-in Device": "Built-in Device",
+ "Built-in roles define the phase one access boundaries.": "Built-in roles define the phase one access boundaries.",
"Built-in: phone fingerprint/face, or Windows Hello; External: USB security key": "Built-in: phone fingerprint/face, or Windows Hello; External: USB security key",
"by": "by",
"By category": "By category",
@@ -658,6 +663,7 @@
"Calculating...": "Calculating...",
"Call Count Distribution": "Call Count Distribution",
"Call Count Ranking": "Call Count Ranking",
+ "Call Price": "Call Price",
"Call Proportion": "Call Proportion",
"Call Trend": "Call Trend",
"Callback address": "Callback address",
@@ -668,6 +674,7 @@
"Cancelled": "Cancelled",
"Cancelled at": "Cancelled at",
"Capabilities": "Capabilities",
+ "Capability Tags": "Capability Tags",
"Capture a reusable bundle of models, tags, or endpoints.": "Capture a reusable bundle of models, tags, or endpoints.",
"Card view": "Card view",
"Category": "Category",
@@ -849,6 +856,7 @@
"Comma-separated model names (leave empty to keep current)": "Comma-separated model names (leave empty to keep current)",
"Comma-separated model names, e.g., gpt-4,gpt-3.5-turbo": "Comma-separated model names, e.g., gpt-4,gpt-3.5-turbo",
"Command": "Command",
+ "Commission Ratio": "Commission Ratio",
"Common": "Common",
"Common Keys": "Common Keys",
"Common Logs": "Common Logs",
@@ -914,6 +922,7 @@
"Configure rate limiting rules for a specific user group.": "Configure rate limiting rules for a specific user group.",
"Configure routes": "Configure routes",
"Configure the ratio for this group.": "Configure the ratio for this group.",
+ "Configure upstream access without exposing secrets.": "Configure upstream access without exposing secrets.",
"Configure upstream providers and routing.": "Configure upstream providers and routing.",
"Configure Waffo Pancake hosted checkout integration for USD-priced top-ups": "Configure Waffo Pancake hosted checkout integration for USD-priced top-ups",
"Configure Waffo payment aggregation platform integration": "Configure Waffo payment aggregation platform integration",
@@ -965,6 +974,7 @@
"Console Content": "Console Content",
"Consume": "Consume",
"Consumed in the last 24 hours": "Consumed in the last 24 hours",
+ "Contact": "Contact",
"Container": "Container",
"Container name": "Container name",
"Containers": "Containers",
@@ -976,6 +986,7 @@
"Content not modified!": "Content not modified!",
"Content width": "Content width",
"Context": "Context",
+ "Context Length": "Context Length",
"Continue": "Continue",
"Continue with {{name}}": "Continue with {{name}}",
"Continue with Discord": "Continue with Discord",
@@ -1067,6 +1078,7 @@
"Create multiple redemption codes at once (1-100)": "Create multiple redemption codes at once (1-100)",
"Create new subscription plan": "Create New Subscription Plan",
"Create or update frequently asked questions for users": "Create or update frequently asked questions for users",
+ "Create or update provider identity for marketplace ownership.": "Create or update provider identity for marketplace ownership.",
"Create or update system announcements for the dashboard": "Create or update system announcements for the dashboard",
"Create Plan": "Create Plan",
"Create Prefill Group": "Create Prefill Group",
@@ -1867,6 +1879,7 @@
"Final cost = base × multiplier when conditions match": "Final cost = base × multiplier when conditions match",
"Final price multiplier (0.95 = 5% discount": "Final price multiplier (0.95 = 5% discount",
"Finance": "Finance",
+ "Finance Foundation": "Finance Foundation",
"Finish Time": "Finish Time",
"First API request": "First API request",
"First/Last Frame to Video": "First/Last Frame to Video",
@@ -2168,6 +2181,7 @@
"Input": "Input",
"Input mode": "Input mode",
"Input price": "Input price",
+ "Input Price": "Input Price",
"Input price is required before saving dependent prices.": "Input price is required before saving dependent prices.",
"Input tokens": "Input tokens",
"Input Tokens": "Input Tokens",
@@ -2374,6 +2388,7 @@
"Low balance": "Low balance",
"Lowest median first-token latency": "Lowest median first-token latency",
"m": "m",
+ "Maintain the phase one model foundation data.": "Maintain the phase one model foundation data.",
"Maintenance": "Maintenance",
"Make it easier for teammates to pick the right group.": "Make it easier for teammates to pick the right group.",
"Manage": "Manage",
@@ -2398,6 +2413,7 @@
"Map upstream status codes to different codes": "Map upstream status codes to different codes",
"Market Share": "Market Share",
"Marketing": "Marketing",
+ "Marketplace Models": "Marketplace Models",
"Match All (AND)": "Match All (AND)",
"Match Any (OR)": "Match Any (OR)",
"Match Mode": "Match Mode",
@@ -2458,6 +2474,7 @@
"Minimum top-up quantity": "Minimum top-up quantity",
"Minimum topup amount: {{amount}}": "Minimum topup amount: {{amount}}",
"Minimum Trust Level": "Minimum Trust Level",
+ "Minimum Withdrawal": "Minimum Withdrawal",
"Minimum:": "Minimum:",
"Minor blips in the last 30 days": "Minor blips in the last 30 days",
"Mint a fresh pair below — or pick an existing one further down. Click Save when ready.": "Mint a fresh pair below — or pick an existing one further down. Click Save when ready.",
@@ -2492,6 +2509,7 @@
"Model enabled successfully": "Model enabled successfully",
"Model fixed pricing": "Model fixed pricing",
"Model Group": "Model Group",
+ "Model Keys": "Model Keys",
"Model Limits": "Model Limits",
"Model Mapping": "Model Mapping",
"Model Mapping (JSON)": "Model Mapping (JSON)",
@@ -2499,6 +2517,7 @@
"Model mapping must be a JSON object with string values": "Model mapping must be a JSON object with string values",
"Model mapping must be valid JSON": "Model mapping must be valid JSON",
"Model mapping values must be strings": "Model mapping values must be strings",
+ "Model Marketplace": "Model Marketplace",
"Model name": "Model name",
"Model Name": "Model Name",
"Model Name *": "Model Name *",
@@ -2523,6 +2542,7 @@
"Model Tags": "Model Tags",
"Model to use for testing": "Model to use for testing",
"Model to use when testing channel connectivity": "Model to use when testing channel connectivity",
+ "Model Type": "Model Type",
"Model Version *": "Model Version *",
"model(s) selected out of": "model(s) selected out of",
"model(s)? This action cannot be undone.": "model(s)? This action cannot be undone.",
@@ -2709,12 +2729,14 @@
"No incidents in the last 24 hours": "No incidents in the last 24 hours",
"No incidents in the last 30 days": "No incidents in the last 30 days",
"No Inviter": "No Inviter",
+ "No keys configured": "No keys configured",
"No keys found": "No keys found",
"No latency data available": "No latency data available",
"No log entries matched the selected time.": "No log entries matched the selected time.",
"No logs": "No logs",
"No Logs Found": "No Logs Found",
"No mappings configured. Click \"Add Row\" to get started.": "No mappings configured. Click \"Add Row\" to get started.",
+ "No marketplace models found": "No marketplace models found",
"No matches found": "No matches found",
"No matching items": "No matching items",
"No matching results": "No matching results",
@@ -2759,6 +2781,7 @@
"No products configured. Click \"Add product\" to get started.": "No products configured. Click \"Add product\" to get started.",
"No products match your search": "No products match your search",
"No providers available": "No providers available",
+ "No providers found": "No providers found",
"No Quota": "No Quota",
"No ratio differences found": "No ratio differences found",
"No recent usage": "No recent usage",
@@ -2775,6 +2798,7 @@
"No results found": "No results found",
"No results found.": "No results found.",
"No Retry": "No Retry",
+ "No roles found": "No roles found",
"No rules yet": "No rules yet",
"No rules yet. Add a group below to get started.": "No rules yet. Add a group below to get started.",
"No separate media pricing configured.": "No separate media pricing configured.",
@@ -2879,6 +2903,7 @@
"Only available for admins. When enabled, you will receive a summary notification via your selected method when the scheduled model check detects upstream model changes or check failures.": "Only available for admins. When enabled, you will receive a summary notification via your selected method when the scheduled model check detects upstream model changes or check failures.",
"Only configured combinations are overridden. All other calls keep the token group base ratio.": "Only configured combinations are overridden. All other calls keep the token group base ratio.",
"Only enter the site origin, for example https://api.example.com. Do not include any path such as /api/user/epay/notify. Leave blank to use the server address.": "Only enter the site origin, for example https://api.example.com. Do not include any path such as /api/user/epay/notify. Leave blank to use the server address.",
+ "Only masked keys are shown after saving.": "Only masked keys are shown after saving.",
"Only selected fields will be overwritten. You can re-run the sync wizard if new conflicts appear.": "Only selected fields will be overwritten. You can re-run the sync wizard if new conflicts appear.",
"Only successful requests": "Only successful requests",
"Only successful requests count toward this limit.": "Only successful requests count toward this limit.",
@@ -2965,6 +2990,7 @@
"Output aspect ratio": "Output aspect ratio",
"Output image size": "Output image size",
"Output price": "Output price",
+ "Output Price": "Output Price",
"Output token price for generated tokens.": "Output token price for generated tokens.",
"Output tokens": "Output tokens",
"Output Tokens": "Output Tokens",
@@ -3251,6 +3277,7 @@
"Price: High to Low": "Price: High to Low",
"Price: Low to High": "Price: Low to High",
"Prices shown per": "Prices shown per",
+ "Prices stay in draft until a later review flow approves them.": "Prices stay in draft until a later review flow approves them.",
"Prices synced successfully": "Prices synced successfully",
"Prices vary by usage tier and request conditions": "Prices vary by usage tier and request conditions",
"Pricing": "Pricing",
@@ -3302,12 +3329,17 @@
"Provide per-model header overrides as JSON. Useful for enabling beta features such as expanded context windows.": "Provide per-model header overrides as JSON. Useful for enabling beta features such as expanded context windows.",
"Provider": "Provider",
"Provider & data privacy": "Provider & data privacy",
+ "Provider Console": "Provider Console",
"Provider created successfully": "Provider created successfully",
"Provider deleted successfully": "Provider deleted successfully",
"Provider Name": "Provider Name",
+ "Provider Profile": "Provider Profile",
+ "Provider Profiles": "Provider Profiles",
"Provider type (OpenAI, Anthropic, etc.)": "Provider type (OpenAI, Anthropic, etc.)",
"Provider updated successfully": "Provider updated successfully",
+ "Provider Wallet": "Provider Wallet",
"Provider-specific endpoint, account, and compatibility settings.": "Provider-specific endpoint, account, and compatibility settings.",
+ "Providers can only see their own profile unless granted platform permissions.": "Providers can only see their own profile unless granted platform permissions.",
"Proxy Address": "Proxy Address",
"Prune Object Items": "Prune Object Items",
"Prune object items by conditions": "Prune object items by conditions",
@@ -3611,7 +3643,9 @@
"Rewrite callback URLs to the local server": "Rewrite callback URLs to the local server",
"Right to Left": "Right to Left",
"Role": "Role",
+ "Role Matrix": "Role Matrix",
"Roleplay": "Roleplay",
+ "Roles & Permissions": "Roles & Permissions",
"Root": "Root",
"Rose Garden": "Rose Garden",
"Route": "Route",
@@ -3746,6 +3780,7 @@
"Select a model to edit pricing": "Select a model to edit pricing",
"Select a preset...": "Select a preset...",
"Select a product": "Select a product",
+ "Select a provider to manage wallet and settlement settings.": "Select a provider to manage wallet and settlement settings.",
"Select a role": "Select a role",
"Select a rule to edit.": "Select a rule to edit.",
"Select a store": "Select a store",
@@ -3867,6 +3902,7 @@
"Settings": "Settings",
"Settings & Preferences": "Settings & Preferences",
"Settings updated successfully": "Settings updated successfully",
+ "Settlement Configuration": "Settlement Configuration",
"Setup guide": "Setup guide",
"Setup guide complete": "Setup guide complete",
"Setup guide is collapsed. Expand it anytime.": "Setup guide is collapsed. Expand it anytime.",
@@ -3879,11 +3915,11 @@
"Shorten": "Shorten",
"Show": "Show",
"Show All": "Show All",
- "Show sensitive data": "Show sensitive data",
"Show all providers including unbound": "Show all providers including unbound",
"Show only bound providers": "Show only bound providers",
"Show or hide flow columns": "Show or hide flow columns",
"Show prices in currency instead of quota.": "Show prices in currency instead of quota.",
+ "Show sensitive data": "Show sensitive data",
"Show setup guide": "Show setup guide",
"Show token usage statistics in the UI": "Show token usage statistics in the UI",
"Showcase core capabilities with demo credentials and limited access.": "Showcase core capabilities with demo credentials and limited access.",
@@ -4089,6 +4125,7 @@
"System setup wizard": "System setup wizard",
"System task records": "System task records",
"System Version": "System Version",
+ "System-only wallet data for phase one settlement tracking.": "System-only wallet data for phase one settlement tracking.",
"Table view": "Table view",
"Tag": "Tag",
"Tag Aggregate": "Tag Aggregate",
@@ -4526,6 +4563,8 @@
"USD Exchange Rate": "USD Exchange Rate",
"USD price per 1M input tokens.": "USD price per 1M input tokens.",
"USD price per 1M tokens.": "USD price per 1M tokens.",
+ "USDT conversion and commission settings are manually configured.": "USDT conversion and commission settings are manually configured.",
+ "USDT Rate": "USDT Rate",
"Use +: to add a group, -: to remove a default selectable group, or no prefix to append a group.": "Use +: to add a group, -: to remove a default selectable group, or no prefix to append a group.",
"Use a compatible browser or device with biometric authentication or a security key to register a Passkey.": "Use a compatible browser or device with biometric authentication or a security key to register a Passkey.",
"Use a path to append it to the channel Base URL, or enter a full URL to override the Base URL for this route.": "Use a path to append it to the channel Base URL, or enter a full URL to override the Base URL for this route.",
@@ -4581,6 +4620,7 @@
"User Information": "User Information",
"User Menu": "User Menu",
"User personal functions": "User personal functions",
+ "User Role Binding": "User Role Binding",
"User selectable": "User selectable",
"User Subscription Management": "User Subscription Management",
"User updated successfully": "User updated successfully",
@@ -4692,6 +4732,7 @@
"Waiting": "Waiting",
"Waiting for email...": "Waiting for email...",
"Wallet": "Wallet",
+ "Wallet Address": "Wallet Address",
"Wallet First": "Wallet First",
"Wallet Management": "Wallet Management",
"Wallet management and personal preferences.": "Wallet management and personal preferences.",
@@ -4762,6 +4803,7 @@
"Wire encoding for the embedding vectors": "Wire encoding for the embedding vectors",
"with conflicts": "with conflicts",
"with the API key from your token settings.": "with the API key from your token settings.",
+ "Withdrawal Fee": "Withdrawal Fee",
"Without additional conditions, only the type above is used for pruning.": "Without additional conditions, only the type above is used for pruning.",
"Worker Access Key": "Worker Access Key",
"Worker Proxy": "Worker Proxy",
diff --git a/web/default/src/i18n/locales/fr.json b/web/default/src/i18n/locales/fr.json
index 5c096ca7dee6..de1fe67bf770 100644
--- a/web/default/src/i18n/locales/fr.json
+++ b/web/default/src/i18n/locales/fr.json
@@ -351,6 +351,7 @@
"API Addresses": "Adresses API",
"API Base URL (Important: Not Chat API) *": "URL de base de l'API (Important : Pas l'API de Chat) *",
"API Base URL *": "URL de base de l'API *",
+ "API Configuration": "Configuration API",
"API Endpoints": "Points de terminaison API",
"API Info": "Infos API",
"API info added. Click \"Save Settings\" to apply.": "Informations API ajoutées. Cliquez sur \"Enregistrer les paramètres\" pour appliquer.",
@@ -358,7 +359,7 @@
"API info saved successfully": "Informations API enregistrées avec succès",
"API info updated. Click \"Save Settings\" to apply.": "Informations API mises à jour. Cliquez sur \"Enregistrer les paramètres\" pour appliquer.",
"API key": "Clé API",
- "API Key": "Clé API",
+ "API Key": "Cle API",
"API Key (one per line for batch mode)": "Clé API (une par ligne pour le mode batch)",
"API Key (Production)": "Clé API (Production)",
"API Key (Sandbox)": "Clé API (Sandbox)",
@@ -377,7 +378,7 @@
"API Requests": "Requêtes API",
"API secret": "Secret API",
"API token management": "Gestion des tokens API",
- "API URL": "URL de l'API",
+ "API URL": "URL API",
"API usage records": "Historique d'utilisation de l'API",
"API2GPT": "API2GPT",
"App": "Application",
@@ -402,6 +403,7 @@
"Apply reset": "Appliquer la réinitialisation",
"Apply Sync": "Appliquer la synchronisation",
"Applying...": "Application en cours...",
+ "Approved models can later be listed for users.": "Les modeles approuves pourront ensuite etre publies pour les utilisateurs.",
"Approx.": "Environ.",
"apps": "applications",
"Apps": "Applications",
@@ -580,10 +582,12 @@
"Billing Mode": "Mode de facturation",
"Billing Process": "Processus de facturation",
"Billing Source": "Source de facturation",
+ "Billing Type": "Type de facturation",
"Bind": "Lier",
"Bind a Pancake store + product": "Associer une boutique et un produit Pancake",
"Bind an email address to your account.": "Associez une adresse e-mail à votre compte.",
"Bind Email": "Lier l'e-mail",
+ "Bind extra platform roles while preserving legacy role levels.": "Associez des roles plateforme supplementaires tout en conservant les niveaux existants.",
"Bind Telegram Account": "Lier le compte Telegram",
"Bind WeChat Account": "Lier le compte WeChat",
"Binding Information": "Informations de liaison",
@@ -623,6 +627,7 @@
"Built for developers,": "Conçu pour les développeurs,",
"Built-in": "Intégré",
"Built-in Device": "Appareil intégré",
+ "Built-in roles define the phase one access boundaries.": "Les roles integres definissent les limites d acces de la premiere phase.",
"Built-in: phone fingerprint/face, or Windows Hello; External: USB security key": "Intégré : empreinte digitale/visage du téléphone, ou Windows Hello ; Externe : clé de sécurité USB",
"by": "par",
"By category": "Par catégorie",
@@ -658,6 +663,7 @@
"Calculating...": "Calcul en cours...",
"Call Count Distribution": "Distribution du nombre d'appels",
"Call Count Ranking": "Classement du nombre d'appels",
+ "Call Price": "Prix par appel",
"Call Proportion": "Proportion d'appels",
"Call Trend": "Tendance des appels",
"Callback address": "Adresse de rappel",
@@ -668,6 +674,7 @@
"Cancelled": "Annulé",
"Cancelled at": "Annulé le",
"Capabilities": "Capacités",
+ "Capability Tags": "Etiquettes de capacite",
"Capture a reusable bundle of models, tags, or endpoints.": "Capturez un ensemble réutilisable de modèles, d'étiquettes ou de points de terminaison.",
"Card view": "Vue cartes",
"Category": "Catégorie",
@@ -849,6 +856,7 @@
"Comma-separated model names (leave empty to keep current)": "Noms de modèles séparés par des virgules (laissez vide pour conserver l'actuel)",
"Comma-separated model names, e.g., gpt-4,gpt-3.5-turbo": "Noms de modèles séparés par des virgules, p. ex., gpt-4,gpt-3.5-turbo",
"Command": "Commande",
+ "Commission Ratio": "Taux de commission",
"Common": "Commun",
"Common Keys": "Clés courantes",
"Common Logs": "Journaux courants",
@@ -914,6 +922,7 @@
"Configure rate limiting rules for a specific user group.": "Configurer les règles de limitation de débit pour un groupe d'utilisateurs spécifique.",
"Configure routes": "Configurer les routes",
"Configure the ratio for this group.": "Configurer le ratio pour ce groupe.",
+ "Configure upstream access without exposing secrets.": "Configurez l acces amont sans exposer les secrets.",
"Configure upstream providers and routing.": "Configurer les fournisseurs en amont et le routage.",
"Configure Waffo Pancake hosted checkout integration for USD-priced top-ups": "Configurer l'intégration du parcours de paiement hébergé Waffo Pancake pour les rechargements en USD",
"Configure Waffo payment aggregation platform integration": "Configurer l'intégration de la plateforme d'agrégation de paiement Waffo",
@@ -965,6 +974,7 @@
"Console Content": "Contenu de la console",
"Consume": "Consommation",
"Consumed in the last 24 hours": "Consommé dans les dernières 24 heures",
+ "Contact": "Contact",
"Container": "Conteneur",
"Container name": "Nom du conteneur",
"Containers": "Conteneurs",
@@ -976,6 +986,7 @@
"Content not modified!": "Contenu non modifié !",
"Content width": "Largeur du contenu",
"Context": "Contexte",
+ "Context Length": "Longueur du contexte",
"Continue": "Continuer",
"Continue with {{name}}": "Continuer avec {{name}}",
"Continue with Discord": "Continuer avec Discord",
@@ -1061,12 +1072,13 @@
"Create Code": "Créer un code",
"Create credentials for the root user": "Créer les identifiants pour le compte administrateur",
"Create deployment": "Créer un déploiement",
- "Create Model": "Créer un modèle",
+ "Create Model": "Creer un modele",
"Create multiple API keys at once (random suffix will be added to names)": "Créer plusieurs clés API en une fois (un suffixe aléatoire sera ajouté aux noms)",
"Create multiple channels from multiple keys": "Créer plusieurs canaux à partir de plusieurs clés",
"Create multiple redemption codes at once (1-100)": "Créer plusieurs codes de rachat à la fois (1-100)",
"Create new subscription plan": "Créer un nouveau plan d'abonnement",
"Create or update frequently asked questions for users": "Créer ou mettre à jour les questions fréquemment posées aux utilisateurs",
+ "Create or update provider identity for marketplace ownership.": "Creez ou mettez a jour l identite fournisseur pour la propriete du marketplace.",
"Create or update system announcements for the dashboard": "Créer ou mettre à jour les annonces système pour le tableau de bord",
"Create Plan": "Créer un plan",
"Create Prefill Group": "Créer un groupe de préremplissage",
@@ -1867,6 +1879,7 @@
"Final cost = base × multiplier when conditions match": "Coût final = base × multiplicateur lorsque les conditions correspondent",
"Final price multiplier (0.95 = 5% discount": "Multiplicateur de prix final (0.95 = 5% de réduction",
"Finance": "Finance",
+ "Finance Foundation": "Base financiere",
"Finish Time": "Heure de fin",
"First API request": "Première requête API",
"First/Last Frame to Video": "Première/Dernière image vers vidéo",
@@ -2168,6 +2181,7 @@
"Input": "Entrée",
"Input mode": "Mode d'entrée",
"Input price": "Prix d’entrée",
+ "Input Price": "Prix d entree",
"Input price is required before saving dependent prices.": "Le prix d’entrée est requis avant d’enregistrer les prix dépendants.",
"Input tokens": "Jetons d’entrée",
"Input Tokens": "Tokens d'entrée",
@@ -2374,6 +2388,7 @@
"Low balance": "Solde faible",
"Lowest median first-token latency": "Latence médiane de premier jeton la plus faible",
"m": "m",
+ "Maintain the phase one model foundation data.": "Maintenez les donnees de base des modeles de la premiere phase.",
"Maintenance": "Maintenance",
"Make it easier for teammates to pick the right group.": "Faciliter le choix du bon groupe pour les coéquipiers.",
"Manage": "Gestion",
@@ -2398,6 +2413,7 @@
"Map upstream status codes to different codes": "Mapper les codes de statut amont à différents codes",
"Market Share": "Part de marché",
"Marketing": "Marketing",
+ "Marketplace Models": "Modeles du marketplace",
"Match All (AND)": "Toutes (AND)",
"Match Any (OR)": "N'importe laquelle (OR)",
"Match Mode": "Mode de correspondance",
@@ -2458,6 +2474,7 @@
"Minimum top-up quantity": "Quantité minimale de recharge",
"Minimum topup amount: {{amount}}": "Montant minimum de recharge : {{amount}}",
"Minimum Trust Level": "Niveau de confiance minimum",
+ "Minimum Withdrawal": "Retrait minimum",
"Minimum:": "Minimum :",
"Minor blips in the last 30 days": "Légères perturbations sur les 30 derniers jours",
"Mint a fresh pair below — or pick an existing one further down. Click Save when ready.": "Créez une nouvelle paire ci-dessous, ou choisissez une paire existante plus bas. Cliquez sur Enregistrer lorsque vous êtes prêt.",
@@ -2492,15 +2509,17 @@
"Model enabled successfully": "Modèle activé avec succès",
"Model fixed pricing": "Tarification fixe du modèle",
"Model Group": "Groupe de modèles",
+ "Model Keys": "Cles de modele",
"Model Limits": "Limites du modèle",
- "Model Mapping": "Mappage de modèle",
+ "Model Mapping": "Mappage de modele",
"Model Mapping (JSON)": "Mappage de modèle (JSON)",
"Model Mapping must be a JSON object like": "Le mappage de modèle doit être un objet JSON tel que",
"Model mapping must be a JSON object with string values": "Le mappage de modèles doit être un objet JSON avec des valeurs de chaîne",
"Model mapping must be valid JSON": "La cartographie des modèles doit être un JSON valide",
"Model mapping values must be strings": "Les valeurs du mappage de modèles doivent être des chaînes",
+ "Model Marketplace": "Marketplace de modeles",
"Model name": "Nom du modèle",
- "Model Name": "Nom du modèle",
+ "Model Name": "Nom du modele",
"Model Name *": "Nom du modèle *",
"Model name is required": "Le nom du modèle est requis",
"Model names copied to clipboard": "Noms des modèles copiés dans le presse-papiers",
@@ -2523,6 +2542,7 @@
"Model Tags": "Tags de modèle",
"Model to use for testing": "Modèle à utiliser pour les tests",
"Model to use when testing channel connectivity": "Modèle à utiliser lors du test de la connectivité du canal",
+ "Model Type": "Type de modele",
"Model Version *": "Version du modèle *",
"model(s) selected out of": "modèle(s) sélectionné(s) parmi",
"model(s)? This action cannot be undone.": "modèle(s) ? Cette action ne peut pas être annulée.",
@@ -2709,12 +2729,14 @@
"No incidents in the last 24 hours": "Aucun incident au cours des dernières 24 heures",
"No incidents in the last 30 days": "Aucun incident sur les 30 derniers jours",
"No Inviter": "Pas d'inviteur",
+ "No keys configured": "Aucune cle configuree",
"No keys found": "Aucune clé trouvée",
"No latency data available": "Aucune donnée de latence disponible",
"No log entries matched the selected time.": "Aucune entrée de journal ne correspond à l'heure sélectionnée.",
"No logs": "Aucun journal",
"No Logs Found": "Aucun journal trouvé",
"No mappings configured. Click \"Add Row\" to get started.": "Aucun mappage configuré. Cliquez sur « Ajouter une ligne » pour commencer.",
+ "No marketplace models found": "Aucun modele de marketplace trouve",
"No matches found": "Aucune correspondance trouvée",
"No matching items": "Aucun élément correspondant",
"No matching results": "Aucun résultat correspondant",
@@ -2759,6 +2781,7 @@
"No products configured. Click \"Add product\" to get started.": "Aucun produit configuré. Cliquez sur \"Ajouter un produit\" pour commencer.",
"No products match your search": "Aucun produit ne correspond à votre recherche",
"No providers available": "Aucun fournisseur disponible",
+ "No providers found": "Aucun fournisseur trouve",
"No Quota": "Aucun quota",
"No ratio differences found": "Aucune différence de ratio trouvée",
"No recent usage": "Aucune utilisation récente",
@@ -2775,6 +2798,7 @@
"No results found": "Aucun résultat trouvé",
"No results found.": "Aucun résultat trouvé.",
"No Retry": "Pas de réessai",
+ "No roles found": "Aucun role trouve",
"No rules yet": "Aucune règle",
"No rules yet. Add a group below to get started.": "Aucune règle pour le moment. Ajoutez un groupe ci-dessous pour commencer.",
"No separate media pricing configured.": "Aucune tarification multimédia séparée n’est configurée.",
@@ -2879,6 +2903,7 @@
"Only available for admins. When enabled, you will receive a summary notification via your selected method when the scheduled model check detects upstream model changes or check failures.": "Uniquement disponible pour les administrateurs. Lorsque cette option est activée, vous recevrez une notification récapitulative via votre méthode sélectionnée lorsque la vérification planifiée des modèles détecte des changements de modèles en amont ou des échecs de vérification.",
"Only configured combinations are overridden. All other calls keep the token group base ratio.": "Seules les combinaisons configurées sont remplacées. Les autres appels conservent le ratio de base du groupe du jeton.",
"Only enter the site origin, for example https://api.example.com. Do not include any path such as /api/user/epay/notify. Leave blank to use the server address.": "Saisissez uniquement l’origine du site, par exemple https://api.example.com. N’ajoutez aucun chemin comme /api/user/epay/notify. Laissez vide pour utiliser l’adresse du serveur.",
+ "Only masked keys are shown after saving.": "Seules les cles masquees sont affichees apres enregistrement.",
"Only selected fields will be overwritten. You can re-run the sync wizard if new conflicts appear.": "Seuls les champs sélectionnés seront écrasés. Vous pouvez relancer l'assistant de synchronisation si de nouveaux conflits apparaissent.",
"Only successful requests": "Uniquement les requêtes réussies",
"Only successful requests count toward this limit.": "Seules les requêtes réussies comptent pour cette limite.",
@@ -2965,6 +2990,7 @@
"Output aspect ratio": "Format d'image de sortie",
"Output image size": "Taille de l'image de sortie",
"Output price": "Prix de sortie",
+ "Output Price": "Prix de sortie",
"Output token price for generated tokens.": "Prix des tokens de sortie générés.",
"Output tokens": "Jetons de sortie",
"Output Tokens": "Tokens de sortie",
@@ -3251,6 +3277,7 @@
"Price: High to Low": "Prix : Du plus élevé au plus bas",
"Price: Low to High": "Prix : Du plus bas au plus élevé",
"Prices shown per": "Prix affichés par",
+ "Prices stay in draft until a later review flow approves them.": "Les prix restent en brouillon jusqu a approbation par un futur processus de revue.",
"Prices synced successfully": "Prix synchronisés avec succès",
"Prices vary by usage tier and request conditions": "Les prix varient selon le palier d’utilisation et les conditions de requête",
"Pricing": "Tarification",
@@ -3302,12 +3329,17 @@
"Provide per-model header overrides as JSON. Useful for enabling beta features such as expanded context windows.": "Fournir des remplacements d'en-tête par modèle au format JSON. Utile pour activer des fonctionnalités bêta telles que les fenêtres de contexte étendues.",
"Provider": "Fournisseur",
"Provider & data privacy": "Fournisseur & confidentialité",
+ "Provider Console": "Console fournisseur",
"Provider created successfully": "Fournisseur créé avec succès",
"Provider deleted successfully": "Fournisseur supprimé avec succès",
"Provider Name": "Nom du fournisseur",
+ "Provider Profile": "Profil fournisseur",
+ "Provider Profiles": "Profils fournisseurs",
"Provider type (OpenAI, Anthropic, etc.)": "Type de fournisseur (OpenAI, Anthropic, etc.)",
"Provider updated successfully": "Fournisseur mis à jour avec succès",
+ "Provider Wallet": "Portefeuille fournisseur",
"Provider-specific endpoint, account, and compatibility settings.": "Paramètres de point d’accès, de compte et de compatibilité propres au fournisseur.",
+ "Providers can only see their own profile unless granted platform permissions.": "Les fournisseurs ne voient que leur profil sauf autorisation plateforme.",
"Proxy Address": "Adresse du proxy",
"Prune Object Items": "Nettoyer les éléments objet",
"Prune object items by conditions": "Nettoyer les éléments d'objets par conditions",
@@ -3611,7 +3643,9 @@
"Rewrite callback URLs to the local server": "Réécrire les URLs de callback vers le serveur local",
"Right to Left": "De droite à gauche",
"Role": "Rôle",
+ "Role Matrix": "Matrice des roles",
"Roleplay": "Roleplay",
+ "Roles & Permissions": "Roles et permissions",
"Root": "Racine",
"Rose Garden": "Jardin de roses",
"Route": "Route",
@@ -3746,6 +3780,7 @@
"Select a model to edit pricing": "Sélectionnez un modèle pour modifier sa tarification",
"Select a preset...": "Sélectionner un préréglage...",
"Select a product": "Sélectionner un produit",
+ "Select a provider to manage wallet and settlement settings.": "Selectionnez un fournisseur pour gerer le portefeuille et le reglement.",
"Select a role": "Sélectionner un rôle",
"Select a rule to edit.": "Sélectionnez une règle à modifier.",
"Select a store": "Sélectionner une boutique",
@@ -3867,6 +3902,7 @@
"Settings": "Paramètres",
"Settings & Preferences": "Paramètres et préférences",
"Settings updated successfully": "Paramètres mis à jour avec succès",
+ "Settlement Configuration": "Configuration de reglement",
"Setup guide": "Guide de configuration",
"Setup guide complete": "Guide de configuration terminé",
"Setup guide is collapsed. Expand it anytime.": "Le guide de configuration est réduit. Vous pouvez le rouvrir à tout moment.",
@@ -3879,11 +3915,11 @@
"Shorten": "Raccourcir",
"Show": "Afficher",
"Show All": "Tout afficher",
- "Show sensitive data": "Afficher les données sensibles",
"Show all providers including unbound": "Afficher tous les fournisseurs (y compris non liés)",
"Show only bound providers": "Afficher uniquement les fournisseurs liés",
"Show or hide flow columns": "Afficher ou masquer les colonnes du flux",
"Show prices in currency instead of quota.": "Afficher les prix en devise au lieu du quota.",
+ "Show sensitive data": "Afficher les données sensibles",
"Show setup guide": "Afficher le guide de configuration",
"Show token usage statistics in the UI": "Afficher les statistiques d'utilisation des jetons dans l'interface utilisateur",
"Showcase core capabilities with demo credentials and limited access.": "Présenter les fonctionnalités principales avec des identifiants de démonstration et un accès limité.",
@@ -4089,6 +4125,7 @@
"System setup wizard": "Assistant de configuration du système",
"System task records": "Historique des tâches système",
"System Version": "Version du système",
+ "System-only wallet data for phase one settlement tracking.": "Donnees de portefeuille internes pour le suivi de reglement de la phase un.",
"Table view": "Vue en tableau",
"Tag": "Balise",
"Tag Aggregate": "Agrégat de balises",
@@ -4449,7 +4486,7 @@
"Update channel configuration and click save when you're done.": "Mettez à jour la configuration du canal et cliquez sur Enregistrer lorsque vous avez terminé.",
"Update configuration": "Mettre à jour la configuration",
"Update failed": "Échec de la mise à jour",
- "Update Model": "Mettre à jour le modèle",
+ "Update Model": "Mettre a jour le modele",
"Update model configuration and click save when you're done.": "Mettez à jour la configuration du modèle et cliquez sur Enregistrer lorsque vous avez terminé.",
"Update plan info": "Mettre à jour les informations du plan",
"Update Provider": "Mettre à jour le fournisseur",
@@ -4526,6 +4563,8 @@
"USD Exchange Rate": "Taux de change USD",
"USD price per 1M input tokens.": "Prix en USD par million de tokens d’entrée.",
"USD price per 1M tokens.": "Prix en USD par million de tokens.",
+ "USDT conversion and commission settings are manually configured.": "La conversion USDT et les commissions sont configurees manuellement.",
+ "USDT Rate": "Taux USDT",
"Use +: to add a group, -: to remove a default selectable group, or no prefix to append a group.": "Utilisez +: pour ajouter un groupe, -: pour supprimer un groupe sélectionnable par défaut, ou aucun préfixe pour annexer un groupe.",
"Use a compatible browser or device with biometric authentication or a security key to register a Passkey.": "Utilisez un navigateur ou un appareil compatible avec l'authentification biométrique ou une clé de sécurité pour enregistrer une clé d'accès (Passkey).",
"Use a path to append it to the channel Base URL, or enter a full URL to override the Base URL for this route.": "Utilisez un chemin pour l’ajouter à la Base URL du canal, ou saisissez une URL complète pour remplacer la Base URL pour cette route.",
@@ -4581,6 +4620,7 @@
"User Information": "Informations utilisateur",
"User Menu": "Menu utilisateur",
"User personal functions": "Fonctions personnelles de l'utilisateur",
+ "User Role Binding": "Association des roles utilisateur",
"User selectable": "Sélectionnable par l'utilisateur",
"User Subscription Management": "Gestion des abonnements utilisateur",
"User updated successfully": "Utilisateur mis à jour avec succès",
@@ -4692,6 +4732,7 @@
"Waiting": "En attente",
"Waiting for email...": "En attente de l'e-mail...",
"Wallet": "Portefeuille",
+ "Wallet Address": "Adresse du portefeuille",
"Wallet First": "Portefeuille en priorité",
"Wallet Management": "Gestion du portefeuille",
"Wallet management and personal preferences.": "Gestion du portefeuille et préférences personnelles.",
@@ -4762,6 +4803,7 @@
"Wire encoding for the embedding vectors": "Encodage filaire pour les vecteurs",
"with conflicts": "avec des conflits",
"with the API key from your token settings.": "par la clé API de votre page de jetons.",
+ "Withdrawal Fee": "Frais de retrait",
"Without additional conditions, only the type above is used for pruning.": "Sans conditions supplémentaires, seul le type ci-dessus est utilisé pour le nettoyage.",
"Worker Access Key": "Clé d'accès du Worker",
"Worker Proxy": "Proxy Worker",
diff --git a/web/default/src/i18n/locales/ja.json b/web/default/src/i18n/locales/ja.json
index 7e694fe00865..67a25fa97a27 100644
--- a/web/default/src/i18n/locales/ja.json
+++ b/web/default/src/i18n/locales/ja.json
@@ -351,6 +351,7 @@
"API Addresses": "APIアドレス",
"API Base URL (Important: Not Chat API) *": "APIベースURL (重要: チャットAPIではありません) *",
"API Base URL *": "APIベースURL *",
+ "API Configuration": "API 設定",
"API Endpoints": "APIエンドポイント",
"API Info": "API情報",
"API info added. Click \"Save Settings\" to apply.": "API情報が追加されました。「Save Settings」をクリックして適用してください。",
@@ -358,7 +359,7 @@
"API info saved successfully": "API情報が正常に保存されました",
"API info updated. Click \"Save Settings\" to apply.": "API情報が更新されました。「Save Settings」をクリックして適用してください。",
"API key": "APIキー",
- "API Key": "APIキー",
+ "API Key": "API キー",
"API Key (one per line for batch mode)": "API キー (バッチモード時は1行に1つ)",
"API Key (Production)": "APIキー(本番)",
"API Key (Sandbox)": "APIキー(サンドボックス)",
@@ -402,6 +403,7 @@
"Apply reset": "リセットを実行",
"Apply Sync": "同期を適用",
"Applying...": "適用中...",
+ "Approved models can later be listed for users.": "承認されたモデルは後でユーザー向けに掲載できます。",
"Approx.": "約",
"apps": "アプリ",
"Apps": "アプリ",
@@ -580,10 +582,12 @@
"Billing Mode": "課金モード",
"Billing Process": "課金プロセス",
"Billing Source": "課金ソース",
+ "Billing Type": "課金タイプ",
"Bind": "バインド",
"Bind a Pancake store + product": "Pancake のストアと商品を紐付ける",
"Bind an email address to your account.": "アカウントにメールアドレスを紐付けます。",
"Bind Email": "メールアドレス連携",
+ "Bind extra platform roles while preserving legacy role levels.": "既存のロールレベルを維持したまま追加のプラットフォームロールを割り当てます。",
"Bind Telegram Account": "Telegram連携",
"Bind WeChat Account": "WeChatアカウント連携",
"Binding Information": "連携情報",
@@ -623,6 +627,7 @@
"Built for developers,": "開発者のために構築、",
"Built-in": "組み込み",
"Built-in Device": "内蔵デバイス",
+ "Built-in roles define the phase one access boundaries.": "組み込みロールが第 1 フェーズのアクセス境界を定義します。",
"Built-in: phone fingerprint/face, or Windows Hello; External: USB security key": "内蔵: 電話の指紋/顔認証、またはWindows Hello。外部: USBセキュリティキー",
"by": "によって",
"By category": "カテゴリ別",
@@ -658,6 +663,7 @@
"Calculating...": "計算中...",
"Call Count Distribution": "呼び出し回数分布",
"Call Count Ranking": "呼び出し回数ランキング",
+ "Call Price": "呼び出し価格",
"Call Proportion": "呼び出し比率",
"Call Trend": "呼び出し傾向",
"Callback address": "コールバックアドレス",
@@ -668,6 +674,7 @@
"Cancelled": "キャンセル",
"Cancelled at": "キャンセル日時",
"Capabilities": "機能",
+ "Capability Tags": "機能タグ",
"Capture a reusable bundle of models, tags, or endpoints.": "モデル、タグ、またはエンドポイントの再利用可能なバンドルを保存。",
"Card view": "カード表示",
"Category": "カテゴリ",
@@ -849,6 +856,7 @@
"Comma-separated model names (leave empty to keep current)": "カンマ区切りのモデル名 (空欄のままにすると現在の設定を維持)",
"Comma-separated model names, e.g., gpt-4,gpt-3.5-turbo": "カンマ区切りのモデル名、例: gpt-4,gpt-3.5-turbo",
"Command": "コマンド",
+ "Commission Ratio": "手数料率",
"Common": "共通",
"Common Keys": "よく使うキー",
"Common Logs": "一般的なログ",
@@ -914,6 +922,7 @@
"Configure rate limiting rules for a specific user group.": "特定のユーザーグループのレート制限ルールを設定します。",
"Configure routes": "ルートを設定",
"Configure the ratio for this group.": "このグループの比率を設定します。",
+ "Configure upstream access without exposing secrets.": "シークレットを公開せずに上流アクセスを設定します。",
"Configure upstream providers and routing.": "アップストリームプロバイダーとルーティングを設定。",
"Configure Waffo Pancake hosted checkout integration for USD-priced top-ups": "USD 建てのチャージ用に Waffo Pancake のホスト型チェックアウト連携を設定",
"Configure Waffo payment aggregation platform integration": "Waffo決済アグリゲーションプラットフォームの連携を設定",
@@ -965,6 +974,7 @@
"Console Content": "コンソールコンテンツ",
"Consume": "消費",
"Consumed in the last 24 hours": "直近24時間の消費量",
+ "Contact": "連絡先",
"Container": "コンテナ",
"Container name": "コンテナ名",
"Containers": "コンテナ",
@@ -976,6 +986,7 @@
"Content not modified!": "コンテンツが変更されていません!",
"Content width": "コンテンツ幅",
"Context": "コンテキスト",
+ "Context Length": "コンテキスト長",
"Continue": "続行",
"Continue with {{name}}": "{{name}} で続行",
"Continue with Discord": "Discord で続行",
@@ -1067,6 +1078,7 @@
"Create multiple redemption codes at once (1-100)": "複数の引き換えコードを一度に作成します (1-100)",
"Create new subscription plan": "新しいサブスクリプションプランを作成",
"Create or update frequently asked questions for users": "ユーザー向けのよくある質問を作成または更新します",
+ "Create or update provider identity for marketplace ownership.": "マーケットプレイス所有権のためにプロバイダー情報を作成または更新します。",
"Create or update system announcements for the dashboard": "ダッシュボードのシステムアナウンスを作成または更新します",
"Create Plan": "プラン作成",
"Create Prefill Group": "プレフィルグループを作成",
@@ -1867,6 +1879,7 @@
"Final cost = base × multiplier when conditions match": "条件に一致する場合 最終費用 = 基準 × 倍率",
"Final price multiplier (0.95 = 5% discount": "最終価格乗数 (0.95 = 5%割引",
"Finance": "金融",
+ "Finance Foundation": "財務基盤",
"Finish Time": "完了時刻",
"First API request": "最初の API リクエスト",
"First/Last Frame to Video": "先頭/末尾フレームから動画",
@@ -2168,6 +2181,7 @@
"Input": "入力",
"Input mode": "入力モード",
"Input price": "入力価格",
+ "Input Price": "入力価格",
"Input price is required before saving dependent prices.": "依存する価格を保存する前に入力価格が必要です。",
"Input tokens": "入力トークン",
"Input Tokens": "入力トークン",
@@ -2374,6 +2388,7 @@
"Low balance": "残高不足",
"Lowest median first-token latency": "最初のトークンまでの中央値レイテンシの最小値",
"m": "m",
+ "Maintain the phase one model foundation data.": "第 1 フェーズのモデル基盤データを管理します。",
"Maintenance": "メンテナンス",
"Make it easier for teammates to pick the right group.": "チームメイトが適切なグループを選択しやすくする。",
"Manage": "管理",
@@ -2398,6 +2413,7 @@
"Map upstream status codes to different codes": "アップストリームのステータスコードを別のコードにマッピングする",
"Market Share": "マーケットシェア",
"Marketing": "マーケティング",
+ "Marketplace Models": "マーケットプレイスモデル",
"Match All (AND)": "すべて一致(AND)",
"Match Any (OR)": "いずれか一致(OR)",
"Match Mode": "マッチモード",
@@ -2458,6 +2474,7 @@
"Minimum top-up quantity": "最小チャージ数量",
"Minimum topup amount: {{amount}}": "最低チャージ金額:{{amount}}",
"Minimum Trust Level": "最小トラストレベル",
+ "Minimum Withdrawal": "最小出金額",
"Minimum:": "最小:",
"Minor blips in the last 30 days": "直近 30 日で軽微な障害あり",
"Mint a fresh pair below — or pick an existing one further down. Click Save when ready.": "下で新しいペアを作成するか、さらに下で既存のものを選択してください。準備ができたら保存をクリックします。",
@@ -2492,6 +2509,7 @@
"Model enabled successfully": "モデルが正常に有効化されました",
"Model fixed pricing": "モデルの固定価格設定",
"Model Group": "モデルグループ",
+ "Model Keys": "モデルキー",
"Model Limits": "モデル制限",
"Model Mapping": "モデルマッピング",
"Model Mapping (JSON)": "モデルマッピング (JSON)",
@@ -2499,6 +2517,7 @@
"Model mapping must be a JSON object with string values": "モデルマッピングは文字列値を持つ JSON オブジェクトである必要があります",
"Model mapping must be valid JSON": "モデルマッピングは有効な JSON である必要があります",
"Model mapping values must be strings": "モデルマッピングの値は文字列である必要があります",
+ "Model Marketplace": "モデルマーケットプレイス",
"Model name": "モデル名",
"Model Name": "モデル名",
"Model Name *": "モデル名 *",
@@ -2523,6 +2542,7 @@
"Model Tags": "モデルタグ",
"Model to use for testing": "テストに使用するモデル",
"Model to use when testing channel connectivity": "チャネル接続性をテストする際に使用するモデル",
+ "Model Type": "モデルタイプ",
"Model Version *": "モデルバージョン *",
"model(s) selected out of": "選択されたモデル",
"model(s)? This action cannot be undone.": "モデルを削除しますか?この操作は元に戻せません。",
@@ -2709,12 +2729,14 @@
"No incidents in the last 24 hours": "過去 24 時間にインシデントはありません",
"No incidents in the last 30 days": "過去 30 日間でインシデントはありません",
"No Inviter": "招待者なし",
+ "No keys configured": "キーが設定されていません",
"No keys found": "キーが見つかりません",
"No latency data available": "レイテンシデータがありません",
"No log entries matched the selected time.": "選択した時間に一致するログエントリはありません。",
"No logs": "ログがありません",
"No Logs Found": "ログが見つかりません",
"No mappings configured. Click \"Add Row\" to get started.": "マッピングが設定されていません。「行を追加」をクリックして開始してください。",
+ "No marketplace models found": "マーケットプレイスモデルが見つかりません",
"No matches found": "一致するものが見つかりません",
"No matching items": "一致する項目がありません",
"No matching results": "一致する結果がありません",
@@ -2759,6 +2781,7 @@
"No products configured. Click \"Add product\" to get started.": "製品が設定されていません。「製品を追加」をクリックして開始してください。",
"No products match your search": "検索に一致する製品がありません",
"No providers available": "利用可能なプロバイダーがありません",
+ "No providers found": "プロバイダーが見つかりません",
"No Quota": "クォータなし",
"No ratio differences found": "比率の差異は見つかりませんでした",
"No recent usage": "最近の使用なし",
@@ -2775,6 +2798,7 @@
"No results found": "検索結果がありません",
"No results found.": "結果が見つかりません。",
"No Retry": "リトライなし",
+ "No roles found": "ロールが見つかりません",
"No rules yet": "ルールがありません",
"No rules yet. Add a group below to get started.": "まだルールがありません。下にグループを追加して開始してください。",
"No separate media pricing configured.": "個別のメディア料金は設定されていません。",
@@ -2879,6 +2903,7 @@
"Only available for admins. When enabled, you will receive a summary notification via your selected method when the scheduled model check detects upstream model changes or check failures.": "管理者のみ利用可能です。有効にすると、スケジュールされたモデルチェックでアップストリームモデルの変更やチェック失敗が検出された際に、選択した方法で概要通知を受け取ります。",
"Only configured combinations are overridden. All other calls keep the token group base ratio.": "設定済みの組み合わせだけが上書きされます。他の呼び出しはトークングループの基本倍率を維持します。",
"Only enter the site origin, for example https://api.example.com. Do not include any path such as /api/user/epay/notify. Leave blank to use the server address.": "サイトのオリジンのみを入力してください。例: https://api.example.com。/api/user/epay/notify などのパスは含めないでください。空欄の場合はサーバーアドレスを使用します。",
+ "Only masked keys are shown after saving.": "保存後はマスクされたキーのみ表示されます。",
"Only selected fields will be overwritten. You can re-run the sync wizard if new conflicts appear.": "選択されたフィールドのみが上書きされます。新しい競合が発生した場合は、同期ウィザードを再実行できます。",
"Only successful requests": "成功したリクエストのみ",
"Only successful requests count toward this limit.": "成功したリクエストのみがこの制限にカウントされます。",
@@ -2965,6 +2990,7 @@
"Output aspect ratio": "出力アスペクト比",
"Output image size": "出力画像サイズ",
"Output price": "出力価格",
+ "Output Price": "出力価格",
"Output token price for generated tokens.": "生成された出力トークンの価格。",
"Output tokens": "出力トークン",
"Output Tokens": "出力トークン",
@@ -3251,6 +3277,7 @@
"Price: High to Low": "価格:高い順",
"Price: Low to High": "価格:低い順",
"Prices shown per": "価格表示単位",
+ "Prices stay in draft until a later review flow approves them.": "価格は後続のレビューで承認されるまで下書きのままです。",
"Prices synced successfully": "価格が正常に同期されました",
"Prices vary by usage tier and request conditions": "価格は利用ティアとリクエスト条件で変動します",
"Pricing": "価格設定",
@@ -3302,12 +3329,17 @@
"Provide per-model header overrides as JSON. Useful for enabling beta features such as expanded context windows.": "モデルごとのヘッダーオーバーライドをJSONとして提供します。拡張コンテキストウィンドウなどのベータ機能を有効にするのに役立ちます。",
"Provider": "プロバイダ",
"Provider & data privacy": "プロバイダーとデータ保護",
+ "Provider Console": "プロバイダーコンソール",
"Provider created successfully": "プロバイダーの作成に成功しました",
"Provider deleted successfully": "プロバイダーの削除に成功しました",
"Provider Name": "プロバイダー名",
+ "Provider Profile": "プロバイダープロフィール",
+ "Provider Profiles": "プロバイダープロフィール",
"Provider type (OpenAI, Anthropic, etc.)": "プロバイダタイプ (OpenAI, Anthropic など)",
"Provider updated successfully": "プロバイダーが正常に更新されました",
+ "Provider Wallet": "プロバイダーウォレット",
"Provider-specific endpoint, account, and compatibility settings.": "プロバイダー固有のエンドポイント、アカウント、互換性設定です。",
+ "Providers can only see their own profile unless granted platform permissions.": "プラットフォーム権限がない限り、プロバイダーは自身のプロフィールのみ閲覧できます。",
"Proxy Address": "プロキシアドレス",
"Prune Object Items": "オブジェクト項目を整理",
"Prune object items by conditions": "条件に基づいてオブジェクト項目を削除",
@@ -3611,7 +3643,9 @@
"Rewrite callback URLs to the local server": "コールバック URL をローカルサーバーに書き換え",
"Right to Left": "右から左",
"Role": "ロール",
+ "Role Matrix": "ロールマトリクス",
"Roleplay": "ロールプレイ",
+ "Roles & Permissions": "ロールと権限",
"Root": "ルート",
"Rose Garden": "ローズガーデン",
"Route": "ルート",
@@ -3746,6 +3780,7 @@
"Select a model to edit pricing": "料金を編集するモデルを選択",
"Select a preset...": "プリセットを選択...",
"Select a product": "商品を選択",
+ "Select a provider to manage wallet and settlement settings.": "ウォレットと精算設定を管理するプロバイダーを選択します。",
"Select a role": "ロールを選択",
"Select a rule to edit.": "編集するルールを選択してください。",
"Select a store": "ストアを選択",
@@ -3867,6 +3902,7 @@
"Settings": "設定",
"Settings & Preferences": "設定と環境設定",
"Settings updated successfully": "設定が正常に更新されました",
+ "Settlement Configuration": "精算設定",
"Setup guide": "セットアップガイド",
"Setup guide complete": "セットアップガイド完了",
"Setup guide is collapsed. Expand it anytime.": "セットアップガイドは折りたたまれています。いつでも展開できます。",
@@ -3879,11 +3915,11 @@
"Shorten": "短縮",
"Show": "表示",
"Show All": "すべて表示",
- "Show sensitive data": "機密データを表示",
"Show all providers including unbound": "未バインドを含むすべてのプロバイダーを表示",
"Show only bound providers": "バインド済みのプロバイダーのみ表示",
"Show or hide flow columns": "フロー列の表示・非表示",
"Show prices in currency instead of quota.": "クォータではなく通貨で価格を表示。",
+ "Show sensitive data": "機密データを表示",
"Show setup guide": "セットアップガイドを表示",
"Show token usage statistics in the UI": "UIでトークン使用統計を表示",
"Showcase core capabilities with demo credentials and limited access.": "デモ用の認証情報と制限付きアクセスでコア機能を紹介します。",
@@ -4089,6 +4125,7 @@
"System setup wizard": "システムセットアップウィザード",
"System task records": "システムタスク記録",
"System Version": "システムバージョン",
+ "System-only wallet data for phase one settlement tracking.": "第 1 フェーズの精算追跡用のシステム内ウォレットデータです。",
"Table view": "テーブル表示",
"Tag": "タグ",
"Tag Aggregate": "タグ集計",
@@ -4526,6 +4563,8 @@
"USD Exchange Rate": "USD 為替レート",
"USD price per 1M input tokens.": "100万入力トークンあたりのUSD価格。",
"USD price per 1M tokens.": "100万トークンあたりのUSD価格。",
+ "USDT conversion and commission settings are manually configured.": "USDT 換算と手数料設定は手動で構成します。",
+ "USDT Rate": "USDT レート",
"Use +: to add a group, -: to remove a default selectable group, or no prefix to append a group.": "+: はグループ追加、-: はデフォルト選択可能グループの削除、接頭辞なしはグループ追記に使います。",
"Use a compatible browser or device with biometric authentication or a security key to register a Passkey.": "生体認証またはセキュリティキーを備えた互換性のあるブラウザまたはデバイスを使用して、パスキーを登録してください。",
"Use a path to append it to the channel Base URL, or enter a full URL to override the Base URL for this route.": "パスを入力するとチャネルの Base URL に追加されます。完全な URL を入力すると、このルートでは Base URL を使わずその URL を使用します。",
@@ -4581,6 +4620,7 @@
"User Information": "ユーザー情報",
"User Menu": "ユーザーメニュー",
"User personal functions": "ユーザー個人機能",
+ "User Role Binding": "ユーザーロール割り当て",
"User selectable": "ユーザー選択可",
"User Subscription Management": "ユーザーサブスクリプション管理",
"User updated successfully": "ユーザーの更新に成功しました",
@@ -4692,6 +4732,7 @@
"Waiting": "待機中",
"Waiting for email...": "メールを待っています...",
"Wallet": "ウォレット",
+ "Wallet Address": "ウォレットアドレス",
"Wallet First": "ウォレット優先",
"Wallet Management": "ウォレット管理",
"Wallet management and personal preferences.": "ウォレット管理と個人設定。",
@@ -4762,6 +4803,7 @@
"Wire encoding for the embedding vectors": "ベクトルの転送エンコーディング",
"with conflicts": "競合あり",
"with the API key from your token settings.": "をトークン設定の API キーに置き換えてください。",
+ "Withdrawal Fee": "出金手数料",
"Without additional conditions, only the type above is used for pruning.": "追加条件がない場合、上記のtypeのみが削除に使用されます。",
"Worker Access Key": "Workerアクセスキー",
"Worker Proxy": "Workerプロキシ",
diff --git a/web/default/src/i18n/locales/ru.json b/web/default/src/i18n/locales/ru.json
index ee6839b99732..a147c84edcc5 100644
--- a/web/default/src/i18n/locales/ru.json
+++ b/web/default/src/i18n/locales/ru.json
@@ -351,6 +351,7 @@
"API Addresses": "Адреса API",
"API Base URL (Important: Not Chat API) *": "Базовый URL API (Важно: Не Chat API) *",
"API Base URL *": "Базовый URL API *",
+ "API Configuration": "Настройка API",
"API Endpoints": "Конечные точки API",
"API Info": "Информация об API",
"API info added. Click \"Save Settings\" to apply.": "Информация API добавлена. Нажмите «Сохранить настройки», чтобы применить.",
@@ -358,7 +359,7 @@
"API info saved successfully": "Информация API успешно сохранена",
"API info updated. Click \"Save Settings\" to apply.": "Информация API обновлена. Нажмите «Сохранить настройки», чтобы применить.",
"API key": "Ключ API",
- "API Key": "Ключ API",
+ "API Key": "API-ключ",
"API Key (one per line for batch mode)": "Ключ API (по одному на строку для пакетного режима)",
"API Key (Production)": "API-ключ (Продакшн)",
"API Key (Sandbox)": "API-ключ (Песочница)",
@@ -402,6 +403,7 @@
"Apply reset": "Выполнить сброс",
"Apply Sync": "Применить синхронизацию",
"Applying...": "Применение...",
+ "Approved models can later be listed for users.": "Одобренные модели позднее можно опубликовать для пользователей.",
"Approx.": "Примерно.",
"apps": "приложений",
"Apps": "Приложения",
@@ -580,10 +582,12 @@
"Billing Mode": "Режим биллинга",
"Billing Process": "Процесс тарификации",
"Billing Source": "Источник биллинга",
+ "Billing Type": "Тип тарификации",
"Bind": "Привязать",
"Bind a Pancake store + product": "Привязать магазин и продукт Pancake",
"Bind an email address to your account.": "Привяжите адрес электронной почты к вашему аккаунту.",
"Bind Email": "Привязать Email",
+ "Bind extra platform roles while preserving legacy role levels.": "Назначайте дополнительные роли платформы, сохраняя прежние уровни ролей.",
"Bind Telegram Account": "Привязать аккаунт Telegram",
"Bind WeChat Account": "Привязка аккаунта WeChat",
"Binding Information": "Информация о привязке",
@@ -623,6 +627,7 @@
"Built for developers,": "Создано для разработчиков,",
"Built-in": "Встроенный",
"Built-in Device": "Встроенное устройство",
+ "Built-in roles define the phase one access boundaries.": "Встроенные роли задают границы доступа первого этапа.",
"Built-in: phone fingerprint/face, or Windows Hello; External: USB security key": "Встроенное: отпечаток пальца/лицо телефона или Windows Hello; Внешнее: USB-ключ безопасности",
"by": "от",
"By category": "По категориям",
@@ -658,6 +663,7 @@
"Calculating...": "Вычисление...",
"Call Count Distribution": "Распределение количества вызовов",
"Call Count Ranking": "Рейтинг по количеству вызовов",
+ "Call Price": "Цена вызова",
"Call Proportion": "Доля вызовов",
"Call Trend": "Тенденция вызовов",
"Callback address": "Адрес обратного вызова",
@@ -668,6 +674,7 @@
"Cancelled": "Отменено",
"Cancelled at": "Отменено",
"Capabilities": "Возможности",
+ "Capability Tags": "Теги возможностей",
"Capture a reusable bundle of models, tags, or endpoints.": "Создайте повторно используемый набор моделей, тегов или конечных точек.",
"Card view": "Карточки",
"Category": "Категория",
@@ -849,6 +856,7 @@
"Comma-separated model names (leave empty to keep current)": "Названия моделей, разделенные запятыми (оставьте пустым, чтобы сохранить текущие)",
"Comma-separated model names, e.g., gpt-4,gpt-3.5-turbo": "Имена моделей, разделённые запятыми, например, gpt-4,gpt-3.5-turbo",
"Command": "Команда",
+ "Commission Ratio": "Доля комиссии",
"Common": "Общие",
"Common Keys": "Часто используемые ключи",
"Common Logs": "Общие журналы",
@@ -914,6 +922,7 @@
"Configure rate limiting rules for a specific user group.": "Настроить правила ограничения скорости для конкретной группы пользователей.",
"Configure routes": "Настроить маршруты",
"Configure the ratio for this group.": "Настроить коэффициент для этой группы.",
+ "Configure upstream access without exposing secrets.": "Настраивайте доступ к upstream без раскрытия секретов.",
"Configure upstream providers and routing.": "Настроить провайдеров верхнего уровня и маршрутизацию.",
"Configure Waffo Pancake hosted checkout integration for USD-priced top-ups": "Настроить хостовую интеграцию Waffo Pancake (hosted checkout) для пополнений в USD",
"Configure Waffo payment aggregation platform integration": "Настроить интеграцию платёжной платформы Waffo",
@@ -965,6 +974,7 @@
"Console Content": "Содержимое консоли",
"Consume": "Расход",
"Consumed in the last 24 hours": "Потреблено за последние 24 часа",
+ "Contact": "Контакт",
"Container": "Контейнер",
"Container name": "Имя контейнера",
"Containers": "Контейнеры",
@@ -976,6 +986,7 @@
"Content not modified!": "Контент не изменён!",
"Content width": "Ширина контента",
"Context": "Контекст",
+ "Context Length": "Длина контекста",
"Continue": "Продолжить",
"Continue with {{name}}": "Продолжить с {{name}}",
"Continue with Discord": "Продолжить с Discord",
@@ -1067,6 +1078,7 @@
"Create multiple redemption codes at once (1-100)": "Создать несколько кодов активации одновременно (1-100)",
"Create new subscription plan": "Создать новый план подписки",
"Create or update frequently asked questions for users": "Создать или обновить часто задаваемые вопросы для пользователей",
+ "Create or update provider identity for marketplace ownership.": "Создайте или обновите профиль поставщика для владения моделями.",
"Create or update system announcements for the dashboard": "Создать или обновить системные объявления для панели управления",
"Create Plan": "Создать план",
"Create Prefill Group": "Создать группу предзаполнения",
@@ -1867,6 +1879,7 @@
"Final cost = base × multiplier when conditions match": "Итоговая стоимость = база × множитель, если условия совпадают",
"Final price multiplier (0.95 = 5% discount": "Конечный множитель цены (0.95 = скидка 5%",
"Finance": "Финансы",
+ "Finance Foundation": "Финансовая основа",
"Finish Time": "Время завершения",
"First API request": "Первый API-запрос",
"First/Last Frame to Video": "Первый/последний кадр в видео",
@@ -2168,6 +2181,7 @@
"Input": "Ввод",
"Input mode": "Режим ввода",
"Input price": "Цена входа",
+ "Input Price": "Цена ввода",
"Input price is required before saving dependent prices.": "Перед сохранением зависимых цен укажите входную цену.",
"Input tokens": "Входные токены",
"Input Tokens": "Входные токены",
@@ -2374,6 +2388,7 @@
"Low balance": "Низкий баланс",
"Lowest median first-token latency": "Минимальная медианная задержка первого токена",
"m": "m",
+ "Maintain the phase one model foundation data.": "Управляйте базовыми данными моделей первого этапа.",
"Maintenance": "Обслуживание",
"Make it easier for teammates to pick the right group.": "Упростите выбор правильной группы для товарищей по команде.",
"Manage": "Управление",
@@ -2398,6 +2413,7 @@
"Map upstream status codes to different codes": "Сопоставить коды статуса вышестоящего сервера с различными кодами",
"Market Share": "Доля рынка",
"Marketing": "Маркетинг",
+ "Marketplace Models": "Модели витрины",
"Match All (AND)": "Все совпадения (AND)",
"Match Any (OR)": "Любое совпадение (OR)",
"Match Mode": "Режим сопоставления",
@@ -2458,6 +2474,7 @@
"Minimum top-up quantity": "Минимальное количество пополнения",
"Minimum topup amount: {{amount}}": "Минимальная сумма пополнения: {{amount}}",
"Minimum Trust Level": "Минимальный уровень доверия",
+ "Minimum Withdrawal": "Минимальный вывод",
"Minimum:": "Минимум:",
"Minor blips in the last 30 days": "Небольшие сбои за последние 30 дней",
"Mint a fresh pair below — or pick an existing one further down. Click Save when ready.": "Создайте новую пару ниже или выберите существующую дальше. Когда будете готовы, нажмите Сохранить.",
@@ -2492,13 +2509,15 @@
"Model enabled successfully": "Модель успешно включена",
"Model fixed pricing": "Фиксированная цена модели",
"Model Group": "Группа моделей",
+ "Model Keys": "Ключи модели",
"Model Limits": "Лимиты модели",
- "Model Mapping": "Сопоставление моделей",
+ "Model Mapping": "Сопоставление модели",
"Model Mapping (JSON)": "Сопоставление моделей (JSON)",
"Model Mapping must be a JSON object like": "Сопоставление моделей должно быть JSON-объектом, например",
"Model mapping must be a JSON object with string values": "Сопоставление моделей должно быть JSON-объектом со строковыми значениями",
"Model mapping must be valid JSON": "Сопоставление моделей должно быть допустимым JSON",
"Model mapping values must be strings": "Значения сопоставления моделей должны быть строками",
+ "Model Marketplace": "Витрина моделей",
"Model name": "Имя модели",
"Model Name": "Название модели",
"Model Name *": "Имя модели *",
@@ -2523,6 +2542,7 @@
"Model Tags": "Теги моделей",
"Model to use for testing": "Модель для использования при тестировании",
"Model to use when testing channel connectivity": "Модель для использования при тестировании подключения канала",
+ "Model Type": "Тип модели",
"Model Version *": "Версия модели *",
"model(s) selected out of": "модель(и) выбрано из",
"model(s)? This action cannot be undone.": "модель(и)? Это действие нельзя отменить.",
@@ -2709,12 +2729,14 @@
"No incidents in the last 24 hours": "За последние 24 часа инцидентов не было",
"No incidents in the last 30 days": "За последние 30 дней инцидентов не было",
"No Inviter": "Нет пригласившего",
+ "No keys configured": "Ключи не настроены",
"No keys found": "Ключи не найдены",
"No latency data available": "Данные о задержке недоступны",
"No log entries matched the selected time.": "Нет записей журнала, соответствующих выбранному времени.",
"No logs": "Нет логов",
"No Logs Found": "Логи не найдены",
"No mappings configured. Click \"Add Row\" to get started.": "Нет настроенных сопоставлений. Нажмите \"Добавить строку\", чтобы начать.",
+ "No marketplace models found": "Модели витрины не найдены",
"No matches found": "Совпадений не найдено",
"No matching items": "Нет подходящих элементов",
"No matching results": "Нет совпадений",
@@ -2759,6 +2781,7 @@
"No products configured. Click \"Add product\" to get started.": "Продукты не настроены. Нажмите \"Добавить продукт\", чтобы начать.",
"No products match your search": "Нет продуктов, соответствующих вашему поиску",
"No providers available": "Нет доступных провайдеров",
+ "No providers found": "Поставщики не найдены",
"No Quota": "Нет квоты",
"No ratio differences found": "Различия в коэффициентах не найдены",
"No recent usage": "Нет недавнего использования",
@@ -2775,6 +2798,7 @@
"No results found": "Поиск не дал результатов",
"No results found.": "Результаты не найдены.",
"No Retry": "Без повтора",
+ "No roles found": "Роли не найдены",
"No rules yet": "Правила отсутствуют",
"No rules yet. Add a group below to get started.": "Правил пока нет. Добавьте группу ниже, чтобы начать.",
"No separate media pricing configured.": "Отдельные цены для медиа не настроены.",
@@ -2879,6 +2903,7 @@
"Only available for admins. When enabled, you will receive a summary notification via your selected method when the scheduled model check detects upstream model changes or check failures.": "Доступно только для администраторов. При включении вы будете получать сводное уведомление выбранным способом, когда запланированная проверка моделей обнаружит изменения в вышестоящих моделях или сбои проверки.",
"Only configured combinations are overridden. All other calls keep the token group base ratio.": "Переопределяются только настроенные комбинации. Остальные вызовы используют базовый коэффициент группы токена.",
"Only enter the site origin, for example https://api.example.com. Do not include any path such as /api/user/epay/notify. Leave blank to use the server address.": "Введите только origin сайта, например https://api.example.com. Не добавляйте пути, например /api/user/epay/notify. Оставьте пустым, чтобы использовать адрес сервера.",
+ "Only masked keys are shown after saving.": "После сохранения отображаются только замаскированные ключи.",
"Only selected fields will be overwritten. You can re-run the sync wizard if new conflicts appear.": "Будут перезаписаны только выбранные поля. Вы можете повторно запустить мастер синхронизации, если появятся новые конфликты.",
"Only successful requests": "Только успешные запросы",
"Only successful requests count toward this limit.": "Только успешные запросы учитываются в этом лимите.",
@@ -2965,6 +2990,7 @@
"Output aspect ratio": "Соотношение сторон",
"Output image size": "Размер выходного изображения",
"Output price": "Цена выхода",
+ "Output Price": "Цена вывода",
"Output token price for generated tokens.": "Цена выходных токенов для сгенерированного текста.",
"Output tokens": "Выходные токены",
"Output Tokens": "Выходные токены",
@@ -3251,6 +3277,7 @@
"Price: High to Low": "Цена: от высокой к низкой",
"Price: Low to High": "Цена: от низкой к высокой",
"Prices shown per": "Цены указаны за",
+ "Prices stay in draft until a later review flow approves them.": "Цены остаются черновиками до утверждения в последующем процессе проверки.",
"Prices synced successfully": "Цены успешно синхронизированы",
"Prices vary by usage tier and request conditions": "Цена зависит от уровня использования и условий запроса",
"Pricing": "Ценообразование",
@@ -3302,12 +3329,17 @@
"Provide per-model header overrides as JSON. Useful for enabling beta features such as expanded context windows.": "Предоставьте переопределения заголовков для каждой модели в формате JSON. Полезно для включения бета-функций, таких как расширенные окна контекста.",
"Provider": "Провайдер",
"Provider & data privacy": "Поставщик и конфиденциальность",
+ "Provider Console": "Консоль поставщика",
"Provider created successfully": "Поставщик успешно создан",
"Provider deleted successfully": "Поставщик успешно удален",
"Provider Name": "Имя поставщика",
+ "Provider Profile": "Профиль поставщика",
+ "Provider Profiles": "Профили поставщиков",
"Provider type (OpenAI, Anthropic, etc.)": "Тип провайдера (OpenAI, Anthropic и т.д.)",
"Provider updated successfully": "Поставщик успешно обновлен",
+ "Provider Wallet": "Кошелек поставщика",
"Provider-specific endpoint, account, and compatibility settings.": "Настройки endpoint, аккаунта и совместимости для конкретного провайдера.",
+ "Providers can only see their own profile unless granted platform permissions.": "Поставщики видят только свой профиль, если им не выданы права платформы.",
"Proxy Address": "Адрес прокси",
"Prune Object Items": "Очистить элементы объекта",
"Prune object items by conditions": "Удалить элементы объекта по условиям",
@@ -3611,7 +3643,9 @@
"Rewrite callback URLs to the local server": "Перезаписывать URL обратных вызовов на локальный сервер",
"Right to Left": "Справа налево",
"Role": "Роль",
+ "Role Matrix": "Матрица ролей",
"Roleplay": "Ролевые игры",
+ "Roles & Permissions": "Роли и права",
"Root": "Корень",
"Rose Garden": "Розовый сад",
"Route": "Маршрут",
@@ -3746,6 +3780,7 @@
"Select a model to edit pricing": "Выберите модель для редактирования тарифа",
"Select a preset...": "Выберите предустановку...",
"Select a product": "Выберите продукт",
+ "Select a provider to manage wallet and settlement settings.": "Выберите поставщика для управления кошельком и расчетами.",
"Select a role": "Выбрать роль",
"Select a rule to edit.": "Выберите правило для редактирования.",
"Select a store": "Выберите магазин",
@@ -3867,6 +3902,7 @@
"Settings": "Настройки",
"Settings & Preferences": "Настройки и предпочтения",
"Settings updated successfully": "Настройки успешно обновлены",
+ "Settlement Configuration": "Настройка расчетов",
"Setup guide": "Руководство по настройке",
"Setup guide complete": "Руководство по настройке завершено",
"Setup guide is collapsed. Expand it anytime.": "Руководство по настройке свернуто. Его можно открыть в любой момент.",
@@ -3879,11 +3915,11 @@
"Shorten": "Сократить",
"Show": "Показать",
"Show All": "Показать все",
- "Show sensitive data": "Показать конфиденциальные данные",
"Show all providers including unbound": "Показать всех провайдеров (включая непривязанные)",
"Show only bound providers": "Показать только привязанных провайдеров",
"Show or hide flow columns": "Показать или скрыть столбцы потока",
"Show prices in currency instead of quota.": "Показывать цены в валюте вместо квоты.",
+ "Show sensitive data": "Показать конфиденциальные данные",
"Show setup guide": "Показать руководство по настройке",
"Show token usage statistics in the UI": "Показывать статистику использования токенов в пользовательском интерфейсе",
"Showcase core capabilities with demo credentials and limited access.": "Демонстрация основных возможностей с демо-учётными данными и ограниченным доступом.",
@@ -4089,6 +4125,7 @@
"System setup wizard": "Мастер настройки системы",
"System task records": "Записи системных задач",
"System Version": "Версия системы",
+ "System-only wallet data for phase one settlement tracking.": "Внутренние данные кошелька для отслеживания расчетов первого этапа.",
"Table view": "Вид таблицы",
"Tag": "Тег",
"Tag Aggregate": "Агрегация тегов",
@@ -4526,6 +4563,8 @@
"USD Exchange Rate": "Обменный курс USD",
"USD price per 1M input tokens.": "Цена в USD за 1 млн входных токенов.",
"USD price per 1M tokens.": "Цена в USD за 1 млн токенов.",
+ "USDT conversion and commission settings are manually configured.": "Конвертация USDT и комиссии настраиваются вручную.",
+ "USDT Rate": "Курс USDT",
"Use +: to add a group, -: to remove a default selectable group, or no prefix to append a group.": "Используйте +: для добавления группы, -: для удаления выбираемой по умолчанию группы, без префикса — для добавления в конец.",
"Use a compatible browser or device with biometric authentication or a security key to register a Passkey.": "Используйте совместимый браузер или устройство с биометрической аутентификацией или ключ безопасности для регистрации ключа доступа.",
"Use a path to append it to the channel Base URL, or enter a full URL to override the Base URL for this route.": "Укажите путь, чтобы добавить его к Base URL канала, или введите полный URL, чтобы переопределить Base URL для этого маршрута.",
@@ -4581,6 +4620,7 @@
"User Information": "Информация о пользователе",
"User Menu": "Меню пользователя",
"User personal functions": "Личные функции пользователя",
+ "User Role Binding": "Привязка ролей пользователя",
"User selectable": "Доступно пользователю",
"User Subscription Management": "Управление подписками пользователя",
"User updated successfully": "Пользователь успешно обновлен",
@@ -4692,6 +4732,7 @@
"Waiting": "Ожидание",
"Waiting for email...": "Ожидание письма...",
"Wallet": "Кошелек",
+ "Wallet Address": "Адрес кошелька",
"Wallet First": "Кошелёк в приоритете",
"Wallet Management": "Управление кошельком",
"Wallet management and personal preferences.": "Управление кошельком и личные предпочтения.",
@@ -4762,6 +4803,7 @@
"Wire encoding for the embedding vectors": "Кодирование векторов в передаче",
"with conflicts": "с конфликтами",
"with the API key from your token settings.": "на API-ключ из настроек токенов.",
+ "Withdrawal Fee": "Комиссия за вывод",
"Without additional conditions, only the type above is used for pruning.": "Без дополнительных условий для очистки используется только тип выше.",
"Worker Access Key": "Ключ доступа воркера",
"Worker Proxy": "Прокси воркера",
diff --git a/web/default/src/i18n/locales/vi.json b/web/default/src/i18n/locales/vi.json
index c1791f29f42f..640c9166e22a 100644
--- a/web/default/src/i18n/locales/vi.json
+++ b/web/default/src/i18n/locales/vi.json
@@ -351,6 +351,7 @@
"API Addresses": "Địa chỉ API",
"API Base URL (Important: Not Chat API) *": "URL cơ sở API (Quan trọng: Không phải API Chat) *",
"API Base URL *": "URL cơ sở API *",
+ "API Configuration": "Cau hinh API",
"API Endpoints": "Điểm cuối API",
"API Info": "Thông tin API",
"API info added. Click \"Save Settings\" to apply.": "Thông tin API đã được thêm. Nhấp vào \"Lưu Cài đặt\" để áp dụng.",
@@ -358,7 +359,7 @@
"API info saved successfully": "Đã lưu thông tin API thành công",
"API info updated. Click \"Save Settings\" to apply.": "Thông tin API đã được cập nhật. Nhấp vào \"Lưu Cài đặt\" để áp dụng.",
"API key": "Khóa API",
- "API Key": "Khóa API",
+ "API Key": "Khoa API",
"API Key (one per line for batch mode)": "Khóa API (mỗi khóa một dòng cho chế độ hàng loạt)",
"API Key (Production)": "API Key (Sản xuất)",
"API Key (Sandbox)": "Khóa API (Sandbox)",
@@ -377,7 +378,7 @@
"API Requests": "Yêu cầu API",
"API secret": "Bí mật API",
"API token management": "Quản lý token API",
- "API URL": "API URL",
+ "API URL": "URL API",
"API usage records": "Lịch sử sử dụng API",
"API2GPT": "API2GPT",
"App": "Ứng dụng",
@@ -402,6 +403,7 @@
"Apply reset": "Thực hiện đặt lại",
"Apply Sync": "Áp dụng đồng bộ",
"Applying...": "Đang áp dụng...",
+ "Approved models can later be listed for users.": "Cac model da duyet co the duoc niem yet cho nguoi dung sau nay.",
"Approx.": "Xấp xỉ.",
"apps": "ứng dụng",
"Apps": "Ứng dụng",
@@ -580,10 +582,12 @@
"Billing Mode": "Chế độ thanh toán",
"Billing Process": "Quá trình tính phí",
"Billing Source": "Nguồn thanh toán",
+ "Billing Type": "Kieu tinh phi",
"Bind": "Buộc",
"Bind a Pancake store + product": "Liên kết cửa hàng + sản phẩm Pancake",
"Bind an email address to your account.": "Liên kết địa chỉ email với tài khoản của bạn.",
"Bind Email": "Liên kết Email",
+ "Bind extra platform roles while preserving legacy role levels.": "Gan them vai tro nen tang trong khi giu nguyen cap vai tro cu.",
"Bind Telegram Account": "Liên kết tài khoản Telegram",
"Bind WeChat Account": "Liên kết tài khoản WeChat",
"Binding Information": "Thông tin Ràng buộc",
@@ -623,6 +627,7 @@
"Built for developers,": "Được xây dựng cho nhà phát triển,",
"Built-in": "Tích hợp sẵn",
"Built-in Device": "Thiết bị tích hợp",
+ "Built-in roles define the phase one access boundaries.": "Vai tro tich hop xac dinh ranh gioi truy cap giai doan mot.",
"Built-in: phone fingerprint/face, or Windows Hello; External: USB security key": "Tích hợp sẵn: vân tay/khuôn mặt điện thoại, hoặc Windows Hello; Bên ngoài: khóa bảo mật USB",
"by": "by",
"By category": "Theo danh mục",
@@ -658,6 +663,7 @@
"Calculating...": "Đang tính...",
"Call Count Distribution": "Phân bổ số lượt gọi",
"Call Count Ranking": "Xếp hạng số lượt gọi",
+ "Call Price": "Gia moi lan goi",
"Call Proportion": "Tỷ lệ cuộc gọi",
"Call Trend": "Xu hướng cuộc gọi",
"Callback address": "Địa chỉ callback",
@@ -668,6 +674,7 @@
"Cancelled": "Đã hủy",
"Cancelled at": "Đã hủy lúc",
"Capabilities": "Khả năng",
+ "Capability Tags": "The nang luc",
"Capture a reusable bundle of models, tags, or endpoints.": "Đóng gói một bộ có thể tái sử dụng gồm các mô hình, thẻ hoặc điểm cuối.",
"Card view": "Dạng thẻ",
"Category": "Danh mục",
@@ -849,6 +856,7 @@
"Comma-separated model names (leave empty to keep current)": "Tên mô hình phân tách bằng dấu phẩy (để trống để giữ nguyên hiện tại)",
"Comma-separated model names, e.g., gpt-4,gpt-3.5-turbo": "Tên mô hình được phân tách bằng dấu phẩy, ví dụ: gpt-4,gpt-3.5-turbo",
"Command": "Lệnh",
+ "Commission Ratio": "Ty le hoa hong",
"Common": "Chung",
"Common Keys": "Khóa thường dùng",
"Common Logs": "Logarit thập phân",
@@ -914,6 +922,7 @@
"Configure rate limiting rules for a specific user group.": "Cấu hình quy tắc giới hạn tốc độ cho một nhóm người dùng cụ thể.",
"Configure routes": "Cấu hình route",
"Configure the ratio for this group.": "Cấu hình tỷ lệ cho nhóm này.",
+ "Configure upstream access without exposing secrets.": "Cau hinh truy cap upstream ma khong lo bi mat.",
"Configure upstream providers and routing.": "Cấu hình nhà cung cấp upstream và định tuyến.",
"Configure Waffo Pancake hosted checkout integration for USD-priced top-ups": "Cấu hình tích hợp thanh toán Waffo Pancake (hosted checkout) cho nạp tiền theo USD",
"Configure Waffo payment aggregation platform integration": "Cấu hình tích hợp nền tảng tổng hợp thanh toán Waffo",
@@ -965,6 +974,7 @@
"Console Content": "Nội dung bảng điều khiển",
"Consume": "Tiêu thụ",
"Consumed in the last 24 hours": "Đã tiêu thụ trong 24 giờ qua",
+ "Contact": "Lien he",
"Container": "Thùng chứa",
"Container name": "Tên container",
"Containers": "Các thùng chứa",
@@ -976,6 +986,7 @@
"Content not modified!": "Nội dung không được thay đổi!",
"Content width": "Chiều rộng nội dung",
"Context": "Ngữ cảnh",
+ "Context Length": "Do dai ngu canh",
"Continue": "Tiếp tục",
"Continue with {{name}}": "Tiếp tục với {{name}}",
"Continue with Discord": "Tiếp tục với Discord",
@@ -1061,12 +1072,13 @@
"Create Code": "Tạo Mã",
"Create credentials for the root user": "Tạo thông tin đăng nhập cho tài khoản quản trị",
"Create deployment": "Tạo triển khai",
- "Create Model": "Tạo Mô hình",
+ "Create Model": "Tao model",
"Create multiple API keys at once (random suffix will be added to names)": "Tạo nhiều khóa API cùng lúc (hậu tố ngẫu nhiên sẽ được thêm vào tên)",
"Create multiple channels from multiple keys": "Tạo nhiều kênh từ nhiều khóa",
"Create multiple redemption codes at once (1-100)": "Tạo nhiều mã đổi thưởng cùng lúc (1-100)",
"Create new subscription plan": "Tạo gói đăng ký mới",
"Create or update frequently asked questions for users": "Tạo hoặc cập nhật các câu hỏi thường gặp cho người dùng",
+ "Create or update provider identity for marketplace ownership.": "Tao hoac cap nhat danh tinh nha cung cap de gan quyen so huu marketplace.",
"Create or update system announcements for the dashboard": "Tạo hoặc cập nhật thông báo hệ thống cho bảng điều khiển",
"Create Plan": "Tạo gói",
"Create Prefill Group": "Tạo Nhóm Điền Sẵn",
@@ -1867,6 +1879,7 @@
"Final cost = base × multiplier when conditions match": "Chi phí cuối = cơ sở × hệ số khi thỏa điều kiện",
"Final price multiplier (0.95 = 5% discount": "Hệ số nhân giá cuối cùng (0.95 = giảm giá 5%)",
"Finance": "Tài chính",
+ "Finance Foundation": "Nen tang tai chinh",
"Finish Time": "Thời gian hoàn thành",
"First API request": "Yêu cầu API đầu tiên",
"First/Last Frame to Video": "Khung đầu/cuối sang video",
@@ -2168,6 +2181,7 @@
"Input": "Đầu vào",
"Input mode": "Chế độ nhập",
"Input price": "Giá đầu vào",
+ "Input Price": "Gia dau vao",
"Input price is required before saving dependent prices.": "Cần có giá đầu vào trước khi lưu các giá phụ thuộc.",
"Input tokens": "Token đầu vào",
"Input Tokens": "Token đầu vào",
@@ -2374,6 +2388,7 @@
"Low balance": "Số dư thấp",
"Lowest median first-token latency": "Độ trễ trung vị token đầu tiên thấp nhất",
"m": "m",
+ "Maintain the phase one model foundation data.": "Quan ly du lieu nen tang model cua giai doan mot.",
"Maintenance": "Bảo trì",
"Make it easier for teammates to pick the right group.": "Giúp đồng đội dễ dàng chọn đúng nhóm hơn.",
"Manage": "Quản lý",
@@ -2398,6 +2413,7 @@
"Map upstream status codes to different codes": "Ánh xạ mã trạng thái upstream sang các mã khác",
"Market Share": "Thị phần",
"Marketing": "Tiếp thị",
+ "Marketplace Models": "Model tren marketplace",
"Match All (AND)": "Tất cả khớp (AND)",
"Match Any (OR)": "Bất kỳ khớp (OR)",
"Match Mode": "Chế độ khớp",
@@ -2458,6 +2474,7 @@
"Minimum top-up quantity": "Số lượng nạp tối thiểu",
"Minimum topup amount: {{amount}}": "Số tiền nạp tối thiểu: {{amount}}",
"Minimum Trust Level": "Mức độ tin cậy tối thiểu",
+ "Minimum Withdrawal": "Rut toi thieu",
"Minimum:": "Tối thiểu:",
"Minor blips in the last 30 days": "Vài gián đoạn nhỏ trong 30 ngày qua",
"Mint a fresh pair below — or pick an existing one further down. Click Save when ready.": "Tạo một cặp mới bên dưới, hoặc chọn một cặp hiện có ở phía dưới. Nhấn Lưu khi đã sẵn sàng.",
@@ -2492,15 +2509,17 @@
"Model enabled successfully": "Model đã được kích hoạt thành công",
"Model fixed pricing": "Fixed-price model",
"Model Group": "Nhóm Mô hình",
+ "Model Keys": "Khoa model",
"Model Limits": "Giới hạn Mô hình",
- "Model Mapping": "Ánh xạ mô hình",
+ "Model Mapping": "Anh xa model",
"Model Mapping (JSON)": "Ánh xạ mô hình (JSON)",
"Model Mapping must be a JSON object like": "Ánh xạ Mô hình phải là một đối tượng JSON như",
"Model mapping must be a JSON object with string values": "Ánh xạ mô hình phải là đối tượng JSON với giá trị chuỗi",
"Model mapping must be valid JSON": "Ánh xạ mô hình phải là JSON hợp lệ",
"Model mapping values must be strings": "Giá trị ánh xạ mô hình phải là chuỗi",
+ "Model Marketplace": "Marketplace model",
"Model name": "Tên mẫu",
- "Model Name": "Tên mẫu",
+ "Model Name": "Ten model",
"Model Name *": "Tên mẫu *",
"Model name is required": "Tên mô hình là bắt buộc",
"Model names copied to clipboard": "Tên mô hình đã được sao chép vào bộ nhớ tạm",
@@ -2523,6 +2542,7 @@
"Model Tags": "Thẻ mô hình",
"Model to use for testing": "Mô hình dùng để kiểm thử",
"Model to use when testing channel connectivity": "Mô hình để sử dụng khi kiểm tra kết nối kênh",
+ "Model Type": "Loai model",
"Model Version *": "Phiên bản mô hình *",
"model(s) selected out of": "mô hình(s) được chọn trong số",
"model(s)? This action cannot be undone.": "mô hình(s)? Hành động này không thể hoàn tác.",
@@ -2709,12 +2729,14 @@
"No incidents in the last 24 hours": "Không có sự cố trong 24 giờ qua",
"No incidents in the last 30 days": "Không có sự cố trong 30 ngày qua",
"No Inviter": "Không có người mời",
+ "No keys configured": "Chua cau hinh khoa",
"No keys found": "Không tìm thấy khóa",
"No latency data available": "Không có dữ liệu độ trễ",
"No log entries matched the selected time.": "Không có mục nhật ký nào khớp với thời gian đã chọn.",
"No logs": "Không có nhật ký",
"No Logs Found": "Không tìm thấy nhật ký",
"No mappings configured. Click \"Add Row\" to get started.": "Chưa có ánh xạ nào được cấu hình. Nhấp vào \"Thêm hàng\" để bắt đầu.",
+ "No marketplace models found": "Khong tim thay model marketplace",
"No matches found": "Không tìm thấy kết quả nào",
"No matching items": "Không có mục phù hợp",
"No matching results": "Không có kết quả phù hợp",
@@ -2759,6 +2781,7 @@
"No products configured. Click \"Add product\" to get started.": "Chưa cấu hình sản phẩm nào. Nhấp \"Thêm sản phẩm\" để bắt đầu.",
"No products match your search": "Không có sản phẩm nào khớp với tìm kiếm của bạn",
"No providers available": "Không có nhà cung cấp khả dụng",
+ "No providers found": "Khong tim thay nha cung cap",
"No Quota": "Không hạn ngạch",
"No ratio differences found": "Không tìm thấy sự khác biệt tỷ lệ",
"No recent usage": "Chưa có sử dụng gần đây",
@@ -2775,6 +2798,7 @@
"No results found": "Không tìm thấy kết quả nào",
"No results found.": "Không tìm thấy kết quả.",
"No Retry": "Không thử lại",
+ "No roles found": "Khong tim thay vai tro",
"No rules yet": "Chưa có quy tắc",
"No rules yet. Add a group below to get started.": "Chưa có quy tắc nào. Thêm một nhóm bên dưới để bắt đầu.",
"No separate media pricing configured.": "Chưa cấu hình giá phương tiện riêng.",
@@ -2879,6 +2903,7 @@
"Only available for admins. When enabled, you will receive a summary notification via your selected method when the scheduled model check detects upstream model changes or check failures.": "Chỉ khả dụng cho quản trị viên. Khi bật, bạn sẽ nhận được thông báo tổng hợp qua phương thức đã chọn khi kiểm tra mô hình định kỳ phát hiện thay đổi mô hình nguồn hoặc lỗi kiểm tra.",
"Only configured combinations are overridden. All other calls keep the token group base ratio.": "Chỉ các tổ hợp đã cấu hình mới bị ghi đè. Các lệnh gọi khác giữ tỷ lệ cơ bản của nhóm token.",
"Only enter the site origin, for example https://api.example.com. Do not include any path such as /api/user/epay/notify. Leave blank to use the server address.": "Chỉ nhập origin của trang, ví dụ https://api.example.com. Không nhập đường dẫn như /api/user/epay/notify. Để trống để dùng địa chỉ máy chủ.",
+ "Only masked keys are shown after saving.": "Sau khi luu chi hien thi khoa da che.",
"Only selected fields will be overwritten. You can re-run the sync wizard if new conflicts appear.": "Chỉ các trường được chọn sẽ bị ghi đè. Bạn có thể chạy lại trình hướng dẫn đồng bộ hóa nếu có xung đột mới xuất hiện.",
"Only successful requests": "Chỉ các yêu cầu thành công",
"Only successful requests count toward this limit.": "Chỉ những yêu cầu thành công mới được tính vào giới hạn này.",
@@ -2965,6 +2990,7 @@
"Output aspect ratio": "Tỉ lệ khung hình",
"Output image size": "Kích thước ảnh đầu ra",
"Output price": "Giá đầu ra",
+ "Output Price": "Gia dau ra",
"Output token price for generated tokens.": "Giá token đầu ra cho nội dung được tạo.",
"Output tokens": "Token đầu ra",
"Output Tokens": "Token đầu ra",
@@ -3251,6 +3277,7 @@
"Price: High to Low": "Giá: Từ cao đến thấp",
"Price: Low to High": "Giá: Thấp đến Cao",
"Prices shown per": "Giá hiển thị theo",
+ "Prices stay in draft until a later review flow approves them.": "Gia giu o trang thai nhap cho den khi luong duyet sau chap thuan.",
"Prices synced successfully": "Đồng bộ giá thành công",
"Prices vary by usage tier and request conditions": "Giá thay đổi theo bậc dùng và điều kiện yêu cầu",
"Pricing": "Giá cả",
@@ -3302,12 +3329,17 @@
"Provide per-model header overrides as JSON. Useful for enabling beta features such as expanded context windows.": "Cung cấp các ghi đè tiêu đề theo từng mô hình dưới dạng JSON. Hữu ích để bật các tính năng beta như cửa sổ ngữ cảnh mở rộng.",
"Provider": "Nhà cung cấp",
"Provider & data privacy": "Nhà cung cấp & quyền riêng tư",
+ "Provider Console": "Bang dieu khien nha cung cap",
"Provider created successfully": "Đã tạo nhà cung cấp thành công",
"Provider deleted successfully": "Đã xóa nhà cung cấp thành công",
"Provider Name": "Tên Nhà cung cấp",
+ "Provider Profile": "Ho so nha cung cap",
+ "Provider Profiles": "Ho so nha cung cap",
"Provider type (OpenAI, Anthropic, etc.)": "Loại nhà cung cấp (OpenAI, Anthropic, v.v.)",
"Provider updated successfully": "Nhà cung cấp đã được cập nhật thành công",
+ "Provider Wallet": "Vi nha cung cap",
"Provider-specific endpoint, account, and compatibility settings.": "Thiết lập endpoint, tài khoản và tương thích riêng cho nhà cung cấp.",
+ "Providers can only see their own profile unless granted platform permissions.": "Nha cung cap chi xem duoc ho so cua minh tru khi co quyen nen tang.",
"Proxy Address": "Địa chỉ Proxy",
"Prune Object Items": "Dọn mục đối tượng",
"Prune object items by conditions": "Dọn dẹp các mục đối tượng theo điều kiện",
@@ -3611,7 +3643,9 @@
"Rewrite callback URLs to the local server": "Viết lại URL callback đến máy chủ cục bộ",
"Right to Left": "Phải sang trái",
"Role": "Vai trò",
+ "Role Matrix": "Ma tran vai tro",
"Roleplay": "Nhập vai",
+ "Roles & Permissions": "Vai tro va quyen",
"Root": "Gốc",
"Rose Garden": "Vườn hoa hồng",
"Route": "Tuyến đường",
@@ -3746,6 +3780,7 @@
"Select a model to edit pricing": "Chọn mô hình để chỉnh sửa giá",
"Select a preset...": "Chọn cấu hình sẵn...",
"Select a product": "Chọn sản phẩm",
+ "Select a provider to manage wallet and settlement settings.": "Chon nha cung cap de quan ly vi va cau hinh quyet toan.",
"Select a role": "Chọn vai trò",
"Select a rule to edit.": "Chọn một quy tắc để chỉnh sửa.",
"Select a store": "Chọn cửa hàng",
@@ -3867,6 +3902,7 @@
"Settings": "Cài đặt",
"Settings & Preferences": "Cài đặt & Tùy chọn",
"Settings updated successfully": "Cài đặt đã được cập nhật thành công",
+ "Settlement Configuration": "Cau hinh quyet toan",
"Setup guide": "Hướng dẫn thiết lập",
"Setup guide complete": "Đã hoàn tất hướng dẫn thiết lập",
"Setup guide is collapsed. Expand it anytime.": "Hướng dẫn thiết lập đã được thu gọn. Bạn có thể mở lại bất cứ lúc nào.",
@@ -3879,11 +3915,11 @@
"Shorten": "Rút gọn",
"Show": "Hiển thị",
"Show All": "Hiển thị tất cả",
- "Show sensitive data": "Hiển thị dữ liệu nhạy cảm",
"Show all providers including unbound": "Hiển thị tất cả nhà cung cấp (bao gồm chưa liên kết)",
"Show only bound providers": "Chỉ hiển thị nhà cung cấp đã liên kết",
"Show or hide flow columns": "Hiện hoặc ẩn các cột luồng",
"Show prices in currency instead of quota.": "Hiển thị giá bằng tiền tệ thay vì hạn ngạch.",
+ "Show sensitive data": "Hiển thị dữ liệu nhạy cảm",
"Show setup guide": "Hiển thị hướng dẫn thiết lập",
"Show token usage statistics in the UI": "Hiển thị thống kê sử dụng token trong giao diện người dùng",
"Showcase core capabilities with demo credentials and limited access.": "Trình diễn các tính năng cốt lõi với thông tin đăng nhập demo và quyền truy cập hạn chế.",
@@ -4089,6 +4125,7 @@
"System setup wizard": "Trình hướng dẫn thiết lập hệ thống",
"System task records": "Lịch sử tác vụ hệ thống",
"System Version": "Phiên bản hệ thống",
+ "System-only wallet data for phase one settlement tracking.": "Du lieu vi noi bo dung de theo doi quyet toan giai doan mot.",
"Table view": "Xem dạng bảng",
"Tag": "Tag",
"Tag Aggregate": "Tổng hợp thẻ",
@@ -4449,7 +4486,7 @@
"Update channel configuration and click save when you're done.": "Cập nhật cấu hình kênh và nhấp lưu khi bạn hoàn tất.",
"Update configuration": "Cập nhật cấu hình",
"Update failed": "Cập nhật thất bại",
- "Update Model": "Cập nhật mô hình",
+ "Update Model": "Cap nhat model",
"Update model configuration and click save when you're done.": "Cập nhật cấu hình mô hình và nhấp lưu khi bạn hoàn tất.",
"Update plan info": "Cập nhật thông tin gói",
"Update Provider": "Cập nhật Nhà cung cấp",
@@ -4526,6 +4563,8 @@
"USD Exchange Rate": "Tỷ giá USD",
"USD price per 1M input tokens.": "Giá USD cho mỗi 1 triệu token đầu vào.",
"USD price per 1M tokens.": "Giá USD cho mỗi 1 triệu token.",
+ "USDT conversion and commission settings are manually configured.": "Quy doi USDT va hoa hong duoc cau hinh thu cong.",
+ "USDT Rate": "Ty gia USDT",
"Use +: to add a group, -: to remove a default selectable group, or no prefix to append a group.": "Dùng +: để thêm nhóm, -: để xóa nhóm có thể chọn mặc định, hoặc không có tiền tố để nối nhóm.",
"Use a compatible browser or device with biometric authentication or a security key to register a Passkey.": "Sử dụng trình duyệt hoặc thiết bị tương thích có xác thực sinh trắc học hoặc khóa bảo mật để đăng ký Khóa truy cập.",
"Use a path to append it to the channel Base URL, or enter a full URL to override the Base URL for this route.": "Dùng đường dẫn để nối vào Base URL của kênh, hoặc nhập URL đầy đủ để ghi đè Base URL cho tuyến này.",
@@ -4581,6 +4620,7 @@
"User Information": "Thông tin người dùng",
"User Menu": "Menu người dùng",
"User personal functions": "Chức năng cá nhân người dùng",
+ "User Role Binding": "Gan vai tro nguoi dung",
"User selectable": "Người dùng có thể chọn",
"User Subscription Management": "Quản lý đăng ký người dùng",
"User updated successfully": "Cập nhật người dùng thành công",
@@ -4692,6 +4732,7 @@
"Waiting": "Đang chờ",
"Waiting for email...": "Đang chờ email...",
"Wallet": "Ví",
+ "Wallet Address": "Dia chi vi",
"Wallet First": "Ưu tiên ví",
"Wallet Management": "Quản lý ví",
"Wallet management and personal preferences.": "Quản lý ví và sở thích cá nhân.",
@@ -4762,6 +4803,7 @@
"Wire encoding for the embedding vectors": "Định dạng truyền cho vector embedding",
"with conflicts": "với các xung đột",
"with the API key from your token settings.": "bằng API key từ trang Tokens của bạn.",
+ "Withdrawal Fee": "Phi rut tien",
"Without additional conditions, only the type above is used for pruning.": "Không có điều kiện bổ sung, chỉ type ở trên được sử dụng để dọn dẹp.",
"Worker Access Key": "Khóa truy cập nhân viên",
"Worker Proxy": "Proxy Nhân viên",
diff --git a/web/default/src/i18n/locales/zh.json b/web/default/src/i18n/locales/zh.json
index 30b926532a0e..aa683a373087 100644
--- a/web/default/src/i18n/locales/zh.json
+++ b/web/default/src/i18n/locales/zh.json
@@ -351,6 +351,7 @@
"API Addresses": "API 地址",
"API Base URL (Important: Not Chat API) *": "API 基础 URL (重要:非聊天 API) *",
"API Base URL *": "API 基础 URL *",
+ "API Configuration": "API 配置",
"API Endpoints": "API 端点",
"API Info": "API 信息",
"API info added. Click \"Save Settings\" to apply.": "API 信息已添加。点击 \"保存设置\" 以应用。",
@@ -377,7 +378,7 @@
"API Requests": "API 请求",
"API secret": "API 秘钥",
"API token management": "API令牌管理",
- "API URL": "API URL",
+ "API URL": "API 地址",
"API usage records": "API使用记录",
"API2GPT": "API2GPT",
"App": "应用",
@@ -402,6 +403,7 @@
"Apply reset": "执行重置",
"Apply Sync": "应用同步",
"Applying...": "正在应用...",
+ "Approved models can later be listed for users.": "审核通过的模型后续可上架给用户使用。",
"Approx.": "约",
"apps": "个应用",
"Apps": "应用",
@@ -580,10 +582,12 @@
"Billing Mode": "计费模式",
"Billing Process": "计费过程",
"Billing Source": "计费来源",
+ "Billing Type": "计费方式",
"Bind": "绑定",
"Bind a Pancake store + product": "绑定 Pancake 店铺和产品",
"Bind an email address to your account.": "将邮箱地址绑定到您的账户。",
"Bind Email": "绑定邮箱",
+ "Bind extra platform roles while preserving legacy role levels.": "在保留旧角色等级的同时绑定额外平台角色。",
"Bind Telegram Account": "绑定 Telegram 账户",
"Bind WeChat Account": "绑定微信账户",
"Binding Information": "绑定信息",
@@ -623,6 +627,7 @@
"Built for developers,": "为开发者打造,",
"Built-in": "内置",
"Built-in Device": "内置设备",
+ "Built-in roles define the phase one access boundaries.": "内置角色定义第一阶段的访问边界。",
"Built-in: phone fingerprint/face, or Windows Hello; External: USB security key": "内置:手机指纹/面部,或 Windows Hello;外部:USB 安全密钥",
"by": "由",
"By category": "按行业",
@@ -658,6 +663,7 @@
"Calculating...": "计算中...",
"Call Count Distribution": "调用次数分布",
"Call Count Ranking": "调用次数排行",
+ "Call Price": "调用价格",
"Call Proportion": "调用比例",
"Call Trend": "调用趋势",
"Callback address": "回调地址",
@@ -668,6 +674,7 @@
"Cancelled": "已取消",
"Cancelled at": "作废于",
"Capabilities": "能力",
+ "Capability Tags": "能力标签",
"Capture a reusable bundle of models, tags, or endpoints.": "捕获可重用的模型、标签或端点捆绑包。",
"Card view": "卡片视图",
"Category": "分类",
@@ -849,6 +856,7 @@
"Comma-separated model names (leave empty to keep current)": "逗号分隔的模型名称(留空以保持当前设置)",
"Comma-separated model names, e.g., gpt-4,gpt-3.5-turbo": "逗号分隔的模型名称,例如 gpt-4,gpt-3.5-turbo",
"Command": "命令",
+ "Commission Ratio": "分润比例",
"Common": "通用",
"Common Keys": "常用 Key",
"Common Logs": "通用日志",
@@ -914,6 +922,7 @@
"Configure rate limiting rules for a specific user group.": "配置特定用户分组的速率限制规则。",
"Configure routes": "配置路由",
"Configure the ratio for this group.": "配置此分组的比例。",
+ "Configure upstream access without exposing secrets.": "配置上游访问且不暴露密钥。",
"Configure upstream providers and routing.": "配置上游提供者和路由。",
"Configure Waffo Pancake hosted checkout integration for USD-priced top-ups": "配置 Waffo Pancake 托管结账,用于美元计价的充值",
"Configure Waffo payment aggregation platform integration": "配置 Waffo 支付聚合平台集成",
@@ -965,6 +974,7 @@
"Console Content": "控制台内容",
"Consume": "消耗",
"Consumed in the last 24 hours": "近 24 小时消耗量",
+ "Contact": "联系方式",
"Container": "容器",
"Container name": "容器名称",
"Containers": "容器",
@@ -976,6 +986,7 @@
"Content not modified!": "内容未修改!",
"Content width": "内容宽度",
"Context": "上下文",
+ "Context Length": "上下文长度",
"Continue": "继续",
"Continue with {{name}}": "使用 {{name}} 继续",
"Continue with Discord": "使用 Discord 继续",
@@ -1067,6 +1078,7 @@
"Create multiple redemption codes at once (1-100)": "一次创建多个兑换码 (1-100)",
"Create new subscription plan": "创建新的订阅套餐",
"Create or update frequently asked questions for users": "创建或更新用户的常见问题",
+ "Create or update provider identity for marketplace ownership.": "创建或更新提供商身份,用于模型归属。",
"Create or update system announcements for the dashboard": "创建或更新仪表板的系统公告",
"Create Plan": "新建套餐",
"Create Prefill Group": "创建预填充组",
@@ -1867,6 +1879,7 @@
"Final cost = base × multiplier when conditions match": "匹配条件时,最终费用 = 基础费用 × 倍率",
"Final price multiplier (0.95 = 5% discount": "最终价格乘数 (0.95 = 5% 折扣",
"Finance": "金融",
+ "Finance Foundation": "财务底座",
"Finish Time": "完成时间",
"First API request": "首个 API 请求",
"First/Last Frame to Video": "首尾生视频",
@@ -2168,6 +2181,7 @@
"Input": "输入",
"Input mode": "输入模式",
"Input price": "输入价格",
+ "Input Price": "输入价格",
"Input price is required before saving dependent prices.": "保存依赖价格前必须先填写输入价格。",
"Input tokens": "输入 token",
"Input Tokens": "输入 Token",
@@ -2374,6 +2388,7 @@
"Low balance": "余额偏低",
"Lowest median first-token latency": "最低首 token 延迟中位数",
"m": "分钟",
+ "Maintain the phase one model foundation data.": "维护第一阶段模型基础数据。",
"Maintenance": "维护",
"Make it easier for teammates to pick the right group.": "让队友更容易选择正确的分组。",
"Manage": "管理",
@@ -2398,6 +2413,7 @@
"Map upstream status codes to different codes": "将上游状态码映射到不同的代码",
"Market Share": "市场份额",
"Marketing": "市场营销",
+ "Marketplace Models": "模型广场模型",
"Match All (AND)": "必须全部满足(AND)",
"Match Any (OR)": "满足任一条件(OR)",
"Match Mode": "匹配方式",
@@ -2458,6 +2474,7 @@
"Minimum top-up quantity": "最低充值数量",
"Minimum topup amount: {{amount}}": "最低充值金额:{{amount}}",
"Minimum Trust Level": "最低信任级别",
+ "Minimum Withdrawal": "最小提现额",
"Minimum:": "最低:",
"Minor blips in the last 30 days": "近 30 天内有轻微抖动",
"Mint a fresh pair below — or pick an existing one further down. Click Save when ready.": "在下方创建新的配对,或继续向下选择已有配对。准备好后点击保存。",
@@ -2492,6 +2509,7 @@
"Model enabled successfully": "模型启用成功",
"Model fixed pricing": "模型固定定价",
"Model Group": "模型分组",
+ "Model Keys": "模型密钥",
"Model Limits": "模型限制",
"Model Mapping": "模型映射",
"Model Mapping (JSON)": "模型映射 (JSON)",
@@ -2499,6 +2517,7 @@
"Model mapping must be a JSON object with string values": "模型映射必须是值为字符串的 JSON 对象",
"Model mapping must be valid JSON": "模型映射必须是有效的 JSON",
"Model mapping values must be strings": "模型映射的值必须是字符串",
+ "Model Marketplace": "模型广场",
"Model name": "模型名称",
"Model Name": "模型名称",
"Model Name *": "模型名称 *",
@@ -2523,6 +2542,7 @@
"Model Tags": "模型标签",
"Model to use for testing": "用于测试的模型",
"Model to use when testing channel connectivity": "测试渠道连接时使用的模型",
+ "Model Type": "模型类型",
"Model Version *": "模型版本 *",
"model(s) selected out of": "已选模型(共)",
"model(s)? This action cannot be undone.": "模型?此操作无法撤销。",
@@ -2709,12 +2729,14 @@
"No incidents in the last 24 hours": "最近 24 小时无异常",
"No incidents in the last 30 days": "最近 30 天无事件",
"No Inviter": "无邀请人",
+ "No keys configured": "暂无密钥配置",
"No keys found": "未找到密钥",
"No latency data available": "暂无延迟数据",
"No log entries matched the selected time.": "没有日志条目匹配所选时间。",
"No logs": "暂无日志",
"No Logs Found": "未找到日志",
"No mappings configured. Click \"Add Row\" to get started.": "未配置映射。点击 \"添加行\" 开始。",
+ "No marketplace models found": "暂无模型广场模型",
"No matches found": "未找到匹配项",
"No matching items": "没有匹配项",
"No matching results": "无匹配结果",
@@ -2759,6 +2781,7 @@
"No products configured. Click \"Add product\" to get started.": "未配置产品。点击 \"添加产品\" 开始。",
"No products match your search": "没有产品匹配您的搜索",
"No providers available": "暂无可用提供商",
+ "No providers found": "暂无提供商",
"No Quota": "无余额",
"No ratio differences found": "未发现比率差异",
"No recent usage": "暂无使用记录",
@@ -2775,6 +2798,7 @@
"No results found": "搜索无结果",
"No results found.": "未找到结果。",
"No Retry": "不重试",
+ "No roles found": "暂无角色",
"No rules yet": "暂无规则",
"No rules yet. Add a group below to get started.": "暂无规则。请在下方添加分组以开始。",
"No separate media pricing configured.": "未配置单独的媒体定价。",
@@ -2879,6 +2903,7 @@
"Only available for admins. When enabled, you will receive a summary notification via your selected method when the scheduled model check detects upstream model changes or check failures.": "仅管理员可用。启用后,当定时模型检查检测到上游模型变更或检查失败时,您将通过所选方式收到汇总通知。",
"Only configured combinations are overridden. All other calls keep the token group base ratio.": "只有已配置的组合会被覆盖,其他调用仍使用令牌分组的基础倍率。",
"Only enter the site origin, for example https://api.example.com. Do not include any path such as /api/user/epay/notify. Leave blank to use the server address.": "只填写站点根域名,例如 https://api.example.com。不要填写 /api/user/epay/notify 这类路径。留空则使用服务器地址。",
+ "Only masked keys are shown after saving.": "保存后仅展示脱敏密钥。",
"Only selected fields will be overwritten. You can re-run the sync wizard if new conflicts appear.": "仅选定的字段将被覆盖。如果出现新的冲突,您可以重新运行同步向导。",
"Only successful requests": "仅成功的请求",
"Only successful requests count toward this limit.": "仅成功的请求计入此限制。",
@@ -2965,6 +2990,7 @@
"Output aspect ratio": "输出宽高比",
"Output image size": "输出图像尺寸",
"Output price": "输出价格",
+ "Output Price": "输出价格",
"Output token price for generated tokens.": "生成内容的输出 token 价格。",
"Output tokens": "输出 token",
"Output Tokens": "输出 Token",
@@ -3251,6 +3277,7 @@
"Price: High to Low": "价格:从高到低",
"Price: Low to High": "价格:从低到高",
"Prices shown per": "价格显示单位",
+ "Prices stay in draft until a later review flow approves them.": "价格在后续审核流程通过前保持草稿状态。",
"Prices synced successfully": "价格同步成功",
"Prices vary by usage tier and request conditions": "价格根据用量档位和请求条件动态调整",
"Pricing": "定价",
@@ -3302,12 +3329,17 @@
"Provide per-model header overrides as JSON. Useful for enabling beta features such as expanded context windows.": "以 JSON 格式提供按模型划分的标头覆盖。可用于启用测试功能,例如扩展上下文窗口。",
"Provider": "提供商",
"Provider & data privacy": "厂商与数据隐私",
+ "Provider Console": "提供商后台",
"Provider created successfully": "提供商创建成功",
"Provider deleted successfully": "提供商删除成功",
"Provider Name": "提供商名称",
+ "Provider Profile": "提供商资料",
+ "Provider Profiles": "提供商资料",
"Provider type (OpenAI, Anthropic, etc.)": "提供商类型 (OpenAI、Anthropic 等)",
"Provider updated successfully": "提供商更新成功",
+ "Provider Wallet": "提供商钱包",
"Provider-specific endpoint, account, and compatibility settings.": "配置供应商专属的端点、账户和兼容性选项。",
+ "Providers can only see their own profile unless granted platform permissions.": "除非授予平台权限,提供商只能查看自身资料。",
"Proxy Address": "代理地址",
"Prune Object Items": "清理对象项",
"Prune object items by conditions": "按条件清理对象中的子项",
@@ -3611,7 +3643,9 @@
"Rewrite callback URLs to the local server": "将回调 URL 重写到本地服务器",
"Right to Left": "从右到左",
"Role": "角色",
+ "Role Matrix": "角色矩阵",
"Roleplay": "角色扮演",
+ "Roles & Permissions": "角色与权限",
"Root": "根",
"Rose Garden": "玫瑰花园",
"Route": "路由",
@@ -3746,6 +3780,7 @@
"Select a model to edit pricing": "选择一个模型编辑定价",
"Select a preset...": "选择一个预设...",
"Select a product": "选择产品",
+ "Select a provider to manage wallet and settlement settings.": "选择提供商以管理钱包和结算配置。",
"Select a role": "选择角色",
"Select a rule to edit.": "请选择一条规则进行编辑。",
"Select a store": "选择店铺",
@@ -3867,6 +3902,7 @@
"Settings": "设置",
"Settings & Preferences": "设置与偏好",
"Settings updated successfully": "设置更新成功",
+ "Settlement Configuration": "结算配置",
"Setup guide": "设置引导",
"Setup guide complete": "设置引导已完成",
"Setup guide is collapsed. Expand it anytime.": "设置引导已收起,可随时展开。",
@@ -3879,11 +3915,11 @@
"Shorten": "缩词",
"Show": "显示",
"Show All": "显示全部",
- "Show sensitive data": "显示敏感数据",
"Show all providers including unbound": "显示所有提供商(包括未绑定)",
"Show only bound providers": "仅显示已绑定的提供商",
"Show or hide flow columns": "显示或隐藏分流列",
"Show prices in currency instead of quota.": "以货币而非配额显示价格。",
+ "Show sensitive data": "显示敏感数据",
"Show setup guide": "显示设置引导",
"Show token usage statistics in the UI": "在用户界面中显示令牌使用统计信息",
"Showcase core capabilities with demo credentials and limited access.": "使用演示凭据和有限访问权限展示核心功能。",
@@ -4089,6 +4125,7 @@
"System setup wizard": "系统设置向导",
"System task records": "系统任务记录",
"System Version": "系统版本",
+ "System-only wallet data for phase one settlement tracking.": "用于第一阶段结算追踪的系统内钱包数据。",
"Table view": "表格视图",
"Tag": "标签",
"Tag Aggregate": "标签聚合",
@@ -4526,6 +4563,8 @@
"USD Exchange Rate": "美元汇率",
"USD price per 1M input tokens.": "每 100 万输入 token 的美元价格。",
"USD price per 1M tokens.": "每 100 万 token 的美元价格。",
+ "USDT conversion and commission settings are manually configured.": "USDT 折算和分润配置由人工维护。",
+ "USDT Rate": "USDT 汇率",
"Use +: to add a group, -: to remove a default selectable group, or no prefix to append a group.": "使用 +: 添加分组,使用 -: 移除默认可选分组,不加前缀则追加分组。",
"Use a compatible browser or device with biometric authentication or a security key to register a Passkey.": "请使用支持生物识别认证或安全密钥的兼容浏览器或设备来注册通行密钥。",
"Use a path to append it to the channel Base URL, or enter a full URL to override the Base URL for this route.": "填写以 / 开头的路径时会自动拼接渠道 Base URL;填写完整 URL 时,此路由会直接使用该 URL。",
@@ -4581,6 +4620,7 @@
"User Information": "用户信息",
"User Menu": "用户菜单",
"User personal functions": "用户个人功能",
+ "User Role Binding": "用户角色绑定",
"User selectable": "用户可选",
"User Subscription Management": "用户订阅管理",
"User updated successfully": "用户更新成功",
@@ -4692,6 +4732,7 @@
"Waiting": "等待中",
"Waiting for email...": "等待电子邮件...",
"Wallet": "钱包",
+ "Wallet Address": "钱包地址",
"Wallet First": "优先钱包",
"Wallet Management": "钱包管理",
"Wallet management and personal preferences.": "钱包管理和个人偏好设置。",
@@ -4762,6 +4803,7 @@
"Wire encoding for the embedding vectors": "向量传输的编码格式",
"with conflicts": "有冲突",
"with the API key from your token settings.": "替换为令牌设置中的 API Key。",
+ "Withdrawal Fee": "提现手续费",
"Without additional conditions, only the type above is used for pruning.": "未添加附加条件时,仅使用上方 type 进行清理。",
"Worker Access Key": "Worker 访问密钥",
"Worker Proxy": "Worker 代理",
diff --git a/web/default/src/lib/rbac.ts b/web/default/src/lib/rbac.ts
new file mode 100644
index 000000000000..5c40450bedf8
--- /dev/null
+++ b/web/default/src/lib/rbac.ts
@@ -0,0 +1,60 @@
+/*
+Copyright (C) 2023-2026 QuantumNous
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+
+For commercial licensing, please contact support@quantumnous.com
+*/
+import type { AuthUser } from '@/stores/auth-store'
+
+import { ROLE } from './roles'
+
+export const PERMISSION = {
+ RBAC_MANAGE: 'rbac.manage',
+ PROVIDER_MANAGE: 'provider.manage',
+ PROVIDER_SELF_MANAGE: 'provider.self.manage',
+ MARKETPLACE_MANAGE: 'marketplace.manage',
+ MARKETPLACE_SELF_MANAGE: 'marketplace.self.manage',
+ MARKETPLACE_VIEW: 'marketplace.view',
+ MARKETPLACE_KEY_MANAGE: 'marketplace.key.manage',
+ MARKETPLACE_SELF_KEY_MANAGE: 'marketplace.self.key.manage',
+ FINANCE_MANAGE: 'finance.manage',
+ FINANCE_VIEW: 'finance.view',
+ AUDIT_VIEW: 'audit.view',
+} as const
+
+export type PermissionCode = (typeof PERMISSION)[keyof typeof PERMISSION]
+
+export function getPermissionCodes(user?: AuthUser | null): string[] {
+ const raw = user?.permissions?.permission_codes
+ return Array.isArray(raw)
+ ? raw.filter((item): item is string => typeof item === 'string')
+ : []
+}
+
+export function hasPermission(
+ user: AuthUser | null | undefined,
+ permission: PermissionCode
+): boolean {
+ if (!user) return false
+ if (user.role >= ROLE.SUPER_ADMIN) return true
+ return getPermissionCodes(user).includes(permission)
+}
+
+export function hasAnyPermission(
+ user: AuthUser | null | undefined,
+ permissions: PermissionCode[]
+): boolean {
+ return permissions.some((permission) => hasPermission(user, permission))
+}
diff --git a/web/default/src/routeTree.gen.ts b/web/default/src/routeTree.gen.ts
index db8c8eaeb562..d01d22832209 100644
--- a/web/default/src/routeTree.gen.ts
+++ b/web/default/src/routeTree.gen.ts
@@ -42,10 +42,14 @@ import { Route as AuthenticatedUsageLogsIndexRouteImport } from './routes/_authe
import { Route as AuthenticatedSystemSettingsIndexRouteImport } from './routes/_authenticated/system-settings/index'
import { Route as AuthenticatedSubscriptionsIndexRouteImport } from './routes/_authenticated/subscriptions/index'
import { Route as AuthenticatedRedemptionCodesIndexRouteImport } from './routes/_authenticated/redemption-codes/index'
+import { Route as AuthenticatedRbacIndexRouteImport } from './routes/_authenticated/rbac/index'
+import { Route as AuthenticatedProviderConsoleIndexRouteImport } from './routes/_authenticated/provider-console/index'
import { Route as AuthenticatedProfileIndexRouteImport } from './routes/_authenticated/profile/index'
import { Route as AuthenticatedPlaygroundIndexRouteImport } from './routes/_authenticated/playground/index'
import { Route as AuthenticatedModelsIndexRouteImport } from './routes/_authenticated/models/index'
+import { Route as AuthenticatedMarketplaceIndexRouteImport } from './routes/_authenticated/marketplace/index'
import { Route as AuthenticatedKeysIndexRouteImport } from './routes/_authenticated/keys/index'
+import { Route as AuthenticatedFinanceIndexRouteImport } from './routes/_authenticated/finance/index'
import { Route as AuthenticatedDashboardIndexRouteImport } from './routes/_authenticated/dashboard/index'
import { Route as AuthenticatedChannelsIndexRouteImport } from './routes/_authenticated/channels/index'
import { Route as AuthenticatedUsageLogsSectionRouteImport } from './routes/_authenticated/usage-logs/$section'
@@ -238,6 +242,17 @@ const AuthenticatedRedemptionCodesIndexRoute =
path: '/redemption-codes/',
getParentRoute: () => AuthenticatedRouteRoute,
} as any)
+const AuthenticatedRbacIndexRoute = AuthenticatedRbacIndexRouteImport.update({
+ id: '/rbac/',
+ path: '/rbac/',
+ getParentRoute: () => AuthenticatedRouteRoute,
+} as any)
+const AuthenticatedProviderConsoleIndexRoute =
+ AuthenticatedProviderConsoleIndexRouteImport.update({
+ id: '/provider-console/',
+ path: '/provider-console/',
+ getParentRoute: () => AuthenticatedRouteRoute,
+ } as any)
const AuthenticatedProfileIndexRoute =
AuthenticatedProfileIndexRouteImport.update({
id: '/profile/',
@@ -256,11 +271,23 @@ const AuthenticatedModelsIndexRoute =
path: '/models/',
getParentRoute: () => AuthenticatedRouteRoute,
} as any)
+const AuthenticatedMarketplaceIndexRoute =
+ AuthenticatedMarketplaceIndexRouteImport.update({
+ id: '/marketplace/',
+ path: '/marketplace/',
+ getParentRoute: () => AuthenticatedRouteRoute,
+ } as any)
const AuthenticatedKeysIndexRoute = AuthenticatedKeysIndexRouteImport.update({
id: '/keys/',
path: '/keys/',
getParentRoute: () => AuthenticatedRouteRoute,
} as any)
+const AuthenticatedFinanceIndexRoute =
+ AuthenticatedFinanceIndexRouteImport.update({
+ id: '/finance/',
+ path: '/finance/',
+ getParentRoute: () => AuthenticatedRouteRoute,
+ } as any)
const AuthenticatedDashboardIndexRoute =
AuthenticatedDashboardIndexRouteImport.update({
id: '/dashboard/',
@@ -425,10 +452,14 @@ export interface FileRoutesByFullPath {
'/usage-logs/$section': typeof AuthenticatedUsageLogsSectionRoute
'/channels/': typeof AuthenticatedChannelsIndexRoute
'/dashboard/': typeof AuthenticatedDashboardIndexRoute
+ '/finance/': typeof AuthenticatedFinanceIndexRoute
'/keys/': typeof AuthenticatedKeysIndexRoute
+ '/marketplace/': typeof AuthenticatedMarketplaceIndexRoute
'/models/': typeof AuthenticatedModelsIndexRoute
'/playground/': typeof AuthenticatedPlaygroundIndexRoute
'/profile/': typeof AuthenticatedProfileIndexRoute
+ '/provider-console/': typeof AuthenticatedProviderConsoleIndexRoute
+ '/rbac/': typeof AuthenticatedRbacIndexRoute
'/redemption-codes/': typeof AuthenticatedRedemptionCodesIndexRoute
'/subscriptions/': typeof AuthenticatedSubscriptionsIndexRoute
'/system-settings/': typeof AuthenticatedSystemSettingsIndexRoute
@@ -483,10 +514,14 @@ export interface FileRoutesByTo {
'/usage-logs/$section': typeof AuthenticatedUsageLogsSectionRoute
'/channels': typeof AuthenticatedChannelsIndexRoute
'/dashboard': typeof AuthenticatedDashboardIndexRoute
+ '/finance': typeof AuthenticatedFinanceIndexRoute
'/keys': typeof AuthenticatedKeysIndexRoute
+ '/marketplace': typeof AuthenticatedMarketplaceIndexRoute
'/models': typeof AuthenticatedModelsIndexRoute
'/playground': typeof AuthenticatedPlaygroundIndexRoute
'/profile': typeof AuthenticatedProfileIndexRoute
+ '/provider-console': typeof AuthenticatedProviderConsoleIndexRoute
+ '/rbac': typeof AuthenticatedRbacIndexRoute
'/redemption-codes': typeof AuthenticatedRedemptionCodesIndexRoute
'/subscriptions': typeof AuthenticatedSubscriptionsIndexRoute
'/system-settings': typeof AuthenticatedSystemSettingsIndexRoute
@@ -545,10 +580,14 @@ export interface FileRoutesById {
'/_authenticated/usage-logs/$section': typeof AuthenticatedUsageLogsSectionRoute
'/_authenticated/channels/': typeof AuthenticatedChannelsIndexRoute
'/_authenticated/dashboard/': typeof AuthenticatedDashboardIndexRoute
+ '/_authenticated/finance/': typeof AuthenticatedFinanceIndexRoute
'/_authenticated/keys/': typeof AuthenticatedKeysIndexRoute
+ '/_authenticated/marketplace/': typeof AuthenticatedMarketplaceIndexRoute
'/_authenticated/models/': typeof AuthenticatedModelsIndexRoute
'/_authenticated/playground/': typeof AuthenticatedPlaygroundIndexRoute
'/_authenticated/profile/': typeof AuthenticatedProfileIndexRoute
+ '/_authenticated/provider-console/': typeof AuthenticatedProviderConsoleIndexRoute
+ '/_authenticated/rbac/': typeof AuthenticatedRbacIndexRoute
'/_authenticated/redemption-codes/': typeof AuthenticatedRedemptionCodesIndexRoute
'/_authenticated/subscriptions/': typeof AuthenticatedSubscriptionsIndexRoute
'/_authenticated/system-settings/': typeof AuthenticatedSystemSettingsIndexRoute
@@ -606,10 +645,14 @@ export interface FileRouteTypes {
| '/usage-logs/$section'
| '/channels/'
| '/dashboard/'
+ | '/finance/'
| '/keys/'
+ | '/marketplace/'
| '/models/'
| '/playground/'
| '/profile/'
+ | '/provider-console/'
+ | '/rbac/'
| '/redemption-codes/'
| '/subscriptions/'
| '/system-settings/'
@@ -664,10 +707,14 @@ export interface FileRouteTypes {
| '/usage-logs/$section'
| '/channels'
| '/dashboard'
+ | '/finance'
| '/keys'
+ | '/marketplace'
| '/models'
| '/playground'
| '/profile'
+ | '/provider-console'
+ | '/rbac'
| '/redemption-codes'
| '/subscriptions'
| '/system-settings'
@@ -725,10 +772,14 @@ export interface FileRouteTypes {
| '/_authenticated/usage-logs/$section'
| '/_authenticated/channels/'
| '/_authenticated/dashboard/'
+ | '/_authenticated/finance/'
| '/_authenticated/keys/'
+ | '/_authenticated/marketplace/'
| '/_authenticated/models/'
| '/_authenticated/playground/'
| '/_authenticated/profile/'
+ | '/_authenticated/provider-console/'
+ | '/_authenticated/rbac/'
| '/_authenticated/redemption-codes/'
| '/_authenticated/subscriptions/'
| '/_authenticated/system-settings/'
@@ -1006,6 +1057,20 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof AuthenticatedRedemptionCodesIndexRouteImport
parentRoute: typeof AuthenticatedRouteRoute
}
+ '/_authenticated/rbac/': {
+ id: '/_authenticated/rbac/'
+ path: '/rbac'
+ fullPath: '/rbac/'
+ preLoaderRoute: typeof AuthenticatedRbacIndexRouteImport
+ parentRoute: typeof AuthenticatedRouteRoute
+ }
+ '/_authenticated/provider-console/': {
+ id: '/_authenticated/provider-console/'
+ path: '/provider-console'
+ fullPath: '/provider-console/'
+ preLoaderRoute: typeof AuthenticatedProviderConsoleIndexRouteImport
+ parentRoute: typeof AuthenticatedRouteRoute
+ }
'/_authenticated/profile/': {
id: '/_authenticated/profile/'
path: '/profile'
@@ -1027,6 +1092,13 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof AuthenticatedModelsIndexRouteImport
parentRoute: typeof AuthenticatedRouteRoute
}
+ '/_authenticated/marketplace/': {
+ id: '/_authenticated/marketplace/'
+ path: '/marketplace'
+ fullPath: '/marketplace/'
+ preLoaderRoute: typeof AuthenticatedMarketplaceIndexRouteImport
+ parentRoute: typeof AuthenticatedRouteRoute
+ }
'/_authenticated/keys/': {
id: '/_authenticated/keys/'
path: '/keys'
@@ -1034,6 +1106,13 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof AuthenticatedKeysIndexRouteImport
parentRoute: typeof AuthenticatedRouteRoute
}
+ '/_authenticated/finance/': {
+ id: '/_authenticated/finance/'
+ path: '/finance'
+ fullPath: '/finance/'
+ preLoaderRoute: typeof AuthenticatedFinanceIndexRouteImport
+ parentRoute: typeof AuthenticatedRouteRoute
+ }
'/_authenticated/dashboard/': {
id: '/_authenticated/dashboard/'
path: '/dashboard'
@@ -1284,10 +1363,14 @@ interface AuthenticatedRouteRouteChildren {
AuthenticatedUsageLogsSectionRoute: typeof AuthenticatedUsageLogsSectionRoute
AuthenticatedChannelsIndexRoute: typeof AuthenticatedChannelsIndexRoute
AuthenticatedDashboardIndexRoute: typeof AuthenticatedDashboardIndexRoute
+ AuthenticatedFinanceIndexRoute: typeof AuthenticatedFinanceIndexRoute
AuthenticatedKeysIndexRoute: typeof AuthenticatedKeysIndexRoute
+ AuthenticatedMarketplaceIndexRoute: typeof AuthenticatedMarketplaceIndexRoute
AuthenticatedModelsIndexRoute: typeof AuthenticatedModelsIndexRoute
AuthenticatedPlaygroundIndexRoute: typeof AuthenticatedPlaygroundIndexRoute
AuthenticatedProfileIndexRoute: typeof AuthenticatedProfileIndexRoute
+ AuthenticatedProviderConsoleIndexRoute: typeof AuthenticatedProviderConsoleIndexRoute
+ AuthenticatedRbacIndexRoute: typeof AuthenticatedRbacIndexRoute
AuthenticatedRedemptionCodesIndexRoute: typeof AuthenticatedRedemptionCodesIndexRoute
AuthenticatedSubscriptionsIndexRoute: typeof AuthenticatedSubscriptionsIndexRoute
AuthenticatedUsageLogsIndexRoute: typeof AuthenticatedUsageLogsIndexRoute
@@ -1306,10 +1389,15 @@ const AuthenticatedRouteRouteChildren: AuthenticatedRouteRouteChildren = {
AuthenticatedUsageLogsSectionRoute: AuthenticatedUsageLogsSectionRoute,
AuthenticatedChannelsIndexRoute: AuthenticatedChannelsIndexRoute,
AuthenticatedDashboardIndexRoute: AuthenticatedDashboardIndexRoute,
+ AuthenticatedFinanceIndexRoute: AuthenticatedFinanceIndexRoute,
AuthenticatedKeysIndexRoute: AuthenticatedKeysIndexRoute,
+ AuthenticatedMarketplaceIndexRoute: AuthenticatedMarketplaceIndexRoute,
AuthenticatedModelsIndexRoute: AuthenticatedModelsIndexRoute,
AuthenticatedPlaygroundIndexRoute: AuthenticatedPlaygroundIndexRoute,
AuthenticatedProfileIndexRoute: AuthenticatedProfileIndexRoute,
+ AuthenticatedProviderConsoleIndexRoute:
+ AuthenticatedProviderConsoleIndexRoute,
+ AuthenticatedRbacIndexRoute: AuthenticatedRbacIndexRoute,
AuthenticatedRedemptionCodesIndexRoute:
AuthenticatedRedemptionCodesIndexRoute,
AuthenticatedSubscriptionsIndexRoute: AuthenticatedSubscriptionsIndexRoute,
diff --git a/web/default/src/routes/_authenticated/finance/index.tsx b/web/default/src/routes/_authenticated/finance/index.tsx
new file mode 100644
index 000000000000..7614a5f79b5b
--- /dev/null
+++ b/web/default/src/routes/_authenticated/finance/index.tsx
@@ -0,0 +1,38 @@
+/*
+Copyright (C) 2023-2026 QuantumNous
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+
+For commercial licensing, please contact support@quantumnous.com
+*/
+import { createFileRoute, redirect } from '@tanstack/react-router'
+
+import { SecondaryDevelopment } from '@/features/secondary-development'
+import { hasAnyPermission, PERMISSION } from '@/lib/rbac'
+import { useAuthStore } from '@/stores/auth-store'
+
+export const Route = createFileRoute('/_authenticated/finance/')({
+ beforeLoad: () => {
+ const { auth } = useAuthStore.getState()
+ if (
+ !hasAnyPermission(auth.user, [
+ PERMISSION.FINANCE_MANAGE,
+ PERMISSION.FINANCE_VIEW,
+ ])
+ ) {
+ throw redirect({ to: '/403' })
+ }
+ },
+ component: () => ,
+})
diff --git a/web/default/src/routes/_authenticated/marketplace/index.tsx b/web/default/src/routes/_authenticated/marketplace/index.tsx
new file mode 100644
index 000000000000..154c17b4e23c
--- /dev/null
+++ b/web/default/src/routes/_authenticated/marketplace/index.tsx
@@ -0,0 +1,33 @@
+/*
+Copyright (C) 2023-2026 QuantumNous
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+
+For commercial licensing, please contact support@quantumnous.com
+*/
+import { createFileRoute, redirect } from '@tanstack/react-router'
+
+import { SecondaryDevelopment } from '@/features/secondary-development'
+import { hasPermission, PERMISSION } from '@/lib/rbac'
+import { useAuthStore } from '@/stores/auth-store'
+
+export const Route = createFileRoute('/_authenticated/marketplace/')({
+ beforeLoad: () => {
+ const { auth } = useAuthStore.getState()
+ if (!hasPermission(auth.user, PERMISSION.MARKETPLACE_VIEW)) {
+ throw redirect({ to: '/403' })
+ }
+ },
+ component: () => ,
+})
diff --git a/web/default/src/routes/_authenticated/provider-console/index.tsx b/web/default/src/routes/_authenticated/provider-console/index.tsx
new file mode 100644
index 000000000000..3918140a5727
--- /dev/null
+++ b/web/default/src/routes/_authenticated/provider-console/index.tsx
@@ -0,0 +1,38 @@
+/*
+Copyright (C) 2023-2026 QuantumNous
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+
+For commercial licensing, please contact support@quantumnous.com
+*/
+import { createFileRoute, redirect } from '@tanstack/react-router'
+
+import { SecondaryDevelopment } from '@/features/secondary-development'
+import { hasAnyPermission, PERMISSION } from '@/lib/rbac'
+import { useAuthStore } from '@/stores/auth-store'
+
+export const Route = createFileRoute('/_authenticated/provider-console/')({
+ beforeLoad: () => {
+ const { auth } = useAuthStore.getState()
+ if (
+ !hasAnyPermission(auth.user, [
+ PERMISSION.PROVIDER_MANAGE,
+ PERMISSION.PROVIDER_SELF_MANAGE,
+ ])
+ ) {
+ throw redirect({ to: '/403' })
+ }
+ },
+ component: () => ,
+})
diff --git a/web/default/src/routes/_authenticated/rbac/index.tsx b/web/default/src/routes/_authenticated/rbac/index.tsx
new file mode 100644
index 000000000000..59fdf3012152
--- /dev/null
+++ b/web/default/src/routes/_authenticated/rbac/index.tsx
@@ -0,0 +1,33 @@
+/*
+Copyright (C) 2023-2026 QuantumNous
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+
+For commercial licensing, please contact support@quantumnous.com
+*/
+import { createFileRoute, redirect } from '@tanstack/react-router'
+
+import { SecondaryDevelopment } from '@/features/secondary-development'
+import { hasPermission, PERMISSION } from '@/lib/rbac'
+import { useAuthStore } from '@/stores/auth-store'
+
+export const Route = createFileRoute('/_authenticated/rbac/')({
+ beforeLoad: () => {
+ const { auth } = useAuthStore.getState()
+ if (!hasPermission(auth.user, PERMISSION.RBAC_MANAGE)) {
+ throw redirect({ to: '/403' })
+ }
+ },
+ component: () => ,
+})
diff --git a/web/default/src/routes/_authenticated/usage-logs/$section.tsx b/web/default/src/routes/_authenticated/usage-logs/$section.tsx
index 28a1a3b74843..289bd21b04be 100644
--- a/web/default/src/routes/_authenticated/usage-logs/$section.tsx
+++ b/web/default/src/routes/_authenticated/usage-logs/$section.tsx
@@ -1,3 +1,4 @@
+import { createFileRoute, redirect } from '@tanstack/react-router'
/*
Copyright (C) 2023-2026 QuantumNous
@@ -17,22 +18,21 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import z from 'zod'
-import { createFileRoute, redirect } from '@tanstack/react-router'
+
import { UsageLogs } from '@/features/usage-logs'
import {
isUsageLogsSectionId,
USAGE_LOGS_DEFAULT_SECTION,
} from '@/features/usage-logs/section-registry'
+import { hasPermission, PERMISSION } from '@/lib/rbac'
+import { useAuthStore } from '@/stores/auth-store'
const logTypeValues = ['0', '1', '2', '3', '4', '5', '6', '7'] as const
const logTypeSearchSchema = z
- .preprocess(
- (value) => {
- if (value == null || value === '') return undefined
- return Array.isArray(value) ? value : [value]
- },
- z.array(z.enum(logTypeValues)).optional()
- )
+ .preprocess((value) => {
+ if (value == null || value === '') return undefined
+ return Array.isArray(value) ? value : [value]
+ }, z.array(z.enum(logTypeValues)).optional())
.catch([])
const usageLogsSearchSchema = z.object({
@@ -59,6 +59,12 @@ export const Route = createFileRoute('/_authenticated/usage-logs/$section')({
params: { section: USAGE_LOGS_DEFAULT_SECTION },
})
}
+ if (params.section === 'audit') {
+ const { auth } = useAuthStore.getState()
+ if (!hasPermission(auth.user, PERMISSION.AUDIT_VIEW)) {
+ throw redirect({ to: '/403' })
+ }
+ }
// type 仅 common 使用,非 common 时清掉 URL 里的 type
const hasTypeSearch = Array.isArray(search?.type)
? search.type.length > 0
diff --git a/web/default/src/stores/auth-store.ts b/web/default/src/stores/auth-store.ts
index 95a14083f6de..6d7c263cb102 100644
--- a/web/default/src/stores/auth-store.ts
+++ b/web/default/src/stores/auth-store.ts
@@ -21,6 +21,8 @@ import { create } from 'zustand'
export type UserPermissions = {
sidebar_settings?: boolean
sidebar_modules?: Record
+ role_codes?: string[]
+ permission_codes?: string[]
}
export interface AuthUser {