MockGPT: response descriptions and scenario generators
Fixed results serve strict regression, input-dependent generators explore wiring, and explicit response descriptions cover failure and streaming scenarios.
responses.text(text,options?), toolCalls([{name,arguments,id?}],options?), httpError(status,body), and reject(message) return a ResponseDescription. Ordinary JSON does not become a transport instruction just because its fields look similar. HTTP failure statuses must be 400–599 and carry a body, and tool proposals must provide arguments; constructing a ResponseDescription directly applies the same rule validation.
OutputOptions provides delayMs, chunkSize, intervalMs, wireChunkSize, interruptAfter, finishReason, and usage. Content chunking is by code point and wireChunkSize is by encoded byte; an interruption does not append a successful termination frame. generate returns the description itself; fetch interprets the description and emits SSE when stream=true. usage can only be supplied explicitly and never estimates real tokens.
generatorNames and generators come from the same list. integer, float, boolean, pick, id, date, sentence, and imageUrl return value generators that evaluate with the same context inside a custom generator. sequence selects by rule instance hit order and is rejected once exhausted; toolCall generates proposals and does not execute tools.
summary, bullets, keywords, title, extract, and reply accept an optional source (a string or a context function) and default to the prompt. Summaries use representative-sentence ranking and repetition control without LLM rewriting; summary defaults to 240 code points, bullets/reply to 500, and title to 24, while summary/bullets default to 3 items. Summaries analyze at most 30000 code points and 180 distributed candidate sentences, sampling long text from the head, middle, and tail; keywords return an array, and a missing extracted value is null. Source, template, and options are snapshotted at construction, while callback closures remain managed by the App.
Progressive examples for the same business case
Encode a validated model result
Extension · Node.js
The adapter handles request validation, pre-first-byte delay, and lifecycle; the encoder does not execute rules or modify MockGPT call records.
import { encodeModelResponse } from '@jangts/agent-core/mock';
const controller = new AbortController();
const response = encodeModelResponse(
{ model: 'demo', messages: [{ role: 'user', content: '状态' }], stream: false },
{ content: '服务在线。' }, 'mock-1', 1700000000, controller.signal,
(error, cancelled) => console.log({ error, cancelled }),
);
console.log(await response.json());import { encodeModelResponse } from '@jangts/agent-core/mock';
const controller = new AbortController();
const response = encodeModelResponse({ model: 'demo', messages: [{ role: 'user', content: '状态' }], stream: false }, { content: '服务在线。' }, 'mock-1', 1700000000, controller.signal, (error, cancelled) => console.log({ error, cancelled }));
console.log(await response.json());Generate an inspectable summary from the input
Beginner · Node.js
import { MockGPT, generators } from '@jangts/agent-core/mock';
const mock = new MockGPT({ rules: [{ generator: generators.summary({ maxChars: 120, count: 2 }) }] });
console.log(await mock.generate({ model: 'demo', messages: [{ role: 'user', content: '服务刚完成维护。健康检查通过。用户可以查询状态。' }] }));
console.log(mock.records);import { MockGPT, generators } from '@jangts/agent-core/mock';
const mock = new MockGPT({ rules: [{ generator: generators.summary({ maxChars: 120, count: 2 }) }] });
console.log(await mock.generate({ model: 'demo', messages: [{ role: 'user', content: '服务刚完成维护。健康检查通过。用户可以查询状态。' }] }));
console.log(mock.records);Reuse the same random source across field generators
Configuration · Node.js
import { MockGPT, generators, generatorNames } from '@jangts/agent-core/mock';
const id = generators.id('user');
const age = generators.integer(18, 60);
const mock = new MockGPT({ seed: 42, clock: () => 1700000000000, rules: [{
generator: context => ({ id: id(context), age: age(context) }),
}] });
console.log(await mock.generate({ model: 'demo', messages: [{ role: 'user', content: '生成资料' }] }));
console.log(generatorNames);import { MockGPT, generators, generatorNames } from '@jangts/agent-core/mock';
const id = generators.id('user');
const age = generators.integer(18, 60);
const mock = new MockGPT({ seed: 42, clock: () => 1700000000000, rules: [{
generator: context => ({ id: id(context), age: age(context) }),
}] });
console.log(await mock.generate({ model: 'demo', messages: [{ role: 'user', content: '生成资料' }] }));
console.log(generatorNames);Simulate an error and recovery with the same request order
Extension · Node.js
import { MockGPT, generators, responses, ResponseDescription } from '@jangts/agent-core/mock';
const mock = new MockGPT({ rules: [{ prompt: '服务状态', generator: generators.sequence([
responses.httpError(429, { error: { message: 'limited' } }),
responses.text('服务在线。', { chunkSize: 2 }),
]) }] });
const input = { model: 'demo', messages: [{ role: 'user', content: '服务状态' }] };
const first = await mock.generate(input);
console.log(first instanceof ResponseDescription); // true;generate 不执行 HTTP 故障
const response = await mock.fetch('https://mock.local/v1/chat/completions', { method: 'POST', body: JSON.stringify(input) });
console.log(await response.json());import { MockGPT, generators, responses, ResponseDescription } from '@jangts/agent-core/mock';
const mock = new MockGPT({ rules: [{ prompt: '服务状态', generator: generators.sequence([
responses.httpError(429, { error: { message: 'limited' } }),
responses.text('服务在线。', { chunkSize: 2 }),
]) }] });
const input = { model: 'demo', messages: [{ role: 'user', content: '服务状态' }] };
const first = await mock.generate(input);
console.log(first instanceof ResponseDescription); // true;generate 不执行 HTTP 故障
const response = await mock.fetch('https://mock.local/v1/chat/completions', { method: 'POST', body: JSON.stringify(input) });
console.log(await response.json());