{{ t('dash_title') }}

{{ t('dash_subtitle') }}

{{ s.label }}

{{ s.value }}

{{ s.sub }}

{{ t('dash_total_token_usage') }}

{{ formatTokens(dashTokenUsage.total_tokens) }}

{{ dashTokenUsage.call_count }} {{ t('dash_api_calls') }}

{{ t('dash_prompt_tokens') }}

{{ formatTokens(dashTokenUsage.prompt_tokens) }}

{{ t('dash_input_cost') }}

{{ t('dash_completion_tokens') }}

{{ formatTokens(dashTokenUsage.completion_tokens) }}

{{ t('dash_output_cost') }}

{{ t('dash_client_usage_ranking') }}

{{ t('dash_no_usage_data') }}

{{ i+1 }}
{{ cu.name }} {{ formatTokens(cu.total_tokens) }}

{{ t('dash_quick_actions') }}

{{ t('dash_system_status') }}

{{ s.name }} {{ s.ok ? t('dash_online') : t('dash_offline') }}

{{ t('dash_active_employees') }}

{{ t('dash_no_active_employees') }}

{{ a.name.charAt(0) }}

{{ a.name }}

{{ getTenantName(a.tenant_id) }}

Daily Token Usage (30d)

{{ analytics.usage_by_day[0]?.date?.slice(5) || '' }} {{ analytics.usage_by_day[analytics.usage_by_day.length-1]?.date?.slice(5) || '' }}

Daily Conversations (30d)

{{ analytics.conversations_by_day[0]?.date?.slice(5) || '' }} {{ analytics.conversations_by_day[analytics.conversations_by_day.length-1]?.date?.slice(5) || '' }}

Top Agents by Token Usage

{{ i+1 }}
{{ ag.agent_name }} {{ ag.tenant_name }}
{{ formatTokens(ag.tokens) }} / {{ ag.calls }} calls

{{ t('tenants_title') }}

{{ t('tenants_subtitle') }}

{{ t('tenants_no_clients') }}

{{ t('tenants_no_clients_desc') }}

{{ filteredTenants.length }} / {{ tenants.length }} clients

{{ tn.name.charAt(0) }}

{{ tn.name }}

{{ industryLabel(tn.industry) }}

Credits

{{ (tn.credits_balance || 0).toLocaleString() }}

Plan

{{ tn.plan || 'free' }}

Profile

View

{{ a.name }} +{{ agentsForTenant(tn.id).length - 3 }}

No employees yet

{{ t('workflows_title') }}

{{ t('workflows_subtitle') }}

{{ t('workflows_active') }}

{{ wf.name }}

{{ wf.description || t('workflows_no_description') }}

{{ wf.industry_template }} {{ t('workflows_template') }}

{{ t('workflows_template_library') }}

{{ industryLabel(industry) }}

{{ tpl.name }}

{{ tpl.display_name }}

{{ tpl.description }}

{{ tpl.steps_preview.length }} steps Setup: {{ tpl.estimated_setup }}

{{ t('connectors_title') }}

{{ t('connectors_subtitle') }}

{{ t('connectors_active_bindings') }}

{{ t('connectors_no_bindings') }} {{ t('connectors_channels_tab') }} {{ t('connectors_tab_suffix') }}

{{ t('connectors_available') }}

{{ c.name }}

{{ c.description }}

{{ t('connectors_actions') }}

{{ a }}
{{ t('connectors_available_badge') }}

{{ t('exec_title') }}

{{ t('exec_subtitle') }}

{{ t('exec_no_data') }}

{{ t('exec_id') }} {{ t('exec_trigger') }} {{ t('exec_status') }}
{{ e.id.substring(0,8) }} {{ e.triggered_by }} {{ e.status }}

{{ t('nav_invocations') }}

全平台AI员工调用记录,按模型和客户分类

总调用次数

{{ (invocationData.summary.total_calls || 0).toLocaleString() }}

总Token消耗

{{ (invocationData.summary.total_tokens || 0).toLocaleString() }}

消耗点数

{{ (invocationData.summary.credits_used || 0).toLocaleString() }}

预估成本 (USD)

${{ (invocationData.summary.total_cost || 0).toFixed(2) }}

按模型分类

{{ m.model }}

{{ m.calls }} 次调用

{{ (m.tokens || 0).toLocaleString() }} tokens

${{ m.cost.toFixed(3) }}

暂无数据

按客户分类

{{ t.tenant_name }}

