Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
225 changes: 158 additions & 67 deletions app/globals.css
Original file line number Diff line number Diff line change
Expand Up @@ -5,80 +5,143 @@

:root {
/* Updated color palette for sophisticated AI chatbot aesthetic */
--background: oklch(0.99 0.002 264);
--foreground: oklch(0.145 0.01 264);
--card: oklch(1 0 0);
--card-foreground: oklch(0.145 0.01 264);
--popover: oklch(1 0 0);
--popover-foreground: oklch(0.145 0.01 264);
--primary: oklch(0.488 0.243 264.376);
--primary-foreground: oklch(0.99 0 0);
--secondary: oklch(0.96 0.005 264);
--secondary-foreground: oklch(0.205 0.01 264);
--muted: oklch(0.96 0.005 264);
--muted-foreground: oklch(0.556 0.015 264);
--accent: oklch(0.96 0.005 264);
--accent-foreground: oklch(0.205 0.01 264);
--destructive: oklch(0.577 0.245 27.325);
--destructive-foreground: oklch(0.99 0 0);
--border: oklch(0.92 0.005 264);
--input: oklch(0.92 0.005 264);
--ring: oklch(0.488 0.243 264.376);
--chart-1: oklch(0.488 0.243 264.376);
--chart-2: oklch(0.6 0.118 184.704);
--chart-3: oklch(0.398 0.07 227.392);
--chart-4: oklch(0.828 0.189 84.429);
--chart-5: oklch(0.769 0.188 70.08);
--radius: 0.75rem;
--sidebar: oklch(0.99 0.002 264);
--sidebar-foreground: oklch(0.145 0.01 264);
--sidebar-primary: oklch(0.488 0.243 264.376);
--sidebar-primary-foreground: oklch(0.99 0 0);
--sidebar-accent: oklch(0.96 0.005 264);
--sidebar-accent-foreground: oklch(0.205 0.01 264);
--sidebar-border: oklch(0.92 0.005 264);
--sidebar-ring: oklch(0.488 0.243 264.376);
--background: oklch(0.9821 0 0);
--foreground: oklch(0.2435 0 0);
--card: oklch(0.9911 0 0);
--card-foreground: oklch(0.2435 0 0);
--popover: oklch(0.9911 0 0);
--popover-foreground: oklch(0.2435 0 0);
--primary: oklch(0.4341 0.0392 41.9938);
--primary-foreground: oklch(1 0 0);
--secondary: oklch(0.92 0.0651 74.3695);
--secondary-foreground: oklch(0.3499 0.0685 40.8288);
--muted: oklch(0.9521 0 0);
--muted-foreground: oklch(0.5032 0 0);
--accent: oklch(0.931 0 0);
--accent-foreground: oklch(0.2435 0 0);
--destructive: oklch(0.6271 0.1936 33.339);
--destructive-foreground: oklch(1 0 0);
--border: oklch(0.8822 0 0);
--input: oklch(0.8822 0 0);
--ring: oklch(0.4341 0.0392 41.9938);
--chart-1: oklch(0.4341 0.0392 41.9938);
--chart-2: oklch(0.92 0.0651 74.3695);
--chart-3: oklch(0.931 0 0);
--chart-4: oklch(0.9367 0.0523 75.5009);
--chart-5: oklch(0.4338 0.0437 41.6746);
--radius: 0.5rem;
--sidebar: oklch(0.9881 0 0);
--sidebar-foreground: oklch(0.2645 0 0);
--sidebar-primary: oklch(0.325 0 0);
--sidebar-primary-foreground: oklch(0.9881 0 0);
--sidebar-accent: oklch(0.9761 0 0);
--sidebar-accent-foreground: oklch(0.325 0 0);
--sidebar-border: oklch(0.9401 0 0);
--sidebar-ring: oklch(0.7731 0 0);
--font-sans:
ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI",
Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif,
"Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
--font-serif: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif;
--font-mono:
ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono",
"Courier New", monospace;
--shadow-color: oklch(0 0 0);
--shadow-opacity: 0.1;
--shadow-blur: 3px;
--shadow-spread: 0px;
--shadow-offset-x: 0;
--shadow-offset-y: 1px;
--letter-spacing: 0em;
--spacing: 0.25rem;
--shadow-2xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05);
--shadow-xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05);
--shadow-sm:
0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1);
--shadow: 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1);
--shadow-md:
0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 2px 4px -1px hsl(0 0% 0% / 0.1);
--shadow-lg:
0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 4px 6px -1px hsl(0 0% 0% / 0.1);
--shadow-xl:
0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 8px 10px -1px hsl(0 0% 0% / 0.1);
--shadow-2xl: 0 1px 3px 0px hsl(0 0% 0% / 0.25);
--tracking-normal: 0em;
}

