如果只需要一次模型调用,或希望自己控制工具执行过程,可以直接使用 Model。
获取完整回复
以下示例沿用快速开始中的环境变量和运行方式:
import { Model, OpenAIProvider, SystemMessage, UserMessage } from "@yong_xie/lighter";
const model = new Model(new OpenAIProvider(
process.env.OPENAI_API_KEY!,
process.env.OPENAI_MODEL!,
));
try {
const message = await model.invoke({
// Model 不会自动添加系统提示词,需要时自行传入。
messages: [
new SystemMessage("你是一位书店顾问,简短回答。"),
new UserMessage("给月球书店起个名字。"),
],
});
console.log(message.content);
} catch (error) {
// Model 直接抛出错误,不返回带 status 的 AgentResponse。
console.error("模型调用失败:", error);
process.exitCode = 1;
}
invoke() 返回单条 AssistantMessage。如果模型请求工具,调用信息在 toolCalls 中,Model 不会自动执行工具或发起后续轮次。
接收流式回复
import { Model, OpenAIProvider, UserMessage } from "@yong_xie/lighter";
const model = new Model(new OpenAIProvider(
process.env.OPENAI_API_KEY!,
process.env.OPENAI_MODEL!,
));
try {
for await (const event of model.stream({ messages: [new UserMessage("你好!")] })) {
if (event.type === "text_delta") {
process.stdout.write(event.text);
} else if (event.type === "message") {
// 与 Agent 不同,Model 会直接提供完整 message 事件。
console.log("\n完整消息:", event.message);
}
}
} catch (error) {
console.error("流式调用失败:", error);
process.exitCode = 1;
}
Model 的流式事件包含 text_delta、reasoning_delta 和 message,没有最终的 AgentResponse。
工具与钩子
将 tool.getSpec() 放入请求的 toolSpecs,可以让模型了解工具;收到调用后,参数解析、执行和再次请求都由应用负责。希望自动处理这些步骤时,使用 Agent。
invoke(request, hooks?) 和 stream(request, hooks?) 的第二个参数可传入 beforeModel、afterModel,用法与 Agent 的模型钩子相同。直接调用 Provider 会绕过这层钩子。