docs: simplify i18n

This commit is contained in:
Simon
2026-01-30 15:13:31 +08:00
parent 97cdb1e1cd
commit 5e936c35d7
14 changed files with 415 additions and 679 deletions

View File

@@ -3,22 +3,14 @@ import LanguageDetector from 'i18next-browser-languagedetector'
import { initReactI18next } from 'react-i18next' import { initReactI18next } from 'react-i18next'
import commonEn from './locales/en-US/common' import commonEn from './locales/en-US/common'
import docsEn from './locales/en-US/docs'
import homeEn from './locales/en-US/home'
import commonZh from './locales/zh-CN/common' import commonZh from './locales/zh-CN/common'
import docsZh from './locales/zh-CN/docs'
import homeZh from './locales/zh-CN/home'
const resources = { const resources = {
'zh-CN': { 'zh-CN': {
common: commonZh, common: commonZh,
home: homeZh,
docs: docsZh,
}, },
'en-US': { 'en-US': {
common: commonEn, common: commonEn,
home: homeEn,
docs: docsEn,
}, },
} }

View File

@@ -1,157 +0,0 @@
export default {
overview: {
title: 'Overview',
subtitle:
'page-agent is a purely web-based GUI Agent. Gives your website an AI operator in simple steps.',
what_is: 'What is page-agent?',
what_is_desc:
'page-agent is an embedded GUI Agent. Unlike traditional browser automation tools, page-agent is built for web developers and web applications first. Integrate it into your site to let users interact with pages through natural language.',
features_title: 'Core Features',
feature_dom: {
title: '🧠 Smart DOM Analysis',
desc: 'DOM-based analysis with high-intensity dehydration. No visual recognition needed. Pure text for fast and precise operations.',
},
feature_secure: {
title: '🔒 Secure & Controllable',
desc: 'Supports operation allowlists, data masking protection. Inject custom knowledge to make AI work by your rules.',
},
feature_backend: {
title: '⚡ Zero Backend',
desc: 'CDN or NPM import with custom LLM endpoints.',
},
feature_accessible: {
title: '♿ Accessible Intelligence',
desc: 'Provides natural language interface for complex B2B systems and admin panels. Makes software easy for everyone.',
},
vs_browser_use: 'vs. browser-use',
table_feature: 'Feature',
table_deployment: 'Deployment',
table_deployment_pa: 'Embedded component',
table_deployment_bu: 'External tool',
table_scope: 'Scope',
table_scope_pa: 'Current page',
table_scope_bu: 'Entire browser',
table_user: 'Target Users',
table_user_pa: 'Web developers',
table_user_bu: 'Scraper/Agent developers',
table_scenario: 'Use Case',
table_scenario_pa: 'UX enhancement',
table_scenario_bu: 'Automation tasks',
use_cases_title: 'Use Cases',
use_case1_title: 'Connect Support Bots:',
use_case1_desc:
"Turn your support assistant into a full agent. Customer service bots no longer just say 'Please click the settings button then click...'—they operate for users directly.",
use_case2_title: 'Modernize Legacy Apps:',
use_case2_desc:
'One line of code transforms old apps into agents. Product experts help users navigate complex B2B software. Reduce support costs and improve satisfaction.',
use_case3_title: 'Interactive Training:',
use_case3_desc:
"Demonstrate workflows in real-time. Let AI show the complete process of 'how to submit an expense report.'",
use_case4_title: 'Accessibility:',
use_case4_desc:
'Provide natural language interaction for visually impaired and elderly users. Connect screen readers or voice assistants to make software accessible to everyone.',
get_started_title: '🚀 Get Started',
get_started_desc:
'Ready to add an AI operator to your website? Check our quick start guide for integration in minutes.',
get_started_button: 'Quick Start →',
},
quick_start: {
title: 'Quick Start',
subtitle: 'Integrate page-agent in minutes.',
installation: 'Installation Steps',
step1_title: '1. Import Options',
step1_cdn: 'CDN Import',
step1_npm: 'NPM Install',
step2_title: '2. Initialize Configuration',
step3_title: '3. Start Using',
},
limitations: {
title: 'Limitations',
subtitle: "Understand page-agent's current capabilities and technical constraints",
page_support: 'Page Support Limitations',
spa_limit_title: 'Single Page Application Limits',
spa_limit_1: '• SPA only: Currently operates within a single page',
spa_limit_2: '• Multi-page relay in design: Cannot execute continuous tasks across pages yet',
spa_limit_3: '• Requires integration: Cannot operate on sites without page-agent',
interaction_limits: 'Interaction Limitations',
supported_ops: 'Supported Operations',
op_click: 'Click',
op_input: 'Text input',
op_scroll: 'Scroll',
op_submit: 'Form submit',
op_select: 'Select',
op_focus: 'Focus',
unsupported_ops: 'Unsupported Operations',
op_hover: 'Mouse hover',
op_drag: 'Drag & drop',
op_context: 'Right-click menu',
op_draw: 'Drawing',
op_keyboard: 'Keyboard shortcuts',
op_position: 'Position-based control',
understanding_limits: 'Understanding Limitations',
no_vision_title: 'No Visual Recognition',
no_vision_desc:
'page-agent operates based on DOM structure with no visual recognition. Cannot understand:',
no_vision_1: '• Image content: Cannot recognize text, icons, or visual elements in images',
no_vision_2: '• Canvas: Cannot understand graphics drawn on Canvas',
no_vision_3: '• WebGL 3D: Cannot operate elements in 3D scenes',
no_vision_4: '• SVG graphics: Cannot understand visual content and paths in SVG',
website_requirements: 'Website Requirements',
req_semantic_title: 'Semantic & Usability',
req_semantic_desc:
'All operations rely on semantic tags and attributes. Poor semantic structure or lack of accessibility features may affect AI understanding accuracy.',
req_ux_title: 'UI/UX',
req_ux_desc:
'Counter-intuitive interaction rules, visual-only operation hints, complex mouse interactions, or rapidly appearing/disappearing elements can affect AI understanding and operation.',
req_env_title: 'Environment',
req_env_desc: 'modern browser',
future: 'Future Plans',
future_title: 'Coming Soon',
future_1: '• Multi-page relay capabilities',
future_2: '• Richer mouse interaction support',
future_3: '• Basic visual understanding',
future_4: '• Smarter error recovery',
},
models: {
title: 'Models',
subtitle:
'Supports models that comply with OpenAI API specification and support tool calls, including public cloud services and private deployments.',
recommendation_logic: 'Recommended: Lightweight models with strong ToolCall capabilities.',
recommended: 'Recommended Models',
available: 'Tested Models',
available_verified: 'Verified Working Models',
tips: 'Tips',
tip_1: 'Reasoning models (like GPT-5) are slower with no advantage',
tip_2:
'Models with weaker ToolCall capabilities may return incorrect formats. Common errors usually auto-recover. Higher temperature recommended',
tip_3:
'Small models or those unable to handle complex tool definitions typically perform poorly',
security: '🔐 Production Authentication',
security_warning: '⚠️ Never commit real LLM API Keys to your frontend code',
security_desc:
'In production environments, to hide the real LLM API Keys, we recommend the following architecture:',
security_backend_proxy: 'Backend Proxy Pattern',
security_backend_desc:
'Set up a backend LLM proxy endpoint that uses the same authentication method as other APIs in your website, such as:',
security_method_1: '• Session/Cookie-based authentication',
security_method_2: '• OIDC (OpenID Connect) single sign-on',
security_method_3: '• Temporary Access Key or JWT Token',
configuration: 'Configuration',
},
custom_tools: {
title: 'Custom Tools',
subtitle:
'Extend AI Agent capabilities by registering custom tools. Use Zod to define strict input schemas for safe business logic calls.',
registration: 'Tool Registration',
registration_desc:
'Each custom tool requires four core properties: name, description, input schema, and execute function.',
page_filter: 'Page Filter',
page_filter_desc:
'Control tool visibility on specific pages via the pageFilter property to enhance security and UX.',
best_practices: 'Best Practices',
bp_performance: '⚡ Performance Optimization',
bp_1: '• Use pageFilter to reduce unnecessary tool loading',
bp_2: '• Implement appropriate caching in execute functions',
bp_3: '• Avoid long-running sync operations in tools',
},
}

View File

@@ -1,82 +0,0 @@
export default {
hero: {
badge: 'GUI Agent in your webpage',
title_line1: 'The AI Operator',
title_line2: 'Living in Your Web App',
subtitle_emoji: '🪄One line of code',
subtitle_main: ' adds intelligent GUI Agents to your website.',
subtitle_detail: 'Users give natural language commands, AI handles the rest.',
tab_try: '🚀 Try It Now',
tab_other: '🌐 Try on Other Sites',
input_placeholder: 'Describe what you want AI to do...',
execute_button: 'Run',
default_task:
'Goto docs in navigation bar, find Quick-Start section, and summarize in markdown',
},
try_other: {
step1_title: 'Step 1:',
step1_content: 'Show your bookmarks bar',
step2_title: 'Step 2:',
step2_content: 'Drag this button to your bookmarks',
cdn_label: 'CDN Source',
cdn_international: 'International',
cdn_china: 'China Mirror',
step3_title: 'Step 3:',
step3_content: 'Click the bookmark on any site to activate',
notice_title: '⚠️ Heads Up',
notice_items: {
item1: 'Demo only—link may expire without notice',
item2: 'This free demo uses DeepSeek API (see their terms and privacy policy)',
item3: 'Some sites block script injection (CSP policies)',
item4: 'Works on single-page apps only—reload required after navigation',
item5: 'Text-only understanding—no image recognition or drag-and-drop',
item6_prefix: 'Full limitations in',
item6_link: 'Docs',
},
},
benefits: {
no_backend: 'Pure Front-end Solution',
private_model: 'Your Own Models',
data_masking: 'Built-in Privacy',
open_source: 'MIT Open Source',
},
features: {
section_title: 'Why PageAgent',
in_page: {
title: 'In-page Solution',
desc: 'Runs entirely within your page. No browser extensions, no headless browsers, and no backend required.',
},
secure_integration: {
title: 'Secure by Design',
desc: 'Control what AI can access with allowlists, data masking, and custom knowledge injection. Your rules, your data.',
},
zero_backend: {
title: 'Zero Backend Setup',
desc: 'Just drop in a script. Works with any LLM provider—OpenAI, Anthropic, or your own models.',
},
accessible: {
title: 'Natural Language UI',
desc: 'Transform complex admin panels into chat interfaces. Make powerful tools accessible to everyone, not just experts.',
},
},
use_cases: {
section_title: 'Where It Shines',
section_subtitle: 'From simple forms to complex workflows, AI understands and executes',
case1: {
title: 'Supercharge Support Bots',
desc: 'Stop telling users where to click—let AI do it for them. Turn your chatbot from a guide into an operator that actually completes tasks.',
},
case2: {
title: 'Modernize Legacy Apps',
desc: 'Add AI superpowers to old software without rebuilding. One script tag transforms complex enterprise tools into chat-driven interfaces.',
},
case3: {
title: 'Interactive Walkthroughs',
desc: "Show, don't tell. Let AI demonstrate workflows in real-time—perfect for onboarding or training new users on complex systems.",
},
case4: {
title: 'Accessibility First',
desc: 'Make web apps accessible through natural language. Perfect for screen readers, voice control, or users who find traditional interfaces challenging.',
},
},
}

View File

