diff --git a/data/schema.graphql b/data/schema.graphql index 7fa786903b..0c5fe5a88b 100644 --- a/data/schema.graphql +++ b/data/schema.graphql @@ -140,6 +140,23 @@ Added in 24.12.0. One of ['read_attribute', 'update_attribute', 'create_compute_ scalar AgentPermissionField @join__type(graph: GRAPHENE) +"""Added in 25.15.0""" +type AgentResource + @join__type(graph: STRAWBERRY) +{ + free: JSON! + used: JSON! + capacity: JSON! +} + +"""Added in 25.15.0""" +type AgentStats + @join__type(graph: STRAWBERRY) +{ + """Added in 25.15.0""" + totalResource: AgentResource! +} + """A schema for normal users.""" type AgentSummary implements Item @join__implements(graph: GRAPHENE, interface: "Item") @@ -295,6 +312,47 @@ type ArtifactRegistry type: ArtifactRegistryType! } +""" +Added in 25.15.0. + +Represents common metadata for an artifact registry. +All artifact registry nodes expose that information regardless of type. +""" +type ArtifactRegistryMeta implements Node + @join__implements(graph: STRAWBERRY, interface: "Node") + @join__type(graph: STRAWBERRY) +{ + """The Globally Unique ID of this object""" + id: ID! + name: String! + registryId: ID! + type: ArtifactRegistryType! + url: String! +} + +"""Added in 25.15.0""" +type ArtifactRegistryMetaConnection + @join__type(graph: STRAWBERRY) +{ + """Pagination data for this connection""" + pageInfo: PageInfo! + + """Contains the nodes in this connection""" + edges: [ArtifactRegistryMetaEdge!]! + count: Int! +} + +"""An edge in a connection.""" +type ArtifactRegistryMetaEdge + @join__type(graph: STRAWBERRY) +{ + """A cursor for use in pagination""" + cursor: String! + + """The item at the end of the edge""" + node: ArtifactRegistryMeta! +} + enum ArtifactRegistryType @join__type(graph: STRAWBERRY) { @@ -302,6 +360,13 @@ enum ArtifactRegistryType RESERVOIR @join__enumValue(graph: STRAWBERRY) } +enum ArtifactRemoteStatus + @join__type(graph: STRAWBERRY) +{ + SCANNED @join__enumValue(graph: STRAWBERRY) + AVAILABLE @join__enumValue(graph: STRAWBERRY) +} + """Added in 25.14.0""" type ArtifactRevision implements Node @join__implements(graph: STRAWBERRY, interface: "Node") @@ -310,6 +375,9 @@ type ArtifactRevision implements Node """The Globally Unique ID of this object""" id: ID! status: ArtifactStatus! + + """Added in 25.15.0""" + remoteStatus: ArtifactRemoteStatus version: String! readme: String size: ByteSize @@ -1401,6 +1469,9 @@ type CreateUser ok: Boolean msg: String user: User + + """Added in 25.15.0.""" + keypair: KeyPair } type CreateUserResourcePolicy @@ -1452,6 +1523,87 @@ type DealiasImage msg: String } +"""Added in 25.15.0""" +input DelegateeTarget + @join__type(graph: STRAWBERRY) +{ + delegateeReservoirId: ID! + targetRegistryId: ID! +} + +""" +Added in 25.15.0. + +Input type for delegated import of artifact revisions from a reservoir registry's remote registry. +Used to specify which artifact revisions should be imported from the remote registry source +into the local reservoir registry storage. +""" +input DelegateImportArtifactsInput + @join__type(graph: STRAWBERRY) +{ + """List of artifact revision IDs of delegatee artifact registry""" + artifactRevisionIds: [ID!]! +} + +""" +Added in 25.15.0. + +Response payload for delegated artifact import operation. +Contains the imported artifact revisions and associated background tasks. +The tasks can be monitored to track the progress of the import operation. +""" +type DelegateImportArtifactsPayload + @join__type(graph: STRAWBERRY) +{ + """ + Connection of artifact revisions that were imported from the reservoir registry's remote registry + """ + artifactRevisions: ArtifactRevisionConnection! + + """List of background tasks created for importing the artifact revisions""" + tasks: [ArtifactRevisionImportTask!]! +} + +""" +Added in 25.15.0. + +Input type for delegated scanning of artifacts from a delegatee reservoir registry's remote registry. +""" +input DelegateScanArtifactsInput + @join__type(graph: STRAWBERRY) +{ + """ID of the reservoir registry to delegate the scan request to""" + delegatorReservoirId: ID = null + + """Target delegatee reservoir registry and its remote registry to scan""" + delegateeTarget: DelegateeTarget = null + + """Maximum number of artifacts to scan (max: 500)""" + limit: Int! + + """Filter artifacts by type (e.g., model, image, package)""" + artifactType: ArtifactType = null + + """Search term to filter artifacts by name or description""" + search: String = null +} + +""" +Added in 25.15.0. + +Response payload for delegated artifact scanning operation. +Contains the list of artifacts discovered during the scan of a reservoir registry's remote registry. +These artifacts are now available for import or direct use. +""" +type DelegateScanArtifactsPayload + @join__type(graph: STRAWBERRY) +{ + """ + List of artifacts discovered during the delegated scan from the reservoir registry's remote registry + """ + artifacts: [Artifact!]! +} + """Added in 25.15.0""" input DeleteArtifactsInput @join__type(graph: STRAWBERRY) @@ -2429,6 +2581,13 @@ enum join__Graph { STRAWBERRY @join__graph(name: "strawberry", url: "http://host.docker.internal:8091/admin/gql/strawberry") } +""" +The `JSON` scalar type represents JSON values as specified by [ECMA-404](https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf). +""" +scalar JSON + @join__type(graph: STRAWBERRY) + @specifiedBy(url: "https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf") + """ Allows use of a JSON String for input / output from the GraphQL schema. @@ -3766,6 +3925,37 @@ type Mutation """Added in 25.14.0""" importArtifacts(input: ImportArtifactsInput!): ImportArtifactsPayload! @join__field(graph: STRAWBERRY) + """ + Added in 25.15.0. + + Triggers artifact scanning on a remote reservoir registry. + + This mutation instructs a reservoir-type registry to initiate a scan of artifacts + from its associated remote reservoir registry source. The scan process will discover and + catalog artifacts available in the remote reservoir, making them accessible + through the local reservoir registry. + + Requirements: + - The delegator registry must be of type 'reservoir' + - The delegator reservoir registry must have a valid remote registry configuration + """ + delegateScanArtifacts(input: DelegateScanArtifactsInput!): DelegateScanArtifactsPayload! @join__field(graph: STRAWBERRY) + + """ + Added in 25.15.0. + + Trigger import of artifact revisions from a remote reservoir registry. + + This mutation instructs a reservoir-type registry to import specific artifact revisions + that were previously discovered during a scan from its remote registry. + Note that this operation does not import the artifacts directly into the local registry, but only into the delegator reservoir's storage. + + Requirements: + - The delegator registry must be of type 'reservoir' + - The delegator registry must have a valid remote registry configuration + """ + delegateImportArtifacts(input: DelegateImportArtifactsInput!): DelegateImportArtifactsPayload! @join__field(graph: STRAWBERRY) + """Added in 25.14.0""" updateArtifact(input: UpdateArtifactInput!): UpdateArtifactPayload! @join__field(graph: STRAWBERRY) @@ -3794,11 +3984,19 @@ type Mutation """Added in 25.14.0""" deleteObjectStorage(input: DeleteObjectStorageInput!): DeleteObjectStoragePayload! @join__field(graph: STRAWBERRY) - """Added in 25.14.0""" - registerObjectStorageBucket(input: RegisterObjectStorageBucketInput!): RegisterObjectStorageBucketPayload! @join__field(graph: STRAWBERRY) + """ + Added in 25.15.0. + + Registers a new namespace within a storage. + """ + registerStorageNamespace(input: RegisterStorageNamespaceInput!): RegisterStorageNamespacePayload! @join__field(graph: STRAWBERRY) - """Added in 25.14.0""" - unregisterObjectStorageBucket(input: UnregisterObjectStorageBucketInput!): UnregisterObjectStorageBucketPayload! @join__field(graph: STRAWBERRY) + """ + Added in 25.15.0. + + Unregisters an existing namespace from a storage. + """ + unregisterStorageNamespace(input: UnregisterStorageNamespaceInput!): UnregisterStorageNamespacePayload! @join__field(graph: STRAWBERRY) """Added in 25.14.0""" createHuggingfaceRegistry(input: CreateHuggingFaceRegistryInput!): CreateHuggingFaceRegistryPayload! @join__field(graph: STRAWBERRY) @@ -3899,7 +4097,7 @@ type ObjectStorage implements Node secretKey: String! endpoint: String! region: String! - namespaces(before: String, after: String, first: Int, last: Int, limit: Int, offset: Int): ObjectStorageNamespaceConnection! + namespaces(before: String, after: String, first: Int, last: Int, limit: Int, offset: Int): StorageNamespaceConnection! } """Added in 25.14.0""" @@ -3925,40 +4123,6 @@ type ObjectStorageEdge node: ObjectStorage! } -"""Added in 25.14.0""" -type ObjectStorageNamespace implements Node - @join__implements(graph: STRAWBERRY, interface: "Node") - @join__type(graph: STRAWBERRY) -{ - """The Globally Unique ID of this object""" - id: ID! - storageId: ID! - bucket: String! -} - -"""Added in 25.14.0""" -type ObjectStorageNamespaceConnection - @join__type(graph: STRAWBERRY) -{ - """Pagination data for this connection""" - pageInfo: PageInfo! - - """Contains the nodes in this connection""" - edges: [ObjectStorageNamespaceEdge!]! - count: Int! -} - -"""An edge in a connection.""" -type ObjectStorageNamespaceEdge - @join__type(graph: STRAWBERRY) -{ - """A cursor for use in pagination""" - cursor: String! - - """The item at the end of the edge""" - node: ObjectStorageNamespace! -} - enum OrderDirection @join__type(graph: STRAWBERRY) { @@ -4572,6 +4736,9 @@ type Query """Added in 25.14.0""" defaultArtifactRegistry(artifactType: ArtifactType!): ArtifactRegistry @join__field(graph: STRAWBERRY) + + """Added in 25.15.0""" + agentStats: AgentStats! @join__field(graph: STRAWBERRY) } type QuotaDetails @@ -4605,16 +4772,24 @@ type RawServiceConfig extraCliParameters: String } -"""Added in 25.14.0""" -input RegisterObjectStorageBucketInput +""" +Added in 25.15.0. + +Input type for registering a storage namespace. +""" +input RegisterStorageNamespaceInput @join__type(graph: STRAWBERRY) { storageId: UUID! - bucketName: String! + namespace: String! } -"""Added in 25.14.0""" -type RegisterObjectStorageBucketPayload +""" +Added in 25.15.0. + +Payload returned after storage namespace registration. +""" +type RegisterStorageNamespacePayload @join__type(graph: STRAWBERRY) { id: UUID! @@ -4681,6 +4856,7 @@ type ReservoirRegistry implements Node accessKey: String! secretKey: String! apiVersion: String! + remoteArtifactRegistries: ArtifactRegistryMetaConnection! } """Added in 25.14.0""" @@ -5062,6 +5238,53 @@ type SourceInfo url: String } +""" +Added in 25.15.0. + +Storage namespace provides logical separation of data within a single storage system +to organize and isolate domain-specific concerns. + +Implementation varies by storage type: +- Object Storage (S3, MinIO): Uses bucket-based namespace separation +- File System (VFS): Uses directory path prefix for namespace distinction +""" +type StorageNamespace implements Node + @join__implements(graph: STRAWBERRY, interface: "Node") + @join__type(graph: STRAWBERRY) +{ + """The Globally Unique ID of this object""" + id: ID! + storageId: ID! + namespace: String! +} + +""" +Added in 25.15.0. + +Storage namespace connection for pagination. +""" +type StorageNamespaceConnection + @join__type(graph: STRAWBERRY) +{ + """Pagination data for this connection""" + pageInfo: PageInfo! + + """Contains the nodes in this connection""" + edges: [StorageNamespaceEdge!]! + count: Int! +} + +"""An edge in a connection.""" +type StorageNamespaceEdge + @join__type(graph: STRAWBERRY) +{ + """A cursor for use in pagination""" + cursor: String! + + """The item at the end of the edge""" + node: StorageNamespace! +} + type StorageVolume implements Item @join__implements(graph: GRAPHENE, interface: "Item") @join__type(graph: GRAPHENE) @@ -5135,16 +5358,24 @@ type UnloadImage task_id: String } -"""Added in 25.14.0""" -input UnregisterObjectStorageBucketInput +""" +Added in 25.15.0. + +Input type for unregistering a storage namespace. +""" +input UnregisterStorageNamespaceInput @join__type(graph: STRAWBERRY) { storageId: UUID! - bucketName: String! + namespace: String! } -"""Added in 25.14.0""" -type UnregisterObjectStorageBucketPayload +""" +Added in 25.15.0. + +Payload returned after storage namespace unregistration. +""" +type UnregisterStorageNamespacePayload @join__type(graph: STRAWBERRY) { id: UUID! diff --git a/packages/backend.ai-ui/src/components/ResourceStatistics.tsx b/packages/backend.ai-ui/src/components/ResourceStatistics.tsx index 51fabc3bd3..b1a801d534 100644 --- a/packages/backend.ai-ui/src/components/ResourceStatistics.tsx +++ b/packages/backend.ai-ui/src/components/ResourceStatistics.tsx @@ -8,26 +8,26 @@ import { useTranslation } from 'react-i18next'; interface ResourceData { cpu: { - using: { current: number; total?: number }; - remaining: { current: number; total?: number }; + used: { current: number; total?: number }; + free: { current: number; total?: number }; metadata: { title: string; displayUnit: string }; } | null; memory: { - using: { current: number; total?: number }; - remaining: { current: number; total?: number }; + used: { current: number; total?: number }; + free: { current: number; total?: number }; metadata: { title: string; displayUnit: string }; } | null; accelerators: Array<{ key: string; - using: { current: number; total?: number }; - remaining: { current: number; total?: number }; + used: { current: number; total?: number }; + free: { current: number; total?: number }; metadata: { title: string; displayUnit: string }; }>; } interface ResourceStatisticsProps { resourceData: ResourceData; - displayType: 'using' | 'remaining'; + displayType: 'used' | 'free'; showProgress?: boolean; precision?: number; progressSteps?: number; diff --git a/packages/backend.ai-ui/src/components/fragments/BAIBucketSelect.tsx b/packages/backend.ai-ui/src/components/fragments/BAIBucketSelect.tsx index 79e217d27f..e5066e1dda 100644 --- a/packages/backend.ai-ui/src/components/fragments/BAIBucketSelect.tsx +++ b/packages/backend.ai-ui/src/components/fragments/BAIBucketSelect.tsx @@ -66,7 +66,7 @@ const BAIBucketSelect = ({ edges { node { id - bucket + namespace } } } @@ -95,7 +95,7 @@ const BAIBucketSelect = ({ ); const selectedOptions = _.map(paginationData, (item) => ({ - label: item.node.bucket, + label: item.node.namespace, value: item.node.id, })); diff --git a/react/src/App.tsx b/react/src/App.tsx index e58ca37404..9a6178d3fa 100644 --- a/react/src/App.tsx +++ b/react/src/App.tsx @@ -10,7 +10,6 @@ import MainLayout from './components/MainLayout/MainLayout'; import WebUINavigate from './components/WebUINavigate'; import { useSuspendedBackendaiClient } from './hooks'; import { useBAISettingUserState } from './hooks/useBAISetting'; -import AdminDashboardPage from './pages/AdminDashboardPage'; // High priority to import the component import ComputeSessionListPage from './pages/ComputeSessionListPage'; import ModelStoreListPage from './pages/ModelStoreListPage'; @@ -35,6 +34,9 @@ const EndpointDetailPage = React.lazy( ); const StartPage = React.lazy(() => import('./pages/StartPage')); const DashboardPage = React.lazy(() => import('./pages/DashboardPage')); +const AdminDashboardPage = React.lazy( + () => import('./pages/AdminDashboardPage'), +); const EnvironmentPage = React.lazy(() => import('./pages/EnvironmentPage')); const MyEnvironmentPage = React.lazy(() => import('./pages/MyEnvironmentPage')); const StorageHostSettingPage = React.lazy( diff --git a/react/src/components/AgentStats.tsx b/react/src/components/AgentStats.tsx new file mode 100644 index 0000000000..329c405372 --- /dev/null +++ b/react/src/components/AgentStats.tsx @@ -0,0 +1,225 @@ +import { useResourceSlotsDetails } from '../hooks/backendai'; +import BAIFetchKeyButton from './BAIFetchKeyButton'; +import { useControllableValue } from 'ahooks'; +import { Segmented, Skeleton, theme, Typography } from 'antd'; +import { + BAIFlex, + BAIBoardItemTitle, + ResourceStatistics, + convertToNumber, + processMemoryValue, + BAIFlexProps, +} from 'backend.ai-ui'; +import _ from 'lodash'; +import { useTransition, ReactNode } from 'react'; +import { useTranslation } from 'react-i18next'; +import { graphql, useRefetchableFragment } from 'react-relay'; +import { AgentStatsFragment$key } from 'src/__generated__/AgentStatsFragment.graphql'; + +interface AgentStatsProps extends BAIFlexProps { + queryRef: AgentStatsFragment$key; + isRefetching?: boolean; + displayType?: 'used' | 'free'; + onDisplayTypeChange?: (type: 'used' | 'free') => void; + extra?: ReactNode; +} + +const AgentStats: React.FC = ({ + queryRef, + isRefetching, + extra, + ...props +}) => { + const { t } = useTranslation(); + const { token } = theme.useToken(); + + const [isPendingRefetch, startRefetchTransition] = useTransition(); + + const [displayType, setDisplayType] = useControllableValue< + Exclude + >(props, { + defaultValue: 'used', + trigger: 'onDisplayTypeChange', + defaultValuePropName: 'defaultDisplayType', + }); + + const [data, refetch] = useRefetchableFragment( + graphql` + fragment AgentStatsFragment on Query + @refetchable(queryName: "AgentStatsRefetchQuery") { + agentStats @since(version: "25.15.0") { + totalResource { + free + used + capacity + } + } + } + `, + queryRef, + ); + + const resourceSlotsDetails = useResourceSlotsDetails(); + + const agentStatsData = (() => { + const totalResource = data.agentStats.totalResource; + if (!totalResource) { + return { cpu: null, memory: null, accelerators: [] }; + } + + const free = totalResource.free as Record; + const used = totalResource.used as Record; + const capacity = totalResource.capacity as Record; + + const cpuSlot = resourceSlotsDetails?.resourceSlotsInRG?.['cpu']; + const memSlot = resourceSlotsDetails?.resourceSlotsInRG?.['mem']; + + const cpuData = cpuSlot + ? { + used: { + current: convertToNumber(used['cpu'] || 0), + total: convertToNumber(capacity['cpu'] || 0), + }, + free: { + current: convertToNumber(free['cpu'] || 0), + total: convertToNumber(capacity['cpu'] || 0), + }, + metadata: { + title: cpuSlot.human_readable_name, + displayUnit: cpuSlot.display_unit, + }, + } + : null; + + const memoryData = memSlot + ? { + used: { + current: processMemoryValue(used['mem'] || 0, memSlot.display_unit), + total: processMemoryValue( + capacity['mem'] || 0, + memSlot.display_unit, + ), + }, + free: { + current: processMemoryValue(free['mem'] || 0, memSlot.display_unit), + total: processMemoryValue( + capacity['mem'] || 0, + memSlot.display_unit, + ), + }, + metadata: { + title: memSlot.human_readable_name, + displayUnit: memSlot.display_unit, + }, + } + : null; + + const accelerators = _.chain(resourceSlotsDetails?.resourceSlotsInRG) + .omit(['cpu', 'mem']) + .map((resourceSlot, key) => { + if (!resourceSlot) return null; + + const freeValue = free[key] || 0; + const usedValue = used[key] || 0; + const capacityValue = capacity[key] || 0; + + return { + key, + used: { + current: convertToNumber(usedValue), + total: convertToNumber(capacityValue), + }, + free: { + current: convertToNumber(freeValue), + total: convertToNumber(capacityValue), + }, + metadata: { + title: resourceSlot.human_readable_name, + displayUnit: resourceSlot.display_unit, + }, + }; + }) + .compact() + .filter((item) => !!(item.used.current || item.used.total)) + .value(); + + return { cpu: cpuData, memory: memoryData, accelerators }; + })(); + + return ( + + + {t('agentStats.AgentStats')} + + } + tooltip={t('agentStats.AgentStatsDescription')} + extra={ + + > + size="small" + options={[ + { + label: t('dashboard.Used'), + value: 'used', + }, + { + value: 'free', + label: t('dashboard.Free'), + }, + ]} + value={displayType} + onChange={(v) => setDisplayType(v)} + /> + { + startRefetchTransition(() => { + refetch( + {}, + { + fetchPolicy: 'network-only', + }, + ); + }); + }} + type="text" + style={{ + backgroundColor: 'transparent', + }} + /> + {extra} + + } + /> + {resourceSlotsDetails.isLoading ? ( + + ) : ( + + )} + + ); +}; + +export default AgentStats; diff --git a/react/src/components/ConfigurableResourceCard.tsx b/react/src/components/ConfigurableResourceCard.tsx index 2510fd7e0c..e0e8bd930f 100644 --- a/react/src/components/ConfigurableResourceCard.tsx +++ b/react/src/components/ConfigurableResourceCard.tsx @@ -138,7 +138,7 @@ const ConfigurableResourceCard: React.FC = ({ titleStyle: { paddingLeft: 0, }, - ..._.omit(props, ['style']), + ..._.omit(props, ['style', 'title']), }; switch (currentPanelType) { diff --git a/react/src/components/MainLayout/WebUISider.tsx b/react/src/components/MainLayout/WebUISider.tsx index 1da6afc60c..2fd5d338aa 100644 --- a/react/src/components/MainLayout/WebUISider.tsx +++ b/react/src/components/MainLayout/WebUISider.tsx @@ -106,6 +106,7 @@ export type MenuKeys = | 'resource-policy' | 'reservoir' // superAdminMenu keys + | 'admin-dashboard' | 'agent' | 'settings' | 'maintenance' @@ -307,7 +308,7 @@ const WebUISider: React.FC = (props) => { }, ]); - const superAdminMenu: MenuProps['items'] = [ + const superAdminMenu: MenuProps['items'] = filterOutEmpty([ { label: {t('webui.menu.Resources')}, icon: , @@ -334,7 +335,7 @@ const WebUISider: React.FC = (props) => { icon: , key: 'information', }, - ]; + ]); const pluginMap: Record = { 'menuitem-user': generalMenu, diff --git a/react/src/components/MyResource.tsx b/react/src/components/MyResource.tsx index b4cedadb39..cb9e063ff9 100644 --- a/react/src/components/MyResource.tsx +++ b/react/src/components/MyResource.tsx @@ -2,25 +2,23 @@ import { ResourceSlotName, useResourceSlotsDetails } from '../hooks/backendai'; import { useCurrentProjectValue } from '../hooks/useCurrentProject'; import { useResourceLimitAndRemaining } from '../hooks/useResourceLimitAndRemaining'; import BAIFetchKeyButton from './BAIFetchKeyButton'; -import { useControllableValue } from 'ahooks'; import { Segmented, theme } from 'antd'; import { BAIBoardItemTitle, BAIFlex, + BAIFlexProps, ResourceStatistics, convertToNumber, processMemoryValue, } from 'backend.ai-ui'; import _ from 'lodash'; -import { ReactNode, useMemo, useTransition } from 'react'; +import { ReactNode, useTransition } from 'react'; import { Trans, useTranslation } from 'react-i18next'; import { useFetchKey } from 'src/hooks'; -interface MyResourceProps { +interface MyResourceProps extends BAIFlexProps { fetchKey?: string; refetching?: boolean; - displayType?: 'using' | 'remaining'; - onDisplayTypeChange?: (type: 'using' | 'remaining') => void; extra?: ReactNode; } @@ -49,15 +47,8 @@ const MyResource: React.FC = ({ }); const resourceSlotsDetails = useResourceSlotsDetails(); - const [displayType, setDisplayType] = useControllableValue< - Exclude - >(props, { - defaultValue: 'using', - trigger: 'onDisplayTypeChange', - defaultValuePropName: 'defaultDisplayType', - }); - const resourceData = useMemo(() => { + const resourceData = (() => { const cpuSlot = resourceSlotsDetails?.resourceSlotsInRG?.['cpu']; const memSlot = resourceSlotsDetails?.resourceSlotsInRG?.['mem']; @@ -65,11 +56,11 @@ const MyResource: React.FC = ({ const cpuData = cpuSlot ? { - using: { + used: { current: convertToNumber(checkPresetInfo?.keypair_using.cpu), total: convertToNumber(resourceLimitsWithoutResourceGroup.cpu?.max), }, - remaining: { + free: { current: convertToNumber(remainingWithoutResourceGroup.cpu), total: convertToNumber(resourceLimitsWithoutResourceGroup.cpu?.max), }, @@ -82,7 +73,7 @@ const MyResource: React.FC = ({ const memoryData = memSlot ? { - using: { + used: { current: processMemoryValue( checkPresetInfo?.keypair_using.mem, memSlot.display_unit, @@ -92,7 +83,7 @@ const MyResource: React.FC = ({ memSlot.display_unit, ), }, - remaining: { + free: { current: processMemoryValue( remainingWithoutResourceGroup.mem, memSlot.display_unit, @@ -116,7 +107,7 @@ const MyResource: React.FC = ({ return { key, - using: { + used: { current: convertToNumber( checkPresetInfo?.keypair_using[key as ResourceSlotName], ), @@ -124,7 +115,7 @@ const MyResource: React.FC = ({ resourceLimitsWithoutResourceGroup.accelerators[key]?.max, ), }, - remaining: { + free: { current: convertToNumber( remainingWithoutResourceGroup.accelerators[key], ), @@ -142,12 +133,7 @@ const MyResource: React.FC = ({ .value(); return { cpu: cpuData, memory: memoryData, accelerators }; - }, [ - checkPresetInfo, - remainingWithoutResourceGroup, - resourceLimitsWithoutResourceGroup, - resourceSlotsDetails, - ]); + })(); return ( = ({ style={{ paddingInline: token.paddingXL, paddingBottom: token.padding, + ...props.style, }} + {..._.omit(props, ['style'])} > } extra={ - > + setDisplayType(v)} + value={'used'} /> = ({ diff --git a/react/src/components/MyResourceWithinResourceGroup.tsx b/react/src/components/MyResourceWithinResourceGroup.tsx index f8b82f3a61..b1397895c9 100644 --- a/react/src/components/MyResourceWithinResourceGroup.tsx +++ b/react/src/components/MyResourceWithinResourceGroup.tsx @@ -14,17 +14,18 @@ import { ResourceStatistics, convertToNumber, processMemoryValue, + BAIFlexProps, } from 'backend.ai-ui'; import _ from 'lodash'; import { ReactNode, useDeferredValue, useMemo, useTransition } from 'react'; import { useTranslation } from 'react-i18next'; import { useFetchKey } from 'src/hooks'; -interface MyResourceWithinResourceGroupProps { +interface MyResourceWithinResourceGroupProps extends BAIFlexProps { fetchKey?: string; refetching?: boolean; - displayType?: 'using' | 'remaining'; - onDisplayTypeChange?: (type: 'using' | 'remaining') => void; + displayType?: 'used' | 'free'; + onDisplayTypeChange?: (type: 'used' | 'free') => void; extra?: ReactNode; } @@ -54,7 +55,7 @@ const MyResourceWithinResourceGroup: React.FC< const [displayType, setDisplayType] = useControllableValue< Exclude >(props, { - defaultValue: 'remaining', + defaultValue: 'free', trigger: 'onDisplayTypeChange', defaultValuePropName: 'defaultDisplayType', }); @@ -69,14 +70,14 @@ const MyResourceWithinResourceGroup: React.FC< ?.cpu, ) ? { - using: { + used: { current: convertToNumber( checkPresetInfo?.scaling_groups?.[deferredCurrentResourceGroup] ?.using?.cpu, ), total: undefined, // No total for resource group view }, - remaining: { + free: { current: convertToNumber( checkPresetInfo?.scaling_groups?.[deferredCurrentResourceGroup] ?.remaining?.cpu, @@ -97,7 +98,7 @@ const MyResourceWithinResourceGroup: React.FC< ?.mem, ) ? { - using: { + used: { current: processMemoryValue( checkPresetInfo?.scaling_groups?.[deferredCurrentResourceGroup] ?.using?.mem, @@ -105,7 +106,7 @@ const MyResourceWithinResourceGroup: React.FC< ), total: undefined, }, - remaining: { + free: { current: processMemoryValue( checkPresetInfo?.scaling_groups?.[deferredCurrentResourceGroup] ?.remaining?.mem, @@ -151,11 +152,11 @@ const MyResourceWithinResourceGroup: React.FC< return { key, - using: { + used: { current: usingCurrent, total: undefined, }, - remaining: { + free: { current: remainingCurrent, total: undefined, }, @@ -178,7 +179,9 @@ const MyResourceWithinResourceGroup: React.FC< style={{ paddingInline: token.paddingXL, paddingBottom: token.padding, + ...props.style, }} + {..._.omit(props, ['style'])} > = ({ queryRef, isRefetching, title, + ...props }) => { const { t } = useTranslation(); const { token } = theme.useToken(); @@ -80,7 +83,9 @@ const SessionCountDashboardItem: React.FC = ({ paddingLeft: token.paddingXL, paddingRight: token.paddingXL, height: '100%', + ...props.style, }} + {..._.omit(props, ['style'])} > {/* Fixed Title Section */} void; + displayType?: 'used' | 'free'; + onDisplayTypeChange?: (type: 'used' | 'free') => void; extra?: ReactNode; } @@ -66,7 +67,7 @@ const TotalResourceWithinResourceGroup: React.FC< @argumentDefinitions( resourceGroup: { type: "String" } isSuperAdmin: { type: "Boolean!" } - agentNodeFilter: { type: "String" } + agentNodeFilter: { type: "String!" } ) @refetchable( queryName: "TotalResourceWithinResourceGroupFragmentRefetchQuery" @@ -88,8 +89,8 @@ const TotalResourceWithinResourceGroup: React.FC< total_count } agent_nodes(filter: $agentNodeFilter) - @include(if: $isSuperAdmin) - @since(version: "24.12.0") { + @since(version: "24.12.0") + @include(if: $isSuperAdmin) { edges { node { id @@ -110,7 +111,7 @@ const TotalResourceWithinResourceGroup: React.FC< const [displayType, setDisplayType] = useControllableValue< Exclude >(props, { - defaultValue: 'remaining', + defaultValue: 'free', trigger: 'onDisplayTypeChange', defaultValuePropName: 'defaultDisplayType', }); @@ -171,11 +172,11 @@ const TotalResourceWithinResourceGroup: React.FC< const cpuData = cpuSlot ? { - using: { + used: { current: convertToNumber(totalOccupiedSlots['cpu'] || 0), total: convertToNumber(totalAvailableSlots['cpu'] || 0), }, - remaining: { + free: { current: convertToNumber( subNumberWithUnits( _.toString(totalAvailableSlots['cpu'] || 0), @@ -194,7 +195,7 @@ const TotalResourceWithinResourceGroup: React.FC< const memoryData = memSlot ? { - using: { + used: { current: processMemoryValue( totalOccupiedSlots['mem'] || 0, memSlot.display_unit, @@ -204,7 +205,7 @@ const TotalResourceWithinResourceGroup: React.FC< memSlot.display_unit, ), }, - remaining: { + free: { current: processMemoryValue( subNumberWithUnits( _.toString(totalAvailableSlots['mem'] || 0), @@ -244,11 +245,11 @@ const TotalResourceWithinResourceGroup: React.FC< return { key, - using: { + used: { current: processAcceleratorValue(occupied), total: processAcceleratorValue(available), }, - remaining: { + free: { current: processAcceleratorValue(remaining), total: processAcceleratorValue(available), }, @@ -259,7 +260,7 @@ const TotalResourceWithinResourceGroup: React.FC< }; }) .compact() - .filter((item) => !!(item.using.current || item.using.total)) + .filter((item) => !!(item.used.current || item.used.total)) .value(); return { cpu: cpuData, memory: memoryData, accelerators }; @@ -272,7 +273,9 @@ const TotalResourceWithinResourceGroup: React.FC< style={{ paddingInline: token.paddingXL, paddingBottom: token.padding, + ...props.style, }} + {..._.omit(props, ['style'])} > { @@ -28,6 +33,7 @@ const AdminDashboardPage: React.FC = () => { const currentProject = useCurrentProjectValue(); const currentResourceGroup = useCurrentResourceGroupValue(); const userRole = useCurrentUserRole(); + const baiClient = useSuspendedBackendaiClient(); const [fetchKey, updateFetchKey] = useFetchKey(); const [isPendingIntervalRefetch, startIntervalRefetchTransition] = @@ -39,12 +45,15 @@ const AdminDashboardPage: React.FC = () => { const isAvailableTotalResourcePanel = useIsAvailableTotalResourceWithinResourceGroup(); + const isAgentStatsSupported = baiClient.supports('agent-stats'); + const queryRef = useLazyLoadQuery( graphql` query AdminDashboardPageQuery( $scopeId: ScopeField $resourceGroup: String $skipTotalResourceWithinResourceGroup: Boolean! + $skipAgentStats: Boolean! $isSuperAdmin: Boolean! $agentNodeFilter: String! ) { @@ -58,12 +67,14 @@ const AdminDashboardPage: React.FC = () => { isSuperAdmin: $isSuperAdmin agentNodeFilter: $agentNodeFilter ) + ...AgentStatsFragment @skip(if: $skipAgentStats) @alias } `, { scopeId: `project:${currentProject.id}`, resourceGroup: currentResourceGroup || 'default', skipTotalResourceWithinResourceGroup: !isAvailableTotalResourcePanel, + skipAgentStats: !isAgentStatsSupported, isSuperAdmin: _.isEqual(userRole, 'superadmin'), agentNodeFilter: `schedulable == true & status == "ALIVE" & scaling_group == "${currentResourceGroup}"`, }, @@ -122,6 +133,33 @@ const AdminDashboardPage: React.FC = () => { ), }, }, + isAgentStatsSupported && + queryRef.AgentStatsFragment && { + id: 'agentStats', + rowSpan: 2, + columnSpan: 2, + definition: { + minRowSpan: 2, + minColumnSpan: 2, + }, + data: { + content: ( + + } + > + + + ), + }, + }, { id: 'activeAgents', rowSpan: 4, diff --git a/resources/i18n/de.json b/resources/i18n/de.json index 40128dfd7e..b13a52b22d 100644 --- a/resources/i18n/de.json +++ b/resources/i18n/de.json @@ -31,6 +31,10 @@ "Terminated": "Beendet", "Utilization": "Inanspruchnahme" }, + "agentStats": { + "AgentStats": "Agentenstatistik", + "AgentStatsDescription": "In diesem Bereich werden alle verwendeten Ressourcen aller Agenten im System angezeigt. \nDie Werte stellen die insgesamt genutzten Ressourcen aller aktiven Sitzungen dar." + }, "autoScalingRule": { "AddAutoScalingRule": "Automatische Skalierungsregel hinzufügen", "Comparator": "Vergleicher", @@ -218,6 +222,10 @@ "WarningLessRateLimit": "Wenn der Wert für das Ratenlimit klein ist, können API-Vorgänge wie die Anmeldung blockiert werden.", "YouAreAboutToDeleteCredential": "Sie sind dabei, die Anmeldeinformationen dieses Benutzers zu löschen:" }, + "dashboard": { + "Free": "Frei", + "Used": "Gebraucht" + }, "data": { "Active": "Aktiv", "Add": "hinzufügen", @@ -1170,11 +1178,6 @@ "TypeResourceGroupNameToDelete": "Geben Sie den Namen der zu löschenden Ressourcengruppe ein", "WsproxyAddress": "WSProxy-Server-Adresse" }, - "resourcePanel": { - "Limit": "Limit", - "RemainingNumber": "RMINING", - "UsingNumber": "Verwendung" - }, "resourcePolicy": { "AboutToDeleteResourcePolicy": "Sie sind im Begriff, diese Ressourcenrichtlinie zu löschen:", "AllowedHosts": "Zulässige Gastgeber", @@ -2050,10 +2053,10 @@ "MyAccountInformation": "Benutzerinformationen ändern", "MyEnvironments": "Meine Umgebungen", "MyResources": "Meine Gesamtressourcengrenze", - "MyResourcesDescription": "

Dieses Panel zeigt Ihre gesamte Ressourcennutzung und Limits über alle Projekte und Ressourcengruppen hinweg.

Wenn mehrere Limits angewendet werden (wie Domain, Projekt oder Keypair), wird das restriktivste Limit für die Berechnung verwendet.

", + "MyResourcesDescription": "

In diesem Bereich werden die gesamten derzeit genutzten und freien Ressourcen aller Projekte und Ressourcengruppen angezeigt.

Wenn mehrere Grenzwerte angewendet werden (z. B. Domäne, Projekt oder Schlüsselpaar), verwendet die Berechnung den restriktivsten Grenzwert für freie Ressourcen.

", "MyResourcesIn": "Meine Ressourcen in", "MyResourcesInResourceGroup": "Meine Ressourcen in der Ressourcengruppe", - "MyResourcesInResourceGroupDescription": "Dieses Panel zeigt Ihre aktuelle Ressourcenverwendung und verbleibt in der ausgewählten Ressourcengruppe.", + "MyResourcesInResourceGroupDescription": "In diesem Bereich wird angezeigt, wie viel Ressource Sie verbraucht haben und wie viel in der ausgewählten Ressourcengruppe Ihres aktuellen Projekts noch frei ist.", "NewPassword": "Neues Kennwort", "NewPasswordAgain": "Neues Passwort nochmal)", "NewPasswordCannotBeSame": "Bitte geben Sie ein Passwort ein, das sich von Ihrem aktuellen Passwort unterscheidet.", @@ -2086,7 +2089,7 @@ "TermsOfService": "Nutzungsbedingungen", "TotalResourcesIn": "Gesamtressourcen in", "TotalResourcesInResourceGroup": "Gesamtressourcen in der Ressourcengruppe", - "TotalResourcesInResourceGroupDescription": "Dieses Panel zeigt die verwendeten und verbleibenden Ressourcen. \nDie Werte werden berechnet, indem die Verwendung und die verbleibenden Mengen aller Agenten mithilfe der ausgewählten Ressourcengruppe addiert werden.", + "TotalResourcesInResourceGroupDescription": "In diesem Bereich werden die insgesamt genutzten und freien Ressourcen in der ausgewählten Ressourcengruppe angezeigt. \nDie Werte werden berechnet, indem die verwendeten und freien Mengen aller Agenten, die diese Gruppe verwenden, summiert werden.", "TotpActivated": "2FA Aktiviert", "Update": "Aktualisieren", "Usage": "Verwendung", diff --git a/resources/i18n/el.json b/resources/i18n/el.json index 922d914f02..d70428814f 100644 --- a/resources/i18n/el.json +++ b/resources/i18n/el.json @@ -31,6 +31,10 @@ "Terminated": "Τερματίστηκε", "Utilization": "Χρήση" }, + "agentStats": { + "AgentStats": "Στατιστικά Agent", + "AgentStatsDescription": "Αυτός ο πίνακας εμφανίζει όλους τους πόρους που χρησιμοποιούνται σε όλους τους πράκτορες του συστήματος. \nΟι τιμές αντιπροσωπεύουν το σύνολο των πόρων που χρησιμοποιήθηκαν από όλες τις ενεργές περιόδους σύνδεσης." + }, "autoScalingRule": { "AddAutoScalingRule": "Προσθέστε κανόνα αυτόματης κλιμάκωσης", "Comparator": "Συγκριτής", @@ -218,6 +222,10 @@ "WarningLessRateLimit": "Εάν η τιμή Όριο ρυθμού είναι μικρή, ενδέχεται να μπλοκαριστούν λειτουργίες API, όπως η σύνδεση.", "YouAreAboutToDeleteCredential": "Πρόκειται να διαγράψετε τα διαπιστευτήρια αυτού του χρήστη:" }, + "dashboard": { + "Free": "Δωρεάν", + "Used": "Μεταχειρισμένος" + }, "data": { "Active": "Ενεργός", "Add": "Προσθέστε", @@ -1167,11 +1175,6 @@ "TypeResourceGroupNameToDelete": "Πληκτρολογήστε όνομα ομάδας πόρων για διαγραφή", "WsproxyAddress": "Διεύθυνση διακομιστή WSProxy" }, - "resourcePanel": { - "Limit": "Οριο", - "RemainingNumber": "Ριψοκίνδυνος", - "UsingNumber": "Χρήση" - }, "resourcePolicy": { "AboutToDeleteResourcePolicy": "Πρόκειται να διαγράψετε αυτήν την πολιτική πόρων:", "AllowedHosts": "Επιτρεπόμενοι οικοδεσπότες", @@ -2047,10 +2050,10 @@ "MyAccountInformation": "Αλλαγή πληροφοριών χρήστη", "MyEnvironments": "Τα περιβάλλοντα μου", "MyResources": "Το όριο των συνολικών πόρων μου", - "MyResourcesDescription": "

Αυτός ο πίνακας εμφανίζει τη συνολική χρήση πόρων και όρια σε όλα τα έργα και ομάδες πόρων.

Όταν εφαρμόζονται πολλαπλά όρια (όπως τομέας, έργο ή ζεύγος κλειδιών), το πιο περιοριστικό όριο χρησιμοποιείται για τον υπολογισμό.

", + "MyResourcesDescription": "

Αυτό το πλαίσιο εμφανίζει τους συνολικούς πόρους που χρησιμοποιούνται αυτήν τη στιγμή και είναι δωρεάν σε όλα τα έργα και τις ομάδες πόρων.

Όταν εφαρμόζονται πολλά όρια (όπως τομέας, έργο ή ζεύγος κλειδιών), ο υπολογισμός χρησιμοποιεί το πιο περιοριστικό όριο δωρεάν πόρων.

", "MyResourcesIn": "Οι πόροι μου στο", "MyResourcesInResourceGroup": "Οι πόροι μου στην ομάδα πόρων", - "MyResourcesInResourceGroupDescription": "Αυτός ο πίνακας δείχνει την τρέχουσα χρήση του πόρου μου και παραμένει στην επιλεγμένη ομάδα πόρων.", + "MyResourcesInResourceGroupDescription": "Αυτό το πλαίσιο δείχνει πόσους πόρους έχετε χρησιμοποιήσει και πόσους είναι δωρεάν στην επιλεγμένη ομάδα πόρων του τρέχοντος έργου σας.", "NewPassword": "Νέος κωδικός πρόσβασης", "NewPasswordAgain": "Καινούριος κωδικός ξανά)", "NewPasswordCannotBeSame": "Παρακαλούμε εισάγετε έναν κωδικό πρόσβασης που είναι διαφορετικός από τον τρέχοντα κωδικό σας.", @@ -2083,7 +2086,7 @@ "TermsOfService": "Όροι χρήσης", "TotalResourcesIn": "Συνολικοί πόροι στο", "TotalResourcesInResourceGroup": "Συνολικοί πόροι στην ομάδα πόρων", - "TotalResourcesInResourceGroupDescription": "Αυτός ο πίνακας δείχνει τους συνολικά χρησιμοποιούμενα και εναπομένοντα πόρους. \nΟι τιμές υπολογίζονται με την προσθήκη της χρήσης και των υπόλοιπων ποσών όλων των παραγόντων χρησιμοποιώντας την επιλεγμένη ομάδα πόρων.", + "TotalResourcesInResourceGroupDescription": "Αυτός ο πίνακας εμφανίζει τους συνολικούς χρησιμοποιούμενους και τους δωρεάν πόρους στην επιλεγμένη ομάδα πόρων. \nΟι τιμές υπολογίζονται αθροίζοντας τις χρησιμοποιούμενες και τις ελεύθερες ποσότητες όλων των παραγόντων που χρησιμοποιούν αυτήν την ομάδα.", "TotpActivated": "Ενεργοποίηση 2FA", "Update": "Εκσυγχρονίζω", "Usage": "Χρήση", diff --git a/resources/i18n/en.json b/resources/i18n/en.json index 41f2dd764f..1a9f5186bd 100644 --- a/resources/i18n/en.json +++ b/resources/i18n/en.json @@ -31,6 +31,11 @@ "Terminated": "Terminated", "Utilization": "Utilization" }, + "agentStats": { + "AgentStats": "Agent Statistics", + "AgentStatsDescription": "This panel shows all used resources across all agents in the system. The values represent the total used resources by all active sessions.", + "UsedResources": "Used Resources" + }, "autoScalingRule": { "AddAutoScalingRule": "Add Auto Scaling Rule", "Comparator": "Comparator", @@ -220,6 +225,10 @@ "WarningLessRateLimit": "If the Rate Limit value is small, API operations such as login may be blocked.", "YouAreAboutToDeleteCredential": "You are about to delete this user's credential:" }, + "dashboard": { + "Free": "Free", + "Used": "Used" + }, "data": { "Active": "Active", "Add": "Add", @@ -1129,7 +1138,7 @@ "SuccessFullyPulledArtifact": "Successfully pulled artifact {{name}}: {{version}}", "Type": "Type", "Version": "Version", - "VersionList": "Available List" + "VersionList": "Available List " }, "resourceGroup": { "Activate": "Activate", @@ -1175,11 +1184,6 @@ "TypeResourceGroupNameToDelete": "Type resource group name to delete", "WsproxyAddress": "WSProxy Server Address" }, - "resourcePanel": { - "Limit": "Limit", - "RemainingNumber": "Remaining", - "UsingNumber": "Using" - }, "resourcePolicy": { "AboutToDeleteResourcePolicy": "You are about to delete this resource policy: ", "AllowedHosts": "Allowed hosts", @@ -2059,10 +2063,10 @@ "MyAccountInformation": "My Account Information", "MyEnvironments": "My Environments", "MyResources": "My Total Resources Limit", - "MyResourcesDescription": "

This panel shows your total resource usage and limits across all projects and resource groups.

When multiple limits are applied (such as domain, project, or keypair), the most restrictive limit is used for calculation.

", + "MyResourcesDescription": "

This panel displays your total resources currently used and free across all projects and resource groups.

When multiple limits are applied (such as domain, project, or keypair), the calculation uses the most restrictive free resource limit.

", "MyResourcesIn": "My Resources in", "MyResourcesInResourceGroup": "My Resources in Resource Group", - "MyResourcesInResourceGroupDescription": "This panel shows your current my resource usage and remaining in the selected resource group.", + "MyResourcesInResourceGroupDescription": "This panel shows how much resource you have used and how much is free in the selected resource group of your current project.", "NewPassword": "New password", "NewPasswordAgain": "New password (again)", "NewPasswordCannotBeSame": "Please enter a password that is different from your current password.", @@ -2094,7 +2098,7 @@ "TermsOfService": "Terms of Service", "TotalResourcesIn": "Total Resources in", "TotalResourcesInResourceGroup": "Total Resources in Resource Group", - "TotalResourcesInResourceGroupDescription": "This panel shows the total used and remaining resources. The values are calculated by adding up the usage and remaining amounts of all agents using the selected resource group.", + "TotalResourcesInResourceGroupDescription": "This panel shows the total used and free resources in the selected resource group. The values are calculated by summing the used and free amounts of all agents using that group.", "TotpActivated": "2FA Enabled", "Update": "Update", "Usage": "Usage", diff --git a/resources/i18n/es.json b/resources/i18n/es.json index 44b411ca12..0820c1ad54 100644 --- a/resources/i18n/es.json +++ b/resources/i18n/es.json @@ -31,6 +31,10 @@ "Terminated": "Terminado", "Utilization": "Utilización" }, + "agentStats": { + "AgentStats": "Estadísticas del agente", + "AgentStatsDescription": "Este panel muestra todos los recursos utilizados en todos los agentes del sistema. \nLos valores representan el total de recursos utilizados por todas las sesiones activas." + }, "autoScalingRule": { "AddAutoScalingRule": "Agregar regla de escala automática", "Comparator": "Comparador", @@ -218,6 +222,10 @@ "WarningLessRateLimit": "Si el valor de Rate Limit es pequeño, es posible que se bloqueen operaciones de la API como el inicio de sesión.", "YouAreAboutToDeleteCredential": "Estás a punto de eliminar la credencial de este usuario:" }, + "dashboard": { + "Free": "Gratis", + "Used": "Usado" + }, "data": { "Active": "Activo", "Add": "Añadir", @@ -1170,11 +1178,6 @@ "TypeResourceGroupNameToDelete": "Escriba el nombre del grupo de recursos que desea eliminar", "WsproxyAddress": "Dirección del servidor WSProxy" }, - "resourcePanel": { - "Limit": "Límite", - "RemainingNumber": "Gemelo", - "UsingNumber": "Usando" - }, "resourcePolicy": { "AboutToDeleteResourcePolicy": "Está a punto de eliminar esta política de recursos:", "AllowedHosts": "Hosts permitidos", @@ -2052,10 +2055,10 @@ "MyAccountInformation": "Información de mi cuenta", "MyEnvironments": "Mis ambientes", "MyResources": "Mi límite de recursos totales", - "MyResourcesDescription": "

Este panel muestra el uso total de recursos y límites en todos los proyectos y grupos de recursos.

Cuando se aplican múltiples límites (como dominio, proyecto o par de claves), se utiliza el límite más restrictivo para el cálculo.

", + "MyResourcesDescription": "

Este panel muestra el total de recursos actualmente utilizados y gratuitos en todos los proyectos y grupos de recursos.

Cuando se aplican varios límites (como dominio, proyecto o par de claves), el cálculo utiliza el límite de recursos gratuitos más restrictivo.

", "MyResourcesIn": "Mis recursos en", "MyResourcesInResourceGroup": "Mis recursos en el grupo de recursos", - "MyResourcesInResourceGroupDescription": "Este panel muestra su uso actual de mi recursos y restante en el grupo de recursos seleccionado.", + "MyResourcesInResourceGroupDescription": "Este panel muestra cuánto recurso ha utilizado y cuánto está libre en el grupo de recursos seleccionado de su proyecto actual.", "NewPassword": "Nueva contraseña", "NewPasswordAgain": "Nueva contraseña (otra vez)", "NewPasswordCannotBeSame": "Introduzca una contraseña distinta de la actual.", @@ -2088,7 +2091,7 @@ "TermsOfService": "Condiciones de uso", "TotalResourcesIn": "Recursos totales en", "TotalResourcesInResourceGroup": "Recursos totales en el grupo de recursos", - "TotalResourcesInResourceGroupDescription": "Este panel muestra el total de recursos utilizados y restantes. \nLos valores se calculan agregando el uso y las cantidades restantes de todos los agentes utilizando el grupo de recursos seleccionado.", + "TotalResourcesInResourceGroupDescription": "Este panel muestra el total de recursos utilizados y libres en el grupo de recursos seleccionado. \nLos valores se calculan sumando las cantidades utilizadas y gratuitas de todos los agentes que utilizan ese grupo.", "TotpActivated": "2FA Activado", "Update": "Actualización", "Usage": "Uso", diff --git a/resources/i18n/fi.json b/resources/i18n/fi.json index 940f48ae8e..5e3a237b7e 100644 --- a/resources/i18n/fi.json +++ b/resources/i18n/fi.json @@ -31,6 +31,10 @@ "Terminated": "Lopetettu", "Utilization": "Käyttö" }, + "agentStats": { + "AgentStats": "Agenttitilastot", + "AgentStatsDescription": "Tämä paneeli näyttää kaikki käytetyt resurssit kaikissa järjestelmän agenteissa. \nArvot edustavat kaikkien aktiivisten istuntojen käytettyjä resursseja." + }, "autoScalingRule": { "AddAutoScalingRule": "Lisää automaattinen skaalaussääntö", "Comparator": "Vertailu", @@ -218,6 +222,10 @@ "WarningLessRateLimit": "Jos Rate Limit -arvo on pieni, API-toiminnot, kuten kirjautuminen, voivat estyä.", "YouAreAboutToDeleteCredential": "Olet poistamassa tämän käyttäjän kirjautumistiedot:" }, + "dashboard": { + "Free": "Ilmainen", + "Used": "Käytetty" + }, "data": { "Active": "Aktiivinen", "Add": "Lisätä", @@ -1169,11 +1177,6 @@ "TypeResourceGroupNameToDelete": "Kirjoita poistettavan resurssiryhmän nimi", "WsproxyAddress": "WSProxy-palvelimen osoite" }, - "resourcePanel": { - "Limit": "Rajoittaa", - "RemainingNumber": "Rmmitys", - "UsingNumber": "Käyttäminen" - }, "resourcePolicy": { "AboutToDeleteResourcePolicy": "Olet poistamassa tätä resurssikäytäntöä:", "AllowedHosts": "Sallitut isännät", @@ -2051,10 +2054,10 @@ "MyAccountInformation": "Tilini tiedot", "MyEnvironments": "Omat ympäristöt", "MyResources": "Kokonaisresurssini rajoittavat", - "MyResourcesDescription": "

Tämä paneeli näyttää resurssien kokonaiskäytön ja rajat kaikissa projekteissa ja resurssiryhmissä.

Kun useita rajoja on käytössä (verkkotunnus, projekti tai avainpari), tiukinta rajaa käytetään laskennassa.

", + "MyResourcesDescription": "

Tässä paneelissa näytetään tällä hetkellä käytetyt ja vapaat resurssit kaikissa projekteissa ja resurssiryhmissä.

Kun käytetään useita rajoituksia (kuten verkkotunnus, projekti tai avainpari), laskennassa käytetään kaikkein rajoittavinta ilmaisten resurssien rajaa.

", "MyResourcesIn": "Resurssini", "MyResourcesInResourceGroup": "Resurssini resurssiryhmässä", - "MyResourcesInResourceGroupDescription": "Tämä paneeli näyttää nykyisen resurssien käytön ja pysyvän valitussa resurssiryhmässä.", + "MyResourcesInResourceGroupDescription": "Tämä paneeli näyttää, kuinka paljon resurssia olet käyttänyt ja kuinka paljon on vapaata nykyisen projektisi valitussa resurssiryhmässä.", "NewPassword": "Uusi salasana", "NewPasswordAgain": "Uusi salasana (taas)", "NewPasswordCannotBeSame": "Kirjoita salasana, joka poikkeaa nykyisestä salasanastasi.", @@ -2088,7 +2091,7 @@ "TermsOfService": "Käyttöehdot", "TotalResourcesIn": "Resurssien kokonaismäärä", "TotalResourcesInResourceGroup": "Resurssien kokonaismäärä resurssiryhmässä", - "TotalResourcesInResourceGroupDescription": "Tämä paneeli näyttää käytetyt ja jäljellä olevat resurssit. \nArvot lasketaan lisäämällä kaikkien aineiden käyttö ja jäljellä olevat määrät valitun resurssiryhmän avulla.", + "TotalResourcesInResourceGroupDescription": "Tämä paneeli näyttää valitun resurssiryhmän käytetyt ja vapaat resurssit yhteensä. \nArvot lasketaan summaamalla kaikkien kyseistä ryhmää käyttävien aineiden käytetyt ja vapaat määrät.", "TotpActivated": "2FA käytössä", "Update": "Päivitys", "Usage": "Käyttö", diff --git a/resources/i18n/fr.json b/resources/i18n/fr.json index 9f90a9b8d0..3417491876 100644 --- a/resources/i18n/fr.json +++ b/resources/i18n/fr.json @@ -31,6 +31,10 @@ "Terminated": "Terminé", "Utilization": "Utilisation" }, + "agentStats": { + "AgentStats": "Statistiques des agents", + "AgentStatsDescription": "Ce panneau affiche toutes les ressources utilisées par tous les agents du système. \nLes valeurs représentent le total des ressources utilisées par toutes les sessions actives." + }, "autoScalingRule": { "AddAutoScalingRule": "Ajouter la règle de mise à l'échelle automatique", "Comparator": "Comparateur", @@ -218,6 +222,10 @@ "WarningLessRateLimit": "Si la valeur de la limite de débit est faible, les opérations API telles que la connexion peuvent être bloquées.", "YouAreAboutToDeleteCredential": "Vous êtes sur le point de supprimer les identifiants de cet utilisateur :" }, + "dashboard": { + "Free": "Gratuit", + "Used": "Utilisé" + }, "data": { "Active": "Actif", "Add": "Ajouter", @@ -1170,11 +1178,6 @@ "TypeResourceGroupNameToDelete": "Tapez le nom du groupe de ressources à supprimer", "WsproxyAddress": "Adresse du serveur WSProxy" }, - "resourcePanel": { - "Limit": "Limite", - "RemainingNumber": "Rmanque", - "UsingNumber": "En utilisant" - }, "resourcePolicy": { "AboutToDeleteResourcePolicy": "Vous êtes sur le point de supprimer cette stratégie de ressources :", "AllowedHosts": "Hôtes autorisés", @@ -2052,10 +2055,10 @@ "MyAccountInformation": "Modifier les informations utilisateur", "MyEnvironments": "Mes environnements", "MyResources": "Ma limite totale de ressources", - "MyResourcesDescription": "

Ce panneau affiche l'utilisation totale de vos ressources et les limites dans tous les projets et groupes de ressources.

Lorsque plusieurs limites sont appliquées (domaine, projet ou paire de clés), la limite la plus restrictive est utilisée pour le calcul.

", + "MyResourcesDescription": "

Ce panneau affiche le total de vos ressources actuellement utilisées et disponibles sur tous les projets et groupes de ressources.

Lorsque plusieurs limites sont appliquées (telles qu'un domaine, un projet ou une paire de clés), le calcul utilise la limite de ressources gratuites la plus restrictive.

", "MyResourcesIn": "Mes ressources dans", "MyResourcesInResourceGroup": "Mes ressources dans le groupe de ressources", - "MyResourcesInResourceGroupDescription": "Ce panneau montre votre utilisation actuelle de ressources et restant dans le groupe de ressources sélectionné.", + "MyResourcesInResourceGroupDescription": "Ce panneau montre la quantité de ressources que vous avez utilisée et la quantité disponible dans le groupe de ressources sélectionné de votre projet actuel.", "NewPassword": "Nouveau mot de passe", "NewPasswordAgain": "Retapez le nouveau mot de passe", "NewPasswordCannotBeSame": "Veuillez saisir un mot de passe différent de votre mot de passe actuel.", @@ -2088,7 +2091,7 @@ "TermsOfService": "Conditions d'utilisation", "TotalResourcesIn": "Ressources totales dans", "TotalResourcesInResourceGroup": "Ressources totales dans le groupe de ressources", - "TotalResourcesInResourceGroupDescription": "Ce panneau montre le total des ressources utilisées et restantes. \nLes valeurs sont calculées en additionnant l'utilisation et les quantités restantes de tous les agents à l'aide du groupe de ressources sélectionné.", + "TotalResourcesInResourceGroupDescription": "Ce panneau affiche le total des ressources utilisées et libres dans le groupe de ressources sélectionné. \nLes valeurs sont calculées en additionnant les quantités utilisées et libres de tous les agents utilisant ce groupe.", "TotpActivated": "2FA activé", "Update": "Mettre à jour", "Usage": "Usage", diff --git a/resources/i18n/id.json b/resources/i18n/id.json index 4df4b2edf1..4b7d1424bc 100644 --- a/resources/i18n/id.json +++ b/resources/i18n/id.json @@ -31,6 +31,10 @@ "Terminated": "Dihentikan", "Utilization": "Pemanfaatan" }, + "agentStats": { + "AgentStats": "Statistik Agen", + "AgentStatsDescription": "Panel ini menunjukkan semua sumber daya yang digunakan di seluruh agen dalam sistem. \nNilai mewakili total sumber daya yang digunakan oleh semua sesi aktif." + }, "autoScalingRule": { "AddAutoScalingRule": "Tambahkan aturan penskalaan otomatis", "Comparator": "Pembanding", @@ -217,6 +221,10 @@ "WarningLessRateLimit": "Jika nilai Rate Limit kecil, operasi API seperti login dapat diblokir.", "YouAreAboutToDeleteCredential": "Anda akan menghapus kredensial pengguna ini:" }, + "dashboard": { + "Free": "Bebas", + "Used": "Digunakan" + }, "data": { "Active": "Aktif", "Add": "Menambahkan", @@ -1168,11 +1176,6 @@ "TypeResourceGroupNameToDelete": "Ketik nama grup sumber daya yang akan dihapus", "WsproxyAddress": "Alamat Server WSProxy" }, - "resourcePanel": { - "Limit": "Membatasi", - "RemainingNumber": "Rmaining", - "UsingNumber": "Menggunakan" - }, "resourcePolicy": { "AboutToDeleteResourcePolicy": "Anda akan menghapus kebijakan sumber daya ini:", "AllowedHosts": "Host yang diizinkan", @@ -2051,10 +2054,10 @@ "MyAccountInformation": "Informasi Akun Saya", "MyEnvironments": "Lingkungan Saya", "MyResources": "Batas Total Sumber Daya Saya", - "MyResourcesDescription": "

Panel ini menunjukkan total penggunaan sumber daya dan batas di semua proyek dan grup sumber daya.

Ketika beberapa batas diterapkan (seperti domain, proyek, atau pasangan kunci), batas yang paling ketat digunakan untuk perhitungan.

", + "MyResourcesDescription": "

Panel ini menampilkan total sumber daya yang saat ini digunakan dan gratis di semua proyek dan grup sumber daya.

Jika beberapa batasan diterapkan (seperti domain, proyek, atau pasangan kunci), penghitungan akan menggunakan batas sumber daya gratis yang paling ketat.

", "MyResourcesIn": "Sumber daya saya di", "MyResourcesInResourceGroup": "Sumber Daya Saya dalam Grup Sumber Daya", - "MyResourcesInResourceGroupDescription": "Panel ini menunjukkan penggunaan sumber daya saya saat ini dan tersisa di grup sumber daya yang dipilih.", + "MyResourcesInResourceGroupDescription": "Panel ini menunjukkan berapa banyak sumber daya yang telah Anda gunakan dan berapa banyak yang gratis di grup sumber daya yang dipilih pada proyek Anda saat ini.", "NewPassword": "Kata sandi baru", "NewPasswordAgain": "Kata sandi (konfirmasi)", "NewPasswordCannotBeSame": "Masukkan kata sandi yang berbeda dari kata sandi Anda saat ini.", @@ -2087,7 +2090,7 @@ "TermsOfService": "Persyaratan Layanan", "TotalResourcesIn": "Total sumber daya di", "TotalResourcesInResourceGroup": "Total Sumber Daya dalam Grup Sumber Daya", - "TotalResourcesInResourceGroupDescription": "Panel ini menunjukkan total sumber daya yang digunakan dan sisa. \nNilai dihitung dengan menambahkan penggunaan dan jumlah yang tersisa dari semua agen menggunakan grup sumber daya yang dipilih.", + "TotalResourcesInResourceGroupDescription": "Panel ini memperlihatkan total sumber daya yang digunakan dan gratis dalam grup sumber daya yang dipilih. \nNilainya dihitung dengan menjumlahkan jumlah terpakai dan jumlah bebas semua agen yang menggunakan grup tersebut.", "TotpActivated": "2FA Diaktifkan", "Update": "Perbarui", "Usage": "Penggunaan", diff --git a/resources/i18n/it.json b/resources/i18n/it.json index 2a02c0f04c..2c1c81edd9 100644 --- a/resources/i18n/it.json +++ b/resources/i18n/it.json @@ -31,6 +31,10 @@ "Terminated": "Terminato", "Utilization": "Utilizzo" }, + "agentStats": { + "AgentStats": "Statistiche dell'agente", + "AgentStatsDescription": "Questo pannello mostra tutte le risorse utilizzate in tutti gli agenti nel sistema. \nI valori rappresentano le risorse totali utilizzate da tutte le sessioni attive." + }, "autoScalingRule": { "AddAutoScalingRule": "Aggiungi regola di ridimensionamento automatico", "Comparator": "Comparatore", @@ -217,6 +221,10 @@ "WarningLessRateLimit": "Se il valore di Rate Limit è piccolo, le operazioni API come il login possono essere bloccate.", "YouAreAboutToDeleteCredential": "Stai per eliminare le credenziali di questo utente:" }, + "dashboard": { + "Free": "Gratuito", + "Used": "Usato" + }, "data": { "Active": "Attivo", "Add": "Aggiungi", @@ -1168,11 +1176,6 @@ "TypeResourceGroupNameToDelete": "Digita il nome del gruppo di risorse da eliminare", "WsproxyAddress": "Indirizzo del server WSProxy" }, - "resourcePanel": { - "Limit": "Limite", - "RemainingNumber": "Rmaining", - "UsingNumber": "Usando" - }, "resourcePolicy": { "AboutToDeleteResourcePolicy": "Stai per eliminare questa policy sulle risorse:", "AllowedHosts": "Host consentiti", @@ -2049,10 +2052,10 @@ "MyAccountInformation": "Modifica informazioni utente User", "MyEnvironments": "I miei ambienti", "MyResources": "Il mio limite di risorse totali", - "MyResourcesDescription": "

Questo pannello mostra l'utilizzo totale delle risorse e i limiti in tutti i progetti e gruppi di risorse.

Quando vengono applicati più limiti (come dominio, progetto o coppia di chiavi), viene utilizzato il limite più restrittivo per il calcolo.

", + "MyResourcesDescription": "

Questo pannello mostra le risorse totali attualmente utilizzate e gratuite in tutti i progetti e gruppi di risorse.

Quando vengono applicati più limiti (come dominio, progetto o coppia di chiavi), il calcolo utilizza il limite di risorse gratuite più restrittivo.

", "MyResourcesIn": "Le mie risorse in", "MyResourcesInResourceGroup": "Le mie risorse nel gruppo di risorse", - "MyResourcesInResourceGroupDescription": "Questo pannello mostra il tuo attuale utilizzo della mia risorsa e rimanendo nel gruppo di risorse selezionato.", + "MyResourcesInResourceGroupDescription": "Questo pannello mostra la quantità di risorse che hai utilizzato e la quantità disponibile nel gruppo di risorse selezionato del tuo progetto corrente.", "NewPassword": "Nuova password", "NewPasswordAgain": "Conferma la nuova password)", "NewPasswordCannotBeSame": "Inserire una password diversa da quella attuale.", @@ -2085,7 +2088,7 @@ "TermsOfService": "Termini di servizio", "TotalResourcesIn": "Risorse totali in", "TotalResourcesInResourceGroup": "Risorse totali nel gruppo di risorse", - "TotalResourcesInResourceGroupDescription": "Questo pannello mostra le risorse totali utilizzate e rimanenti. \nI valori vengono calcolati aggiungendo l'utilizzo e le quantità rimanenti di tutti gli agenti utilizzando il gruppo di risorse selezionato.", + "TotalResourcesInResourceGroupDescription": "Questo pannello mostra le risorse totali utilizzate e gratuite nel gruppo di risorse selezionato. \nI valori vengono calcolati sommando gli importi utilizzati e quelli gratuiti di tutti gli agenti che utilizzano quel gruppo.", "TotpActivated": "2FA abilitato", "Update": "Aggiornare", "Usage": "Utilizzo", diff --git a/resources/i18n/ja.json b/resources/i18n/ja.json index 31a3628022..d81c7b1bcf 100644 --- a/resources/i18n/ja.json +++ b/resources/i18n/ja.json @@ -31,6 +31,10 @@ "Terminated": "終了しました", "Utilization": "使用量" }, + "agentStats": { + "AgentStats": "エージェントの統計", + "AgentStatsDescription": "このパネルには、システム内のすべてのエージェントにわたって使用されているすべてのリソースが表示されます。\n値は、すべてのアクティブなセッションで使用されたリソースの合計を表します。" + }, "autoScalingRule": { "AddAutoScalingRule": "自動スケーリングルールを追加します", "Comparator": "コンパレータ", @@ -217,6 +221,10 @@ "WarningLessRateLimit": "Rate Limit値が小さいと、ログインなどのAPI操作がブロックされることがあります。", "YouAreAboutToDeleteCredential": "このユーザーの資格情報を削除しようとしています:" }, + "dashboard": { + "Free": "無料", + "Used": "使用済み" + }, "data": { "Active": "アクティブ", "Add": "追加", @@ -1169,11 +1177,6 @@ "TypeResourceGroupNameToDelete": "削除するリソースグループ名を入力します", "WsproxyAddress": "WSProxy サーバアドレス" }, - "resourcePanel": { - "Limit": "制限", - "RemainingNumber": "rmaining", - "UsingNumber": "使用" - }, "resourcePolicy": { "AboutToDeleteResourcePolicy": "このリソースポリシーを削除しようとしています。", "AllowedHosts": "許可されたホスト", @@ -2051,10 +2054,10 @@ "MyAccountInformation": "ユーザー情報の変更", "MyEnvironments": "利用環境", "MyResources": "私の総リソース制限", - "MyResourcesDescription": "

このパネルは、全てのプロジェクトとリソースグループを合算した総リソース使用量と制限を表示します。

複数の制限(ドメイン、プロジェクト、キーペアなど)が適用される場合、最も厳しい制限に基づいて計算されます。

", + "MyResourcesDescription": "

このパネルには、すべてのプロジェクトおよびリソース グループにわたって現在使用されているリソースと空きリソースの合計が表示されます。

複数の制限が適用されている場合 (ドメイン、プロジェクト、キーペアなど)、計算では最も制限の厳しい無料リソース制限が使用されます。

", "MyResourcesIn": "私のリソース", "MyResourcesInResourceGroup": "リソースグループの私のリソース", - "MyResourcesInResourceGroupDescription": "このパネルは、現在の私のリソースの使用と選択したリソースグループに残っていることを示しています。", + "MyResourcesInResourceGroupDescription": "このパネルには、現在のプロジェクトで選択したリソース グループで使用したリソースの量と空き容量が表示されます。", "NewPassword": "新しいパスワード", "NewPasswordAgain": "新しいパスワードを再入力)", "NewPasswordCannotBeSame": "既存のパスワードとは異なる新しいパスワードを入力してください。", @@ -2087,7 +2090,7 @@ "TermsOfService": "利用規約", "TotalResourcesIn": "総リソース", "TotalResourcesInResourceGroup": "リソースグループの総リソース", - "TotalResourcesInResourceGroupDescription": "このパネルは、使用されている合計と残りのリソースを示しています。\n値は、選択したリソースグループを使用して、すべてのエージェントの使用量と残りの量を追加することによって計算されます。", + "TotalResourcesInResourceGroupDescription": "このパネルには、選択したリソース グループ内の使用済みリソースと空きリソースの合計が表示されます。\n値は、そのグループを使用するすべてのエージェントの使用量と空き量を合計することによって計算されます。", "TotpActivated": "二要素認証の使用", "Update": "更新", "Usage": "使用法", diff --git a/resources/i18n/ko.json b/resources/i18n/ko.json index c0c4db7e9b..b164a3b2f9 100644 --- a/resources/i18n/ko.json +++ b/resources/i18n/ko.json @@ -31,6 +31,10 @@ "Terminated": "종료됨", "Utilization": "사용량" }, + "agentStats": { + "AgentStats": "에이전트 통계", + "AgentStatsDescription": "이 패널은 시스템 내 모든 에이전트가 사용 중인 전체 자원을 보여줍니다. 값은 모든 활성 세션에서 사용 중인 자원의 총합을 나타냅니다." + }, "autoScalingRule": { "AddAutoScalingRule": "오토스케일링 규칙 추가", "Comparator": "연산자", @@ -220,6 +224,10 @@ "WarningLessRateLimit": "Rate Limit 값이 작으면 로그인 등 API 작업이 차단될 수 있습니다.", "YouAreAboutToDeleteCredential": "다음 사용자의 자격증명을 삭제하려고 합니다:" }, + "dashboard": { + "Free": "사용 가능", + "Used": "사용 중" + }, "data": { "Active": "활성", "Add": "추가", @@ -487,7 +495,7 @@ "Insufficient": "부족", "Status": "상태", "StatusOfSelectedHost": "선택한 호스트 상태", - "Used": "사용중" + "Used": "사용 중" } }, "desktopNotification": { @@ -1174,11 +1182,6 @@ "TypeResourceGroupNameToDelete": "삭제하려는 자원 그룹 이름을 다시 한번 입력하세요.", "WsproxyAddress": "WSProxy 서버 주소" }, - "resourcePanel": { - "Limit": "허용량", - "RemainingNumber": "가용량", - "UsingNumber": "사용량" - }, "resourcePolicy": { "AboutToDeleteResourcePolicy": "아래의 자원 정책을 삭제하려고 합니다: ", "AllowedHosts": "허용된 호스트", @@ -1314,7 +1317,7 @@ "ForceUseV2Proxy": "V2 프록시 강제 사용", "GPU": "GPU", "GPU(MEM)": "GPU(메모리)", - "Gaudi2Enabled": "Gaudi 2 NPU 사용중", + "Gaudi2Enabled": "Gaudi 2 NPU 사용 중", "GracePeriod": "유예 기간", "GracePeriodDesc": "자원 사용량 기반 체커를 지정된 시간 동안 작동하지 않게 합니다. 이 시간이 지나기 전에는 사용량이 적더라도 연산 세션이 삭제되지 않습니다.", "Host": "호스트", @@ -1831,9 +1834,9 @@ } }, "summary": { - "ATOMEnabled": "ATOM NPU 사용중", + "ATOMEnabled": "ATOM NPU 사용 중", "ATOMMaxEnabled": "ATOM Max 지원", - "ATOMPlusEnabled": "ATOM+ NPU 사용중", + "ATOMPlusEnabled": "ATOM+ NPU 사용 중", "Accept": "허용", "AcceptSharedVFolder": "다음 폴더에 대한 공유를 받습니다. 공유 받은 폴더 이름: ", "ActiveSessions": "활성 세션", @@ -1850,29 +1853,29 @@ "DownloadWebUIApp": "데스크톱 앱 다운로드", "FastTrack": "FastTrack", "FolderName": "폴더 이름", - "FractionalGPUScalingEnabled": "Fractional GPU 가상화 사용중", - "HyperaccelLPUEnabled": "Hyperaccel LPU 사용중", - "IPUEnabled": "IPU NPU 사용중", + "FractionalGPUScalingEnabled": "Fractional GPU 가상화 사용 중", + "HyperaccelLPUEnabled": "Hyperaccel LPU 사용 중", + "IPUEnabled": "IPU NPU 사용 중", "Invitation": "초대", "MaintainKeypairs": "키페어 관리", "NoAnnouncement": "표시할 안내문이 없습니다.", "NoInvitations": "초대받은 폴더가 없습니다.", "Permission": "권한", "RNGDEnabled": "RNGD NPU 사용 중", - "ROCMGPUEnabled": "ROCm GPU 사용중", + "ROCMGPUEnabled": "ROCm GPU 사용 중", "Reserved": "예약중", "ReservedShort": "예약", "ResourceStatistics": "자원 사용량", "StartMenu": "시작", "SystemMaintenance": "시스템 유지보수", "SystemResources": "시스템 자원", - "TPUEnabled": "TPU 사용중", + "TPUEnabled": "TPU 사용 중", "Total": "전체", "UpdateEnvironmentImages": "실행 환경 이미지 업데이트", "UploadFiles": "파일 업로드", - "Used": "사용중", + "Used": "사용 중", "Using": "사용", - "WarboyEnabled": "Warboy NPU 사용중" + "WarboyEnabled": "Warboy NPU 사용 중" }, "table": { "SearchTableColumn": "테이블 열 검색", @@ -1948,7 +1951,7 @@ "DescMyKeypairInfo": "내 키페어 정보 보기", "DescNewUserConfigFileCreated": "새 사용자 스크립트 생성을 위한 내용이 필요합니다.", "DescNoBetaFeatures": "사용 가능한 베타 기능이 없습니다. :)", - "DescPreferredSSHPort": "가능하면 이 값을 SSH/SFTP 포트번호로 사용합니다.
만약 해당 포트가 이미 사용중이라면, SSH/SFTP를 위한 임의의 다른 포트를 할당합니다. 자동 할당을 위해서는 빈 칸으로 남겨두세요.", + "DescPreferredSSHPort": "가능하면 이 값을 SSH/SFTP 포트번호로 사용합니다.
만약 해당 포트가 이미 사용 중이라면, SSH/SFTP를 위한 임의의 다른 포트를 할당합니다. 자동 할당을 위해서는 빈 칸으로 남겨두세요.", "DescSSHKeypairManagement": "랜덤 생성 또는 수동 입력을 통해 SSH 키페어를 변경할 수 있습니다.", "DescScriptAllDeleted": "생성되었던 모든 사용자 스크립트가 삭제되었습니다.", "DescScriptCreated": "사용자 스크립트를 생성했습니다. 이 스크립트는 이후 새로 생성하는 세션부터 적용됩니다.", @@ -2057,10 +2060,10 @@ "MyAccountInformation": "사용자 정보 변경", "MyEnvironments": "나의 실행 환경", "MyResources": "나의 총자원 제한", - "MyResourcesDescription": "