{{ t.calls }} 次调用 · {{ t.credits }} 点数

{{ (t.tokens || 0).toLocaleString() }} tokens

${{ t.cost.toFixed(3) }}

暂无数据
时间 客户 员工 模型 Prompt Completion Total 点数 成本
{{ new Date(inv.created_at).toLocaleString('zh-CN', {month:'2-digit',day:'2-digit',hour:'2-digit',minute:'2-digit'}) }} {{ inv.tenant_name || '-' }} {{ inv.agent_name || '-' }} {{ inv.model }} {{ (inv.prompt_tokens||0).toLocaleString() }} {{ (inv.completion_tokens||0).toLocaleString() }} {{ (inv.total_tokens||0).toLocaleString() }} {{ inv.credits }} ${{ inv.cost_usd.toFixed(4) }}
暂无调用记录

共 {{ invocationData.total }} 条记录

{{ invocationFilter.page }} / {{ Math.ceil(invocationData.total / 50) }}

{{ selectedTenant.name }}

{{ industryLabel(selectedTenant.industry) }} · {{ selectedTenant.plan }}

{{ t('client_digital_employees') }}

{{ t('client_no_employees') }}

{{ a.name.charAt(0) }}

{{ a.name }}

{{ a.title || roleLabel(a.role) }} · {{ a.tasks_completed }} tasks

{{ a.status }}

{{ t('client_connected_services') }}

{{ t('client_no_connectors') }}

{{ connName(c.connector_type) }}

{{ c.connector_type }}

{{ c.is_active ? t('client_active') : t('client_disabled') }}

{{ t('client_documents_data') }}

{{ knowledgeStats.document_count || 0 }}

{{ t('client_documents') }}

{{ knowledgeStats.chunk_count || 0 }}

{{ t('client_text_chunks') }}

{{ knowledgeStats.structured_rows || 0 }}

{{ t('client_data_rows') }}

{{ Math.round((knowledgeStats.total_chars || 0) / 1000) }}k

{{ t('client_characters') }}

{{ t('client_supported_formats') }} {{ t('client_supported_formats_desc') }}

{{ t('client_excel_note') }}

{{ t('client_no_documents') }}

{{ d.file_type.replace('.','').toUpperCase() }}

{{ d.filename }}

{{ d.chunk_count }} chunks · {{ d.row_count }} data rows · {{ d.status }}

{{ selectedAgent.name.charAt(0) }}

{{ selectedAgent.name }}

{{ selectedAgent.title || roleLabel(selectedAgent.role) }} · {{ getTenantName(selectedAgent.tenant_id) }}

{{ selectedAgent.status }}
{{ agentRoleLabel(selectedAgent.role) }}

{{ t('agent_system_prompt') }}

{{ t('agent_system_prompt_desc') }}

{{ t('agent_behavior_rules') }}

{{ t('agent_behavior_rules_desc') }}

{{ t('agent_model_settings') }}

{{ t('agent_builtin_title') || 'Built-in Capabilities' }}

{{ t('agent_default_on') || 'Default ON' }}

{{ t('agent_builtin_desc') || 'These capabilities are enabled by default. Toggle off only if you want to restrict this employee.' }}

{{ t('agent_kb_enabled_desc') }}

{{ t('agent_workflow') }}

{{ t('agent_workflow_desc') }}

{{ t('agent_autonomous_desc') }}

{{ t('agent_workflow_desc2') }}

{{ t('chat_channel_title') }}

{{ t('chat_channel_desc') }}

{{ channelLabel(chatChannel.channel_type) }}

{{ chatChannel.active ? t('channels_active') : t('channels_inactive') }}

{{ t('channels_bot_token_desc') }} @BotFather {{ t('channels_bot_token_desc2') }}

{{ t('channels_bound_success') }}

{{ chatBindResult.error || t('channels_bind_failed') }}

{{ t('agent_pause_external') }}

{{ t('agent_pause_external_desc') }}

{{ t('agent_pause_external_warning') }}

{{ t('cap_external_title') }}

{{ t('cap_external_desc') }}

{{ t('cap_channels_title') }}

{{ t('cap_channels_desc') }}

{{ channelLabel(ch.channel_type) }}

{{ ch.active ? t('channels_active') : t('channels_inactive') }}

{{ t('channels_no_bound') }}

{{ t("channels_bot_token_desc") }} @BotFather {{ t("channels_bot_token_desc2") }}

{{ t('channels_bound_success') }}

