import { Context } from "hono";
import { verifySignature, streamResponse } from '@layercode/node-server-sdk';
import { createGoogleGenerativeAI } from '@ai-sdk/google';
import { streamText, ModelMessage } from 'ai';
import { env } from 'cloudflare:workers';
const google = createGoogleGenerativeAI({ apiKey: env.GOOGLE_GENERATIVE_AI_API_KEY });
const sessionMessages = {} as Record<string, ModelMessage[]>;
const SYSTEM_PROMPT = "You are a helpful assistant.";
const WELCOME_MESSAGE = "Welcome to Layercode. How can I help you today?";
export const onRequestPost = async (c: Context) => {
const secret = env.LAYERCODE_WEBHOOK_SECRET;
if (!secret) {
return c.json({ error: 'LAYERCODE_WEBHOOK_SECRET is not set' }, 500);
}
const rawBody = await c.req.text();
const signature = c.req.header('layercode-signature') || '';
const isValid = verifySignature({ payload: rawBody, signature, secret });
if (!isValid) {
return c.json({ error: 'Invalid signature' }, 401);
}
const json = JSON.parse(rawBody);
const { text, type, session_id } = json;
const messages = sessionMessages[session_id] || [];
if (type === "welcome") {
return streamResponse(json, async ({ stream }) => {
stream.tts(WELCOME_MESSAGE);
messages.push({
role: "assistant",
content: [{ type: "text", text: WELCOME_MESSAGE }],
});
sessionMessages[session_id] = messages;
stream.end();
});
}
messages.push({ role: "user", content: [{ type: "text", text }] });
return streamResponse(json, async ({ stream }) => {
try {
const result = await streamText({
model: google('gemini-2.5-flash-lite'),
messages: [
{ role: 'system', content: [{ type: 'text', text: SYSTEM_PROMPT }] },
...messages,
],
});
let responseText = '';
for await (const delta of result.textStream) {
stream.tts(delta);
responseText += delta;
}
messages.push({
role: 'assistant',
content: [{ type: 'text', text: responseText }],
});
sessionMessages[session_id] = messages;
} catch (err) {
console.error('Error:', err);
} finally {
stream.end();
}
});
};