diff --git a/public/opensearch.xml b/public/opensearch.xml
new file mode 100644
index 0000000..7a9bc99
--- /dev/null
+++ b/public/opensearch.xml
@@ -0,0 +1,9 @@
+
+
+ Perplexica
+ Search with Perplexica AI
+ UTF-8
+ /favicon.ico
+
+
+
diff --git a/src/app/api/chat/route.ts b/src/app/api/chat/route.ts
index 42582ed..d71856d 100644
--- a/src/app/api/chat/route.ts
+++ b/src/app/api/chat/route.ts
@@ -7,7 +7,7 @@ import db from '@/lib/db';
import { chats, messages as messagesSchema } from '@/lib/db/schema';
import {
getAvailableChatModelProviders,
- getAvailableEmbeddingModelProviders
+ getAvailableEmbeddingModelProviders,
} from '@/lib/providers';
import { searchHandlers } from '@/lib/search';
import { getFileDetails } from '@/lib/utils/files';
@@ -66,6 +66,7 @@ const handleEmitterEvents = async (
let recievedMessage = '';
let sources: any[] = [];
let searchQuery: string | undefined;
+ let searchUrl: string | undefined;
stream.on('data', (data) => {
const parsedData = JSON.parse(data);
@@ -86,6 +87,9 @@ const handleEmitterEvents = async (
if (parsedData.searchQuery) {
searchQuery = parsedData.searchQuery;
}
+ if (parsedData.searchUrl) {
+ searchUrl = parsedData.searchUrl;
+ }
writer.write(
encoder.encode(
@@ -94,6 +98,7 @@ const handleEmitterEvents = async (
data: parsedData.data,
searchQuery: parsedData.searchQuery,
messageId: aiMessageId,
+ searchUrl: searchUrl,
}) + '\n',
),
);
@@ -128,6 +133,7 @@ const handleEmitterEvents = async (
messageId: aiMessageId,
modelStats: modelStats,
searchQuery: searchQuery,
+ searchUrl: searchUrl,
}) + '\n',
),
);
@@ -144,6 +150,7 @@ const handleEmitterEvents = async (
...(sources && sources.length > 0 && { sources }),
...(searchQuery && { searchQuery }),
modelStats: modelStats,
+ ...(searchUrl && { searchUrl }),
}),
})
.execute();
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index 684a99c..f90be8a 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -26,6 +26,14 @@ export default function RootLayout({
}>) {
return (
+
+
+
{children}
diff --git a/src/components/ChatWindow.tsx b/src/components/ChatWindow.tsx
index 803d720..fa76796 100644
--- a/src/components/ChatWindow.tsx
+++ b/src/components/ChatWindow.tsx
@@ -28,6 +28,7 @@ export type Message = {
sources?: Document[];
modelStats?: ModelStats;
searchQuery?: string;
+ searchUrl?: string;
};
export interface File {
@@ -417,7 +418,6 @@ const ChatWindow = ({ id }: { id?: string }) => {
if (data.type === 'sources') {
sources = data.data;
- const searchQuery = data.searchQuery;
if (!added) {
setMessages((prevMessages) => [
...prevMessages,
@@ -427,7 +427,8 @@ const ChatWindow = ({ id }: { id?: string }) => {
chatId: chatId!,
role: 'assistant',
sources: sources,
- searchQuery: searchQuery,
+ searchQuery: data.searchQuery,
+ searchUrl: data.searchUrl,
createdAt: new Date(),
},
]);
@@ -486,6 +487,7 @@ const ChatWindow = ({ id }: { id?: string }) => {
modelStats: data.modelStats || null,
// Make sure the searchQuery is preserved (if available in the message data)
searchQuery: message.searchQuery || data.searchQuery,
+ searchUrl: message.searchUrl || data.searchUrl,
};
}
return message;
diff --git a/src/components/MessageBox.tsx b/src/components/MessageBox.tsx
index 0b08650..aff79c7 100644
--- a/src/components/MessageBox.tsx
+++ b/src/components/MessageBox.tsx
@@ -280,8 +280,23 @@ const MessageBox = ({
{message.searchQuery && (
-
Search query:{' '}
-
{message.searchQuery}
+
+ Search query:
+ {' '}
+ {message.searchUrl ? (
+
+ {message.searchQuery}
+
+ ) : (
+
+ {message.searchQuery}
+
+ )}
)}
diff --git a/src/components/MessageInput.tsx b/src/components/MessageInput.tsx
index 3303dea..2bd0dec 100644
--- a/src/components/MessageInput.tsx
+++ b/src/components/MessageInput.tsx
@@ -86,7 +86,7 @@ const MessageInput = ({
setMessage('');
};
- return (
+ return (