// agents/web-agent.ts
import { defineAgent } from "niceeval/adapter";
import type { Agent } from "niceeval/adapter";
import type { StreamEvent } from "niceeval";
import type { AgentEvent, AgentResponse } from "../ai-sdk-agent/src/protocol.ts";
export function webAgent(opts: { baseUrl: string }): Agent {
const baseUrl = opts.baseUrl.replace(/\/$/, "");
return defineAgent({
name: "web-agent",
capabilities: { conversation: true, toolObservability: true, tracing: true },
async send(input, ctx) {
const response = await fetch(`${baseUrl}/api/turn`, {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({
sessionId: ctx.session.id,
message: input.text,
model: ctx.model,
otelEndpoint: ctx.telemetry?.endpoint, // 双可观测:让 app 把本轮 span 也发回 niceeval
}),
signal: ctx.signal,
});
// 同一 workspace 的共享契约,直接按 AgentResponse 读,不必当 unknown 再校验一遍。
const body = (await response.json()) as AgentResponse;
ctx.session.id = body.sessionId;
return {
events: body.events.map(toStreamEvent),
data: body.data,
status: "completed" as const,
};
},
});
}
function toStreamEvent(event: AgentEvent): StreamEvent {
if (event.type === "action.called") return { ...event, tool: "unknown" };
return event;
}