{{ bindResult.error || t('channels_bind_failed') }}

{{ t('cap_no_channels') }}

{{ t('cap_cs_settings') }}

{{ t('cap_cs_desc') }}

{{ t('appt_title') }}

{{ t('tpl_appointment_desc') }}

{{ t('sales_title') }}

{{ t('tpl_sales_desc') }}

{{ t('cap_internal_title') }}

{{ t('cap_internal_desc') }}

{{ t('tpl_knowledge_base') }}

{{ t('tpl_knowledge_base_desc') }}

Upload reference materials in the Reference Materials tab. The AI will search them when answering questions.

{{ t('tpl_social_media') }}

{{ t('tpl_social_media_desc') }}

{{ t('tpl_data_entry') }}

{{ t('tpl_data_entry_desc') }}

Coming soon
{{ selectedAgent.name.charAt(0) }}

{{ t('chat_with') }} {{ selectedAgent.name }}

{{ t('chat_test_desc') }}

{{ t('chat_start') }}

{{ t('chat_send_test') }} {{ selectedAgent.name }}{{ t('chat_send_test_suffix') }}

{{ msg.content }}

{{ tc.tool }} {{ JSON.stringify(tc.arguments).substring(0,60) }}
{{ msg.tokens }} {{ t('chat_tokens') }} {{ msg.iterations }} {{ t('chat_step') }}
{{ t('chat_session') }}: {{ chatTokens.total }} {{ t('chat_tokens') }} {{ t('chat_prompt') }}: {{ chatTokens.prompt }} {{ t('chat_completion') }}: {{ chatTokens.completion }}

{{ t('appt_title') }}

{{ t('sales_title') }}

{{ t('usage_recent') }}

{{ t('usage_no_records') }}
{{ t('usage_time') }} {{ t('usage_source') }} {{ t('usage_model') }} {{ isAdmin ? t('usage_tokens') : (t('usage_credits') || '点数') }}
{{ formatTime(r.created_at) }} {{ r.source }} {{ r.model }} {{ isAdmin ? r.total_tokens : Math.ceil((r.total_tokens || 0) / 1000) }}

{{ t('api_title') }}

{{ t('api_subtitle') }}

Select an agent to configure

Choose an agent above to set up AI customer service

CS Mode: {{ csAgentConfig.enabled ? 'Active' : 'Inactive' }}
{{ csSelectedAgent.name }} — {{ csAgentConfig.company_name || 'No company set' }}
{{ preset.label }}
{{ preset.description }}

Company Context

Provide company info for customer service context. The agent's identity (name, role, personality) comes from its own profile settings.

Agent Identity: {{ csSelectedAgent.name }} — {{ csSelectedAgent.role || 'AI Agent' }}

Edit the agent's name, role, and personality in the Agent Management page.

Greeting Messages

Customize greeting templates for different scenarios.

Knowledge Domains

Define what topic areas the agent should focus on when searching the knowledge base.

{{ domain }} No domains configured — agent will search all knowledge
Common domains: products, faq, policies, pricing, shipping, returns, troubleshooting, account, billing

Working Hours

Set business hours for human availability. The AI still responds 24/7 but adjusts messaging.

Enable working hours
{{ dayLabel }}

Escalation Rules

Define when the AI should transfer to a human agent.

Enable escalation
{{ trigger.replace(/_/g, ' ') }}

Email will receive escalation notifications with conversation summary

Safety & Guardrails

Protect your brand by controlling what the agent can and cannot discuss.

{{ topic.replace(/_/g, ' ') }}

Language Settings

Configure which languages the agent supports and how it detects language.

{{ lang }}
Auto-detect language from customer messages

Connected Channels

Manage messaging channels that this CS agent listens on.

Loading channels...

{{ ch.channel_type }}

{{ ch.active ? 'Active' : 'Inactive' }} · Token configured

No channels connected yet. Connect a channel below to start receiving messages.

Connect New Channel

Connect WhatsApp via Twilio

Setup: Go to console.twilio.com → Messaging → Try it out → Send a WhatsApp message

Copy the Account SID and Auth Token from the Twilio Console dashboard.

The Twilio WhatsApp Number is the sandbox number (e.g. +14155238886) or your approved business number.

After connecting, copy the Webhook URL shown below into Twilio Sandbox Settings → "When a message comes in".

WhatsApp connected successfully!

Copy this Webhook URL into Twilio Sandbox Settings → "When a message comes in":

