Skip to content

Commit 98d5118

Browse files
committed
feat: implement core chat functionality with useChat hook and initialize FastAPI backend application.
1 parent fc68326 commit 98d5118

2 files changed

Lines changed: 34 additions & 11 deletions

File tree

backend/app/main.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
CORSMiddleware,
2626
allow_origins=[
2727
"http://localhost:3000",
28+
"http://127.0.0.1:3000",
2829
"https://project-cerberus-pi.vercel.app"
2930
],
3031
allow_credentials=True,

frontend/hooks/useChat.ts

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -46,34 +46,56 @@ export const useChat = (
4646

4747
setMessages((prev) => [...prev, { role: "ai", content: data.response }]);
4848
} catch (error: unknown) {
49-
console.error("Chat error:", error);
49+
console.error("Chat error details:", {
50+
error,
51+
message: (error as any).message,
52+
response: (error as any).response
53+
});
5054

5155
const chatError = error as ChatError;
56+
const detail = chatError.detail;
5257

53-
if (chatError.detail?.error === "rate_limit") {
54-
const retryAfterSeconds = chatError.detail?.retry_after;
58+
// Handle Rate Limit
59+
if (detail?.error === "rate_limit") {
60+
const retryAfterSeconds = detail.retry_after;
5561
const etaMinutes = retryAfterSeconds ? Math.ceil(retryAfterSeconds / 60) : null;
5662
const eta = etaMinutes
5763
? `\nTry again in about ${etaMinutes} minute${etaMinutes === 1 ? "" : "s"}.`
5864
: "";
59-
const modalMessage = `${chatError.detail.message}${eta}`;
65+
const modalMessage = `${detail.message}${eta}`;
6066

6167
rateLimit.maxOutLimit();
6268
rateLimit.setLimitMessage(modalMessage);
6369
rateLimit.setShowLimitModal(true);
6470

65-
setMessages((prev) => [...prev, { role: "ai", content: chatError.detail.message, isError: true }]);
71+
setMessages((prev) => [...prev, { role: "ai", content: detail.message, isError: true }]);
6672
council.setAllStatus("idle");
67-
} else if (chatError.detail?.error === "Request blocked by security system" || chatError.detail?.error === "Response blocked by security system") {
68-
if (chatError.detail.verdict) {
69-
council.updateCouncil(chatError.detail.verdict);
73+
}
74+
// Handle Security Blocks
75+
else if (detail?.error === "Request blocked by security system" || detail?.error === "Response blocked by security system") {
76+
if (detail.verdict) {
77+
council.updateCouncil(detail.verdict);
7078
} else {
7179
council.setAllStatus("unsafe", "BLOCKED");
7280
}
73-
setMessages((prev) => [...prev, { role: "ai", content: chatError.detail.message, isError: true }]);
74-
} else {
81+
setMessages((prev) => [...prev, { role: "ai", content: detail.message, isError: true }]);
82+
}
83+
// Handle Unexpected Errors
84+
else {
7585
council.setAllStatus("idle");
76-
setMessages((prev) => [...prev, { role: "ai", content: "An unexpected error occurred.", isError: true }]);
86+
let errorMessage = "An unexpected error occurred.";
87+
88+
// Try to extract a meaningful message if possible
89+
if (typeof detail === 'string') {
90+
errorMessage = detail;
91+
} else if (Array.isArray(detail)) {
92+
// Handle FastAPI validation errors (array of objects)
93+
errorMessage = "Invalid request format.";
94+
} else if ((error as Error).message) {
95+
errorMessage = (error as Error).message;
96+
}
97+
98+
setMessages((prev) => [...prev, { role: "ai", content: errorMessage, isError: true }]);
7799
}
78100
} finally {
79101
setIsLoading(false);

0 commit comments

Comments
 (0)