이 패널은 모든 프로젝트와 리소스 그룹을 합산한 나의 전체 자원 사용량과 허용량을 보여줍니다.

여러 제한(도메인, 프로젝트, 키페어 등)이 복합적으로 적용될 경우, 가장 엄격한 제한 기준에 따라 허용량이 계산됩니다.

", - "MyResourcesIn": "자원 그룹 내 나의 자원", + "MyResourcesDescription": "

이 패널에서는 모든 프로젝트와 리소스 그룹의 자원 중 현재 사용 중인 양과 사용 가능한 양을 합산해서 보여줍니다.

여러 제한(도메인, 프로젝트, 키페어 등)이 복합적으로 적용될 경우, 가장 엄격한 제한 기준에 따라 사용 가능 자원이 계산됩니다.

", + "MyResourcesIn": "자원 그룹별 나의 자원", "MyResourcesInResourceGroup": "자원 그룹 내 나의 자원", - "MyResourcesInResourceGroupDescription": "이 패널은 선택한 자원 그룹에서 내 나의 자원 사용량과 가용량을 보여줍니다.", + "MyResourcesInResourceGroupDescription": "이 패널에서는 현재 프로젝트의 선택된 자원 그룹에서 내가 사용 중인 자원과 사용 가능한 잔여 자원을 보여줍니다.", "NewPassword": "새 비밀번호", "NewPasswordAgain": "새 비밀번호 (재입력)", "NewPasswordCannotBeSame": "기존 비밀번호와 다른 새 비밀번호를 입력해 주세요.", @@ -2091,9 +2094,9 @@ "Summary": "요약", "Tasks": "작업", "TermsOfService": "약관", - "TotalResourcesIn": "자원 그룹 내 총자원", + "TotalResourcesIn": "자원 그룹별 총자원", "TotalResourcesInResourceGroup": "자원 그룹 내 총자원", - "TotalResourcesInResourceGroupDescription": "이 패널은 총 사용량과 남은 자원량을 보여줍니다. 선택한 자원 그룹을 사용하는 모든 노드의 사용량과 남은 자원을 합산하여 계산합니다.", + "TotalResourcesInResourceGroupDescription": "이 패널은 선택한 자원 그룹에서 총 사용 중인 자원과 사용 가능한 자원을 보여줍니다. 값은 해당 자원 그룹을 사용하는 모든 에이전트의 사용량과 사용 가능량을 합산하여 계산됩니다.", "TotpActivated": "이중 인증 사용", "Update": "변경", "Usage": "사용량", diff --git a/resources/i18n/mn.json b/resources/i18n/mn.json index 065d4cc515..686db01a58 100644 --- a/resources/i18n/mn.json +++ b/resources/i18n/mn.json @@ -31,6 +31,10 @@ "Terminated": "Цуцлагдсан", "Utilization": "Ашиглалт" }, + "agentStats": { + "AgentStats": "Ашиг олгогчийн статистик", + "AgentStatsDescription": "Энэ самбар нь бүх агууламж дахь бүх агентуудыг систем дэх бүх агентуудад харуулдаг. \nУтга нь ашигласан бүх нөөцийг бүх идэвхтэй сешнээр илэрхийлнэ." + }, "autoScalingRule": { "AddAutoScalingRule": "Автомат масштабыг нэмэх", "Comparator": "Автоматлагч", @@ -217,6 +221,10 @@ "WarningLessRateLimit": "Хэрэв ханшийн хязгаарын утга бага байвал нэвтрэх гэх мэт API үйлдлүүдийг хааж болно.", "YouAreAboutToDeleteCredential": "Та энэ хэрэглэгчийн итгэмжлэлийг устгах гэж байна:" }, + "dashboard": { + "Free": "Үнэгүй", + "Used": "Ашиг ашиглагдсан" + }, "data": { "Active": "Идэвхтэй", "Add": "Нэмэх", @@ -1168,11 +1176,6 @@ "TypeResourceGroupNameToDelete": "Устгахын тулд нөөцийн бүлгийн нэрийг бичнэ үү", "WsproxyAddress": "WSProxy серверийн хаяг" }, - "resourcePanel": { - "Limit": "Хязгаар", - "RemainingNumber": "Rmaining", - "UsingNumber": "Ашиглаж" - }, "resourcePolicy": { "AboutToDeleteResourcePolicy": "Та энэ нөөцийн бодлогыг устгах гэж байна:", "AllowedHosts": "Зөвшөөрөгдсөн хостууд", @@ -2049,10 +2052,10 @@ "MyAccountInformation": "Хэрэглэгчийн мэдээллийг өөрчлөх", "MyEnvironments": "Миний орчин", "MyResources": "Миний нийт нөөцийн хязгаар", - "MyResourcesDescription": "

