diff --git a/src/interface/web/app/agents/page.tsx b/src/interface/web/app/agents/page.tsx index c06ac129c..e0449c093 100644 --- a/src/interface/web/app/agents/page.tsx +++ b/src/interface/web/app/agents/page.tsx @@ -38,7 +38,6 @@ import { getIconFromIconName } from "../common/iconUtils"; import { convertColorToTextClass } from "../common/colorUtils"; import { Alert, AlertDescription } from "@/components/ui/alert"; import { useIsMobileWidth } from "../common/utils"; -import { createNewConversation } from "../common/chatFunctions"; export interface AgentData { slug: string; @@ -56,10 +55,13 @@ async function openChat(slug: string, userData: UserProfile | null) { return; } - try { - const response = await createNewConversation(slug); - window.location.href = `/chat?v=${response.conversationUniqueId}`; - } catch (error) { + const response = await fetch(`/api/chat/sessions?agent_slug=${slug}`, { method: "POST" }); + const data = await response.json(); + if (response.status == 200) { + window.location.href = `/chat?conversationId=${data.conversation_id}`; + } else if (response.status == 403 || response.status == 401) { + window.location.href = unauthenticatedRedirectUrl; + } else { alert("Failed to start chat session"); } } diff --git a/src/interface/web/app/chat/page.tsx b/src/interface/web/app/chat/page.tsx index 49e0df4a3..8a22dc5a1 100644 --- a/src/interface/web/app/chat/page.tsx +++ b/src/interface/web/app/chat/page.tsx @@ -32,8 +32,7 @@ interface ChatBodyDataProps { function ChatBodyData(props: ChatBodyDataProps) { const searchParams = useSearchParams(); - const conversationUniqueId = searchParams.get("v"); - const [conversationId, setConversationId] = useState(""); + const conversationId = searchParams.get("conversationId"); const [message, setMessage] = useState(""); const [image, setImage] = useState(null); const [processingMessage, setProcessingMessage] = useState(false); @@ -61,11 +60,6 @@ function ChatBodyData(props: ChatBodyDataProps) { setProcessingMessage(true); setQueryToProcess(storedMessage); } - - const conversationId = localStorage.getItem("conversationId"); - if (conversationId) { - setConversationId(conversationId); - } }, [setQueryToProcess]); useEffect(() => { @@ -75,30 +69,6 @@ function ChatBodyData(props: ChatBodyDataProps) { } }, [message, setQueryToProcess]); - useEffect(() => { - if (!conversationUniqueId) { - return; - } - - fetch( - `/api/chat/metadata?conversation_unique_id=${encodeURIComponent(conversationUniqueId)}`, - ) - .then((response) => { - if (!response.ok) { - throw new Error(response.statusText); - } - return response.json(); - }) - .then((data) => { - setConversationId(data.conversationId); - }) - .catch((err) => { - console.error(err); - setConversationId(null); - return; - }); - }); - useEffect(() => { if (conversationId) { onConversationIdChange?.(conversationId); @@ -117,15 +87,11 @@ function ChatBodyData(props: ChatBodyDataProps) { } }, [props.streamedMessages]); - if (!conversationUniqueId || conversationId === null) { + if (!conversationId) { window.location.href = "/"; return; } - if (!conversationId) { - return ; - } - return ( <>
diff --git a/src/interface/web/app/common/chatFunctions.ts b/src/interface/web/app/common/chatFunctions.ts index 0e4db2c30..8a6f5d1e5 100644 --- a/src/interface/web/app/common/chatFunctions.ts +++ b/src/interface/web/app/common/chatFunctions.ts @@ -163,7 +163,7 @@ export function modifyFileFilterForConversation( const method = mode === "add" ? "POST" : "DELETE"; const body = { - conversation_id: String(conversationId), + conversation_id: conversationId, filenames: filenames, }; const addUrl = `/api/chat/conversation/file-filters/bulk`; @@ -177,6 +177,7 @@ export function modifyFileFilterForConversation( }) .then((response) => response.json()) .then((data) => { + console.log("ADDEDFILES DATA: ", data); setAddedFiles(data); }) .catch((err) => { @@ -185,11 +186,6 @@ export function modifyFileFilterForConversation( }); } -interface NewConversationMetadata { - conversationId: string; - conversationUniqueId: string; -} - export async function createNewConversation(slug: string) { try { const response = await fetch(`/api/chat/sessions?client=web&agent_slug=${slug}`, { @@ -198,14 +194,9 @@ export async function createNewConversation(slug: string) { if (!response.ok) throw new Error(`Failed to fetch chat sessions with status: ${response.status}`); const data = await response.json(); - const uniqueId = data.unique_id; - const conversationId = data.conversation_id; - if (!uniqueId) throw new Error("Unique ID not found in response"); - if (!conversationId) throw new Error("Conversation ID not found in response"); - return { - conversationId: conversationId, - conversationUniqueId: uniqueId, - } as NewConversationMetadata; + const conversationID = data.conversation_id; + if (!conversationID) throw new Error("Conversation ID not found in response"); + return conversationID; } catch (error) { console.error("Error creating new conversation:", error); throw error; diff --git a/src/interface/web/app/components/sidePanel/chatHistorySidePanel.tsx b/src/interface/web/app/components/sidePanel/chatHistorySidePanel.tsx index ac6bda853..a0bee3569 100644 --- a/src/interface/web/app/components/sidePanel/chatHistorySidePanel.tsx +++ b/src/interface/web/app/components/sidePanel/chatHistorySidePanel.tsx @@ -67,9 +67,7 @@ interface ChatHistory { compressed: boolean; created: string; updated: string; - unique_id: string; showSidePanel: (isEnabled: boolean) => void; - selectedConversationId: string | null; } import { @@ -400,7 +398,6 @@ interface SessionsAndFilesProps { conversationId: string | null; uploadedFiles: string[]; isMobileWidth: boolean; - selectedConversationId: string | null; } function SessionsAndFiles(props: SessionsAndFilesProps) { @@ -438,10 +435,6 @@ function SessionsAndFiles(props: SessionsAndFilesProps) { agent_avatar={chatHistory.agent_avatar} agent_name={chatHistory.agent_name} showSidePanel={props.setEnabled} - unique_id={chatHistory.unique_id} - selectedConversationId={ - props.selectedConversationId - } /> ), )} @@ -453,7 +446,6 @@ function SessionsAndFiles(props: SessionsAndFilesProps) { )}
@@ -648,18 +640,20 @@ function ChatSessionActionMenu(props: ChatSessionActionMenuProps) { function ChatSession(props: ChatHistory) { const [isHovered, setIsHovered] = useState(false); const [title, setTitle] = useState(props.slug || "New Conversation 🌱"); - var currConversationId = - props.conversation_id && - props.selectedConversationId && - parseInt(props.conversation_id) === parseInt(props.selectedConversationId); + var currConversationId = parseInt( + new URLSearchParams(window.location.search).get("conversationId") || "-1", + ); return (
setIsHovered(true)} onMouseLeave={() => setIsHovered(false)} key={props.conversation_id} - className={`${styles.session} ${props.compressed ? styles.compressed : "!max-w-full"} ${isHovered ? `${styles.sessionHover}` : ""} ${currConversationId ? "dark:bg-neutral-800 bg-white" : ""}`} + className={`${styles.session} ${props.compressed ? styles.compressed : "!max-w-full"} ${isHovered ? `${styles.sessionHover}` : ""} ${currConversationId === parseInt(props.conversation_id) && currConversationId != -1 ? "dark:bg-neutral-800 bg-white" : ""}`} > - props.showSidePanel(false)}> + props.showSidePanel(false)} + >

{title}

@@ -670,14 +664,9 @@ function ChatSession(props: ChatHistory) { interface ChatSessionsModalProps { data: GroupedChatHistory | null; showSidePanel: (isEnabled: boolean) => void; - selectedConversationId: string | null; } -function ChatSessionsModal({ - data, - showSidePanel, - selectedConversationId, -}: ChatSessionsModalProps) { +function ChatSessionsModal({ data, showSidePanel }: ChatSessionsModalProps) { return ( @@ -709,8 +698,6 @@ function ChatSessionsModal({ agent_avatar={chatHistory.agent_avatar} agent_name={chatHistory.agent_name} showSidePanel={showSidePanel} - unique_id={chatHistory.unique_id} - selectedConversationId={selectedConversationId} /> ))}
@@ -832,7 +819,6 @@ export default function SidePanel(props: SidePanelProps) { userProfile={authenticatedData} conversationId={props.conversationId} isMobileWidth={props.isMobileWidth} - selectedConversationId={props.conversationId} /> ) : ( @@ -901,7 +887,6 @@ export default function SidePanel(props: SidePanelProps) { userProfile={authenticatedData} conversationId={props.conversationId} isMobileWidth={props.isMobileWidth} - selectedConversationId={props.conversationId} /> )} diff --git a/src/interface/web/app/components/suggestions/suggestionsData.ts b/src/interface/web/app/components/suggestions/suggestionsData.ts index 709d18c6f..47ba44dea 100644 --- a/src/interface/web/app/components/suggestions/suggestionsData.ts +++ b/src/interface/web/app/components/suggestions/suggestionsData.ts @@ -408,7 +408,7 @@ export const suggestionsData: Suggestion[] = [ link: "", }, { - type: SuggestionType.Interviewing, + type: SuggestionType.Code, color: suggestionToColorMap[SuggestionType.Interviewing] || DEFAULT_COLOR, description: "Provide tips for writing an effective resume.", link: "", diff --git a/src/interface/web/app/page.tsx b/src/interface/web/app/page.tsx index e6627c285..fdb686b45 100644 --- a/src/interface/web/app/page.tsx +++ b/src/interface/web/app/page.tsx @@ -147,13 +147,10 @@ function ChatBodyData(props: ChatBodyDataProps) { if (message && !processingMessage) { setProcessingMessage(true); try { - const newConversationMetadata = await createNewConversation( - selectedAgent || "khoj", - ); - onConversationIdChange?.(newConversationMetadata.conversationId); - window.location.href = `/chat?v=${newConversationMetadata.conversationUniqueId}`; + const newConversationId = await createNewConversation(selectedAgent || "khoj"); + onConversationIdChange?.(newConversationId); + window.location.href = `/chat?conversationId=${newConversationId}`; localStorage.setItem("message", message); - localStorage.setItem("conversationId", newConversationMetadata.conversationId); if (image) { localStorage.setItem("image", image); } diff --git a/src/khoj/database/adapters/__init__.py b/src/khoj/database/adapters/__init__.py index 4e4825a30..4ca3fe9ce 100644 --- a/src/khoj/database/adapters/__init__.py +++ b/src/khoj/database/adapters/__init__.py @@ -679,10 +679,6 @@ def get_conversation_by_user( return conversation - @staticmethod - def get_conversation_by_unique_id(user: KhojUser, unique_id: str): - return Conversation.objects.filter(unique_id=unique_id, user=user).first() - @staticmethod def get_conversation_sessions(user: KhojUser, client_application: ClientApplication = None): return ( diff --git a/src/khoj/database/migrations/0063_conversation_add_unique_id_field.py b/src/khoj/database/migrations/0063_conversation_add_unique_id_field.py deleted file mode 100644 index b9ae66a3f..000000000 --- a/src/khoj/database/migrations/0063_conversation_add_unique_id_field.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 5.0.8 on 2024-09-16 04:12 - -import uuid - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("database", "0062_merge_20240913_0222"), - ] - - operations = [ - migrations.AddField( - model_name="conversation", - name="unique_id", - field=models.UUIDField(default=None, editable=False, null=True), - ), - ] diff --git a/src/khoj/database/migrations/0064_populate_unique_id.py b/src/khoj/database/migrations/0064_populate_unique_id.py deleted file mode 100644 index 962b04449..000000000 --- a/src/khoj/database/migrations/0064_populate_unique_id.py +++ /dev/null @@ -1,20 +0,0 @@ -import uuid - -from django.db import migrations - - -def populate_unique_id(apps, schema_editor): - Conversation = apps.get_model("database", "Conversation") - for conversation in Conversation.objects.all(): - conversation.unique_id = uuid.uuid4() - conversation.save() - - -class Migration(migrations.Migration): - dependencies = [ - ("database", "0063_conversation_add_unique_id_field"), - ] - - operations = [ - migrations.RunPython(populate_unique_id), - ] diff --git a/src/khoj/database/migrations/0065_add_unique_constraint_to_unique_id.py b/src/khoj/database/migrations/0065_add_unique_constraint_to_unique_id.py deleted file mode 100644 index e4be70aa5..000000000 --- a/src/khoj/database/migrations/0065_add_unique_constraint_to_unique_id.py +++ /dev/null @@ -1,17 +0,0 @@ -import uuid - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("database", "0064_populate_unique_id"), - ] - - operations = [ - migrations.AlterField( - model_name="conversation", - name="unique_id", - field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), - ), - ] diff --git a/src/khoj/database/models/__init__.py b/src/khoj/database/models/__init__.py index 498326ef2..4029cf3c9 100644 --- a/src/khoj/database/models/__init__.py +++ b/src/khoj/database/models/__init__.py @@ -350,7 +350,6 @@ class Conversation(BaseModel): title = models.CharField(max_length=200, default=None, null=True, blank=True) agent = models.ForeignKey(Agent, on_delete=models.SET_NULL, default=None, null=True, blank=True) file_filters = models.JSONField(default=list) - unique_id = models.UUIDField(default=uuid.uuid4, editable=False, unique=True) class PublicConversation(BaseModel): diff --git a/src/khoj/routers/api_chat.py b/src/khoj/routers/api_chat.py index f967f9827..181593e82 100644 --- a/src/khoj/routers/api_chat.py +++ b/src/khoj/routers/api_chat.py @@ -224,7 +224,6 @@ def chat_history( "conversation_id": conversation.id, "slug": conversation.title if conversation.title else conversation.slug, "agent": agent_metadata, - "unique_id": conversation.unique_id, } ) @@ -246,33 +245,6 @@ def chat_history( return {"status": "ok", "response": meta_log} -@api_chat.get("/metadata") -def get_chat_metadata( - request: Request, - common: CommonQueryParams, - conversation_unique_id: str, -): - user = request.user.object - - # Load Conversation Metadata - conversation = ConversationAdapters.get_conversation_by_unique_id(user, conversation_unique_id) - - if conversation is None: - return Response( - content=json.dumps({"status": "error", "message": f"Conversation: {conversation_unique_id} not found"}), - status_code=404, - ) - - update_telemetry_state( - request=request, - telemetry_type="api", - api="chat_metadata", - **common.__dict__, - ) - - return {"status": "ok", "conversationId": conversation.id} - - @api_chat.get("/share/history") def get_shared_chat( request: Request, @@ -446,7 +418,7 @@ def chat_sessions( conversations = conversations[:8] sessions = conversations.values_list( - "id", "slug", "title", "agent__slug", "agent__name", "agent__avatar", "created_at", "updated_at", "unique_id" + "id", "slug", "title", "agent__slug", "agent__name", "agent__avatar", "created_at", "updated_at" ) session_values = [ @@ -457,7 +429,6 @@ def chat_sessions( "agent_avatar": session[5], "created": session[6].strftime("%Y-%m-%d %H:%M:%S"), "updated": session[7].strftime("%Y-%m-%d %H:%M:%S"), - "unique_id": str(session[8]), } for session in sessions ] @@ -484,7 +455,7 @@ async def create_chat_session( # Create new Conversation Session conversation = await ConversationAdapters.acreate_conversation_session(user, request.user.client_app, agent_slug) - response = {"conversation_id": conversation.id, "unique_id": str(conversation.unique_id)} + response = {"conversation_id": conversation.id} conversation_metadata = { "agent": agent_slug,