.dark {
/* Dark mode optimized for AI chatbot interface */
--background: oklch(0.11 0.01 264);
--foreground: oklch(0.985 0.002 264);
--card: oklch(0.145 0.012 264);
--card-foreground: oklch(0.985 0.002 264);
--popover: oklch(0.145 0.012 264);
--popover-foreground: oklch(0.985 0.002 264);
--primary: oklch(0.588 0.243 264.376);
--primary-foreground: oklch(0.99 0 0);
--secondary: oklch(0.2 0.015 264);
--secondary-foreground: oklch(0.985 0.002 264);
--muted: oklch(0.2 0.015 264);
--muted-foreground: oklch(0.65 0.015 264);
--accent: oklch(0.2 0.015 264);
--accent-foreground: oklch(0.985 0.002 264);
--destructive: oklch(0.496 0.141 25.723);
--destructive-foreground: oklch(0.99 0 0);
--border: oklch(0.24 0.02 264);
--input: oklch(0.24 0.02 264);
--ring: oklch(0.588 0.243 264.376);
--chart-1: oklch(0.588 0.243 264.376);
--chart-2: oklch(0.696 0.17 162.48);
--chart-3: oklch(0.769 0.188 70.08);
--chart-4: oklch(0.627 0.265 303.9);
--chart-5: oklch(0.645 0.246 16.439);
--sidebar: oklch(0.11 0.01 264);
--sidebar-foreground: oklch(0.985 0.002 264);
--sidebar-primary: oklch(0.588 0.243 264.376);
--sidebar-primary-foreground: oklch(0.99 0 0);
--sidebar-accent: oklch(0.2 0.015 264);
--sidebar-accent-foreground: oklch(0.985 0.002 264);
--sidebar-border: oklch(0.24 0.02 264);
--sidebar-ring: oklch(0.588 0.243 264.376);
--background: oklch(0.1776 0 0);
--foreground: oklch(0.9491 0 0);
--card: oklch(0.2134 0 0);
--card-foreground: oklch(0.9491 0 0);
--popover: oklch(0.2134 0 0);
--popover-foreground: oklch(0.9491 0 0);
--primary: oklch(0.9247 0.0524 66.1732);
--primary-foreground: oklch(0.2029 0.024 200.1962);
--secondary: oklch(0.3163 0.019 63.6992);
--secondary-foreground: oklch(0.9247 0.0524 66.1732);
--muted: oklch(0.252 0 0);
--muted-foreground: oklch(0.7699 0 0);
--accent: oklch(0.285 0 0);
--accent-foreground: oklch(0.9491 0 0);
--destructive: oklch(0.6271 0.1936 33.339);
--destructive-foreground: oklch(1 0 0);
--border: oklch(0.2351 0.0115 91.7467);
--input: oklch(0.4017 0 0);
--ring: oklch(0.9247 0.0524 66.1732);
--chart-1: oklch(0.9247 0.0524 66.1732);
--chart-2: oklch(0.3163 0.019 63.6992);
--chart-3: oklch(0.285 0 0);
--chart-4: oklch(0.3481 0.0219 67.0001);
--chart-5: oklch(0.9245 0.0533 67.0855);
--sidebar: oklch(0.2103 0.0059 285.8852);
--sidebar-foreground: oklch(0.9674 0.0013 286.3752);
--sidebar-primary: oklch(0.4882 0.2172 264.3763);
--sidebar-primary-foreground: oklch(1 0 0);
--sidebar-accent: oklch(0.2739 0.0055 286.0326);
--sidebar-accent-foreground: oklch(0.9674 0.0013 286.3752);
--sidebar-border: oklch(0.2739 0.0055 286.0326);
--sidebar-ring: oklch(0.8711 0.0055 286.286);
--radius: 0.5rem;
--font-sans:
ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI",
Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif,
"Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
--font-serif: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif;
--font-mono:
ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono",
"Courier New", monospace;
--shadow-color: oklch(0 0 0);
--shadow-opacity: 0.1;
--shadow-blur: 3px;
--shadow-spread: 0px;
--shadow-offset-x: 0;
--shadow-offset-y: 1px;
--letter-spacing: 0em;
--spacing: 0.25rem;
--shadow-2xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05);
--shadow-xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05);
--shadow-sm:
0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1);
--shadow: 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1);
--shadow-md:
0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 2px 4px -1px hsl(0 0% 0% / 0.1);
--shadow-lg:
0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 4px 6px -1px hsl(0 0% 0% / 0.1);
--shadow-xl:
0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 8px 10px -1px hsl(0 0% 0% / 0.1);
--shadow-2xl: 0 1px 3px 0px hsl(0 0% 0% / 0.25);
}