Энэ самбар нь бүх төсөл болон нөөцийн бүлгүүдийн нийт нөөцийн хэрэглээ болон хязгаарыг харуулна.

Олон хязгаарлалт хэрэглэх үед (домэйн, төсөл эсвэл түлхүүр хос гэх мэт), тооцоололд хамгийн хатуу хязгаарлалтыг ашиглана.

", + "MyResourcesDescription": "

Энэхүү самбар нь одоогийн эх сурвалжийг одоо ашиглаж, бүх төслөөр ашиглаж, бүх төслөөс ангид хэрэглэгддэг.", "MyResourcesIn": "Миний нөөц", "MyResourcesInResourceGroup": "Нөөцийн бүлгийн нөөц", - "MyResourcesInResourceGroupDescription": "Энэ самбар нь таны нөөцийн ашиглалтыг харуулж, сонгосон нөөцийн бүлэгт үлдсэн.", + "MyResourcesInResourceGroupDescription": "Энэ самбар нь таны урьдчилсан төслийн сонгосон нөөцийн бүлэгт хичнээн их ашиглагдаж байгаа бөгөөд одоогийн эх сурвалжийн бүлэгт хичнээн их үнэ төлбөргүй байдаг.", "NewPassword": "Шинэ нууц үг", "NewPasswordAgain": "Шинэ нууц үг (дахиад)", "NewPasswordCannotBeSame": "Таны одоогийн нууц үгээс өөр нууц үг оруулна уу.", @@ -2085,7 +2088,7 @@ "TermsOfService": "Үйлчилгээний нөхцөл", "TotalResourcesIn": "Нийт нөөц", "TotalResourcesInResourceGroup": "Нөөцийн бүлгийн нийт нөөц", - "TotalResourcesInResourceGroupDescription": "Энэ самбар нь ашиглагдаж, үлдсэн нөөцийг нийтлүүлнэ. \nУтга нь сонгосон нөөцийн бүлгийг ашиглан бүх агентуудын болон үлдсэн агентуудын үлдэгдлийг нэмж, үлдсэн хэмжээгээр тооцдог.", + "TotalResourcesInResourceGroupDescription": "Энэ самбар нь сонгосон нөөцийн бүлэгт ашиглагдсан, үнэгүй нөөцийг харуулж байна. \nЭнэ бүлгийг ашиглан бүх агентуудын ашиглагдаж буй, чөлөөт дүнг тооцоогоор тооцно.", "TotpActivated": "2FA идэвхжүүлсэн", "Update": "Шинэчлэх", "Usage": "Угаалах", diff --git a/resources/i18n/ms.json b/resources/i18n/ms.json index 08bc1ea7cc..af48f8f068 100644 --- a/resources/i18n/ms.json +++ b/resources/i18n/ms.json @@ -31,6 +31,10 @@ "Terminated": "Ditamatkan", "Utilization": "Penggunaan" }, + "agentStats": { + "AgentStats": "Statistik Ejen", + "AgentStatsDescription": "Panel ini menunjukkan semua sumber yang digunakan di semua ejen dalam sistem. \nNilai mewakili jumlah sumber yang digunakan oleh semua sesi aktif." + }, "autoScalingRule": { "AddAutoScalingRule": "Tambahkan peraturan penskalaan automatik", "Comparator": "Komparator", @@ -217,6 +221,10 @@ "WarningLessRateLimit": "Jika nilai Had Kadar adalah kecil, operasi API seperti log masuk mungkin disekat.", "YouAreAboutToDeleteCredential": "Anda akan memadamkan kelayakan pengguna ini:" }, + "dashboard": { + "Free": "Percuma", + "Used": "Digunakan" + }, "data": { "Active": "Aktif", "Add": "Tambah", @@ -1169,11 +1177,6 @@ "TypeResourceGroupNameToDelete": "Taipkan nama kumpulan sumber untuk dipadamkan", "WsproxyAddress": "Alamat Pelayan WSProxy" }, - "resourcePanel": { - "Limit": "Had", - "RemainingNumber": "Rmaining", - "UsingNumber": "Menggunakan" - }, "resourcePolicy": { "AboutToDeleteResourcePolicy": "Anda akan memadamkan dasar sumber ini:", "AllowedHosts": "Tuan rumah yang dibenarkan", @@ -2050,10 +2053,10 @@ "MyAccountInformation": "Tukar Maklumat Pengguna", "MyEnvironments": "Persekitaran Saya", "MyResources": "Had jumlah sumber saya", - "MyResourcesDescription": "