{{ csBindResult.webhook_url }}
{{ csBindResult.error }}

Connect Telegram Bot

Create a bot via @BotFather on Telegram, then paste the bot token below. Webhook will be configured automatically.

{{ csBindResult.ok ? 'Telegram bot connected! Webhook set up automatically.' : csBindResult.error }}

Connect WeChat Official Account

{{ csBindResult.ok ? 'WeChat connected!' : csBindResult.error }}

Web Chat Widget

Web chat widget is already available via the Website Chat feature. Go to your website settings to embed the chat widget.

Channel-Specific Overrides

Customize response behavior per channel.

{{ ch.channel_type }}

Response Style

Control how the agent formats and structures responses.

Use Markdown formatting
Include relevant links
{{ idx + 1 }}

{{ csWizardSteps[csWizardStep]?.label }}

{{ csWizardSteps[csWizardStep]?.desc }}

{{ agent.name }}
{{ agent.role }} — {{ agent.description || 'No description' }}
{{ preset.label }}
{{ preset.description }}

Agent: {{ csSelectedAgent.name }} — {{ csSelectedAgent.role || 'AI Agent' }}

Agent identity comes from its profile. Only company context needs to be set here.

Agent{{ csSelectedAgent?.name }} ({{ csSelectedAgent?.role || 'AI Agent' }})
Company{{ csAgentConfig.company_name || '—' }}
Escalation{{ csAgentConfig.escalation?.enabled ? 'Enabled' : 'Disabled' }}

{{ t('sm_title') }}

{{ t('sm_subtitle') }}

{{ t('sm_select_agent') }}

{{ t('sm_select_agent_desc') }}

{{ t('sm_no_agent') }}

AI Customer Service

Configure your AI customer service agents

{{ agent.name }}

{{ t('workspace_title') }}

{{ t('workspace_subtitle') }}

{{ agent.name }}

{{ getWsChatLastTime(agent.id) }}

{{ agent.title || agentRoleLabel(agent.role) }}

{{ t('ws_no_selection') }}

{{ t('ws_no_selection_desc') }}

{{ chat.agentName }}

{{ chat.agentTitle || 'AI Employee' }}

{{ t('ws_drop_files') }}

{{ t('ws_drop_files_hint') }}

{{ chat.agentName }}

Start a conversation below

{{ chat.loadingStatus?.text || 'Thinking...' }}

!

Action Requires Approval

{{ chat.pendingApproval.tool }}

?

Agent Needs Input

{{ chat.pendingApproval.question }}

{{ pf.name }}

{{ t('client_dash_welcome') }} {{ authUser?.name }}

{{ clientDashData.company || t('client_dash_workspace') }}

{{ t('client_dash_not_configured') }}

{{ t('client_dash_not_configured_desc') }}

{{ t('client_agents_title') }}

{{ t('client_agents_subtitle') }}

{{ t('client_agents_not_configured') }}

{{ t('client_agents_not_configured_desc') }}

{{ t('client_usage_title') }}

{{ t('client_usage_subtitle') }}

{{ t("client_usage_not_configured") }}

{{ t("client_usage_not_configured_desc") }}

{{ t('files_title') }}

{{ t('files_subtitle') }}

{{ t('files_empty') }}

{{ f.filename }}

AI indexed {{ (f.size / 1024).toFixed(1) }}KB · {{ formatTime(f.created_at) }}

{{ t('files_download') || 'Download' }}

{{ t('api_keys_title') || 'API Keys' }}

{{ t('api_keys_subtitle') || 'Integrate your AI employees into your own systems' }}

{{ t('api_keys_created') || 'API Key Created — copy it now, it won\'t be shown again:' }}

{{ newApiKey }}

{{ t('api_keys_empty') || 'No API keys yet. Create one to start integrating.' }}

{{ k.name }}

{{ k.key_prefix }}... · {{ k.calls_count || 0 }} calls · {{ k.is_active ? 'Active' : 'Revoked' }}

Revoked

{{ t('webhooks_title') || 'Webhooks' }}

{{ t('webhooks_subtitle') || 'Receive notifications when events happen with your AI employees' }}

{{ t('webhooks_empty') || 'No webhooks configured. Add one to receive event notifications.' }}

{{ wh.name }}

{{ wh.url }}

{{ ev }}

{{ t('wechat_title') }}

{{ t('wechat_subtitle') }}

{{ wechatError }}

{{ t('wechat_select_agent') || 'Select AI Employee' }}