@theme inline {
--font-sans: "Geist", "Geist Fallback";
--font-mono: "Geist Mono", "Geist Mono Fallback";
--font-sans:
ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI",
Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif,
"Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
--font-mono:
ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono",
"Courier New", monospace;
--color-background: var(--background);
--color-foreground: var(--foreground);
--color-card: var(--card);
Expand Down Expand Up @@ -115,6 +178,33 @@
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
--color-sidebar-border: var(--sidebar-border);
--color-sidebar-ring: var(--sidebar-ring);
--font-serif: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif;
--radius: 0.5rem;
--tracking-tighter: calc(var(--tracking-normal) - 0.05em);
--tracking-tight: calc(var(--tracking-normal) - 0.025em);
--tracking-wide: calc(var(--tracking-normal) + 0.025em);
--tracking-wider: calc(var(--tracking-normal) + 0.05em);
--tracking-widest: calc(var(--tracking-normal) + 0.1em);
--tracking-normal: 0em;
--shadow-2xl: var(--shadow-2xl);
--shadow-xl: var(--shadow-xl);
--shadow-lg: var(--shadow-lg);
--shadow-md: var(--shadow-md);
--shadow: var(--shadow);
--shadow-sm: var(--shadow-sm);
--shadow-xs: var(--shadow-xs);
--shadow-2xs: var(--shadow-2xs);
--spacing: var(--spacing);
--letter-spacing: var(--letter-spacing);
--shadow-offset-y: var(--shadow-offset-y);
--shadow-offset-x: var(--shadow-offset-x);
--shadow-spread: var(--shadow-spread);
--shadow-blur: var(--shadow-blur);
--shadow-opacity: var(--shadow-opacity);
Comment on lines +183 to +203
Copy link

Copilot AI Mar 29, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In the @theme inline block, --tracking-normal is assigned to var(--tracking-normal). Self-referential CSS custom properties create a variable cycle and will resolve as invalid when used (e.g. in letter-spacing: var(--tracking-normal)). Remove this line (and similarly fix the other --shadow-* / --spacing tokens in this block that reference themselves).

Suggested change
--tracking-tighter: calc(var(--tracking-normal) - 0.05em);
--tracking-tight: calc(var(--tracking-normal) - 0.025em);
--tracking-wide: calc(var(--tracking-normal) + 0.025em);
--tracking-wider: calc(var(--tracking-normal) + 0.05em);
--tracking-widest: calc(var(--tracking-normal) + 0.1em);
--tracking-normal: var(--tracking-normal);
--shadow-2xl: var(--shadow-2xl);
--shadow-xl: var(--shadow-xl);
--shadow-lg: var(--shadow-lg);
--shadow-md: var(--shadow-md);
--shadow: var(--shadow);
--shadow-sm: var(--shadow-sm);
--shadow-xs: var(--shadow-xs);
--shadow-2xs: var(--shadow-2xs);
--spacing: var(--spacing);
--letter-spacing: var(--letter-spacing);
--shadow-offset-y: var(--shadow-offset-y);
--shadow-offset-x: var(--shadow-offset-x);
--shadow-spread: var(--shadow-spread);
--shadow-blur: var(--shadow-blur);
--shadow-opacity: var(--shadow-opacity);
--tracking-normal: 0em;
--tracking-tighter: calc(var(--tracking-normal) - 0.05em);
--tracking-tight: calc(var(--tracking-normal) - 0.025em);
--tracking-wide: calc(var(--tracking-normal) + 0.025em);
--tracking-wider: calc(var(--tracking-normal) + 0.05em);
--tracking-widest: calc(var(--tracking-normal) + 0.1em);
--shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.25);
--shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
--shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
--shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
--shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
--shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
--shadow-xs: 0 0 0 1px rgb(0 0 0 / 0.05);
--shadow-2xs: 0 0 0 1px rgb(0 0 0 / 0.03);
--spacing: 1rem;
--letter-spacing: 0em;
--shadow-offset-y: 0px;
--shadow-offset-x: 0px;
--shadow-spread: 0px;
--shadow-blur: 0px;
--shadow-opacity: 0.25;