Panel ini menunjukkan jumlah penggunaan sumber dan had di semua projek dan kumpulan sumber.

Apabila beberapa had digunakan (seperti domain, projek, atau pasangan kunci), had yang paling ketat digunakan untuk pengiraan.

", + "MyResourcesDescription": "

Panel ini memaparkan jumlah sumber anda yang digunakan dan percuma di semua projek dan kumpulan sumber.

Apabila beberapa had digunakan (seperti domain, projek, atau keypair), pengiraan menggunakan had sumber bebas yang paling ketat.

", "MyResourcesIn": "Sumber saya di", "MyResourcesInResourceGroup": "Sumber saya dalam kumpulan sumber", - "MyResourcesInResourceGroupDescription": "Panel ini menunjukkan penggunaan sumber saya sekarang dan tinggal di kumpulan sumber yang dipilih.", + "MyResourcesInResourceGroupDescription": "Panel ini menunjukkan berapa banyak sumber yang anda gunakan dan berapa banyak yang percuma dalam kumpulan sumber yang dipilih dalam projek semasa anda.", "NewPassword": "Kata laluan baharu", "NewPasswordAgain": "Kata laluan baru (sekali lagi)", "NewPasswordCannotBeSame": "Sila masukkan kata laluan yang berbeza daripada kata laluan semasa anda.", @@ -2086,7 +2089,7 @@ "TermsOfService": "Syarat Perkhidmatan", "TotalResourcesIn": "Jumlah sumber dalam", "TotalResourcesInResourceGroup": "Jumlah sumber dalam kumpulan sumber", - "TotalResourcesInResourceGroupDescription": "Panel ini menunjukkan jumlah sumber yang digunakan dan baki. \nNilai dikira dengan menambah penggunaan dan baki jumlah semua ejen menggunakan kumpulan sumber yang dipilih.", + "TotalResourcesInResourceGroupDescription": "Panel ini menunjukkan jumlah sumber yang digunakan dan percuma dalam kumpulan sumber yang dipilih. \nNilai -nilai dikira dengan menjumlahkan jumlah yang digunakan dan bebas dari semua ejen menggunakan kumpulan itu.", "TotpActivated": "2FA Didayakan", "Update": "Kemas kini", "Usage": "Penggunaan", diff --git a/resources/i18n/pl.json b/resources/i18n/pl.json index d4fc10c346..dafe46c231 100644 --- a/resources/i18n/pl.json +++ b/resources/i18n/pl.json @@ -31,6 +31,10 @@ "Terminated": "Zakończony", "Utilization": "Wykorzystanie" }, + "agentStats": { + "AgentStats": "Statystyki agentów", + "AgentStatsDescription": "Ten panel pokazuje wszystkie wykorzystane zasoby wszystkich agentów w systemie. \nWartości reprezentują całkowite zasoby wykorzystane przez wszystkie aktywne sesje." + }, "autoScalingRule": { "AddAutoScalingRule": "Dodaj regułę automatycznego skalowania", "Comparator": "Komparator", @@ -218,6 +222,10 @@ "WarningLessRateLimit": "Jeśli wartość Rate Limit jest niska, operacje API, takie jak logowanie, mogą zostać zablokowane.", "YouAreAboutToDeleteCredential": "Zamierzasz usunąć dane uwierzytelniające tego użytkownika:" }, + "dashboard": { + "Free": "Bezpłatny", + "Used": "Używany" + }, "data": { "Active": "Aktywny", "Add": "Dodaj", @@ -1169,11 +1177,6 @@ "TypeResourceGroupNameToDelete": "Wpisz nazwę grupy zasobów do usunięcia", "WsproxyAddress": "Adres serwera WSProxy" }, - "resourcePanel": { - "Limit": "Limit", - "RemainingNumber": "Rmaring", - "UsingNumber": "Używając" - }, "resourcePolicy": { "AboutToDeleteResourcePolicy": "Zamierzasz usunąć tę zasadę dotyczącą zasobów:", "AllowedHosts": "Dozwolone hosty", @@ -2051,10 +2054,10 @@ "MyAccountInformation": "Zmień informacje o użytkowniku", "MyEnvironments": "Moje Środowiska", "MyResources": "Mój całkowity limit zasobów", - "MyResourcesDescription": "

