import { Agent, type StreamFn } from "@mariozechner/pi-agent-core";
import { EventStream } from "@mariozechner/pi-ai";
import type {
Model,
Context,
SimpleStreamOptions,
AssistantMessageEvent,
} from "@mariozechner/pi-ai";
const proxyStreamFn: StreamFn = async (
model: Model<any>,
context: Context,
options?: SimpleStreamOptions
) => {
const response = await fetch("https://api.example.com/stream", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ model, context, options }),
signal: options?.signal,
});
if (!response.ok) {
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
}
const stream = new EventStream<AssistantMessageEvent, AssistantMessage>();
// Parse SSE stream
const reader = response.body!.getReader();
const decoder = new TextDecoder();
let buffer = "";
(async () => {
try {
while (true) {
const { done, value } = await reader.read();
if (done) break;
buffer += decoder.decode(value, { stream: true });
const lines = buffer.split("\n");
buffer = lines.pop()!;
for (const line of lines) {
if (line.startsWith("data: ")) {
const data = JSON.parse(line.slice(6));
stream.push(data);
}
}
}
stream.close();
} catch (error) {
stream.error(error);
}
})();
return stream;
};
// Use custom transport
const agent = new Agent({
streamFn: proxyStreamFn,
initialState: {
systemPrompt: "You are helpful.",
model: getModel("anthropic", "claude-4.5-sonnet-20250514"),
thinkingLevel: "medium",
tools: [],
messages: [],
},
});