@@ -9,7 +9,6 @@ const BASELINE = new Set([
'claude-haiku-4.5' ,
'gemini-3-flash' ,
'deepseek-3.2' ,
'qwen3.6-plus' ,
'qwen3.5-plus' ,
'qwen3.5-flash' ,
] )
@@ -23,7 +22,6 @@ const MODEL_GROUPS: Record<string, string[]> = {
'qwen3-coder-next' ,
'qwen-3-max' ,
'qwen-3-plus' ,
'qwen3:14b (ollama)' ,
] ,
OpenAI : [ 'gpt-5.4' , 'gpt-5.2' , 'gpt-5.1' , 'gpt-5' , 'gpt-5-mini' , 'gpt-4.1' , 'gpt-4.1-mini' ] ,
DeepSeek : [ 'deepseek-3.2' ] ,
@@ -66,7 +64,6 @@ export default function Models() {
: 'Supports models that comply with OpenAI API specification and support tool calls, including public cloud services and private deployments.' }
< / p >
{ /* Models Section */ }
< section className = "mb-10" >
< Heading id = "tested-models" className = "text-2xl font-semibold mb-3" >
{ isZh ? '已测试模型' : 'Tested Models' }
@@ -89,9 +86,10 @@ export default function Models() {
< / div >
< / section >
{ /* Tips Section */ }
< section className = "mb-10" >
< h2 className = "text-2xl font-semibold mb-4" > { isZh ? '提示' : 'Tips' } < / h2 >
< Heading id = "tips" level = { 3 } >
Tips
< / Heading >
< 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" >
< li >
@@ -113,7 +111,6 @@ export default function Models() {
< / div >
< / section >
{ /* Configuration Section */ }
< section className = "mb-10" >
< Heading id = "configuration" > { isZh ? '配置方式' : 'Configuration' } < / Heading >
< CodeEditor
@@ -123,25 +120,50 @@ const pageAgent = new PageAgent({
apiKey: 'your-api-key',
model: 'qwen3.5-plus'
});
// MiniMax
const pageAgent = new PageAgent({
baseURL: 'https://api.minimax.io/v1',
apiKey: 'your-minimax-api-key',
model: 'MiniMax-M2.7'
});
// Self-hosted models (e.g., Ollama) — no apiKey needed
const pageAgent = new PageAgent({
baseURL: 'http://localhost:11434/v1',
model: 'qwen3:14b'
});
` }
/ >
< / section >
{ /* Free Testing API Section */ }
< section className = "mb-10" >
< Heading id = "production-authentication" className = "text-2xl font-semibold mb-4" >
{ isZh ? '🔐 生产环境鉴权' : '🔐 Production Authentication' }
< / Heading >
< p className = "text-sm text-gray-600 dark:text-gray-400 mb-3" >
{ isZh
? '如果你只是将它用作个人助手,可以直接连接你的 LLM 服务。'
: 'If you only use it as a personal assistant, you can connect to your LLM service directly.' }
< / p >
< p className = "text-sm text-gray-600 dark:text-gray-400 mb-3" >
{ isZh ? (
< >
如 果 你 计 划 将 它 集 成 到 你 的 Web 应 用 中 , 建 议 搭 建 一 个 后 端 代 理 来 转 发 LLM 请 求 , 并 使 用 { ' ' }
< code > customFetch < / code > 携 带 Cookie 或 其 他 鉴 权 信 息 :
< / >
) : (
< >
If you plan to integrate it into your web app , it 's better to have a backend proxy for
the LLM and use <code>customFetch</code> to authenticate the request with cookies or
other methods:
</>
)}
</p>
<CodeEditor
code={`const agent = new PageAgent({
baseURL: ' / api / llm - proxy ',
model: ' gpt - 5.1 ',
customFetch: (url, init) =>
fetch(url, { ...init, credentials: ' include ' }),
});`}
/>
<div className="mt-4 bg-yellow-50 dark:bg-yellow-950/20 border-l-4 border-yellow-500 p-4 rounded-r-lg">
<p className="text-sm font-semibold text-yellow-900 dark:text-yellow-200">
{isZh
? ' ⚠ ️ 永 远 不 要 把 真 实 的 LLM API Key 提 交 到 前 端 代 码 中 '
: ' ⚠ ️ NEVER commit real LLM API keys to your frontend code '}
</p>
</div>
</section>
<section className="mb-10">
<Heading id="free-testing-api">{isZh ? ' 免 费 测 试 接 口 ' : ' Free Testing API '}</Heading>
<p className="text-sm text-gray-600 dark:text-gray-400 mb-4">
@@ -185,113 +207,141 @@ const pageAgent = new PageAgent({
<CodeEditor
code={`# qwen3.5-plus / qwen3.5-flash
LLM_BASE_URL="https://page-ag-testing-ohftxirgbn.cn-shanghai.fcapp.run"
LLM_MODEL_NAME="qwen3.5-plus"
LLM_API_KEY="NA" ` }
LLM_MODEL_NAME="qwen3.5-plus"`}
/>
</div>
</section>
{ /* Ollama Section */ }
<section className="mb-10">
< Heading id = "ollama" > Ollama < / Heading>
< p className= "text-sm text-gray-600 dark:text-gray-400 mb-4" >
< Heading id="local-runtimes">{isZh ? ' 本 地 运 行 时 ' : ' Local Runtimes '}</ Heading>
<p className= "text-sm text-gray-600 dark:text-gray-400 mb-6">
{isZh
? '已在 Ollama 0.15 + qwen3:14b (RTX3090 24GB) 上测试通过。'
: 'Tested on Ollama 0.15 with qwen3:14b (RTX3090 24GB).' }
? ' 通 过 Ollama 、 LM Studio 等 本 地 OpenAI - compatible 运 行 时 接 入 PageAgent , 实 现 离 线 或 局 域 网 部 署 。 '
: ' Use local OpenAI - compatible runtimes such as Ollama and LM Studio with PageAgent for offline or LAN deployments . '}
</p>
< CodeEditor
code = { ` LLM_BASE_URL="http://localhost:11434/v1"
LLM_API_KEY="NA"
LLM_MODEL_NAME="qwen3:14b" ` }
/ >
< div className = "mt-4 p-4 bg-amber-50 dark:bg-amber-950/20 rounded-lg border border-amber-200 dark:border-amber-800" >
< h3 className = "font-semibold text-amber-900 dark:text-amber-200 mb-2" >
{ isZh ? '⚠️ 注意事项' : '⚠️ Important Notes' }
< / h3 >
< ul className = "text-sm text-gray-700 dark:text-gray-300 space-y-2 list-disc pl-5" >
< li >
{ isZh
? '确保 OLLAMA_ORIGINS 设置为 * 以避免 403 错误'
: 'Add * to OLLAMA_ORIGINS to avoid 403 errors' }
< / li >
< li >
{ isZh
? '小于 10B 参数的模型通常效果不佳'
: 'Models smaller than 10B are unlikely to be strong enough' }
< / li >
< li > { isZh ? '需要支持 tool_call 的模型' : 'Requires tool_call capable models' } < / li >
< li >
{ isZh
? '确保上下文长度大于输入 token 数,否则 Ollama 会静默截断 prompt。普通页面约需 15k token, 随步骤增加。默认 4k 上下文长度无法正常工作'
: 'Ensure context length exceeds input tokens, or Ollama will silently truncate prompts. ~15k tokens for a typical page, increases with steps. Default 4k context length will NOT work' }
< / li >
< / ul >
< / div >
< div className = "mt-4" >
< h3 className = "font-semibold text-gray-900 dark:text-gray-100 mb-3" >
{ isZh ? '建议启动参数' : 'Recommended Startup' }
< / h3 >
< p className = "text-sm text-gray-600 dark:text-gray-400 mb-3" >
{ isZh
? '启动 Ollama 时建议配置以下环境变量:扩大上下文窗口、允许跨域访问、监听所有网络接口。'
: 'Start Ollama with these environment variables: larger context window, allow cross-origin access, and listen on all interfaces.' }
< / p >
<div className="space-y-10">
<section>
<Heading id="requirements" level={3}>
Requirements
</Heading>
<div className="mt-4 p-5 bg-amber-50 dark:bg-amber-950/20 rounded-xl border border-amber-200 dark:border-amber-800">
<ul className="text-sm text-gray-700 dark:text-gray-300 space-y-2 list-disc pl-5">
<li>
{isZh
? ' 务 必 打 开 CORS , 否 则 浏 览 器 无 法 直 接 请 求 本 地 LLM 服 务 。 '
: ' Enable CORS , otherwise the browser cannot call your local LLM endpoint directly . '}
</li>
<li>
{isZh
? ' 将 context length 或 content length 至 少 设 置 为 8000 。 普 通 页 面 常 常 需 要 15 k token 左 右 , 默 认 4 k 很 容 易 被 截 断 。 '
: ' Set context length or content length to at least 8000 . A typical page often needs around 15 k tokens , so the default 4 k usually truncates prompts . '}
</li>
<li>
{isZh ? ' 需 要 支 持 tool_call 的 模 型 。 ' : ' Use a model with tool_call support . '}
</li>
<li>
{isZh
? ' 小 于 10 B 参 数 的 模 型 通 常 效 果 不 佳 。 '
: ' Models smaller than 10 B are usually not strong enough . '}
</li>
</ul>
</div>
</section>
< div className = "space-y-2" >
< p className = "text-xs font-medium text-gray-500 dark:text-gray-400" > macOS / Linux < / p >
<section>
<Heading id="local-configuration" level={3}>
{isZh ? ' 基 础 配 置 ' : ' Basic Configuration '}
</Heading>
<CodeEditor
code= { ` OLLAMA_CONTEXT_LENGTH=64000 OLLAMA_HOST=0.0.0.0:11434 OLLAMA_ORIGINS="*" ollama serve ` }
/ >
code={`// Local OpenAI-compatible runtime - no apiKey needed
const pageAgent = new PageAgent({
baseURL: ' http : //localhost:11434/v1',
model : 'qwen3:14b'
} ) ;
< p className = "text-xs font-medium text-gray-500 dark:text-gray-400 pt-2" >
Windows ( PowerShell )
// Or connect to LM Studio
const lmStudioAgent = new PageAgent ( {
baseURL : 'http://127.0.0.1:1234/v1' ,
model : 'qwen/qwen3.5-27b'
} ) ;
` }
/>
</section>
<section>
<Heading id="ollama" level={3}>
Ollama
</Heading>
<p className="text-sm text-gray-600 dark:text-gray-400 mb-4">
{isZh
? '已在 Ollama 0.15 + qwen3:14b (RTX3090 24GB) 上测试通过。'
: 'Tested on Ollama 0.15 with qwen3:14b (RTX3090 24GB).'}
</p>
<CodeEditor
code= { ` $ env:OLLAMA_CONTEXT_LENGTH=64000; $ env:OLLAMA_HOST="0.0.0.0:11434"; $ env:OLLAMA_ORIGINS="*"; ollama serve ` }
code={ ` LLM_BASE_URL = "http://localhost:11434/v1"
LLM_MODEL_NAME = "qwen3:14b" ` }
/>
< / div >
< / div >
< / section >
<div className="mt-4 p-4 bg-amber-50 dark:bg-amber-950/20 rounded-lg border border-amber-200 dark:border-amber-800">
<h3 className="font-semibold text-amber-900 dark:text-amber-200 mb-2">
{isZh ? '⚠️ 注意事项' : '⚠️ Important Notes'}
</h3>
<p className="text-sm text-gray-700 dark:text-gray-300">
{isZh
? '如果浏览器侧请求失败,优先检查 Ollama 是否已按上面的要求开启 CORS。'
: 'If browser-side requests fail, check whether Ollama has CORS enabled as required above.'}
</p>
</div>
{ /* Production Authentication */ }
< section className = "mb-10" >
< Heading id = "production-authentication" className = "text-2xl font-semibold mb-4" >
{ isZh ? '🔐 生产环境鉴权' : '🔐 Production Authentication' }
< / Heading >
< p className = "text-sm text-gray-600 dark:text-gray-400 mb-3" >
{ isZh
? '如果你只是将它用作个人助手,可以直接连接你的 LLM 服务。'
: 'If you only use it as a personal assistant, you can connect to your LLM service directly.' }
< / p >
< p className = "text-sm text-gray-600 dark:text-gray-400 mb-3" >
{ isZh ? (
< >
如 果 你 计 划 将 它 集 成 到 你 的 Web 应 用 中 , 建 议 搭 建 一 个 后 端 代 理 来 转 发 LLM 请 求 , 并 使 用 { ' ' }
< code > customFetch < / code > 携 带 Cookie 或 其 他 鉴 权 信 息 :
< / >
) : (
< >
If you plan to integrate it into your web app , it 's better to have a backend proxy for
the LLM and use <code>customFetch</code> to authenticate the request with cookies or
other methods:
</>
) }
</p >
<CodeEditor
code={`const agent = new PageAgent({
baseURL: ' / api / llm - proxy ',
model: ' gpt - 5.1 ',
customFetch: (url, init) = >
fetch(url, { ...init, credentials: ' include ' }),
});`}
/ >
<div className="mt-4 bg-yellow-50 dark:bg-yellow-950/20 border-l-4 border-yellow-500 p-4 rounded-r-lg">
<p className="text-sm font-semibold text-yellow-900 dark:text-yellow-200">
{isZh
? ' ⚠ ️ 永 远 不 要 把 真 实 的 LLM API Key 提 交 到 前 端 代 码 中 '
: ' ⚠ ️ NEVER commit real LLM API keys to your frontend code ' }
< / p >
<div className="mt-4">
<h3 className="font-semibold text-gray-900 dark:text-gray-100 mb-3">
{isZh ? '建议启动参数' : 'Recommended Startup'}
</h3>
<p className="text-sm text-gray-600 dark:text-gray-400 mb-3">
{isZh
? '启动 Ollama 时建议同时放大上下文窗口并开启跨域访问。'
: 'When starting Ollama, increase the context window and enable cross-origin access.'}
</p>
<div className="space-y-2">
<p className="text-xs font-medium text-gray-500 dark:text-gray-400">
macOS / Linux
</p>
<CodeEditor
code={ ` OLLAMA_CONTEXT_LENGTH = 64000 OLLAMA_HOST = 0.0.0.0 :11434 OLLAMA_ORIGINS = "*" ollama serve ` }
/>
<p className="text-xs font-medium text-gray-500 dark:text-gray-400 pt-2">
Windows (PowerShell)
</p>
<CodeEditor
code={ ` $env :OLLAMA_CONTEXT_LENGTH = 64000 ; $env :OLLAMA_HOST = "0.0.0.0:11434" ; $env :OLLAMA_ORIGINS = "*" ; ollama serve ` }
/ >
</div>
</div>
</section>
<section >
<Heading id="lm-studio" level={3}>
LM Studio
</Heading >
<CodeEditor
code={ ` LLM_BASE_URL = "http://127.0.0.1:1234/v1"
LLM_MODEL_NAME = "qwen/qwen3.5-27b" ` }
/>
<div className="mt-4 p-4 bg-amber-50 dark:bg-amber-950/20 rounded-lg border border-amber-200 dark:border-amber-800">
<h3 className="font-semibold text-amber-900 dark:text-amber-200 mb-2">
{isZh ? '⚠️ 注意事项' : '⚠️ Important Notes'}
</h3>
<ul className="text-sm text-gray-700 dark:text-gray-300 space-y-2 list-disc pl-5">
<li>
{isZh
? 'Agent 必须启用 disableNamedToolChoice, 否则 tool_choice 参数会报错。'
: 'Enable disableNamedToolChoice in the agent config, otherwise the tool_choice parameter may fail.'}
</li>
</ul>
</div>
</section>
</div>
</section>
</div>