Ten panel pokazuje całkowite wykorzystanie zasobów i limity we wszystkich projektach i grupach zasobów.

Gdy stosowanych jest wiele limitów (domena, projekt lub para kluczy), do obliczeń używany jest najbardziej restrykcyjny limit.

", + "MyResourcesDescription": "

Ten panel wyświetla całkowitą liczbę aktualnie używanych i wolnych zasobów we wszystkich projektach i grupach zasobów.

W przypadku zastosowania wielu limitów (takich jak domena, projekt lub para kluczy) do obliczeń używany jest najbardziej restrykcyjny limit wolnych zasobów.

", "MyResourcesIn": "Moje zasoby", "MyResourcesInResourceGroup": "Moje zasoby w grupie zasobów", - "MyResourcesInResourceGroupDescription": "Ten panel pokazuje twoje bieżące wykorzystanie i pozostanie w wybranej grupie zasobów.", + "MyResourcesInResourceGroupDescription": "Ten panel pokazuje, ile zasobów wykorzystałeś i ile jest wolnych w wybranej grupie zasobów Twojego bieżącego projektu.", "NewPassword": "Nowe hasło", "NewPasswordAgain": "Powtórz nowe hasło)", "NewPasswordCannotBeSame": "Wprowadź hasło, które różni się od aktualnego hasła.", @@ -2087,7 +2090,7 @@ "TermsOfService": "Warunki usługi", "TotalResourcesIn": "Całkowite zasoby w", "TotalResourcesInResourceGroup": "Całkowite zasoby w grupie zasobów", - "TotalResourcesInResourceGroupDescription": "Ten panel pokazuje całkowite wykorzystane i pozostałe zasoby. \nWartości są obliczane przez dodanie użycia i pozostałych ilości wszystkich agentów za pomocą wybranej grupy zasobów.", + "TotalResourcesInResourceGroupDescription": "Ten panel pokazuje całkowitą liczbę wykorzystanych i wolnych zasobów w wybranej grupie zasobów. \nWartości obliczane są poprzez zsumowanie wykorzystanych i wolnych ilości wszystkich środków korzystających z danej grupy.", "TotpActivated": "Włączone 2FA", "Update": "Aktualizacja", "Usage": "Stosowanie", diff --git a/resources/i18n/pt-BR.json b/resources/i18n/pt-BR.json index e200f2a56a..c5d2fa9583 100644 --- a/resources/i18n/pt-BR.json +++ b/resources/i18n/pt-BR.json @@ -31,6 +31,10 @@ "Terminated": "Rescindido", "Utilization": "Utilização" }, + "agentStats": { + "AgentStats": "Estatísticas do Agente", + "AgentStatsDescription": "Este painel mostra todos os recursos usados ​​em todos os agentes do sistema. \nOs valores representam o total de recursos usados ​​por todas as sessões ativas." + }, "autoScalingRule": { "AddAutoScalingRule": "Adicionar regra de escala automática", "Comparator": "Comparador", @@ -218,6 +222,10 @@ "WarningLessRateLimit": "Se o valor do Limite de taxa for pequeno, as operações da API, como o início de sessão, podem ser bloqueadas.", "YouAreAboutToDeleteCredential": "Você está prestes a excluir a credencial deste usuário:" }, + "dashboard": { + "Free": "Livre", + "Used": "Usado" + }, "data": { "Active": "Ativo", "Add": "Adicionar", @@ -1170,11 +1178,6 @@ "TypeResourceGroupNameToDelete": "Digite o nome do grupo de recursos para excluir", "WsproxyAddress": "Endereço do servidor WSProxy" }, - "resourcePanel": { - "Limit": "Limite", - "RemainingNumber": "RMaining", - "UsingNumber": "Usando" - }, "resourcePolicy": { "AboutToDeleteResourcePolicy": "Você está prestes a excluir esta política de recursos:", "AllowedHosts": "Hosts permitidos", @@ -2052,10 +2055,10 @@ "MyAccountInformation": "Alterar as informações do usuário", "MyEnvironments": "Meus ambientes", "MyResources": "Meu limite total de recursos", - "MyResourcesDescription": "