@@ -1,152 +0,0 @@
export default {
overview: {
title: 'Overview',
subtitle:
'page-agent 是一个完全基于 Web 技术的 GUI Agent简单几步让你的网站拥有 AI 操作员。',
what_is: '什么是 page-agent',
what_is_desc:
'page-agent 是一个页面内嵌式 GUI Agent。与传统的浏览器自动化工具不同page-agent 面向网站开发者而非爬虫或Agent客户端开发者将 Agent 集成到你的网站中,让用户可以通过自然语言与页面进行交互。',
features_title: '核心特性',
feature_dom: {
title: '🧠 智能 DOM 理解',
desc: '基于 DOM 分析,高强度脱水。无需视觉识别,纯文本实现精准操作。',
},
feature_secure: {
title: '🔒 安全可控',
desc: '支持操作黑白名单、数据脱敏保护。注入自定义知识库,让 AI 按你的规则工作。',
},
feature_backend: {
title: '⚡ 零后端部署',
desc: 'CDN 或 NPM 引入,自定义 LLM 接入点。',
},
feature_accessible: {
title: '♿ 普惠智能',
desc: '为复杂 B端系统、管理后台提供自然语言入口。让每个用户都能轻松上手。',
},
vs_browser_use: '与 browser-use 的区别',
table_feature: '特性',
table_deployment: '部署方式',
table_deployment_pa: '页面内嵌组件',
table_deployment_bu: '外部工具',
table_scope: '操作范围',
table_scope_pa: '当前页面',
table_scope_bu: '整个浏览器',
table_user: '目标用户',
table_user_pa: '网站开发者',
table_user_bu: '爬虫/Agent 开发者',
table_scenario: '使用场景',
table_scenario_pa: '用户体验增强',
table_scenario_bu: '自动化任务',
use_cases_title: '应用场景',
use_case1_title: '对接答疑机器人:',
use_case1_desc:
'把你的答疑助手变成全能Agent。客服机器人不再只说「请先点击设置按钮然后点击...」,而是直接帮用户现场操作。',
use_case2_title: '交互升级/智能化改造:',
use_case2_desc:
'一行代码老应用变身Agent产品专家帮用户操作复杂 B 端软件。降低人工支持成本,提高用户满意度。',
use_case3_title: '产品教学:',
use_case3_desc:
'向用户演示交互过程边做边教。例如让AI演示「如何提交报销申请」的完整操作流程。',
use_case4_title: '无障碍支持:',
use_case4_desc:
'为视障用户、老年用户提供自然语言交互,对接屏幕阅读器或语音助理,让软件人人可用。',
get_started_title: '🚀 开始使用',
get_started_desc:
'准备好为你的网站添加 AI 操作员了吗?查看我们的快速开始指南,几分钟内完成集成。',
get_started_button: '快速开始 →',
},
quick_start: {
title: 'Quick Start',
subtitle: '几分钟内完成 page-agent 的集成。',
installation: '安装步骤',
step1_title: '1. 引入方式',
step1_cdn: 'CDN 引入',
step1_npm: 'NPM 安装',
step2_title: '2. 初始化配置',
step3_title: '3. 开始使用',
},
limitations: {
title: '使用限制',
subtitle: '了解 page-agent 当前的功能边界和技术限制',
page_support: '页面支持限制',
spa_limit_title: '单页应用限制',
spa_limit_1: '• 仅支持单页应用SPA目前只能在单个页面内进行操作',
spa_limit_2: '• 多页接力功能正在设计中:暂时无法跨页面执行连续任务',
spa_limit_3: '• 无法操作未接入该能力的网站:需要目标网站主动集成 page-agent',
interaction_limits: '交互行为限制',
supported_ops: '支持的操作',
op_click: '点击操作',
op_input: '文本输入',
op_scroll: '页面滚动',
op_submit: '表单提交',
op_select: '选择操作',
op_focus: '焦点切换',
unsupported_ops: '不支持的操作',
op_hover: '鼠标悬停hover',
op_drag: '拖拽操作',
op_context: '右键菜单',
op_draw: '图形绘制',
op_keyboard: '键盘快捷键',
op_position: '基于点击区域或鼠标位置的控制',
understanding_limits: '网页理解限制',
no_vision_title: '无视觉能力',
no_vision_desc: 'page-agent 基于 DOM 结构进行理解和操作,没有视觉识别能力,无法理解以下内容:',
no_vision_1: '• 图片内容:无法识别图片中的文字、图标或视觉元素',
no_vision_2: '• Canvas 画布:无法理解 Canvas 中绘制的图形和内容',
no_vision_3: '• WebGL 3D 内容:无法操作 3D 场景中的元素',
no_vision_4: '• SVG 图形:无法理解 SVG 中的视觉内容和路径',
website_requirements: '被操作网站要求',
req_semantic_title: '语义化和易用性',
req_semantic_desc:
'所有操作都基于 DOM 元素的语义化标签和属性。如果页面结构不够语义化,或者没有任何 accessibility 特性,可能影响 AI 的理解准确性。',
req_ux_title: 'UI/UX',
req_ux_desc:
'反常识的交互规则、基于视觉的操作提示、复杂的鼠标交互、快速出现快速消失的元素等,都会影响 AI 的理解和操作。',
req_env_title: '环境要求',
req_env_desc: 'modern browser',
future: '未来规划',
future_title: '即将支持',
future_1: '• 多页面接力操作能力',
future_2: '• 更丰富的鼠标交互支持',
future_3: '• 基础的视觉理解能力',
future_4: '• 更智能的错误恢复机制',
},
models: {
title: '模型',
subtitle: '当前支持符合 OpenAI 接口规范且支持 tool call 的模型,包括公有云服务和私有部署方案。',
recommendation_logic: '推荐使用 ToolCall 能力强的轻量级模型。',
recommended: '推荐模型',
available: '已测试模型',
available_verified: '已验证可用模型',
tips: '提示',
tip_1: 'reasoning 模型(如 GPT-5),速度偏慢,没有必要',
tip_2:
'ToolCall 能力较弱的模型可能返回错误的格式,常见错误能够自动恢复,建议设置较高的 temperature',
tip_3: '小模型或者无法适应复杂 Tool 定义的模型,通常效果不佳',
security: '🔐 生产环境鉴权建议',
security_warning: '⚠️ 永远不要把真实的 LLM API Key 发布到前端代码',
security_desc: '在实际应用中,为了隐藏真实的 LLM API Key建议采用以下架构:',
security_backend_proxy: '后端代理转发',
security_backend_desc:
'在后端搭建一个 LLM 流量转发接口,该接口使用与你网站上其他接口相同的鉴权方式,例如:',
security_method_1: '• Session/Cookie 会话认证',
security_method_2: '• OIDC (OpenID Connect) 单点登录',
security_method_3: '• 临时 Access Key 或 JWT Token',
configuration: '配置方式',
},
custom_tools: {
title: '自定义工具',
subtitle:
'通过注册自定义工具,扩展 AI Agent 的能力边界。使用 Zod 定义严格的输入接口,让 AI 安全调用你的业务逻辑。',
registration: '工具注册',
registration_desc:
'每个自定义工具需要定义四个核心属性name、description、input schema 和 execute 函数。',
page_filter: '页面过滤器',
page_filter_desc: '通过 pageFilter 属性控制工具在哪些页面可见,提升安全性和用户体验。',
best_practices: '最佳实践',
bp_performance: '⚡ 性能优化',
bp_1: '• 使用 pageFilter 减少不必要的工具加载',
bp_2: '• 在 execute 函数中实现适当的缓存机制',
bp_3: '• 避免在工具中执行耗时的同步操作',
},
}

View File

@@ -1,81 +0,0 @@
export default {
hero: {
badge: 'GUI Agent in your webpage',
title_line1: '让你的 Web 应用',
title_line2: '拥有 AI 操作员',
subtitle_emoji: '🪄一行代码',
subtitle_main: ',为你的网站添加 GUI Agent。',
subtitle_detail: '用户/答疑机器人给出文字指示AI 帮你操作页面。',
tab_try: '🚀 立即尝试',
tab_other: '🌐 其他网页尝试',
input_placeholder: '输入您想要 AI 执行的任务...',
execute_button: '执行',
default_task: '从导航栏中进入文档页,打开“快速开始”相关的文档,帮我总结成 markdown',
},
try_other: {
step1_title: '步骤 1:',
step1_content: '显示收藏夹栏',
step2_title: '步骤 2:',
step2_content: '拖拽下面按钮到收藏夹栏',
cdn_label: 'CDN 源',
cdn_international: '国际',
cdn_china: '国内镜像',
step3_title: '步骤 3:',
step3_content: '在其他网站点击收藏夹中的按钮即可使用',
notice_title: '⚠️ 注意',
notice_items: {
item1: '仅做技术评估,链接定期失效',
item2: '使用 DeepSeek 模型,参考 DeepSeek 用户协议和隐私政策',
item3: '部分网站屏蔽了链接嵌入,将无反应',
item4: '仅支持单页应用,页面跳转后需要重新注入',
item5: '仅识别文本,不识别图像,不支持拖拽等复杂交互',
item6_prefix: '详细使用限制参照',
item6_link: '《文档》',
},
},
benefits: {
no_backend: '纯前端方案',
private_model: '支持私有模型',
data_masking: '无痛脱敏',
open_source: 'MIT 开源',
},
features: {
section_title: '核心特性',
in_page: {
title: '纯页面内方案',
desc: '完全运行在你的页面内。不需要浏览器插件、不需要无头浏览器,不需要后端。',
},
secure_integration: {
title: '安全可控集成',
desc: '支持操作黑白名单、数据脱敏保护。注入自定义知识库,让 AI 按你的规则工作。',
},
zero_backend: {
title: '零后端部署',
desc: '前端脚本引入,自定义 LLM 接入点。从 OpenAI 到 qwen3完全由你掌控。',
},
accessible: {
title: '普惠智能交互',
desc: '为复杂 B端系统、管理后台提供自然语言入口。让每个用户都能轻松上手。',
},
},
use_cases: {
section_title: '应用场景',
section_subtitle: '从简单的表单填写到复杂的业务流程AI 都能理解并执行',
case1: {
title: '对接答疑机器人',
desc: '把你的答疑助手变成全能Agent。客服机器人不再只说「请先点击设置按钮然后点击...」,而是直接帮用户现场操作。',
},
case2: {
title: '交互升级/智能化改造',
desc: '一行代码老应用变身Agent产品专家帮用户操作复杂 B 端软件。降低人工支持成本,提高用户满意度。',
},
case3: {
title: '产品教学',
desc: '向用户演示交互过程边做边教。例如让AI演示「如何提交报销申请」的完整操作流程。',
},
case4: {
title: '无障碍支持',
desc: '为视障用户、老年用户提供自然语言交互,对接屏幕阅读器或语音助理,让软件人人可用。',
},
},
}

View File

@@ -1,16 +1,12 @@
import 'react-i18next' import 'react-i18next'
import type commonZh from './locales/zh-CN/common' import type commonZh from './locales/zh-CN/common'
import type docsZh from './locales/zh-CN/docs'
import type homeZh from './locales/zh-CN/home'
declare module 'react-i18next' { declare module 'react-i18next' {
interface CustomTypeOptions { interface CustomTypeOptions {
defaultNS: 'common' defaultNS: 'common'
resources: { resources: {
common: typeof commonZh common: typeof commonZh
home: typeof homeZh
docs: typeof docsZh
} }
} }
} }

View File

