var __defProp = Object.defineProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
// api.js
var CEREBRAS_MODEL = "gpt-oss-120b";
var CEREBRAS_API_URL = "https://api.cerebras.ai/v1/chat/completions";
var MAX_HISTORY_LENGTH = 50;
var HISTORY_TTL = 60 * 60 * 24 * 30;
async function handleChatRequest(request, env) {
try {
const { message, sessionId = "default" } = await request.json();
if (!message || typeof message !== "string" || message.trim().length === 0) {
return jsonResponse({ error: "Invalid message" }, 400);
}
let history = [];
if (env.AI_KV) {
const historyKey = chat:${sessionId};
const storedHistory = await env.AI_KV.get(historyKey);
if (storedHistory) {
try {
history = JSON.parse(storedHistory);
} catch (e) {
console.error("Failed to parse history:", e);
history = [];
}
}
}
const messages = [
{
role: "system",
content: You are a helpful AI assistant powered by Cerebras GPT-OSS-120B. Format your responses using markdown. Be concise yet thorough. If asked to generate code, use proper syntax highlighting. If asked to create HTML, provide clean, modern code.
},
...history.slice(-20).map(([role, content]) => ({ role, content })),
{ role: "user", content: message }
];
let reply;
if (!env.CEREBRAS_API_KEY) {
reply = `\u{1F916} Demo Mode Response
I received your message: "${message}"
To enable real AI responses:
CEREBRAS_API_KEY\\Features available:
; } else { try { const response = await fetch(CEREBRAS_API_URL, { method: "POST", headers: { "Content-Type": "application/json", "Authorization": Bearer ${env.CEREBRAS_API_KEY} }, body: JSON.stringify({ model: CEREBRAS_MODEL, messages, temperature: 0.7, max_tokens: 2e3, top_p: 0.95, stream: false }) }); if (!response.ok) { const errorText = await response.text(); console.error("Cerebras API error:", errorText); throw new Error(API returned ${response.status}: ${errorText.substring(0, 100)}); } const data = await response.json(); reply = data.choices?.[0]?.message?.content || "No response generated"; } catch (apiError) { console.error("API call failed:", apiError); reply = \u26A0\uFE0F API ErrorFailed to get response from Cerebras API. Error: ${apiError.message}
Please check your API key and try again.; } } const newHistory = [...history, ["user", message], ["assistant", reply]]; if (newHistory.length > MAX_HISTORY_LENGTH * 2) { newHistory.splice(0, newHistory.length - MAX_HISTORY_LENGTH * 2); } if (env.AI_KV) { const historyKey = chat:${sessionId}; await env.AI_KV.put(historyKey, JSON.stringify(newHistory), { expirationTtl: HISTORY_TTL }); await updateSessionMetadata(env, sessionId, newHistory.length / 2); } return jsonResponse({ reply, sessionId, timestamp: (/* @__PURE__ */ new Date()).toISOString(), messageCount: newHistory.length / 2 }); } catch (error) { console.error("Chat request error:", error); return jsonResponse({ error: "Failed to process chat request", details: error.message }, 500); } } __name(handleChatRequest, "handleChatRequest"); async function handleHistoryRequest(request, env) { try { const url = new URL(request.url); const sessionId = url.searchParams.get("session") || "default"; if (!env.AI_KV) { return jsonResponse({ history: [], sessionId }); } const historyKey = chat:${sessionId}; const storedHistory = await env.AI_KV.get(historyKey); let history = []; if (storedHistory) { try { history = JSON.parse(storedHistory); } catch (e) { console.error("Failed to parse history:", e); } } return jsonResponse({ history, sessionId, messageCount: history.length / 2 }); } catch (error) { console.error("History request error:", error); return jsonResponse({ error: "Failed to retrieve history", history: [], sessionId: "default" }, 500); } } __name(handleHistoryRequest, "handleHistoryRequest"); async function handleClearHistory(request, env) { try { const { sessionId = "default" } = await request.json(); if (!env.AI_KV) { return jsonResponse({ success: true }); } const historyKey = chat:${sessionId}`;
await env.AI_KV.delete(historyKey);
await updateSessionMetadata(env, sessionId, 0);
return jsonResponse({
success: true,
sessionId,
message: "History cleared successfully"
});
} catch (error) {
console.error("Clear history error:", error);
return jsonResponse({
error: "Failed to clear history",
success: false
}, 500);
}
}
__name(handleClearHistory, "handleClearHistory");
async function updateSessionMetadata(env, sessionId, messageCount) {
if (!env.AI_KV) return;
try {
const sessionsKey = "sessions:list";
const sessionsData = await env.AI_KV.get(sessionsKey);
let sessions = sessionsData ? JSON.parse(sessionsData) : [];
const sessionIndex = sessions.findIndex((s) => s.id === sessionId);
if (sessionIndex >= 0) {
sessions[sessionIndex].lastUsed = Date.now();
sessions[sessionIndex].messageCount = messageCount;
} else if (sessionId === "default") {
sessions.push({
id: "default",
name: "Default Chat",
created: Date.now(),
lastUsed: Date.now(),
messageCount
});
}
await env.AI_KV.put(sessionsKey, JSON.stringify(sessions), {
expirationTtl: HISTORY_TTL
});
} catch (e) {
console.error("Failed to update session metadata:", e);
}
}
__name(updateSessionMetadata, "updateSessionMetadata");
function jsonResponse(data, status = 200) {
return new Response(JSON.stringify(data), {
status,
headers: {
"Content-Type": "application/json",
"Cache-Control": "no-cache"
}
});
}
__name(jsonResponse, "jsonResponse");
// sessions.js
var MAX_SESSIONS = 20;
var SESSION_TTL = 60 * 60 * 24 * 30;
async function handleSessionsList(request, env) {
try {
const userId = request.user?.userId || "default";
if (!env.AI_KV) {
return jsonResponse2({
sessions: []
});
}
const sessionsKey = userId !== "default" ? sessions:user:${userId} : "sessions:list";
const sessionsData = await env.AI_KV.get(sessionsKey);
let sessions = [];
if (sessionsData) {
try {
sessions = JSON.parse(sessionsData);
} catch (e) {
console.error("Failed to parse sessions:", e);
}
}
sessions.sort((a, b) => {
return (b.lastUsed || 0) - (a.lastUsed || 0);
});
return jsonResponse2({ sessions });
} catch (error) {
console.error("List sessions error:", error);
return jsonResponse2({
error: "Failed to list sessions",
sessions: []
// Return empty array on error, no default session
}, 500);
}
}
__name(handleSessionsList, "handleSessionsList");
async function handleNewSession(request, env) {
try {
const { name } = await request.json();
if (!name || typeof name !== "string" || name.trim().length === 0) {
return jsonResponse2({ error: "Session name is required" }, 400);
}
const sessionId = session_${Date.now()}_${Math.random().toString(36).substr(2, 9)};
const session = {
id: sessionId,
name: name.trim(),
created: Date.now(),
lastUsed: Date.now(),
messageCount: 0
};
if (!env.AI_KV) {
return jsonResponse2({ session });
}
const userId = request.user?.userId || "default";
const sessionsKey = userId !== "default" ? sessions:user:${userId} : "sessions:list";
const sessionsData = await env.AI_KV.get(sessionsKey);
let sessions = sessionsData ? JSON.parse(sessionsData) : [];
sessions.push(session);
if (sessions.length > MAX_SESSIONS) {
sessions.sort((a, b) => {
return (b.lastUsed || 0) - (a.lastUsed || 0);
});
const toRemove = sessions.slice(MAX_SESSIONS);
for (const oldSession of toRemove) {
await env.AI_KV.delete(chat:${oldSession.id});
}
sessions = sessions.slice(0, MAX_SESSIONS);
}
await env.AI_KV.put(sessionsKey, JSON.stringify(sessions), {
expirationTtl: SESSION_TTL
});
return jsonResponse2({
session,
message: "Session created successfully"
});
} catch (error) {
console.error("New session error:", error);
return jsonResponse2({
error: "Failed to create session",
details: error.message
}, 500);
}
}
__name(handleNewSession, "handleNewSession");
async function handleDeleteSession(request, env) {
try {
const { sessionId } = await request.json();
if (!sessionId) {
return jsonResponse2({ error: "Session ID is required" }, 400);
}
if (!env.AI_KV) {
return jsonResponse2({ success: true });
}
const userId = request.user?.userId || "default";
const sessionsKey = userId !== "default" ? sessions:user:${userId} : "sessions:list";
const sessionsData = await env.AI_KV.get(sessionsKey);
let sessions = sessionsData ? JSON.parse(sessionsData) : [];
sessions = sessions.filter((s) => s.id !== sessionId);
await env.AI_KV.delete(chat:${sessionId});
await env.AI_KV.put(sessionsKey, JSON.stringify(sessions), {
expirationTtl: SESSION_TTL
});
return jsonResponse2({
success: true,
message: "Session deleted successfully"
});
} catch (error) {
console.error("Delete session error:", error);
return jsonResponse2({
error: "Failed to delete session",
details: error.message
}, 500);
}
}
__name(handleDeleteSession, "handleDeleteSession");
async function handleSwitchSession(request, env) {
try {
const { sessionId } = await request.json();
if (!sessionId) {
return jsonResponse2({ error: "Session ID is required" }, 400);
}
if (env.AI_KV) {
const userId = request.user?.userId || "default";
const sessionsKey = userId !== "default" ? sessions:user:${userId} : "sessions:list";
const sessionsData = await env.AI_KV.get(sessionsKey);
if (sessionsData) {
let sessions = JSON.parse(sessionsData);
const sessionIndex = sessions.findIndex((s) => s.id === sessionId);
if (sessionIndex >= 0) {
sessions[sessionIndex].lastUsed = Date.now();
await env.AI_KV.put(sessionsKey, JSON.stringify(sessions), {
expirationTtl: SESSION_TTL
});
}
}
}
return jsonResponse2({
success: true,
sessionId,
message: "Switched to session successfully"
});
} catch (error) {
console.error("Switch session error:", error);
return jsonResponse2({
error: "Failed to switch session",
details: error.message
}, 500);
}
}
__name(handleSwitchSession, "handleSwitchSession");
function jsonResponse2(data, status = 200) {
return new Response(JSON.stringify(data), {
status,
headers: {
"Content-Type": "application/json",
"Cache-Control": "no-cache"
}
});
}
__name(jsonResponse2, "jsonResponse");