mirror of
https://github.com/khoaliber/khoj.git
synced 2026-03-02 13:18:18 +00:00
Revert "Convert conversationId int to string before making api request to bulk update file filters"
This reverts commitc9665fb20b. Revert "Fix handling for new conversation in agents page" This reverts commit3466f04992. Revert "Add a unique_id field for identifiying conversations (#914)" This reverts commitece2ec2d90.
This commit is contained in:
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,8 +32,7 @@ interface ChatBodyDataProps {
|
||||
|
||||
function ChatBodyData(props: ChatBodyDataProps) {
|
||||
const searchParams = useSearchParams();
|
||||
const conversationUniqueId = searchParams.get("v");
|
||||
const [conversationId, setConversationId] = useState<string | null>("");
|
||||
const conversationId = searchParams.get("conversationId");
|
||||
const [message, setMessage] = useState("");
|
||||
const [image, setImage] = useState<string | null>(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 <Loading />;
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
<div className={false ? styles.chatBody : styles.chatBodyFull}>
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
<ChatSessionsModal
|
||||
data={props.organizedData}
|
||||
showSidePanel={props.setEnabled}
|
||||
selectedConversationId={props.selectedConversationId}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
@@ -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 (
|
||||
<div
|
||||
onMouseEnter={() => 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" : ""}`}
|
||||
>
|
||||
<Link href={`/chat?v=${props.unique_id}`} onClick={() => props.showSidePanel(false)}>
|
||||
<Link
|
||||
href={`/chat?conversationId=${props.conversation_id}`}
|
||||
onClick={() => props.showSidePanel(false)}
|
||||
>
|
||||
<p className={styles.session}>{title}</p>
|
||||
</Link>
|
||||
<ChatSessionActionMenu conversationId={props.conversation_id} setTitle={setTitle} />
|
||||
@@ -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 (
|
||||
<Dialog>
|
||||
<DialogTrigger className="flex text-left text-medium text-gray-500 hover:text-gray-300 cursor-pointer my-4 text-sm p-[0.5rem]">
|
||||
@@ -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}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
@@ -832,7 +819,6 @@ export default function SidePanel(props: SidePanelProps) {
|
||||
userProfile={authenticatedData}
|
||||
conversationId={props.conversationId}
|
||||
isMobileWidth={props.isMobileWidth}
|
||||
selectedConversationId={props.conversationId}
|
||||
/>
|
||||
</div>
|
||||
) : (
|
||||
@@ -901,7 +887,6 @@ export default function SidePanel(props: SidePanelProps) {
|
||||
userProfile={authenticatedData}
|
||||
conversationId={props.conversationId}
|
||||
isMobileWidth={props.isMobileWidth}
|
||||
selectedConversationId={props.conversationId}
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
|
||||
@@ -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: "",
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -679,10 +679,6 @@ class ConversationAdapters:
|
||||
|
||||
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 (
|
||||
|
||||
@@ -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),
|
||||
),
|
||||
]
|
||||
@@ -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),
|
||||
]
|
||||
@@ -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),
|
||||
),
|
||||
]
|
||||
@@ -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):
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user