@@ -40,11 +40,16 @@ function getInjection(useCN?: boolean) {
} }
export default function HomePage() { export default function HomePage() {
const { t, i18n } = useTranslation(['home', 'common']) const { i18n } = useTranslation('common')
const [task, setTask] = useState(() => t('home:hero.default_task')) const isZh = i18n.language === 'zh-CN'
const defaultTask = isZh
? '从导航栏中进入文档页,打开"快速开始"相关的文档,帮我总结成 markdown'
: 'Goto docs in navigation bar, find Quick-Start section, and summarize in markdown'
const [task, setTask] = useState(() => defaultTask)
// Update task when language changes // Update task when language changes
const defaultTask = t('home:hero.default_task')
useEffect(() => { useEffect(() => {
setTask(defaultTask) setTask(defaultTask)
}, [defaultTask]) }, [defaultTask])
@@ -131,7 +136,7 @@ export default function HomePage() {
aria-hidden="true" aria-hidden="true"
></span> ></span>
<AnimatedGradientText colorFrom="#3b82f6" colorTo="#8b5cf6"> <AnimatedGradientText colorFrom="#3b82f6" colorTo="#8b5cf6">
{t('home:hero.badge')} GUI Agent in your webpage
</AnimatedGradientText> </AnimatedGradientText>
</div> </div>
@@ -139,20 +144,24 @@ export default function HomePage() {
id="hero-heading" id="hero-heading"
className="text-5xl lg:text-7xl font-bold mb-8 bg-linear-to-r from-blue-600 to-purple-600 bg-clip-text text-transparent pb-1" className="text-5xl lg:text-7xl font-bold mb-8 bg-linear-to-r from-blue-600 to-purple-600 bg-clip-text text-transparent pb-1"
> >
{t('home:hero.title_line1')} {isZh ? '让你的 Web 应用' : 'The AI Operator'}
<br /> <br />
{t('home:hero.title_line2')} {isZh ? '拥有 AI 操作员' : 'Living in Your Web App'}
</h1> </h1>
<p className="text-xl lg:text-2xl text-gray-600 dark:text-gray-300 mb-12 max-w-4xl mx-auto leading-relaxed"> <p className="text-xl lg:text-2xl text-gray-600 dark:text-gray-300 mb-12 max-w-4xl mx-auto leading-relaxed">
<Highlighter action="underline" color="#8b5cf6" strokeWidth={2}> <Highlighter action="underline" color="#8b5cf6" strokeWidth={2}>
<span className="bg-linear-to-r from-blue-500 to-purple-500 bg-clip-text text-transparent font-bold"> <span className="bg-linear-to-r from-blue-500 to-purple-500 bg-clip-text text-transparent font-bold">
{t('home:hero.subtitle_emoji')} {isZh ? '🪄一行代码' : '🪄One line of code'}
</span> </span>
</Highlighter> </Highlighter>
{t('home:hero.subtitle_main')} {isZh
? ',为你的网站添加 GUI Agent。'
: ' adds intelligent GUI Agents to your website.'}
<br /> <br />
{t('home:hero.subtitle_detail')} {isZh
? '用户/答疑机器人给出文字指示AI 帮你操作页面。'
: 'Users give natural language commands, AI handles the rest.'}
</p> </p>
{/* Try It Now Section - Tab Card */} {/* Try It Now Section - Tab Card */}
@@ -173,7 +182,7 @@ export default function HomePage() {
: 'text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white hover:bg-gray-50 dark:hover:bg-gray-700' : 'text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white hover:bg-gray-50 dark:hover:bg-gray-700'
}`} }`}
> >
{t('home:hero.tab_try')} {isZh ? '🚀 立即尝试' : '🚀 Try It Now'}
</button> </button>
<button <button
onClick={() => setActiveTab('other')} onClick={() => setActiveTab('other')}
@@ -183,7 +192,7 @@ export default function HomePage() {
: 'text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white hover:bg-gray-50 dark:hover:bg-gray-700' : 'text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white hover:bg-gray-50 dark:hover:bg-gray-700'
}`} }`}
> >
{t('home:hero.tab_other')} {isZh ? '🌐 其他网页尝试' : '🌐 Try on Other Sites'}
</button> </button>
</div> </div>
@@ -195,7 +204,11 @@ export default function HomePage() {
<input <input
value={task} value={task}
onChange={(e) => setTask(e.target.value)} onChange={(e) => setTask(e.target.value)}
placeholder={t('home:hero.input_placeholder')} placeholder={
isZh
? '输入您想要 AI 执行的任务...'
: 'Describe what you want AI to do...'
}
className="w-full px-4 py-3 pr-20 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white placeholder-gray-500 dark:placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent resize-none text-sm mb-0" className="w-full px-4 py-3 pr-20 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white placeholder-gray-500 dark:placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent resize-none text-sm mb-0"
data-page-agent-not-interactive data-page-agent-not-interactive
/> />
@@ -206,7 +219,7 @@ export default function HomePage() {
className="absolute right-2 top-2 px-5 py-1.5 bg-linear-to-r from-blue-600 to-purple-600 text-white font-medium rounded-md hover:shadow-md transform hover:scale-105 transition-all duration-200 disabled:opacity-50 disabled:cursor-not-allowed disabled:transform-none text-sm" className="absolute right-2 top-2 px-5 py-1.5 bg-linear-to-r from-blue-600 to-purple-600 text-white font-medium rounded-md hover:shadow-md transform hover:scale-105 transition-all duration-200 disabled:opacity-50 disabled:cursor-not-allowed disabled:transform-none text-sm"
data-page-agent-not-interactive data-page-agent-not-interactive
> >
{t('home:hero.execute_button')} {isZh ? '执行' : 'Run'}
</button> </button>
</div> </div>
</div> </div>
@@ -220,15 +233,17 @@ export default function HomePage() {
<div className="bg-blue-50 dark:bg-gray-700 p-4 rounded-lg"> <div className="bg-blue-50 dark:bg-gray-700 p-4 rounded-lg">
<p className="text-gray-700 dark:text-gray-300 text-sm mb-3"> <p className="text-gray-700 dark:text-gray-300 text-sm mb-3">
<span className="font-semibold"> <span className="font-semibold">
{t('home:try_other.step1_title')} {isZh ? '步骤 1:' : 'Step 1:'}
</span>{' '} </span>{' '}
{t('home:try_other.step1_content')} {isZh ? '显示收藏夹栏' : 'Show your bookmarks bar'}
</p> </p>
<div className="flex items-center justify-center gap-2"> <div className="flex items-center justify-center gap-2">
<kbd className="px-2 py-1 bg-white dark:bg-gray-600 border border-gray-300 dark:border-gray-500 rounded text-xs font-mono"> <kbd className="px-2 py-1 bg-white dark:bg-gray-600 border border-gray-300 dark:border-gray-500 rounded text-xs font-mono">
Ctrl + Shift + B Ctrl + Shift + B
</kbd> </kbd>
<span className="text-gray-500 dark:text-gray-400"></span> <span className="text-gray-500 dark:text-gray-400">
{isZh ? '或' : 'or'}
</span>
<kbd className="px-2 py-1 bg-white dark:bg-gray-600 border border-gray-300 dark:border-gray-500 rounded text-xs font-mono"> <kbd className="px-2 py-1 bg-white dark:bg-gray-600 border border-gray-300 dark:border-gray-500 rounded text-xs font-mono">
+ Shift + B + Shift + B
</kbd> </kbd>
@@ -239,9 +254,11 @@ export default function HomePage() {
<div className="bg-green-50 dark:bg-gray-700 p-4 rounded-lg"> <div className="bg-green-50 dark:bg-gray-700 p-4 rounded-lg">
<p className="text-gray-700 dark:text-gray-300 text-sm mb-3"> <p className="text-gray-700 dark:text-gray-300 text-sm mb-3">
<span className="font-semibold"> <span className="font-semibold">
{t('home:try_other.step2_title')} {isZh ? '步骤 2:' : 'Step 2:'}
</span>{' '} </span>{' '}
{t('home:try_other.step2_content')} {isZh
? '拖拽下面按钮到收藏夹栏'
: 'Drag this button to your bookmarks'}
</p> </p>
<div className="flex items-center justify-center gap-3"> <div className="flex items-center justify-center gap-3">
<select <select
@@ -252,9 +269,11 @@ export default function HomePage() {
className="px-2 py-1.5 text-xs border border-gray-300 dark:border-gray-500 rounded bg-white dark:bg-gray-600 text-gray-700 dark:text-gray-200" className="px-2 py-1.5 text-xs border border-gray-300 dark:border-gray-500 rounded bg-white dark:bg-gray-600 text-gray-700 dark:text-gray-200"
> >
<option value="international"> <option value="international">
{t('home:try_other.cdn_international')} {isZh ? '国际' : 'International'}
</option>
<option value="china">
{isZh ? '国内镜像' : 'China Mirror'}
</option> </option>
<option value="china">{t('home:try_other.cdn_china')}</option>
</select> </select>
<div <div
dangerouslySetInnerHTML={{ dangerouslySetInnerHTML={{
@@ -268,9 +287,11 @@ export default function HomePage() {
<div className="bg-purple-50 dark:bg-gray-700 p-4 rounded-lg"> <div className="bg-purple-50 dark:bg-gray-700 p-4 rounded-lg">
<p className="text-gray-700 dark:text-gray-300 text-sm"> <p className="text-gray-700 dark:text-gray-300 text-sm">
<span className="font-semibold"> <span className="font-semibold">
{t('home:try_other.step3_title')} {isZh ? '步骤 3:' : 'Step 3:'}
</span>{' '} </span>{' '}
{t('home:try_other.step3_content')} {isZh
? '在其他网站点击收藏夹中的按钮即可使用'
: 'Click the bookmark on any site to activate'}
</p> </p>
</div> </div>
</div> </div>
@@ -278,37 +299,47 @@ export default function HomePage() {
{/* 右侧:注意事项 */} {/* 右侧:注意事项 */}
<div className="bg-yellow-50 dark:bg-gray-700 p-4 rounded-lg"> <div className="bg-yellow-50 dark:bg-gray-700 p-4 rounded-lg">
<h4 className="font-semibold text-gray-900 dark:text-white mb-3 text-sm"> <h4 className="font-semibold text-gray-900 dark:text-white mb-3 text-sm">
{t('home:try_other.notice_title')} {isZh ? '⚠️ 注意' : '⚠️ Heads Up'}
</h4> </h4>
<ul className="space-y-2 text-sm text-gray-700 dark:text-gray-300"> <ul className="space-y-2 text-sm text-gray-700 dark:text-gray-300">
<li className="flex items-start text-left"> <li className="flex items-start text-left">
<span className="w-1.5 h-1.5 bg-yellow-500 rounded-full mt-2 mr-2 shrink-0 "></span> <span className="w-1.5 h-1.5 bg-yellow-500 rounded-full mt-2 mr-2 shrink-0 "></span>
{t('home:try_other.notice_items.item1')} {isZh
? '仅做技术评估,链接定期失效'
: 'Demo only—link may expire without notice'}
</li> </li>
<li className="flex items-start text-left"> <li className="flex items-start text-left">
<span className="w-1.5 h-1.5 bg-yellow-500 rounded-full mt-2 mr-2 shrink-0 "></span> <span className="w-1.5 h-1.5 bg-yellow-500 rounded-full mt-2 mr-2 shrink-0 "></span>
{t('home:try_other.notice_items.item2')} {isZh
? '使用 DeepSeek 模型,参考 DeepSeek 用户协议和隐私政策'
: 'This free demo uses DeepSeek API (see their terms and privacy policy)'}
</li> </li>
<li className="flex items-start text-left"> <li className="flex items-start text-left">
<span className="w-1.5 h-1.5 bg-yellow-500 rounded-full mt-2 mr-2 shrink-0 "></span> <span className="w-1.5 h-1.5 bg-yellow-500 rounded-full mt-2 mr-2 shrink-0 "></span>
{t('home:try_other.notice_items.item3')} {isZh
? '部分网站屏蔽了链接嵌入,将无反应'
: 'Some sites block script injection (CSP policies)'}
</li> </li>
<li className="flex items-start text-left"> <li className="flex items-start text-left">
<span className="w-1.5 h-1.5 bg-yellow-500 rounded-full mt-2 mr-2 shrink-0 "></span> <span className="w-1.5 h-1.5 bg-yellow-500 rounded-full mt-2 mr-2 shrink-0 "></span>
{t('home:try_other.notice_items.item4')} {isZh
? '仅支持单页应用,页面跳转后需要重新注入'
: 'Works on single-page apps only—reload required after navigation'}
</li> </li>
<li className="flex items-start text-left"> <li className="flex items-start text-left">
<span className="w-1.5 h-1.5 bg-yellow-500 rounded-full mt-2 mr-2 shrink-0 "></span> <span className="w-1.5 h-1.5 bg-yellow-500 rounded-full mt-2 mr-2 shrink-0 "></span>
{t('home:try_other.notice_items.item5')} {isZh
? '仅识别文本,不识别图像,不支持拖拽等复杂交互'
: 'Text-only understanding—no image recognition or drag-and-drop'}
</li> </li>
<li className="flex items-start text-left"> <li className="flex items-start text-left">
<span className="w-1.5 h-1.5 bg-yellow-500 rounded-full mt-2 mr-2 shrink-0 "></span> <span className="w-1.5 h-1.5 bg-yellow-500 rounded-full mt-2 mr-2 shrink-0 "></span>
{t('home:try_other.notice_items.item6_prefix')}{' '} {isZh ? '详细使用限制参照' : 'Full limitations in'}{' '}
<Link <Link
href="/docs/introduction/limitations" href="/docs/introduction/limitations"
className="text-blue-600 dark:text-blue-400 hover:underline" className="text-blue-600 dark:text-blue-400 hover:underline"
> >
{t('home:try_other.notice_items.item6_link')} {isZh ? '《文档》' : 'Docs'}
</Link> </Link>
</li> </li>
</ul> </ul>
@@ -329,28 +360,28 @@ export default function HomePage() {
className="w-2 h-2 bg-green-500 rounded-full mr-2" className="w-2 h-2 bg-green-500 rounded-full mr-2"
aria-hidden="true" aria-hidden="true"
></span> ></span>
{t('home:benefits.no_backend')} {isZh ? '纯前端方案' : 'Pure Front-end Solution'}
</li> </li>
<li className="flex items-center"> <li className="flex items-center">
<span <span
className="w-2 h-2 bg-green-500 rounded-full mr-2" className="w-2 h-2 bg-green-500 rounded-full mr-2"
aria-hidden="true" aria-hidden="true"
></span> ></span>
{t('home:benefits.private_model')} {isZh ? '支持私有模型' : 'Your Own Models'}
</li> </li>
<li className="flex items-center"> <li className="flex items-center">
<span <span
className="w-2 h-2 bg-green-500 rounded-full mr-2" className="w-2 h-2 bg-green-500 rounded-full mr-2"
aria-hidden="true" aria-hidden="true"
></span> ></span>
{t('home:benefits.data_masking')} {isZh ? '无痛脱敏' : 'Built-in Privacy'}
</li> </li>
<li className="flex items-center"> <li className="flex items-center">
<span <span
className="w-2 h-2 bg-green-500 rounded-full mr-2" className="w-2 h-2 bg-green-500 rounded-full mr-2"
aria-hidden="true" aria-hidden="true"
></span> ></span>
{t('home:benefits.open_source')} {isZh ? 'MIT 开源' : 'MIT Open Source'}
</li> </li>
</ul> </ul>
</div> </div>
@@ -376,10 +407,12 @@ export default function HomePage() {
<Box className="w-7 h-7 text-white" strokeWidth={2.5} /> <Box className="w-7 h-7 text-white" strokeWidth={2.5} />
</div> </div>
<h3 className="text-xl font-bold mb-4 text-gray-900 dark:text-white"> <h3 className="text-xl font-bold mb-4 text-gray-900 dark:text-white">
{t('home:features.in_page.title')} {isZh ? '纯页面内方案' : 'In-page Solution'}
</h3> </h3>
<p className="text-gray-600 dark:text-gray-300 leading-relaxed"> <p className="text-gray-600 dark:text-gray-300 leading-relaxed">
{t('home:features.in_page.desc')} {isZh
? '完全运行在你的页面内。不需要浏览器插件、不需要无头浏览器,不需要后端。'
: 'Runs entirely within your page. No browser extensions, no headless browsers, and no backend required.'}
</p> </p>
</article> </article>
@@ -395,10 +428,12 @@ export default function HomePage() {
<Zap className="w-7 h-7 text-white fill-white" strokeWidth={2.5} /> <Zap className="w-7 h-7 text-white fill-white" strokeWidth={2.5} />
</div> </div>
<h3 className="text-xl font-bold mb-4 text-gray-900 dark:text-white"> <h3 className="text-xl font-bold mb-4 text-gray-900 dark:text-white">
{t('home:features.zero_backend.title')} {isZh ? '零后端部署' : 'Zero Backend Setup'}
</h3> </h3>
<p className="text-gray-600 dark:text-gray-300 leading-relaxed"> <p className="text-gray-600 dark:text-gray-300 leading-relaxed">
{t('home:features.zero_backend.desc')} {isZh
? '前端脚本引入,自定义 LLM 接入点。从 OpenAI 到 qwen3完全由你掌控。'
: 'Just drop in a script. Works with any LLM provider—OpenAI, Anthropic, or your own models.'}
</p> </p>
</article> </article>
@@ -414,10 +449,12 @@ export default function HomePage() {
<MessageSquare className="w-7 h-7 text-white" strokeWidth={2.5} /> <MessageSquare className="w-7 h-7 text-white" strokeWidth={2.5} />
</div> </div>
<h3 className="text-xl font-bold mb-4 text-gray-900 dark:text-white"> <h3 className="text-xl font-bold mb-4 text-gray-900 dark:text-white">
{t('home:features.accessible.title')} {isZh ? '普惠智能交互' : 'Natural Language UI'}
</h3> </h3>
<p className="text-gray-600 dark:text-gray-300 leading-relaxed"> <p className="text-gray-600 dark:text-gray-300 leading-relaxed">
{t('home:features.accessible.desc')} {isZh
? '为复杂 B端系统、管理后台提供自然语言入口。让每个用户都能轻松上手。'
: 'Transform complex admin panels into chat interfaces. Make powerful tools accessible to everyone, not just experts.'}
</p> </p>
</article> </article>
@@ -433,10 +470,12 @@ export default function HomePage() {
<Shield className="w-7 h-7 text-white" strokeWidth={2.5} /> <Shield className="w-7 h-7 text-white" strokeWidth={2.5} />
</div> </div>
<h3 className="text-xl font-bold mb-4 text-gray-900 dark:text-white"> <h3 className="text-xl font-bold mb-4 text-gray-900 dark:text-white">
{t('home:features.secure_integration.title')} {isZh ? '安全可控集成' : 'Secure by Design'}
</h3> </h3>
<p className="text-gray-600 dark:text-gray-300 leading-relaxed"> <p className="text-gray-600 dark:text-gray-300 leading-relaxed">
{t('home:features.secure_integration.desc')} {isZh
? '支持操作黑白名单、数据脱敏保护。注入自定义知识库,让 AI 按你的规则工作。'
: 'Control what AI can access with allowlists, data masking, and custom knowledge injection. Your rules, your data.'}
</p> </p>
</article> </article>
</div> </div>
@@ -451,10 +490,12 @@ export default function HomePage() {
className="text-4xl lg:text-5xl mb-6" className="text-4xl lg:text-5xl mb-6"
colors={{ first: '#3b82f6', second: '#8b5cf6' }} colors={{ first: '#3b82f6', second: '#8b5cf6' }}
> >
{t('home:use_cases.section_title')} {isZh ? '应用场景' : 'Where It Shines'}
</SparklesText> </SparklesText>
<p className="text-xl text-gray-600 dark:text-gray-300 max-w-3xl mx-auto"> <p className="text-xl text-gray-600 dark:text-gray-300 max-w-3xl mx-auto">
{t('home:use_cases.section_subtitle')} {isZh
? '从简单的表单填写到复杂的业务流程AI 都能理解并执行'
: 'From simple forms to complex workflows, AI understands and executes'}
</p> </p>
</div> </div>
@@ -468,10 +509,12 @@ export default function HomePage() {
<div> <div>
<h3 className="text-xl font-bold mb-2 text-gray-900 dark:text-white"> <h3 className="text-xl font-bold mb-2 text-gray-900 dark:text-white">
{t('home:use_cases.case1.title')} {isZh ? '对接答疑机器人' : 'Supercharge Support Bots'}
</h3> </h3>
<p className="text-gray-600 dark:text-gray-300"> <p className="text-gray-600 dark:text-gray-300">
{t('home:use_cases.case1.desc')} {isZh
? '把你的答疑助手变成全能Agent。客服机器人不再只说「请先点击设置按钮然后点击...」,而是直接帮用户现场操作。'
: 'Stop telling users where to click—let AI do it for them. Turn your chatbot from a guide into an operator that actually completes tasks.'}
</p> </p>
</div> </div>
</div> </div>
@@ -485,10 +528,12 @@ export default function HomePage() {
</div> </div>
<div> <div>
<h3 className="text-xl font-bold mb-2 text-gray-900 dark:text-white"> <h3 className="text-xl font-bold mb-2 text-gray-900 dark:text-white">
{t('home:use_cases.case2.title')} {isZh ? '交互升级/智能化改造' : 'Modernize Legacy Apps'}
</h3> </h3>
<p className="text-gray-600 dark:text-gray-300"> <p className="text-gray-600 dark:text-gray-300">
{t('home:use_cases.case2.desc')} {isZh
? '一行代码老应用变身Agent产品专家帮用户操作复杂 B 端软件。降低人工支持成本,提高用户满意度。'
: 'Add AI superpowers to old software without rebuilding. One script tag transforms complex enterprise tools into chat-driven interfaces.'}
</p> </p>
</div> </div>
</div> </div>
@@ -502,10 +547,12 @@ export default function HomePage() {
</div> </div>
<div> <div>
<h3 className="text-xl font-bold mb-2 text-gray-900 dark:text-white"> <h3 className="text-xl font-bold mb-2 text-gray-900 dark:text-white">
{t('home:use_cases.case3.title')} {isZh ? '产品教学' : 'Interactive Walkthroughs'}
</h3> </h3>
<p className="text-gray-600 dark:text-gray-300"> <p className="text-gray-600 dark:text-gray-300">
{t('home:use_cases.case3.desc')} {isZh
? '向用户演示交互过程边做边教。例如让AI演示「如何提交报销申请」的完整操作流程。'
: "Show, don't tell. Let AI demonstrate workflows in real-time—perfect for onboarding or training new users on complex systems."}
</p> </p>
</div> </div>
</div> </div>
@@ -519,10 +566,12 @@ export default function HomePage() {
</div> </div>
<div> <div>
<h3 className="text-xl font-bold mb-2 text-gray-900 dark:text-white"> <h3 className="text-xl font-bold mb-2 text-gray-900 dark:text-white">
{t('home:use_cases.case4.title')} {isZh ? '无障碍支持' : 'Accessibility First'}
</h3> </h3>
<p className="text-gray-600 dark:text-gray-300"> <p className="text-gray-600 dark:text-gray-300">
{t('home:use_cases.case4.desc')} {isZh
? '为视障用户、老年用户提供自然语言交互,对接屏幕阅读器或语音助理,让软件人人可用。'
: 'Make web apps accessible through natural language. Perfect for screen readers, voice control, or users who find traditional interfaces challenging.'}
</p> </p>
</div> </div>
</div> </div>

View File

@@ -4,21 +4,26 @@ import BetaNotice from '@/components/BetaNotice'
import CodeEditor from '@/components/CodeEditor' import CodeEditor from '@/components/CodeEditor'
export default function CustomTools() { export default function CustomTools() {
const { t } = useTranslation('docs') const { i18n } = useTranslation()
const isZh = i18n.language === 'zh-CN'
return ( return (
<div> <div>
<h1 className="text-4xl font-bold mb-6">{t('custom_tools.title')}</h1> <h1 className="text-4xl font-bold mb-6">{isZh ? '自定义工具' : 'Custom Tools'}</h1>
<p className="text-xl text-gray-600 dark:text-gray-300 mb-8 leading-relaxed"> <p className="text-xl text-gray-600 dark:text-gray-300 mb-8 leading-relaxed">
{t('custom_tools.subtitle')} {isZh
? '通过注册自定义工具,扩展 AI Agent 的能力边界。使用 Zod 定义严格的输入接口,让 AI 安全调用你的业务逻辑。'
: 'Extend AI Agent capabilities by registering custom tools. Use Zod to define strict input schemas for safe business logic calls.'}
</p> </p>
<div className="space-y-8"> <div className="space-y-8">
<section> <section>
<h2 className="text-2xl font-bold mb-4">{t('custom_tools.registration')}</h2> <h2 className="text-2xl font-bold mb-4">{isZh ? '工具注册' : 'Tool Registration'}</h2>
<p className="text-gray-600 dark:text-gray-300 mb-4"> <p className="text-gray-600 dark:text-gray-300 mb-4">
{t('custom_tools.registration_desc')} {isZh
? '每个自定义工具需要定义四个核心属性name、description、input schema 和 execute 函数。'
: 'Each custom tool requires four core properties: name, description, input schema, and execute function.'}
</p> </p>
<CodeEditor <CodeEditor
@@ -52,12 +57,14 @@ const pageAgent = new PageAgent({customTools})
</section> </section>
<section> <section>
<h2 className="text-2xl font-bold mb-4">{t('custom_tools.page_filter')}</h2> <h2 className="text-2xl font-bold mb-4">{isZh ? '页面过滤器' : 'Page Filter'}</h2>
<BetaNotice /> <BetaNotice />
<p className="text-gray-600 dark:text-gray-300 mb-4"> <p className="text-gray-600 dark:text-gray-300 mb-4">
{t('custom_tools.page_filter_desc')} {isZh
? '通过 pageFilter 属性控制工具在哪些页面可见,提升安全性和用户体验。'
: 'Control tool visibility on specific pages via the pageFilter property to enhance security and UX.'}
</p> </p>
<CodeEditor <CodeEditor
@@ -84,16 +91,28 @@ const pageAgent = new PageAgent({customTools})
</section> </section>
<section> <section>
<h2 className="text-2xl font-bold mb-4">{t('custom_tools.best_practices')}</h2> <h2 className="text-2xl font-bold mb-4">{isZh ? '最佳实践' : 'Best Practices'}</h2>
<div className="space-y-4"> <div className="space-y-4">
<div className="p-4 bg-yellow-50 dark:bg-yellow-900/20 rounded-lg"> <div className="p-4 bg-yellow-50 dark:bg-yellow-900/20 rounded-lg">
<h3 className="text-lg font-semibold text-yellow-900 dark:text-yellow-300 mb-2"> <h3 className="text-lg font-semibold text-yellow-900 dark:text-yellow-300 mb-2">
{t('custom_tools.bp_performance')} {isZh ? '⚡ 性能优化' : '⚡ Performance Optimization'}
</h3> </h3>
<ul className="text-gray-600 dark:text-gray-300 space-y-1 text-sm"> <ul className="text-gray-600 dark:text-gray-300 space-y-1 text-sm">
<li>{t('custom_tools.bp_1')}</li> <li>
<li>{t('custom_tools.bp_2')}</li> {isZh
<li>{t('custom_tools.bp_3')}</li> ? '• 使用 pageFilter 减少不必要的工具加载'
: '• Use pageFilter to reduce unnecessary tool loading'}
</li>
<li>
{isZh
? '• 在 execute 函数中实现适当的缓存机制'
: '• Implement appropriate caching in execute functions'}
</li>
<li>
{isZh
? '• 避免在工具中执行耗时的同步操作'
: '• Avoid long-running sync operations in tools'}
</li>
</ul> </ul>
</div> </div>
</div> </div>

View File

@@ -28,19 +28,26 @@ const MODELS = {
} }
export default function Models() { export default function Models() {
const { t } = useTranslation('docs') const { i18n } = useTranslation()
const isZh = i18n.language === 'zh-CN'
const allModels = [...MODELS.recommended, ...MODELS.verified] const allModels = [...MODELS.recommended, ...MODELS.verified]
return ( return (
<div className="max-w-4xl"> <div className="max-w-4xl">
<h1 className="text-4xl font-bold mb-4">{t('models.title')}</h1> <h1 className="text-4xl font-bold mb-4">{isZh ? '模型' : 'Models'}</h1>
<p className="text-lg text-gray-600 dark:text-gray-400 mb-8">{t('models.subtitle')}</p> <p className="text-lg text-gray-600 dark:text-gray-400 mb-8">
{isZh
? '当前支持符合 OpenAI 接口规范且支持 tool call 的模型,包括公有云服务和私有部署方案。'
: 'Supports models that comply with OpenAI API specification and support tool calls, including public cloud services and private deployments.'}
</p>
{/* Models Section */} {/* Models Section */}
<section className="mb-10"> <section className="mb-10">
<h2 className="text-2xl font-semibold mb-3">{t('models.available')}</h2> <h2 className="text-2xl font-semibold mb-3">{isZh ? '已测试模型' : 'Tested Models'}</h2>
<p className="text-sm text-gray-600 dark:text-gray-400 mb-4"> <p className="text-sm text-gray-600 dark:text-gray-400 mb-4">
{t('models.recommendation_logic')} {isZh
? '推荐使用 ToolCall 能力强的轻量级模型。'
: 'Recommended: Lightweight models with strong ToolCall capabilities.'}
</p> </p>
<div className="bg-linear-to-br from-emerald-50 to-cyan-50 dark:from-emerald-950/30 dark:to-cyan-950/30 rounded-xl p-6 border border-emerald-200/50 dark:border-emerald-800/50"> <div className="bg-linear-to-br from-emerald-50 to-cyan-50 dark:from-emerald-950/30 dark:to-cyan-950/30 rounded-xl p-6 border border-emerald-200/50 dark:border-emerald-800/50">
<div className="flex flex-wrap gap-2"> <div className="flex flex-wrap gap-2">
@@ -67,41 +74,59 @@ export default function Models() {
{/* Tips Section */} {/* Tips Section */}
<section className="mb-10"> <section className="mb-10">
<h2 className="text-2xl font-semibold mb-4">{t('models.tips')}</h2> <h2 className="text-2xl font-semibold mb-4">{isZh ? '提示' : 'Tips'}</h2>
<div className="p-4 bg-blue-50 dark:bg-blue-950/20 rounded-lg border border-blue-200 dark:border-blue-800"> <div className="p-4 bg-blue-50 dark:bg-blue-950/20 rounded-lg border border-blue-200 dark:border-blue-800">
<ul className="text-sm text-gray-700 dark:text-gray-300 space-y-2 list-disc pl-5"> <ul className="text-sm text-gray-700 dark:text-gray-300 space-y-2 list-disc pl-5">
<li>{t('models.tip_2')}</li> <li>
<li>{t('models.tip_3')}</li> {isZh
? 'ToolCall 能力较弱的模型可能返回错误的格式,常见错误能够自动恢复,建议设置较高的 temperature'
: 'Models with weaker ToolCall capabilities may return incorrect formats. Common errors usually auto-recover. Higher temperature recommended'}
</li>
<li>
{isZh
? '小模型或者无法适应复杂 Tool 定义的模型,通常效果不佳'
: 'Small models or those unable to handle complex tool definitions typically perform poorly'}
</li>
</ul> </ul>
</div> </div>
</section> </section>
{/* Security Section */} {/* Security Section */}
<section className="mb-10"> <section className="mb-10">
<h2 className="text-2xl font-semibold mb-4">{t('models.security')}</h2> <h2 className="text-2xl font-semibold mb-4">
{isZh ? '🔐 生产环境鉴权建议' : '🔐 Production Authentication'}
</h2>
<div className="bg-yellow-50 dark:bg-yellow-950/20 border-l-4 border-yellow-500 p-5 rounded-r-lg mb-4"> <div className="bg-yellow-50 dark:bg-yellow-950/20 border-l-4 border-yellow-500 p-5 rounded-r-lg mb-4">
<p className="text-sm font-semibold text-yellow-900 dark:text-yellow-200"> <p className="text-sm font-semibold text-yellow-900 dark:text-yellow-200">
{t('models.security_warning')} {isZh
? '⚠️ 永远不要把真实的 LLM API Key 发布到前端代码'
: '⚠️ Never commit real LLM API Keys to your frontend code'}
</p> </p>
</div> </div>
<div className="bg-gray-50 dark:bg-gray-900/30 rounded-lg p-5 border border-gray-200 dark:border-gray-800"> <div className="bg-gray-50 dark:bg-gray-900/30 rounded-lg p-5 border border-gray-200 dark:border-gray-800">
<h3 className="font-semibold text-gray-900 dark:text-gray-100 mb-2"> <h3 className="font-semibold text-gray-900 dark:text-gray-100 mb-2">
{t('models.security_backend_proxy')} {isZh ? '后端代理转发' : 'Backend Proxy Pattern'}
</h3> </h3>
<p className="text-sm text-gray-600 dark:text-gray-400 mb-3"> <p className="text-sm text-gray-600 dark:text-gray-400 mb-3">
{t('models.security_backend_desc')} {isZh
? '在后端搭建一个 LLM 流量转发接口,该接口使用与你网站上其他接口相同的鉴权方式,例如:'
: 'Set up a backend LLM proxy endpoint that uses the same authentication method as other APIs in your website, such as:'}
</p> </p>
<ul className="text-sm text-gray-600 dark:text-gray-400 space-y-1"> <ul className="text-sm text-gray-600 dark:text-gray-400 space-y-1">
<li>{t('models.security_method_1')}</li> <li>{isZh ? '• Session/Cookie 会话认证' : '• Session/Cookie-based authentication'}</li>
<li>{t('models.security_method_2')}</li> <li>
<li>{t('models.security_method_3')}</li> {isZh ? '• OIDC (OpenID Connect) 单点登录' : '• OIDC (OpenID Connect) single sign-on'}
</li>
<li>
{isZh ? '• 临时 Access Key 或 JWT Token' : '• Temporary Access Key or JWT Token'}
</li>
</ul> </ul>
</div> </div>
</section> </section>
{/* Configuration Section */} {/* Configuration Section */}
<section className="mb-10"> <section className="mb-10">
<h2 className="text-2xl font-semibold mb-4">{t('models.configuration')}</h2> <h2 className="text-2xl font-semibold mb-4">{isZh ? '配置方式' : 'Configuration'}</h2>
<CodeEditor <CodeEditor
code={`// OpenAI-compatible services (e.g., Alibaba Bailian) code={`// OpenAI-compatible services (e.g., Alibaba Bailian)
const pageAgent = new PageAgent({ const pageAgent = new PageAgent({

View File

@@ -1,13 +1,20 @@
import { useTranslation } from 'react-i18next'
import BetaNotice from '@/components/BetaNotice' import BetaNotice from '@/components/BetaNotice'
import CodeEditor from '@/components/CodeEditor' import CodeEditor from '@/components/CodeEditor'
export default function BestPractices() { export default function BestPractices() {
const { i18n } = useTranslation()
const isZh = i18n.language === 'zh-CN'
return ( return (
<div> <div>
<h1 className="text-4xl font-bold mb-6"></h1> <h1 className="text-4xl font-bold mb-6">{isZh ? '最佳实践' : 'Best Practices'}</h1>
<BetaNotice /> <BetaNotice />
<p className="text-xl text-gray-600 dark:text-gray-300 mb-6 leading-relaxed"> <p className="text-xl text-gray-600 dark:text-gray-300 mb-6 leading-relaxed">
使 page-agent {isZh
? '使用 page-agent 的最佳实践和常见问题解决方案。'
: 'Best practices and common solutions for using page-agent.'}
</p> </p>
<CodeEditor code={`// TODO`} /> <CodeEditor code={`// TODO`} />
</div> </div>

View File

@@ -1,21 +1,34 @@
import { useTranslation } from 'react-i18next'
import CodeEditor from '@/components/CodeEditor' import CodeEditor from '@/components/CodeEditor'
export default function ThirdPartyAgentPage() { export default function ThirdPartyAgentPage() {
const { i18n } = useTranslation()
const isZh = i18n.language === 'zh-CN'
return ( return (
<div> <div>
<h1 className="text-4xl font-bold mb-6"> Agent</h1> <h1 className="text-4xl font-bold mb-6">
{isZh ? '接入第三方 Agent' : 'Third-party Agent Integration'}
</h1>
<p className="mb-6 leading-relaxed text-gray-600 dark:text-gray-300"> <p className="mb-6 leading-relaxed text-gray-600 dark:text-gray-300">
pageAgent Agent Agent {isZh
? '将 pageAgent 作为工具接入你的答疑助手或 Agent 系统,成为你 Agent 的眼和手。'
: 'Integrate pageAgent as a tool in your support assistant or Agent system, becoming the eyes and hands of your Agent.'}
</p> </p>
<div className="bg-blue-50 dark:bg-blue-900/20 rounded-lg p-4 mb-6"> <div className="bg-blue-50 dark:bg-blue-900/20 rounded-lg p-4 mb-6">
<h3 className="text-lg font-semibold mb-2 text-blue-900 dark:text-blue-300">💡 </h3> <h3 className="text-lg font-semibold mb-2 text-blue-900 dark:text-blue-300">
{isZh ? '💡 核心价值' : '💡 Core Value'}
</h3>
<p className="text-blue-800 dark:text-blue-200"> <p className="text-blue-800 dark:text-blue-200">
"嘴巴""眼睛""手" {isZh
? '让你的答疑机器人不再只是"嘴巴",而是拥有"眼睛"和"手"的完整智能体。'
: 'Transform your support bot from just a "mouth" into a complete intelligent agent with "eyes" and "hands".'}
</p> </p>
</div> </div>
<h2 className="text-2xl font-bold mb-4"></h2> <h2 className="text-2xl font-bold mb-4">{isZh ? '集成方式' : 'Integration Method'}</h2>
<div className="space-y-4 mb-6"> <div className="space-y-4 mb-6">
<div className="p-4 bg-green-50 dark:bg-green-900/20 rounded-lg"> <div className="p-4 bg-green-50 dark:bg-green-900/20 rounded-lg">
@@ -23,14 +36,14 @@ export default function ThirdPartyAgentPage() {
1. Function Calling 1. Function Calling
</h3> </h3>
<CodeEditor <CodeEditor
code={`// 定义工具 code={`// ${isZh ? '定义工具' : 'Define tool'}
const pageAgentTool = { const pageAgentTool = {
name: "page_agent", name: "page_agent",
description: "执行网页操作", description: "${isZh ? '执行网页操作' : 'Execute web page operations'}",
parameters: { parameters: {
type: "object", type: "object",
properties: { properties: {
instruction: { type: "string", description: "操作指令" } instruction: { type: "string", description: "${isZh ? '操作指令' : 'Operation instruction'}" }
}, },
required: ["instruction"] required: ["instruction"]
}, },
@@ -40,48 +53,74 @@ const pageAgentTool = {
} }
} }
// 注册到你的 agent 中`} // ${isZh ? '注册到你的 agent 中' : 'Register to your agent'}`}
language="javascript" language="javascript"
/> />
</div> </div>
</div> </div>
<h2 className="text-2xl font-bold mb-4"></h2> <h2 className="text-2xl font-bold mb-4">{isZh ? '应用场景' : 'Use Cases'}</h2>
<div className="grid md:grid-cols-2 gap-4 mb-6"> <div className="grid md:grid-cols-2 gap-4 mb-6">
<div className="bg-linear-to-br from-blue-50 to-purple-50 dark:from-gray-800 dark:to-gray-700 p-4 rounded-lg"> <div className="bg-linear-to-br from-blue-50 to-purple-50 dark:from-gray-800 dark:to-gray-700 p-4 rounded-lg">
<h4 className="font-semibold mb-2 text-gray-900 dark:text-white">🤖 </h4> <h4 className="font-semibold mb-2 text-gray-900 dark:text-white">
{isZh ? '🤖 智能客服系统' : '🤖 Smart Customer Service'}
</h4>
<p className="text-sm text-gray-600 dark:text-gray-300"> <p className="text-sm text-gray-600 dark:text-gray-300">
"帮我提交工单" {isZh
? '客服机器人帮用户直接操作系统,如"帮我提交工单"'
: 'Support bots directly operate systems for users, e.g., "Help me submit a ticket"'}
</p> </p>
</div> </div>
<div className="bg-linear-to-br from-green-50 to-blue-50 dark:from-gray-800 dark:to-gray-700 p-4 rounded-lg"> <div className="bg-linear-to-br from-green-50 to-blue-50 dark:from-gray-800 dark:to-gray-700 p-4 rounded-lg">
<h4 className="font-semibold mb-2 text-gray-900 dark:text-white">📋 </h4> <h4 className="font-semibold mb-2 text-gray-900 dark:text-white">
{isZh ? '📋 业务流程助手' : '📋 Business Process Assistant'}
</h4>
<p className="text-sm text-gray-600 dark:text-gray-300"> <p className="text-sm text-gray-600 dark:text-gray-300">
"完成客户入职" {isZh
? '引导新员工完成复杂流程,如"完成客户入职"'
: 'Guide new employees through complex processes, e.g., "Complete customer onboarding"'}
</p> </p>
</div> </div>
<div className="bg-linear-to-br from-purple-50 to-pink-50 dark:from-gray-800 dark:to-gray-700 p-4 rounded-lg"> <div className="bg-linear-to-br from-purple-50 to-pink-50 dark:from-gray-800 dark:to-gray-700 p-4 rounded-lg">
<h4 className="font-semibold mb-2 text-gray-900 dark:text-white">🎯 </h4> <h4 className="font-semibold mb-2 text-gray-900 dark:text-white">
{isZh ? '🎯 个人效率助手' : '🎯 Personal Productivity Assistant'}
</h4>
<p className="text-sm text-gray-600 dark:text-gray-300"> <p className="text-sm text-gray-600 dark:text-gray-300">
"预订会议室" {isZh
? '跨网站帮你完成任务,如"预订会议室"'
: 'Complete tasks across websites, e.g., "Book a meeting room"'}
</p> </p>
</div> </div>
<div className="bg-linear-to-br from-orange-50 to-red-50 dark:from-gray-800 dark:to-gray-700 p-4 rounded-lg"> <div className="bg-linear-to-br from-orange-50 to-red-50 dark:from-gray-800 dark:to-gray-700 p-4 rounded-lg">
<h4 className="font-semibold mb-2 text-gray-900 dark:text-white">🔧 </h4> <h4 className="font-semibold mb-2 text-gray-900 dark:text-white">
{isZh ? '🔧 运维自动化' : '🔧 DevOps Automation'}
</h4>
<p className="text-sm text-gray-600 dark:text-gray-300"> <p className="text-sm text-gray-600 dark:text-gray-300">
"重启服务器" {isZh
? '通过自然语言操作管理后台,如"重启服务器"'
: 'Operate admin panels via natural language, e.g., "Restart server"'}
</p> </p>
</div> </div>
</div> </div>
<div className="bg-yellow-50 dark:bg-yellow-900/20 border border-yellow-200 dark:border-yellow-800 rounded-lg p-4 mb-6"> <div className="bg-yellow-50 dark:bg-yellow-900/20 border border-yellow-200 dark:border-yellow-800 rounded-lg p-4 mb-6">
<h3 className="text-lg font-semibold text-yellow-900 dark:text-yellow-100 mb-2"> <h3 className="text-lg font-semibold text-yellow-900 dark:text-yellow-100 mb-2">
{isZh ? '⚠️ 注意事项' : '⚠️ Notes'}
</h3> </h3>
<ul className="text-yellow-800 dark:text-yellow-200 space-y-1 text-sm"> <ul className="text-yellow-800 dark:text-yellow-200 space-y-1 text-sm">
<li> </li> <li>
<li> </li> {' '}
<li> </li> {isZh
? '确保目标网站允许自动化操作'
: 'Ensure target website allows automated operations'}
</li>
<li> {isZh ? '实现适当的频率限制' : 'Implement appropriate rate limiting'}</li>
<li>
{' '}
{isZh
? '敏感操作建议要求人工确认'
: 'Recommend human confirmation for sensitive operations'}
</li>
</ul> </ul>
</div> </div>
</div> </div>

View File

@@ -1,141 +1,194 @@
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
export default function LimitationsPage() { export default function LimitationsPage() {
const { t } = useTranslation('docs') const { i18n } = useTranslation()
const isZh = i18n.language === 'zh-CN'
return ( return (
<div className="max-w-4xl mx-auto"> <div className="max-w-4xl mx-auto">
<div className="mb-8"> <div className="mb-8">
<h1 className="text-4xl font-bold mb-4 text-gray-900 dark:text-white"> <h1 className="text-4xl font-bold mb-4 text-gray-900 dark:text-white">
{t('limitations.title')} {isZh ? '使用限制' : 'Limitations'}
</h1> </h1>
<p className="text-xl text-gray-600 dark:text-gray-300">{t('limitations.subtitle')}</p> <p className="text-xl text-gray-600 dark:text-gray-300">
{isZh
? '了解 page-agent 当前的功能边界和技术限制'
: "Understand page-agent's current capabilities and technical constraints"}
</p>
</div> </div>
<div className="prose prose-lg dark:prose-invert max-w-none"> <div className="prose prose-lg dark:prose-invert max-w-none">
<h2 className="text-2xl font-bold mb-3">{t('limitations.page_support')}</h2> <h2 className="text-2xl font-bold mb-3">
{isZh ? '页面支持限制' : 'Page Support Limitations'}
</h2>
<div className="bg-blue-50 dark:bg-blue-900/20 border-l-4 border-blue-400 p-4 mb-6"> <div className="bg-blue-50 dark:bg-blue-900/20 border-l-4 border-blue-400 p-4 mb-6">
<h3 className="font-semibold text-blue-800 dark:text-blue-200 mb-2"> <h3 className="font-semibold text-blue-800 dark:text-blue-200 mb-2">
{t('limitations.spa_limit_title')} {isZh ? '单页应用限制' : 'Single Page Application Limits'}
</h3> </h3>
<ul className="text-blue-700 dark:text-blue-300 space-y-2"> <ul className="text-blue-700 dark:text-blue-300 space-y-2">
<li>{t('limitations.spa_limit_1')}</li> <li>
<li>{t('limitations.spa_limit_2')}</li> {isZh
<li>{t('limitations.spa_limit_3')}</li> ? '• 仅支持单页应用SPA目前只能在单个页面内进行操作'
: '• SPA only: Currently operates within a single page'}
</li>
<li>
{isZh
? '• 多页接力功能正在设计中:暂时无法跨页面执行连续任务'
: '• Multi-page relay in design: Cannot execute continuous tasks across pages yet'}
</li>
<li>
{isZh
? '• 无法操作未接入该能力的网站:需要目标网站主动集成 page-agent'
: '• Requires integration: Cannot operate on sites without page-agent'}
</li>
</ul> </ul>
</div> </div>
<h2 className="text-2xl font-bold mb-3">{t('limitations.interaction_limits')}</h2> <h2 className="text-2xl font-bold mb-3">
{isZh ? '交互行为限制' : 'Interaction Limitations'}
</h2>
<div className="bg-gray-50 dark:bg-gray-800 rounded-lg p-6 mb-6"> <div className="bg-gray-50 dark:bg-gray-800 rounded-lg p-6 mb-6">
<h3 className="font-semibold mb-4">{t('limitations.supported_ops')}</h3> <h3 className="font-semibold mb-4">{isZh ? '支持的操作' : 'Supported Operations'}</h3>
<div className="grid md:grid-cols-2 gap-4 mb-6"> <div className="grid md:grid-cols-2 gap-4 mb-6">
<div className="space-y-2"> <div className="space-y-2">
<div className="flex items-center text-green-600 dark:text-green-400"> <div className="flex items-center text-green-600 dark:text-green-400">
<span className="mr-2"></span> <span className="mr-2"></span>
<span>{t('limitations.op_click')}</span> <span>{isZh ? '点击操作' : 'Click'}</span>
</div> </div>
<div className="flex items-center text-green-600 dark:text-green-400"> <div className="flex items-center text-green-600 dark:text-green-400">
<span className="mr-2"></span> <span className="mr-2"></span>
<span>{t('limitations.op_input')}</span> <span>{isZh ? '文本输入' : 'Text input'}</span>
</div> </div>
<div className="flex items-center text-green-600 dark:text-green-400"> <div className="flex items-center text-green-600 dark:text-green-400">
<span className="mr-2"></span> <span className="mr-2"></span>
<span>{t('limitations.op_scroll')}</span> <span>{isZh ? '页面滚动' : 'Scroll'}</span>
</div> </div>
<div className="flex items-center text-green-600 dark:text-green-400"> <div className="flex items-center text-green-600 dark:text-green-400">
<span className="mr-2"></span> <span className="mr-2"></span>
<span>{t('limitations.op_submit')}</span> <span>{isZh ? '表单提交' : 'Form submit'}</span>
</div> </div>
</div> </div>
<div className="space-y-2"> <div className="space-y-2">
<div className="flex items-center text-green-600 dark:text-green-400"> <div className="flex items-center text-green-600 dark:text-green-400">
<span className="mr-2"></span> <span className="mr-2"></span>
<span>{t('limitations.op_select')}</span> <span>{isZh ? '选择操作' : 'Select'}</span>
</div> </div>
<div className="flex items-center text-green-600 dark:text-green-400"> <div className="flex items-center text-green-600 dark:text-green-400">
<span className="mr-2"></span> <span className="mr-2"></span>
<span>{t('limitations.op_focus')}</span> <span>{isZh ? '焦点切换' : 'Focus'}</span>
</div> </div>
</div> </div>
</div> </div>
<h3 className="font-semibold mb-4">{t('limitations.unsupported_ops')}</h3> <h3 className="font-semibold mb-4">{isZh ? '不支持的操作' : 'Unsupported Operations'}</h3>
<div className="grid md:grid-cols-2 gap-4"> <div className="grid md:grid-cols-2 gap-4">
<div className="space-y-2"> <div className="space-y-2">
<div className="flex items-center text-red-600 dark:text-red-400"> <div className="flex items-center text-red-600 dark:text-red-400">
<span className="mr-2"></span> <span className="mr-2"></span>
<span>{t('limitations.op_hover')}</span> <span>{isZh ? '鼠标悬停hover' : 'Mouse hover'}</span>
</div> </div>
<div className="flex items-center text-red-600 dark:text-red-400"> <div className="flex items-center text-red-600 dark:text-red-400">
<span className="mr-2"></span> <span className="mr-2"></span>
<span>{t('limitations.op_drag')}</span> <span>{isZh ? '拖拽操作' : 'Drag & drop'}</span>
</div> </div>
<div className="flex items-center text-red-600 dark:text-red-400"> <div className="flex items-center text-red-600 dark:text-red-400">
<span className="mr-2"></span> <span className="mr-2"></span>
<span>{t('limitations.op_context')}</span> <span>{isZh ? '右键菜单' : 'Right-click menu'}</span>
</div> </div>
</div> </div>
<div className="space-y-2"> <div className="space-y-2">
<div className="flex items-center text-red-600 dark:text-red-400"> <div className="flex items-center text-red-600 dark:text-red-400">
<span className="mr-2"></span> <span className="mr-2"></span>
<span>{t('limitations.op_draw')}</span> <span>{isZh ? '图形绘制' : 'Drawing'}</span>
</div> </div>
<div className="flex items-center text-red-600 dark:text-red-400"> <div className="flex items-center text-red-600 dark:text-red-400">
<span className="mr-2"></span> <span className="mr-2"></span>
<span>{t('limitations.op_keyboard')}</span> <span>{isZh ? '键盘快捷键' : 'Keyboard shortcuts'}</span>
</div> </div>
<div className="flex items-center text-red-600 dark:text-red-400"> <div className="flex items-center text-red-600 dark:text-red-400">
<span className="mr-2"></span> <span className="mr-2"></span>
<span>{t('limitations.op_position')}</span> <span>{isZh ? '基于点击区域或鼠标位置的控制' : 'Position-based control'}</span>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<h2 className="text-2xl font-bold mb-3">{t('limitations.understanding_limits')}</h2> <h2 className="text-2xl font-bold mb-3">
{isZh ? '网页理解限制' : 'Understanding Limitations'}
</h2>
<div className="bg-red-50 dark:bg-red-900/20 border-l-4 border-red-400 p-4 mb-6"> <div className="bg-red-50 dark:bg-red-900/20 border-l-4 border-red-400 p-4 mb-6">
<h3 className="font-semibold text-red-800 dark:text-red-200 mb-2"> <h3 className="font-semibold text-red-800 dark:text-red-200 mb-2">
{t('limitations.no_vision_title')} {isZh ? '无视觉能力' : 'No Visual Recognition'}
</h3> </h3>
<p className="text-red-700 dark:text-red-300 mb-3">{t('limitations.no_vision_desc')}</p> <p className="text-red-700 dark:text-red-300 mb-3">
{isZh
? 'page-agent 基于 DOM 结构进行理解和操作,没有视觉识别能力,无法理解以下内容:'
: 'page-agent operates based on DOM structure with no visual recognition. Cannot understand:'}
</p>
<ul className="text-red-700 dark:text-red-300 space-y-1"> <ul className="text-red-700 dark:text-red-300 space-y-1">
<li>{t('limitations.no_vision_1')}</li> <li>
<li>{t('limitations.no_vision_2')}</li> {isZh
<li>{t('limitations.no_vision_3')}</li> ? '• 图片内容:无法识别图片中的文字、图标或视觉元素'
<li>{t('limitations.no_vision_4')}</li> : '• Image content: Cannot recognize text, icons, or visual elements in images'}
</li>
<li>
{isZh
? '• Canvas 画布:无法理解 Canvas 中绘制的图形和内容'
: '• Canvas: Cannot understand graphics drawn on Canvas'}
</li>
<li>
{isZh
? '• WebGL 3D 内容:无法操作 3D 场景中的元素'
: '• WebGL 3D: Cannot operate elements in 3D scenes'}
</li>
<li>
{isZh
? '• SVG 图形:无法理解 SVG 中的视觉内容和路径'
: '• SVG graphics: Cannot understand visual content and paths in SVG'}
</li>
</ul> </ul>
</div> </div>
<h2 className="text-2xl font-bold mb-3">{t('limitations.website_requirements')}</h2> <h2 className="text-2xl font-bold mb-3">
{isZh ? '被操作网站要求' : 'Website Requirements'}
</h2>
<div className="bg-gray-50 dark:bg-gray-800 rounded-lg p-6 mb-6"> <div className="bg-gray-50 dark:bg-gray-800 rounded-lg p-6 mb-6">
<div className="space-y-4"> <div className="space-y-4">
<div> <div>
<h3 className="font-semibold mb-2">{t('limitations.req_semantic_title')}</h3> <h3 className="font-semibold mb-2">
{isZh ? '语义化和易用性' : 'Semantic & Usability'}
</h3>
<p className="text-gray-600 dark:text-gray-300"> <p className="text-gray-600 dark:text-gray-300">
{t('limitations.req_semantic_desc')} {isZh
? '所有操作都基于 DOM 元素的语义化标签和属性。如果页面结构不够语义化,或者没有任何 accessibility 特性,可能影响 AI 的理解准确性。'
: 'All operations rely on semantic tags and attributes. Poor semantic structure or lack of accessibility features may affect AI understanding accuracy.'}
</p> </p>
</div> </div>
<div> <div>
<h3 className="font-semibold mb-2">{t('limitations.req_ux_title')}</h3> <h3 className="font-semibold mb-2">{isZh ? 'UI/UX' : 'UI/UX'}</h3>
<p className="text-gray-600 dark:text-gray-300">{t('limitations.req_ux_desc')}</p> <p className="text-gray-600 dark:text-gray-300">
{isZh
? '反常识的交互规则、基于视觉的操作提示、复杂的鼠标交互、快速出现快速消失的元素等,都会影响 AI 的理解和操作。'
: 'Counter-intuitive interaction rules, visual-only operation hints, complex mouse interactions, or rapidly appearing/disappearing elements can affect AI understanding and operation.'}
</p>
</div> </div>
<div> <div>
<h3 className="font-semibold mb-2">{t('limitations.req_env_title')}</h3> <h3 className="font-semibold mb-2">{isZh ? '环境要求' : 'Environment'}</h3>
<p className="text-gray-600 dark:text-gray-300">{t('limitations.req_env_desc')}</p> <p className="text-gray-600 dark:text-gray-300">modern browser</p>
</div> </div>
</div> </div>
</div> </div>
<h2>{t('limitations.future')}</h2> <h2>{isZh ? '未来规划' : 'Future Plans'}</h2>
<div className="bg-green-50 dark:bg-green-900/20 border-l-4 border-green-400 p-4"> <div className="bg-green-50 dark:bg-green-900/20 border-l-4 border-green-400 p-4">
<h3 className="font-semibold text-green-800 dark:text-green-200 mb-2"> <h3 className="font-semibold text-green-800 dark:text-green-200 mb-2">
{t('limitations.future_title')} {isZh ? '即将支持' : 'Coming Soon'}
</h3> </h3>
<ul className="text-green-700 dark:text-green-300 space-y-1"> <ul className="text-green-700 dark:text-green-300 space-y-1">
<li>{t('limitations.future_1')}</li> <li>{isZh ? '• 多页面接力操作能力' : '• Multi-page relay capabilities'}</li>
<li>{t('limitations.future_2')}</li> <li>{isZh ? '• 更丰富的鼠标交互支持' : '• Richer mouse interaction support'}</li>
<li>{t('limitations.future_3')}</li> <li>{isZh ? '• 基础的视觉理解能力' : '• Basic visual understanding'}</li>
<li>{t('limitations.future_4')}</li> <li>{isZh ? '• 更智能的错误恢复机制' : '• Smarter error recovery'}</li>
</ul> </ul>
</div> </div>
</div> </div>

View File

@@ -1,23 +1,17 @@
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
export default function Overview() { export default function Overview() {
const { t } = useTranslation('docs') const { i18n } = useTranslation()
const isZh = i18n.language === 'zh-CN'
return ( return (
<article> <article>
{/* 头图 */}
{/* <figure className="mb-8 rounded-xl overflow-hidden">
<img
src="https://img.alicdn.com/imgextra/i3/O1CN014xLeic1gnF2iWdzjJ_!!6000000004186-49-tps-1280-353.webp"
alt="page-agent"
className="w-full h-64 object-cover"
/>
</figure> */}
<div className="mb-8"> <div className="mb-8">
<h1 className="text-4xl font-bold mb-4">{t('overview.title')}</h1> <h1 className="text-4xl font-bold mb-4">Overview</h1>
<p className="text-xl text-gray-600 dark:text-gray-300 mb-4 leading-relaxed"> <p className="text-xl text-gray-600 dark:text-gray-300 mb-4 leading-relaxed">
{t('overview.subtitle')} {isZh
? 'page-agent 是一个完全基于 Web 技术的 GUI Agent简单几步让你的网站拥有 AI 操作员。'
: 'page-agent is a purely web-based GUI Agent. Gives your website an AI operator in simple steps.'}
</p> </p>
{/* Status Badges */} {/* Status Badges */}
@@ -55,56 +49,76 @@ export default function Overview() {
</div> </div>
<section> <section>
<h2 className="text-2xl font-bold mb-4">{t('overview.what_is')}</h2> <h2 className="text-2xl font-bold mb-4">
{isZh ? '什么是 page-agent' : 'What is page-agent?'}
</h2>
<p className="text-gray-600 dark:text-gray-300 mb-8 leading-relaxed "> <p className="text-gray-600 dark:text-gray-300 mb-8 leading-relaxed ">
{t('overview.what_is_desc')} {isZh
? 'page-agent 是一个页面内嵌式 GUI Agent。与传统的浏览器自动化工具不同page-agent 面向网站开发者而非爬虫或Agent客户端开发者将 Agent 集成到你的网站中,让用户可以通过自然语言与页面进行交互。'
: 'page-agent is an embedded GUI Agent. Unlike traditional browser automation tools, page-agent is built for web developers and web applications first. Integrate it into your site to let users interact with pages through natural language.'}
</p> </p>
</section> </section>
<section> <section>
<h2 className="text-2xl font-bold mb-3">{t('overview.features_title')}</h2> <h2 className="text-2xl font-bold mb-3">{isZh ? '核心特性' : 'Core Features'}</h2>
<div className="grid md:grid-cols-2 gap-4 mb-8" role="list"> <div className="grid md:grid-cols-2 gap-4 mb-8" role="list">
<div className="p-4 bg-blue-50 dark:bg-blue-900/20 rounded-lg"> <div className="p-4 bg-blue-50 dark:bg-blue-900/20 rounded-lg">
<h3 className="text-lg font-semibold mb-2 text-blue-900 dark:text-blue-300"> <h3 className="text-lg font-semibold mb-2 text-blue-900 dark:text-blue-300">
{t('overview.feature_dom.title')} {isZh ? '🧠 智能 DOM 理解' : '🧠 Smart DOM Analysis'}
</h3> </h3>
<p className="text-gray-700 dark:text-gray-300">{t('overview.feature_dom.desc')}</p> <p className="text-gray-700 dark:text-gray-300">
{isZh
? '基于 DOM 分析,高强度脱水。无需视觉识别,纯文本实现精准操作。'
: 'DOM-based analysis with high-intensity dehydration. No visual recognition needed. Pure text for fast and precise operations.'}
</p>
</div> </div>
<div className="p-4 bg-purple-50 dark:bg-purple-900/20 rounded-lg"> <div className="p-4 bg-purple-50 dark:bg-purple-900/20 rounded-lg">
<h3 className="text-lg font-semibold mb-2 text-purple-900 dark:text-purple-300"> <h3 className="text-lg font-semibold mb-2 text-purple-900 dark:text-purple-300">
{t('overview.feature_secure.title')} {isZh ? '🔒 安全可控' : '🔒 Secure & Controllable'}
</h3> </h3>
<p className="text-gray-700 dark:text-gray-300">{t('overview.feature_secure.desc')}</p> <p className="text-gray-700 dark:text-gray-300">
{isZh
? '支持操作黑白名单、数据脱敏保护。注入自定义知识库,让 AI 按你的规则工作。'
: 'Supports operation allowlists, data masking protection. Inject custom knowledge to make AI work by your rules.'}
</p>
</div> </div>
<div className="p-4 bg-green-50 dark:bg-green-900/20 rounded-lg"> <div className="p-4 bg-green-50 dark:bg-green-900/20 rounded-lg">
<h3 className="text-lg font-semibold mb-2 text-green-900 dark:text-green-300"> <h3 className="text-lg font-semibold mb-2 text-green-900 dark:text-green-300">
{t('overview.feature_backend.title')} {isZh ? '⚡ 零后端部署' : '⚡ Zero Backend'}
</h3> </h3>
<p className="text-gray-700 dark:text-gray-300">{t('overview.feature_backend.desc')}</p> <p className="text-gray-700 dark:text-gray-300">
{isZh
? 'CDN 或 NPM 引入,自定义 LLM 接入点。'
: 'CDN or NPM import with custom LLM endpoints.'}
</p>
</div> </div>
<div className="p-4 bg-orange-50 dark:bg-orange-900/20 rounded-lg"> <div className="p-4 bg-orange-50 dark:bg-orange-900/20 rounded-lg">
<h3 className="text-lg font-semibold mb-2 text-orange-900 dark:text-orange-300"> <h3 className="text-lg font-semibold mb-2 text-orange-900 dark:text-orange-300">
{t('overview.feature_accessible.title')} {isZh ? '♿ 普惠智能' : '♿ Accessible Intelligence'}
</h3> </h3>
<p className="text-gray-700 dark:text-gray-300"> <p className="text-gray-700 dark:text-gray-300">
{t('overview.feature_accessible.desc')} {isZh
? '为复杂 B端系统、管理后台提供自然语言入口。让每个用户都能轻松上手。'
: 'Provides natural language interface for complex B2B systems and admin panels. Makes software easy for everyone.'}
</p> </p>
</div> </div>
</div> </div>
<h2 className="text-2xl font-bold mb-4">{t('overview.vs_browser_use')}</h2> <h2 className="text-2xl font-bold mb-4">
{isZh ? '与 browser-use 的区别' : 'vs. browser-use'}
</h2>
<div className="overflow-x-auto mb-8"> <div className="overflow-x-auto mb-8">
<table className="w-full border-collapse border border-gray-300 dark:border-gray-600"> <table className="w-full border-collapse border border-gray-300 dark:border-gray-600">
<thead> <thead>
<tr className="bg-gray-50 dark:bg-gray-800"> <tr className="bg-gray-50 dark:bg-gray-800">
<th className="border border-gray-300 dark:border-gray-600 px-4 py-3 text-left"> <th className="border border-gray-300 dark:border-gray-600 px-4 py-3 text-left">
{t('overview.table_feature')} {isZh ? '特性' : 'Feature'}
</th> </th>
<th className="border border-gray-300 dark:border-gray-600 px-4 py-3 text-left"> <th className="border border-gray-300 dark:border-gray-600 px-4 py-3 text-left">
page-agent page-agent
@@ -117,53 +131,53 @@ export default function Overview() {
<tbody> <tbody>
<tr> <tr>
<td className="border border-gray-300 dark:border-gray-600 px-4 py-3 font-medium"> <td className="border border-gray-300 dark:border-gray-600 px-4 py-3 font-medium">
{t('overview.table_deployment')} {isZh ? '部署方式' : 'Deployment'}
</td> </td>
<td className="border border-gray-300 dark:border-gray-600 px-4 py-3"> <td className="border border-gray-300 dark:border-gray-600 px-4 py-3">
{t('overview.table_deployment_pa')} {isZh ? '页面内嵌组件' : 'Embedded component'}
</td> </td>
<td className="border border-gray-300 dark:border-gray-600 px-4 py-3"> <td className="border border-gray-300 dark:border-gray-600 px-4 py-3">
{t('overview.table_deployment_bu')} {isZh ? '外部工具' : 'External tool'}
</td> </td>
</tr> </tr>
<tr> <tr>
<td className="border border-gray-300 dark:border-gray-600 px-4 py-3 font-medium"> <td className="border border-gray-300 dark:border-gray-600 px-4 py-3 font-medium">
{t('overview.table_scope')} {isZh ? '操作范围' : 'Scope'}
</td> </td>
<td className="border border-gray-300 dark:border-gray-600 px-4 py-3"> <td className="border border-gray-300 dark:border-gray-600 px-4 py-3">
{t('overview.table_scope_pa')} {isZh ? '当前页面' : 'Current page'}
</td> </td>
<td className="border border-gray-300 dark:border-gray-600 px-4 py-3"> <td className="border border-gray-300 dark:border-gray-600 px-4 py-3">
{t('overview.table_scope_bu')} {isZh ? '整个浏览器' : 'Entire browser'}
</td> </td>
</tr> </tr>
<tr> <tr>
<td className="border border-gray-300 dark:border-gray-600 px-4 py-3 font-medium"> <td className="border border-gray-300 dark:border-gray-600 px-4 py-3 font-medium">
{t('overview.table_user')} {isZh ? '目标用户' : 'Target Users'}
</td> </td>
<td className="border border-gray-300 dark:border-gray-600 px-4 py-3"> <td className="border border-gray-300 dark:border-gray-600 px-4 py-3">
{t('overview.table_user_pa')} {isZh ? '网站开发者' : 'Web developers'}
</td> </td>
<td className="border border-gray-300 dark:border-gray-600 px-4 py-3"> <td className="border border-gray-300 dark:border-gray-600 px-4 py-3">
{t('overview.table_user_bu')} {isZh ? '爬虫/Agent 开发者' : 'Scraper/Agent developers'}
</td> </td>
</tr> </tr>
<tr> <tr>
<td className="border border-gray-300 dark:border-gray-600 px-4 py-3 font-medium"> <td className="border border-gray-300 dark:border-gray-600 px-4 py-3 font-medium">
{t('overview.table_scenario')} {isZh ? '使用场景' : 'Use Case'}
</td> </td>
<td className="border border-gray-300 dark:border-gray-600 px-4 py-3"> <td className="border border-gray-300 dark:border-gray-600 px-4 py-3">
{t('overview.table_scenario_pa')} {isZh ? '用户体验增强' : 'UX enhancement'}
</td> </td>
<td className="border border-gray-300 dark:border-gray-600 px-4 py-3"> <td className="border border-gray-300 dark:border-gray-600 px-4 py-3">
{t('overview.table_scenario_bu')} {isZh ? '自动化任务' : 'Automation tasks'}
</td> </td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
</div> </div>
<h2 className="text-2xl font-bold mb-4">{t('overview.use_cases_title')}</h2> <h2 className="text-2xl font-bold mb-4">{isZh ? '应用场景' : 'Use Cases'}</h2>
<ul className="space-y-4 mb-8"> <ul className="space-y-4 mb-8">
<li className="flex items-start space-x-3"> <li className="flex items-start space-x-3">
@@ -171,7 +185,10 @@ export default function Overview() {
1 1
</span> </span>
<div className="text-gray-700 dark:text-gray-300"> <div className="text-gray-700 dark:text-gray-300">
<strong>{t('overview.use_case1_title')}</strong> {t('overview.use_case1_desc')} <strong>{isZh ? '对接答疑机器人:' : 'Connect Support Bots:'}</strong>{' '}
{isZh
? '把你的答疑助手变成全能Agent。客服机器人不再只说「请先点击设置按钮然后点击...」,而是直接帮用户现场操作。'
: "Turn your support assistant into a full agent. Customer service bots no longer just say 'Please click the settings button then click...'—they operate for users directly."}
</div> </div>
</li> </li>
<li className="flex items-start space-x-3"> <li className="flex items-start space-x-3">
@@ -179,7 +196,10 @@ export default function Overview() {
2 2
</span> </span>
<div className="text-gray-700 dark:text-gray-300"> <div className="text-gray-700 dark:text-gray-300">
<strong>{t('overview.use_case2_title')}</strong> {t('overview.use_case2_desc')} <strong>{isZh ? '交互升级/智能化改造:' : 'Modernize Legacy Apps:'}</strong>{' '}
{isZh
? '一行代码老应用变身Agent产品专家帮用户操作复杂 B 端软件。降低人工支持成本,提高用户满意度。'
: 'One line of code transforms old apps into agents. Product experts help users navigate complex B2B software. Reduce support costs and improve satisfaction.'}
</div> </div>
</li> </li>
<li className="flex items-start space-x-3"> <li className="flex items-start space-x-3">
@@ -187,7 +207,10 @@ export default function Overview() {
3 3
</span> </span>
<div className="text-gray-700 dark:text-gray-300"> <div className="text-gray-700 dark:text-gray-300">
<strong>{t('overview.use_case3_title')}</strong> {t('overview.use_case3_desc')} <strong>{isZh ? '产品教学:' : 'Interactive Training:'}</strong>{' '}
{isZh
? '向用户演示交互过程边做边教。例如让AI演示「如何提交报销申请」的完整操作流程。'
: "Demonstrate workflows in real-time. Let AI show the complete process of 'how to submit an expense report.'"}
</div> </div>
</li> </li>
<li className="flex items-start space-x-3"> <li className="flex items-start space-x-3">
@@ -195,7 +218,10 @@ export default function Overview() {
4 4
</span> </span>
<div className="text-gray-700 dark:text-gray-300"> <div className="text-gray-700 dark:text-gray-300">
<strong>{t('overview.use_case4_title')}</strong> {t('overview.use_case4_desc')} <strong>{isZh ? '无障碍支持:' : 'Accessibility:'}</strong>{' '}
{isZh
? '为视障用户、老年用户提供自然语言交互,对接屏幕阅读器或语音助理,让软件人人可用。'
: 'Provide natural language interaction for visually impaired and elderly users. Connect screen readers or voice assistants to make software accessible to everyone.'}
</div> </div>
</li> </li>
</ul> </ul>

View File

@@ -4,16 +4,18 @@ import CodeEditor from '@/components/CodeEditor'
import { CDN_DEMO_CN_URL, CDN_DEMO_URL } from '@/constants' import { CDN_DEMO_CN_URL, CDN_DEMO_URL } from '@/constants'
export default function QuickStart() { export default function QuickStart() {
const { t, i18n } = useTranslation('docs') const { i18n } = useTranslation()
const isZh = i18n.language === 'zh-CN' const isZh = i18n.language === 'zh-CN'
return ( return (
<div> <div>
<h1 className="text-4xl font-bold mb-6">{t('quick_start.title')}</h1> <h1 className="text-4xl font-bold mb-6">Quick Start</h1>
<p className=" mb-6 leading-relaxed">{t('quick_start.subtitle')}</p> <p className=" mb-6 leading-relaxed">
{isZh ? '几分钟内完成 page-agent 的集成。' : 'Integrate page-agent in minutes.'}
</p>
<h2 className="text-2xl font-bold mb-3">{t('quick_start.installation')}</h2> <h2 className="text-2xl font-bold mb-3">{isZh ? '安装步骤' : 'Installation Steps'}</h2>
<div className="space-y-4 mb-6"> <div className="space-y-4 mb-6">
{/* Demo CDN - One Line */} {/* Demo CDN - One Line */}
@@ -67,7 +69,7 @@ import { PageAgent } from 'page-agent'`}
<div className="p-4 bg-purple-50 dark:bg-purple-900/20 rounded-lg"> <div className="p-4 bg-purple-50 dark:bg-purple-900/20 rounded-lg">
<h3 className="text-lg font-semibold mb-2 text-purple-900 dark:text-purple-300"> <h3 className="text-lg font-semibold mb-2 text-purple-900 dark:text-purple-300">
{t('quick_start.step2_title')} {isZh ? '2. 初始化配置' : '2. Initialize Configuration'}
</h3> </h3>
<CodeEditor <CodeEditor
code={`const agent = new PageAgent({ code={`const agent = new PageAgent({
@@ -82,7 +84,7 @@ import { PageAgent } from 'page-agent'`}
<div className="p-4 bg-orange-50 dark:bg-orange-900/20 rounded-lg"> <div className="p-4 bg-orange-50 dark:bg-orange-900/20 rounded-lg">
<h3 className="text-lg font-semibold mb-2 text-orange-900 dark:text-orange-300"> <h3 className="text-lg font-semibold mb-2 text-orange-900 dark:text-orange-300">
{t('quick_start.step3_title')} {isZh ? '3. 开始使用' : '3. Start Using'}
</h3> </h3>
<CodeEditor <CodeEditor
code={`// ${isZh ? '程序化执行自然语言指令' : 'Execute natural language instructions programmatically'} code={`// ${isZh ? '程序化执行自然语言指令' : 'Execute natural language instructions programmatically'}