// app/api/chat/route.ts
import OpenAI from 'openai';
import {
AgentFactory,
AgentNetwork,
AgentNetworkEvent,
NextEndpoint,
S,
} from '@m4trix/core/matrix';
const chatRequest = AgentNetworkEvent.of('chat-request', S.Struct({ message: S.String }));
const chatResponse = AgentNetworkEvent.of('chat-response', S.Struct({ text: S.String, done: S.Boolean }));
const chatAgent = AgentFactory.run()
.listensTo([chatRequest])
.emits([chatResponse])
.logic(async ({ triggerEvent, emit }) => {
const openai = new OpenAI();
const stream = await openai.chat.completions.create({
model: 'gpt-4o',
stream: true,
messages: [{ role: 'user', content: triggerEvent.payload.message }],
});
for await (const chunk of stream) {
const text = chunk.choices[0]?.delta?.content;
if (text) emit({ name: 'chat-response', payload: { text, done: false } });
}
emit({ name: 'chat-response', payload: { text: '', done: true } });
})
.produce({});
const network = AgentNetwork.setup(
({ mainChannel, createChannel, sink, registerAgent }) => {
const main = mainChannel('main');
const client = createChannel('client').sink(sink.httpStream());
registerAgent(chatAgent).subscribe(main).publishTo(client);
},
);
const api = network.expose({
protocol: 'sse',
select: { channels: 'client' },
startEventName: 'chat-request',
});
const handler = NextEndpoint.from(api).handler();
export const GET = handler;
export const POST = handler;