{{ t('wechat_select_agent_desc') || 'Choose which AI employee will handle WeChat messages' }}

{{ t('wechat_not_connected') }}

{{ t('wechat_not_connected_desc') }}

{{ t('wechat_scan_title') }}

{{ t('wechat_scan_desc') }}

WeChat QR Code
{{ t('wechat_loading_qr') }}
{{ t('wechat_waiting_scan') }}

{{ t('wechat_connected') }}

{{ t('wechat_account') }}: {{ wechatBinding.wechat_nickname }}

{{ t('wechat_status') }}

{{ t('wechat_status_active') }}

{{ t('wechat_connected_since') }}

{{ wechatBinding.connected_at ? new Date(wechatBinding.connected_at).toLocaleString() : '—' }}

{{ t('wechat_ai_employee') }}

{{ getClientAgentName(wechatBinding.agent_id) }}

{{ t('wechat_how_it_works') }}

{{ t('wechat_how_it_works_desc') }}

{{ t('wechat_error_title') }}

{{ t('wechat_error_desc') }}

{{ t('credits_title') }}

{{ t('credits_subtitle') }}

{{ t('credits_no_requests') }}

{{ t('credits_time') }} {{ t('credits_company') }} {{ t('credits_amount') }} {{ t('credits_price') }} {{ t('credits_payment') }} {{ t('credits_notes') }} {{ t('credits_status') }} {{ t('credits_actions') }}
{{ formatTime(cr.created_at) }} {{ cr.tenant_name || getTenantName(cr.tenant_id) }} {{ cr.credits }} ¥{{ cr.price }} {{ cr.payment_method }} {{ cr.payment_note || '—' }} {{ cr.status === 'approved' ? t('credits_status_approved') : cr.status === 'rejected' ? t('credits_status_rejected') : t('credits_status_pending') }}

{{ t('llm_title') }}

{{ t('llm_subtitle') }}

{{ t('llm_health_dashboard') }}

{{ h.display_name }} {{ h.healthy_keys }}/{{ h.total_keys }} {{ t('llm_active_keys') }}
{{ k.label || k.key_id.slice(0,8) }}
{{ k.avg_latency_ms }}ms {{ k.total_requests }} req {{ k.is_healthy ? t('llm_healthy') : k.circuit_open ? t('llm_circuit_open') : t('llm_unhealthy') }}

{{ t('llm_scenarios') }}

{{ t('llm_scenarios_desc') }}

{{ label }}

{{ t('llm_no_providers') }}

{{ p.display_name }} {{ p.name }}
{{ p.base_url }} P{{ p.priority }} {{ p.active_key_count }}/{{ p.key_count }} {{ t('llm_keys') }} {{ p.supported_models.join(', ') }}
{{ llmTestResult.success ? t('llm_test_success') : t('llm_test_failed') }} {{ llmTestResult.latency_ms }}ms {{ llmTestResult.model }} {{ llmTestResult.response }} {{ llmTestResult.error }}

{{ t('llm_keys') }} ({{ p.keys?.length || 0 }})

{{ t('llm_key_label') }} {{ t('llm_masked_key') }} {{ t('llm_requests') }} {{ t('llm_errors') }} {{ t('llm_enabled') }}
{{ k.label || '—' }} {{ k.masked_key }} {{ k.requests_count || 0 }} {{ k.errors_count || 0 }}
No API keys configured

{{ t('users_title') }}

{{ t('users_subtitle') }}

{{ t('users_name') }} {{ t('users_email') }} {{ t('users_role') }} {{ t('users_tenant') }} AI員工點數 {{ t('users_status') }} {{ t('users_actions') }}
{{ u.name.charAt(0) }}
{{ u.name }}
{{ u.email }} {{ u.role }} {{ u.tenant_id ? getTenantName(u.tenant_id) : '—' }} {{ u.is_active ? t('users_active') : t('users_disabled') }}

{{ t('users_recycle_empty') }}

{{ t('users_recycle_empty_desc') }}

{{ t('users_recycle_notice') }}

{{ t('users_name') }} {{ t('users_email') }} {{ t('users_role') }} {{ t('users_deleted_at') }} {{ t('users_expires') }} {{ t('users_actions') }}
{{ u.name.charAt(0) }}
{{ u.name }}
{{ u.email }} {{ u.role }} {{ formatTime(u.deleted_at) }} {{ u.days_remaining }} {{ t('users_days_left') }}