Este painel mostra o uso total de recursos e limites em todos os projetos e grupos de recursos.

Quando múltiplos limites são aplicados (como domínio, projeto ou par de chaves), o limite mais restritivo é usado para o cálculo.

", + "MyResourcesDescription": "

Este painel exibe o total de recursos atualmente usados ​​e gratuitos em todos os projetos e grupos de recursos.

Quando vários limites são aplicados (como domínio, projeto ou par de chaves), o cálculo usa o limite de recursos livres mais restritivo.

", "MyResourcesIn": "Meus recursos em", "MyResourcesInResourceGroup": "Meus recursos em grupo de recursos", - "MyResourcesInResourceGroupDescription": "Este painel mostra o uso atual do meu recurso e permanecendo no grupo de recursos selecionados.", + "MyResourcesInResourceGroupDescription": "Este painel mostra quantos recursos você usou e quantos estão livres no grupo de recursos selecionado do seu projeto atual.", "NewPassword": "Nova Senha", "NewPasswordAgain": "Nova senha (novamente)", "NewPasswordCannotBeSame": "Introduza uma palavra-passe diferente da sua palavra-passe atual.", @@ -2088,7 +2091,7 @@ "TermsOfService": "Termos de serviço", "TotalResourcesIn": "Recursos totais em", "TotalResourcesInResourceGroup": "Recursos totais no grupo de recursos", - "TotalResourcesInResourceGroupDescription": "Este painel mostra o total de recursos usados ​​e restantes. \nOs valores são calculados adicionando o uso e as quantidades restantes de todos os agentes usando o grupo de recursos selecionados.", + "TotalResourcesInResourceGroupDescription": "Este painel mostra o total de recursos usados ​​e livres no grupo de recursos selecionado. \nOs valores são calculados somando os valores utilizados e livres de todos os agentes que utilizam esse grupo.", "TotpActivated": "2FA ativado", "Update": "Atualizar", "Usage": "Uso", diff --git a/resources/i18n/pt.json b/resources/i18n/pt.json index aa42ecc5de..c53c4c9c13 100644 --- a/resources/i18n/pt.json +++ b/resources/i18n/pt.json @@ -31,6 +31,10 @@ "Terminated": "Rescindido", "Utilization": "Utilização" }, + "agentStats": { + "AgentStats": "Estatísticas do Agente", + "AgentStatsDescription": "Este painel mostra todos os recursos usados ​​em todos os agentes do sistema. \nOs valores representam o total de recursos usados ​​por todas as sessões ativas." + }, "autoScalingRule": { "AddAutoScalingRule": "Adicionar regra de escala automática", "Comparator": "Comparador", @@ -218,6 +222,10 @@ "WarningLessRateLimit": "Se o valor do Limite de taxa for pequeno, as operações da API, como o início de sessão, podem ser bloqueadas.", "YouAreAboutToDeleteCredential": "Você está prestes a excluir a credencial deste usuário:" }, + "dashboard": { + "Free": "Livre", + "Used": "Usado" + }, "data": { "Active": "Ativo", "Add": "Adicionar", @@ -1169,11 +1177,6 @@ "TypeResourceGroupNameToDelete": "Digite o nome do grupo de recursos para excluir", "WsproxyAddress": "Endereço do servidor WSProxy" }, - "resourcePanel": { - "Limit": "Limite", - "RemainingNumber": "RMaining", - "UsingNumber": "Usando" - }, "resourcePolicy": { "AboutToDeleteResourcePolicy": "Você está prestes a excluir esta política de recursos:", "AllowedHosts": "Hosts permitidos", @@ -2051,10 +2054,10 @@ "MyAccountInformation": "Alterar as informações do usuário", "MyEnvironments": "Meus ambientes", "MyResources": "Meu limite total de recursos", - "MyResourcesDescription": "

