mirror of
https://github.com/langgenius/dify.git
synced 2026-05-30 05:37:48 +08:00
Compare commits
26 Commits
feat/ui-on
...
feat/agent
| Author | SHA1 | Date | |
|---|---|---|---|
| f8cc85ce28 | |||
| 2d4e494162 | |||
| 5e1fac09bb | |||
| 8c7540f698 | |||
| 89571bd241 | |||
| afee58cca7 | |||
| 76a55535f2 | |||
| 29cb993042 | |||
| 00581a4daa | |||
| bfc71bb087 | |||
| a95a6ea263 | |||
| 264e97a4c2 | |||
| 43f67ef2d1 | |||
| c118fe9ad2 | |||
| 7e34e2347a | |||
| 33f6b0c9aa | |||
| 2b130d0d2a | |||
| 4f9adfb9ae | |||
| f3974d6176 | |||
| cb2e404eb6 | |||
| 14e7fc87e4 | |||
| 40b4c3476d | |||
| 1c641d2b44 | |||
| c3c9a349cc | |||
| 169293c8da | |||
| bcc4b208c7 |
@ -60,6 +60,7 @@ describe('RoleRouteGuard', () => {
|
||||
it.each([
|
||||
'/',
|
||||
'/apps',
|
||||
'/roster',
|
||||
'/tools',
|
||||
'/integrations/model-provider',
|
||||
])('should redirect dataset operator on guarded route %s', async (pathname) => {
|
||||
|
||||
@ -6,7 +6,7 @@ import Loading from '@/app/components/base/loading'
|
||||
import { useAppContext } from '@/context/app-context'
|
||||
import { usePathname, useRouter } from '@/next/navigation'
|
||||
|
||||
const datasetOperatorRedirectRoutes = ['/', '/apps', '/app', '/explore', '/tools', '/integrations'] as const
|
||||
const datasetOperatorRedirectRoutes = ['/', '/apps', '/app', '/roster', '/explore', '/tools', '/integrations'] as const
|
||||
|
||||
const isPathUnderRoute = (pathname: string, route: string) => pathname === route || pathname.startsWith(`${route}/`)
|
||||
|
||||
|
||||
13
web/app/(commonLayout)/roster/[agentId]/access/page.tsx
Normal file
13
web/app/(commonLayout)/roster/[agentId]/access/page.tsx
Normal file
@ -0,0 +1,13 @@
|
||||
import { AgentDetailPage } from '@/features/agent-v2/agent-detail/page'
|
||||
|
||||
type PageProps = {
|
||||
params: Promise<{ agentId: string }>
|
||||
}
|
||||
|
||||
export default async function Page({
|
||||
params,
|
||||
}: PageProps) {
|
||||
const { agentId } = await params
|
||||
|
||||
return <AgentDetailPage agentId={agentId} section="access" />
|
||||
}
|
||||
13
web/app/(commonLayout)/roster/[agentId]/configure/page.tsx
Normal file
13
web/app/(commonLayout)/roster/[agentId]/configure/page.tsx
Normal file
@ -0,0 +1,13 @@
|
||||
import { AgentDetailPage } from '@/features/agent-v2/agent-detail/page'
|
||||
|
||||
type PageProps = {
|
||||
params: Promise<{ agentId: string }>
|
||||
}
|
||||
|
||||
export default async function Page({
|
||||
params,
|
||||
}: PageProps) {
|
||||
const { agentId } = await params
|
||||
|
||||
return <AgentDetailPage agentId={agentId} section="configure" />
|
||||
}
|
||||
20
web/app/(commonLayout)/roster/[agentId]/layout.tsx
Normal file
20
web/app/(commonLayout)/roster/[agentId]/layout.tsx
Normal file
@ -0,0 +1,20 @@
|
||||
import type { ReactNode } from 'react'
|
||||
import { AgentDetailLayout } from '@/features/agent-v2/agent-detail/layout'
|
||||
|
||||
type LayoutProps = {
|
||||
children: ReactNode
|
||||
params: Promise<{ agentId: string }>
|
||||
}
|
||||
|
||||
export default async function Layout({
|
||||
children,
|
||||
params,
|
||||
}: LayoutProps) {
|
||||
const { agentId } = await params
|
||||
|
||||
return (
|
||||
<AgentDetailLayout agentId={agentId}>
|
||||
{children}
|
||||
</AgentDetailLayout>
|
||||
)
|
||||
}
|
||||
13
web/app/(commonLayout)/roster/[agentId]/logs/page.tsx
Normal file
13
web/app/(commonLayout)/roster/[agentId]/logs/page.tsx
Normal file
@ -0,0 +1,13 @@
|
||||
import { AgentDetailPage } from '@/features/agent-v2/agent-detail/page'
|
||||
|
||||
type PageProps = {
|
||||
params: Promise<{ agentId: string }>
|
||||
}
|
||||
|
||||
export default async function Page({
|
||||
params,
|
||||
}: PageProps) {
|
||||
const { agentId } = await params
|
||||
|
||||
return <AgentDetailPage agentId={agentId} section="logs" />
|
||||
}
|
||||
13
web/app/(commonLayout)/roster/[agentId]/monitoring/page.tsx
Normal file
13
web/app/(commonLayout)/roster/[agentId]/monitoring/page.tsx
Normal file
@ -0,0 +1,13 @@
|
||||
import { AgentDetailPage } from '@/features/agent-v2/agent-detail/page'
|
||||
|
||||
type PageProps = {
|
||||
params: Promise<{ agentId: string }>
|
||||
}
|
||||
|
||||
export default async function Page({
|
||||
params,
|
||||
}: PageProps) {
|
||||
const { agentId } = await params
|
||||
|
||||
return <AgentDetailPage agentId={agentId} section="monitoring" />
|
||||
}
|
||||
13
web/app/(commonLayout)/roster/[agentId]/page.tsx
Normal file
13
web/app/(commonLayout)/roster/[agentId]/page.tsx
Normal file
@ -0,0 +1,13 @@
|
||||
import { redirect } from '@/next/navigation'
|
||||
|
||||
type PageProps = {
|
||||
params: Promise<{ agentId: string }>
|
||||
}
|
||||
|
||||
export default async function Page({
|
||||
params,
|
||||
}: PageProps) {
|
||||
const { agentId } = await params
|
||||
|
||||
redirect(`/roster/${agentId}/configure`)
|
||||
}
|
||||
5
web/app/(commonLayout)/roster/page.tsx
Normal file
5
web/app/(commonLayout)/roster/page.tsx
Normal file
@ -0,0 +1,5 @@
|
||||
import RosterPage from '@/features/agent-v2/roster/page'
|
||||
|
||||
export default function Page() {
|
||||
return <RosterPage />
|
||||
}
|
||||
@ -119,6 +119,11 @@ vi.mock('@/app/components/app-sidebar/dataset-detail-top', () => ({
|
||||
default: () => <div data-testid="dataset-detail-top" />,
|
||||
}))
|
||||
|
||||
vi.mock('@/features/agent-v2/agent-detail/navigation', () => ({
|
||||
AgentDetailSection: () => <div data-testid="agent-detail-section" />,
|
||||
AgentDetailTop: () => <div data-testid="agent-detail-top" />,
|
||||
}))
|
||||
|
||||
vi.mock('@/context/i18n', () => ({
|
||||
useLocale: () => 'en-US',
|
||||
useDocLink: () => (path: string) => `https://docs.dify.ai${path}`,
|
||||
@ -262,6 +267,7 @@ describe('MainNav', () => {
|
||||
expect(screen.getByRole('button', { name: 'common.account.account' })).not.toHaveTextContent(Plan.team)
|
||||
expect(screen.getByRole('link', { name: /common.mainNav.home/ })).toHaveAttribute('href', '/')
|
||||
expect(screen.getByRole('link', { name: /common.menus.apps/ })).toHaveAttribute('href', '/apps')
|
||||
expect(screen.getByRole('link', { name: /common.menus.roster/ })).toHaveAttribute('href', '/roster')
|
||||
expect(screen.getByRole('link', { name: /common.menus.datasets/ })).toHaveAttribute('href', '/datasets')
|
||||
expect(screen.getByRole('link', { name: /common.mainNav.integrations/ })).toHaveAttribute('href', '/integrations/model-provider')
|
||||
expect(screen.getByRole('link', { name: /common.mainNav.marketplace/ })).toHaveAttribute('href', '/marketplace')
|
||||
@ -326,6 +332,7 @@ describe('MainNav', () => {
|
||||
|
||||
expect(screen.queryByRole('link', { name: /common.mainNav.home/ })).not.toBeInTheDocument()
|
||||
expect(screen.queryByRole('link', { name: /common.menus.apps/ })).not.toBeInTheDocument()
|
||||
expect(screen.queryByRole('link', { name: /common.menus.roster/ })).not.toBeInTheDocument()
|
||||
expect(screen.getByRole('link', { name: /common.menus.datasets/ })).toHaveAttribute('href', '/datasets')
|
||||
expect(screen.queryByRole('link', { name: /common.mainNav.integrations/ })).not.toBeInTheDocument()
|
||||
expect(screen.getByRole('link', { name: /common.mainNav.marketplace/ })).toHaveAttribute('href', '/marketplace')
|
||||
@ -349,6 +356,7 @@ describe('MainNav', () => {
|
||||
|
||||
expect(screen.getByRole('link', { name: /common.mainNav.home/ })).toBeInTheDocument()
|
||||
expect(screen.getByRole('link', { name: /common.menus.apps/ })).toBeInTheDocument()
|
||||
expect(screen.getByRole('link', { name: /common.menus.roster/ })).toBeInTheDocument()
|
||||
expect(screen.queryByRole('link', { name: /common.menus.datasets/ })).not.toBeInTheDocument()
|
||||
expect(screen.getByRole('link', { name: /common.mainNav.integrations/ })).toBeInTheDocument()
|
||||
expect(screen.getByRole('link', { name: /common.mainNav.marketplace/ })).toBeInTheDocument()
|
||||
@ -393,6 +401,18 @@ describe('MainNav', () => {
|
||||
expect(screen.queryByRole('link', { name: /common.menus.datasets/ })).not.toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('replaces global navigation with agent detail navigation on roster detail routes', () => {
|
||||
mockPathname = '/roster/agent-1/configure'
|
||||
|
||||
renderMainNav()
|
||||
|
||||
expect(screen.getByTestId('agent-detail-top')).toBeInTheDocument()
|
||||
expect(screen.getByTestId('agent-detail-section')).toBeInTheDocument()
|
||||
expect(screen.getByRole('complementary')).toHaveClass('bg-components-panel-bg-blur')
|
||||
expect(screen.queryByRole('button', { name: 'common.mainNav.workspace.openMenu' })).not.toBeInTheDocument()
|
||||
expect(screen.queryByRole('link', { name: /common.menus.roster/ })).not.toBeInTheDocument()
|
||||
})
|
||||
|
||||
it.each([
|
||||
'/datasets/create',
|
||||
'/datasets/create-from-pipeline',
|
||||
@ -419,6 +439,16 @@ describe('MainNav', () => {
|
||||
expect(marketplaceLink).toHaveClass(activeEdgeClassName)
|
||||
})
|
||||
|
||||
it('marks roster active on roster routes', () => {
|
||||
mockPathname = '/roster'
|
||||
|
||||
renderMainNav()
|
||||
|
||||
const rosterLink = screen.getByRole('link', { name: /common.menus.roster/ })
|
||||
expect(rosterLink).toHaveClass(activeEdgeClassName)
|
||||
expect(rosterLink).toHaveAttribute('aria-current', 'page')
|
||||
})
|
||||
|
||||
it('applies the Figma glass active state to the Home route', () => {
|
||||
mockPathname = '/'
|
||||
|
||||
|
||||
@ -13,6 +13,7 @@ import DifyLogo from '@/app/components/base/logo/dify-logo'
|
||||
import EnvNav from '@/app/components/header/env-nav'
|
||||
import { buildIntegrationPath } from '@/app/components/integrations/routes'
|
||||
import { useAppContext } from '@/context/app-context'
|
||||
import { AgentDetailSection, AgentDetailTop } from '@/features/agent-v2/agent-detail/navigation'
|
||||
import Link from '@/next/link'
|
||||
import { usePathname } from '@/next/navigation'
|
||||
import { systemFeaturesQueryOptions } from '@/service/system-features'
|
||||
@ -41,6 +42,12 @@ const isDatasetDetailPathname = (pathname: string) => {
|
||||
return true
|
||||
}
|
||||
|
||||
const isAgentDetailPathname = (pathname: string) => {
|
||||
const [section, agentId] = pathname.split('/').filter(Boolean)
|
||||
|
||||
return section === 'roster' && !!agentId
|
||||
}
|
||||
|
||||
const MainNav = ({
|
||||
className,
|
||||
}: MainNavProps) => {
|
||||
@ -51,7 +58,8 @@ const MainNav = ({
|
||||
const showEnvTag = langGeniusVersionInfo.current_env === 'TESTING' || langGeniusVersionInfo.current_env === 'DEVELOPMENT'
|
||||
const showAppDetailNavigation = !isCurrentWorkspaceDatasetOperator && pathname.startsWith('/app/')
|
||||
const showDatasetDetailNavigation = isDatasetDetailPathname(pathname)
|
||||
const showDetailNavigation = showAppDetailNavigation || showDatasetDetailNavigation
|
||||
const showAgentDetailNavigation = !isCurrentWorkspaceDatasetOperator && isAgentDetailPathname(pathname)
|
||||
const showDetailNavigation = showAppDetailNavigation || showDatasetDetailNavigation || showAgentDetailNavigation
|
||||
const navItems = useMemo<MainNavItem[]>(() => [
|
||||
...(!isCurrentWorkspaceDatasetOperator
|
||||
? [
|
||||
@ -69,6 +77,13 @@ const MainNav = ({
|
||||
icon: 'i-custom-vender-main-nav-studio',
|
||||
activeIcon: 'i-custom-vender-main-nav-studio-active',
|
||||
},
|
||||
{
|
||||
href: '/roster',
|
||||
label: t('menus.roster', { ns: 'common' }),
|
||||
active: (path: string) => path.startsWith('/roster'),
|
||||
icon: 'i-custom-vender-solid-mediaAndDevices-robot',
|
||||
activeIcon: 'i-custom-vender-solid-mediaAndDevices-robot',
|
||||
},
|
||||
]
|
||||
: []),
|
||||
...((isCurrentWorkspaceEditor || isCurrentWorkspaceDatasetOperator)
|
||||
@ -102,23 +117,27 @@ const MainNav = ({
|
||||
},
|
||||
], [isCurrentWorkspaceDatasetOperator, isCurrentWorkspaceEditor, t])
|
||||
|
||||
const renderLogo = () => (
|
||||
<Link
|
||||
href="/"
|
||||
className="flex h-8 shrink-0 items-center overflow-hidden px-2 focus-visible:ring-1 focus-visible:ring-components-input-border-active focus-visible:outline-hidden"
|
||||
aria-label={systemFeatures.branding.enabled && systemFeatures.branding.application_title ? systemFeatures.branding.application_title : 'Dify'}
|
||||
>
|
||||
{systemFeatures.branding.enabled && systemFeatures.branding.workspace_logo
|
||||
? (
|
||||
<img
|
||||
src={systemFeatures.branding.workspace_logo}
|
||||
className="block h-5.5 w-auto object-contain"
|
||||
alt=""
|
||||
/>
|
||||
)
|
||||
: <DifyLogo alt="" />}
|
||||
</Link>
|
||||
)
|
||||
const renderLogo = () => {
|
||||
const appTitle = systemFeatures.branding.enabled && systemFeatures.branding.application_title ? systemFeatures.branding.application_title : 'Dify'
|
||||
|
||||
return (
|
||||
<Link
|
||||
href="/"
|
||||
className="flex h-8 shrink-0 items-center overflow-hidden px-2 focus-visible:ring-1 focus-visible:ring-components-input-border-active focus-visible:outline-hidden"
|
||||
aria-label={appTitle}
|
||||
>
|
||||
{systemFeatures.branding.enabled && systemFeatures.branding.workspace_logo
|
||||
? (
|
||||
<img
|
||||
src={systemFeatures.branding.workspace_logo}
|
||||
className="block h-5.5 w-auto object-contain"
|
||||
alt=""
|
||||
/>
|
||||
)
|
||||
: <DifyLogo alt="" />}
|
||||
</Link>
|
||||
)
|
||||
}
|
||||
|
||||
return (
|
||||
<aside
|
||||
@ -130,7 +149,7 @@ const MainNav = ({
|
||||
>
|
||||
<div className="flex min-h-0 flex-1 flex-col">
|
||||
{showDetailNavigation
|
||||
? showAppDetailNavigation ? <AppDetailTop /> : <DatasetDetailTop />
|
||||
? showAppDetailNavigation ? <AppDetailTop /> : showAgentDetailNavigation ? <AgentDetailTop /> : <DatasetDetailTop />
|
||||
: (
|
||||
<>
|
||||
<div className="flex items-center justify-between px-2 pt-4 pb-2">
|
||||
@ -143,7 +162,7 @@ const MainNav = ({
|
||||
</>
|
||||
)}
|
||||
{showDetailNavigation
|
||||
? showAppDetailNavigation ? <AppDetailSection /> : <DatasetDetailSection />
|
||||
? showAppDetailNavigation ? <AppDetailSection /> : showAgentDetailNavigation ? <AgentDetailSection /> : <DatasetDetailSection />
|
||||
: (
|
||||
<>
|
||||
<nav className="space-y-1 p-2">
|
||||
@ -160,7 +179,7 @@ const MainNav = ({
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
<div className="flex w-60 items-center justify-between bg-gradient-to-b from-background-body-transparent to-background-body to-50% py-3 pr-1 pl-3 backdrop-blur-[2px]">
|
||||
<div className="flex w-60 items-center justify-between bg-linear-to-b from-background-body-transparent to-background-body to-50% py-3 pr-1 pl-3 backdrop-blur-[2px]">
|
||||
<div className="flex min-w-0 items-center gap-1">
|
||||
<AccountSection />
|
||||
</div>
|
||||
|
||||
@ -15,6 +15,7 @@ type VersionHistoryItemProps = {
|
||||
onClick: (item: VersionHistory) => void
|
||||
handleClickActionMenuItem: (operation: VersionHistoryContextMenuOptions) => void
|
||||
isLast: boolean
|
||||
hideActionMenu?: boolean
|
||||
}
|
||||
|
||||
const formatVersion = (versionHistory: VersionHistory, latestVersionId: string): string => {
|
||||
@ -43,6 +44,7 @@ const VersionHistoryItem: React.FC<VersionHistoryItemProps> = ({
|
||||
onClick,
|
||||
handleClickActionMenuItem,
|
||||
isLast,
|
||||
hideActionMenu,
|
||||
}) => {
|
||||
const { t } = useTranslation()
|
||||
const [isHovering, setIsHovering] = useState(false)
|
||||
@ -78,6 +80,9 @@ const VersionHistoryItem: React.FC<VersionHistoryItemProps> = ({
|
||||
setOpen(false)
|
||||
}}
|
||||
onContextMenu={(e) => {
|
||||
if (hideActionMenu)
|
||||
return
|
||||
|
||||
e.preventDefault()
|
||||
setOpen(true)
|
||||
}}
|
||||
@ -123,7 +128,7 @@ const VersionHistoryItem: React.FC<VersionHistoryItemProps> = ({
|
||||
}
|
||||
</div>
|
||||
{/* Action Menu */}
|
||||
{!isDraft && isHovering && (
|
||||
{!hideActionMenu && !isDraft && isHovering && (
|
||||
<div className="absolute top-1 right-1">
|
||||
<ActionMenu
|
||||
isShowDelete={!isLatest}
|
||||
|
||||
72
web/features/agent-v2/__tests__/agent-detail-page.spec.tsx
Normal file
72
web/features/agent-v2/__tests__/agent-detail-page.spec.tsx
Normal file
@ -0,0 +1,72 @@
|
||||
import { fireEvent, render, screen } from '@testing-library/react'
|
||||
import { AgentDetailPage } from '../pages/agent-detail-page'
|
||||
|
||||
describe('AgentDetailPage', () => {
|
||||
it('renders configurable memory settings', () => {
|
||||
render(<AgentDetailPage section="configure" />)
|
||||
|
||||
expect(screen.getByRole('region', { name: 'agentV2.agentDetail.sections.configure' })).toBeInTheDocument()
|
||||
expect(screen.getByRole('heading', { name: 'agentV2.agentDetail.memorySettings.title' })).toBeInTheDocument()
|
||||
expect(screen.getByRole('button', { name: /agentV2\.agentDetail\.memorySettings\.strategies\.medium\.label/ })).toHaveAttribute('aria-pressed', 'true')
|
||||
expect(screen.getByRole('button', { name: /agentV2\.agentDetail\.memorySettings\.isolation\.perApp\.label/ })).toHaveAttribute('aria-pressed', 'true')
|
||||
expect(screen.getByRole('button', { name: /agentV2\.agentDetail\.memorySettings\.export\.download/ })).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('switches memory strategy and isolation choices', () => {
|
||||
render(<AgentDetailPage section="configure" />)
|
||||
|
||||
const economyStrategy = screen.getByRole('button', {
|
||||
name: /agentV2\.agentDetail\.memorySettings\.strategies\.economy\.label/,
|
||||
})
|
||||
const perRunIsolation = screen.getByRole('button', {
|
||||
name: /agentV2\.agentDetail\.memorySettings\.isolation\.perRun\.label/,
|
||||
})
|
||||
|
||||
fireEvent.click(economyStrategy)
|
||||
fireEvent.click(perRunIsolation)
|
||||
|
||||
expect(economyStrategy).toHaveAttribute('aria-pressed', 'true')
|
||||
expect(perRunIsolation).toHaveAttribute('aria-pressed', 'true')
|
||||
expect(screen.getByRole('button', {
|
||||
name: /agentV2\.agentDetail\.memorySettings\.strategies\.medium\.label/,
|
||||
})).toHaveAttribute('aria-pressed', 'false')
|
||||
expect(screen.getByRole('button', {
|
||||
name: /agentV2\.agentDetail\.memorySettings\.isolation\.perApp\.label/,
|
||||
})).toHaveAttribute('aria-pressed', 'false')
|
||||
})
|
||||
|
||||
it('renders the logs skeleton with filters and table rows', () => {
|
||||
render(<AgentDetailPage section="logs" />)
|
||||
|
||||
expect(screen.getByRole('region', { name: 'agentV2.agentDetail.sections.logs' })).toBeInTheDocument()
|
||||
expect(screen.getByRole('heading', { name: 'agentV2.agentDetail.logs.title' })).toBeInTheDocument()
|
||||
expect(screen.getByRole('combobox', {
|
||||
name: 'agentV2.agentDetail.logs.filters.status.label',
|
||||
})).toHaveTextContent('agentV2.agentDetail.logs.filters.status.all')
|
||||
expect(screen.getByRole('combobox', {
|
||||
name: 'agentV2.agentDetail.logs.filters.period.label',
|
||||
})).toHaveTextContent('agentV2.agentDetail.logs.filters.period.last7days')
|
||||
expect(screen.getByRole('textbox', {
|
||||
name: 'agentV2.agentDetail.logs.filters.search.label',
|
||||
})).toBeInTheDocument()
|
||||
expect(screen.getByRole('columnheader', { name: 'agentV2.agentDetail.logs.table.startTime' })).toBeInTheDocument()
|
||||
expect(screen.getByText('run_8f4e21')).toBeInTheDocument()
|
||||
expect(screen.getByRole('navigation', { name: 'Pagination' })).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('renders the monitoring layout with metric cards', () => {
|
||||
render(<AgentDetailPage section="monitoring" />)
|
||||
|
||||
expect(screen.getByRole('region', { name: 'agentV2.agentDetail.sections.monitoring' })).toBeInTheDocument()
|
||||
expect(screen.getByText('agentV2.agentDetail.monitoring.title')).toBeInTheDocument()
|
||||
expect(screen.getByText('agentV2.agentDetail.monitoring.metrics.totalRuns.title')).toBeInTheDocument()
|
||||
expect(screen.getByText('agentV2.agentDetail.monitoring.metrics.activeUsers.title')).toBeInTheDocument()
|
||||
expect(screen.getByText('agentV2.agentDetail.monitoring.metrics.tokenUsage.title')).toBeInTheDocument()
|
||||
expect(screen.getByText('agentV2.agentDetail.monitoring.metrics.avgInteractions.title')).toBeInTheDocument()
|
||||
|
||||
expect(screen.getByRole('combobox', {
|
||||
name: 'agentV2.agentDetail.monitoring.timeRangeLabel',
|
||||
})).toHaveTextContent('agentV2.agentDetail.monitoring.timeRanges.last7days')
|
||||
expect(screen.getAllByLabelText(/agentV2\.agentDetail\.monitoring\.metrics\..*\.explanation/)).toHaveLength(4)
|
||||
})
|
||||
})
|
||||
86
web/features/agent-v2/agent-detail/__tests__/layout.spec.tsx
Normal file
86
web/features/agent-v2/agent-detail/__tests__/layout.spec.tsx
Normal file
@ -0,0 +1,86 @@
|
||||
import { toast } from '@langgenius/dify-ui/toast'
|
||||
import { fireEvent, render, screen } from '@testing-library/react'
|
||||
import { AgentDetailLayout } from '../layout'
|
||||
|
||||
vi.mock('@langgenius/dify-ui/toast', () => ({
|
||||
toast: {
|
||||
success: vi.fn(),
|
||||
},
|
||||
}))
|
||||
|
||||
vi.mock('@/hooks/use-document-title', () => ({
|
||||
default: vi.fn(),
|
||||
}))
|
||||
|
||||
describe('AgentDetailLayout', () => {
|
||||
beforeEach(() => {
|
||||
vi.clearAllMocks()
|
||||
})
|
||||
|
||||
it('renders the detail shell without feature data', () => {
|
||||
render(
|
||||
<AgentDetailLayout agentId="agent-1">
|
||||
<section aria-label="content" />
|
||||
</AgentDetailLayout>,
|
||||
)
|
||||
|
||||
expect(screen.getByRole('heading', { name: 'agentV2.agentDetail.title' })).toBeInTheDocument()
|
||||
expect(screen.getByText(/agentV2\.agentDetail\.subtitle/)).toBeInTheDocument()
|
||||
expect(screen.getByRole('button', { name: 'agentV2.agentDetail.publish' })).toBeEnabled()
|
||||
expect(screen.getByLabelText('content')).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('shows publish menu actions from the publish button', async () => {
|
||||
render(
|
||||
<AgentDetailLayout agentId="agent-1">
|
||||
<section aria-label="content" />
|
||||
</AgentDetailLayout>,
|
||||
)
|
||||
|
||||
fireEvent.click(screen.getByRole('button', { name: 'agentV2.agentDetail.publish' }))
|
||||
|
||||
expect(await screen.findByText('agentV2.agentDetail.publishMenu.publishUpdate')).toBeInTheDocument()
|
||||
expect(screen.getByText('agentV2.agentDetail.publishMenu.publishUpdateDescription')).toBeInTheDocument()
|
||||
expect(screen.getByText('agentV2.agentDetail.publishMenu.saveAsNewAgent')).toBeInTheDocument()
|
||||
expect(screen.getByText('agentV2.agentDetail.publishMenu.saveAsNewAgentDescription')).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('shows success toast when publish menu actions are clicked', async () => {
|
||||
render(
|
||||
<AgentDetailLayout agentId="agent-1">
|
||||
<section aria-label="content" />
|
||||
</AgentDetailLayout>,
|
||||
)
|
||||
|
||||
fireEvent.click(screen.getByRole('button', { name: 'agentV2.agentDetail.publish' }))
|
||||
fireEvent.click(await screen.findByText('agentV2.agentDetail.publishMenu.publishUpdate'))
|
||||
|
||||
expect(toast.success).toHaveBeenCalledWith('common.api.success')
|
||||
|
||||
fireEvent.click(screen.getByRole('button', { name: 'agentV2.agentDetail.publish' }))
|
||||
fireEvent.click(await screen.findByText('agentV2.agentDetail.publishMenu.saveAsNewAgent'))
|
||||
|
||||
expect(toast.success).toHaveBeenCalledTimes(2)
|
||||
expect(toast.success).toHaveBeenLastCalledWith('common.api.success')
|
||||
})
|
||||
|
||||
it('opens mock version history from the history button', () => {
|
||||
render(
|
||||
<AgentDetailLayout agentId="agent-1">
|
||||
<section aria-label="content" />
|
||||
</AgentDetailLayout>,
|
||||
)
|
||||
|
||||
fireEvent.click(screen.getByRole('button', { name: 'workflow.common.versionHistory' }))
|
||||
|
||||
expect(screen.getByText('workflow.versionHistory.title')).toBeInTheDocument()
|
||||
expect(screen.getByText('workflow.versionHistory.currentDraft')).toBeInTheDocument()
|
||||
expect(screen.getByText('v1.4.0 Handoff rules')).toBeInTheDocument()
|
||||
expect(screen.getByText('Aligned escalation handoff rules and response boundaries.')).toBeInTheDocument()
|
||||
expect(screen.getByText('workflow.versionHistory.latest')).toBeInTheDocument()
|
||||
|
||||
fireEvent.click(screen.getByRole('button', { name: 'common.operation.close' }))
|
||||
|
||||
expect(screen.queryByText('workflow.versionHistory.title')).not.toBeInTheDocument()
|
||||
})
|
||||
})
|
||||
@ -0,0 +1,41 @@
|
||||
import type { Mock } from 'vitest'
|
||||
import { render, screen } from '@testing-library/react'
|
||||
import { usePathname, useRouter } from '@/next/navigation'
|
||||
import { AgentDetailSection, AgentDetailTop } from '../navigation'
|
||||
|
||||
vi.mock('@/next/navigation', async (importOriginal) => {
|
||||
const actual = await importOriginal<typeof import('@/next/navigation')>()
|
||||
return {
|
||||
...actual,
|
||||
usePathname: vi.fn(),
|
||||
useRouter: vi.fn(),
|
||||
}
|
||||
})
|
||||
|
||||
describe('Agent detail navigation', () => {
|
||||
beforeEach(() => {
|
||||
vi.clearAllMocks()
|
||||
;(useRouter as Mock).mockReturnValue({ back: vi.fn() })
|
||||
})
|
||||
|
||||
it('renders roster breadcrumb controls', () => {
|
||||
render(<AgentDetailTop />)
|
||||
|
||||
expect(screen.getByRole('link', { name: 'common.mainNav.home' })).toHaveAttribute('href', '/')
|
||||
expect(screen.getByRole('link', { name: 'common.menus.roster' })).toHaveAttribute('href', '/roster')
|
||||
expect(screen.getByRole('button', { name: 'app.gotoAnything.searchTitle' })).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('renders agent detail tabs from the route agent id', () => {
|
||||
;(usePathname as Mock).mockReturnValue('/roster/agent-1/logs')
|
||||
|
||||
render(<AgentDetailSection />)
|
||||
|
||||
expect(screen.getByRole('navigation', { name: 'agentV2.agentDetail.navigationLabel' })).toBeInTheDocument()
|
||||
expect(screen.getByRole('link', { name: 'agentV2.agentDetail.sections.configure' })).toHaveAttribute('href', '/roster/agent-1/configure')
|
||||
expect(screen.getByRole('link', { name: 'agentV2.agentDetail.sections.access' })).toHaveAttribute('href', '/roster/agent-1/access')
|
||||
expect(screen.getByRole('link', { name: 'agentV2.agentDetail.sections.logs' })).toHaveAttribute('href', '/roster/agent-1/logs')
|
||||
expect(screen.queryByRole('link', { name: 'agentV2.agentDetail.sections.annotation' })).not.toBeInTheDocument()
|
||||
expect(screen.getByRole('link', { name: 'agentV2.agentDetail.sections.monitoring' })).toHaveAttribute('href', '/roster/agent-1/monitoring')
|
||||
})
|
||||
})
|
||||
83
web/features/agent-v2/agent-detail/__tests__/page.spec.tsx
Normal file
83
web/features/agent-v2/agent-detail/__tests__/page.spec.tsx
Normal file
@ -0,0 +1,83 @@
|
||||
import type { Mock } from 'vitest'
|
||||
import { fireEvent, render, screen } from '@testing-library/react'
|
||||
import { usePathname, useRouter } from '@/next/navigation'
|
||||
import { AgentDetailPage } from '../page'
|
||||
|
||||
vi.mock('echarts-for-react', () => ({
|
||||
default: () => <div data-testid="agent-monitoring-chart" />,
|
||||
}))
|
||||
|
||||
vi.mock('@/next/navigation', async (importOriginal) => {
|
||||
const actual = await importOriginal<typeof import('@/next/navigation')>()
|
||||
return {
|
||||
...actual,
|
||||
usePathname: vi.fn(),
|
||||
useRouter: vi.fn(),
|
||||
}
|
||||
})
|
||||
|
||||
describe('AgentDetailPage', () => {
|
||||
const push = vi.fn()
|
||||
|
||||
beforeEach(() => {
|
||||
vi.clearAllMocks()
|
||||
;(usePathname as Mock).mockReturnValue('/roster/agent-1/access')
|
||||
;(useRouter as Mock).mockReturnValue({ push })
|
||||
})
|
||||
|
||||
it('renders the logs skeleton with filters and table rows', () => {
|
||||
render(<AgentDetailPage agentId="agent-1" section="logs" />)
|
||||
|
||||
expect(screen.getByRole('region', { name: 'agentV2.agentDetail.sections.logs' })).toBeInTheDocument()
|
||||
expect(screen.getByRole('heading', { name: 'agentV2.agentDetail.logs.title' })).toBeInTheDocument()
|
||||
expect(screen.getByRole('combobox', {
|
||||
name: 'agentV2.agentDetail.logs.filters.status.label',
|
||||
})).toHaveTextContent('agentV2.agentDetail.logs.filters.status.all')
|
||||
expect(screen.getByRole('combobox', {
|
||||
name: 'agentV2.agentDetail.logs.filters.period.label',
|
||||
})).toHaveTextContent('agentV2.agentDetail.logs.filters.period.last7days')
|
||||
expect(screen.getByRole('textbox', {
|
||||
name: 'agentV2.agentDetail.logs.filters.search.label',
|
||||
})).toBeInTheDocument()
|
||||
expect(screen.getByRole('columnheader', { name: 'agentV2.agentDetail.logs.table.startTime' })).toBeInTheDocument()
|
||||
expect(screen.getByText('run_8f4e21')).toBeInTheDocument()
|
||||
expect(screen.getByRole('navigation', { name: 'Pagination' })).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('renders the monitoring layout with metric cards', () => {
|
||||
render(<AgentDetailPage agentId="agent-1" section="monitoring" />)
|
||||
|
||||
expect(screen.getByRole('region', { name: 'agentV2.agentDetail.sections.monitoring' })).toBeInTheDocument()
|
||||
expect(screen.getByText('agentV2.agentDetail.monitoring.title')).toBeInTheDocument()
|
||||
expect(screen.getByRole('combobox', {
|
||||
name: 'agentV2.agentDetail.monitoring.timeRangeLabel',
|
||||
})).toHaveTextContent('agentV2.agentDetail.monitoring.timeRanges.today')
|
||||
expect(screen.getByRole('combobox', {
|
||||
name: 'agentV2.agentDetail.monitoring.sourceLabel',
|
||||
})).toHaveTextContent('agentV2.agentDetail.access.entries.webapp.name')
|
||||
expect(screen.getByText('agentV2.agentDetail.monitoring.metrics.totalConversations.title')).toBeInTheDocument()
|
||||
expect(screen.getByText('agentV2.agentDetail.monitoring.metrics.activeUsers.title')).toBeInTheDocument()
|
||||
expect(screen.getByText('agentV2.agentDetail.monitoring.metrics.avgSessionInteractions.title')).toBeInTheDocument()
|
||||
expect(screen.getByText('agentV2.agentDetail.monitoring.metrics.tokenOutputSpeed.title')).toBeInTheDocument()
|
||||
expect(screen.getByText('agentV2.agentDetail.monitoring.metrics.userSatisfactionRate.title')).toBeInTheDocument()
|
||||
expect(screen.getByText('agentV2.agentDetail.monitoring.metrics.tokenUsage.title')).toBeInTheDocument()
|
||||
expect(screen.getByText('agentV2.agentDetail.monitoring.metrics.totalMessages.title')).toBeInTheDocument()
|
||||
expect(screen.getAllByLabelText(/agentV2\.agentDetail\.monitoring\.metrics\..*\.explanation/)).toHaveLength(7)
|
||||
expect(screen.getAllByTestId('agent-monitoring-chart')).toHaveLength(7)
|
||||
})
|
||||
|
||||
it('routes access actions to the target tab', async () => {
|
||||
render(<AgentDetailPage agentId="agent-1" section="access" />)
|
||||
|
||||
expect(screen.getByRole('region', { name: 'agentV2.agentDetail.sections.access' })).toBeInTheDocument()
|
||||
expect(screen.getByRole('heading', { name: 'agentV2.agentDetail.access.title' })).toBeInTheDocument()
|
||||
expect(screen.getByText('agentV2.agentDetail.access.entries.webapp.name')).toBeInTheDocument()
|
||||
|
||||
fireEvent.click(screen.getAllByRole('button', {
|
||||
name: /agentV2\.agentDetail\.access\.moreActions/,
|
||||
})[0]!)
|
||||
fireEvent.click(await screen.findByText('agentV2.agentDetail.sections.logs'))
|
||||
|
||||
expect(push).toHaveBeenCalledWith('/roster/agent-1/logs')
|
||||
})
|
||||
})
|
||||
22
web/features/agent-v2/agent-detail/access/access-sources.ts
Normal file
22
web/features/agent-v2/agent-detail/access/access-sources.ts
Normal file
@ -0,0 +1,22 @@
|
||||
import type { I18nKeysWithPrefix } from '@/types/i18n'
|
||||
|
||||
export type AgentAccessSource = {
|
||||
nameKey: I18nKeysWithPrefix<'agentV2', 'agentDetail.access.entries.'>
|
||||
descriptionKey: I18nKeysWithPrefix<'agentV2', 'agentDetail.access.entries.'>
|
||||
lastUsedKey: I18nKeysWithPrefix<'agentV2', 'agentDetail.access.entries.'>
|
||||
reference: string
|
||||
status: 'enabled' | 'disabled'
|
||||
icon: string
|
||||
external?: boolean
|
||||
}
|
||||
|
||||
export const agentAccessSources: AgentAccessSource[] = [
|
||||
{
|
||||
nameKey: 'agentDetail.access.entries.webapp.name',
|
||||
descriptionKey: 'agentDetail.access.entries.webapp.description',
|
||||
lastUsedKey: 'agentDetail.access.entries.webapp.lastUsed',
|
||||
reference: 'https://udify.app/chat/n8nGpwrg',
|
||||
status: 'enabled',
|
||||
icon: 'i-ri-window-line',
|
||||
},
|
||||
]
|
||||
171
web/features/agent-v2/agent-detail/access/page.tsx
Normal file
171
web/features/agent-v2/agent-detail/access/page.tsx
Normal file
@ -0,0 +1,171 @@
|
||||
'use client'
|
||||
|
||||
import type { AgentAccessSource } from './access-sources'
|
||||
import { Button } from '@langgenius/dify-ui/button'
|
||||
import { cn } from '@langgenius/dify-ui/cn'
|
||||
import {
|
||||
DropdownMenu,
|
||||
DropdownMenuContent,
|
||||
DropdownMenuItem,
|
||||
DropdownMenuTrigger,
|
||||
} from '@langgenius/dify-ui/dropdown-menu'
|
||||
import { useTranslation } from 'react-i18next'
|
||||
import { useRouter } from '@/next/navigation'
|
||||
import { getAgentDetailPath } from '../routes'
|
||||
import { agentAccessSources } from './access-sources'
|
||||
|
||||
type AgentAccessPageProps = {
|
||||
agentId: string
|
||||
}
|
||||
|
||||
export function AgentAccessPage({
|
||||
agentId,
|
||||
}: AgentAccessPageProps) {
|
||||
const { t } = useTranslation('agentV2')
|
||||
const router = useRouter()
|
||||
|
||||
const navigateToSection = (section: 'logs' | 'monitoring') => {
|
||||
router.push(getAgentDetailPath(agentId, section))
|
||||
}
|
||||
|
||||
return (
|
||||
<section
|
||||
aria-label={t('agentDetail.sections.access')}
|
||||
className="h-full min-w-0 flex-1 overflow-auto bg-components-panel-bg-blur px-4 py-6 sm:px-12"
|
||||
>
|
||||
<div className="mx-auto max-w-6xl">
|
||||
<header className="mb-5 flex items-start gap-4 border-b border-divider-subtle pb-5">
|
||||
<div className="flex size-10 shrink-0 items-center justify-center rounded-xl border bg-state-accent-hover text-text-accent-light-mode-only">
|
||||
<span aria-hidden className="i-ri-share-forward-fill size-5" />
|
||||
</div>
|
||||
<div className="min-w-0">
|
||||
<h2 className="system-xl-semibold text-text-primary">
|
||||
{t('agentDetail.access.title')}
|
||||
</h2>
|
||||
<p className="mt-1 system-sm-regular text-text-tertiary">
|
||||
{t('agentDetail.access.description')}
|
||||
</p>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<section aria-labelledby="agent-access-webapp">
|
||||
<h3 id="agent-access-webapp" className="mb-2 system-sm-semibold-uppercase text-text-secondary">
|
||||
{t('agentDetail.access.groups.webapp.heading')}
|
||||
</h3>
|
||||
|
||||
<div className="overflow-hidden rounded-xl border border-components-panel-border bg-components-panel-bg shadow-xs">
|
||||
<div className="flex h-9 items-center border-b border-divider-subtle px-4">
|
||||
<span className="system-xs-semibold-uppercase text-text-secondary">
|
||||
{t('agentDetail.access.groups.webapp.label')}
|
||||
</span>
|
||||
<span className="ml-2 system-xs-regular text-text-tertiary">
|
||||
{t('agentDetail.access.entryCount', { count: agentAccessSources.length })}
|
||||
</span>
|
||||
</div>
|
||||
<div className="divide-y divide-divider-subtle">
|
||||
{agentAccessSources.map(source => (
|
||||
<AccessSourceRow
|
||||
key={source.nameKey}
|
||||
source={source}
|
||||
onNavigateToLogs={() => navigateToSection('logs')}
|
||||
onNavigateToMonitoring={() => navigateToSection('monitoring')}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</section>
|
||||
)
|
||||
}
|
||||
|
||||
function AccessSourceRow({
|
||||
source,
|
||||
onNavigateToLogs,
|
||||
onNavigateToMonitoring,
|
||||
}: {
|
||||
source: AgentAccessSource
|
||||
onNavigateToLogs: () => void
|
||||
onNavigateToMonitoring: () => void
|
||||
}) {
|
||||
const { t } = useTranslation('agentV2')
|
||||
const name = t(source.nameKey)
|
||||
|
||||
return (
|
||||
<article className="grid min-h-14 grid-cols-[minmax(0,1.1fr)_minmax(10rem,0.9fr)_auto_auto] items-center gap-3 px-4 py-3 max-lg:grid-cols-[minmax(0,1fr)_auto] max-lg:gap-y-2">
|
||||
<div className="flex min-w-0 items-center gap-3">
|
||||
<div className="flex size-8 shrink-0 items-center justify-center rounded-lg border bg-state-accent-hover text-text-accent-light-mode-only">
|
||||
<span aria-hidden className={`${source.icon} size-4`} />
|
||||
</div>
|
||||
<div className="min-w-0">
|
||||
<h4 className="truncate system-sm-semibold text-text-primary">
|
||||
{name}
|
||||
</h4>
|
||||
<p className="truncate system-xs-regular text-text-tertiary">
|
||||
{t(source.descriptionKey)}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="min-w-0 max-lg:col-start-1 max-lg:pl-11">
|
||||
<div className="flex min-w-0 items-center gap-1.5">
|
||||
<span className="truncate code-xs-regular text-text-secondary" translate="no">
|
||||
{source.reference}
|
||||
</span>
|
||||
<button
|
||||
type="button"
|
||||
aria-label={t('agentDetail.access.copyReference', { name })}
|
||||
className="flex size-5 shrink-0 items-center justify-center rounded-md border border-divider-subtle bg-components-button-secondary-bg text-text-tertiary hover:bg-components-button-secondary-bg-hover hover:text-text-secondary focus-visible:ring-2 focus-visible:ring-state-accent-solid focus-visible:outline-hidden"
|
||||
>
|
||||
<span aria-hidden className={source.external ? 'i-ri-external-link-line size-3.5' : 'i-ri-file-copy-line size-3.5'} />
|
||||
</button>
|
||||
</div>
|
||||
<p className="mt-0.5 truncate system-xs-regular text-text-tertiary">
|
||||
{t(source.lastUsedKey)}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<span className={cn(
|
||||
'inline-flex h-5 items-center gap-1 rounded-full border px-2 system-2xs-semibold-uppercase',
|
||||
source.status === 'enabled'
|
||||
? 'border-util-colors-green-green-200 bg-util-colors-green-green-50 text-util-colors-green-green-700'
|
||||
: 'border-divider-deep bg-components-badge-bg-dimm text-text-tertiary',
|
||||
)}
|
||||
>
|
||||
<span className={cn(
|
||||
'size-1.5 rounded-full',
|
||||
source.status === 'enabled' ? 'bg-util-colors-green-green-600' : 'bg-text-quaternary',
|
||||
)}
|
||||
/>
|
||||
{t(`agentDetail.access.status.${source.status}`)}
|
||||
</span>
|
||||
|
||||
<DropdownMenu>
|
||||
<DropdownMenuTrigger
|
||||
render={(
|
||||
<Button
|
||||
variant="secondary"
|
||||
size="small"
|
||||
className="size-8 px-0"
|
||||
aria-label={t('agentDetail.access.moreActions', { name })}
|
||||
>
|
||||
<span aria-hidden className="i-ri-more-2-fill size-4" />
|
||||
</Button>
|
||||
)}
|
||||
/>
|
||||
<DropdownMenuContent
|
||||
placement="bottom-end"
|
||||
sideOffset={6}
|
||||
popupClassName="w-61"
|
||||
>
|
||||
<DropdownMenuItem onClick={onNavigateToLogs}>
|
||||
{t('agentDetail.sections.logs')}
|
||||
</DropdownMenuItem>
|
||||
<DropdownMenuItem onClick={onNavigateToMonitoring}>
|
||||
{t('agentDetail.access.actions.monitoring')}
|
||||
</DropdownMenuItem>
|
||||
</DropdownMenuContent>
|
||||
</DropdownMenu>
|
||||
</article>
|
||||
)
|
||||
}
|
||||
156
web/features/agent-v2/agent-detail/configure/memory-settings.tsx
Normal file
156
web/features/agent-v2/agent-detail/configure/memory-settings.tsx
Normal file
@ -0,0 +1,156 @@
|
||||
'use client'
|
||||
|
||||
import { cn } from '@langgenius/dify-ui/cn'
|
||||
import { useState } from 'react'
|
||||
import { useTranslation } from 'react-i18next'
|
||||
import { Infotip } from '@/app/components/base/infotip'
|
||||
|
||||
type StrategyKey = 'economy' | 'medium' | 'longHorizon'
|
||||
type IsolationKey = 'global' | 'perApp' | 'perRun'
|
||||
|
||||
type Option<T extends string> = {
|
||||
value: T
|
||||
icon: string
|
||||
}
|
||||
|
||||
const strategyOptions: Array<Option<StrategyKey>> = [
|
||||
{ value: 'economy', icon: 'i-ri-leaf-line' },
|
||||
{ value: 'medium', icon: 'i-ri-scales-3-line' },
|
||||
{ value: 'longHorizon', icon: 'i-ri-rocket-2-line' },
|
||||
]
|
||||
|
||||
const isolationOptions: Array<Option<IsolationKey>> = [
|
||||
{ value: 'global', icon: 'i-ri-global-line' },
|
||||
{ value: 'perApp', icon: 'i-ri-apps-2-line' },
|
||||
{ value: 'perRun', icon: 'i-ri-flashlight-line' },
|
||||
]
|
||||
|
||||
function SegmentOption({
|
||||
active,
|
||||
description,
|
||||
icon,
|
||||
label,
|
||||
onSelect,
|
||||
}: {
|
||||
active: boolean
|
||||
description: string
|
||||
icon: string
|
||||
label: string
|
||||
onSelect: () => void
|
||||
}) {
|
||||
return (
|
||||
<button
|
||||
type="button"
|
||||
aria-pressed={active}
|
||||
className={cn(
|
||||
'flex min-h-13 min-w-0 flex-col items-center justify-center gap-0.5 rounded-md border px-2 py-1.5 text-center transition-colors focus-visible:ring-2 focus-visible:ring-state-accent-solid focus-visible:outline-hidden',
|
||||
active
|
||||
? 'border-components-button-primary-border bg-components-button-primary-bg text-components-button-primary-text shadow-xs'
|
||||
: 'border-transparent text-text-tertiary hover:bg-state-base-hover hover:text-text-secondary',
|
||||
)}
|
||||
onClick={onSelect}
|
||||
>
|
||||
<span className="flex min-w-0 items-center gap-1 system-xs-semibold">
|
||||
<span aria-hidden className={`${icon} size-3.5 shrink-0`} />
|
||||
<span className="truncate">{label}</span>
|
||||
</span>
|
||||
<span className={cn(
|
||||
'max-w-full truncate system-2xs-regular',
|
||||
active ? 'text-components-button-primary-text/85' : 'text-text-quaternary',
|
||||
)}
|
||||
>
|
||||
{description}
|
||||
</span>
|
||||
</button>
|
||||
)
|
||||
}
|
||||
|
||||
export function MemorySettings() {
|
||||
const { t } = useTranslation('agentV2')
|
||||
const [strategy, setStrategy] = useState<StrategyKey>('medium')
|
||||
const [isolation, setIsolation] = useState<IsolationKey>('perApp')
|
||||
|
||||
return (
|
||||
<div className="rounded-xl border border-components-panel-border bg-components-panel-bg p-4 shadow-xs">
|
||||
<div className="mb-3 flex items-center gap-1">
|
||||
<h2 className="system-xl-semibold text-text-primary">
|
||||
{t('agentDetail.memorySettings.title')}
|
||||
</h2>
|
||||
<Infotip
|
||||
aria-label={t('agentDetail.memorySettings.description')}
|
||||
iconClassName="i-ri-information-line"
|
||||
popupClassName="max-w-[240px]"
|
||||
>
|
||||
{t('agentDetail.memorySettings.description')}
|
||||
</Infotip>
|
||||
</div>
|
||||
|
||||
<div className="space-y-3 rounded-lg bg-components-panel-on-panel-item-bg">
|
||||
<fieldset>
|
||||
<legend className="sr-only">
|
||||
{t('agentDetail.memorySettings.strategyLabel')}
|
||||
</legend>
|
||||
<p className="mb-1.5 system-xs-regular text-text-tertiary">
|
||||
{t('agentDetail.memorySettings.description')}
|
||||
</p>
|
||||
<div className="grid grid-cols-1 gap-1 rounded-lg border border-divider-subtle bg-background-section-burn p-0.5 sm:grid-cols-3">
|
||||
{strategyOptions.map(option => (
|
||||
<SegmentOption
|
||||
key={option.value}
|
||||
active={strategy === option.value}
|
||||
icon={option.icon}
|
||||
label={t(`agentDetail.memorySettings.strategies.${option.value}.label`)}
|
||||
description={t(`agentDetail.memorySettings.strategies.${option.value}.budget`)}
|
||||
onSelect={() => setStrategy(option.value)}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<div className="h-px bg-divider-subtle" />
|
||||
|
||||
<fieldset>
|
||||
<legend className="mb-1.5 system-xs-regular text-text-tertiary">
|
||||
{t('agentDetail.memorySettings.isolation.description')}
|
||||
</legend>
|
||||
<div className="grid grid-cols-1 gap-1 rounded-lg border border-divider-subtle bg-background-section-burn p-0.5 sm:grid-cols-3">
|
||||
{isolationOptions.map(option => (
|
||||
<SegmentOption
|
||||
key={option.value}
|
||||
active={isolation === option.value}
|
||||
icon={option.icon}
|
||||
label={t(`agentDetail.memorySettings.isolation.${option.value}.label`)}
|
||||
description={t(`agentDetail.memorySettings.isolation.${option.value}.scope`)}
|
||||
onSelect={() => setIsolation(option.value)}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<div className="h-px bg-divider-subtle" />
|
||||
|
||||
<div className="flex flex-wrap items-center justify-between gap-3 px-0.5 pt-0.5">
|
||||
<div className="min-w-0 flex-1">
|
||||
<div className="flex min-w-0 flex-wrap items-center gap-1.5 system-xs-regular text-text-tertiary">
|
||||
<span>{t('agentDetail.memorySettings.export.title')}</span>
|
||||
<span className="inline-flex items-center gap-1 rounded border border-util-colors-blue-blue-200 bg-util-colors-blue-blue-50 px-1.5 py-0.5 system-2xs-semibold-uppercase text-util-colors-blue-blue-700">
|
||||
<span aria-hidden className="i-ri-shield-keyhole-line size-3" />
|
||||
{t('agentDetail.memorySettings.export.admin')}
|
||||
</span>
|
||||
</div>
|
||||
<p className="mt-0.5 system-2xs-regular text-text-tertiary">
|
||||
{t('agentDetail.memorySettings.export.description')}
|
||||
</p>
|
||||
</div>
|
||||
<button
|
||||
type="button"
|
||||
className="inline-flex h-7 shrink-0 items-center gap-1.5 rounded-md border border-components-button-secondary-border bg-components-button-secondary-bg px-2.5 system-xs-semibold text-components-button-secondary-text shadow-xs hover:bg-components-button-secondary-bg-hover focus-visible:ring-2 focus-visible:ring-state-accent-solid focus-visible:outline-hidden"
|
||||
>
|
||||
<span aria-hidden className="i-ri-download-line size-3.5" />
|
||||
{t('agentDetail.memorySettings.export.download')}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
326
web/features/agent-v2/agent-detail/layout.tsx
Normal file
326
web/features/agent-v2/agent-detail/layout.tsx
Normal file
@ -0,0 +1,326 @@
|
||||
'use client'
|
||||
|
||||
import type { ReactNode } from 'react'
|
||||
import type { VersionHistory } from '@/types/workflow'
|
||||
import { Button } from '@langgenius/dify-ui/button'
|
||||
import { cn } from '@langgenius/dify-ui/cn'
|
||||
import {
|
||||
DropdownMenu,
|
||||
DropdownMenuContent,
|
||||
DropdownMenuItem,
|
||||
DropdownMenuSeparator,
|
||||
DropdownMenuTrigger,
|
||||
} from '@langgenius/dify-ui/dropdown-menu'
|
||||
import { toast } from '@langgenius/dify-ui/toast'
|
||||
import { useState } from 'react'
|
||||
import { useTranslation } from 'react-i18next'
|
||||
import VersionHistoryItem from '@/app/components/workflow/panel/version-history-panel/version-history-item'
|
||||
import { WorkflowVersion } from '@/app/components/workflow/types'
|
||||
import useDocumentTitle from '@/hooks/use-document-title'
|
||||
|
||||
type AgentDetailLayoutProps = {
|
||||
agentId: string
|
||||
children: ReactNode
|
||||
}
|
||||
|
||||
const createMockAgentVersion = ({
|
||||
id,
|
||||
version,
|
||||
markedName,
|
||||
markedComment,
|
||||
createdAt,
|
||||
createdBy,
|
||||
}: {
|
||||
id: string
|
||||
version: string
|
||||
markedName: string
|
||||
markedComment: string
|
||||
createdAt: number
|
||||
createdBy: string
|
||||
}): VersionHistory => ({
|
||||
id,
|
||||
graph: {
|
||||
nodes: [],
|
||||
edges: [],
|
||||
},
|
||||
created_at: createdAt,
|
||||
created_by: {
|
||||
id: createdBy.toLowerCase().replaceAll(' ', '-'),
|
||||
name: createdBy,
|
||||
email: '',
|
||||
},
|
||||
hash: id,
|
||||
updated_at: createdAt,
|
||||
updated_by: {
|
||||
id: createdBy.toLowerCase().replaceAll(' ', '-'),
|
||||
name: createdBy,
|
||||
email: '',
|
||||
},
|
||||
tool_published: false,
|
||||
version,
|
||||
marked_name: markedName,
|
||||
marked_comment: markedComment,
|
||||
})
|
||||
|
||||
const mockAgentVersions: VersionHistory[] = [
|
||||
createMockAgentVersion({
|
||||
id: 'draft',
|
||||
version: WorkflowVersion.Draft,
|
||||
markedName: '',
|
||||
markedComment: '',
|
||||
createdAt: 1790467200,
|
||||
createdBy: 'Joel',
|
||||
}),
|
||||
createMockAgentVersion({
|
||||
id: 'agent-version-4',
|
||||
version: '2026-09-25T13:00:00Z',
|
||||
markedName: 'v1.4.0 Handoff rules',
|
||||
markedComment: 'Aligned escalation handoff rules and response boundaries.',
|
||||
createdAt: 1790254800,
|
||||
createdBy: 'Emma Chen',
|
||||
}),
|
||||
createMockAgentVersion({
|
||||
id: 'agent-version-3',
|
||||
version: '2026-09-18T12:30:00Z',
|
||||
markedName: 'v1.3.0 Tool routing',
|
||||
markedComment: 'Added mock tool preference data for scheduling and knowledge lookup.',
|
||||
createdAt: 1789648200,
|
||||
createdBy: 'Noah Kim',
|
||||
}),
|
||||
createMockAgentVersion({
|
||||
id: 'agent-version-2',
|
||||
version: '2026-09-11T12:00:00Z',
|
||||
markedName: 'v1.2.0 Prompt tuning',
|
||||
markedComment: 'Refined task decomposition prompts for multi-step workflows.',
|
||||
createdAt: 1789041600,
|
||||
createdBy: 'Ava Smith',
|
||||
}),
|
||||
createMockAgentVersion({
|
||||
id: 'agent-version-1',
|
||||
version: '2026-09-05T12:00:00Z',
|
||||
markedName: 'v1.0.0 Initial roster setup',
|
||||
markedComment: 'Created the reusable agent profile and default workflow instructions.',
|
||||
createdAt: 1788523200,
|
||||
createdBy: 'Liam Wong',
|
||||
}),
|
||||
createMockAgentVersion({
|
||||
id: 'agent-version-0-9',
|
||||
version: '2026-08-29T12:00:00Z',
|
||||
markedName: 'v0.9.0 Evaluation rubric',
|
||||
markedComment: 'Added scoring criteria for answer completeness and escalation confidence.',
|
||||
createdAt: 1787918400,
|
||||
createdBy: 'Mia Patel',
|
||||
}),
|
||||
createMockAgentVersion({
|
||||
id: 'agent-version-0-8',
|
||||
version: '2026-08-22T12:00:00Z',
|
||||
markedName: 'v0.8.0 Retrieval guardrails',
|
||||
markedComment: 'Tightened knowledge lookup rules before drafting customer-facing responses.',
|
||||
createdAt: 1787313600,
|
||||
createdBy: 'Oliver Brown',
|
||||
}),
|
||||
createMockAgentVersion({
|
||||
id: 'agent-version-0-7',
|
||||
version: '2026-08-15T12:00:00Z',
|
||||
markedName: 'v0.7.0 Memory cleanup',
|
||||
markedComment: 'Removed stale context fields and simplified conversation state handling.',
|
||||
createdAt: 1786708800,
|
||||
createdBy: 'Sophia Garcia',
|
||||
}),
|
||||
createMockAgentVersion({
|
||||
id: 'agent-version-0-6',
|
||||
version: '2026-08-08T12:00:00Z',
|
||||
markedName: 'v0.6.0 Safety pass',
|
||||
markedComment: 'Added refusal boundaries for unsupported financial and legal decisions.',
|
||||
createdAt: 1786104000,
|
||||
createdBy: 'Ethan Davis',
|
||||
}),
|
||||
createMockAgentVersion({
|
||||
id: 'agent-version-0-5',
|
||||
version: '2026-08-01T12:00:00Z',
|
||||
markedName: 'v0.5.0 Scheduling workflow',
|
||||
markedComment: 'Introduced handoff hints for calendar availability and follow-up timing.',
|
||||
createdAt: 1785499200,
|
||||
createdBy: 'Isabella Lee',
|
||||
}),
|
||||
createMockAgentVersion({
|
||||
id: 'agent-version-0-4',
|
||||
version: '2026-07-25T12:00:00Z',
|
||||
markedName: 'v0.4.0 Tone calibration',
|
||||
markedComment: 'Adjusted response tone for concise operational updates.',
|
||||
createdAt: 1784894400,
|
||||
createdBy: 'Lucas Martin',
|
||||
}),
|
||||
createMockAgentVersion({
|
||||
id: 'agent-version-0-3',
|
||||
version: '2026-07-18T12:00:00Z',
|
||||
markedName: 'v0.3.0 Fallback paths',
|
||||
markedComment: 'Documented fallback behavior when required workflow inputs are missing.',
|
||||
createdAt: 1784289600,
|
||||
createdBy: 'Grace Miller',
|
||||
}),
|
||||
createMockAgentVersion({
|
||||
id: 'agent-version-0-2',
|
||||
version: '2026-07-11T12:00:00Z',
|
||||
markedName: 'v0.2.0 Tool schema draft',
|
||||
markedComment: 'Outlined first-pass tool input schemas for roster reuse.',
|
||||
createdAt: 1783684800,
|
||||
createdBy: 'Henry Wilson',
|
||||
}),
|
||||
createMockAgentVersion({
|
||||
id: 'agent-version-0-1',
|
||||
version: '2026-07-04T12:00:00Z',
|
||||
markedName: 'v0.1.0 Prototype',
|
||||
markedComment: 'Captured the initial prototype behavior and basic instruction set.',
|
||||
createdAt: 1783080000,
|
||||
createdBy: 'Chloe Anderson',
|
||||
}),
|
||||
]
|
||||
|
||||
export function AgentDetailLayout({
|
||||
agentId,
|
||||
children,
|
||||
}: AgentDetailLayoutProps) {
|
||||
const { t } = useTranslation('agentV2')
|
||||
const [showVersionHistory, setShowVersionHistory] = useState(false)
|
||||
const [currentVersion, setCurrentVersion] = useState<VersionHistory>(mockAgentVersions[0]!)
|
||||
|
||||
useDocumentTitle(t('agentDetail.documentTitle'))
|
||||
|
||||
const handlePublishMenuAction = () => {
|
||||
toast.success(t('api.success', { ns: 'common' }))
|
||||
}
|
||||
|
||||
return (
|
||||
<main className="relative flex h-full min-w-0 flex-col overflow-hidden bg-components-panel-bg-blur">
|
||||
<header className="flex h-20 shrink-0 items-center justify-between border-b border-divider-subtle bg-components-panel-bg-blur px-6">
|
||||
<div className="flex min-w-0 items-center gap-3">
|
||||
<div className="flex size-10 shrink-0 items-center justify-center rounded-xl bg-text-accent text-text-primary-on-surface shadow-xs">
|
||||
<span aria-hidden className="i-custom-vender-solid-mediaAndDevices-robot size-5" />
|
||||
</div>
|
||||
<div className="min-w-0">
|
||||
<h1 className="truncate title-xl-semi-bold text-text-primary">
|
||||
{t('agentDetail.title')}
|
||||
</h1>
|
||||
<p className="mt-1 truncate system-xs-regular text-text-tertiary">
|
||||
{t('agentDetail.subtitle', { agentId })}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex shrink-0 items-center gap-2">
|
||||
<DropdownMenu>
|
||||
<DropdownMenuTrigger
|
||||
render={(
|
||||
<Button variant="primary" className="grid min-w-40 grid-cols-[1rem_1fr_1rem] gap-2 py-2 pr-2 pl-3">
|
||||
<span aria-hidden className="i-ri-upload-cloud-2-line size-4" />
|
||||
<span className="text-center">
|
||||
{t('agentDetail.publish')}
|
||||
</span>
|
||||
<span aria-hidden className="i-ri-arrow-down-s-line size-4 text-components-button-primary-text" />
|
||||
</Button>
|
||||
)}
|
||||
/>
|
||||
<DropdownMenuContent
|
||||
placement="bottom-end"
|
||||
sideOffset={6}
|
||||
popupClassName="w-65 p-1"
|
||||
>
|
||||
<DropdownMenuItem className="h-auto items-start gap-2 px-2 py-2" onClick={handlePublishMenuAction}>
|
||||
<span aria-hidden className="mt-0.5 i-ri-upload-cloud-2-line size-4 shrink-0 text-text-accent" />
|
||||
<span className="flex min-w-0 flex-col gap-0.5 text-left">
|
||||
<span className="system-sm-semibold text-text-primary">
|
||||
{t('agentDetail.publishMenu.publishUpdate')}
|
||||
</span>
|
||||
<span className="system-xs-regular text-text-tertiary">
|
||||
{t('agentDetail.publishMenu.publishUpdateDescription')}
|
||||
</span>
|
||||
</span>
|
||||
</DropdownMenuItem>
|
||||
<DropdownMenuSeparator className="mx-2 my-1" />
|
||||
<DropdownMenuItem className="h-auto items-start gap-2 px-2 py-2" onClick={handlePublishMenuAction}>
|
||||
<span aria-hidden className="mt-0.5 i-ri-user-add-line size-4 shrink-0 text-text-accent" />
|
||||
<span className="flex min-w-0 flex-col gap-0.5 text-left">
|
||||
<span className="system-sm-semibold text-text-primary">
|
||||
{t('agentDetail.publishMenu.saveAsNewAgent')}
|
||||
</span>
|
||||
<span className="system-xs-regular text-text-tertiary">
|
||||
{t('agentDetail.publishMenu.saveAsNewAgentDescription')}
|
||||
</span>
|
||||
</span>
|
||||
</DropdownMenuItem>
|
||||
</DropdownMenuContent>
|
||||
</DropdownMenu>
|
||||
<Button
|
||||
variant="secondary"
|
||||
className={cn(
|
||||
'size-8 px-0! text-text-tertiary hover:text-text-secondary',
|
||||
showVersionHistory && 'border-components-button-secondary-border-hover bg-components-button-secondary-bg-hover text-text-secondary',
|
||||
)}
|
||||
aria-label={t('common.versionHistory', { ns: 'workflow' })}
|
||||
onClick={() => setShowVersionHistory(true)}
|
||||
>
|
||||
<span aria-hidden className="i-ri-history-line size-4" />
|
||||
</Button>
|
||||
</div>
|
||||
</header>
|
||||
<div className="min-h-0 min-w-0 flex-1 overflow-auto">
|
||||
{children}
|
||||
</div>
|
||||
{showVersionHistory && (
|
||||
<AgentVersionHistoryPanel
|
||||
versions={mockAgentVersions}
|
||||
currentVersion={currentVersion}
|
||||
onSelectVersion={setCurrentVersion}
|
||||
onClose={() => setShowVersionHistory(false)}
|
||||
/>
|
||||
)}
|
||||
</main>
|
||||
)
|
||||
}
|
||||
|
||||
function AgentVersionHistoryPanel({
|
||||
versions,
|
||||
currentVersion,
|
||||
onSelectVersion,
|
||||
onClose,
|
||||
}: {
|
||||
versions: VersionHistory[]
|
||||
currentVersion: VersionHistory
|
||||
onSelectVersion: (version: VersionHistory) => void
|
||||
onClose: () => void
|
||||
}) {
|
||||
const { t } = useTranslation('agentV2')
|
||||
const latestVersionId = versions.find(item => item.version !== WorkflowVersion.Draft)?.id ?? ''
|
||||
|
||||
return (
|
||||
<aside className="absolute top-20 right-0 bottom-0 flex w-67 flex-col rounded-l-2xl border-y-[0.5px] border-l-[0.5px] border-components-panel-border bg-components-panel-bg shadow-xl shadow-shadow-shadow-5">
|
||||
<div className="flex items-center gap-x-2 px-4 pt-3">
|
||||
<div className="flex-1 py-1 system-xl-semibold text-text-primary">
|
||||
{t('versionHistory.title', { ns: 'workflow' })}
|
||||
</div>
|
||||
<button
|
||||
type="button"
|
||||
aria-label={t('operation.close', { ns: 'common' })}
|
||||
className="flex size-6 shrink-0 cursor-pointer items-center justify-center p-0.5"
|
||||
onClick={onClose}
|
||||
>
|
||||
<span aria-hidden className="i-ri-close-line size-4 text-text-tertiary" />
|
||||
</button>
|
||||
</div>
|
||||
<div className="h-0 flex-1 overflow-y-auto px-3 py-2">
|
||||
{versions.map((item, index) => (
|
||||
<VersionHistoryItem
|
||||
key={item.id}
|
||||
item={item}
|
||||
currentVersion={currentVersion}
|
||||
latestVersionId={latestVersionId}
|
||||
onClick={onSelectVersion}
|
||||
handleClickActionMenuItem={() => {}}
|
||||
isLast={index === versions.length - 1}
|
||||
hideActionMenu
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
</aside>
|
||||
)
|
||||
}
|
||||
243
web/features/agent-v2/agent-detail/logs/page.tsx
Normal file
243
web/features/agent-v2/agent-detail/logs/page.tsx
Normal file
@ -0,0 +1,243 @@
|
||||
'use client'
|
||||
|
||||
import type { I18nKeysWithPrefix } from '@/types/i18n'
|
||||
import { Input } from '@langgenius/dify-ui/input'
|
||||
import { Pagination } from '@langgenius/dify-ui/pagination'
|
||||
import { Select, SelectContent, SelectItem, SelectItemIndicator, SelectItemText, SelectTrigger } from '@langgenius/dify-ui/select'
|
||||
import { StatusDot } from '@langgenius/dify-ui/status-dot'
|
||||
import { useState } from 'react'
|
||||
import { useTranslation } from 'react-i18next'
|
||||
|
||||
type StatusKey = 'all' | 'succeeded' | 'failed' | 'running'
|
||||
type PeriodKey = 'last7days' | 'last30days' | 'allTime'
|
||||
type AgentLogStatus = Exclude<StatusKey, 'all'>
|
||||
|
||||
type FilterOption<T extends string> = {
|
||||
value: T
|
||||
labelKey: I18nKeysWithPrefix<'agentV2', 'agentDetail.logs.'>
|
||||
}
|
||||
|
||||
type AgentLogRow = {
|
||||
id: string
|
||||
startedAt: string
|
||||
status: AgentLogStatus
|
||||
runtime: string
|
||||
tokens: string
|
||||
user: string
|
||||
triggerKey: I18nKeysWithPrefix<'agentV2', 'agentDetail.logs.triggers.'>
|
||||
}
|
||||
|
||||
const statusOptions: Array<FilterOption<StatusKey>> = [
|
||||
{ value: 'all', labelKey: 'agentDetail.logs.filters.status.all' },
|
||||
{ value: 'succeeded', labelKey: 'agentDetail.logs.filters.status.succeeded' },
|
||||
{ value: 'failed', labelKey: 'agentDetail.logs.filters.status.failed' },
|
||||
{ value: 'running', labelKey: 'agentDetail.logs.filters.status.running' },
|
||||
]
|
||||
|
||||
const periodOptions: Array<FilterOption<PeriodKey>> = [
|
||||
{ value: 'last7days', labelKey: 'agentDetail.logs.filters.period.last7days' },
|
||||
{ value: 'last30days', labelKey: 'agentDetail.logs.filters.period.last30days' },
|
||||
{ value: 'allTime', labelKey: 'agentDetail.logs.filters.period.allTime' },
|
||||
]
|
||||
|
||||
const logRows: AgentLogRow[] = [
|
||||
{
|
||||
id: 'run_8f4e21',
|
||||
startedAt: '2026-05-27 14:28',
|
||||
status: 'succeeded',
|
||||
runtime: '2.431s',
|
||||
tokens: '1,284',
|
||||
user: 'tender-reviewer',
|
||||
triggerKey: 'agentDetail.logs.triggers.workflowNode',
|
||||
},
|
||||
{
|
||||
id: 'run_7a19c0',
|
||||
startedAt: '2026-05-27 13:46',
|
||||
status: 'running',
|
||||
runtime: '0.842s',
|
||||
tokens: '624',
|
||||
user: 'pricing-team',
|
||||
triggerKey: 'agentDetail.logs.triggers.debugRun',
|
||||
},
|
||||
{
|
||||
id: 'run_62bd95',
|
||||
startedAt: '2026-05-26 18:12',
|
||||
status: 'failed',
|
||||
runtime: '1.209s',
|
||||
tokens: '416',
|
||||
user: 'compliance-reviewer',
|
||||
triggerKey: 'agentDetail.logs.triggers.workflowNode',
|
||||
},
|
||||
]
|
||||
|
||||
const statusTone: Record<AgentLogStatus, 'success' | 'error' | 'normal'> = {
|
||||
succeeded: 'success',
|
||||
failed: 'error',
|
||||
running: 'normal',
|
||||
}
|
||||
|
||||
export function AgentLogsPage() {
|
||||
const { t } = useTranslation('agentV2')
|
||||
const { t: tCommon } = useTranslation('common')
|
||||
const [status, setStatus] = useState<StatusKey>('all')
|
||||
const [period, setPeriod] = useState<PeriodKey>('last7days')
|
||||
const [keyword, setKeyword] = useState('')
|
||||
const [page, setPage] = useState(1)
|
||||
const [limit, setLimit] = useState(10)
|
||||
|
||||
const selectedStatus = statusOptions.find(option => option.value === status) ?? statusOptions[0]!
|
||||
const selectedPeriod = periodOptions.find(option => option.value === period) ?? periodOptions[0]!
|
||||
|
||||
return (
|
||||
<section
|
||||
aria-label={t('agentDetail.sections.logs')}
|
||||
className="h-full min-w-0 flex-1 overflow-auto bg-components-panel-bg-blur px-4 py-6 sm:px-12"
|
||||
>
|
||||
<div className="mx-auto flex h-full max-w-6xl flex-col">
|
||||
<header>
|
||||
<h2 className="system-xl-semibold text-text-primary">
|
||||
{t('agentDetail.logs.title')}
|
||||
</h2>
|
||||
<p className="mt-1 system-sm-regular text-text-tertiary">
|
||||
{t('agentDetail.logs.description')}
|
||||
</p>
|
||||
</header>
|
||||
|
||||
<div className="flex min-h-0 flex-1 flex-col py-4">
|
||||
<div className="mb-2 flex flex-wrap items-center gap-2">
|
||||
<Select
|
||||
value={status}
|
||||
onValueChange={(nextValue) => {
|
||||
if (nextValue)
|
||||
setStatus(nextValue as StatusKey)
|
||||
}}
|
||||
>
|
||||
<SelectTrigger
|
||||
aria-label={t('agentDetail.logs.filters.status.label')}
|
||||
className="mt-0 w-fit max-w-full min-w-36"
|
||||
>
|
||||
{t(selectedStatus.labelKey)}
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
{statusOptions.map(option => (
|
||||
<SelectItem key={option.value} value={option.value}>
|
||||
<SelectItemText>{t(option.labelKey)}</SelectItemText>
|
||||
<SelectItemIndicator />
|
||||
</SelectItem>
|
||||
))}
|
||||
</SelectContent>
|
||||
</Select>
|
||||
|
||||
<Select
|
||||
value={period}
|
||||
onValueChange={(nextValue) => {
|
||||
if (nextValue)
|
||||
setPeriod(nextValue as PeriodKey)
|
||||
}}
|
||||
>
|
||||
<SelectTrigger
|
||||
aria-label={t('agentDetail.logs.filters.period.label')}
|
||||
className="mt-0 w-fit max-w-full min-w-36"
|
||||
>
|
||||
{t(selectedPeriod.labelKey)}
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
{periodOptions.map(option => (
|
||||
<SelectItem key={option.value} value={option.value}>
|
||||
<SelectItemText>{t(option.labelKey)}</SelectItemText>
|
||||
<SelectItemIndicator />
|
||||
</SelectItem>
|
||||
))}
|
||||
</SelectContent>
|
||||
</Select>
|
||||
|
||||
<div className="relative w-62 max-w-full">
|
||||
<span aria-hidden className="pointer-events-none absolute top-1/2 left-3 i-ri-search-line size-4 -translate-y-1/2 text-text-tertiary" />
|
||||
<Input
|
||||
aria-label={t('agentDetail.logs.filters.search.label')}
|
||||
name="agent-log-search"
|
||||
autoComplete="off"
|
||||
value={keyword}
|
||||
placeholder={t('agentDetail.logs.filters.search.placeholder')}
|
||||
className="pl-9"
|
||||
onChange={(event) => {
|
||||
setKeyword(event.target.value)
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="min-h-0 overflow-x-auto">
|
||||
<table className="mt-2 w-full min-w-180 border-collapse border-0">
|
||||
<thead className="system-xs-medium-uppercase text-text-tertiary">
|
||||
<tr>
|
||||
<th scope="col" className="rounded-l-lg bg-background-section-burn py-1.5 pr-2 pl-3 text-left whitespace-nowrap">
|
||||
{t('agentDetail.logs.table.startTime')}
|
||||
</th>
|
||||
<th scope="col" className="bg-background-section-burn py-1.5 pr-2 pl-3 text-left whitespace-nowrap">
|
||||
{t('agentDetail.logs.table.status')}
|
||||
</th>
|
||||
<th scope="col" className="bg-background-section-burn py-1.5 pr-2 pl-3 text-left whitespace-nowrap">
|
||||
{t('agentDetail.logs.table.runtime')}
|
||||
</th>
|
||||
<th scope="col" className="bg-background-section-burn py-1.5 pr-2 pl-3 text-left whitespace-nowrap">
|
||||
{t('agentDetail.logs.table.tokens')}
|
||||
</th>
|
||||
<th scope="col" className="bg-background-section-burn py-1.5 pr-2 pl-3 text-left whitespace-nowrap">
|
||||
{t('agentDetail.logs.table.user')}
|
||||
</th>
|
||||
<th scope="col" className="rounded-r-lg bg-background-section-burn py-1.5 pr-2 pl-3 text-left whitespace-nowrap">
|
||||
{t('agentDetail.logs.table.trigger')}
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody className="system-sm-regular text-text-secondary">
|
||||
{logRows.map(log => (
|
||||
<tr key={log.id} className="border-b border-divider-subtle hover:bg-background-default-hover">
|
||||
<td className="p-3 pr-2 whitespace-nowrap">
|
||||
<div className="system-sm-medium text-text-secondary">{log.startedAt}</div>
|
||||
<div className="mt-0.5 code-xs-regular text-text-tertiary" translate="no">{log.id}</div>
|
||||
</td>
|
||||
<td className="p-3 pr-2 whitespace-nowrap">
|
||||
<div className="inline-flex items-center gap-1 system-xs-semibold-uppercase">
|
||||
<StatusDot status={statusTone[log.status]} />
|
||||
<span>{t(`agentDetail.logs.filters.status.${log.status}`)}</span>
|
||||
</div>
|
||||
</td>
|
||||
<td className="p-3 pr-2 whitespace-nowrap">{log.runtime}</td>
|
||||
<td className="p-3 pr-2 whitespace-nowrap">{log.tokens}</td>
|
||||
<td className="p-3 pr-2">
|
||||
<div className="max-w-48 truncate">{log.user}</div>
|
||||
</td>
|
||||
<td className="p-3 pr-2">
|
||||
<div className="max-w-48 truncate">{t(log.triggerKey)}</div>
|
||||
</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<Pagination
|
||||
page={page}
|
||||
totalPages={3}
|
||||
onPageChange={setPage}
|
||||
labels={{
|
||||
previous: tCommon('pagination.previous'),
|
||||
next: tCommon('pagination.next'),
|
||||
editPageNumber: (page, totalPages) => tCommon('pagination.editPageNumber', { page, totalPages }),
|
||||
pageNumberInput: tCommon('pagination.pageNumber'),
|
||||
}}
|
||||
pageSize={{
|
||||
value: limit,
|
||||
options: [10, 25, 50],
|
||||
onValueChange: setLimit,
|
||||
label: tCommon('pagination.perPage'),
|
||||
ariaLabel: tCommon('pagination.perPage'),
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
)
|
||||
}
|
||||
249
web/features/agent-v2/agent-detail/monitoring/chart-utils.ts
Normal file
249
web/features/agent-v2/agent-detail/monitoring/chart-utils.ts
Normal file
@ -0,0 +1,249 @@
|
||||
import type { EChartsOption } from 'echarts'
|
||||
import dayjs from 'dayjs'
|
||||
import { formatNumber } from '@/utils/format'
|
||||
|
||||
export type AgentMonitoringChartType = 'conversations' | 'endUsers' | 'tokenUsage'
|
||||
|
||||
export type AgentMonitoringChartRow = {
|
||||
date: string
|
||||
total_price?: number | string
|
||||
} & Record<string, number | string | undefined>
|
||||
|
||||
type ColorType = 'green' | 'orange' | 'blue'
|
||||
|
||||
const colorTypeMap: Record<ColorType, { lineColor: string, bgColor: [string, string] }> = {
|
||||
green: {
|
||||
lineColor: 'rgba(6, 148, 162, 1)',
|
||||
bgColor: ['rgba(6, 148, 162, 0.2)', 'rgba(67, 174, 185, 0.08)'],
|
||||
},
|
||||
orange: {
|
||||
lineColor: 'rgba(255, 138, 76, 1)',
|
||||
bgColor: ['rgba(254, 145, 87, 0.2)', 'rgba(255, 138, 76, 0.1)'],
|
||||
},
|
||||
blue: {
|
||||
lineColor: 'rgba(28, 100, 242, 1)',
|
||||
bgColor: ['rgba(28, 100, 242, 0.3)', 'rgba(28, 100, 242, 0.1)'],
|
||||
},
|
||||
}
|
||||
|
||||
const chartTypeColorMap: Record<AgentMonitoringChartType, ColorType> = {
|
||||
conversations: 'green',
|
||||
endUsers: 'orange',
|
||||
tokenUsage: 'blue',
|
||||
}
|
||||
|
||||
const commonDateFormat = 'MMM D, YYYY'
|
||||
|
||||
const sumValues = (rows: AgentMonitoringChartRow[], field: string) => {
|
||||
return rows.reduce((sum, row) => sum + Number(row[field] ?? 0), 0)
|
||||
}
|
||||
|
||||
const getChartColors = (chartType: AgentMonitoringChartType) => colorTypeMap[chartTypeColorMap[chartType]]
|
||||
|
||||
const getMarkLineSeedData = (statisticsLength: number) => {
|
||||
const markLineLength = statisticsLength >= 2 ? statisticsLength - 2 : statisticsLength
|
||||
return ['', ...Array.from({ length: markLineLength }, () => '1'), '']
|
||||
}
|
||||
|
||||
const getTooltipContent = (
|
||||
chartType: AgentMonitoringChartType,
|
||||
yField: string,
|
||||
params: { name: string, data?: AgentMonitoringChartRow },
|
||||
) => {
|
||||
const row = params.data ?? { date: params.name }
|
||||
const value = row[yField] ?? 0
|
||||
|
||||
if (chartType !== 'tokenUsage')
|
||||
return `<div style='color:#6B7280;font-size:12px'>${params.name}</div><div style='font-size:14px;color:#1F2A37'>${value}</div>`
|
||||
|
||||
return `<div style='color:#6B7280;font-size:12px'>${params.name}</div>
|
||||
<div style='font-size:14px;color:#1F2A37'>${value}
|
||||
<span style='font-size:12px'>
|
||||
<span style='margin-left:4px;color:#6B7280'>(</span>
|
||||
<span style='color:#FF8A4C'>~$${row.total_price ?? 0}</span>
|
||||
<span style='color:#6B7280'>)</span>
|
||||
</span>
|
||||
</div>`
|
||||
}
|
||||
|
||||
export const getDefaultChartData = ({
|
||||
start,
|
||||
end,
|
||||
key = 'count',
|
||||
}: {
|
||||
start: string
|
||||
end: string
|
||||
key?: string
|
||||
}) => {
|
||||
const diffDays = dayjs(end).diff(dayjs(start), 'day')
|
||||
|
||||
return Array.from({ length: diffDays || 1 }, (_, index) => ({
|
||||
date: dayjs(start).add(index, 'day').format(commonDateFormat),
|
||||
[key]: 0,
|
||||
total_price: '0.0000',
|
||||
}))
|
||||
}
|
||||
|
||||
export const getChartValueField = (
|
||||
rows: AgentMonitoringChartRow[],
|
||||
valueKey?: string,
|
||||
) => {
|
||||
if (valueKey)
|
||||
return valueKey
|
||||
|
||||
return Object.keys(rows[0] ?? {}).find(name => name.includes('count')) ?? 'count'
|
||||
}
|
||||
|
||||
export const getSummaryValue = ({
|
||||
chartType,
|
||||
rows,
|
||||
valueKey,
|
||||
isAvg,
|
||||
unit = '',
|
||||
}: {
|
||||
chartType: AgentMonitoringChartType
|
||||
rows: AgentMonitoringChartRow[]
|
||||
valueKey: string
|
||||
isAvg?: boolean
|
||||
unit?: string
|
||||
}) => {
|
||||
const value = sumValues(rows, valueKey)
|
||||
const summary = isAvg ? value / (rows.length || 1) : value
|
||||
|
||||
if (chartType === 'tokenUsage') {
|
||||
const formattedUsage = summary < 1000
|
||||
? summary
|
||||
: `${formatNumber(Math.round(summary / 1000))}k`
|
||||
|
||||
return `${formattedUsage}`
|
||||
}
|
||||
|
||||
return `${summary.toLocaleString()} ${unit}`.trim()
|
||||
}
|
||||
|
||||
export const getTokenSummary = (rows: AgentMonitoringChartRow[]) => {
|
||||
const totalPrice = rows.reduce((sum, row) => sum + Number.parseFloat(String(row.total_price ?? '0')), 0)
|
||||
|
||||
return totalPrice.toLocaleString('en-US', {
|
||||
style: 'currency',
|
||||
currency: 'USD',
|
||||
minimumFractionDigits: 4,
|
||||
})
|
||||
}
|
||||
|
||||
export const buildChartOptions = ({
|
||||
rows,
|
||||
chartType,
|
||||
valueKey,
|
||||
yMax,
|
||||
}: {
|
||||
rows: AgentMonitoringChartRow[]
|
||||
chartType: AgentMonitoringChartType
|
||||
valueKey: string
|
||||
yMax?: number
|
||||
}): EChartsOption => {
|
||||
const xData = rows.map(({ date }) => date)
|
||||
const chartColors = getChartColors(chartType)
|
||||
const markLineSeedData = getMarkLineSeedData(rows.length)
|
||||
|
||||
return {
|
||||
dataset: {
|
||||
dimensions: ['date', valueKey],
|
||||
source: rows,
|
||||
},
|
||||
grid: { top: 8, right: 36, bottom: 10, left: 25, containLabel: true },
|
||||
tooltip: {
|
||||
trigger: 'item',
|
||||
position: 'top',
|
||||
borderWidth: 0,
|
||||
},
|
||||
xAxis: [{
|
||||
type: 'category',
|
||||
boundaryGap: false,
|
||||
axisLabel: {
|
||||
color: '#9CA3AF',
|
||||
hideOverlap: true,
|
||||
overflow: 'break',
|
||||
formatter(value) {
|
||||
return dayjs(value).format(commonDateFormat)
|
||||
},
|
||||
},
|
||||
axisLine: { show: false },
|
||||
axisTick: { show: false },
|
||||
splitLine: {
|
||||
show: true,
|
||||
lineStyle: {
|
||||
color: '#F3F4F6',
|
||||
width: 1,
|
||||
type: [10, 10],
|
||||
},
|
||||
interval(index) {
|
||||
return index === 0 || index === xData.length - 1
|
||||
},
|
||||
},
|
||||
}, {
|
||||
position: 'bottom',
|
||||
boundaryGap: false,
|
||||
data: markLineSeedData,
|
||||
axisLabel: { show: false },
|
||||
axisLine: { show: false },
|
||||
axisTick: { show: false },
|
||||
splitLine: {
|
||||
show: true,
|
||||
lineStyle: {
|
||||
color: '#E5E7EB',
|
||||
},
|
||||
interval(_index, value) {
|
||||
return !!value
|
||||
},
|
||||
},
|
||||
}],
|
||||
yAxis: {
|
||||
max: yMax ?? 'dataMax',
|
||||
type: 'value',
|
||||
axisLabel: { color: '#9CA3AF', hideOverlap: true },
|
||||
splitLine: {
|
||||
lineStyle: {
|
||||
color: '#F3F4F6',
|
||||
},
|
||||
},
|
||||
},
|
||||
series: [
|
||||
{
|
||||
type: 'line',
|
||||
showSymbol: true,
|
||||
symbolSize: 4,
|
||||
lineStyle: {
|
||||
color: chartColors.lineColor,
|
||||
width: 2,
|
||||
},
|
||||
itemStyle: {
|
||||
color: chartColors.lineColor,
|
||||
},
|
||||
areaStyle: {
|
||||
color: {
|
||||
type: 'linear',
|
||||
x: 0,
|
||||
y: 0,
|
||||
x2: 0,
|
||||
y2: 1,
|
||||
colorStops: [{
|
||||
offset: 0,
|
||||
color: chartColors.bgColor[0],
|
||||
}, {
|
||||
offset: 1,
|
||||
color: chartColors.bgColor[1],
|
||||
}],
|
||||
global: false,
|
||||
},
|
||||
},
|
||||
tooltip: {
|
||||
padding: [8, 12, 8, 12],
|
||||
formatter(params) {
|
||||
return getTooltipContent(chartType, valueKey, params as { name: string, data?: AgentMonitoringChartRow })
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
}
|
||||
}
|
||||
92
web/features/agent-v2/agent-detail/monitoring/chart.tsx
Normal file
92
web/features/agent-v2/agent-detail/monitoring/chart.tsx
Normal file
@ -0,0 +1,92 @@
|
||||
'use client'
|
||||
|
||||
import type { AgentMonitoringChartRow, AgentMonitoringChartType } from './chart-utils'
|
||||
import type { I18nKeysWithPrefix } from '@/types/i18n'
|
||||
import ReactECharts from 'echarts-for-react'
|
||||
import { useTranslation } from 'react-i18next'
|
||||
import { Infotip } from '@/app/components/base/infotip'
|
||||
import {
|
||||
buildChartOptions,
|
||||
getChartValueField,
|
||||
getSummaryValue,
|
||||
getTokenSummary,
|
||||
} from './chart-utils'
|
||||
|
||||
type AgentMonitoringChartProps = {
|
||||
titleKey: I18nKeysWithPrefix<'agentV2', 'agentDetail.monitoring.'>
|
||||
explanationKey: I18nKeysWithPrefix<'agentV2', 'agentDetail.monitoring.'>
|
||||
periodName: string
|
||||
rows: AgentMonitoringChartRow[]
|
||||
chartType: AgentMonitoringChartType
|
||||
valueKey?: string
|
||||
isAvg?: boolean
|
||||
unitKey?: I18nKeysWithPrefix<'agentV2', 'agentDetail.monitoring.'>
|
||||
yMax?: number
|
||||
}
|
||||
|
||||
export function AgentMonitoringChart({
|
||||
titleKey,
|
||||
explanationKey,
|
||||
periodName,
|
||||
rows,
|
||||
chartType,
|
||||
valueKey,
|
||||
isAvg,
|
||||
unitKey,
|
||||
yMax,
|
||||
}: AgentMonitoringChartProps) {
|
||||
const { t } = useTranslation('agentV2')
|
||||
const yField = getChartValueField(rows, valueKey)
|
||||
const summaryValue = getSummaryValue({
|
||||
chartType,
|
||||
rows,
|
||||
valueKey: yField,
|
||||
isAvg,
|
||||
unit: unitKey ? t(unitKey) : undefined,
|
||||
})
|
||||
const tokenSummary = getTokenSummary(rows)
|
||||
const options = buildChartOptions({
|
||||
rows,
|
||||
chartType,
|
||||
valueKey: yField,
|
||||
yMax,
|
||||
})
|
||||
const isEmptySummary = summaryValue === '0' || summaryValue.startsWith('0 ')
|
||||
|
||||
return (
|
||||
<article className="flex min-h-63 w-full min-w-0 flex-col rounded-xl border border-components-panel-border bg-components-chart-bg px-6 py-4 shadow-xs">
|
||||
<div className="mb-3 min-w-0">
|
||||
<div className="flex min-w-0 items-center gap-1">
|
||||
<h3 className="truncate system-md-semibold text-text-primary">
|
||||
{t(titleKey)}
|
||||
</h3>
|
||||
<Infotip aria-label={t(explanationKey)}>
|
||||
{t(explanationKey)}
|
||||
</Infotip>
|
||||
</div>
|
||||
<div className="mt-2 system-2xs-medium-uppercase text-text-tertiary">
|
||||
{periodName}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="mb-4">
|
||||
<div className={`truncate text-3xl leading-9 font-normal ${isEmptySummary ? 'text-text-quaternary' : 'text-text-primary'}`}>
|
||||
{summaryValue}
|
||||
</div>
|
||||
{chartType === 'tokenUsage' && (
|
||||
<div className="mt-2 system-2xs-semibold-uppercase text-text-secondary">
|
||||
{t('agentDetail.monitoring.tokenUsageConsumed')}
|
||||
{' '}
|
||||
<span className="text-util-colors-orange-orange-600">
|
||||
(~
|
||||
{tokenSummary}
|
||||
)
|
||||
</span>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
<ReactECharts option={options} style={{ height: 160 }} />
|
||||
</article>
|
||||
)
|
||||
}
|
||||
87
web/features/agent-v2/agent-detail/monitoring/mock-data.ts
Normal file
87
web/features/agent-v2/agent-detail/monitoring/mock-data.ts
Normal file
@ -0,0 +1,87 @@
|
||||
import type { AgentMonitoringChartRow } from './chart-utils'
|
||||
import type { I18nKeysWithPrefix } from '@/types/i18n'
|
||||
import { getDefaultChartData } from './chart-utils'
|
||||
|
||||
type AgentMonitoringMetric = {
|
||||
id: string
|
||||
titleKey: I18nKeysWithPrefix<'agentV2', 'agentDetail.monitoring.'>
|
||||
explanationKey: I18nKeysWithPrefix<'agentV2', 'agentDetail.monitoring.'>
|
||||
chartType: 'conversations' | 'endUsers' | 'tokenUsage'
|
||||
rows: AgentMonitoringChartRow[]
|
||||
valueKey?: string
|
||||
isAvg?: boolean
|
||||
unitKey?: I18nKeysWithPrefix<'agentV2', 'agentDetail.monitoring.'>
|
||||
yMax: number
|
||||
}
|
||||
|
||||
export const getAgentMonitoringMetrics = ({
|
||||
start,
|
||||
end,
|
||||
}: {
|
||||
start: string
|
||||
end: string
|
||||
}): AgentMonitoringMetric[] => [
|
||||
{
|
||||
id: 'total-conversations',
|
||||
titleKey: 'agentDetail.monitoring.metrics.totalConversations.title',
|
||||
explanationKey: 'agentDetail.monitoring.metrics.totalConversations.explanation',
|
||||
chartType: 'conversations',
|
||||
rows: getDefaultChartData({ start, end }),
|
||||
yMax: 500,
|
||||
},
|
||||
{
|
||||
id: 'active-users',
|
||||
titleKey: 'agentDetail.monitoring.metrics.activeUsers.title',
|
||||
explanationKey: 'agentDetail.monitoring.metrics.activeUsers.explanation',
|
||||
chartType: 'endUsers',
|
||||
rows: getDefaultChartData({ start, end }),
|
||||
yMax: 500,
|
||||
},
|
||||
{
|
||||
id: 'avg-session-interactions',
|
||||
titleKey: 'agentDetail.monitoring.metrics.avgSessionInteractions.title',
|
||||
explanationKey: 'agentDetail.monitoring.metrics.avgSessionInteractions.explanation',
|
||||
chartType: 'conversations',
|
||||
rows: getDefaultChartData({ start, end, key: 'interactions' }),
|
||||
valueKey: 'interactions',
|
||||
isAvg: true,
|
||||
yMax: 500,
|
||||
},
|
||||
{
|
||||
id: 'token-output-speed',
|
||||
titleKey: 'agentDetail.monitoring.metrics.tokenOutputSpeed.title',
|
||||
explanationKey: 'agentDetail.monitoring.metrics.tokenOutputSpeed.explanation',
|
||||
chartType: 'conversations',
|
||||
rows: getDefaultChartData({ start, end, key: 'tps' }),
|
||||
valueKey: 'tps',
|
||||
isAvg: true,
|
||||
unitKey: 'agentDetail.monitoring.units.tokenPerSecond',
|
||||
yMax: 100,
|
||||
},
|
||||
{
|
||||
id: 'user-satisfaction-rate',
|
||||
titleKey: 'agentDetail.monitoring.metrics.userSatisfactionRate.title',
|
||||
explanationKey: 'agentDetail.monitoring.metrics.userSatisfactionRate.explanation',
|
||||
chartType: 'endUsers',
|
||||
rows: getDefaultChartData({ start, end, key: 'rate' }),
|
||||
valueKey: 'rate',
|
||||
isAvg: true,
|
||||
yMax: 1000,
|
||||
},
|
||||
{
|
||||
id: 'token-usage',
|
||||
titleKey: 'agentDetail.monitoring.metrics.tokenUsage.title',
|
||||
explanationKey: 'agentDetail.monitoring.metrics.tokenUsage.explanation',
|
||||
chartType: 'tokenUsage',
|
||||
rows: getDefaultChartData({ start, end }),
|
||||
yMax: 100,
|
||||
},
|
||||
{
|
||||
id: 'total-messages',
|
||||
titleKey: 'agentDetail.monitoring.metrics.totalMessages.title',
|
||||
explanationKey: 'agentDetail.monitoring.metrics.totalMessages.explanation',
|
||||
chartType: 'conversations',
|
||||
rows: getDefaultChartData({ start, end }),
|
||||
yMax: 500,
|
||||
},
|
||||
]
|
||||
161
web/features/agent-v2/agent-detail/monitoring/page.tsx
Normal file
161
web/features/agent-v2/agent-detail/monitoring/page.tsx
Normal file
@ -0,0 +1,161 @@
|
||||
'use client'
|
||||
|
||||
import type { AgentAccessSource } from '../access/access-sources'
|
||||
import { Button } from '@langgenius/dify-ui/button'
|
||||
import { Select, SelectContent, SelectItem, SelectItemIndicator, SelectItemText, SelectTrigger } from '@langgenius/dify-ui/select'
|
||||
import dayjs from 'dayjs'
|
||||
import { useState } from 'react'
|
||||
import { useTranslation } from 'react-i18next'
|
||||
import { agentAccessSources } from '../access/access-sources'
|
||||
import { AgentMonitoringChart } from './chart'
|
||||
import { getAgentMonitoringMetrics } from './mock-data'
|
||||
|
||||
type TimeRangeKey = 'today' | 'last7days' | 'last30days'
|
||||
type SourceFilterValue = 'all' | AgentAccessSource['nameKey']
|
||||
|
||||
const queryDateFormat = 'YYYY-MM-DD HH:mm'
|
||||
const displayDateFormat = 'MMM D'
|
||||
|
||||
const timeRangeOptions: Array<{ value: TimeRangeKey, days: number }> = [
|
||||
{ value: 'today', days: 0 },
|
||||
{ value: 'last7days', days: 7 },
|
||||
{ value: 'last30days', days: 30 },
|
||||
]
|
||||
|
||||
const getPeriod = (timeRange: TimeRangeKey) => {
|
||||
const option = timeRangeOptions.find(item => item.value === timeRange) ?? timeRangeOptions[0]!
|
||||
const end = dayjs().endOf('day')
|
||||
const start = option.days === 0
|
||||
? dayjs().startOf('day')
|
||||
: dayjs().subtract(option.days, 'day').startOf('day')
|
||||
|
||||
return {
|
||||
query: {
|
||||
start: start.format(queryDateFormat),
|
||||
end: end.format(queryDateFormat),
|
||||
},
|
||||
dateLabel: `${start.format(displayDateFormat)} - ${end.format(displayDateFormat)}`,
|
||||
}
|
||||
}
|
||||
|
||||
const getSourceValue = (source: AgentAccessSource): SourceFilterValue => source.nameKey
|
||||
|
||||
export function AgentMonitoringPage() {
|
||||
const { t } = useTranslation('agentV2')
|
||||
const [timeRange, setTimeRange] = useState<TimeRangeKey>('today')
|
||||
const [sourceFilter, setSourceFilter] = useState<SourceFilterValue>(agentAccessSources[0] ? getSourceValue(agentAccessSources[0]) : 'all')
|
||||
const selectedTimeRange = timeRangeOptions.find(option => option.value === timeRange) ?? timeRangeOptions[0]!
|
||||
const selectedSource = agentAccessSources.find(source => getSourceValue(source) === sourceFilter)
|
||||
const period = getPeriod(timeRange)
|
||||
const metrics = getAgentMonitoringMetrics(period.query)
|
||||
|
||||
return (
|
||||
<section
|
||||
aria-label={t('agentDetail.sections.monitoring')}
|
||||
className="h-full min-w-0 flex-1 overflow-auto bg-components-panel-bg-blur px-4 py-6 sm:px-12"
|
||||
>
|
||||
<div className="mx-auto max-w-none">
|
||||
<header className="mb-4 flex min-w-0 flex-wrap items-center gap-2">
|
||||
<h2 className="mr-2 system-xl-semibold text-text-primary">
|
||||
{t('agentDetail.monitoring.title')}
|
||||
</h2>
|
||||
|
||||
<Select
|
||||
value={timeRange}
|
||||
onValueChange={(nextValue) => {
|
||||
if (nextValue)
|
||||
setTimeRange(nextValue as TimeRangeKey)
|
||||
}}
|
||||
>
|
||||
<SelectTrigger
|
||||
aria-label={t('agentDetail.monitoring.timeRangeLabel')}
|
||||
className="mt-0 w-fit max-w-full min-w-25"
|
||||
>
|
||||
{t(`agentDetail.monitoring.timeRanges.${selectedTimeRange.value}`)}
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
{timeRangeOptions.map(option => (
|
||||
<SelectItem key={option.value} value={option.value}>
|
||||
<SelectItemText>{t(`agentDetail.monitoring.timeRanges.${option.value}`)}</SelectItemText>
|
||||
<SelectItemIndicator />
|
||||
</SelectItem>
|
||||
))}
|
||||
</SelectContent>
|
||||
</Select>
|
||||
|
||||
<Button
|
||||
type="button"
|
||||
variant="secondary"
|
||||
className="h-8 gap-2 px-3"
|
||||
aria-label={t('agentDetail.monitoring.dateRangeLabel')}
|
||||
>
|
||||
<span aria-hidden className="i-ri-calendar-line size-4" />
|
||||
{period.dateLabel}
|
||||
</Button>
|
||||
|
||||
<Select
|
||||
value={sourceFilter}
|
||||
onValueChange={(nextValue) => {
|
||||
if (nextValue)
|
||||
setSourceFilter(nextValue as SourceFilterValue)
|
||||
}}
|
||||
>
|
||||
<SelectTrigger
|
||||
aria-label={t('agentDetail.monitoring.sourceLabel')}
|
||||
className="mt-0 w-fit max-w-full min-w-34"
|
||||
>
|
||||
<span className="inline-flex max-w-full min-w-0 items-center gap-1.5 align-middle">
|
||||
<span aria-hidden className={`${selectedSource?.icon ?? 'i-ri-stack-line'} size-4 shrink-0`} />
|
||||
<span className="min-w-0 truncate">
|
||||
{selectedSource ? t(selectedSource.nameKey) : t('agentDetail.monitoring.sources.all')}
|
||||
</span>
|
||||
</span>
|
||||
</SelectTrigger>
|
||||
<SelectContent popupClassName="w-61">
|
||||
<div className="px-3 pt-2 pb-1 system-2xs-semibold-uppercase text-text-tertiary">
|
||||
{t('agentDetail.monitoring.pickSource')}
|
||||
</div>
|
||||
<SelectItem value="all">
|
||||
<SelectItemText>
|
||||
<span className="flex items-center gap-2">
|
||||
<span aria-hidden className="i-ri-stack-line size-4 text-text-tertiary" />
|
||||
{t('agentDetail.monitoring.sources.all')}
|
||||
</span>
|
||||
</SelectItemText>
|
||||
<SelectItemIndicator />
|
||||
</SelectItem>
|
||||
{agentAccessSources.map(source => (
|
||||
<SelectItem key={source.nameKey} value={getSourceValue(source)}>
|
||||
<SelectItemText>
|
||||
<span className="flex items-center gap-2">
|
||||
<span aria-hidden className={`${source.icon} size-4 text-text-accent-light-mode-only`} />
|
||||
{t(source.nameKey)}
|
||||
</span>
|
||||
</SelectItemText>
|
||||
<SelectItemIndicator />
|
||||
</SelectItem>
|
||||
))}
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</header>
|
||||
|
||||
<div className="grid w-full grid-cols-1 gap-4 xl:grid-cols-2">
|
||||
{metrics.map(metric => (
|
||||
<AgentMonitoringChart
|
||||
key={metric.id}
|
||||
titleKey={metric.titleKey}
|
||||
explanationKey={metric.explanationKey}
|
||||
periodName={t(`agentDetail.monitoring.timeRanges.${selectedTimeRange.value}`)}
|
||||
rows={metric.rows}
|
||||
chartType={metric.chartType}
|
||||
valueKey={metric.valueKey}
|
||||
isAvg={metric.isAvg}
|
||||
unitKey={metric.unitKey}
|
||||
yMax={metric.yMax}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
)
|
||||
}
|
||||
149
web/features/agent-v2/agent-detail/navigation.tsx
Normal file
149
web/features/agent-v2/agent-detail/navigation.tsx
Normal file
@ -0,0 +1,149 @@
|
||||
'use client'
|
||||
|
||||
import type { AgentDetailSectionKey } from './section'
|
||||
import { cn } from '@langgenius/dify-ui/cn'
|
||||
import { useTranslation } from 'react-i18next'
|
||||
import { GOTO_ANYTHING_OPEN_EVENT } from '@/app/components/goto-anything/hooks'
|
||||
import Link from '@/next/link'
|
||||
import { usePathname, useRouter } from '@/next/navigation'
|
||||
import { getAgentDetailPath, getAgentIdFromPathname } from './routes'
|
||||
|
||||
type AgentDetailNavItem = {
|
||||
labelKey: `agentDetail.sections.${AgentDetailSectionKey}`
|
||||
href: string
|
||||
icon: string
|
||||
activeIcon: string
|
||||
}
|
||||
|
||||
const getAgentDetailNavigation = (agentId: string): AgentDetailNavItem[] => [
|
||||
{
|
||||
labelKey: 'agentDetail.sections.configure',
|
||||
href: getAgentDetailPath(agentId, 'configure'),
|
||||
icon: 'i-ri-node-tree',
|
||||
activeIcon: 'i-ri-node-tree',
|
||||
},
|
||||
{
|
||||
labelKey: 'agentDetail.sections.access',
|
||||
href: getAgentDetailPath(agentId, 'access'),
|
||||
icon: 'i-ri-share-forward-line',
|
||||
activeIcon: 'i-ri-share-forward-fill',
|
||||
},
|
||||
{
|
||||
labelKey: 'agentDetail.sections.logs',
|
||||
href: getAgentDetailPath(agentId, 'logs'),
|
||||
icon: 'i-ri-list-check-2',
|
||||
activeIcon: 'i-ri-list-check-2',
|
||||
},
|
||||
{
|
||||
labelKey: 'agentDetail.sections.monitoring',
|
||||
href: getAgentDetailPath(agentId, 'monitoring'),
|
||||
icon: 'i-ri-pulse-line',
|
||||
activeIcon: 'i-ri-pulse-fill',
|
||||
},
|
||||
]
|
||||
|
||||
export function AgentDetailTop() {
|
||||
const { t } = useTranslation()
|
||||
const router = useRouter()
|
||||
|
||||
return (
|
||||
<div className="flex items-center py-3 pr-3 pl-1">
|
||||
<div className="flex min-w-0 flex-1 items-center gap-1.5">
|
||||
<div className="flex shrink-0 items-center py-1 pr-1 pl-0.5">
|
||||
<button
|
||||
type="button"
|
||||
aria-label={t('operation.back', { ns: 'common' })}
|
||||
className="flex size-4 items-center justify-center rounded-sm text-text-tertiary hover:text-text-secondary focus-visible:ring-2 focus-visible:ring-state-accent-solid focus-visible:outline-hidden"
|
||||
onClick={() => router.back()}
|
||||
>
|
||||
<span aria-hidden className="i-ri-arrow-left-s-line size-4" />
|
||||
</button>
|
||||
<Link
|
||||
href="/"
|
||||
aria-label={t('mainNav.home', { ns: 'common' })}
|
||||
className="flex size-4 items-center justify-center rounded-sm text-text-tertiary hover:text-text-secondary focus-visible:ring-2 focus-visible:ring-state-accent-solid focus-visible:outline-hidden"
|
||||
>
|
||||
<span aria-hidden className="i-custom-vender-main-nav-app-home size-4" />
|
||||
</Link>
|
||||
</div>
|
||||
<span className="mx-1.5 shrink-0 system-md-regular text-text-quaternary">
|
||||
/
|
||||
</span>
|
||||
<Link href="/roster" className="shrink-0 truncate rounded-sm system-sm-semibold-uppercase text-text-secondary hover:text-text-primary focus-visible:ring-2 focus-visible:ring-state-accent-solid focus-visible:outline-hidden">
|
||||
{t('menus.roster', { ns: 'common' })}
|
||||
</Link>
|
||||
</div>
|
||||
<button
|
||||
type="button"
|
||||
aria-label={t('gotoAnything.searchTitle', { ns: 'app' })}
|
||||
className="flex shrink-0 items-center gap-1 overflow-hidden rounded-[10px] p-1 text-text-tertiary transition-colors hover:bg-state-base-hover hover:text-text-secondary focus-visible:ring-2 focus-visible:ring-state-accent-solid focus-visible:outline-hidden"
|
||||
onClick={() => window.dispatchEvent(new Event(GOTO_ANYTHING_OPEN_EVENT))}
|
||||
>
|
||||
<span aria-hidden className="i-custom-vender-main-nav-quick-search size-4" />
|
||||
<span className="rounded-[5px] border border-divider-deep bg-components-badge-bg-dimm px-1 py-0.5 system-2xs-medium-uppercase text-text-tertiary">
|
||||
⌘K
|
||||
</span>
|
||||
</button>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
export function AgentDetailSection() {
|
||||
const { t } = useTranslation('agentV2')
|
||||
const pathname = usePathname()
|
||||
const agentId = getAgentIdFromPathname(pathname)
|
||||
|
||||
if (!agentId)
|
||||
return null
|
||||
|
||||
const navigation = getAgentDetailNavigation(agentId)
|
||||
|
||||
return (
|
||||
<div className="flex min-h-0 flex-1 flex-col px-2 pb-2">
|
||||
<div className="py-2">
|
||||
<div className="flex items-center rounded-xl p-2">
|
||||
<div className="mr-2 flex size-8 shrink-0 items-center justify-center rounded-lg bg-text-accent text-text-primary-on-surface shadow-xs">
|
||||
<span aria-hidden className="i-custom-vender-solid-mediaAndDevices-robot size-4" />
|
||||
</div>
|
||||
<div className="min-w-0">
|
||||
<div className="truncate system-md-semibold text-text-secondary">
|
||||
{t('agentDetail.title')}
|
||||
</div>
|
||||
<div className="system-2xs-medium-uppercase text-text-tertiary">
|
||||
{t('agentDetail.type')}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="px-2 py-2">
|
||||
<div className="h-px bg-linear-to-r from-divider-subtle to-background-gradient-mask-transparent" />
|
||||
</div>
|
||||
<nav className="flex flex-col gap-y-0.5 px-1 py-2" aria-label={t('agentDetail.navigationLabel')}>
|
||||
{navigation.map((item) => {
|
||||
const isActive = pathname === item.href
|
||||
const icon = isActive ? item.activeIcon : item.icon
|
||||
|
||||
return (
|
||||
<Link
|
||||
key={item.href}
|
||||
href={item.href}
|
||||
aria-current={isActive ? 'page' : undefined}
|
||||
className={cn(
|
||||
'flex h-8 items-center rounded-lg border-t-[0.75px] border-r-[0.25px] border-b-[0.25px] border-l-[0.75px] pr-1 pl-3',
|
||||
isActive
|
||||
? 'border-effects-highlight-lightmode-off bg-components-menu-item-bg-active system-sm-semibold text-text-accent-light-mode-only'
|
||||
: 'border-transparent system-sm-medium text-components-menu-item-text hover:bg-components-menu-item-bg-hover hover:text-components-menu-item-text-hover',
|
||||
'focus-visible:ring-2 focus-visible:ring-state-accent-solid focus-visible:outline-hidden',
|
||||
)}
|
||||
>
|
||||
<span aria-hidden className={`${icon} size-4 shrink-0`} />
|
||||
<span className="ml-2 overflow-hidden whitespace-nowrap">
|
||||
{t(item.labelKey)}
|
||||
</span>
|
||||
</Link>
|
||||
)
|
||||
})}
|
||||
</nav>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
44
web/features/agent-v2/agent-detail/page.tsx
Normal file
44
web/features/agent-v2/agent-detail/page.tsx
Normal file
@ -0,0 +1,44 @@
|
||||
'use client'
|
||||
|
||||
import type { AgentDetailSectionKey } from './section'
|
||||
import { useTranslation } from 'react-i18next'
|
||||
import { AgentAccessPage } from './access/page'
|
||||
import { MemorySettings } from './configure/memory-settings'
|
||||
import { AgentLogsPage } from './logs/page'
|
||||
import { AgentMonitoringPage } from './monitoring/page'
|
||||
|
||||
type AgentDetailPageProps = {
|
||||
agentId: string
|
||||
section: AgentDetailSectionKey
|
||||
}
|
||||
|
||||
export function AgentDetailPage({
|
||||
agentId,
|
||||
section,
|
||||
}: AgentDetailPageProps) {
|
||||
const { t } = useTranslation('agentV2')
|
||||
|
||||
if (section === 'monitoring')
|
||||
return <AgentMonitoringPage />
|
||||
|
||||
if (section === 'logs')
|
||||
return <AgentLogsPage />
|
||||
|
||||
if (section === 'access')
|
||||
return <AgentAccessPage agentId={agentId} />
|
||||
|
||||
if (section === 'configure') {
|
||||
return (
|
||||
<section
|
||||
aria-label={t('agentDetail.sections.configure')}
|
||||
className="h-full min-w-0 flex-1 overflow-auto bg-components-panel-bg-blur px-4 py-6 sm:px-12"
|
||||
>
|
||||
<div className="mx-auto max-w-3xl">
|
||||
<MemorySettings />
|
||||
</div>
|
||||
</section>
|
||||
)
|
||||
}
|
||||
|
||||
return null
|
||||
}
|
||||
15
web/features/agent-v2/agent-detail/routes.ts
Normal file
15
web/features/agent-v2/agent-detail/routes.ts
Normal file
@ -0,0 +1,15 @@
|
||||
import type { AgentDetailSectionKey } from './section'
|
||||
|
||||
export const getAgentDetailPath = (
|
||||
agentId: string,
|
||||
section: AgentDetailSectionKey,
|
||||
) => `/roster/${agentId}/${section}`
|
||||
|
||||
export const getAgentIdFromPathname = (pathname: string) => {
|
||||
const [section, agentId] = pathname.split('/').filter(Boolean)
|
||||
|
||||
if (section !== 'roster')
|
||||
return undefined
|
||||
|
||||
return agentId
|
||||
}
|
||||
1
web/features/agent-v2/agent-detail/section.ts
Normal file
1
web/features/agent-v2/agent-detail/section.ts
Normal file
@ -0,0 +1 @@
|
||||
export type AgentDetailSectionKey = 'configure' | 'access' | 'logs' | 'monitoring'
|
||||
20
web/features/agent-v2/roster/__tests__/page.spec.tsx
Normal file
20
web/features/agent-v2/roster/__tests__/page.spec.tsx
Normal file
@ -0,0 +1,20 @@
|
||||
import { render, screen } from '@testing-library/react'
|
||||
import RosterPage from '../page'
|
||||
|
||||
vi.mock('@/hooks/use-document-title', () => ({
|
||||
default: vi.fn(),
|
||||
}))
|
||||
|
||||
describe('RosterPage', () => {
|
||||
it('renders the agent roster shell without fetching feature data', () => {
|
||||
render(<RosterPage />)
|
||||
|
||||
expect(screen.getByRole('heading', { name: 'common.menus.roster', level: 1 })).toBeInTheDocument()
|
||||
expect(screen.getByRole('heading', { name: 'agentV2.roster.title', level: 2 })).toBeInTheDocument()
|
||||
expect(screen.getByRole('navigation', { name: 'agentV2.roster.sidebarLabel' })).toBeInTheDocument()
|
||||
expect(screen.getByPlaceholderText('agentV2.roster.searchPlaceholder')).toBeInTheDocument()
|
||||
expect(screen.getByText('Iris - Clarification Drafter')).toBeInTheDocument()
|
||||
expect(screen.getByText('Aiko - Document Translator')).toBeInTheDocument()
|
||||
expect(screen.getAllByRole('link', { name: /agentV2\.roster\.editAgent/ })[0]).toHaveAttribute('href', '/roster/iris/configure')
|
||||
})
|
||||
})
|
||||
279
web/features/agent-v2/roster/page.tsx
Normal file
279
web/features/agent-v2/roster/page.tsx
Normal file
@ -0,0 +1,279 @@
|
||||
'use client'
|
||||
|
||||
import { Button } from '@langgenius/dify-ui/button'
|
||||
import { cn } from '@langgenius/dify-ui/cn'
|
||||
import { useTranslation } from 'react-i18next'
|
||||
import useDocumentTitle from '@/hooks/use-document-title'
|
||||
import Link from '@/next/link'
|
||||
|
||||
const rosterItems = [
|
||||
{
|
||||
id: 'iris',
|
||||
name: 'Iris',
|
||||
role: 'Clarification Drafter',
|
||||
description: 'Go through supplier clarification questions based on list of tenders',
|
||||
version: 'v5',
|
||||
model: 'claude-opus-4.7',
|
||||
workflowUsage: '4',
|
||||
updatedAt: '2d',
|
||||
colorClassName: 'from-[#6C3CF6] to-[#4B2DDB]',
|
||||
tool: 'tender-analyze',
|
||||
},
|
||||
{
|
||||
id: 'nadia',
|
||||
name: 'Nadia',
|
||||
role: 'Compliance Reviewer',
|
||||
description: 'Checks tender responses against mandatory requirements and red flags',
|
||||
version: 'v3',
|
||||
model: 'claude-opus-4.7',
|
||||
workflowUsage: '4',
|
||||
updatedAt: '6d',
|
||||
colorClassName: 'from-[#D4479B] to-[#B93685]',
|
||||
tool: 'compliance-che',
|
||||
},
|
||||
{
|
||||
id: 'marko',
|
||||
name: 'Marko',
|
||||
role: 'Pricing Analyst',
|
||||
description: 'Normalizes supplier pricing across currencies and payment terms',
|
||||
version: 'v3',
|
||||
model: 'claude-sonnet-4.7',
|
||||
workflowUsage: '0',
|
||||
updatedAt: '11d',
|
||||
colorClassName: 'from-[#F59E0B] to-[#D97706]',
|
||||
tool: 'fx-normalizer',
|
||||
},
|
||||
{
|
||||
id: 'aiko',
|
||||
name: 'Aiko',
|
||||
role: 'Document Translator',
|
||||
description: 'Translates supplier responses into the tender language for evaluators',
|
||||
version: 'v2',
|
||||
model: 'claude-haiku-4.5',
|
||||
workflowUsage: '0',
|
||||
updatedAt: '1mo',
|
||||
colorClassName: 'from-[#4BA9C9] to-[#2A7F9E]',
|
||||
tool: 'multilingual-t',
|
||||
draft: true,
|
||||
},
|
||||
]
|
||||
|
||||
const rosterNavItems = [
|
||||
{ labelKey: 'roster.sidebar.agents', count: 4, icon: 'i-custom-vender-solid-mediaAndDevices-robot' },
|
||||
{ labelKey: 'roster.sidebar.humans', count: 8, icon: 'i-ri-group-line' },
|
||||
] as const
|
||||
|
||||
const filterItems = [
|
||||
'roster.filters.all',
|
||||
'roster.filters.inUse',
|
||||
'roster.filters.drafts',
|
||||
] as const
|
||||
|
||||
export default function RosterPage() {
|
||||
const { t } = useTranslation()
|
||||
const { t: tAgentV2 } = useTranslation('agentV2')
|
||||
|
||||
useDocumentTitle(t('menus.roster', { ns: 'common' }))
|
||||
|
||||
return (
|
||||
<main className="flex h-full min-w-0 overflow-hidden bg-background-section">
|
||||
<aside className="flex w-62 shrink-0 flex-col border-r border-divider-subtle bg-background-body px-3 py-6">
|
||||
<h1 className="px-2 title-2xl-semi-bold text-text-primary">
|
||||
{t('menus.roster', { ns: 'common' })}
|
||||
</h1>
|
||||
<nav className="mt-5 space-y-1" aria-label={tAgentV2('roster.sidebarLabel')}>
|
||||
{rosterNavItems.map((item, index) => {
|
||||
const active = index === 0
|
||||
|
||||
return (
|
||||
<button
|
||||
key={item.labelKey}
|
||||
type="button"
|
||||
aria-current={active ? 'page' : undefined}
|
||||
className={[
|
||||
'flex h-11 w-full items-center gap-2 rounded-xl px-3 text-left transition-colors focus-visible:ring-2 focus-visible:ring-state-accent-solid focus-visible:outline-hidden',
|
||||
active
|
||||
? 'bg-state-accent-hover text-text-accent'
|
||||
: 'text-text-secondary hover:bg-state-base-hover',
|
||||
].join(' ')}
|
||||
>
|
||||
<span aria-hidden className={`${item.icon} size-4 shrink-0`} />
|
||||
<span className="min-w-0 flex-1 truncate system-sm-semibold">
|
||||
{tAgentV2(item.labelKey)}
|
||||
</span>
|
||||
<span className="flex h-5 min-w-5 items-center justify-center rounded-full bg-components-badge-bg-dimm px-1.5 system-xs-medium text-text-tertiary">
|
||||
{item.count}
|
||||
</span>
|
||||
</button>
|
||||
)
|
||||
})}
|
||||
</nav>
|
||||
<div className="mt-auto rounded-xl border border-components-panel-border bg-components-panel-on-panel-item-bg px-5 py-4 text-center shadow-xs">
|
||||
<div className="mx-auto mb-2 flex w-fit -space-x-2">
|
||||
{['N', 'M', 'A'].map(initial => (
|
||||
<span key={initial} className="flex size-6 items-center justify-center rounded-full border border-components-panel-on-panel-item-bg bg-text-accent system-xs-semibold text-text-primary-on-surface">
|
||||
{initial}
|
||||
</span>
|
||||
))}
|
||||
</div>
|
||||
<p className="system-xs-medium text-text-tertiary">
|
||||
{tAgentV2('roster.marketplaceCta')}
|
||||
</p>
|
||||
</div>
|
||||
</aside>
|
||||
|
||||
<section className="min-w-0 flex-1 overflow-auto px-8 py-8">
|
||||
<header className="max-w-5xl">
|
||||
<div className="flex flex-wrap items-center gap-2">
|
||||
<h2 className="title-2xl-semi-bold text-text-primary">
|
||||
{tAgentV2('roster.title')}
|
||||
</h2>
|
||||
<a
|
||||
href="https://docs.dify.ai/"
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
className="inline-flex items-center gap-1 rounded-md system-xs-semibold text-text-accent hover:underline focus-visible:ring-2 focus-visible:ring-state-accent-solid focus-visible:outline-hidden"
|
||||
>
|
||||
{tAgentV2('roster.learnMore')}
|
||||
<span aria-hidden className="i-ri-arrow-right-up-line size-3" />
|
||||
</a>
|
||||
</div>
|
||||
<p className="mt-3 max-w-3xl system-sm-regular text-text-tertiary">
|
||||
{tAgentV2('roster.description')}
|
||||
</p>
|
||||
</header>
|
||||
|
||||
<div className="mt-6 flex flex-wrap items-center gap-3 border-t border-divider-subtle pt-6">
|
||||
<label className="relative block w-82 max-w-full">
|
||||
<span className="sr-only">{tAgentV2('roster.searchLabel')}</span>
|
||||
<span aria-hidden className="pointer-events-none absolute top-1/2 left-3 i-ri-search-line size-4 -translate-y-1/2 text-text-tertiary" />
|
||||
<input
|
||||
type="search"
|
||||
name="agent-search"
|
||||
autoComplete="off"
|
||||
readOnly
|
||||
className="h-9 w-full rounded-lg border border-components-panel-border bg-components-input-bg-normal pr-3 pl-9 system-sm-regular text-text-secondary outline-hidden focus-visible:ring-2 focus-visible:ring-state-accent-solid"
|
||||
placeholder={tAgentV2('roster.searchPlaceholder')}
|
||||
/>
|
||||
</label>
|
||||
<div className="flex h-9 items-center rounded-lg border border-components-panel-border bg-components-panel-on-panel-item-bg p-0.5 shadow-xs">
|
||||
{filterItems.map((filter, index) => (
|
||||
<button
|
||||
key={filter}
|
||||
type="button"
|
||||
aria-pressed={index === 0}
|
||||
className={[
|
||||
'h-8 rounded-md px-3 system-sm-semibold transition-colors focus-visible:ring-2 focus-visible:ring-state-accent-solid focus-visible:outline-hidden',
|
||||
index === 0
|
||||
? 'bg-state-base-hover text-text-secondary shadow-xs'
|
||||
: 'text-text-tertiary hover:text-text-secondary',
|
||||
].join(' ')}
|
||||
>
|
||||
{tAgentV2(filter)}
|
||||
</button>
|
||||
))}
|
||||
</div>
|
||||
<div className="ml-auto flex min-w-0 items-center gap-2">
|
||||
<Button className="gap-1.5" disabled>
|
||||
<span aria-hidden className="i-custom-vender-solid-mediaAndDevices-robot size-4" />
|
||||
{tAgentV2('roster.connectOwnAgent')}
|
||||
<span className="rounded bg-components-badge-bg-dimm px-1 system-2xs-semibold-uppercase text-text-tertiary">
|
||||
{tAgentV2('roster.soon')}
|
||||
</span>
|
||||
</Button>
|
||||
<Button variant="primary" className="min-w-40 gap-1.5" disabled>
|
||||
<span aria-hidden className="i-ri-add-line size-4" />
|
||||
{tAgentV2('roster.createAgent')}
|
||||
</Button>
|
||||
<Button className="px-2.5" aria-label={tAgentV2('roster.listView')}>
|
||||
<span aria-hidden className="i-ri-list-unordered size-4" />
|
||||
</Button>
|
||||
<Button className="px-2.5" aria-label={tAgentV2('roster.gridView')}>
|
||||
<span aria-hidden className="i-ri-grid-line size-4" />
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="mt-5 space-y-3">
|
||||
{rosterItems.map(item => (
|
||||
<article
|
||||
key={item.id}
|
||||
className={[
|
||||
'flex min-h-19 min-w-0 items-center gap-4 rounded-xl border bg-components-panel-on-panel-item-bg px-4 py-3 shadow-xs',
|
||||
item.draft
|
||||
? 'border-text-warning/35 bg-util-colors-warning-warning-50/40'
|
||||
: 'border-components-panel-border',
|
||||
].join(' ')}
|
||||
>
|
||||
<div className={`flex size-12 shrink-0 items-center justify-center rounded-full bg-linear-to-br ${item.colorClassName} text-text-primary-on-surface shadow-xs ring-2 ring-components-panel-on-panel-item-bg`}>
|
||||
<span aria-hidden className="i-custom-vender-solid-mediaAndDevices-robot size-5" />
|
||||
</div>
|
||||
<div className="min-w-65 flex-1">
|
||||
<div className="flex min-w-0 items-center gap-2">
|
||||
<h3 className="truncate system-md-semibold text-text-primary">
|
||||
{item.name}
|
||||
{' '}
|
||||
-
|
||||
{' '}
|
||||
{item.role}
|
||||
</h3>
|
||||
<span className="shrink-0 system-xs-regular text-text-tertiary">{item.version}</span>
|
||||
{item.draft && (
|
||||
<span className="shrink-0 rounded border border-text-warning/40 bg-util-colors-warning-warning-50 px-1.5 system-2xs-semibold-uppercase text-text-warning">
|
||||
{tAgentV2('roster.draft')}
|
||||
</span>
|
||||
)}
|
||||
</div>
|
||||
<p className="mt-1 truncate system-sm-regular text-text-tertiary">
|
||||
{item.description}
|
||||
</p>
|
||||
</div>
|
||||
<div className="hidden min-w-44 items-center gap-2 xl:flex">
|
||||
<span aria-hidden className="i-ri-sparkling-line size-3.5 text-text-tertiary" />
|
||||
<span className="code-sm-regular text-text-secondary">{item.model}</span>
|
||||
</div>
|
||||
<div className="hidden min-w-37 items-center gap-2 2xl:flex">
|
||||
<span className="rounded-md border border-util-colors-violet-violet-200 bg-util-colors-violet-violet-50 px-2 py-1 code-sm-semibold text-util-colors-violet-violet-700">
|
||||
{item.tool}
|
||||
</span>
|
||||
</div>
|
||||
<div className="hidden w-35.5 shrink-0 text-right system-xs-regular text-text-tertiary lg:block">
|
||||
{Number(item.workflowUsage) > 0
|
||||
? tAgentV2('roster.usedInWorkflows', { count: Number(item.workflowUsage) })
|
||||
: tAgentV2('roster.unused')}
|
||||
<div>{tAgentV2('roster.updated', { time: item.updatedAt })}</div>
|
||||
</div>
|
||||
<div className="flex shrink-0 items-center gap-2">
|
||||
<Link
|
||||
href={`/roster/${item.id}/configure`}
|
||||
aria-label={tAgentV2('roster.editAgent', { name: item.name })}
|
||||
className={cn(
|
||||
'inline-flex h-6 items-center justify-center gap-1 rounded-md border border-components-button-secondary-border bg-components-button-secondary-bg px-2 text-xs font-medium text-components-button-secondary-text shadow-xs backdrop-blur-[5px]',
|
||||
'hover:border-components-button-secondary-border-hover hover:bg-components-button-secondary-bg-hover',
|
||||
'focus-visible:ring-2 focus-visible:ring-state-accent-solid focus-visible:outline-hidden',
|
||||
)}
|
||||
>
|
||||
<span aria-hidden className="i-ri-edit-line size-3.5" />
|
||||
{t('operation.edit', { ns: 'common' })}
|
||||
</Link>
|
||||
<Button
|
||||
size="small"
|
||||
variant="secondary-accent"
|
||||
className="gap-1"
|
||||
aria-label={tAgentV2('roster.inviteAgent', { name: item.name })}
|
||||
disabled
|
||||
>
|
||||
<span aria-hidden className="i-ri-add-circle-fill size-3.5" />
|
||||
{tAgentV2('roster.invite')}
|
||||
</Button>
|
||||
<Button size="small" className="px-1.5" aria-label={tAgentV2('roster.moreActions', { name: item.name })}>
|
||||
<span aria-hidden className="i-ri-more-fill size-4" />
|
||||
</Button>
|
||||
</div>
|
||||
</article>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
)
|
||||
}
|
||||
@ -1,3 +1,4 @@
|
||||
import type agentV2 from '../i18n/en-US/agent-v-2.json'
|
||||
import type appAnnotation from '../i18n/en-US/app-annotation.json'
|
||||
import type appApi from '../i18n/en-US/app-api.json'
|
||||
import type appDebug from '../i18n/en-US/app-debug.json'
|
||||
@ -37,6 +38,7 @@ export type Resources = {
|
||||
appDebug: typeof appDebug
|
||||
appLog: typeof appLog
|
||||
appOverview: typeof appOverview
|
||||
agentV2: typeof agentV2
|
||||
billing: typeof billing
|
||||
common: typeof common
|
||||
custom: typeof custom
|
||||
@ -70,6 +72,7 @@ export const namespaces = [
|
||||
'appDebug',
|
||||
'appLog',
|
||||
'appOverview',
|
||||
'agentV2',
|
||||
'billing',
|
||||
'common',
|
||||
'custom',
|
||||
|
||||
78
web/i18n/ar-TN/agent-v-2.json
Normal file
78
web/i18n/ar-TN/agent-v-2.json
Normal file
@ -0,0 +1,78 @@
|
||||
{
|
||||
"agentDetail.documentTitle": "الوكيل",
|
||||
"agentDetail.history": "السجل",
|
||||
"agentDetail.memorySettings.description": "توفير التكلفة - ضغط ذاكرة التشغيلات الفعلية تلقائيا حسب تفضيل توفير التوكنات. توفير اقل يعني ضغطا اقل وموثوقية افضل مع الوقت.",
|
||||
"agentDetail.memorySettings.export.admin": "مسؤول",
|
||||
"agentDetail.memorySettings.export.description": "قم بتنزيل لقطة كاملة لمخزن ذاكرة الوكيل.",
|
||||
"agentDetail.memorySettings.export.download": "تنزيل",
|
||||
"agentDetail.memorySettings.export.title": "تصدير الذاكرة الحالية",
|
||||
"agentDetail.memorySettings.isolation.description": "عزل الذاكرة - نطاق ما يتذكره الوكيل بين التشغيلات.",
|
||||
"agentDetail.memorySettings.isolation.global.label": "عام",
|
||||
"agentDetail.memorySettings.isolation.global.scope": "مشترك في كل مكان",
|
||||
"agentDetail.memorySettings.isolation.perApp.label": "حسب التطبيق",
|
||||
"agentDetail.memorySettings.isolation.perApp.scope": "معزول لكل workflow",
|
||||
"agentDetail.memorySettings.isolation.perRun.label": "حسب التشغيل",
|
||||
"agentDetail.memorySettings.isolation.perRun.scope": "جديد في كل تشغيل",
|
||||
"agentDetail.memorySettings.strategies.economy.budget": "توكنات الذاكرة <1k",
|
||||
"agentDetail.memorySettings.strategies.economy.label": "اقتصادي",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.budget": "توكنات الذاكرة <100k",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.label": "مدى طويل",
|
||||
"agentDetail.memorySettings.strategies.medium.budget": "توكنات الذاكرة <10k",
|
||||
"agentDetail.memorySettings.strategies.medium.label": "متوسط",
|
||||
"agentDetail.memorySettings.strategyLabel": "استراتيجية الذاكرة",
|
||||
"agentDetail.memorySettings.title": "استراتيجية الذاكرة",
|
||||
"agentDetail.monitoring.change": "{{value}} from previous period",
|
||||
"agentDetail.monitoring.description": "Track the reusable agent activity, cost, and interaction quality across workflows.",
|
||||
"agentDetail.monitoring.metrics.activeUsers.explanation": "Unique end users who triggered workflows using this agent.",
|
||||
"agentDetail.monitoring.metrics.activeUsers.title": "Active Users",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.explanation": "Average number of agent steps completed per run.",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.title": "Avg. Interactions",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.unit": "steps",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.explanation": "Estimated token cost produced by this agent across workflow runs.",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.title": "Token Usage",
|
||||
"agentDetail.monitoring.metrics.totalRuns.explanation": "Total workflow runs that invoked this agent.",
|
||||
"agentDetail.monitoring.metrics.totalRuns.title": "Total Runs",
|
||||
"agentDetail.monitoring.timeRangeLabel": "Time range",
|
||||
"agentDetail.monitoring.timeRanges.last30days": "Last 30 days",
|
||||
"agentDetail.monitoring.timeRanges.last7days": "Last 7 days",
|
||||
"agentDetail.monitoring.timeRanges.today": "Today",
|
||||
"agentDetail.monitoring.title": "Monitoring",
|
||||
"agentDetail.navigationLabel": "تنقل الوكيل",
|
||||
"agentDetail.publish": "نشر",
|
||||
"agentDetail.publishMenu.publishUpdate": "نشر التحديث",
|
||||
"agentDetail.publishMenu.publishUpdateDescription": "ادفع التغييرات إلى كل سير العمل التي تستخدم هذا الوكيل",
|
||||
"agentDetail.publishMenu.saveAsNewAgent": "حفظ كوكيل جديد",
|
||||
"agentDetail.publishMenu.saveAsNewAgentDescription": "أنشئ نسخة منفصلة في القائمة باسمها الخاص",
|
||||
"agentDetail.sections.access": "الوصول والمشاركة",
|
||||
"agentDetail.sections.configure": "الإعداد",
|
||||
"agentDetail.sections.logs": "السجلات",
|
||||
"agentDetail.sections.monitoring": "المراقبة",
|
||||
"agentDetail.subtitle": "معرف الوكيل: {{agentId}}",
|
||||
"agentDetail.title": "الوكيل",
|
||||
"agentDetail.type": "وكيل",
|
||||
"roster.connectOwnAgent": "Connect to Your Own Agent",
|
||||
"roster.createAgent": "Create agent",
|
||||
"roster.description": "Reusable agents saved to this workspace. Drag onto any canvas or attach to a workflow node. Edit once — every workflow using this agent picks up the change.",
|
||||
"roster.draft": "Draft",
|
||||
"roster.editAgent": "تعديل {{name}}",
|
||||
"roster.filters.all": "All 4",
|
||||
"roster.filters.drafts": "Drafts",
|
||||
"roster.filters.inUse": "In use",
|
||||
"roster.gridView": "Grid view",
|
||||
"roster.invite": "Invite",
|
||||
"roster.inviteAgent": "دعوة {{name}}",
|
||||
"roster.learnMore": "Learn more",
|
||||
"roster.listView": "List view",
|
||||
"roster.marketplaceCta": "Discover ready-made agents in Marketplace",
|
||||
"roster.moreActions": "إجراءات إضافية لـ {{name}}",
|
||||
"roster.searchLabel": "Search agents",
|
||||
"roster.searchPlaceholder": "Search agents by name, role, or skill…",
|
||||
"roster.sidebar.agents": "Agents",
|
||||
"roster.sidebar.humans": "Humans",
|
||||
"roster.sidebarLabel": "Roster sections",
|
||||
"roster.soon": "Soon",
|
||||
"roster.title": "Agent Roster",
|
||||
"roster.unused": "Unused",
|
||||
"roster.updated": "updated {{time}} ago",
|
||||
"roster.usedInWorkflows": "Used in {{count}} workflows"
|
||||
}
|
||||
@ -312,6 +312,7 @@
|
||||
"menus.newDataset": "إنشاء معرفة",
|
||||
"menus.plugins": "الإضافات",
|
||||
"menus.pluginsTips": "ادمج الإضافات الخارجية أو أنشئ إضافات AI متوافقة مع ChatGPT.",
|
||||
"menus.roster": "قائمة الوكلاء",
|
||||
"menus.status": "بيتا",
|
||||
"menus.tools": "الأدوات",
|
||||
"model.addMoreModel": "انتقل إلى الإعدادات لإضافة المزيد من النماذج",
|
||||
|
||||
78
web/i18n/de-DE/agent-v-2.json
Normal file
78
web/i18n/de-DE/agent-v-2.json
Normal file
@ -0,0 +1,78 @@
|
||||
{
|
||||
"agentDetail.documentTitle": "Agent",
|
||||
"agentDetail.history": "Verlauf",
|
||||
"agentDetail.memorySettings.description": "Kostensenkung - komprimiert den Speicher realer Ausfuehrungen automatisch nach Ihrer Token-Sparpraeferenz. Weniger Sparen bedeutet weniger Komprimierungen und langfristig bessere Zuverlaessigkeit.",
|
||||
"agentDetail.memorySettings.export.admin": "Admin",
|
||||
"agentDetail.memorySettings.export.description": "Laden Sie einen Snapshot des gesamten Agent-Speichers herunter.",
|
||||
"agentDetail.memorySettings.export.download": "Herunterladen",
|
||||
"agentDetail.memorySettings.export.title": "Aktuellen Speicher exportieren",
|
||||
"agentDetail.memorySettings.isolation.description": "Speicherisolierung - Umfang dessen, was der Agent zwischen Ausfuehrungen beibehaelt.",
|
||||
"agentDetail.memorySettings.isolation.global.label": "Global",
|
||||
"agentDetail.memorySettings.isolation.global.scope": "ueberall geteilt",
|
||||
"agentDetail.memorySettings.isolation.perApp.label": "Pro App",
|
||||
"agentDetail.memorySettings.isolation.perApp.scope": "pro Workflow isoliert",
|
||||
"agentDetail.memorySettings.isolation.perRun.label": "Pro Lauf",
|
||||
"agentDetail.memorySettings.isolation.perRun.scope": "bei jedem Lauf frisch",
|
||||
"agentDetail.memorySettings.strategies.economy.budget": "Speicher-Token <1k",
|
||||
"agentDetail.memorySettings.strategies.economy.label": "Sparsam",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.budget": "Speicher-Token <100k",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.label": "Langfristig",
|
||||
"agentDetail.memorySettings.strategies.medium.budget": "Speicher-Token <10k",
|
||||
"agentDetail.memorySettings.strategies.medium.label": "Mittel",
|
||||
"agentDetail.memorySettings.strategyLabel": "Speicherstrategie",
|
||||
"agentDetail.memorySettings.title": "Speicherstrategie",
|
||||
"agentDetail.monitoring.change": "{{value}} from previous period",
|
||||
"agentDetail.monitoring.description": "Track the reusable agent activity, cost, and interaction quality across workflows.",
|
||||
"agentDetail.monitoring.metrics.activeUsers.explanation": "Unique end users who triggered workflows using this agent.",
|
||||
"agentDetail.monitoring.metrics.activeUsers.title": "Active Users",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.explanation": "Average number of agent steps completed per run.",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.title": "Avg. Interactions",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.unit": "steps",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.explanation": "Estimated token cost produced by this agent across workflow runs.",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.title": "Token Usage",
|
||||
"agentDetail.monitoring.metrics.totalRuns.explanation": "Total workflow runs that invoked this agent.",
|
||||
"agentDetail.monitoring.metrics.totalRuns.title": "Total Runs",
|
||||
"agentDetail.monitoring.timeRangeLabel": "Time range",
|
||||
"agentDetail.monitoring.timeRanges.last30days": "Last 30 days",
|
||||
"agentDetail.monitoring.timeRanges.last7days": "Last 7 days",
|
||||
"agentDetail.monitoring.timeRanges.today": "Today",
|
||||
"agentDetail.monitoring.title": "Monitoring",
|
||||
"agentDetail.navigationLabel": "Agent-Navigation",
|
||||
"agentDetail.publish": "Veröffentlichen",
|
||||
"agentDetail.publishMenu.publishUpdate": "Update veröffentlichen",
|
||||
"agentDetail.publishMenu.publishUpdateDescription": "Änderungen an alle Workflows übertragen, die diesen Agenten verwenden",
|
||||
"agentDetail.publishMenu.saveAsNewAgent": "Als neuen Agenten speichern",
|
||||
"agentDetail.publishMenu.saveAsNewAgentDescription": "Als separaten Roster-Eintrag mit eigenem Namen abzweigen",
|
||||
"agentDetail.sections.access": "Zugriff & Freigabe",
|
||||
"agentDetail.sections.configure": "Konfigurieren",
|
||||
"agentDetail.sections.logs": "Logs",
|
||||
"agentDetail.sections.monitoring": "Monitoring",
|
||||
"agentDetail.subtitle": "Agent-ID: {{agentId}}",
|
||||
"agentDetail.title": "Agent",
|
||||
"agentDetail.type": "AGENT",
|
||||
"roster.connectOwnAgent": "Connect to Your Own Agent",
|
||||
"roster.createAgent": "Create agent",
|
||||
"roster.description": "Reusable agents saved to this workspace. Drag onto any canvas or attach to a workflow node. Edit once — every workflow using this agent picks up the change.",
|
||||
"roster.draft": "Draft",
|
||||
"roster.editAgent": "{{name}} bearbeiten",
|
||||
"roster.filters.all": "All 4",
|
||||
"roster.filters.drafts": "Drafts",
|
||||
"roster.filters.inUse": "In use",
|
||||
"roster.gridView": "Grid view",
|
||||
"roster.invite": "Invite",
|
||||
"roster.inviteAgent": "{{name}} einladen",
|
||||
"roster.learnMore": "Learn more",
|
||||
"roster.listView": "List view",
|
||||
"roster.marketplaceCta": "Discover ready-made agents in Marketplace",
|
||||
"roster.moreActions": "Weitere Aktionen für {{name}}",
|
||||
"roster.searchLabel": "Search agents",
|
||||
"roster.searchPlaceholder": "Search agents by name, role, or skill…",
|
||||
"roster.sidebar.agents": "Agents",
|
||||
"roster.sidebar.humans": "Humans",
|
||||
"roster.sidebarLabel": "Roster sections",
|
||||
"roster.soon": "Soon",
|
||||
"roster.title": "Agent Roster",
|
||||
"roster.unused": "Unused",
|
||||
"roster.updated": "updated {{time}} ago",
|
||||
"roster.usedInWorkflows": "Used in {{count}} workflows"
|
||||
}
|
||||
@ -312,6 +312,7 @@
|
||||
"menus.newDataset": "Wissen erstellen",
|
||||
"menus.plugins": "Integrationen",
|
||||
"menus.pluginsTips": "Integrieren Sie Integrationen von Drittanbietern oder erstellen Sie ChatGPT-kompatible KI-Integrationen.",
|
||||
"menus.roster": "Agent-Verzeichnis",
|
||||
"menus.status": "Beta",
|
||||
"menus.tools": "Werkzeuge",
|
||||
"model.addMoreModel": "Gehen Sie zu den Einstellungen, um mehr Modelle hinzuzufügen",
|
||||
|
||||
124
web/i18n/en-US/agent-v-2.json
Normal file
124
web/i18n/en-US/agent-v-2.json
Normal file
@ -0,0 +1,124 @@
|
||||
{
|
||||
"agentDetail.access.actions.monitoring": "Monitoring",
|
||||
"agentDetail.access.copyReference": "Copy reference for {{name}}",
|
||||
"agentDetail.access.description": "Every surface this agent is reachable from.",
|
||||
"agentDetail.access.entries.webapp.description": "In-app conversations",
|
||||
"agentDetail.access.entries.webapp.lastUsed": "Last used · 12 min ago",
|
||||
"agentDetail.access.entries.webapp.name": "Webapp",
|
||||
"agentDetail.access.entryCount_one": "{{count}} entry",
|
||||
"agentDetail.access.entryCount_other": "{{count}} entries",
|
||||
"agentDetail.access.groups.webapp.heading": "Webapp Access",
|
||||
"agentDetail.access.groups.webapp.label": "Webapp",
|
||||
"agentDetail.access.moreActions": "More actions for {{name}}",
|
||||
"agentDetail.access.status.disabled": "Disabled",
|
||||
"agentDetail.access.status.enabled": "Enabled",
|
||||
"agentDetail.access.title": "Access points",
|
||||
"agentDetail.documentTitle": "Agent",
|
||||
"agentDetail.history": "History",
|
||||
"agentDetail.logs.description": "Review recent runs that invoked this reusable agent across workflows.",
|
||||
"agentDetail.logs.filters.period.allTime": "All time",
|
||||
"agentDetail.logs.filters.period.label": "Log period",
|
||||
"agentDetail.logs.filters.period.last30days": "Last 30 days",
|
||||
"agentDetail.logs.filters.period.last7days": "Last 7 days",
|
||||
"agentDetail.logs.filters.search.label": "Search agent logs",
|
||||
"agentDetail.logs.filters.search.placeholder": "Search run ID, trigger, or user…",
|
||||
"agentDetail.logs.filters.status.all": "All",
|
||||
"agentDetail.logs.filters.status.failed": "Fail",
|
||||
"agentDetail.logs.filters.status.label": "Log status",
|
||||
"agentDetail.logs.filters.status.running": "Running",
|
||||
"agentDetail.logs.filters.status.succeeded": "Success",
|
||||
"agentDetail.logs.table.runtime": "Runtime",
|
||||
"agentDetail.logs.table.startTime": "Start Time",
|
||||
"agentDetail.logs.table.status": "Status",
|
||||
"agentDetail.logs.table.tokens": "Tokens",
|
||||
"agentDetail.logs.table.trigger": "Triggered From",
|
||||
"agentDetail.logs.table.user": "User",
|
||||
"agentDetail.logs.title": "Agent Logs",
|
||||
"agentDetail.logs.triggers.debugRun": "Debug Run",
|
||||
"agentDetail.logs.triggers.workflowNode": "Workflow Node",
|
||||
"agentDetail.memorySettings.description": "Cost saving - automatically compact memory of actual runs based on your token-saving preference. Less token-saving means fewer memory compactions and better reliability over time.",
|
||||
"agentDetail.memorySettings.export.admin": "Admin",
|
||||
"agentDetail.memorySettings.export.description": "Download a snapshot of the agent's entire memory store.",
|
||||
"agentDetail.memorySettings.export.download": "Download",
|
||||
"agentDetail.memorySettings.export.title": "Export current memory",
|
||||
"agentDetail.memorySettings.isolation.description": "Memory isolation - scope of what the agent remembers between runs.",
|
||||
"agentDetail.memorySettings.isolation.global.label": "Global",
|
||||
"agentDetail.memorySettings.isolation.global.scope": "shared everywhere",
|
||||
"agentDetail.memorySettings.isolation.perApp.label": "Per app",
|
||||
"agentDetail.memorySettings.isolation.perApp.scope": "isolated per workflow",
|
||||
"agentDetail.memorySettings.isolation.perRun.label": "Per run",
|
||||
"agentDetail.memorySettings.isolation.perRun.scope": "fresh each run",
|
||||
"agentDetail.memorySettings.strategies.economy.budget": "memory tokens <1k",
|
||||
"agentDetail.memorySettings.strategies.economy.label": "Economy",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.budget": "memory tokens <100k",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.label": "Long-horizon",
|
||||
"agentDetail.memorySettings.strategies.medium.budget": "memory tokens <10k",
|
||||
"agentDetail.memorySettings.strategies.medium.label": "Medium",
|
||||
"agentDetail.memorySettings.strategyLabel": "Memory strategy",
|
||||
"agentDetail.memorySettings.title": "Memory Strategy",
|
||||
"agentDetail.monitoring.change": "{{value}} from previous period",
|
||||
"agentDetail.monitoring.dateRangeLabel": "Date range",
|
||||
"agentDetail.monitoring.description": "Track the reusable agent activity, cost, and interaction quality across workflows.",
|
||||
"agentDetail.monitoring.metrics.activeUsers.explanation": "Unique end users who triggered workflows using this agent.",
|
||||
"agentDetail.monitoring.metrics.activeUsers.title": "Active Users",
|
||||
"agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "Continuous user-agent communication count for this access point.",
|
||||
"agentDetail.monitoring.metrics.avgSessionInteractions.title": "Avg. Session Interactions",
|
||||
"agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "Average output speed from the beginning of the request to completion.",
|
||||
"agentDetail.monitoring.metrics.tokenOutputSpeed.title": "Token Output Speed",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.explanation": "Estimated token cost produced by this agent across workflow runs.",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.title": "Token Usage",
|
||||
"agentDetail.monitoring.metrics.totalConversations.explanation": "Daily AI conversations that reached this agent through the selected access point.",
|
||||
"agentDetail.monitoring.metrics.totalConversations.title": "Total Conversations",
|
||||
"agentDetail.monitoring.metrics.totalMessages.explanation": "Daily agent interaction count.",
|
||||
"agentDetail.monitoring.metrics.totalMessages.title": "Total Messages",
|
||||
"agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "The number of likes per 1,000 messages for this agent.",
|
||||
"agentDetail.monitoring.metrics.userSatisfactionRate.title": "User Satisfaction Rate",
|
||||
"agentDetail.monitoring.pickSource": "Pick an app",
|
||||
"agentDetail.monitoring.sourceLabel": "App",
|
||||
"agentDetail.monitoring.sources.all": "All",
|
||||
"agentDetail.monitoring.timeRangeLabel": "Time range",
|
||||
"agentDetail.monitoring.timeRanges.last30days": "Last 30 days",
|
||||
"agentDetail.monitoring.timeRanges.last7days": "Last 7 days",
|
||||
"agentDetail.monitoring.timeRanges.today": "Today",
|
||||
"agentDetail.monitoring.title": "Monitoring",
|
||||
"agentDetail.monitoring.tokenUsageConsumed": "Consumed tokens",
|
||||
"agentDetail.monitoring.units.tokenPerSecond": "Token/s",
|
||||
"agentDetail.navigationLabel": "Agent navigation",
|
||||
"agentDetail.publish": "Publish",
|
||||
"agentDetail.publishMenu.publishUpdate": "Publish Update",
|
||||
"agentDetail.publishMenu.publishUpdateDescription": "Push changes to all workflows using this agent",
|
||||
"agentDetail.publishMenu.saveAsNewAgent": "Save as a New Agent",
|
||||
"agentDetail.publishMenu.saveAsNewAgentDescription": "Fork into a separate roster entry with its own name",
|
||||
"agentDetail.sections.access": "Access & Sharing",
|
||||
"agentDetail.sections.configure": "Configure",
|
||||
"agentDetail.sections.logs": "Logs",
|
||||
"agentDetail.sections.monitoring": "Monitoring",
|
||||
"agentDetail.subtitle": "Agent ID: {{agentId}}",
|
||||
"agentDetail.title": "Agent",
|
||||
"agentDetail.type": "AGENT",
|
||||
"roster.connectOwnAgent": "Connect to Your Own Agent",
|
||||
"roster.createAgent": "Create agent",
|
||||
"roster.description": "Reusable agents saved to this workspace. Drag onto any canvas or attach to a workflow node. Edit once — every workflow using this agent picks up the change.",
|
||||
"roster.draft": "Draft",
|
||||
"roster.editAgent": "Edit {{name}}",
|
||||
"roster.filters.all": "All 4",
|
||||
"roster.filters.drafts": "Drafts",
|
||||
"roster.filters.inUse": "In use",
|
||||
"roster.gridView": "Grid view",
|
||||
"roster.invite": "Invite",
|
||||
"roster.inviteAgent": "Invite {{name}}",
|
||||
"roster.learnMore": "Learn more",
|
||||
"roster.listView": "List view",
|
||||
"roster.marketplaceCta": "Discover ready-made agents in Marketplace",
|
||||
"roster.moreActions": "More actions for {{name}}",
|
||||
"roster.searchLabel": "Search agents",
|
||||
"roster.searchPlaceholder": "Search agents by name, role, or skill…",
|
||||
"roster.sidebar.agents": "Agents",
|
||||
"roster.sidebar.humans": "Humans",
|
||||
"roster.sidebarLabel": "Roster sections",
|
||||
"roster.soon": "Soon",
|
||||
"roster.title": "Agent Roster",
|
||||
"roster.unused": "Unused",
|
||||
"roster.updated": "updated {{time}} ago",
|
||||
"roster.usedInWorkflows": "Used in {{count}} workflows"
|
||||
}
|
||||
@ -312,6 +312,7 @@
|
||||
"menus.newDataset": "Create Knowledge",
|
||||
"menus.plugins": "Integrations",
|
||||
"menus.pluginsTips": "Integrate third-party services or create ChatGPT-compatible AI integrations.",
|
||||
"menus.roster": "Roster",
|
||||
"menus.status": "beta",
|
||||
"menus.tools": "Tools",
|
||||
"model.addMoreModel": "Go to settings to add more models",
|
||||
|
||||
78
web/i18n/es-ES/agent-v-2.json
Normal file
78
web/i18n/es-ES/agent-v-2.json
Normal file
@ -0,0 +1,78 @@
|
||||
{
|
||||
"agentDetail.documentTitle": "Agente",
|
||||
"agentDetail.history": "Historial",
|
||||
"agentDetail.memorySettings.description": "Ahorro de coste - compacta automaticamente la memoria de ejecuciones reales segun tu preferencia de ahorro de tokens. Menos ahorro implica menos compactaciones y mayor fiabilidad con el tiempo.",
|
||||
"agentDetail.memorySettings.export.admin": "Admin",
|
||||
"agentDetail.memorySettings.export.description": "Descarga una instantanea de toda la memoria del agente.",
|
||||
"agentDetail.memorySettings.export.download": "Descargar",
|
||||
"agentDetail.memorySettings.export.title": "Exportar memoria actual",
|
||||
"agentDetail.memorySettings.isolation.description": "Aislamiento de memoria - alcance de lo que el agente recuerda entre ejecuciones.",
|
||||
"agentDetail.memorySettings.isolation.global.label": "Global",
|
||||
"agentDetail.memorySettings.isolation.global.scope": "compartido en todas partes",
|
||||
"agentDetail.memorySettings.isolation.perApp.label": "Por app",
|
||||
"agentDetail.memorySettings.isolation.perApp.scope": "aislado por flujo",
|
||||
"agentDetail.memorySettings.isolation.perRun.label": "Por ejecucion",
|
||||
"agentDetail.memorySettings.isolation.perRun.scope": "nuevo en cada ejecucion",
|
||||
"agentDetail.memorySettings.strategies.economy.budget": "tokens memoria <1k",
|
||||
"agentDetail.memorySettings.strategies.economy.label": "Economia",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.budget": "tokens memoria <100k",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.label": "Largo plazo",
|
||||
"agentDetail.memorySettings.strategies.medium.budget": "tokens memoria <10k",
|
||||
"agentDetail.memorySettings.strategies.medium.label": "Medio",
|
||||
"agentDetail.memorySettings.strategyLabel": "Estrategia de memoria",
|
||||
"agentDetail.memorySettings.title": "Estrategia de memoria",
|
||||
"agentDetail.monitoring.change": "{{value}} from previous period",
|
||||
"agentDetail.monitoring.description": "Track the reusable agent activity, cost, and interaction quality across workflows.",
|
||||
"agentDetail.monitoring.metrics.activeUsers.explanation": "Unique end users who triggered workflows using this agent.",
|
||||
"agentDetail.monitoring.metrics.activeUsers.title": "Active Users",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.explanation": "Average number of agent steps completed per run.",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.title": "Avg. Interactions",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.unit": "steps",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.explanation": "Estimated token cost produced by this agent across workflow runs.",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.title": "Token Usage",
|
||||
"agentDetail.monitoring.metrics.totalRuns.explanation": "Total workflow runs that invoked this agent.",
|
||||
"agentDetail.monitoring.metrics.totalRuns.title": "Total Runs",
|
||||
"agentDetail.monitoring.timeRangeLabel": "Time range",
|
||||
"agentDetail.monitoring.timeRanges.last30days": "Last 30 days",
|
||||
"agentDetail.monitoring.timeRanges.last7days": "Last 7 days",
|
||||
"agentDetail.monitoring.timeRanges.today": "Today",
|
||||
"agentDetail.monitoring.title": "Monitoring",
|
||||
"agentDetail.navigationLabel": "Navegación del agente",
|
||||
"agentDetail.publish": "Publicar",
|
||||
"agentDetail.publishMenu.publishUpdate": "Publicar actualización",
|
||||
"agentDetail.publishMenu.publishUpdateDescription": "Enviar los cambios a todos los flujos de trabajo que usan este agente",
|
||||
"agentDetail.publishMenu.saveAsNewAgent": "Guardar como nuevo agente",
|
||||
"agentDetail.publishMenu.saveAsNewAgentDescription": "Crear una entrada separada en el roster con su propio nombre",
|
||||
"agentDetail.sections.access": "Acceso y uso compartido",
|
||||
"agentDetail.sections.configure": "Configurar",
|
||||
"agentDetail.sections.logs": "Registros",
|
||||
"agentDetail.sections.monitoring": "Supervisión",
|
||||
"agentDetail.subtitle": "ID del agente: {{agentId}}",
|
||||
"agentDetail.title": "Agente",
|
||||
"agentDetail.type": "AGENTE",
|
||||
"roster.connectOwnAgent": "Connect to Your Own Agent",
|
||||
"roster.createAgent": "Create agent",
|
||||
"roster.description": "Reusable agents saved to this workspace. Drag onto any canvas or attach to a workflow node. Edit once — every workflow using this agent picks up the change.",
|
||||
"roster.draft": "Draft",
|
||||
"roster.editAgent": "Editar {{name}}",
|
||||
"roster.filters.all": "All 4",
|
||||
"roster.filters.drafts": "Drafts",
|
||||
"roster.filters.inUse": "In use",
|
||||
"roster.gridView": "Grid view",
|
||||
"roster.invite": "Invite",
|
||||
"roster.inviteAgent": "Invitar a {{name}}",
|
||||
"roster.learnMore": "Learn more",
|
||||
"roster.listView": "List view",
|
||||
"roster.marketplaceCta": "Discover ready-made agents in Marketplace",
|
||||
"roster.moreActions": "Más acciones para {{name}}",
|
||||
"roster.searchLabel": "Search agents",
|
||||
"roster.searchPlaceholder": "Search agents by name, role, or skill…",
|
||||
"roster.sidebar.agents": "Agents",
|
||||
"roster.sidebar.humans": "Humans",
|
||||
"roster.sidebarLabel": "Roster sections",
|
||||
"roster.soon": "Soon",
|
||||
"roster.title": "Agent Roster",
|
||||
"roster.unused": "Unused",
|
||||
"roster.updated": "updated {{time}} ago",
|
||||
"roster.usedInWorkflows": "Used in {{count}} workflows"
|
||||
}
|
||||
@ -312,6 +312,7 @@
|
||||
"menus.newDataset": "Crear Conocimiento",
|
||||
"menus.plugins": "Integraciones",
|
||||
"menus.pluginsTips": "Integrar integraciones de terceros o crear Integraciones AI compatibles con ChatGPT.",
|
||||
"menus.roster": "Directorio de agentes",
|
||||
"menus.status": "beta",
|
||||
"menus.tools": "Herramientas",
|
||||
"model.addMoreModel": "Ir a configuraciones para agregar más modelos",
|
||||
|
||||
78
web/i18n/fa-IR/agent-v-2.json
Normal file
78
web/i18n/fa-IR/agent-v-2.json
Normal file
@ -0,0 +1,78 @@
|
||||
{
|
||||
"agentDetail.documentTitle": "عامل",
|
||||
"agentDetail.history": "تاریخچه",
|
||||
"agentDetail.memorySettings.description": "کاهش هزینه - حافظه اجراهای واقعی بر اساس ترجیح صرفه جویی token به صورت خودکار فشرده می شود. صرفه جویی کمتر یعنی فشرده سازی کمتر و پایداری بهتر در زمان.",
|
||||
"agentDetail.memorySettings.export.admin": "مدیر",
|
||||
"agentDetail.memorySettings.export.description": "یک snapshot از کل مخزن حافظه agent دانلود کنید.",
|
||||
"agentDetail.memorySettings.export.download": "دانلود",
|
||||
"agentDetail.memorySettings.export.title": "خروجی گرفتن از حافظه فعلی",
|
||||
"agentDetail.memorySettings.isolation.description": "جداسازی حافظه - محدوده چیزهایی که agent بین اجراها به خاطر می سپارد.",
|
||||
"agentDetail.memorySettings.isolation.global.label": "سراسری",
|
||||
"agentDetail.memorySettings.isolation.global.scope": "همه جا مشترک",
|
||||
"agentDetail.memorySettings.isolation.perApp.label": "برای هر برنامه",
|
||||
"agentDetail.memorySettings.isolation.perApp.scope": "برای هر workflow جدا",
|
||||
"agentDetail.memorySettings.isolation.perRun.label": "برای هر اجرا",
|
||||
"agentDetail.memorySettings.isolation.perRun.scope": "در هر اجرا تازه",
|
||||
"agentDetail.memorySettings.strategies.economy.budget": "توکن حافظه <1k",
|
||||
"agentDetail.memorySettings.strategies.economy.label": "اقتصادی",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.budget": "توکن حافظه <100k",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.label": "بلندمدت",
|
||||
"agentDetail.memorySettings.strategies.medium.budget": "توکن حافظه <10k",
|
||||
"agentDetail.memorySettings.strategies.medium.label": "متوسط",
|
||||
"agentDetail.memorySettings.strategyLabel": "راهبرد حافظه",
|
||||
"agentDetail.memorySettings.title": "راهبرد حافظه",
|
||||
"agentDetail.monitoring.change": "{{value}} from previous period",
|
||||
"agentDetail.monitoring.description": "Track the reusable agent activity, cost, and interaction quality across workflows.",
|
||||
"agentDetail.monitoring.metrics.activeUsers.explanation": "Unique end users who triggered workflows using this agent.",
|
||||
"agentDetail.monitoring.metrics.activeUsers.title": "Active Users",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.explanation": "Average number of agent steps completed per run.",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.title": "Avg. Interactions",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.unit": "steps",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.explanation": "Estimated token cost produced by this agent across workflow runs.",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.title": "Token Usage",
|
||||
"agentDetail.monitoring.metrics.totalRuns.explanation": "Total workflow runs that invoked this agent.",
|
||||
"agentDetail.monitoring.metrics.totalRuns.title": "Total Runs",
|
||||
"agentDetail.monitoring.timeRangeLabel": "Time range",
|
||||
"agentDetail.monitoring.timeRanges.last30days": "Last 30 days",
|
||||
"agentDetail.monitoring.timeRanges.last7days": "Last 7 days",
|
||||
"agentDetail.monitoring.timeRanges.today": "Today",
|
||||
"agentDetail.monitoring.title": "Monitoring",
|
||||
"agentDetail.navigationLabel": "ناوبری عامل",
|
||||
"agentDetail.publish": "انتشار",
|
||||
"agentDetail.publishMenu.publishUpdate": "انتشار بهروزرسانی",
|
||||
"agentDetail.publishMenu.publishUpdateDescription": "تغییرات را به همه گردشکارهایی که از این عامل استفاده میکنند اعمال کنید",
|
||||
"agentDetail.publishMenu.saveAsNewAgent": "ذخیره بهعنوان عامل جدید",
|
||||
"agentDetail.publishMenu.saveAsNewAgentDescription": "یک ورودی جداگانه در فهرست با نام خودش ایجاد کنید",
|
||||
"agentDetail.sections.access": "دسترسی و اشتراکگذاری",
|
||||
"agentDetail.sections.configure": "پیکربندی",
|
||||
"agentDetail.sections.logs": "گزارشها",
|
||||
"agentDetail.sections.monitoring": "پایش",
|
||||
"agentDetail.subtitle": "شناسه عامل: {{agentId}}",
|
||||
"agentDetail.title": "عامل",
|
||||
"agentDetail.type": "عامل",
|
||||
"roster.connectOwnAgent": "Connect to Your Own Agent",
|
||||
"roster.createAgent": "Create agent",
|
||||
"roster.description": "Reusable agents saved to this workspace. Drag onto any canvas or attach to a workflow node. Edit once — every workflow using this agent picks up the change.",
|
||||
"roster.draft": "Draft",
|
||||
"roster.editAgent": "ویرایش {{name}}",
|
||||
"roster.filters.all": "All 4",
|
||||
"roster.filters.drafts": "Drafts",
|
||||
"roster.filters.inUse": "In use",
|
||||
"roster.gridView": "Grid view",
|
||||
"roster.invite": "Invite",
|
||||
"roster.inviteAgent": "دعوت از {{name}}",
|
||||
"roster.learnMore": "Learn more",
|
||||
"roster.listView": "List view",
|
||||
"roster.marketplaceCta": "Discover ready-made agents in Marketplace",
|
||||
"roster.moreActions": "اقدامهای بیشتر برای {{name}}",
|
||||
"roster.searchLabel": "Search agents",
|
||||
"roster.searchPlaceholder": "Search agents by name, role, or skill…",
|
||||
"roster.sidebar.agents": "Agents",
|
||||
"roster.sidebar.humans": "Humans",
|
||||
"roster.sidebarLabel": "Roster sections",
|
||||
"roster.soon": "Soon",
|
||||
"roster.title": "Agent Roster",
|
||||
"roster.unused": "Unused",
|
||||
"roster.updated": "updated {{time}} ago",
|
||||
"roster.usedInWorkflows": "Used in {{count}} workflows"
|
||||
}
|
||||
@ -312,6 +312,7 @@
|
||||
"menus.newDataset": "ایجاد دانش",
|
||||
"menus.plugins": "یکپارچهسازیها",
|
||||
"menus.pluginsTips": "یکپارچهسازیهای شخص ثالث را ادغام کنید یا یکپارچهسازیهای هوش مصنوعی سازگار با ChatGPT ایجاد کنید.",
|
||||
"menus.roster": "فهرست عاملها",
|
||||
"menus.status": "بتا",
|
||||
"menus.tools": "ابزارها",
|
||||
"model.addMoreModel": "برای افزودن مدلهای بیشتر به تنظیمات بروید",
|
||||
|
||||
78
web/i18n/fr-FR/agent-v-2.json
Normal file
78
web/i18n/fr-FR/agent-v-2.json
Normal file
@ -0,0 +1,78 @@
|
||||
{
|
||||
"agentDetail.documentTitle": "Agent",
|
||||
"agentDetail.history": "Historique",
|
||||
"agentDetail.memorySettings.description": "Reduction des couts - compacte automatiquement la memoire des executions selon votre preference d economie de tokens. Moins d economie signifie moins de compactages et une meilleure fiabilite dans le temps.",
|
||||
"agentDetail.memorySettings.export.admin": "Admin",
|
||||
"agentDetail.memorySettings.export.description": "Telechargez un instantane de toute la memoire de l agent.",
|
||||
"agentDetail.memorySettings.export.download": "Telecharger",
|
||||
"agentDetail.memorySettings.export.title": "Exporter la memoire actuelle",
|
||||
"agentDetail.memorySettings.isolation.description": "Isolation de la memoire - portee de ce que l agent retient entre les executions.",
|
||||
"agentDetail.memorySettings.isolation.global.label": "Global",
|
||||
"agentDetail.memorySettings.isolation.global.scope": "partage partout",
|
||||
"agentDetail.memorySettings.isolation.perApp.label": "Par app",
|
||||
"agentDetail.memorySettings.isolation.perApp.scope": "isole par workflow",
|
||||
"agentDetail.memorySettings.isolation.perRun.label": "Par execution",
|
||||
"agentDetail.memorySettings.isolation.perRun.scope": "neuf a chaque execution",
|
||||
"agentDetail.memorySettings.strategies.economy.budget": "tokens memoire <1k",
|
||||
"agentDetail.memorySettings.strategies.economy.label": "Economie",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.budget": "tokens memoire <100k",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.label": "Long terme",
|
||||
"agentDetail.memorySettings.strategies.medium.budget": "tokens memoire <10k",
|
||||
"agentDetail.memorySettings.strategies.medium.label": "Moyen",
|
||||
"agentDetail.memorySettings.strategyLabel": "Strategie de memoire",
|
||||
"agentDetail.memorySettings.title": "Strategie de memoire",
|
||||
"agentDetail.monitoring.change": "{{value}} from previous period",
|
||||
"agentDetail.monitoring.description": "Track the reusable agent activity, cost, and interaction quality across workflows.",
|
||||
"agentDetail.monitoring.metrics.activeUsers.explanation": "Unique end users who triggered workflows using this agent.",
|
||||
"agentDetail.monitoring.metrics.activeUsers.title": "Active Users",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.explanation": "Average number of agent steps completed per run.",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.title": "Avg. Interactions",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.unit": "steps",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.explanation": "Estimated token cost produced by this agent across workflow runs.",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.title": "Token Usage",
|
||||
"agentDetail.monitoring.metrics.totalRuns.explanation": "Total workflow runs that invoked this agent.",
|
||||
"agentDetail.monitoring.metrics.totalRuns.title": "Total Runs",
|
||||
"agentDetail.monitoring.timeRangeLabel": "Time range",
|
||||
"agentDetail.monitoring.timeRanges.last30days": "Last 30 days",
|
||||
"agentDetail.monitoring.timeRanges.last7days": "Last 7 days",
|
||||
"agentDetail.monitoring.timeRanges.today": "Today",
|
||||
"agentDetail.monitoring.title": "Monitoring",
|
||||
"agentDetail.navigationLabel": "Navigation de l’agent",
|
||||
"agentDetail.publish": "Publier",
|
||||
"agentDetail.publishMenu.publishUpdate": "Publier la mise à jour",
|
||||
"agentDetail.publishMenu.publishUpdateDescription": "Pousser les changements vers tous les workflows utilisant cet agent",
|
||||
"agentDetail.publishMenu.saveAsNewAgent": "Enregistrer comme nouvel agent",
|
||||
"agentDetail.publishMenu.saveAsNewAgentDescription": "Créer une entrée de roster distincte avec son propre nom",
|
||||
"agentDetail.sections.access": "Accès et partage",
|
||||
"agentDetail.sections.configure": "Configurer",
|
||||
"agentDetail.sections.logs": "Journaux",
|
||||
"agentDetail.sections.monitoring": "Surveillance",
|
||||
"agentDetail.subtitle": "ID de l’agent : {{agentId}}",
|
||||
"agentDetail.title": "Agent",
|
||||
"agentDetail.type": "AGENT",
|
||||
"roster.connectOwnAgent": "Connect to Your Own Agent",
|
||||
"roster.createAgent": "Create agent",
|
||||
"roster.description": "Reusable agents saved to this workspace. Drag onto any canvas or attach to a workflow node. Edit once — every workflow using this agent picks up the change.",
|
||||
"roster.draft": "Draft",
|
||||
"roster.editAgent": "Modifier {{name}}",
|
||||
"roster.filters.all": "All 4",
|
||||
"roster.filters.drafts": "Drafts",
|
||||
"roster.filters.inUse": "In use",
|
||||
"roster.gridView": "Grid view",
|
||||
"roster.invite": "Invite",
|
||||
"roster.inviteAgent": "Inviter {{name}}",
|
||||
"roster.learnMore": "Learn more",
|
||||
"roster.listView": "List view",
|
||||
"roster.marketplaceCta": "Discover ready-made agents in Marketplace",
|
||||
"roster.moreActions": "Plus d’actions pour {{name}}",
|
||||
"roster.searchLabel": "Search agents",
|
||||
"roster.searchPlaceholder": "Search agents by name, role, or skill…",
|
||||
"roster.sidebar.agents": "Agents",
|
||||
"roster.sidebar.humans": "Humans",
|
||||
"roster.sidebarLabel": "Roster sections",
|
||||
"roster.soon": "Soon",
|
||||
"roster.title": "Agent Roster",
|
||||
"roster.unused": "Unused",
|
||||
"roster.updated": "updated {{time}} ago",
|
||||
"roster.usedInWorkflows": "Used in {{count}} workflows"
|
||||
}
|
||||
@ -312,6 +312,7 @@
|
||||
"menus.newDataset": "Créer des Connaissances",
|
||||
"menus.plugins": "Intégrations",
|
||||
"menus.pluginsTips": "Intégrez des intégrations tiers ou créez des AI-Intégrations compatibles avec ChatGPT.",
|
||||
"menus.roster": "Répertoire des agents",
|
||||
"menus.status": "bêta",
|
||||
"menus.tools": "Outils",
|
||||
"model.addMoreModel": "Allez dans les paramètres pour ajouter plus de modèles",
|
||||
|
||||
78
web/i18n/hi-IN/agent-v-2.json
Normal file
78
web/i18n/hi-IN/agent-v-2.json
Normal file
@ -0,0 +1,78 @@
|
||||
{
|
||||
"agentDetail.documentTitle": "एजेंट",
|
||||
"agentDetail.history": "इतिहास",
|
||||
"agentDetail.memorySettings.description": "लागत बचत - token बचत पसंद के आधार पर वास्तविक runs की memory अपने आप compact होती है। कम बचत का मतलब कम compaction और समय के साथ बेहतर reliability है।",
|
||||
"agentDetail.memorySettings.export.admin": "Admin",
|
||||
"agentDetail.memorySettings.export.description": "agent की पूरी memory store का snapshot download करें।",
|
||||
"agentDetail.memorySettings.export.download": "Download",
|
||||
"agentDetail.memorySettings.export.title": "वर्तमान memory export करें",
|
||||
"agentDetail.memorySettings.isolation.description": "मेमोरी isolation - runs के बीच agent क्या याद रखता है उसका scope।",
|
||||
"agentDetail.memorySettings.isolation.global.label": "ग्लोबल",
|
||||
"agentDetail.memorySettings.isolation.global.scope": "हर जगह साझा",
|
||||
"agentDetail.memorySettings.isolation.perApp.label": "प्रति app",
|
||||
"agentDetail.memorySettings.isolation.perApp.scope": "हर workflow में अलग",
|
||||
"agentDetail.memorySettings.isolation.perRun.label": "प्रति run",
|
||||
"agentDetail.memorySettings.isolation.perRun.scope": "हर run नया",
|
||||
"agentDetail.memorySettings.strategies.economy.budget": "memory tokens <1k",
|
||||
"agentDetail.memorySettings.strategies.economy.label": "इकोनॉमी",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.budget": "memory tokens <100k",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.label": "लंबी अवधि",
|
||||
"agentDetail.memorySettings.strategies.medium.budget": "memory tokens <10k",
|
||||
"agentDetail.memorySettings.strategies.medium.label": "मीडियम",
|
||||
"agentDetail.memorySettings.strategyLabel": "मेमोरी रणनीति",
|
||||
"agentDetail.memorySettings.title": "मेमोरी रणनीति",
|
||||
"agentDetail.monitoring.change": "{{value}} from previous period",
|
||||
"agentDetail.monitoring.description": "Track the reusable agent activity, cost, and interaction quality across workflows.",
|
||||
"agentDetail.monitoring.metrics.activeUsers.explanation": "Unique end users who triggered workflows using this agent.",
|
||||
"agentDetail.monitoring.metrics.activeUsers.title": "Active Users",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.explanation": "Average number of agent steps completed per run.",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.title": "Avg. Interactions",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.unit": "steps",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.explanation": "Estimated token cost produced by this agent across workflow runs.",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.title": "Token Usage",
|
||||
"agentDetail.monitoring.metrics.totalRuns.explanation": "Total workflow runs that invoked this agent.",
|
||||
"agentDetail.monitoring.metrics.totalRuns.title": "Total Runs",
|
||||
"agentDetail.monitoring.timeRangeLabel": "Time range",
|
||||
"agentDetail.monitoring.timeRanges.last30days": "Last 30 days",
|
||||
"agentDetail.monitoring.timeRanges.last7days": "Last 7 days",
|
||||
"agentDetail.monitoring.timeRanges.today": "Today",
|
||||
"agentDetail.monitoring.title": "Monitoring",
|
||||
"agentDetail.navigationLabel": "एजेंट नेविगेशन",
|
||||
"agentDetail.publish": "प्रकाशित करें",
|
||||
"agentDetail.publishMenu.publishUpdate": "अपडेट प्रकाशित करें",
|
||||
"agentDetail.publishMenu.publishUpdateDescription": "इस एजेंट का उपयोग करने वाले सभी वर्कफ़्लो में बदलाव भेजें",
|
||||
"agentDetail.publishMenu.saveAsNewAgent": "नए एजेंट के रूप में सहेजें",
|
||||
"agentDetail.publishMenu.saveAsNewAgentDescription": "अपने नाम वाली अलग रोस्टर प्रविष्टि बनाएं",
|
||||
"agentDetail.sections.access": "एक्सेस और शेयरिंग",
|
||||
"agentDetail.sections.configure": "कॉन्फ़िगर करें",
|
||||
"agentDetail.sections.logs": "लॉग्स",
|
||||
"agentDetail.sections.monitoring": "मॉनिटरिंग",
|
||||
"agentDetail.subtitle": "एजेंट आईडी: {{agentId}}",
|
||||
"agentDetail.title": "एजेंट",
|
||||
"agentDetail.type": "एजेंट",
|
||||
"roster.connectOwnAgent": "Connect to Your Own Agent",
|
||||
"roster.createAgent": "Create agent",
|
||||
"roster.description": "Reusable agents saved to this workspace. Drag onto any canvas or attach to a workflow node. Edit once — every workflow using this agent picks up the change.",
|
||||
"roster.draft": "Draft",
|
||||
"roster.editAgent": "{{name}} संपादित करें",
|
||||
"roster.filters.all": "All 4",
|
||||
"roster.filters.drafts": "Drafts",
|
||||
"roster.filters.inUse": "In use",
|
||||
"roster.gridView": "Grid view",
|
||||
"roster.invite": "Invite",
|
||||
"roster.inviteAgent": "{{name}} को आमंत्रित करें",
|
||||
"roster.learnMore": "Learn more",
|
||||
"roster.listView": "List view",
|
||||
"roster.marketplaceCta": "Discover ready-made agents in Marketplace",
|
||||
"roster.moreActions": "{{name}} के लिए और कार्रवाइयां",
|
||||
"roster.searchLabel": "Search agents",
|
||||
"roster.searchPlaceholder": "Search agents by name, role, or skill…",
|
||||
"roster.sidebar.agents": "Agents",
|
||||
"roster.sidebar.humans": "Humans",
|
||||
"roster.sidebarLabel": "Roster sections",
|
||||
"roster.soon": "Soon",
|
||||
"roster.title": "Agent Roster",
|
||||
"roster.unused": "Unused",
|
||||
"roster.updated": "updated {{time}} ago",
|
||||
"roster.usedInWorkflows": "Used in {{count}} workflows"
|
||||
}
|
||||
@ -312,6 +312,7 @@
|
||||
"menus.newDataset": "ज्ञान बनाएं",
|
||||
"menus.plugins": "एकीकरण",
|
||||
"menus.pluginsTips": "थर्ड-पार्टी एकीकरण को एकीकृत करें या ChatGPT-संगत AI-Integrations बनाएं।",
|
||||
"menus.roster": "एजेंट सूची",
|
||||
"menus.status": "बीटा",
|
||||
"menus.tools": "उपकरण",
|
||||
"model.addMoreModel": "अधिक मॉडल जोड़ने के लिए सेटिंग्स पर जाएं",
|
||||
|
||||
78
web/i18n/id-ID/agent-v-2.json
Normal file
78
web/i18n/id-ID/agent-v-2.json
Normal file
@ -0,0 +1,78 @@
|
||||
{
|
||||
"agentDetail.documentTitle": "Agen",
|
||||
"agentDetail.history": "Riwayat",
|
||||
"agentDetail.memorySettings.description": "Penghematan biaya - memadatkan memori run nyata secara otomatis sesuai preferensi hemat token. Lebih sedikit penghematan berarti lebih sedikit pemadatan dan reliabilitas lebih baik dari waktu ke waktu.",
|
||||
"agentDetail.memorySettings.export.admin": "Admin",
|
||||
"agentDetail.memorySettings.export.description": "Unduh snapshot seluruh penyimpanan memori agent.",
|
||||
"agentDetail.memorySettings.export.download": "Unduh",
|
||||
"agentDetail.memorySettings.export.title": "Ekspor memori saat ini",
|
||||
"agentDetail.memorySettings.isolation.description": "Isolasi memori - cakupan yang diingat agent antar run.",
|
||||
"agentDetail.memorySettings.isolation.global.label": "Global",
|
||||
"agentDetail.memorySettings.isolation.global.scope": "dibagikan di semua tempat",
|
||||
"agentDetail.memorySettings.isolation.perApp.label": "Per app",
|
||||
"agentDetail.memorySettings.isolation.perApp.scope": "terisolasi per workflow",
|
||||
"agentDetail.memorySettings.isolation.perRun.label": "Per run",
|
||||
"agentDetail.memorySettings.isolation.perRun.scope": "baru setiap run",
|
||||
"agentDetail.memorySettings.strategies.economy.budget": "token memori <1k",
|
||||
"agentDetail.memorySettings.strategies.economy.label": "Ekonomi",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.budget": "token memori <100k",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.label": "Jangka panjang",
|
||||
"agentDetail.memorySettings.strategies.medium.budget": "token memori <10k",
|
||||
"agentDetail.memorySettings.strategies.medium.label": "Sedang",
|
||||
"agentDetail.memorySettings.strategyLabel": "Strategi memori",
|
||||
"agentDetail.memorySettings.title": "Strategi memori",
|
||||
"agentDetail.monitoring.change": "{{value}} from previous period",
|
||||
"agentDetail.monitoring.description": "Track the reusable agent activity, cost, and interaction quality across workflows.",
|
||||
"agentDetail.monitoring.metrics.activeUsers.explanation": "Unique end users who triggered workflows using this agent.",
|
||||
"agentDetail.monitoring.metrics.activeUsers.title": "Active Users",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.explanation": "Average number of agent steps completed per run.",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.title": "Avg. Interactions",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.unit": "steps",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.explanation": "Estimated token cost produced by this agent across workflow runs.",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.title": "Token Usage",
|
||||
"agentDetail.monitoring.metrics.totalRuns.explanation": "Total workflow runs that invoked this agent.",
|
||||
"agentDetail.monitoring.metrics.totalRuns.title": "Total Runs",
|
||||
"agentDetail.monitoring.timeRangeLabel": "Time range",
|
||||
"agentDetail.monitoring.timeRanges.last30days": "Last 30 days",
|
||||
"agentDetail.monitoring.timeRanges.last7days": "Last 7 days",
|
||||
"agentDetail.monitoring.timeRanges.today": "Today",
|
||||
"agentDetail.monitoring.title": "Monitoring",
|
||||
"agentDetail.navigationLabel": "Navigasi agen",
|
||||
"agentDetail.publish": "Terbitkan",
|
||||
"agentDetail.publishMenu.publishUpdate": "Terbitkan pembaruan",
|
||||
"agentDetail.publishMenu.publishUpdateDescription": "Kirim perubahan ke semua workflow yang memakai agen ini",
|
||||
"agentDetail.publishMenu.saveAsNewAgent": "Simpan sebagai agen baru",
|
||||
"agentDetail.publishMenu.saveAsNewAgentDescription": "Buat entri roster terpisah dengan namanya sendiri",
|
||||
"agentDetail.sections.access": "Akses & Berbagi",
|
||||
"agentDetail.sections.configure": "Konfigurasi",
|
||||
"agentDetail.sections.logs": "Log",
|
||||
"agentDetail.sections.monitoring": "Pemantauan",
|
||||
"agentDetail.subtitle": "ID agen: {{agentId}}",
|
||||
"agentDetail.title": "Agen",
|
||||
"agentDetail.type": "AGEN",
|
||||
"roster.connectOwnAgent": "Connect to Your Own Agent",
|
||||
"roster.createAgent": "Create agent",
|
||||
"roster.description": "Reusable agents saved to this workspace. Drag onto any canvas or attach to a workflow node. Edit once — every workflow using this agent picks up the change.",
|
||||
"roster.draft": "Draft",
|
||||
"roster.editAgent": "Edit {{name}}",
|
||||
"roster.filters.all": "All 4",
|
||||
"roster.filters.drafts": "Drafts",
|
||||
"roster.filters.inUse": "In use",
|
||||
"roster.gridView": "Grid view",
|
||||
"roster.invite": "Invite",
|
||||
"roster.inviteAgent": "Undang {{name}}",
|
||||
"roster.learnMore": "Learn more",
|
||||
"roster.listView": "List view",
|
||||
"roster.marketplaceCta": "Discover ready-made agents in Marketplace",
|
||||
"roster.moreActions": "Tindakan lainnya untuk {{name}}",
|
||||
"roster.searchLabel": "Search agents",
|
||||
"roster.searchPlaceholder": "Search agents by name, role, or skill…",
|
||||
"roster.sidebar.agents": "Agents",
|
||||
"roster.sidebar.humans": "Humans",
|
||||
"roster.sidebarLabel": "Roster sections",
|
||||
"roster.soon": "Soon",
|
||||
"roster.title": "Agent Roster",
|
||||
"roster.unused": "Unused",
|
||||
"roster.updated": "updated {{time}} ago",
|
||||
"roster.usedInWorkflows": "Used in {{count}} workflows"
|
||||
}
|
||||
@ -312,6 +312,7 @@
|
||||
"menus.newDataset": "Ciptakan Pengetahuan",
|
||||
"menus.plugins": "Integrasi",
|
||||
"menus.pluginsTips": "Integrasikan integrasi pihak ketiga atau buat AI-Integrasi yang kompatibel dengan ChatGPT.",
|
||||
"menus.roster": "Daftar Agen",
|
||||
"menus.status": "beta",
|
||||
"menus.tools": "Perkakas",
|
||||
"model.addMoreModel": "Buka pengaturan untuk menambahkan lebih banyak model",
|
||||
|
||||
78
web/i18n/it-IT/agent-v-2.json
Normal file
78
web/i18n/it-IT/agent-v-2.json
Normal file
@ -0,0 +1,78 @@
|
||||
{
|
||||
"agentDetail.documentTitle": "Agente",
|
||||
"agentDetail.history": "Cronologia",
|
||||
"agentDetail.memorySettings.description": "Risparmio costi - compatta automaticamente la memoria delle esecuzioni reali in base alla preferenza di risparmio token. Meno risparmio significa meno compattazioni e migliore affidabilita nel tempo.",
|
||||
"agentDetail.memorySettings.export.admin": "Admin",
|
||||
"agentDetail.memorySettings.export.description": "Scarica uno snapshot dell intero archivio memoria dell agente.",
|
||||
"agentDetail.memorySettings.export.download": "Scarica",
|
||||
"agentDetail.memorySettings.export.title": "Esporta memoria corrente",
|
||||
"agentDetail.memorySettings.isolation.description": "Isolamento memoria - ambito di cio che l agente ricorda tra le esecuzioni.",
|
||||
"agentDetail.memorySettings.isolation.global.label": "Globale",
|
||||
"agentDetail.memorySettings.isolation.global.scope": "condivisa ovunque",
|
||||
"agentDetail.memorySettings.isolation.perApp.label": "Per app",
|
||||
"agentDetail.memorySettings.isolation.perApp.scope": "isolata per workflow",
|
||||
"agentDetail.memorySettings.isolation.perRun.label": "Per esecuzione",
|
||||
"agentDetail.memorySettings.isolation.perRun.scope": "nuova a ogni esecuzione",
|
||||
"agentDetail.memorySettings.strategies.economy.budget": "token memoria <1k",
|
||||
"agentDetail.memorySettings.strategies.economy.label": "Economia",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.budget": "token memoria <100k",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.label": "Lungo periodo",
|
||||
"agentDetail.memorySettings.strategies.medium.budget": "token memoria <10k",
|
||||
"agentDetail.memorySettings.strategies.medium.label": "Medio",
|
||||
"agentDetail.memorySettings.strategyLabel": "Strategia memoria",
|
||||
"agentDetail.memorySettings.title": "Strategia memoria",
|
||||
"agentDetail.monitoring.change": "{{value}} from previous period",
|
||||
"agentDetail.monitoring.description": "Track the reusable agent activity, cost, and interaction quality across workflows.",
|
||||
"agentDetail.monitoring.metrics.activeUsers.explanation": "Unique end users who triggered workflows using this agent.",
|
||||
"agentDetail.monitoring.metrics.activeUsers.title": "Active Users",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.explanation": "Average number of agent steps completed per run.",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.title": "Avg. Interactions",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.unit": "steps",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.explanation": "Estimated token cost produced by this agent across workflow runs.",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.title": "Token Usage",
|
||||
"agentDetail.monitoring.metrics.totalRuns.explanation": "Total workflow runs that invoked this agent.",
|
||||
"agentDetail.monitoring.metrics.totalRuns.title": "Total Runs",
|
||||
"agentDetail.monitoring.timeRangeLabel": "Time range",
|
||||
"agentDetail.monitoring.timeRanges.last30days": "Last 30 days",
|
||||
"agentDetail.monitoring.timeRanges.last7days": "Last 7 days",
|
||||
"agentDetail.monitoring.timeRanges.today": "Today",
|
||||
"agentDetail.monitoring.title": "Monitoring",
|
||||
"agentDetail.navigationLabel": "Navigazione agente",
|
||||
"agentDetail.publish": "Pubblica",
|
||||
"agentDetail.publishMenu.publishUpdate": "Pubblica aggiornamento",
|
||||
"agentDetail.publishMenu.publishUpdateDescription": "Invia le modifiche a tutti i workflow che usano questo agente",
|
||||
"agentDetail.publishMenu.saveAsNewAgent": "Salva come nuovo agente",
|
||||
"agentDetail.publishMenu.saveAsNewAgentDescription": "Crea una voce separata nel roster con un nome proprio",
|
||||
"agentDetail.sections.access": "Accesso e condivisione",
|
||||
"agentDetail.sections.configure": "Configura",
|
||||
"agentDetail.sections.logs": "Log",
|
||||
"agentDetail.sections.monitoring": "Monitoraggio",
|
||||
"agentDetail.subtitle": "ID agente: {{agentId}}",
|
||||
"agentDetail.title": "Agente",
|
||||
"agentDetail.type": "AGENTE",
|
||||
"roster.connectOwnAgent": "Connect to Your Own Agent",
|
||||
"roster.createAgent": "Create agent",
|
||||
"roster.description": "Reusable agents saved to this workspace. Drag onto any canvas or attach to a workflow node. Edit once — every workflow using this agent picks up the change.",
|
||||
"roster.draft": "Draft",
|
||||
"roster.editAgent": "Modifica {{name}}",
|
||||
"roster.filters.all": "All 4",
|
||||
"roster.filters.drafts": "Drafts",
|
||||
"roster.filters.inUse": "In use",
|
||||
"roster.gridView": "Grid view",
|
||||
"roster.invite": "Invite",
|
||||
"roster.inviteAgent": "Invita {{name}}",
|
||||
"roster.learnMore": "Learn more",
|
||||
"roster.listView": "List view",
|
||||
"roster.marketplaceCta": "Discover ready-made agents in Marketplace",
|
||||
"roster.moreActions": "Altre azioni per {{name}}",
|
||||
"roster.searchLabel": "Search agents",
|
||||
"roster.searchPlaceholder": "Search agents by name, role, or skill…",
|
||||
"roster.sidebar.agents": "Agents",
|
||||
"roster.sidebar.humans": "Humans",
|
||||
"roster.sidebarLabel": "Roster sections",
|
||||
"roster.soon": "Soon",
|
||||
"roster.title": "Agent Roster",
|
||||
"roster.unused": "Unused",
|
||||
"roster.updated": "updated {{time}} ago",
|
||||
"roster.usedInWorkflows": "Used in {{count}} workflows"
|
||||
}
|
||||
@ -312,6 +312,7 @@
|
||||
"menus.newDataset": "Crea Conoscenza",
|
||||
"menus.plugins": "Integrazione",
|
||||
"menus.pluginsTips": "Integra integrazione di terze parti o crea integrazione AI compatibili con ChatGPT.",
|
||||
"menus.roster": "Elenco agenti",
|
||||
"menus.status": "beta",
|
||||
"menus.tools": "Strumenti",
|
||||
"model.addMoreModel": "Vai alle impostazioni per aggiungere altri modelli",
|
||||
|
||||
78
web/i18n/ja-JP/agent-v-2.json
Normal file
78
web/i18n/ja-JP/agent-v-2.json
Normal file
@ -0,0 +1,78 @@
|
||||
{
|
||||
"agentDetail.documentTitle": "エージェント",
|
||||
"agentDetail.history": "履歴",
|
||||
"agentDetail.memorySettings.description": "コスト削減 - token 節約設定に基づいて実行時メモリを自動圧縮します。節約を弱めるほど圧縮回数が減り、長期的な信頼性が高まります。",
|
||||
"agentDetail.memorySettings.export.admin": "管理者",
|
||||
"agentDetail.memorySettings.export.description": "エージェントの全メモリストアのスナップショットをダウンロードします。",
|
||||
"agentDetail.memorySettings.export.download": "ダウンロード",
|
||||
"agentDetail.memorySettings.export.title": "現在のメモリをエクスポート",
|
||||
"agentDetail.memorySettings.isolation.description": "メモリ分離 - 実行間でエージェントが記憶する範囲。",
|
||||
"agentDetail.memorySettings.isolation.global.label": "グローバル",
|
||||
"agentDetail.memorySettings.isolation.global.scope": "全体で共有",
|
||||
"agentDetail.memorySettings.isolation.perApp.label": "アプリ別",
|
||||
"agentDetail.memorySettings.isolation.perApp.scope": "ワークフローごとに分離",
|
||||
"agentDetail.memorySettings.isolation.perRun.label": "実行別",
|
||||
"agentDetail.memorySettings.isolation.perRun.scope": "毎回新規",
|
||||
"agentDetail.memorySettings.strategies.economy.budget": "メモリ token <1k",
|
||||
"agentDetail.memorySettings.strategies.economy.label": "エコノミー",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.budget": "メモリ token <100k",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.label": "長期",
|
||||
"agentDetail.memorySettings.strategies.medium.budget": "メモリ token <10k",
|
||||
"agentDetail.memorySettings.strategies.medium.label": "中",
|
||||
"agentDetail.memorySettings.strategyLabel": "メモリ戦略",
|
||||
"agentDetail.memorySettings.title": "メモリ戦略",
|
||||
"agentDetail.monitoring.change": "{{value}} from previous period",
|
||||
"agentDetail.monitoring.description": "Track the reusable agent activity, cost, and interaction quality across workflows.",
|
||||
"agentDetail.monitoring.metrics.activeUsers.explanation": "Unique end users who triggered workflows using this agent.",
|
||||
"agentDetail.monitoring.metrics.activeUsers.title": "Active Users",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.explanation": "Average number of agent steps completed per run.",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.title": "Avg. Interactions",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.unit": "steps",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.explanation": "Estimated token cost produced by this agent across workflow runs.",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.title": "Token Usage",
|
||||
"agentDetail.monitoring.metrics.totalRuns.explanation": "Total workflow runs that invoked this agent.",
|
||||
"agentDetail.monitoring.metrics.totalRuns.title": "Total Runs",
|
||||
"agentDetail.monitoring.timeRangeLabel": "Time range",
|
||||
"agentDetail.monitoring.timeRanges.last30days": "Last 30 days",
|
||||
"agentDetail.monitoring.timeRanges.last7days": "Last 7 days",
|
||||
"agentDetail.monitoring.timeRanges.today": "Today",
|
||||
"agentDetail.monitoring.title": "Monitoring",
|
||||
"agentDetail.navigationLabel": "エージェントナビゲーション",
|
||||
"agentDetail.publish": "公開",
|
||||
"agentDetail.publishMenu.publishUpdate": "更新を公開",
|
||||
"agentDetail.publishMenu.publishUpdateDescription": "このエージェントを使用するすべてのワークフローに変更を反映します",
|
||||
"agentDetail.publishMenu.saveAsNewAgent": "新しいエージェントとして保存",
|
||||
"agentDetail.publishMenu.saveAsNewAgentDescription": "独自の名前を持つ別のロスター項目として複製します",
|
||||
"agentDetail.sections.access": "アクセスと共有",
|
||||
"agentDetail.sections.configure": "設定",
|
||||
"agentDetail.sections.logs": "ログ",
|
||||
"agentDetail.sections.monitoring": "モニタリング",
|
||||
"agentDetail.subtitle": "エージェントID: {{agentId}}",
|
||||
"agentDetail.title": "エージェント",
|
||||
"agentDetail.type": "エージェント",
|
||||
"roster.connectOwnAgent": "Connect to Your Own Agent",
|
||||
"roster.createAgent": "Create agent",
|
||||
"roster.description": "Reusable agents saved to this workspace. Drag onto any canvas or attach to a workflow node. Edit once — every workflow using this agent picks up the change.",
|
||||
"roster.draft": "Draft",
|
||||
"roster.editAgent": "{{name}}を編集",
|
||||
"roster.filters.all": "All 4",
|
||||
"roster.filters.drafts": "Drafts",
|
||||
"roster.filters.inUse": "In use",
|
||||
"roster.gridView": "Grid view",
|
||||
"roster.invite": "Invite",
|
||||
"roster.inviteAgent": "{{name}}を招待",
|
||||
"roster.learnMore": "Learn more",
|
||||
"roster.listView": "List view",
|
||||
"roster.marketplaceCta": "Discover ready-made agents in Marketplace",
|
||||
"roster.moreActions": "{{name}}のその他の操作",
|
||||
"roster.searchLabel": "Search agents",
|
||||
"roster.searchPlaceholder": "Search agents by name, role, or skill…",
|
||||
"roster.sidebar.agents": "Agents",
|
||||
"roster.sidebar.humans": "Humans",
|
||||
"roster.sidebarLabel": "Roster sections",
|
||||
"roster.soon": "Soon",
|
||||
"roster.title": "Agent Roster",
|
||||
"roster.unused": "Unused",
|
||||
"roster.updated": "updated {{time}} ago",
|
||||
"roster.usedInWorkflows": "Used in {{count}} workflows"
|
||||
}
|
||||
@ -312,6 +312,7 @@
|
||||
"menus.newDataset": "ナレッジの作成",
|
||||
"menus.plugins": "インテグレーション",
|
||||
"menus.pluginsTips": "サードパーティのインテグレーションを統合するか、ChatGPT 互換の AI インテグレーションを作成します。",
|
||||
"menus.roster": "エージェント名簿",
|
||||
"menus.status": "ベータ版",
|
||||
"menus.tools": "ツール",
|
||||
"model.addMoreModel": "設定画面から他のモデルを追加してください",
|
||||
|
||||
78
web/i18n/ko-KR/agent-v-2.json
Normal file
78
web/i18n/ko-KR/agent-v-2.json
Normal file
@ -0,0 +1,78 @@
|
||||
{
|
||||
"agentDetail.documentTitle": "에이전트",
|
||||
"agentDetail.history": "기록",
|
||||
"agentDetail.memorySettings.description": "비용 절감 - token 절약 선호도에 따라 실제 실행 메모리를 자동 압축합니다. 절약을 덜 할수록 압축이 줄고 장기 안정성이 좋아집니다.",
|
||||
"agentDetail.memorySettings.export.admin": "관리자",
|
||||
"agentDetail.memorySettings.export.description": "에이전트 전체 메모리 저장소의 스냅샷을 다운로드합니다.",
|
||||
"agentDetail.memorySettings.export.download": "다운로드",
|
||||
"agentDetail.memorySettings.export.title": "현재 메모리 내보내기",
|
||||
"agentDetail.memorySettings.isolation.description": "메모리 격리 - 실행 사이에 에이전트가 기억하는 범위입니다.",
|
||||
"agentDetail.memorySettings.isolation.global.label": "전역",
|
||||
"agentDetail.memorySettings.isolation.global.scope": "모든 곳에서 공유",
|
||||
"agentDetail.memorySettings.isolation.perApp.label": "앱별",
|
||||
"agentDetail.memorySettings.isolation.perApp.scope": "워크플로별 격리",
|
||||
"agentDetail.memorySettings.isolation.perRun.label": "실행별",
|
||||
"agentDetail.memorySettings.isolation.perRun.scope": "매 실행 새로 시작",
|
||||
"agentDetail.memorySettings.strategies.economy.budget": "메모리 token <1k",
|
||||
"agentDetail.memorySettings.strategies.economy.label": "절약",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.budget": "메모리 token <100k",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.label": "장기",
|
||||
"agentDetail.memorySettings.strategies.medium.budget": "메모리 token <10k",
|
||||
"agentDetail.memorySettings.strategies.medium.label": "중간",
|
||||
"agentDetail.memorySettings.strategyLabel": "메모리 전략",
|
||||
"agentDetail.memorySettings.title": "메모리 전략",
|
||||
"agentDetail.monitoring.change": "{{value}} from previous period",
|
||||
"agentDetail.monitoring.description": "Track the reusable agent activity, cost, and interaction quality across workflows.",
|
||||
"agentDetail.monitoring.metrics.activeUsers.explanation": "Unique end users who triggered workflows using this agent.",
|
||||
"agentDetail.monitoring.metrics.activeUsers.title": "Active Users",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.explanation": "Average number of agent steps completed per run.",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.title": "Avg. Interactions",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.unit": "steps",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.explanation": "Estimated token cost produced by this agent across workflow runs.",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.title": "Token Usage",
|
||||
"agentDetail.monitoring.metrics.totalRuns.explanation": "Total workflow runs that invoked this agent.",
|
||||
"agentDetail.monitoring.metrics.totalRuns.title": "Total Runs",
|
||||
"agentDetail.monitoring.timeRangeLabel": "Time range",
|
||||
"agentDetail.monitoring.timeRanges.last30days": "Last 30 days",
|
||||
"agentDetail.monitoring.timeRanges.last7days": "Last 7 days",
|
||||
"agentDetail.monitoring.timeRanges.today": "Today",
|
||||
"agentDetail.monitoring.title": "Monitoring",
|
||||
"agentDetail.navigationLabel": "에이전트 탐색",
|
||||
"agentDetail.publish": "게시",
|
||||
"agentDetail.publishMenu.publishUpdate": "업데이트 게시",
|
||||
"agentDetail.publishMenu.publishUpdateDescription": "이 에이전트를 사용하는 모든 워크플로에 변경 사항을 반영합니다",
|
||||
"agentDetail.publishMenu.saveAsNewAgent": "새 에이전트로 저장",
|
||||
"agentDetail.publishMenu.saveAsNewAgentDescription": "고유한 이름을 가진 별도 로스터 항목으로 복제합니다",
|
||||
"agentDetail.sections.access": "액세스 및 공유",
|
||||
"agentDetail.sections.configure": "구성",
|
||||
"agentDetail.sections.logs": "로그",
|
||||
"agentDetail.sections.monitoring": "모니터링",
|
||||
"agentDetail.subtitle": "에이전트 ID: {{agentId}}",
|
||||
"agentDetail.title": "에이전트",
|
||||
"agentDetail.type": "에이전트",
|
||||
"roster.connectOwnAgent": "Connect to Your Own Agent",
|
||||
"roster.createAgent": "Create agent",
|
||||
"roster.description": "Reusable agents saved to this workspace. Drag onto any canvas or attach to a workflow node. Edit once — every workflow using this agent picks up the change.",
|
||||
"roster.draft": "Draft",
|
||||
"roster.editAgent": "{{name}} 편집",
|
||||
"roster.filters.all": "All 4",
|
||||
"roster.filters.drafts": "Drafts",
|
||||
"roster.filters.inUse": "In use",
|
||||
"roster.gridView": "Grid view",
|
||||
"roster.invite": "Invite",
|
||||
"roster.inviteAgent": "{{name}} 초대",
|
||||
"roster.learnMore": "Learn more",
|
||||
"roster.listView": "List view",
|
||||
"roster.marketplaceCta": "Discover ready-made agents in Marketplace",
|
||||
"roster.moreActions": "{{name}}에 대한 추가 작업",
|
||||
"roster.searchLabel": "Search agents",
|
||||
"roster.searchPlaceholder": "Search agents by name, role, or skill…",
|
||||
"roster.sidebar.agents": "Agents",
|
||||
"roster.sidebar.humans": "Humans",
|
||||
"roster.sidebarLabel": "Roster sections",
|
||||
"roster.soon": "Soon",
|
||||
"roster.title": "Agent Roster",
|
||||
"roster.unused": "Unused",
|
||||
"roster.updated": "updated {{time}} ago",
|
||||
"roster.usedInWorkflows": "Used in {{count}} workflows"
|
||||
}
|
||||
@ -312,6 +312,7 @@
|
||||
"menus.newDataset": "지식 만들기",
|
||||
"menus.plugins": "통합",
|
||||
"menus.pluginsTips": "타사 통합을 통합하거나 ChatGPT 호환 AI 통합을 작성합니다.",
|
||||
"menus.roster": "에이전트 명단",
|
||||
"menus.status": "베타 버전",
|
||||
"menus.tools": "도구",
|
||||
"model.addMoreModel": "설정에서 다른 모델을 추가하세요",
|
||||
|
||||
78
web/i18n/nl-NL/agent-v-2.json
Normal file
78
web/i18n/nl-NL/agent-v-2.json
Normal file
@ -0,0 +1,78 @@
|
||||
{
|
||||
"agentDetail.documentTitle": "Agent",
|
||||
"agentDetail.history": "Geschiedenis",
|
||||
"agentDetail.memorySettings.description": "Kostenbesparing - comprimeert geheugen van echte runs automatisch op basis van je tokenbesparing. Minder besparen betekent minder compressie en betere betrouwbaarheid op lange termijn.",
|
||||
"agentDetail.memorySettings.export.admin": "Admin",
|
||||
"agentDetail.memorySettings.export.description": "Download een snapshot van de volledige geheugenopslag van de agent.",
|
||||
"agentDetail.memorySettings.export.download": "Downloaden",
|
||||
"agentDetail.memorySettings.export.title": "Huidig geheugen exporteren",
|
||||
"agentDetail.memorySettings.isolation.description": "Geheugenisolatie - bereik van wat de agent tussen runs onthoudt.",
|
||||
"agentDetail.memorySettings.isolation.global.label": "Globaal",
|
||||
"agentDetail.memorySettings.isolation.global.scope": "overal gedeeld",
|
||||
"agentDetail.memorySettings.isolation.perApp.label": "Per app",
|
||||
"agentDetail.memorySettings.isolation.perApp.scope": "geisoleerd per workflow",
|
||||
"agentDetail.memorySettings.isolation.perRun.label": "Per run",
|
||||
"agentDetail.memorySettings.isolation.perRun.scope": "nieuw bij elke run",
|
||||
"agentDetail.memorySettings.strategies.economy.budget": "geheugen-tokens <1k",
|
||||
"agentDetail.memorySettings.strategies.economy.label": "Zuinig",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.budget": "geheugen-tokens <100k",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.label": "Lange termijn",
|
||||
"agentDetail.memorySettings.strategies.medium.budget": "geheugen-tokens <10k",
|
||||
"agentDetail.memorySettings.strategies.medium.label": "Gemiddeld",
|
||||
"agentDetail.memorySettings.strategyLabel": "Geheugenstrategie",
|
||||
"agentDetail.memorySettings.title": "Geheugenstrategie",
|
||||
"agentDetail.monitoring.change": "{{value}} from previous period",
|
||||
"agentDetail.monitoring.description": "Track the reusable agent activity, cost, and interaction quality across workflows.",
|
||||
"agentDetail.monitoring.metrics.activeUsers.explanation": "Unique end users who triggered workflows using this agent.",
|
||||
"agentDetail.monitoring.metrics.activeUsers.title": "Active Users",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.explanation": "Average number of agent steps completed per run.",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.title": "Avg. Interactions",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.unit": "steps",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.explanation": "Estimated token cost produced by this agent across workflow runs.",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.title": "Token Usage",
|
||||
"agentDetail.monitoring.metrics.totalRuns.explanation": "Total workflow runs that invoked this agent.",
|
||||
"agentDetail.monitoring.metrics.totalRuns.title": "Total Runs",
|
||||
"agentDetail.monitoring.timeRangeLabel": "Time range",
|
||||
"agentDetail.monitoring.timeRanges.last30days": "Last 30 days",
|
||||
"agentDetail.monitoring.timeRanges.last7days": "Last 7 days",
|
||||
"agentDetail.monitoring.timeRanges.today": "Today",
|
||||
"agentDetail.monitoring.title": "Monitoring",
|
||||
"agentDetail.navigationLabel": "Agentnavigatie",
|
||||
"agentDetail.publish": "Publiceren",
|
||||
"agentDetail.publishMenu.publishUpdate": "Update publiceren",
|
||||
"agentDetail.publishMenu.publishUpdateDescription": "Wijzigingen doorvoeren naar alle workflows die deze agent gebruiken",
|
||||
"agentDetail.publishMenu.saveAsNewAgent": "Opslaan als nieuwe agent",
|
||||
"agentDetail.publishMenu.saveAsNewAgentDescription": "Maak een aparte rostervermelding met een eigen naam",
|
||||
"agentDetail.sections.access": "Toegang en delen",
|
||||
"agentDetail.sections.configure": "Configureren",
|
||||
"agentDetail.sections.logs": "Logs",
|
||||
"agentDetail.sections.monitoring": "Monitoring",
|
||||
"agentDetail.subtitle": "Agent-ID: {{agentId}}",
|
||||
"agentDetail.title": "Agent",
|
||||
"agentDetail.type": "AGENT",
|
||||
"roster.connectOwnAgent": "Connect to Your Own Agent",
|
||||
"roster.createAgent": "Create agent",
|
||||
"roster.description": "Reusable agents saved to this workspace. Drag onto any canvas or attach to a workflow node. Edit once — every workflow using this agent picks up the change.",
|
||||
"roster.draft": "Draft",
|
||||
"roster.editAgent": "{{name}} bewerken",
|
||||
"roster.filters.all": "All 4",
|
||||
"roster.filters.drafts": "Drafts",
|
||||
"roster.filters.inUse": "In use",
|
||||
"roster.gridView": "Grid view",
|
||||
"roster.invite": "Invite",
|
||||
"roster.inviteAgent": "{{name}} uitnodigen",
|
||||
"roster.learnMore": "Learn more",
|
||||
"roster.listView": "List view",
|
||||
"roster.marketplaceCta": "Discover ready-made agents in Marketplace",
|
||||
"roster.moreActions": "Meer acties voor {{name}}",
|
||||
"roster.searchLabel": "Search agents",
|
||||
"roster.searchPlaceholder": "Search agents by name, role, or skill…",
|
||||
"roster.sidebar.agents": "Agents",
|
||||
"roster.sidebar.humans": "Humans",
|
||||
"roster.sidebarLabel": "Roster sections",
|
||||
"roster.soon": "Soon",
|
||||
"roster.title": "Agent Roster",
|
||||
"roster.unused": "Unused",
|
||||
"roster.updated": "updated {{time}} ago",
|
||||
"roster.usedInWorkflows": "Used in {{count}} workflows"
|
||||
}
|
||||
@ -312,6 +312,7 @@
|
||||
"menus.newDataset": "Create Knowledge",
|
||||
"menus.plugins": "Integraties",
|
||||
"menus.pluginsTips": "Integrate third-party integraties or create ChatGPT-compatible AI-Integraties.",
|
||||
"menus.roster": "Agentenoverzicht",
|
||||
"menus.status": "beta",
|
||||
"menus.tools": "Tools",
|
||||
"model.addMoreModel": "Go to settings to add more models",
|
||||
|
||||
78
web/i18n/pl-PL/agent-v-2.json
Normal file
78
web/i18n/pl-PL/agent-v-2.json
Normal file
@ -0,0 +1,78 @@
|
||||
{
|
||||
"agentDetail.documentTitle": "Agent",
|
||||
"agentDetail.history": "Historia",
|
||||
"agentDetail.memorySettings.description": "Oszczednosc kosztow - automatycznie kompaktuje pamiec rzeczywistych uruchomien zgodnie z preferencja oszczedzania tokenow. Mniejsze oszczedzanie oznacza mniej kompaktowania i lepsza niezawodnosc w czasie.",
|
||||
"agentDetail.memorySettings.export.admin": "Admin",
|
||||
"agentDetail.memorySettings.export.description": "Pobierz snapshot calego magazynu pamieci agenta.",
|
||||
"agentDetail.memorySettings.export.download": "Pobierz",
|
||||
"agentDetail.memorySettings.export.title": "Eksportuj biezaca pamiec",
|
||||
"agentDetail.memorySettings.isolation.description": "Izolacja pamieci - zakres tego, co agent pamieta miedzy uruchomieniami.",
|
||||
"agentDetail.memorySettings.isolation.global.label": "Globalnie",
|
||||
"agentDetail.memorySettings.isolation.global.scope": "wspoldzielone wszedzie",
|
||||
"agentDetail.memorySettings.isolation.perApp.label": "Na aplikacje",
|
||||
"agentDetail.memorySettings.isolation.perApp.scope": "izolowane na workflow",
|
||||
"agentDetail.memorySettings.isolation.perRun.label": "Na uruchomienie",
|
||||
"agentDetail.memorySettings.isolation.perRun.scope": "nowe przy kazdym uruchomieniu",
|
||||
"agentDetail.memorySettings.strategies.economy.budget": "tokeny pamieci <1k",
|
||||
"agentDetail.memorySettings.strategies.economy.label": "Ekonomia",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.budget": "tokeny pamieci <100k",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.label": "Dlugi horyzont",
|
||||
"agentDetail.memorySettings.strategies.medium.budget": "tokeny pamieci <10k",
|
||||
"agentDetail.memorySettings.strategies.medium.label": "Srednio",
|
||||
"agentDetail.memorySettings.strategyLabel": "Strategia pamieci",
|
||||
"agentDetail.memorySettings.title": "Strategia pamieci",
|
||||
"agentDetail.monitoring.change": "{{value}} from previous period",
|
||||
"agentDetail.monitoring.description": "Track the reusable agent activity, cost, and interaction quality across workflows.",
|
||||
"agentDetail.monitoring.metrics.activeUsers.explanation": "Unique end users who triggered workflows using this agent.",
|
||||
"agentDetail.monitoring.metrics.activeUsers.title": "Active Users",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.explanation": "Average number of agent steps completed per run.",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.title": "Avg. Interactions",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.unit": "steps",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.explanation": "Estimated token cost produced by this agent across workflow runs.",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.title": "Token Usage",
|
||||
"agentDetail.monitoring.metrics.totalRuns.explanation": "Total workflow runs that invoked this agent.",
|
||||
"agentDetail.monitoring.metrics.totalRuns.title": "Total Runs",
|
||||
"agentDetail.monitoring.timeRangeLabel": "Time range",
|
||||
"agentDetail.monitoring.timeRanges.last30days": "Last 30 days",
|
||||
"agentDetail.monitoring.timeRanges.last7days": "Last 7 days",
|
||||
"agentDetail.monitoring.timeRanges.today": "Today",
|
||||
"agentDetail.monitoring.title": "Monitoring",
|
||||
"agentDetail.navigationLabel": "Nawigacja agenta",
|
||||
"agentDetail.publish": "Opublikuj",
|
||||
"agentDetail.publishMenu.publishUpdate": "Opublikuj aktualizację",
|
||||
"agentDetail.publishMenu.publishUpdateDescription": "Wypchnij zmiany do wszystkich przepływów pracy używających tego agenta",
|
||||
"agentDetail.publishMenu.saveAsNewAgent": "Zapisz jako nowego agenta",
|
||||
"agentDetail.publishMenu.saveAsNewAgentDescription": "Utwórz osobny wpis w rosterze z własną nazwą",
|
||||
"agentDetail.sections.access": "Dostęp i udostępnianie",
|
||||
"agentDetail.sections.configure": "Konfiguracja",
|
||||
"agentDetail.sections.logs": "Logi",
|
||||
"agentDetail.sections.monitoring": "Monitorowanie",
|
||||
"agentDetail.subtitle": "ID agenta: {{agentId}}",
|
||||
"agentDetail.title": "Agent",
|
||||
"agentDetail.type": "AGENT",
|
||||
"roster.connectOwnAgent": "Connect to Your Own Agent",
|
||||
"roster.createAgent": "Create agent",
|
||||
"roster.description": "Reusable agents saved to this workspace. Drag onto any canvas or attach to a workflow node. Edit once — every workflow using this agent picks up the change.",
|
||||
"roster.draft": "Draft",
|
||||
"roster.editAgent": "Edytuj {{name}}",
|
||||
"roster.filters.all": "All 4",
|
||||
"roster.filters.drafts": "Drafts",
|
||||
"roster.filters.inUse": "In use",
|
||||
"roster.gridView": "Grid view",
|
||||
"roster.invite": "Invite",
|
||||
"roster.inviteAgent": "Zaproś {{name}}",
|
||||
"roster.learnMore": "Learn more",
|
||||
"roster.listView": "List view",
|
||||
"roster.marketplaceCta": "Discover ready-made agents in Marketplace",
|
||||
"roster.moreActions": "Więcej akcji dla {{name}}",
|
||||
"roster.searchLabel": "Search agents",
|
||||
"roster.searchPlaceholder": "Search agents by name, role, or skill…",
|
||||
"roster.sidebar.agents": "Agents",
|
||||
"roster.sidebar.humans": "Humans",
|
||||
"roster.sidebarLabel": "Roster sections",
|
||||
"roster.soon": "Soon",
|
||||
"roster.title": "Agent Roster",
|
||||
"roster.unused": "Unused",
|
||||
"roster.updated": "updated {{time}} ago",
|
||||
"roster.usedInWorkflows": "Used in {{count}} workflows"
|
||||
}
|
||||
@ -312,6 +312,7 @@
|
||||
"menus.newDataset": "Utwórz Wiedzę",
|
||||
"menus.plugins": "Integracjay",
|
||||
"menus.pluginsTips": "Integruj integracjay stron trzecich lub twórz integracjay AI kompatybilne z ChatGPT.",
|
||||
"menus.roster": "Lista agentów",
|
||||
"menus.status": "beta",
|
||||
"menus.tools": "Narzędzia",
|
||||
"model.addMoreModel": "Przejdź do ustawień, aby dodać więcej modeli",
|
||||
|
||||
78
web/i18n/pt-BR/agent-v-2.json
Normal file
78
web/i18n/pt-BR/agent-v-2.json
Normal file
@ -0,0 +1,78 @@
|
||||
{
|
||||
"agentDetail.documentTitle": "Agente",
|
||||
"agentDetail.history": "Histórico",
|
||||
"agentDetail.memorySettings.description": "Economia de custo - compacta automaticamente a memoria das execucoes reais conforme sua preferencia de economia de tokens. Menos economia significa menos compactacoes e melhor confiabilidade ao longo do tempo.",
|
||||
"agentDetail.memorySettings.export.admin": "Admin",
|
||||
"agentDetail.memorySettings.export.description": "Baixe um snapshot de todo o armazenamento de memoria do agente.",
|
||||
"agentDetail.memorySettings.export.download": "Baixar",
|
||||
"agentDetail.memorySettings.export.title": "Exportar memoria atual",
|
||||
"agentDetail.memorySettings.isolation.description": "Isolamento de memoria - escopo do que o agente lembra entre execucoes.",
|
||||
"agentDetail.memorySettings.isolation.global.label": "Global",
|
||||
"agentDetail.memorySettings.isolation.global.scope": "compartilhado em todos os lugares",
|
||||
"agentDetail.memorySettings.isolation.perApp.label": "Por app",
|
||||
"agentDetail.memorySettings.isolation.perApp.scope": "isolado por workflow",
|
||||
"agentDetail.memorySettings.isolation.perRun.label": "Por execucao",
|
||||
"agentDetail.memorySettings.isolation.perRun.scope": "novo a cada execucao",
|
||||
"agentDetail.memorySettings.strategies.economy.budget": "tokens de memoria <1k",
|
||||
"agentDetail.memorySettings.strategies.economy.label": "Economia",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.budget": "tokens de memoria <100k",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.label": "Longo prazo",
|
||||
"agentDetail.memorySettings.strategies.medium.budget": "tokens de memoria <10k",
|
||||
"agentDetail.memorySettings.strategies.medium.label": "Media",
|
||||
"agentDetail.memorySettings.strategyLabel": "Estrategia de memoria",
|
||||
"agentDetail.memorySettings.title": "Estrategia de memoria",
|
||||
"agentDetail.monitoring.change": "{{value}} from previous period",
|
||||
"agentDetail.monitoring.description": "Track the reusable agent activity, cost, and interaction quality across workflows.",
|
||||
"agentDetail.monitoring.metrics.activeUsers.explanation": "Unique end users who triggered workflows using this agent.",
|
||||
"agentDetail.monitoring.metrics.activeUsers.title": "Active Users",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.explanation": "Average number of agent steps completed per run.",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.title": "Avg. Interactions",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.unit": "steps",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.explanation": "Estimated token cost produced by this agent across workflow runs.",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.title": "Token Usage",
|
||||
"agentDetail.monitoring.metrics.totalRuns.explanation": "Total workflow runs that invoked this agent.",
|
||||
"agentDetail.monitoring.metrics.totalRuns.title": "Total Runs",
|
||||
"agentDetail.monitoring.timeRangeLabel": "Time range",
|
||||
"agentDetail.monitoring.timeRanges.last30days": "Last 30 days",
|
||||
"agentDetail.monitoring.timeRanges.last7days": "Last 7 days",
|
||||
"agentDetail.monitoring.timeRanges.today": "Today",
|
||||
"agentDetail.monitoring.title": "Monitoring",
|
||||
"agentDetail.navigationLabel": "Navegação do agente",
|
||||
"agentDetail.publish": "Publicar",
|
||||
"agentDetail.publishMenu.publishUpdate": "Publicar atualização",
|
||||
"agentDetail.publishMenu.publishUpdateDescription": "Enviar alterações para todos os fluxos de trabalho que usam este agente",
|
||||
"agentDetail.publishMenu.saveAsNewAgent": "Salvar como novo agente",
|
||||
"agentDetail.publishMenu.saveAsNewAgentDescription": "Criar uma entrada separada no roster com nome próprio",
|
||||
"agentDetail.sections.access": "Acesso e compartilhamento",
|
||||
"agentDetail.sections.configure": "Configurar",
|
||||
"agentDetail.sections.logs": "Logs",
|
||||
"agentDetail.sections.monitoring": "Monitoramento",
|
||||
"agentDetail.subtitle": "ID do agente: {{agentId}}",
|
||||
"agentDetail.title": "Agente",
|
||||
"agentDetail.type": "AGENTE",
|
||||
"roster.connectOwnAgent": "Connect to Your Own Agent",
|
||||
"roster.createAgent": "Create agent",
|
||||
"roster.description": "Reusable agents saved to this workspace. Drag onto any canvas or attach to a workflow node. Edit once — every workflow using this agent picks up the change.",
|
||||
"roster.draft": "Draft",
|
||||
"roster.editAgent": "Editar {{name}}",
|
||||
"roster.filters.all": "All 4",
|
||||
"roster.filters.drafts": "Drafts",
|
||||
"roster.filters.inUse": "In use",
|
||||
"roster.gridView": "Grid view",
|
||||
"roster.invite": "Invite",
|
||||
"roster.inviteAgent": "Convidar {{name}}",
|
||||
"roster.learnMore": "Learn more",
|
||||
"roster.listView": "List view",
|
||||
"roster.marketplaceCta": "Discover ready-made agents in Marketplace",
|
||||
"roster.moreActions": "Mais ações para {{name}}",
|
||||
"roster.searchLabel": "Search agents",
|
||||
"roster.searchPlaceholder": "Search agents by name, role, or skill…",
|
||||
"roster.sidebar.agents": "Agents",
|
||||
"roster.sidebar.humans": "Humans",
|
||||
"roster.sidebarLabel": "Roster sections",
|
||||
"roster.soon": "Soon",
|
||||
"roster.title": "Agent Roster",
|
||||
"roster.unused": "Unused",
|
||||
"roster.updated": "updated {{time}} ago",
|
||||
"roster.usedInWorkflows": "Used in {{count}} workflows"
|
||||
}
|
||||
@ -312,6 +312,7 @@
|
||||
"menus.newDataset": "Criar Conhecimento",
|
||||
"menus.plugins": "Integrações",
|
||||
"menus.pluginsTips": "Integre integrações de terceiros ou crie integrações de IA compatíveis com o ChatGPT.",
|
||||
"menus.roster": "Lista de agentes",
|
||||
"menus.status": "beta",
|
||||
"menus.tools": "Ferramentas",
|
||||
"model.addMoreModel": "Vá para configurações para adicionar mais modelos",
|
||||
|
||||
78
web/i18n/ro-RO/agent-v-2.json
Normal file
78
web/i18n/ro-RO/agent-v-2.json
Normal file
@ -0,0 +1,78 @@
|
||||
{
|
||||
"agentDetail.documentTitle": "Agent",
|
||||
"agentDetail.history": "Istoric",
|
||||
"agentDetail.memorySettings.description": "Reducere de cost - compacteaza automat memoria executarilor reale conform preferintei de economisire a tokenurilor. Mai putina economisire inseamna mai putine compactari si fiabilitate mai buna in timp.",
|
||||
"agentDetail.memorySettings.export.admin": "Admin",
|
||||
"agentDetail.memorySettings.export.description": "Descarca un snapshot al intregului magazin de memorie al agentului.",
|
||||
"agentDetail.memorySettings.export.download": "Descarca",
|
||||
"agentDetail.memorySettings.export.title": "Exporta memoria curenta",
|
||||
"agentDetail.memorySettings.isolation.description": "Izolare memorie - sfera a ceea ce agentul retine intre executari.",
|
||||
"agentDetail.memorySettings.isolation.global.label": "Global",
|
||||
"agentDetail.memorySettings.isolation.global.scope": "partajat peste tot",
|
||||
"agentDetail.memorySettings.isolation.perApp.label": "Per app",
|
||||
"agentDetail.memorySettings.isolation.perApp.scope": "izolat per workflow",
|
||||
"agentDetail.memorySettings.isolation.perRun.label": "Per rulare",
|
||||
"agentDetail.memorySettings.isolation.perRun.scope": "nou la fiecare rulare",
|
||||
"agentDetail.memorySettings.strategies.economy.budget": "tokenuri memorie <1k",
|
||||
"agentDetail.memorySettings.strategies.economy.label": "Economic",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.budget": "tokenuri memorie <100k",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.label": "Termen lung",
|
||||
"agentDetail.memorySettings.strategies.medium.budget": "tokenuri memorie <10k",
|
||||
"agentDetail.memorySettings.strategies.medium.label": "Mediu",
|
||||
"agentDetail.memorySettings.strategyLabel": "Strategie de memorie",
|
||||
"agentDetail.memorySettings.title": "Strategie de memorie",
|
||||
"agentDetail.monitoring.change": "{{value}} from previous period",
|
||||
"agentDetail.monitoring.description": "Track the reusable agent activity, cost, and interaction quality across workflows.",
|
||||
"agentDetail.monitoring.metrics.activeUsers.explanation": "Unique end users who triggered workflows using this agent.",
|
||||
"agentDetail.monitoring.metrics.activeUsers.title": "Active Users",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.explanation": "Average number of agent steps completed per run.",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.title": "Avg. Interactions",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.unit": "steps",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.explanation": "Estimated token cost produced by this agent across workflow runs.",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.title": "Token Usage",
|
||||
"agentDetail.monitoring.metrics.totalRuns.explanation": "Total workflow runs that invoked this agent.",
|
||||
"agentDetail.monitoring.metrics.totalRuns.title": "Total Runs",
|
||||
"agentDetail.monitoring.timeRangeLabel": "Time range",
|
||||
"agentDetail.monitoring.timeRanges.last30days": "Last 30 days",
|
||||
"agentDetail.monitoring.timeRanges.last7days": "Last 7 days",
|
||||
"agentDetail.monitoring.timeRanges.today": "Today",
|
||||
"agentDetail.monitoring.title": "Monitoring",
|
||||
"agentDetail.navigationLabel": "Navigarea agentului",
|
||||
"agentDetail.publish": "Publică",
|
||||
"agentDetail.publishMenu.publishUpdate": "Publică actualizarea",
|
||||
"agentDetail.publishMenu.publishUpdateDescription": "Trimite modificările către toate fluxurile de lucru care folosesc acest agent",
|
||||
"agentDetail.publishMenu.saveAsNewAgent": "Salvează ca agent nou",
|
||||
"agentDetail.publishMenu.saveAsNewAgentDescription": "Creează o intrare separată în roster cu propriul nume",
|
||||
"agentDetail.sections.access": "Acces și partajare",
|
||||
"agentDetail.sections.configure": "Configurare",
|
||||
"agentDetail.sections.logs": "Jurnale",
|
||||
"agentDetail.sections.monitoring": "Monitorizare",
|
||||
"agentDetail.subtitle": "ID agent: {{agentId}}",
|
||||
"agentDetail.title": "Agent",
|
||||
"agentDetail.type": "AGENT",
|
||||
"roster.connectOwnAgent": "Connect to Your Own Agent",
|
||||
"roster.createAgent": "Create agent",
|
||||
"roster.description": "Reusable agents saved to this workspace. Drag onto any canvas or attach to a workflow node. Edit once — every workflow using this agent picks up the change.",
|
||||
"roster.draft": "Draft",
|
||||
"roster.editAgent": "Editează {{name}}",
|
||||
"roster.filters.all": "All 4",
|
||||
"roster.filters.drafts": "Drafts",
|
||||
"roster.filters.inUse": "In use",
|
||||
"roster.gridView": "Grid view",
|
||||
"roster.invite": "Invite",
|
||||
"roster.inviteAgent": "Invită {{name}}",
|
||||
"roster.learnMore": "Learn more",
|
||||
"roster.listView": "List view",
|
||||
"roster.marketplaceCta": "Discover ready-made agents in Marketplace",
|
||||
"roster.moreActions": "Mai multe acțiuni pentru {{name}}",
|
||||
"roster.searchLabel": "Search agents",
|
||||
"roster.searchPlaceholder": "Search agents by name, role, or skill…",
|
||||
"roster.sidebar.agents": "Agents",
|
||||
"roster.sidebar.humans": "Humans",
|
||||
"roster.sidebarLabel": "Roster sections",
|
||||
"roster.soon": "Soon",
|
||||
"roster.title": "Agent Roster",
|
||||
"roster.unused": "Unused",
|
||||
"roster.updated": "updated {{time}} ago",
|
||||
"roster.usedInWorkflows": "Used in {{count}} workflows"
|
||||
}
|
||||
@ -312,6 +312,7 @@
|
||||
"menus.newDataset": "Creează Cunoștințe",
|
||||
"menus.plugins": "Integrare-uri",
|
||||
"menus.pluginsTips": "Integrați integrare-uri terțe părți sau creați AI-Integrare-uri compatibile cu ChatGPT.",
|
||||
"menus.roster": "Listă agenți",
|
||||
"menus.status": "beta",
|
||||
"menus.tools": "Instrumente",
|
||||
"model.addMoreModel": "Mergeți la setări pentru a adăuga mai multe modele",
|
||||
|
||||
78
web/i18n/ru-RU/agent-v-2.json
Normal file
78
web/i18n/ru-RU/agent-v-2.json
Normal file
@ -0,0 +1,78 @@
|
||||
{
|
||||
"agentDetail.documentTitle": "Агент",
|
||||
"agentDetail.history": "История",
|
||||
"agentDetail.memorySettings.description": "Экономия затрат - автоматически сжимает память реальных запусков согласно предпочтению экономии токенов. Меньшая экономия означает меньше сжатий и лучшую надежность со временем.",
|
||||
"agentDetail.memorySettings.export.admin": "Админ",
|
||||
"agentDetail.memorySettings.export.description": "Скачайте снимок всего хранилища памяти агента.",
|
||||
"agentDetail.memorySettings.export.download": "Скачать",
|
||||
"agentDetail.memorySettings.export.title": "Экспорт текущей памяти",
|
||||
"agentDetail.memorySettings.isolation.description": "Изоляция памяти - область того, что агент помнит между запусками.",
|
||||
"agentDetail.memorySettings.isolation.global.label": "Глобально",
|
||||
"agentDetail.memorySettings.isolation.global.scope": "общее везде",
|
||||
"agentDetail.memorySettings.isolation.perApp.label": "По приложению",
|
||||
"agentDetail.memorySettings.isolation.perApp.scope": "изолировано по workflow",
|
||||
"agentDetail.memorySettings.isolation.perRun.label": "По запуску",
|
||||
"agentDetail.memorySettings.isolation.perRun.scope": "новая при каждом запуске",
|
||||
"agentDetail.memorySettings.strategies.economy.budget": "токены памяти <1k",
|
||||
"agentDetail.memorySettings.strategies.economy.label": "Экономия",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.budget": "токены памяти <100k",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.label": "Долгий горизонт",
|
||||
"agentDetail.memorySettings.strategies.medium.budget": "токены памяти <10k",
|
||||
"agentDetail.memorySettings.strategies.medium.label": "Средне",
|
||||
"agentDetail.memorySettings.strategyLabel": "Стратегия памяти",
|
||||
"agentDetail.memorySettings.title": "Стратегия памяти",
|
||||
"agentDetail.monitoring.change": "{{value}} from previous period",
|
||||
"agentDetail.monitoring.description": "Track the reusable agent activity, cost, and interaction quality across workflows.",
|
||||
"agentDetail.monitoring.metrics.activeUsers.explanation": "Unique end users who triggered workflows using this agent.",
|
||||
"agentDetail.monitoring.metrics.activeUsers.title": "Active Users",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.explanation": "Average number of agent steps completed per run.",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.title": "Avg. Interactions",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.unit": "steps",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.explanation": "Estimated token cost produced by this agent across workflow runs.",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.title": "Token Usage",
|
||||
"agentDetail.monitoring.metrics.totalRuns.explanation": "Total workflow runs that invoked this agent.",
|
||||
"agentDetail.monitoring.metrics.totalRuns.title": "Total Runs",
|
||||
"agentDetail.monitoring.timeRangeLabel": "Time range",
|
||||
"agentDetail.monitoring.timeRanges.last30days": "Last 30 days",
|
||||
"agentDetail.monitoring.timeRanges.last7days": "Last 7 days",
|
||||
"agentDetail.monitoring.timeRanges.today": "Today",
|
||||
"agentDetail.monitoring.title": "Monitoring",
|
||||
"agentDetail.navigationLabel": "Навигация агента",
|
||||
"agentDetail.publish": "Опубликовать",
|
||||
"agentDetail.publishMenu.publishUpdate": "Опубликовать обновление",
|
||||
"agentDetail.publishMenu.publishUpdateDescription": "Применить изменения ко всем рабочим процессам, использующим этого агента",
|
||||
"agentDetail.publishMenu.saveAsNewAgent": "Сохранить как нового агента",
|
||||
"agentDetail.publishMenu.saveAsNewAgentDescription": "Создать отдельную запись в реестре с собственным именем",
|
||||
"agentDetail.sections.access": "Доступ и совместное использование",
|
||||
"agentDetail.sections.configure": "Настроить",
|
||||
"agentDetail.sections.logs": "Журналы",
|
||||
"agentDetail.sections.monitoring": "Мониторинг",
|
||||
"agentDetail.subtitle": "ID агента: {{agentId}}",
|
||||
"agentDetail.title": "Агент",
|
||||
"agentDetail.type": "АГЕНТ",
|
||||
"roster.connectOwnAgent": "Connect to Your Own Agent",
|
||||
"roster.createAgent": "Create agent",
|
||||
"roster.description": "Reusable agents saved to this workspace. Drag onto any canvas or attach to a workflow node. Edit once — every workflow using this agent picks up the change.",
|
||||
"roster.draft": "Draft",
|
||||
"roster.editAgent": "Редактировать {{name}}",
|
||||
"roster.filters.all": "All 4",
|
||||
"roster.filters.drafts": "Drafts",
|
||||
"roster.filters.inUse": "In use",
|
||||
"roster.gridView": "Grid view",
|
||||
"roster.invite": "Invite",
|
||||
"roster.inviteAgent": "Пригласить {{name}}",
|
||||
"roster.learnMore": "Learn more",
|
||||
"roster.listView": "List view",
|
||||
"roster.marketplaceCta": "Discover ready-made agents in Marketplace",
|
||||
"roster.moreActions": "Дополнительные действия для {{name}}",
|
||||
"roster.searchLabel": "Search agents",
|
||||
"roster.searchPlaceholder": "Search agents by name, role, or skill…",
|
||||
"roster.sidebar.agents": "Agents",
|
||||
"roster.sidebar.humans": "Humans",
|
||||
"roster.sidebarLabel": "Roster sections",
|
||||
"roster.soon": "Soon",
|
||||
"roster.title": "Agent Roster",
|
||||
"roster.unused": "Unused",
|
||||
"roster.updated": "updated {{time}} ago",
|
||||
"roster.usedInWorkflows": "Used in {{count}} workflows"
|
||||
}
|
||||
@ -312,6 +312,7 @@
|
||||
"menus.newDataset": "Создать знания",
|
||||
"menus.plugins": "Интеграции",
|
||||
"menus.pluginsTips": "Интегрируйте сторонние интеграции или создавайте совместимые с ChatGPT AI-интеграции.",
|
||||
"menus.roster": "Список агентов",
|
||||
"menus.status": "бета",
|
||||
"menus.tools": "Инструменты",
|
||||
"model.addMoreModel": "Перейдите в настройки, чтобы добавить больше моделей",
|
||||
|
||||
78
web/i18n/sl-SI/agent-v-2.json
Normal file
78
web/i18n/sl-SI/agent-v-2.json
Normal file
@ -0,0 +1,78 @@
|
||||
{
|
||||
"agentDetail.documentTitle": "Agent",
|
||||
"agentDetail.history": "Zgodovina",
|
||||
"agentDetail.memorySettings.description": "Prihranek stroskov - samodejno zgosti pomnilnik dejanskih zagonov glede na nastavitev varcevanja tokenov. Manj varcevanja pomeni manj zgostitev in boljso zanesljivost skozi cas.",
|
||||
"agentDetail.memorySettings.export.admin": "Admin",
|
||||
"agentDetail.memorySettings.export.description": "Prenesite snapshot celotnega agentovega pomnilnika.",
|
||||
"agentDetail.memorySettings.export.download": "Prenesi",
|
||||
"agentDetail.memorySettings.export.title": "Izvozi trenutni pomnilnik",
|
||||
"agentDetail.memorySettings.isolation.description": "Izolacija pomnilnika - obseg tega, kar si agent zapomni med zagoni.",
|
||||
"agentDetail.memorySettings.isolation.global.label": "Globalno",
|
||||
"agentDetail.memorySettings.isolation.global.scope": "deljeno povsod",
|
||||
"agentDetail.memorySettings.isolation.perApp.label": "Na app",
|
||||
"agentDetail.memorySettings.isolation.perApp.scope": "izolirano na workflow",
|
||||
"agentDetail.memorySettings.isolation.perRun.label": "Na zagon",
|
||||
"agentDetail.memorySettings.isolation.perRun.scope": "sveze ob vsakem zagonu",
|
||||
"agentDetail.memorySettings.strategies.economy.budget": "pomnilniski tokeni <1k",
|
||||
"agentDetail.memorySettings.strategies.economy.label": "Varcno",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.budget": "pomnilniski tokeni <100k",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.label": "Dolg rok",
|
||||
"agentDetail.memorySettings.strategies.medium.budget": "pomnilniski tokeni <10k",
|
||||
"agentDetail.memorySettings.strategies.medium.label": "Srednje",
|
||||
"agentDetail.memorySettings.strategyLabel": "Strategija pomnilnika",
|
||||
"agentDetail.memorySettings.title": "Strategija pomnilnika",
|
||||
"agentDetail.monitoring.change": "{{value}} from previous period",
|
||||
"agentDetail.monitoring.description": "Track the reusable agent activity, cost, and interaction quality across workflows.",
|
||||
"agentDetail.monitoring.metrics.activeUsers.explanation": "Unique end users who triggered workflows using this agent.",
|
||||
"agentDetail.monitoring.metrics.activeUsers.title": "Active Users",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.explanation": "Average number of agent steps completed per run.",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.title": "Avg. Interactions",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.unit": "steps",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.explanation": "Estimated token cost produced by this agent across workflow runs.",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.title": "Token Usage",
|
||||
"agentDetail.monitoring.metrics.totalRuns.explanation": "Total workflow runs that invoked this agent.",
|
||||
"agentDetail.monitoring.metrics.totalRuns.title": "Total Runs",
|
||||
"agentDetail.monitoring.timeRangeLabel": "Time range",
|
||||
"agentDetail.monitoring.timeRanges.last30days": "Last 30 days",
|
||||
"agentDetail.monitoring.timeRanges.last7days": "Last 7 days",
|
||||
"agentDetail.monitoring.timeRanges.today": "Today",
|
||||
"agentDetail.monitoring.title": "Monitoring",
|
||||
"agentDetail.navigationLabel": "Navigacija agenta",
|
||||
"agentDetail.publish": "Objavi",
|
||||
"agentDetail.publishMenu.publishUpdate": "Objavi posodobitev",
|
||||
"agentDetail.publishMenu.publishUpdateDescription": "Potisni spremembe v vse poteke dela, ki uporabljajo tega agenta",
|
||||
"agentDetail.publishMenu.saveAsNewAgent": "Shrani kot novega agenta",
|
||||
"agentDetail.publishMenu.saveAsNewAgentDescription": "Ustvari ločen vnos v rosterju z lastnim imenom",
|
||||
"agentDetail.sections.access": "Dostop in deljenje",
|
||||
"agentDetail.sections.configure": "Konfiguracija",
|
||||
"agentDetail.sections.logs": "Dnevniki",
|
||||
"agentDetail.sections.monitoring": "Spremljanje",
|
||||
"agentDetail.subtitle": "ID agenta: {{agentId}}",
|
||||
"agentDetail.title": "Agent",
|
||||
"agentDetail.type": "AGENT",
|
||||
"roster.connectOwnAgent": "Connect to Your Own Agent",
|
||||
"roster.createAgent": "Create agent",
|
||||
"roster.description": "Reusable agents saved to this workspace. Drag onto any canvas or attach to a workflow node. Edit once — every workflow using this agent picks up the change.",
|
||||
"roster.draft": "Draft",
|
||||
"roster.editAgent": "Uredi {{name}}",
|
||||
"roster.filters.all": "All 4",
|
||||
"roster.filters.drafts": "Drafts",
|
||||
"roster.filters.inUse": "In use",
|
||||
"roster.gridView": "Grid view",
|
||||
"roster.invite": "Invite",
|
||||
"roster.inviteAgent": "Povabi {{name}}",
|
||||
"roster.learnMore": "Learn more",
|
||||
"roster.listView": "List view",
|
||||
"roster.marketplaceCta": "Discover ready-made agents in Marketplace",
|
||||
"roster.moreActions": "Več dejanj za {{name}}",
|
||||
"roster.searchLabel": "Search agents",
|
||||
"roster.searchPlaceholder": "Search agents by name, role, or skill…",
|
||||
"roster.sidebar.agents": "Agents",
|
||||
"roster.sidebar.humans": "Humans",
|
||||
"roster.sidebarLabel": "Roster sections",
|
||||
"roster.soon": "Soon",
|
||||
"roster.title": "Agent Roster",
|
||||
"roster.unused": "Unused",
|
||||
"roster.updated": "updated {{time}} ago",
|
||||
"roster.usedInWorkflows": "Used in {{count}} workflows"
|
||||
}
|
||||
@ -312,6 +312,7 @@
|
||||
"menus.newDataset": "Ustvari znanje",
|
||||
"menus.plugins": "Integracije",
|
||||
"menus.pluginsTips": "Integrirajte integracijae tretjih oseb ali ustvarite integracijae, združljive s ChatGPT.",
|
||||
"menus.roster": "Seznam agentov",
|
||||
"menus.status": "beta",
|
||||
"menus.tools": "Orodja",
|
||||
"model.addMoreModel": "Pojdite v nastavitve, da dodate več modelov",
|
||||
|
||||
78
web/i18n/th-TH/agent-v-2.json
Normal file
78
web/i18n/th-TH/agent-v-2.json
Normal file
@ -0,0 +1,78 @@
|
||||
{
|
||||
"agentDetail.documentTitle": "เอเจนต์",
|
||||
"agentDetail.history": "ประวัติ",
|
||||
"agentDetail.memorySettings.description": "ประหยัดค่าใช้จ่าย - บีบอัดหน่วยความจำของการรันจริงโดยอัตโนมัติตามการตั้งค่าประหยัด token ยิ่งประหยัดน้อยลง การบีบอัดยิ่งน้อยลง และความเสถียรระยะยาวดีขึ้น",
|
||||
"agentDetail.memorySettings.export.admin": "ผู้ดูแล",
|
||||
"agentDetail.memorySettings.export.description": "ดาวน์โหลด snapshot ของคลังหน่วยความจำทั้งหมดของ agent",
|
||||
"agentDetail.memorySettings.export.download": "ดาวน์โหลด",
|
||||
"agentDetail.memorySettings.export.title": "ส่งออกหน่วยความจำปัจจุบัน",
|
||||
"agentDetail.memorySettings.isolation.description": "การแยกหน่วยความจำ - ขอบเขตสิ่งที่ agent จำระหว่างการรัน",
|
||||
"agentDetail.memorySettings.isolation.global.label": "ทั่วโลก",
|
||||
"agentDetail.memorySettings.isolation.global.scope": "แชร์ทุกที่",
|
||||
"agentDetail.memorySettings.isolation.perApp.label": "ต่อแอป",
|
||||
"agentDetail.memorySettings.isolation.perApp.scope": "แยกตาม workflow",
|
||||
"agentDetail.memorySettings.isolation.perRun.label": "ต่อการรัน",
|
||||
"agentDetail.memorySettings.isolation.perRun.scope": "ใหม่ทุกการรัน",
|
||||
"agentDetail.memorySettings.strategies.economy.budget": "token หน่วยความจำ <1k",
|
||||
"agentDetail.memorySettings.strategies.economy.label": "ประหยัด",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.budget": "token หน่วยความจำ <100k",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.label": "ระยะยาว",
|
||||
"agentDetail.memorySettings.strategies.medium.budget": "token หน่วยความจำ <10k",
|
||||
"agentDetail.memorySettings.strategies.medium.label": "ปานกลาง",
|
||||
"agentDetail.memorySettings.strategyLabel": "กลยุทธ์หน่วยความจำ",
|
||||
"agentDetail.memorySettings.title": "กลยุทธ์หน่วยความจำ",
|
||||
"agentDetail.monitoring.change": "{{value}} from previous period",
|
||||
"agentDetail.monitoring.description": "Track the reusable agent activity, cost, and interaction quality across workflows.",
|
||||
"agentDetail.monitoring.metrics.activeUsers.explanation": "Unique end users who triggered workflows using this agent.",
|
||||
"agentDetail.monitoring.metrics.activeUsers.title": "Active Users",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.explanation": "Average number of agent steps completed per run.",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.title": "Avg. Interactions",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.unit": "steps",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.explanation": "Estimated token cost produced by this agent across workflow runs.",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.title": "Token Usage",
|
||||
"agentDetail.monitoring.metrics.totalRuns.explanation": "Total workflow runs that invoked this agent.",
|
||||
"agentDetail.monitoring.metrics.totalRuns.title": "Total Runs",
|
||||
"agentDetail.monitoring.timeRangeLabel": "Time range",
|
||||
"agentDetail.monitoring.timeRanges.last30days": "Last 30 days",
|
||||
"agentDetail.monitoring.timeRanges.last7days": "Last 7 days",
|
||||
"agentDetail.monitoring.timeRanges.today": "Today",
|
||||
"agentDetail.monitoring.title": "Monitoring",
|
||||
"agentDetail.navigationLabel": "การนำทางเอเจนต์",
|
||||
"agentDetail.publish": "เผยแพร่",
|
||||
"agentDetail.publishMenu.publishUpdate": "เผยแพร่การอัปเดต",
|
||||
"agentDetail.publishMenu.publishUpdateDescription": "ส่งการเปลี่ยนแปลงไปยังเวิร์กโฟลว์ทั้งหมดที่ใช้เอเจนต์นี้",
|
||||
"agentDetail.publishMenu.saveAsNewAgent": "บันทึกเป็นเอเจนต์ใหม่",
|
||||
"agentDetail.publishMenu.saveAsNewAgentDescription": "แยกเป็นรายการ roster ใหม่พร้อมชื่อของตัวเอง",
|
||||
"agentDetail.sections.access": "การเข้าถึงและการแชร์",
|
||||
"agentDetail.sections.configure": "กำหนดค่า",
|
||||
"agentDetail.sections.logs": "บันทึก",
|
||||
"agentDetail.sections.monitoring": "การตรวจสอบ",
|
||||
"agentDetail.subtitle": "รหัสเอเจนต์: {{agentId}}",
|
||||
"agentDetail.title": "เอเจนต์",
|
||||
"agentDetail.type": "เอเจนต์",
|
||||
"roster.connectOwnAgent": "Connect to Your Own Agent",
|
||||
"roster.createAgent": "Create agent",
|
||||
"roster.description": "Reusable agents saved to this workspace. Drag onto any canvas or attach to a workflow node. Edit once — every workflow using this agent picks up the change.",
|
||||
"roster.draft": "Draft",
|
||||
"roster.editAgent": "แก้ไข {{name}}",
|
||||
"roster.filters.all": "All 4",
|
||||
"roster.filters.drafts": "Drafts",
|
||||
"roster.filters.inUse": "In use",
|
||||
"roster.gridView": "Grid view",
|
||||
"roster.invite": "Invite",
|
||||
"roster.inviteAgent": "เชิญ {{name}}",
|
||||
"roster.learnMore": "Learn more",
|
||||
"roster.listView": "List view",
|
||||
"roster.marketplaceCta": "Discover ready-made agents in Marketplace",
|
||||
"roster.moreActions": "การดำเนินการเพิ่มเติมสำหรับ {{name}}",
|
||||
"roster.searchLabel": "Search agents",
|
||||
"roster.searchPlaceholder": "Search agents by name, role, or skill…",
|
||||
"roster.sidebar.agents": "Agents",
|
||||
"roster.sidebar.humans": "Humans",
|
||||
"roster.sidebarLabel": "Roster sections",
|
||||
"roster.soon": "Soon",
|
||||
"roster.title": "Agent Roster",
|
||||
"roster.unused": "Unused",
|
||||
"roster.updated": "updated {{time}} ago",
|
||||
"roster.usedInWorkflows": "Used in {{count}} workflows"
|
||||
}
|
||||
@ -312,6 +312,7 @@
|
||||
"menus.newDataset": "สร้างความรู้",
|
||||
"menus.plugins": "การผสานรวม",
|
||||
"menus.pluginsTips": "รวมการผสานรวมของบุคคลที่สามหรือสร้างการผสานรวม AI ที่เข้ากันได้กับ ChatGPT",
|
||||
"menus.roster": "รายชื่อตัวแทน",
|
||||
"menus.status": "Beta",
|
||||
"menus.tools": "เครื่อง มือ",
|
||||
"model.addMoreModel": "ไปที่การตั้งค่าเพื่อเพิ่มรุ่นเพิ่มเติม",
|
||||
|
||||
78
web/i18n/tr-TR/agent-v-2.json
Normal file
78
web/i18n/tr-TR/agent-v-2.json
Normal file
@ -0,0 +1,78 @@
|
||||
{
|
||||
"agentDetail.documentTitle": "Ajan",
|
||||
"agentDetail.history": "Geçmiş",
|
||||
"agentDetail.memorySettings.description": "Maliyet tasarrufu - gercek calisma bellegini token tasarrufu tercihinize gore otomatik sikistirir. Daha az tasarruf, daha az sikistirma ve zamanla daha iyi guvenilirlik demektir.",
|
||||
"agentDetail.memorySettings.export.admin": "Yonetici",
|
||||
"agentDetail.memorySettings.export.description": "Ajanin tum bellek deposunun anlik goruntusunu indirin.",
|
||||
"agentDetail.memorySettings.export.download": "Indir",
|
||||
"agentDetail.memorySettings.export.title": "Gecerli bellegi disa aktar",
|
||||
"agentDetail.memorySettings.isolation.description": "Bellek izolasyonu - ajanin calismalar arasinda neyi hatirlayacaginin kapsami.",
|
||||
"agentDetail.memorySettings.isolation.global.label": "Global",
|
||||
"agentDetail.memorySettings.isolation.global.scope": "her yerde paylasilir",
|
||||
"agentDetail.memorySettings.isolation.perApp.label": "Uygulama bazli",
|
||||
"agentDetail.memorySettings.isolation.perApp.scope": "workflow bazli izole",
|
||||
"agentDetail.memorySettings.isolation.perRun.label": "Calisma bazli",
|
||||
"agentDetail.memorySettings.isolation.perRun.scope": "her calismada yeni",
|
||||
"agentDetail.memorySettings.strategies.economy.budget": "bellek tokeni <1k",
|
||||
"agentDetail.memorySettings.strategies.economy.label": "Ekonomi",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.budget": "bellek tokeni <100k",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.label": "Uzun vade",
|
||||
"agentDetail.memorySettings.strategies.medium.budget": "bellek tokeni <10k",
|
||||
"agentDetail.memorySettings.strategies.medium.label": "Orta",
|
||||
"agentDetail.memorySettings.strategyLabel": "Bellek stratejisi",
|
||||
"agentDetail.memorySettings.title": "Bellek stratejisi",
|
||||
"agentDetail.monitoring.change": "{{value}} from previous period",
|
||||
"agentDetail.monitoring.description": "Track the reusable agent activity, cost, and interaction quality across workflows.",
|
||||
"agentDetail.monitoring.metrics.activeUsers.explanation": "Unique end users who triggered workflows using this agent.",
|
||||
"agentDetail.monitoring.metrics.activeUsers.title": "Active Users",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.explanation": "Average number of agent steps completed per run.",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.title": "Avg. Interactions",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.unit": "steps",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.explanation": "Estimated token cost produced by this agent across workflow runs.",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.title": "Token Usage",
|
||||
"agentDetail.monitoring.metrics.totalRuns.explanation": "Total workflow runs that invoked this agent.",
|
||||
"agentDetail.monitoring.metrics.totalRuns.title": "Total Runs",
|
||||
"agentDetail.monitoring.timeRangeLabel": "Time range",
|
||||
"agentDetail.monitoring.timeRanges.last30days": "Last 30 days",
|
||||
"agentDetail.monitoring.timeRanges.last7days": "Last 7 days",
|
||||
"agentDetail.monitoring.timeRanges.today": "Today",
|
||||
"agentDetail.monitoring.title": "Monitoring",
|
||||
"agentDetail.navigationLabel": "Ajan gezinmesi",
|
||||
"agentDetail.publish": "Yayınla",
|
||||
"agentDetail.publishMenu.publishUpdate": "Güncellemeyi yayınla",
|
||||
"agentDetail.publishMenu.publishUpdateDescription": "Değişiklikleri bu ajanı kullanan tüm iş akışlarına gönder",
|
||||
"agentDetail.publishMenu.saveAsNewAgent": "Yeni ajan olarak kaydet",
|
||||
"agentDetail.publishMenu.saveAsNewAgentDescription": "Kendi adına sahip ayrı bir roster kaydı oluştur",
|
||||
"agentDetail.sections.access": "Erişim ve paylaşım",
|
||||
"agentDetail.sections.configure": "Yapılandır",
|
||||
"agentDetail.sections.logs": "Günlükler",
|
||||
"agentDetail.sections.monitoring": "İzleme",
|
||||
"agentDetail.subtitle": "Ajan ID: {{agentId}}",
|
||||
"agentDetail.title": "Ajan",
|
||||
"agentDetail.type": "AJAN",
|
||||
"roster.connectOwnAgent": "Connect to Your Own Agent",
|
||||
"roster.createAgent": "Create agent",
|
||||
"roster.description": "Reusable agents saved to this workspace. Drag onto any canvas or attach to a workflow node. Edit once — every workflow using this agent picks up the change.",
|
||||
"roster.draft": "Draft",
|
||||
"roster.editAgent": "{{name}} ögesini düzenle",
|
||||
"roster.filters.all": "All 4",
|
||||
"roster.filters.drafts": "Drafts",
|
||||
"roster.filters.inUse": "In use",
|
||||
"roster.gridView": "Grid view",
|
||||
"roster.invite": "Invite",
|
||||
"roster.inviteAgent": "{{name}} ögesini davet et",
|
||||
"roster.learnMore": "Learn more",
|
||||
"roster.listView": "List view",
|
||||
"roster.marketplaceCta": "Discover ready-made agents in Marketplace",
|
||||
"roster.moreActions": "{{name}} için daha fazla işlem",
|
||||
"roster.searchLabel": "Search agents",
|
||||
"roster.searchPlaceholder": "Search agents by name, role, or skill…",
|
||||
"roster.sidebar.agents": "Agents",
|
||||
"roster.sidebar.humans": "Humans",
|
||||
"roster.sidebarLabel": "Roster sections",
|
||||
"roster.soon": "Soon",
|
||||
"roster.title": "Agent Roster",
|
||||
"roster.unused": "Unused",
|
||||
"roster.updated": "updated {{time}} ago",
|
||||
"roster.usedInWorkflows": "Used in {{count}} workflows"
|
||||
}
|
||||
@ -312,6 +312,7 @@
|
||||
"menus.newDataset": "Bilgi Oluştur",
|
||||
"menus.plugins": "Entegrasyonlar",
|
||||
"menus.pluginsTips": "Üçüncü taraf entegrasyonlari entegre edin veya ChatGPT uyumlu AI-Entegrasyonlari oluşturun.",
|
||||
"menus.roster": "Ajan listesi",
|
||||
"menus.status": "beta",
|
||||
"menus.tools": "Araçlar",
|
||||
"model.addMoreModel": "Daha fazla model eklemek için ayarlara gidin",
|
||||
|
||||
78
web/i18n/uk-UA/agent-v-2.json
Normal file
78
web/i18n/uk-UA/agent-v-2.json
Normal file
@ -0,0 +1,78 @@
|
||||
{
|
||||
"agentDetail.documentTitle": "Агент",
|
||||
"agentDetail.history": "Історія",
|
||||
"agentDetail.memorySettings.description": "Економія витрат - автоматично стискає памʼять реальних запусків відповідно до налаштування економії токенів. Менша економія означає менше стискань і кращу надійність з часом.",
|
||||
"agentDetail.memorySettings.export.admin": "Адмін",
|
||||
"agentDetail.memorySettings.export.description": "Завантажте знімок усього сховища памʼяті агента.",
|
||||
"agentDetail.memorySettings.export.download": "Завантажити",
|
||||
"agentDetail.memorySettings.export.title": "Експортувати поточну памʼять",
|
||||
"agentDetail.memorySettings.isolation.description": "Ізоляція памʼяті - обсяг того, що агент памʼятає між запусками.",
|
||||
"agentDetail.memorySettings.isolation.global.label": "Глобально",
|
||||
"agentDetail.memorySettings.isolation.global.scope": "спільно всюди",
|
||||
"agentDetail.memorySettings.isolation.perApp.label": "За застосунком",
|
||||
"agentDetail.memorySettings.isolation.perApp.scope": "ізольовано за workflow",
|
||||
"agentDetail.memorySettings.isolation.perRun.label": "За запуском",
|
||||
"agentDetail.memorySettings.isolation.perRun.scope": "нове для кожного запуску",
|
||||
"agentDetail.memorySettings.strategies.economy.budget": "токени памʼяті <1k",
|
||||
"agentDetail.memorySettings.strategies.economy.label": "Економія",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.budget": "токени памʼяті <100k",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.label": "Довгий горизонт",
|
||||
"agentDetail.memorySettings.strategies.medium.budget": "токени памʼяті <10k",
|
||||
"agentDetail.memorySettings.strategies.medium.label": "Середньо",
|
||||
"agentDetail.memorySettings.strategyLabel": "Стратегія памʼяті",
|
||||
"agentDetail.memorySettings.title": "Стратегія памʼяті",
|
||||
"agentDetail.monitoring.change": "{{value}} from previous period",
|
||||
"agentDetail.monitoring.description": "Track the reusable agent activity, cost, and interaction quality across workflows.",
|
||||
"agentDetail.monitoring.metrics.activeUsers.explanation": "Unique end users who triggered workflows using this agent.",
|
||||
"agentDetail.monitoring.metrics.activeUsers.title": "Active Users",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.explanation": "Average number of agent steps completed per run.",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.title": "Avg. Interactions",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.unit": "steps",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.explanation": "Estimated token cost produced by this agent across workflow runs.",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.title": "Token Usage",
|
||||
"agentDetail.monitoring.metrics.totalRuns.explanation": "Total workflow runs that invoked this agent.",
|
||||
"agentDetail.monitoring.metrics.totalRuns.title": "Total Runs",
|
||||
"agentDetail.monitoring.timeRangeLabel": "Time range",
|
||||
"agentDetail.monitoring.timeRanges.last30days": "Last 30 days",
|
||||
"agentDetail.monitoring.timeRanges.last7days": "Last 7 days",
|
||||
"agentDetail.monitoring.timeRanges.today": "Today",
|
||||
"agentDetail.monitoring.title": "Monitoring",
|
||||
"agentDetail.navigationLabel": "Навігація агента",
|
||||
"agentDetail.publish": "Опублікувати",
|
||||
"agentDetail.publishMenu.publishUpdate": "Опублікувати оновлення",
|
||||
"agentDetail.publishMenu.publishUpdateDescription": "Надіслати зміни до всіх робочих процесів, які використовують цього агента",
|
||||
"agentDetail.publishMenu.saveAsNewAgent": "Зберегти як нового агента",
|
||||
"agentDetail.publishMenu.saveAsNewAgentDescription": "Створити окремий запис у реєстрі з власною назвою",
|
||||
"agentDetail.sections.access": "Доступ і спільний доступ",
|
||||
"agentDetail.sections.configure": "Налаштувати",
|
||||
"agentDetail.sections.logs": "Журнали",
|
||||
"agentDetail.sections.monitoring": "Моніторинг",
|
||||
"agentDetail.subtitle": "ID агента: {{agentId}}",
|
||||
"agentDetail.title": "Агент",
|
||||
"agentDetail.type": "АГЕНТ",
|
||||
"roster.connectOwnAgent": "Connect to Your Own Agent",
|
||||
"roster.createAgent": "Create agent",
|
||||
"roster.description": "Reusable agents saved to this workspace. Drag onto any canvas or attach to a workflow node. Edit once — every workflow using this agent picks up the change.",
|
||||
"roster.draft": "Draft",
|
||||
"roster.editAgent": "Редагувати {{name}}",
|
||||
"roster.filters.all": "All 4",
|
||||
"roster.filters.drafts": "Drafts",
|
||||
"roster.filters.inUse": "In use",
|
||||
"roster.gridView": "Grid view",
|
||||
"roster.invite": "Invite",
|
||||
"roster.inviteAgent": "Запросити {{name}}",
|
||||
"roster.learnMore": "Learn more",
|
||||
"roster.listView": "List view",
|
||||
"roster.marketplaceCta": "Discover ready-made agents in Marketplace",
|
||||
"roster.moreActions": "Додаткові дії для {{name}}",
|
||||
"roster.searchLabel": "Search agents",
|
||||
"roster.searchPlaceholder": "Search agents by name, role, or skill…",
|
||||
"roster.sidebar.agents": "Agents",
|
||||
"roster.sidebar.humans": "Humans",
|
||||
"roster.sidebarLabel": "Roster sections",
|
||||
"roster.soon": "Soon",
|
||||
"roster.title": "Agent Roster",
|
||||
"roster.unused": "Unused",
|
||||
"roster.updated": "updated {{time}} ago",
|
||||
"roster.usedInWorkflows": "Used in {{count}} workflows"
|
||||
}
|
||||
@ -312,6 +312,7 @@
|
||||
"menus.newDataset": "Створити знання",
|
||||
"menus.plugins": "Інтеграції",
|
||||
"menus.pluginsTips": "Інтегруйте сторонні інтеграції або створіть AI-сумісні інтеграції.",
|
||||
"menus.roster": "Список агентів",
|
||||
"menus.status": "бета",
|
||||
"menus.tools": "Інструменти",
|
||||
"model.addMoreModel": "Перейдіть до налаштувань, щоб додати більше моделей",
|
||||
|
||||
78
web/i18n/vi-VN/agent-v-2.json
Normal file
78
web/i18n/vi-VN/agent-v-2.json
Normal file
@ -0,0 +1,78 @@
|
||||
{
|
||||
"agentDetail.documentTitle": "Tác nhân",
|
||||
"agentDetail.history": "Lịch sử",
|
||||
"agentDetail.memorySettings.description": "Tiet kiem chi phi - tu dong nen bo nho cua cac lan chay thuc te theo tuy chon tiet kiem token. Tiet kiem it hon nghia la it nen hon va do tin cay tot hon theo thoi gian.",
|
||||
"agentDetail.memorySettings.export.admin": "Quan tri",
|
||||
"agentDetail.memorySettings.export.description": "Tai xuong anh chup toan bo kho bo nho cua agent.",
|
||||
"agentDetail.memorySettings.export.download": "Tai xuong",
|
||||
"agentDetail.memorySettings.export.title": "Xuat bo nho hien tai",
|
||||
"agentDetail.memorySettings.isolation.description": "Cach ly bo nho - pham vi nhung gi agent ghi nho giua cac lan chay.",
|
||||
"agentDetail.memorySettings.isolation.global.label": "Toan cuc",
|
||||
"agentDetail.memorySettings.isolation.global.scope": "chia se moi noi",
|
||||
"agentDetail.memorySettings.isolation.perApp.label": "Theo ung dung",
|
||||
"agentDetail.memorySettings.isolation.perApp.scope": "tach rieng theo workflow",
|
||||
"agentDetail.memorySettings.isolation.perRun.label": "Theo lan chay",
|
||||
"agentDetail.memorySettings.isolation.perRun.scope": "moi moi lan chay",
|
||||
"agentDetail.memorySettings.strategies.economy.budget": "token bo nho <1k",
|
||||
"agentDetail.memorySettings.strategies.economy.label": "Tiet kiem",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.budget": "token bo nho <100k",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.label": "Dai han",
|
||||
"agentDetail.memorySettings.strategies.medium.budget": "token bo nho <10k",
|
||||
"agentDetail.memorySettings.strategies.medium.label": "Trung binh",
|
||||
"agentDetail.memorySettings.strategyLabel": "Chien luoc bo nho",
|
||||
"agentDetail.memorySettings.title": "Chien luoc bo nho",
|
||||
"agentDetail.monitoring.change": "{{value}} from previous period",
|
||||
"agentDetail.monitoring.description": "Track the reusable agent activity, cost, and interaction quality across workflows.",
|
||||
"agentDetail.monitoring.metrics.activeUsers.explanation": "Unique end users who triggered workflows using this agent.",
|
||||
"agentDetail.monitoring.metrics.activeUsers.title": "Active Users",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.explanation": "Average number of agent steps completed per run.",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.title": "Avg. Interactions",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.unit": "steps",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.explanation": "Estimated token cost produced by this agent across workflow runs.",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.title": "Token Usage",
|
||||
"agentDetail.monitoring.metrics.totalRuns.explanation": "Total workflow runs that invoked this agent.",
|
||||
"agentDetail.monitoring.metrics.totalRuns.title": "Total Runs",
|
||||
"agentDetail.monitoring.timeRangeLabel": "Time range",
|
||||
"agentDetail.monitoring.timeRanges.last30days": "Last 30 days",
|
||||
"agentDetail.monitoring.timeRanges.last7days": "Last 7 days",
|
||||
"agentDetail.monitoring.timeRanges.today": "Today",
|
||||
"agentDetail.monitoring.title": "Monitoring",
|
||||
"agentDetail.navigationLabel": "Điều hướng tác nhân",
|
||||
"agentDetail.publish": "Xuất bản",
|
||||
"agentDetail.publishMenu.publishUpdate": "Xuất bản bản cập nhật",
|
||||
"agentDetail.publishMenu.publishUpdateDescription": "Đẩy thay đổi tới tất cả workflow đang dùng agent này",
|
||||
"agentDetail.publishMenu.saveAsNewAgent": "Lưu thành agent mới",
|
||||
"agentDetail.publishMenu.saveAsNewAgentDescription": "Tạo một mục roster riêng với tên riêng",
|
||||
"agentDetail.sections.access": "Truy cập và chia sẻ",
|
||||
"agentDetail.sections.configure": "Cấu hình",
|
||||
"agentDetail.sections.logs": "Nhật ký",
|
||||
"agentDetail.sections.monitoring": "Giám sát",
|
||||
"agentDetail.subtitle": "ID tác nhân: {{agentId}}",
|
||||
"agentDetail.title": "Tác nhân",
|
||||
"agentDetail.type": "TÁC NHÂN",
|
||||
"roster.connectOwnAgent": "Connect to Your Own Agent",
|
||||
"roster.createAgent": "Create agent",
|
||||
"roster.description": "Reusable agents saved to this workspace. Drag onto any canvas or attach to a workflow node. Edit once — every workflow using this agent picks up the change.",
|
||||
"roster.draft": "Draft",
|
||||
"roster.editAgent": "Chỉnh sửa {{name}}",
|
||||
"roster.filters.all": "All 4",
|
||||
"roster.filters.drafts": "Drafts",
|
||||
"roster.filters.inUse": "In use",
|
||||
"roster.gridView": "Grid view",
|
||||
"roster.invite": "Invite",
|
||||
"roster.inviteAgent": "Mời {{name}}",
|
||||
"roster.learnMore": "Learn more",
|
||||
"roster.listView": "List view",
|
||||
"roster.marketplaceCta": "Discover ready-made agents in Marketplace",
|
||||
"roster.moreActions": "Thao tác khác cho {{name}}",
|
||||
"roster.searchLabel": "Search agents",
|
||||
"roster.searchPlaceholder": "Search agents by name, role, or skill…",
|
||||
"roster.sidebar.agents": "Agents",
|
||||
"roster.sidebar.humans": "Humans",
|
||||
"roster.sidebarLabel": "Roster sections",
|
||||
"roster.soon": "Soon",
|
||||
"roster.title": "Agent Roster",
|
||||
"roster.unused": "Unused",
|
||||
"roster.updated": "updated {{time}} ago",
|
||||
"roster.usedInWorkflows": "Used in {{count}} workflows"
|
||||
}
|
||||
@ -312,6 +312,7 @@
|
||||
"menus.newDataset": "Tạo Kiến thức",
|
||||
"menus.plugins": "Tích hợp",
|
||||
"menus.pluginsTips": "Tích hợp các tích hợp bên thứ ba hoặc tạo ra các AI-Tích hợp tương thích với ChatGPT.",
|
||||
"menus.roster": "Danh sách tác nhân",
|
||||
"menus.status": "beta",
|
||||
"menus.tools": "Công cụ",
|
||||
"model.addMoreModel": "Điều chỉnh cài đặt để thêm mô hình",
|
||||
|
||||
124
web/i18n/zh-Hans/agent-v-2.json
Normal file
124
web/i18n/zh-Hans/agent-v-2.json
Normal file
@ -0,0 +1,124 @@
|
||||
{
|
||||
"agentDetail.access.actions.monitoring": "监控",
|
||||
"agentDetail.access.copyReference": "复制 {{name}} 的引用",
|
||||
"agentDetail.access.description": "此智能体可被触达的所有入口。",
|
||||
"agentDetail.access.entries.webapp.description": "应用内会话",
|
||||
"agentDetail.access.entries.webapp.lastUsed": "上次使用 · 12 分钟前",
|
||||
"agentDetail.access.entries.webapp.name": "Webapp",
|
||||
"agentDetail.access.entryCount_one": "{{count}} 个条目",
|
||||
"agentDetail.access.entryCount_other": "{{count}} 个条目",
|
||||
"agentDetail.access.groups.webapp.heading": "Webapp 访问",
|
||||
"agentDetail.access.groups.webapp.label": "Webapp",
|
||||
"agentDetail.access.moreActions": "{{name}} 的更多操作",
|
||||
"agentDetail.access.status.disabled": "已禁用",
|
||||
"agentDetail.access.status.enabled": "已启用",
|
||||
"agentDetail.access.title": "访问入口",
|
||||
"agentDetail.documentTitle": "智能体",
|
||||
"agentDetail.history": "历史记录",
|
||||
"agentDetail.logs.description": "查看近期调用此可复用智能体的工作流运行记录。",
|
||||
"agentDetail.logs.filters.period.allTime": "全部时间",
|
||||
"agentDetail.logs.filters.period.label": "日志时间范围",
|
||||
"agentDetail.logs.filters.period.last30days": "最近 30 天",
|
||||
"agentDetail.logs.filters.period.last7days": "最近 7 天",
|
||||
"agentDetail.logs.filters.search.label": "搜索智能体日志",
|
||||
"agentDetail.logs.filters.search.placeholder": "搜索运行 ID、触发方式或用户…",
|
||||
"agentDetail.logs.filters.status.all": "全部",
|
||||
"agentDetail.logs.filters.status.failed": "失败",
|
||||
"agentDetail.logs.filters.status.label": "日志状态",
|
||||
"agentDetail.logs.filters.status.running": "运行中",
|
||||
"agentDetail.logs.filters.status.succeeded": "成功",
|
||||
"agentDetail.logs.table.runtime": "运行时长",
|
||||
"agentDetail.logs.table.startTime": "开始时间",
|
||||
"agentDetail.logs.table.status": "状态",
|
||||
"agentDetail.logs.table.tokens": "Tokens",
|
||||
"agentDetail.logs.table.trigger": "触发来源",
|
||||
"agentDetail.logs.table.user": "用户",
|
||||
"agentDetail.logs.title": "智能体日志",
|
||||
"agentDetail.logs.triggers.debugRun": "调试运行",
|
||||
"agentDetail.logs.triggers.workflowNode": "工作流节点",
|
||||
"agentDetail.memorySettings.description": "节省成本 - 根据 token 节省偏好自动压缩真实运行记忆。节省越少,记忆压缩越少,长期可靠性越高。",
|
||||
"agentDetail.memorySettings.export.admin": "管理员",
|
||||
"agentDetail.memorySettings.export.description": "下载智能体完整记忆库的快照。",
|
||||
"agentDetail.memorySettings.export.download": "下载",
|
||||
"agentDetail.memorySettings.export.title": "导出当前记忆",
|
||||
"agentDetail.memorySettings.isolation.description": "记忆隔离 - 智能体在多次运行之间可记住内容的范围。",
|
||||
"agentDetail.memorySettings.isolation.global.label": "全局",
|
||||
"agentDetail.memorySettings.isolation.global.scope": "所有位置共享",
|
||||
"agentDetail.memorySettings.isolation.perApp.label": "按应用",
|
||||
"agentDetail.memorySettings.isolation.perApp.scope": "按工作流隔离",
|
||||
"agentDetail.memorySettings.isolation.perRun.label": "按运行",
|
||||
"agentDetail.memorySettings.isolation.perRun.scope": "每次运行全新",
|
||||
"agentDetail.memorySettings.strategies.economy.budget": "记忆 token <1k",
|
||||
"agentDetail.memorySettings.strategies.economy.label": "经济",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.budget": "记忆 token <100k",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.label": "长周期",
|
||||
"agentDetail.memorySettings.strategies.medium.budget": "记忆 token <10k",
|
||||
"agentDetail.memorySettings.strategies.medium.label": "中等",
|
||||
"agentDetail.memorySettings.strategyLabel": "记忆策略",
|
||||
"agentDetail.memorySettings.title": "记忆策略",
|
||||
"agentDetail.monitoring.change": "较上一周期 {{value}}",
|
||||
"agentDetail.monitoring.dateRangeLabel": "日期范围",
|
||||
"agentDetail.monitoring.description": "跟踪可复用智能体在工作流中的活跃度、成本和交互质量。",
|
||||
"agentDetail.monitoring.metrics.activeUsers.explanation": "触发过使用此智能体的工作流的独立终端用户数。",
|
||||
"agentDetail.monitoring.metrics.activeUsers.title": "活跃用户",
|
||||
"agentDetail.monitoring.metrics.avgSessionInteractions.explanation": "此访问入口下用户与智能体的连续沟通次数。",
|
||||
"agentDetail.monitoring.metrics.avgSessionInteractions.title": "平均会话互动数",
|
||||
"agentDetail.monitoring.metrics.tokenOutputSpeed.explanation": "从请求开始到输出完成期间的平均输出速度。",
|
||||
"agentDetail.monitoring.metrics.tokenOutputSpeed.title": "Token 输出速度",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.explanation": "此智能体在工作流运行中产生的预估 token 成本。",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.title": "Token 用量",
|
||||
"agentDetail.monitoring.metrics.totalConversations.explanation": "通过所选访问入口触达此智能体的每日 AI 会话数。",
|
||||
"agentDetail.monitoring.metrics.totalConversations.title": "全部会话数",
|
||||
"agentDetail.monitoring.metrics.totalMessages.explanation": "每日智能体互动总次数。",
|
||||
"agentDetail.monitoring.metrics.totalMessages.title": "全部消息数",
|
||||
"agentDetail.monitoring.metrics.userSatisfactionRate.explanation": "每 1000 条消息的点赞数,反映用户满意度。",
|
||||
"agentDetail.monitoring.metrics.userSatisfactionRate.title": "用户满意度",
|
||||
"agentDetail.monitoring.pickSource": "选择应用",
|
||||
"agentDetail.monitoring.sourceLabel": "应用",
|
||||
"agentDetail.monitoring.sources.all": "全部",
|
||||
"agentDetail.monitoring.timeRangeLabel": "时间范围",
|
||||
"agentDetail.monitoring.timeRanges.last30days": "最近 30 天",
|
||||
"agentDetail.monitoring.timeRanges.last7days": "最近 7 天",
|
||||
"agentDetail.monitoring.timeRanges.today": "今天",
|
||||
"agentDetail.monitoring.title": "监控",
|
||||
"agentDetail.monitoring.tokenUsageConsumed": "耗费 Tokens",
|
||||
"agentDetail.monitoring.units.tokenPerSecond": "Token/秒",
|
||||
"agentDetail.navigationLabel": "智能体导航",
|
||||
"agentDetail.publish": "发布",
|
||||
"agentDetail.publishMenu.publishUpdate": "发布更新",
|
||||
"agentDetail.publishMenu.publishUpdateDescription": "将变更推送到所有使用此智能体的工作流",
|
||||
"agentDetail.publishMenu.saveAsNewAgent": "另存为新智能体",
|
||||
"agentDetail.publishMenu.saveAsNewAgentDescription": "复制为一个拥有独立名称的 Roster 条目",
|
||||
"agentDetail.sections.access": "访问与共享",
|
||||
"agentDetail.sections.configure": "配置",
|
||||
"agentDetail.sections.logs": "日志",
|
||||
"agentDetail.sections.monitoring": "监控",
|
||||
"agentDetail.subtitle": "智能体 ID:{{agentId}}",
|
||||
"agentDetail.title": "智能体",
|
||||
"agentDetail.type": "智能体",
|
||||
"roster.connectOwnAgent": "连接你自己的智能体",
|
||||
"roster.createAgent": "创建智能体",
|
||||
"roster.description": "保存在此工作区的可复用智能体。可拖到任意画布或挂到工作流节点。编辑一次,所有使用该智能体的工作流都会同步更新。",
|
||||
"roster.draft": "草稿",
|
||||
"roster.editAgent": "编辑 {{name}}",
|
||||
"roster.filters.all": "全部 4",
|
||||
"roster.filters.drafts": "草稿",
|
||||
"roster.filters.inUse": "使用中",
|
||||
"roster.gridView": "网格视图",
|
||||
"roster.invite": "邀请",
|
||||
"roster.inviteAgent": "邀请 {{name}}",
|
||||
"roster.learnMore": "了解更多",
|
||||
"roster.listView": "列表视图",
|
||||
"roster.marketplaceCta": "在 Marketplace 发现现成智能体",
|
||||
"roster.moreActions": "{{name}} 的更多操作",
|
||||
"roster.searchLabel": "搜索智能体",
|
||||
"roster.searchPlaceholder": "按名称、角色或技能搜索智能体…",
|
||||
"roster.sidebar.agents": "智能体",
|
||||
"roster.sidebar.humans": "成员",
|
||||
"roster.sidebarLabel": "Roster 分区",
|
||||
"roster.soon": "即将推出",
|
||||
"roster.title": "Agent Roster",
|
||||
"roster.unused": "未使用",
|
||||
"roster.updated": "{{time}} 前更新",
|
||||
"roster.usedInWorkflows": "用于 {{count}} 个工作流"
|
||||
}
|
||||
@ -312,6 +312,7 @@
|
||||
"menus.newDataset": "创建知识库",
|
||||
"menus.plugins": "集成",
|
||||
"menus.pluginsTips": "集成第三方服务或创建与 ChatGPT 兼容的 AI 集成。",
|
||||
"menus.roster": "智能体名册",
|
||||
"menus.status": "beta",
|
||||
"menus.tools": "工具",
|
||||
"model.addMoreModel": "添加更多模型",
|
||||
|
||||
78
web/i18n/zh-Hant/agent-v-2.json
Normal file
78
web/i18n/zh-Hant/agent-v-2.json
Normal file
@ -0,0 +1,78 @@
|
||||
{
|
||||
"agentDetail.documentTitle": "智慧體",
|
||||
"agentDetail.history": "歷史記錄",
|
||||
"agentDetail.memorySettings.description": "節省成本 - 根據 token 節省偏好自動壓縮實際執行記憶。節省越少,記憶壓縮越少,長期可靠性越高。",
|
||||
"agentDetail.memorySettings.export.admin": "管理員",
|
||||
"agentDetail.memorySettings.export.description": "下載智能體完整記憶庫的快照。",
|
||||
"agentDetail.memorySettings.export.download": "下載",
|
||||
"agentDetail.memorySettings.export.title": "匯出目前記憶",
|
||||
"agentDetail.memorySettings.isolation.description": "記憶隔離 - 智能體在多次執行之間可記住內容的範圍。",
|
||||
"agentDetail.memorySettings.isolation.global.label": "全域",
|
||||
"agentDetail.memorySettings.isolation.global.scope": "所有位置共享",
|
||||
"agentDetail.memorySettings.isolation.perApp.label": "按應用",
|
||||
"agentDetail.memorySettings.isolation.perApp.scope": "按工作流程隔離",
|
||||
"agentDetail.memorySettings.isolation.perRun.label": "按執行",
|
||||
"agentDetail.memorySettings.isolation.perRun.scope": "每次執行全新",
|
||||
"agentDetail.memorySettings.strategies.economy.budget": "記憶 token <1k",
|
||||
"agentDetail.memorySettings.strategies.economy.label": "經濟",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.budget": "記憶 token <100k",
|
||||
"agentDetail.memorySettings.strategies.longHorizon.label": "長週期",
|
||||
"agentDetail.memorySettings.strategies.medium.budget": "記憶 token <10k",
|
||||
"agentDetail.memorySettings.strategies.medium.label": "中等",
|
||||
"agentDetail.memorySettings.strategyLabel": "記憶策略",
|
||||
"agentDetail.memorySettings.title": "記憶策略",
|
||||
"agentDetail.monitoring.change": "較上一週期 {{value}}",
|
||||
"agentDetail.monitoring.description": "追蹤可複用智慧體在工作流中的活躍度、成本和互動品質。",
|
||||
"agentDetail.monitoring.metrics.activeUsers.explanation": "觸發過使用此智慧體的工作流的獨立終端使用者數。",
|
||||
"agentDetail.monitoring.metrics.activeUsers.title": "活躍使用者",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.explanation": "每次執行平均完成的智慧體步驟數。",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.title": "平均互動次數",
|
||||
"agentDetail.monitoring.metrics.avgInteractions.unit": "步",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.explanation": "此智慧體在工作流執行中產生的預估 token 成本。",
|
||||
"agentDetail.monitoring.metrics.tokenUsage.title": "Token 用量",
|
||||
"agentDetail.monitoring.metrics.totalRuns.explanation": "呼叫此智慧體的工作流執行總數。",
|
||||
"agentDetail.monitoring.metrics.totalRuns.title": "總執行次數",
|
||||
"agentDetail.monitoring.timeRangeLabel": "時間範圍",
|
||||
"agentDetail.monitoring.timeRanges.last30days": "最近 30 天",
|
||||
"agentDetail.monitoring.timeRanges.last7days": "最近 7 天",
|
||||
"agentDetail.monitoring.timeRanges.today": "今天",
|
||||
"agentDetail.monitoring.title": "監控",
|
||||
"agentDetail.navigationLabel": "智慧體導覽",
|
||||
"agentDetail.publish": "發布",
|
||||
"agentDetail.publishMenu.publishUpdate": "發布更新",
|
||||
"agentDetail.publishMenu.publishUpdateDescription": "將變更推送到所有使用此智能體的工作流程",
|
||||
"agentDetail.publishMenu.saveAsNewAgent": "另存為新智能體",
|
||||
"agentDetail.publishMenu.saveAsNewAgentDescription": "複製為一個擁有獨立名稱的 Roster 項目",
|
||||
"agentDetail.sections.access": "存取與分享",
|
||||
"agentDetail.sections.configure": "設定",
|
||||
"agentDetail.sections.logs": "日誌",
|
||||
"agentDetail.sections.monitoring": "監控",
|
||||
"agentDetail.subtitle": "智慧體 ID:{{agentId}}",
|
||||
"agentDetail.title": "智慧體",
|
||||
"agentDetail.type": "智慧體",
|
||||
"roster.connectOwnAgent": "連接你自己的智能體",
|
||||
"roster.createAgent": "建立智能體",
|
||||
"roster.description": "儲存在此工作區的可複用智能體。可拖到任意畫布或掛到工作流節點。編輯一次,所有使用該智能體的工作流都會同步更新。",
|
||||
"roster.draft": "草稿",
|
||||
"roster.editAgent": "編輯 {{name}}",
|
||||
"roster.filters.all": "全部 4",
|
||||
"roster.filters.drafts": "草稿",
|
||||
"roster.filters.inUse": "使用中",
|
||||
"roster.gridView": "網格視圖",
|
||||
"roster.invite": "邀請",
|
||||
"roster.inviteAgent": "邀請 {{name}}",
|
||||
"roster.learnMore": "瞭解更多",
|
||||
"roster.listView": "列表視圖",
|
||||
"roster.marketplaceCta": "在 Marketplace 探索現成智能體",
|
||||
"roster.moreActions": "{{name}} 的更多操作",
|
||||
"roster.searchLabel": "搜尋智能體",
|
||||
"roster.searchPlaceholder": "按名稱、角色或技能搜尋智能體…",
|
||||
"roster.sidebar.agents": "智能體",
|
||||
"roster.sidebar.humans": "成員",
|
||||
"roster.sidebarLabel": "Roster 分區",
|
||||
"roster.soon": "即將推出",
|
||||
"roster.title": "Agent Roster",
|
||||
"roster.unused": "未使用",
|
||||
"roster.updated": "{{time}} 前更新",
|
||||
"roster.usedInWorkflows": "用於 {{count}} 個工作流"
|
||||
}
|
||||
@ -312,6 +312,7 @@
|
||||
"menus.newDataset": "建立知識庫",
|
||||
"menus.plugins": "集成",
|
||||
"menus.pluginsTips": "集成第三方服務或建立與 ChatGPT 相容的 AI 集成。",
|
||||
"menus.roster": "智能體名冊",
|
||||
"menus.status": "beta",
|
||||
"menus.tools": "工具",
|
||||
"model.addMoreModel": "新增更多模型",
|
||||
|
||||
Reference in New Issue
Block a user