Copilot uses AI. Check for mistakes.
--color-shadow-color: var(--shadow-color);
--radius-2xl: calc(var(--radius) * 1.8);
--radius-3xl: calc(var(--radius) * 2.2);
--radius-4xl: calc(var(--radius) * 2.6);
}

@layer base {
Expand All @@ -130,5 +220,6 @@
}
body {
@apply bg-background text-foreground;
letter-spacing: var(--tracking-normal);
}
}
41 changes: 11 additions & 30 deletions backend/api/v1/model_routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,31 +27,18 @@ def generate_answer(request: GenerateRequest) -> Dict[str, Any]:
"""Perform RAG and generate an answer for the given query."""
try:
vector_service = get_vector_service()
# Search for documents relevant to the query in the chat's collection
# Single retrieval pass: fetch broader candidates, then post-process and rerank.
search_results = vector_service.search_documents(
request.chat_id,
request.query,
top_k=10,
)

search_results = vector_service.search_documents(request.chat_id, request.query, top_k=3)

# Apply post-processing to each document's text beforehand
for doc in search_results.results:
doc.text = _post_process_context(doc.text)

# Save top 3 retrieved documents to a text file
try:
with open(r"d:\pointerRAG\retrieved_docs.txt", "w", encoding="utf-8") as f:
f.write(f"Query: {request.query}\n")
f.write("="*40 + "\n\n")
for i, doc in enumerate(search_results.results, 1):
f.write(f"--- Document {i} ---\n")
f.write(f"{doc.text}\n\n")
except Exception as file_err:
logger.error(f"Failed to write retrieved docs to file: {file_err}")

context_str = "\n\n".join([doc.text for doc in search_results.results])

search_results = vector_service.search_documents(request.chat_id, request.query, top_k=10)

# Extract initial retrieved texts
retrieved_texts = [doc.text for doc in search_results.results]
# Post-process all rerank candidates for consistency.
retrieved_texts = [
_post_process_context(doc.text)
for doc in search_results.results
]

if retrieved_texts:
# Rerank down to top 3
Expand All @@ -64,12 +51,6 @@ def generate_answer(request: GenerateRequest) -> Dict[str, Any]:
context_str = ""


with open("retrieved_docs.txt", "w", encoding="utf-8") as f:
f.write(f"Query: {request.query}\n\n")
# Write the top 3 documents to a text file for verification
for i, doc in enumerate(top_docs):
f.write(f"--- Document {i+1} ---\n{doc}\n\n")

if context_str:
generation_service = get_generation_service()
ai_content = generation_service.generate_answer(request.query, context_str)
Expand Down
Loading