MockGPT Web:可信来源与本地摘要
从真实网页或可信 load 取得正文,再交给输入相关生成器。
@jangts/agent-core/mock/web 是 Node 专用入口。sources.web({url?,profile?,headers?,timeoutMs?,maxBytes?,maxChars?,maxRedirects?,fallback?,load?}) 返回供文本生成器使用的来源。默认从 prompt 取得唯一 URL;普通生成器不联网。默认总期限20000毫秒、2MiB、30000码点和3次重定向。正文先排除脚本/模板,再用 Readability 提取,不执行页面 JS、登录或读取 PDF。
默认抓取逐跳校验协议、DNS 地址和重定向,固定实际连接地址,拒绝本机/私网/保留目标;isPublicAddress 只判断单个地址,不是完整 URL 授权器。压缩前后均限大小。headers 不允许 Host、Cookie 或 Authorization 覆盖,不传递模型凭据。
load(url,signal,maxBytes) 是可信配置端口,返回 {bytes,url,contentType};注入者拥有目标地址与传输安全责任,不能接受远程请求任意提供该函数。读取失败默认抛错,显式 fallback 仅承接允许降级的网页读取失败,再作为来源文本交给生成器;取消、非法 URL 和目标地址拒绝不转为兜底成功。sourceError、sourceFallback、webStage、receivedBytes 等记录区分失败、替代文本与实际正文,不能把验证页或登录页说成读取成功。实时网页变化不由 seed 固定。
由简到繁的同业务示例
可信 load 提供离线正文
入门 · Node.js
ts
import { MockGPT, generators } from '@jangts/agent-core/mock';
import { sources, isPublicAddress } from '@jangts/agent-core/mock/web';
const source = sources.web({ url: 'https://example.com/article', async load(url, signal, maxBytes) {
signal.throwIfAborted();
const bytes = new TextEncoder().encode('服务维护完成。健康检查通过。');
if (bytes.byteLength > maxBytes) throw new Error('来源超过预算');
return { bytes, url: url.href, contentType: 'text/plain; charset=utf-8' };
} });
const mock = new MockGPT({ rules: [{ generator: generators.summary({ source }) }] });
console.log(await mock.generate({ model: 'demo', messages: [{ role: 'user', content: '概括正文' }] }));
console.log(isPublicAddress('127.0.0.1')); // falsejs
import { MockGPT, generators } from '@jangts/agent-core/mock';
import { sources, isPublicAddress } from '@jangts/agent-core/mock/web';
const source = sources.web({ url: 'https://example.com/article', async load(url, signal, maxBytes) {
signal.throwIfAborted();
const bytes = new TextEncoder().encode('服务维护完成。健康检查通过。');
if (bytes.byteLength > maxBytes)
throw new Error('来源超过预算');
return { bytes, url: url.href, contentType: 'text/plain; charset=utf-8' };
} });
const mock = new MockGPT({ rules: [{ generator: generators.summary({ source }) }] });
console.log(await mock.generate({ model: 'demo', messages: [{ role: 'user', content: '概括正文' }] }));
console.log(isPublicAddress('127.0.0.1')); // false显式开启网页来源与失败替代文本
配置 · Node.js
ts
import { MockGPT, generators } from '@jangts/agent-core/mock';
import { sources } from '@jangts/agent-core/mock/web';
const mock = new MockGPT({ rules: [{ generator: generators.summary({ source: sources.web({
url: 'https://example.com/article', timeoutMs: 5000,
fallback: '网页不可读取,请提供正文。',
}) }) }] });
console.log(await mock.generate({ model: 'demo', messages: [{ role: 'user', content: '总结文章' }] }));
console.log(mock.records); // 检查 sourceFallback/sourceError,不把替代文本当原文js
import { MockGPT, generators } from '@jangts/agent-core/mock';
import { sources } from '@jangts/agent-core/mock/web';
const mock = new MockGPT({ rules: [{ generator: generators.summary({ source: sources.web({
url: 'https://example.com/article', timeoutMs: 5000,
fallback: '网页不可读取,请提供正文。',
}) }) }] });
console.log(await mock.generate({ model: 'demo', messages: [{ role: 'user', content: '总结文章' }] }));
console.log(mock.records); // 检查 sourceFallback/sourceError,不把替代文本当原文