Este painel mostra o uso total de recursos e limites em todos os projetos e grupos de recursos.

Quando múltiplos limites são aplicados (como domínio, projeto ou par de chaves), o limite mais restritivo é usado para o cálculo.

", + "MyResourcesDescription": "

Este painel exibe o total de recursos atualmente usados ​​e gratuitos em todos os projetos e grupos de recursos.

Quando vários limites são aplicados (como domínio, projeto ou par de chaves), o cálculo usa o limite de recursos livres mais restritivo.

", "MyResourcesIn": "Meus recursos em", "MyResourcesInResourceGroup": "Meus recursos em grupo de recursos", - "MyResourcesInResourceGroupDescription": "Este painel mostra o uso atual do meu recurso e permanecendo no grupo de recursos selecionados.", + "MyResourcesInResourceGroupDescription": "Este painel mostra quantos recursos você usou e quantos estão livres no grupo de recursos selecionado do seu projeto atual.", "NewPassword": "Nova Senha", "NewPasswordAgain": "Nova senha (novamente)", "NewPasswordCannotBeSame": "Introduza uma palavra-passe diferente da sua palavra-passe atual.", @@ -2087,7 +2090,7 @@ "TermsOfService": "Termos de serviço", "TotalResourcesIn": "Recursos totais em", "TotalResourcesInResourceGroup": "Recursos totais no grupo de recursos", - "TotalResourcesInResourceGroupDescription": "Este painel mostra o total de recursos usados ​​e restantes. \nOs valores são calculados adicionando o uso e as quantidades restantes de todos os agentes usando o grupo de recursos selecionados.", + "TotalResourcesInResourceGroupDescription": "Este painel mostra o total de recursos usados ​​e livres no grupo de recursos selecionado. \nOs valores são calculados somando os valores utilizados e livres de todos os agentes que utilizam esse grupo.", "TotpActivated": "2FA ativado", "Update": "Atualizar", "Usage": "Uso", diff --git a/resources/i18n/ru.json b/resources/i18n/ru.json index 030f9cfb4f..733f072a7e 100644 --- a/resources/i18n/ru.json +++ b/resources/i18n/ru.json @@ -31,6 +31,10 @@ "Terminated": "Прекращено", "Utilization": "Утилизация" }, + "agentStats": { + "AgentStats": "Статистика агента", + "AgentStatsDescription": "На этой панели показаны все используемые ресурсы всеми агентами в системе. \nЗначения представляют общий объем использованных ресурсов всеми активными сеансами." + }, "autoScalingRule": { "AddAutoScalingRule": "Добавить правило масштабирования автоматического масштабирования", "Comparator": "Компаратор", @@ -218,6 +222,10 @@ "WarningLessRateLimit": "Если значение Rate Limit мало, то такие операции API, как вход в систему, могут быть заблокированы.", "YouAreAboutToDeleteCredential": "Вы собираетесь удалить учетные данные этого пользователя:" }, + "dashboard": { + "Free": "Бесплатно", + "Used": "Использовал" + }, "data": { "Active": "Активный", "Add": "Добавить", @@ -1169,11 +1177,6 @@ "TypeResourceGroupNameToDelete": "Введите имя группы ресурсов для удаления", "WsproxyAddress": "Адрес WSProxy-сервера" }, - "resourcePanel": { - "Limit": "Предел", - "RemainingNumber": "Rmaing", - "UsingNumber": "С использованием" - }, "resourcePolicy": { "AboutToDeleteResourcePolicy": "Вы собираетесь удалить эту политику ресурсов:", "AllowedHosts": "Разрешенные хосты", @@ -2051,10 +2054,10 @@ "MyAccountInformation": "Изменить информацию о пользователе", "MyEnvironments": "Моя среда", "MyResources": "Мой общий предел ресурсов", - "MyResourcesDescription": "

Эта панель показывает общее использование ресурсов и лимиты по всем проектам и группам ресурсов.

При применении нескольких ограничений (домен, проект или ключевая пара), для расчета используется наиболее строгое ограничение.

", + "MyResourcesDescription": "

На этой панели отображается общее количество используемых и свободных ресурсов для всех проектов и групп ресурсов.

При применении нескольких ограничений (например, домена, проекта или пары ключей) при расчете используется наиболее строгий лимит свободных ресурсов.

", "MyResourcesIn": "Мои ресурсы в", "MyResourcesInResourceGroup": "Мои ресурсы в ресурсной группе", - "MyResourcesInResourceGroupDescription": "Эта панель показывает ваше текущее использование моего ресурса и оставшееся в выбранной группе ресурсов.", + "MyResourcesInResourceGroupDescription": "На этой панели показано, сколько ресурсов вы использовали и сколько свободно в выбранной группе ресурсов вашего текущего проекта.", "NewPassword": "Новый пароль", "NewPasswordAgain": "Новый пароль (ещё раз)", "NewPasswordCannotBeSame": "Пожалуйста, введите пароль, отличный от Вашего текущего пароля.", @@ -2087,7 +2090,7 @@ "TermsOfService": "Условия использования", "TotalResourcesIn": "Общие ресурсы в", "TotalResourcesInResourceGroup": "Общие ресурсы в ресурсной группе", - "TotalResourcesInResourceGroupDescription": "На этой панели показаны общие и оставшиеся ресурсы. \nЗначения рассчитываются путем добавления использования и оставшихся сумм всех агентов, использующих выбранную группу ресурсов.", + "TotalResourcesInResourceGroupDescription": "На этой панели показано общее количество использованных и свободных ресурсов в выбранной группе ресурсов. \nЗначения рассчитываются путем суммирования использованных и свободных количеств всех агентов, использующих эту группу.", "TotpActivated": "2FA Enabled", "Update": "Обновить", "Usage": "Использование", diff --git a/resources/i18n/th.json b/resources/i18n/th.json index 536f21d854..a67be69e29 100644 --- a/resources/i18n/th.json +++ b/resources/i18n/th.json @@ -31,6 +31,10 @@ "Terminated": "ยุติแล้ว", "Utilization": "การใช้งาน" }, + "agentStats": { + "AgentStats": "สถิติตัวแทน", + "AgentStatsDescription": "แผงนี้แสดงทรัพยากรที่ใช้ทั้งหมดจากตัวแทนทั้งหมดในระบบ \nค่านี้แสดงถึงทรัพยากรที่ใช้ทั้งหมดตามเซสชันที่ใช้งานอยู่ทั้งหมด" + }, "autoScalingRule": { "AddAutoScalingRule": "เพิ่มกฎการปรับขนาดอัตโนมัติ", "Comparator": "เครื่องเปรียบเทียบ", @@ -218,6 +222,10 @@ "WarningLessRateLimit": "หากค่าขีดจำกัดอัตราน้อยเกินไป การดำเนินการ API เช่น การเข้าสู่ระบบอาจถูกบล็อก", "YouAreAboutToDeleteCredential": "คุณกำลังจะลบข้อมูลรับรองของผู้ใช้รายนี้:" }, + "dashboard": { + "Free": "ฟรี", + "Used": "ใช้แล้ว" + }, "data": { "Active": "คล่องแคล่ว", "Add": "เพิ่ม", @@ -1159,11 +1167,6 @@ "TypeResourceGroupNameToDelete": "พิมพ์ชื่อกลุ่มทรัพยากรเพื่อลบ", "WsproxyAddress": "ที่อยู่เซิร์ฟเวอร์ WSProxy" }, - "resourcePanel": { - "Limit": "จำกัด", - "RemainingNumber": "Rmailing", - "UsingNumber": "โดยใช้" - }, "resourcePolicy": { "AboutToDeleteResourcePolicy": "คุณกำลังจะลบนโยบายทรัพยากรนี้: ", "AllowedHosts": "โฮสต์ที่อนุญาต", @@ -2035,10 +2038,10 @@ "MyAccountInformation": "ข้อมูลบัญชีของฉัน", "MyEnvironments": "สภาพแวดล้อมของฉัน", "MyResources": "ขีด จำกัด ทรัพยากรทั้งหมดของฉัน", - "MyResourcesDescription": "

พาเนลนี้แสดงการใช้ทรัพยากรทั้งหมดและขีดจำกัดในทุกโครงการและกลุ่มทรัพยากร

เมื่อมีการใช้ขีดจำกัดหลายประการ (เช่น โดเมน โครงการ หรือคู่คีย์) จะใช้ขีดจำกัดที่เข้มงวดที่สุดในการคำนวณ

", + "MyResourcesDescription": "

แผงนี้แสดงทรัพยากรทั้งหมดที่ใช้ในปัจจุบันและว่างในทุกโปรเจ็กต์และกลุ่มทรัพยากร

เมื่อมีการใช้ขีดจำกัดหลายรายการ (เช่น โดเมน โปรเจ็กต์ หรือคู่คีย์) การคำนวณจะใช้ขีดจำกัดทรัพยากรฟรีที่มีข้อจำกัดมากที่สุด

", "MyResourcesIn": "ทรัพยากรของฉันใน", "MyResourcesInResourceGroup": "ทรัพยากรของฉันในกลุ่มทรัพยากร", - "MyResourcesInResourceGroupDescription": "แผงนี้แสดงการใช้ทรัพยากรของฉันในปัจจุบันและยังคงอยู่ในกลุ่มทรัพยากรที่เลือก", + "MyResourcesInResourceGroupDescription": "แผงนี้แสดงจำนวนทรัพยากรที่คุณใช้และปริมาณที่ว่างในกลุ่มทรัพยากรที่เลือกของโครงการปัจจุบันของคุณ", "NewPassword": "รหัสผ่านใหม่", "NewPasswordAgain": "รหัสผ่านใหม่ (อีกครั้ง)", "NewPasswordCannotBeSame": "กรุณาใส่รหัสผ่านที่แตกต่างจากรหัสผ่านปัจจุบันของคุณ", @@ -2071,7 +2074,7 @@ "TermsOfService": "ข้อตกลงการใช้บริการ", "TotalResourcesIn": "ทรัพยากรทั้งหมดใน", "TotalResourcesInResourceGroup": "ทรัพยากรทั้งหมดในกลุ่มทรัพยากร", - "TotalResourcesInResourceGroupDescription": "แผงนี้แสดงทรัพยากรที่ใช้และที่เหลือทั้งหมด \nค่าจะถูกคำนวณโดยการเพิ่มการใช้งานและจำนวนที่เหลือของตัวแทนทั้งหมดโดยใช้กลุ่มทรัพยากรที่เลือก", + "TotalResourcesInResourceGroupDescription": "แผงนี้แสดงทรัพยากรที่ใช้ทั้งหมดและทรัพยากรว่างในกลุ่มทรัพยากรที่เลือก \nค่าจะคำนวณโดยการรวมจำนวนที่ใช้และจำนวนฟรีของตัวแทนทั้งหมดที่ใช้กลุ่มนั้น", "TotpActivated": "เปิดใช้งาน 2FA แล้ว", "Update": "อัปเดต", "Usage": "การใช้งาน", diff --git a/resources/i18n/tr.json b/resources/i18n/tr.json index bd37128b04..42854a0ff6 100644 --- a/resources/i18n/tr.json +++ b/resources/i18n/tr.json @@ -31,6 +31,10 @@ "Terminated": "Sonlandırılmış", "Utilization": "Kullanım" }, + "agentStats": { + "AgentStats": "Temsilci İstatistikleri", + "AgentStatsDescription": "Bu panel, sistemdeki tüm aracılarda kullanılan tüm kaynakları gösterir. \nDeğerler, tüm etkin oturumlar tarafından kullanılan toplam kaynakları temsil eder." + }, "autoScalingRule": { "AddAutoScalingRule": "Otomatik ölçeklendirme kuralı ekleyin", "Comparator": "Karşılaştırıcı", @@ -218,6 +222,10 @@ "WarningLessRateLimit": "Hız Sınırı değeri küçükse, oturum açma gibi API işlemleri engellenebilir.", "YouAreAboutToDeleteCredential": "Bu kullanıcının kimlik bilgilerini silmek üzeresiniz:" }, + "dashboard": { + "Free": "Özgür", + "Used": "Kullanılmış" + }, "data": { "Active": "Aktif", "Add": "Ekle", @@ -1170,11 +1178,6 @@ "TypeResourceGroupNameToDelete": "Silmek için kaynak grubu adını yazın", "WsproxyAddress": "WSProxy Sunucu Adresi" }, - "resourcePanel": { - "Limit": "Sınırlamak", - "RemainingNumber": "Zırhlı", - "UsingNumber": "Kullanma" - }, "resourcePolicy": { "AboutToDeleteResourcePolicy": "Bu kaynak politikasını silmek üzeresiniz:", "AllowedHosts": "İzin verilen ana bilgisayarlar", @@ -2052,10 +2055,10 @@ "MyAccountInformation": "Kullanıcı Bilgilerini Değiştir", "MyEnvironments": "Ortamlarım", "MyResources": "Toplam kaynak sınırım", - "MyResourcesDescription": "

Bu panel, tüm projeler ve kaynak gruplarındaki toplam kaynak kullanımınızı ve limitlerinizi gösterir.

Birden fazla limit uygulandığında (alan adı, proje veya anahtar çifti gibi), hesaplama için en kısıtlayıcı limit kullanılır.

", + "MyResourcesDescription": "

Bu panel, tüm projelerde ve kaynak gruplarında halihazırda kullanılan ve ücretsiz olan toplam kaynaklarınızı görüntüler.

Birden fazla sınır uygulandığında (etki alanı, proje veya anahtar çifti gibi), hesaplama en kısıtlayıcı ücretsiz kaynak sınırını kullanır.

", "MyResourcesIn": "Kaynaklarım", "MyResourcesInResourceGroup": "Kaynak Grubundaki Kaynaklarım", - "MyResourcesInResourceGroupDescription": "Bu panel, mevcut kaynak kullanımınızı ve seçilen kaynak grubunda kaldığınızı gösterir.", + "MyResourcesInResourceGroupDescription": "Bu panel, mevcut projenizin seçilen kaynak grubunda ne kadar kaynak kullandığınızı ve ne kadarının ücretsiz olduğunu gösterir.", "NewPassword": "Yeni Şifre", "NewPasswordAgain": "Yeni Şifre Tekrar)", "NewPasswordCannotBeSame": "Lütfen mevcut şifrenizden farklı bir şifre girin.", @@ -2088,7 +2091,7 @@ "TermsOfService": "Kullanım Şartları", "TotalResourcesIn": "Toplam Kaynaklar", "TotalResourcesInResourceGroup": "Kaynak Grubundaki Toplam Kaynaklar", - "TotalResourcesInResourceGroupDescription": "Bu panel, kullanılan ve kalan toplam kaynakları gösterir. \nDeğerler, seçilen kaynak grubunu kullanan tüm ajanların kullanımını ve kalan miktarlarını ekleyerek hesaplanır.", + "TotalResourcesInResourceGroupDescription": "Bu panel, seçilen kaynak grubundaki toplam kullanılan ve boş kaynakları gösterir. \nDeğerler, o grubu kullanan tüm acentelerin kullanılmış ve serbest miktarlarının toplanmasıyla hesaplanır.", "TotpActivated": "2FA Etkin", "Update": "Güncelleme", "Usage": "Kullanım", diff --git a/resources/i18n/vi.json b/resources/i18n/vi.json index 00093b6164..837ef2730c 100644 --- a/resources/i18n/vi.json +++ b/resources/i18n/vi.json @@ -31,6 +31,10 @@ "Terminated": "Đã chấm dứt", "Utilization": "Sử dụng" }, + "agentStats": { + "AgentStats": "Thống kê đại lý", + "AgentStatsDescription": "Bảng này hiển thị tất cả các tài nguyên được sử dụng trên tất cả các tổng đài viên trong hệ thống. \nCác giá trị đại diện cho tổng tài nguyên được sử dụng bởi tất cả các phiên hoạt động." + }, "autoScalingRule": { "AddAutoScalingRule": "Thêm quy tắc tỷ lệ tự động", "Comparator": "Người so sánh", @@ -218,6 +222,10 @@ "WarningLessRateLimit": "Nếu giá trị Giới hạn tốc độ nhỏ, các hoạt động API như đăng nhập có thể bị chặn.", "YouAreAboutToDeleteCredential": "Bạn sắp xóa thông tin xác thực của người dùng này:" }, + "dashboard": { + "Free": "Miễn phí", + "Used": "Đã sử dụng" + }, "data": { "Active": "Tích cực", "Add": "Thêm vào", @@ -1170,11 +1178,6 @@ "TypeResourceGroupNameToDelete": "Nhập tên nhóm tài nguyên để xóa", "WsproxyAddress": "Địa chỉ máy chủ WSProxy" }, - "resourcePanel": { - "Limit": "Giới hạn", - "RemainingNumber": "Rmaining", - "UsingNumber": "Sử dụng" - }, "resourcePolicy": { "AboutToDeleteResourcePolicy": "Bạn sắp xóa chính sách tài nguyên này:", "AllowedHosts": "Máy chủ được phép", @@ -2052,10 +2055,10 @@ "MyAccountInformation": "Thay đổi thông tin người dùng", "MyEnvironments": "Môi trường của tôi", "MyResources": "Tổng giới hạn tài nguyên của tôi", - "MyResourcesDescription": "

Bảng điều khiển này hiển thị tổng mức sử dụng tài nguyên và giới hạn trong tất cả các dự án và nhóm tài nguyên.

Khi áp dụng nhiều giới hạn (như domain, dự án hoặc cặp khóa), giới hạn nghiêm ngặt nhất được sử dụng để tính toán.

", + "MyResourcesDescription": "

Bảng này hiển thị tổng tài nguyên hiện đang được sử dụng và miễn phí trên tất cả các dự án và nhóm tài nguyên.

Khi áp dụng nhiều giới hạn (chẳng hạn như miền, dự án hoặc cặp khóa), phép tính sẽ sử dụng giới hạn tài nguyên miễn phí hạn chế nhất.

", "MyResourcesIn": "Tài nguyên của tôi trong", "MyResourcesInResourceGroup": "Tài nguyên của tôi trong nhóm tài nguyên", - "MyResourcesInResourceGroupDescription": "Bảng điều khiển này hiển thị việc sử dụng tài nguyên hiện tại của bạn và còn lại trong nhóm tài nguyên đã chọn.", + "MyResourcesInResourceGroupDescription": "Bảng này hiển thị lượng tài nguyên bạn đã sử dụng và lượng tài nguyên còn trống trong nhóm tài nguyên đã chọn của dự án hiện tại của bạn.", "NewPassword": "Mật khẩu mới", "NewPasswordAgain": "Mật khẩu mới (một lần nữa)", "NewPasswordCannotBeSame": "Vui lòng nhập mật khẩu khác với mật khẩu hiện tại của bạn.", @@ -2088,7 +2091,7 @@ "TermsOfService": "Điều khoản dịch vụ", "TotalResourcesIn": "Tổng tài nguyên trong", "TotalResourcesInResourceGroup": "Tổng tài nguyên trong nhóm tài nguyên", - "TotalResourcesInResourceGroupDescription": "Bảng điều khiển này cho thấy tổng tài nguyên được sử dụng và còn lại. \nCác giá trị được tính bằng cách thêm sử dụng và số lượng còn lại của tất cả các tác nhân bằng nhóm tài nguyên đã chọn.", + "TotalResourcesInResourceGroupDescription": "Bảng này hiển thị tổng số tài nguyên đã sử dụng và miễn phí trong nhóm tài nguyên đã chọn. \nCác giá trị được tính bằng cách tính tổng số tiền đã sử dụng và số tiền còn trống của tất cả các tác nhân sử dụng nhóm đó.", "TotpActivated": "Đã bật 2FA", "Update": "Cập nhật", "Usage": "Cách sử dụng", diff --git a/resources/i18n/zh-CN.json b/resources/i18n/zh-CN.json index 009f8e3b67..7e0f3b6af0 100644 --- a/resources/i18n/zh-CN.json +++ b/resources/i18n/zh-CN.json @@ -31,6 +31,10 @@ "Terminated": "已终止", "Utilization": "利用率" }, + "agentStats": { + "AgentStats": "代理统计", + "AgentStatsDescription": "此面板显示系统中所有代理的所有已使用资源。\n这些值表示所有活动会话使用的总资源。" + }, "autoScalingRule": { "AddAutoScalingRule": "添加自动缩放规则", "Comparator": "比较器", @@ -218,6 +222,10 @@ "WarningLessRateLimit": "如果速率限制值较小,可能会阻止登录等 API 操作。", "YouAreAboutToDeleteCredential": "您将要删除该用户的凭据:" }, + "dashboard": { + "Free": "自由的", + "Used": "用过的" + }, "data": { "Active": "积极的", "Add": "添加", @@ -1170,11 +1178,6 @@ "TypeResourceGroupNameToDelete": "输入要删除的资源组名称", "WsproxyAddress": "WSProxy 服务器地址" }, - "resourcePanel": { - "Limit": "限制", - "RemainingNumber": "rming", - "UsingNumber": "使用" - }, "resourcePolicy": { "AboutToDeleteResourcePolicy": "您即将删除此资源策略:", "AllowedHosts": "允许的主机", @@ -2052,10 +2055,10 @@ "MyAccountInformation": "更改用户信息", "MyEnvironments": "我的环境", "MyResources": "我的总资源限制", - "MyResourcesDescription": "

此面板显示所有项目和资源组的总资源使用量和限制。

当应用多个限制(如域、项目或密钥对)时,将根据最严格的限制进行计算。

", + "MyResourcesDescription": "

此面板显示您当前在所有项目和资源组中使用和免费的总资源。

应用多个限制(例如域、项目或密钥对)时,计算将使用最严格的免费资源限制。

", "MyResourcesIn": "我的资源", "MyResourcesInResourceGroup": "我在资源组中的资源", - "MyResourcesInResourceGroupDescription": "该面板显示您当前的我的资源使用情况,并保留在选定的资源组中。", + "MyResourcesInResourceGroupDescription": "此面板显示您当前项目的所选资源组中已使用了多少资源以及有多少可用资源。", "NewPassword": "新密码", "NewPasswordAgain": "确认新密码)", "NewPasswordCannotBeSame": "请输入与当前密码不同的密码。", @@ -2088,7 +2091,7 @@ "TermsOfService": "服务条款", "TotalResourcesIn": "总资源中", "TotalResourcesInResourceGroup": "资源组的总资源", - "TotalResourcesInResourceGroupDescription": "该面板显示了使用的总和剩余资源。\n这些值是通过使用所选资源组添加所有代理的使用量和剩余数量来计算的。", + "TotalResourcesInResourceGroupDescription": "此面板显示所选资源组中已用资源和可用资源的总数。\n这些值是通过将使用该组的所有代理的已用量和可用量相加来计算的。", "TotpActivated": "已启用 2FA", "Update": "更新", "Usage": "用法", diff --git a/resources/i18n/zh-TW.json b/resources/i18n/zh-TW.json index 3ebd4827be..71c3fb6a11 100644 --- a/resources/i18n/zh-TW.json +++ b/resources/i18n/zh-TW.json @@ -31,6 +31,10 @@ "Terminated": "已終止", "Utilization": "利用率" }, + "agentStats": { + "AgentStats": "代理統計", + "AgentStatsDescription": "此面板顯示系統中所有代理的所有已使用資源。這些值表示所有活動會話使用的總資源。" + }, "autoScalingRule": { "AddAutoScalingRule": "添加自動縮放規則", "Comparator": "比較器", @@ -218,6 +222,10 @@ "WarningLessRateLimit": "如果速率限制值较小,可能会阻止登录等 API 操作。", "YouAreAboutToDeleteCredential": "您將要刪除該使用者的憑證:" }, + "dashboard": { + "Free": "自由的", + "Used": "用過的" + }, "data": { "Active": "積極的", "Add": "添加", @@ -1169,11 +1177,6 @@ "TypeResourceGroupNameToDelete": "輸入要刪除的資源組名稱", "WsproxyAddress": "WSProxy 服务器地址" }, - "resourcePanel": { - "Limit": "限制", - "RemainingNumber": "rming", - "UsingNumber": "使用" - }, "resourcePolicy": { "AboutToDeleteResourcePolicy": "您即將刪除此資源策略:", "AllowedHosts": "允許的主機", @@ -2050,10 +2053,10 @@ "MyAccountInformation": "更改用戶信息", "MyEnvironments": "我的環境", "MyResources": "我的總資源限制", - "MyResourcesDescription": "

此面板顯示所有專案和資源群組的總資源使用量和限制。

當應用多個限制(如網域、專案或金鑰對)時,將根據最嚴格的限制進行計算。

", + "MyResourcesDescription": "

此面板顯示您當前在所有項目和資源組中使用和免費的總資源。

應用多個限制(例如域、項目或密鑰對)時,計算將使用最嚴格的免費資源限制。

", "MyResourcesIn": "我的資源", "MyResourcesInResourceGroup": "我在資源組中的資源", - "MyResourcesInResourceGroupDescription": "該面板顯示您當前的我的資源使用情況,並保留在選定的資源組中。", + "MyResourcesInResourceGroupDescription": "此面板顯示您當前項目的所選資源組中已使用了多少資源以及有多少可用資源。", "NewPassword": "新密碼", "NewPasswordAgain": "確認新密碼)", "NewPasswordCannotBeSame": "请输入与当前密码不同的密码。", @@ -2086,7 +2089,7 @@ "TermsOfService": "服務條款", "TotalResourcesIn": "總資源中", "TotalResourcesInResourceGroup": "資源組的總資源", - "TotalResourcesInResourceGroupDescription": "該面板顯示了使用的總和剩餘資源。這些值是通過使用所選資源組添加所有代理的使用量和剩餘數量來計算的。", + "TotalResourcesInResourceGroupDescription": "此面板顯示所選資源組中已用資源和可用資源的總數。這些值是通過將使用該組的所有代理的已用量和可用量相加來計算的。", "TotpActivated": "已启用 2FA", "Update": "更新", "Usage": "用法", diff --git a/src/lib/backend.ai-client-esm.ts b/src/lib/backend.ai-client-esm.ts index 68afc7d17e..c1b736069c 100644 --- a/src/lib/backend.ai-client-esm.ts +++ b/src/lib/backend.ai-client-esm.ts @@ -821,6 +821,9 @@ class Client { if (this.isManagerVersionCompatibleWith('25.12.0')) { this._features['reservoir'] = true; } + if (this.isManagerVersionCompatibleWith('25.15.0')) { + this._features['agent-stats'] = true; + } } /**