mirror of
https://github.com/ItzCrazyKns/Perplexica.git
synced 2026-01-09 04:45:45 +00:00
Compare commits
2 Commits
v1.12.0
...
feat/impro
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2e2c584169 | ||
|
|
a755867e87 |
@@ -239,8 +239,8 @@ Perplexica runs on Next.js and handles all API requests. It works right away on
|
|||||||
|
|
||||||
## Upcoming Features
|
## Upcoming Features
|
||||||
|
|
||||||
- [ ] Adding more widgets, integrations, search sources
|
- [] Adding more widgets, integrations, search sources
|
||||||
- [ ] Adding authentication
|
- [] Adding authentication
|
||||||
|
|
||||||
## Support Us
|
## Support Us
|
||||||
|
|
||||||
|
|||||||
@@ -11,13 +11,6 @@ const nextConfig = {
|
|||||||
],
|
],
|
||||||
},
|
},
|
||||||
serverExternalPackages: ['pdf-parse'],
|
serverExternalPackages: ['pdf-parse'],
|
||||||
outputFileTracingIncludes: {
|
|
||||||
'/api/**': [
|
|
||||||
'./node_modules/@napi-rs/canvas/**',
|
|
||||||
'./node_modules/@napi-rs/canvas-linux-x64-gnu/**',
|
|
||||||
'./node_modules/@napi-rs/canvas-linux-x64-musl/**',
|
|
||||||
],
|
|
||||||
},
|
|
||||||
env: {
|
env: {
|
||||||
NEXT_PUBLIC_VERSION: pkg.version,
|
NEXT_PUBLIC_VERSION: pkg.version,
|
||||||
},
|
},
|
||||||
|
|||||||
13
package.json
13
package.json
@@ -1,11 +1,11 @@
|
|||||||
{
|
{
|
||||||
"name": "perplexica",
|
"name": "perplexica-frontend",
|
||||||
"version": "1.12.0",
|
"version": "1.11.2",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"author": "ItzCrazyKns",
|
"author": "ItzCrazyKns",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "next dev --webpack",
|
"dev": "next dev",
|
||||||
"build": "next build --webpack",
|
"build": "next build",
|
||||||
"start": "next start",
|
"start": "next start",
|
||||||
"lint": "next lint",
|
"lint": "next lint",
|
||||||
"format:write": "prettier . --write"
|
"format:write": "prettier . --write"
|
||||||
@@ -19,6 +19,7 @@
|
|||||||
"@phosphor-icons/react": "^2.1.10",
|
"@phosphor-icons/react": "^2.1.10",
|
||||||
"@radix-ui/react-tooltip": "^1.2.8",
|
"@radix-ui/react-tooltip": "^1.2.8",
|
||||||
"@tailwindcss/typography": "^0.5.12",
|
"@tailwindcss/typography": "^0.5.12",
|
||||||
|
"@types/jspdf": "^2.0.0",
|
||||||
"axios": "^1.8.3",
|
"axios": "^1.8.3",
|
||||||
"better-sqlite3": "^11.9.1",
|
"better-sqlite3": "^11.9.1",
|
||||||
"clsx": "^2.1.0",
|
"clsx": "^2.1.0",
|
||||||
@@ -53,7 +54,6 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/better-sqlite3": "^7.6.12",
|
"@types/better-sqlite3": "^7.6.12",
|
||||||
"@types/jspdf": "^2.0.0",
|
|
||||||
"@types/node": "^24.8.1",
|
"@types/node": "^24.8.1",
|
||||||
"@types/pdf-parse": "^1.1.4",
|
"@types/pdf-parse": "^1.1.4",
|
||||||
"@types/react": "^18",
|
"@types/react": "^18",
|
||||||
@@ -68,8 +68,5 @@
|
|||||||
"prettier": "^3.2.5",
|
"prettier": "^3.2.5",
|
||||||
"tailwindcss": "^3.3.0",
|
"tailwindcss": "^3.3.0",
|
||||||
"typescript": "^5.9.3"
|
"typescript": "^5.9.3"
|
||||||
},
|
|
||||||
"optionalDependencies": {
|
|
||||||
"@napi-rs/canvas": "^0.1.87"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,10 +21,7 @@ export const POST = async (req: Request) => {
|
|||||||
|
|
||||||
const images = await searchImages(
|
const images = await searchImages(
|
||||||
{
|
{
|
||||||
chatHistory: body.chatHistory.map(([role, content]) => ({
|
chatHistory: body.chatHistory,
|
||||||
role: role === 'human' ? 'user' : 'assistant',
|
|
||||||
content,
|
|
||||||
})),
|
|
||||||
query: body.query,
|
query: body.query,
|
||||||
},
|
},
|
||||||
llm,
|
llm,
|
||||||
|
|||||||
@@ -20,10 +20,7 @@ export const POST = async (req: Request) => {
|
|||||||
|
|
||||||
const suggestions = await generateSuggestions(
|
const suggestions = await generateSuggestions(
|
||||||
{
|
{
|
||||||
chatHistory: body.chatHistory.map(([role, content]) => ({
|
chatHistory: body.chatHistory,
|
||||||
role: role === 'human' ? 'user' : 'assistant',
|
|
||||||
content,
|
|
||||||
})),
|
|
||||||
},
|
},
|
||||||
llm,
|
llm,
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -21,10 +21,7 @@ export const POST = async (req: Request) => {
|
|||||||
|
|
||||||
const videos = await handleVideoSearch(
|
const videos = await handleVideoSearch(
|
||||||
{
|
{
|
||||||
chatHistory: body.chatHistory.map(([role, content]) => ({
|
chatHistory: body.chatHistory,
|
||||||
role: role === 'human' ? 'user' : 'assistant',
|
|
||||||
content,
|
|
||||||
})),
|
|
||||||
query: body.query,
|
query: body.query,
|
||||||
},
|
},
|
||||||
llm,
|
llm,
|
||||||
|
|||||||
@@ -50,14 +50,7 @@ const MessageBox = ({
|
|||||||
dividerRef?: MutableRefObject<HTMLDivElement | null>;
|
dividerRef?: MutableRefObject<HTMLDivElement | null>;
|
||||||
isLast: boolean;
|
isLast: boolean;
|
||||||
}) => {
|
}) => {
|
||||||
const {
|
const { loading, sendMessage, rewrite, messages, researchEnded } = useChat();
|
||||||
loading,
|
|
||||||
sendMessage,
|
|
||||||
rewrite,
|
|
||||||
messages,
|
|
||||||
researchEnded,
|
|
||||||
chatHistory,
|
|
||||||
} = useChat();
|
|
||||||
|
|
||||||
const parsedMessage = section.parsedTextBlocks.join('\n\n');
|
const parsedMessage = section.parsedTextBlocks.join('\n\n');
|
||||||
const speechMessage = section.speechMessage || '';
|
const speechMessage = section.speechMessage || '';
|
||||||
@@ -272,11 +265,11 @@ const MessageBox = ({
|
|||||||
<div className="lg:sticky lg:top-20 flex flex-col items-center space-y-3 w-full lg:w-3/12 z-30 h-full pb-4">
|
<div className="lg:sticky lg:top-20 flex flex-col items-center space-y-3 w-full lg:w-3/12 z-30 h-full pb-4">
|
||||||
<SearchImages
|
<SearchImages
|
||||||
query={section.message.query}
|
query={section.message.query}
|
||||||
chatHistory={chatHistory}
|
chatHistory={messages}
|
||||||
messageId={section.message.messageId}
|
messageId={section.message.messageId}
|
||||||
/>
|
/>
|
||||||
<SearchVideos
|
<SearchVideos
|
||||||
chatHistory={chatHistory}
|
chatHistory={messages}
|
||||||
query={section.message.query}
|
query={section.message.query}
|
||||||
messageId={section.message.messageId}
|
messageId={section.message.messageId}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ const MessageSources = ({ sources }: { sources: Chunk[] }) => {
|
|||||||
>
|
>
|
||||||
<div className="flex flex-row items-center space-x-1">
|
<div className="flex flex-row items-center space-x-1">
|
||||||
{sources.slice(3, 6).map((source, i) => {
|
{sources.slice(3, 6).map((source, i) => {
|
||||||
return source.metadata.url === 'File' ? (
|
return source.metadata.includes('file_id://') ? (
|
||||||
<div
|
<div
|
||||||
key={i}
|
key={i}
|
||||||
className="bg-dark-200 hover:bg-dark-100 transition duration-200 flex items-center justify-center w-6 h-6 rounded-full"
|
className="bg-dark-200 hover:bg-dark-100 transition duration-200 flex items-center justify-center w-6 h-6 rounded-full"
|
||||||
@@ -124,7 +124,7 @@ const MessageSources = ({ sources }: { sources: Chunk[] }) => {
|
|||||||
</p>
|
</p>
|
||||||
<div className="flex flex-row items-center justify-between">
|
<div className="flex flex-row items-center justify-between">
|
||||||
<div className="flex flex-row items-center space-x-1">
|
<div className="flex flex-row items-center space-x-1">
|
||||||
{source.metadata.url === 'File' ? (
|
{source.metadata.url.includes('file_id://') ? (
|
||||||
<div className="bg-dark-200 hover:bg-dark-100 transition duration-200 flex items-center justify-center w-6 h-6 rounded-full">
|
<div className="bg-dark-200 hover:bg-dark-100 transition duration-200 flex items-center justify-center w-6 h-6 rounded-full">
|
||||||
<File size={12} className="text-white/70" />
|
<File size={12} className="text-white/70" />
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ const SearchImages = ({
|
|||||||
messageId,
|
messageId,
|
||||||
}: {
|
}: {
|
||||||
query: string;
|
query: string;
|
||||||
chatHistory: [string, string][];
|
chatHistory: Message[];
|
||||||
messageId: string;
|
messageId: string;
|
||||||
}) => {
|
}) => {
|
||||||
const [images, setImages] = useState<Image[] | null>(null);
|
const [images, setImages] = useState<Image[] | null>(null);
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ const Searchvideos = ({
|
|||||||
messageId,
|
messageId,
|
||||||
}: {
|
}: {
|
||||||
query: string;
|
query: string;
|
||||||
chatHistory: [string, string][];
|
chatHistory: Message[];
|
||||||
messageId: string;
|
messageId: string;
|
||||||
}) => {
|
}) => {
|
||||||
const [videos, setVideos] = useState<Video[] | null>(null);
|
const [videos, setVideos] = useState<Video[] | null>(null);
|
||||||
|
|||||||
@@ -175,7 +175,7 @@ const loadMessages = async (
|
|||||||
chatId: string,
|
chatId: string,
|
||||||
setMessages: (messages: Message[]) => void,
|
setMessages: (messages: Message[]) => void,
|
||||||
setIsMessagesLoaded: (loaded: boolean) => void,
|
setIsMessagesLoaded: (loaded: boolean) => void,
|
||||||
chatHistory: React.MutableRefObject<[string, string][]>,
|
setChatHistory: (history: [string, string][]) => void,
|
||||||
setSources: (sources: string[]) => void,
|
setSources: (sources: string[]) => void,
|
||||||
setNotFound: (notFound: boolean) => void,
|
setNotFound: (notFound: boolean) => void,
|
||||||
setFiles: (files: File[]) => void,
|
setFiles: (files: File[]) => void,
|
||||||
@@ -233,7 +233,7 @@ const loadMessages = async (
|
|||||||
setFiles(files);
|
setFiles(files);
|
||||||
setFileIds(files.map((file: File) => file.fileId));
|
setFileIds(files.map((file: File) => file.fileId));
|
||||||
|
|
||||||
chatHistory.current = history;
|
setChatHistory(history);
|
||||||
setSources(data.chat.sources);
|
setSources(data.chat.sources);
|
||||||
setIsMessagesLoaded(true);
|
setIsMessagesLoaded(true);
|
||||||
};
|
};
|
||||||
@@ -281,7 +281,7 @@ export const ChatProvider = ({ children }: { children: React.ReactNode }) => {
|
|||||||
|
|
||||||
const [researchEnded, setResearchEnded] = useState(false);
|
const [researchEnded, setResearchEnded] = useState(false);
|
||||||
|
|
||||||
const chatHistory = useRef<[string, string][]>([]);
|
const [chatHistory, setChatHistory] = useState<[string, string][]>([]);
|
||||||
const [messages, setMessages] = useState<Message[]>([]);
|
const [messages, setMessages] = useState<Message[]>([]);
|
||||||
|
|
||||||
const [files, setFiles] = useState<File[]>([]);
|
const [files, setFiles] = useState<File[]>([]);
|
||||||
@@ -402,12 +402,7 @@ export const ChatProvider = ({ children }: { children: React.ReactNode }) => {
|
|||||||
});
|
});
|
||||||
}, [messages]);
|
}, [messages]);
|
||||||
|
|
||||||
const isReconnectingRef = useRef(false);
|
|
||||||
const handledMessageEndRef = useRef<Set<string>>(new Set());
|
|
||||||
|
|
||||||
const checkReconnect = async () => {
|
const checkReconnect = async () => {
|
||||||
if (isReconnectingRef.current) return;
|
|
||||||
|
|
||||||
setIsReady(true);
|
setIsReady(true);
|
||||||
console.debug(new Date(), 'app:ready');
|
console.debug(new Date(), 'app:ready');
|
||||||
|
|
||||||
@@ -419,8 +414,6 @@ export const ChatProvider = ({ children }: { children: React.ReactNode }) => {
|
|||||||
setResearchEnded(false);
|
setResearchEnded(false);
|
||||||
setMessageAppeared(false);
|
setMessageAppeared(false);
|
||||||
|
|
||||||
isReconnectingRef.current = true;
|
|
||||||
|
|
||||||
const res = await fetch(`/api/reconnect/${lastMsg.backendId}`, {
|
const res = await fetch(`/api/reconnect/${lastMsg.backendId}`, {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
});
|
});
|
||||||
@@ -434,27 +427,23 @@ export const ChatProvider = ({ children }: { children: React.ReactNode }) => {
|
|||||||
|
|
||||||
const messageHandler = getMessageHandler(lastMsg);
|
const messageHandler = getMessageHandler(lastMsg);
|
||||||
|
|
||||||
try {
|
while (true) {
|
||||||
while (true) {
|
const { value, done } = await reader.read();
|
||||||
const { value, done } = await reader.read();
|
if (done) break;
|
||||||
if (done) break;
|
|
||||||
|
|
||||||
partialChunk += decoder.decode(value, { stream: true });
|
partialChunk += decoder.decode(value, { stream: true });
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const messages = partialChunk.split('\n');
|
const messages = partialChunk.split('\n');
|
||||||
for (const msg of messages) {
|
for (const msg of messages) {
|
||||||
if (!msg.trim()) continue;
|
if (!msg.trim()) continue;
|
||||||
const json = JSON.parse(msg);
|
const json = JSON.parse(msg);
|
||||||
messageHandler(json);
|
messageHandler(json);
|
||||||
}
|
|
||||||
partialChunk = '';
|
|
||||||
} catch (error) {
|
|
||||||
console.warn('Incomplete JSON, waiting for next chunk...');
|
|
||||||
}
|
}
|
||||||
|
partialChunk = '';
|
||||||
|
} catch (error) {
|
||||||
|
console.warn('Incomplete JSON, waiting for next chunk...');
|
||||||
}
|
}
|
||||||
} finally {
|
|
||||||
isReconnectingRef.current = false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -474,7 +463,7 @@ export const ChatProvider = ({ children }: { children: React.ReactNode }) => {
|
|||||||
if (params.chatId && params.chatId !== chatId) {
|
if (params.chatId && params.chatId !== chatId) {
|
||||||
setChatId(params.chatId);
|
setChatId(params.chatId);
|
||||||
setMessages([]);
|
setMessages([]);
|
||||||
chatHistory.current = [];
|
setChatHistory([]);
|
||||||
setFiles([]);
|
setFiles([]);
|
||||||
setFileIds([]);
|
setFileIds([]);
|
||||||
setIsMessagesLoaded(false);
|
setIsMessagesLoaded(false);
|
||||||
@@ -494,7 +483,7 @@ export const ChatProvider = ({ children }: { children: React.ReactNode }) => {
|
|||||||
chatId,
|
chatId,
|
||||||
setMessages,
|
setMessages,
|
||||||
setIsMessagesLoaded,
|
setIsMessagesLoaded,
|
||||||
chatHistory,
|
setChatHistory,
|
||||||
setSources,
|
setSources,
|
||||||
setNotFound,
|
setNotFound,
|
||||||
setFiles,
|
setFiles,
|
||||||
@@ -530,7 +519,9 @@ export const ChatProvider = ({ children }: { children: React.ReactNode }) => {
|
|||||||
|
|
||||||
setMessages((prev) => prev.slice(0, index));
|
setMessages((prev) => prev.slice(0, index));
|
||||||
|
|
||||||
chatHistory.current = chatHistory.current.slice(0, index * 2);
|
setChatHistory((prev) => {
|
||||||
|
return prev.slice(0, index * 2);
|
||||||
|
});
|
||||||
|
|
||||||
const messageToRewrite = messages[index];
|
const messageToRewrite = messages[index];
|
||||||
sendMessage(messageToRewrite.query, messageToRewrite.messageId, true);
|
sendMessage(messageToRewrite.query, messageToRewrite.messageId, true);
|
||||||
@@ -579,20 +570,6 @@ export const ChatProvider = ({ children }: { children: React.ReactNode }) => {
|
|||||||
setMessages((prev) =>
|
setMessages((prev) =>
|
||||||
prev.map((msg) => {
|
prev.map((msg) => {
|
||||||
if (msg.messageId === messageId) {
|
if (msg.messageId === messageId) {
|
||||||
const exists = msg.responseBlocks.findIndex(
|
|
||||||
(b) => b.id === data.block.id,
|
|
||||||
);
|
|
||||||
|
|
||||||
if (exists !== -1) {
|
|
||||||
const existingBlocks = [...msg.responseBlocks];
|
|
||||||
existingBlocks[exists] = data.block;
|
|
||||||
|
|
||||||
return {
|
|
||||||
...msg,
|
|
||||||
responseBlocks: existingBlocks,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
...msg,
|
...msg,
|
||||||
responseBlocks: [...msg.responseBlocks, data.block],
|
responseBlocks: [...msg.responseBlocks, data.block],
|
||||||
@@ -630,18 +607,12 @@ export const ChatProvider = ({ children }: { children: React.ReactNode }) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (data.type === 'messageEnd') {
|
if (data.type === 'messageEnd') {
|
||||||
if (handledMessageEndRef.current.has(messageId)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
handledMessageEndRef.current.add(messageId);
|
|
||||||
|
|
||||||
const currentMsg = messagesRef.current.find(
|
const currentMsg = messagesRef.current.find(
|
||||||
(msg) => msg.messageId === messageId,
|
(msg) => msg.messageId === messageId,
|
||||||
);
|
);
|
||||||
|
|
||||||
const newHistory: [string, string][] = [
|
const newHistory: [string, string][] = [
|
||||||
...chatHistory.current,
|
...chatHistory,
|
||||||
['human', message.query],
|
['human', message.query],
|
||||||
[
|
[
|
||||||
'assistant',
|
'assistant',
|
||||||
@@ -650,7 +621,7 @@ export const ChatProvider = ({ children }: { children: React.ReactNode }) => {
|
|||||||
],
|
],
|
||||||
];
|
];
|
||||||
|
|
||||||
chatHistory.current = newHistory;
|
setChatHistory(newHistory);
|
||||||
|
|
||||||
setMessages((prev) =>
|
setMessages((prev) =>
|
||||||
prev.map((msg) =>
|
prev.map((msg) =>
|
||||||
@@ -667,15 +638,13 @@ export const ChatProvider = ({ children }: { children: React.ReactNode }) => {
|
|||||||
const autoMediaSearch = getAutoMediaSearch();
|
const autoMediaSearch = getAutoMediaSearch();
|
||||||
|
|
||||||
if (autoMediaSearch) {
|
if (autoMediaSearch) {
|
||||||
setTimeout(() => {
|
document
|
||||||
document
|
.getElementById(`search-images-${lastMsg.messageId}`)
|
||||||
.getElementById(`search-images-${lastMsg.messageId}`)
|
?.click();
|
||||||
?.click();
|
|
||||||
|
|
||||||
document
|
document
|
||||||
.getElementById(`search-videos-${lastMsg.messageId}`)
|
.getElementById(`search-videos-${lastMsg.messageId}`)
|
||||||
?.click();
|
?.click();
|
||||||
}, 200);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if there are sources and no suggestions
|
// Check if there are sources and no suggestions
|
||||||
@@ -759,11 +728,8 @@ export const ChatProvider = ({ children }: { children: React.ReactNode }) => {
|
|||||||
sources: sources,
|
sources: sources,
|
||||||
optimizationMode: optimizationMode,
|
optimizationMode: optimizationMode,
|
||||||
history: rewrite
|
history: rewrite
|
||||||
? chatHistory.current.slice(
|
? chatHistory.slice(0, messageIndex === -1 ? undefined : messageIndex)
|
||||||
0,
|
: chatHistory,
|
||||||
messageIndex === -1 ? undefined : messageIndex,
|
|
||||||
)
|
|
||||||
: chatHistory.current,
|
|
||||||
chatModel: {
|
chatModel: {
|
||||||
key: chatModelProvider.key,
|
key: chatModelProvider.key,
|
||||||
providerId: chatModelProvider.providerId,
|
providerId: chatModelProvider.providerId,
|
||||||
@@ -810,7 +776,7 @@ export const ChatProvider = ({ children }: { children: React.ReactNode }) => {
|
|||||||
value={{
|
value={{
|
||||||
messages,
|
messages,
|
||||||
sections,
|
sections,
|
||||||
chatHistory: chatHistory.current,
|
chatHistory,
|
||||||
files,
|
files,
|
||||||
fileIds,
|
fileIds,
|
||||||
sources,
|
sources,
|
||||||
|
|||||||
@@ -61,22 +61,6 @@ const defaultChatModels: Model[] = [
|
|||||||
name: 'GPT 5 Mini',
|
name: 'GPT 5 Mini',
|
||||||
key: 'gpt-5-mini',
|
key: 'gpt-5-mini',
|
||||||
},
|
},
|
||||||
{
|
|
||||||
name: 'GPT 5 Pro',
|
|
||||||
key: 'gpt-5-pro',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'GPT 5.1',
|
|
||||||
key: 'gpt-5.1',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'GPT 5.2',
|
|
||||||
key: 'gpt-5.2',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'GPT 5.2 Pro',
|
|
||||||
key: 'gpt-5.2-pro',
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
name: 'o1',
|
name: 'o1',
|
||||||
key: 'o1',
|
key: 'o1',
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { Chunk } from '@/lib/types';
|
import { Chunk } from '@/lib/types';
|
||||||
import BaseEmbedding from '../../base/embedding';
|
import BaseEmbedding from '../../base/embedding';
|
||||||
import { FeatureExtractionPipeline } from '@huggingface/transformers';
|
import { FeatureExtractionPipeline, pipeline } from '@huggingface/transformers';
|
||||||
|
|
||||||
type TransformerConfig = {
|
type TransformerConfig = {
|
||||||
model: string;
|
model: string;
|
||||||
@@ -21,19 +21,21 @@ class TransformerEmbedding extends BaseEmbedding<TransformerConfig> {
|
|||||||
return this.embed(chunks.map((c) => c.content));
|
return this.embed(chunks.map((c) => c.content));
|
||||||
}
|
}
|
||||||
|
|
||||||
private async embed(texts: string[]) {
|
async embed(texts: string[]): Promise<number[][]> {
|
||||||
if (!this.pipelinePromise) {
|
if (!this.pipelinePromise) {
|
||||||
this.pipelinePromise = (async () => {
|
this.pipelinePromise = (async () => {
|
||||||
const { pipeline } = await import('@huggingface/transformers');
|
const transformers = await import('@huggingface/transformers');
|
||||||
const result = await pipeline('feature-extraction', this.config.model, {
|
return (await transformers.pipeline(
|
||||||
dtype: 'fp32',
|
'feature-extraction',
|
||||||
});
|
this.config.model,
|
||||||
return result as FeatureExtractionPipeline;
|
)) as unknown as FeatureExtractionPipeline;
|
||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
|
|
||||||
const pipe = await this.pipelinePromise;
|
const pipeline = await this.pipelinePromise;
|
||||||
const output = await pipe(texts, { pooling: 'mean', normalize: true });
|
|
||||||
|
const output = await pipeline(texts, { pooling: 'mean', normalize: true });
|
||||||
|
|
||||||
return output.tolist() as number[][];
|
return output.tolist() as number[][];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ import { ChatTurnMessage } from '@/lib/types';
|
|||||||
export const imageSearchPrompt = `
|
export const imageSearchPrompt = `
|
||||||
You will be given a conversation below and a follow up question. You need to rephrase the follow-up question so it is a standalone question that can be used by the LLM to search the web for images.
|
You will be given a conversation below and a follow up question. You need to rephrase the follow-up question so it is a standalone question that can be used by the LLM to search the web for images.
|
||||||
You need to make sure the rephrased question agrees with the conversation and is relevant to the conversation.
|
You need to make sure the rephrased question agrees with the conversation and is relevant to the conversation.
|
||||||
Make sure to make the querey standalone and not something very broad, use context from the answers in the conversation to make it specific so user can get best image search results.
|
|
||||||
Output only the rephrased query in query key JSON format. Do not include any explanation or additional text.
|
Output only the rephrased query in query key JSON format. Do not include any explanation or additional text.
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ import { ChatTurnMessage } from '@/lib/types';
|
|||||||
export const videoSearchPrompt = `
|
export const videoSearchPrompt = `
|
||||||
You will be given a conversation below and a follow up question. You need to rephrase the follow-up question so it is a standalone question that can be used by the LLM to search Youtube for videos.
|
You will be given a conversation below and a follow up question. You need to rephrase the follow-up question so it is a standalone question that can be used by the LLM to search Youtube for videos.
|
||||||
You need to make sure the rephrased question agrees with the conversation and is relevant to the conversation.
|
You need to make sure the rephrased question agrees with the conversation and is relevant to the conversation.
|
||||||
Make sure to make the querey standalone and not something very broad, use context from the answers in the conversation to make it specific so user can get best video search results.
|
|
||||||
Output only the rephrased query in query key JSON format. Do not include any explanation or additional text.
|
Output only the rephrased query in query key JSON format. Do not include any explanation or additional text.
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ import crypto from "crypto"
|
|||||||
import fs from 'fs';
|
import fs from 'fs';
|
||||||
import { splitText } from "../utils/splitText";
|
import { splitText } from "../utils/splitText";
|
||||||
import { PDFParse } from 'pdf-parse';
|
import { PDFParse } from 'pdf-parse';
|
||||||
import { CanvasFactory } from 'pdf-parse/worker';
|
|
||||||
import officeParser from 'officeparser'
|
import officeParser from 'officeparser'
|
||||||
|
import { Chunk } from "../types";
|
||||||
|
|
||||||
const supportedMimeTypes = ['application/pdf', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'text/plain'] as const
|
const supportedMimeTypes = ['application/pdf', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'text/plain'] as const
|
||||||
|
|
||||||
@@ -116,8 +116,7 @@ class UploadManager {
|
|||||||
const pdfBuffer = fs.readFileSync(filePath);
|
const pdfBuffer = fs.readFileSync(filePath);
|
||||||
|
|
||||||
const parser = new PDFParse({
|
const parser = new PDFParse({
|
||||||
data: pdfBuffer,
|
data: pdfBuffer
|
||||||
CanvasFactory
|
|
||||||
})
|
})
|
||||||
|
|
||||||
const pdfText = await parser.getText().then(res => res.text)
|
const pdfText = await parser.getText().then(res => res.text)
|
||||||
|
|||||||
72
yarn.lock
72
yarn.lock
@@ -797,11 +797,6 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.84.tgz#7b476e3003be0aca08ab27962fd0d6e803939bec"
|
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.84.tgz#7b476e3003be0aca08ab27962fd0d6e803939bec"
|
||||||
integrity sha512-pdvuqvj3qtwVryqgpAGornJLV6Ezpk39V6wT4JCnRVGy8I3Tk1au8qOalFGrx/r0Ig87hWslysPpHBxVpBMIww==
|
integrity sha512-pdvuqvj3qtwVryqgpAGornJLV6Ezpk39V6wT4JCnRVGy8I3Tk1au8qOalFGrx/r0Ig87hWslysPpHBxVpBMIww==
|
||||||
|
|
||||||
"@napi-rs/canvas-android-arm64@0.1.87":
|
|
||||||
version "0.1.87"
|
|
||||||
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.87.tgz#6adce7741baa56e75dcf72076e4bf249f9bc4b8e"
|
|
||||||
integrity sha512-uW7NxJXPvZft9fers4oBhdCsBRVe77DLQS3eXEOxndFzGKiwmjIbZpQqj4QPvrg3I0FM3UfHatz1+17P5SeCOQ==
|
|
||||||
|
|
||||||
"@napi-rs/canvas-darwin-arm64@0.1.80":
|
"@napi-rs/canvas-darwin-arm64@0.1.80":
|
||||||
version "0.1.80"
|
version "0.1.80"
|
||||||
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.80.tgz#638eaa2d0a2a373c7d15748743182718dcd95c4b"
|
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.80.tgz#638eaa2d0a2a373c7d15748743182718dcd95c4b"
|
||||||
@@ -812,11 +807,6 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.84.tgz#0f131722f9f66316cea5f5ed7cfb9ad1290683cd"
|
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.84.tgz#0f131722f9f66316cea5f5ed7cfb9ad1290683cd"
|
||||||
integrity sha512-A8IND3Hnv0R6abc6qCcCaOCujTLMmGxtucMTZ5vbQUrEN/scxi378MyTLtyWg+MRr6bwQJ6v/orqMS9datIcww==
|
integrity sha512-A8IND3Hnv0R6abc6qCcCaOCujTLMmGxtucMTZ5vbQUrEN/scxi378MyTLtyWg+MRr6bwQJ6v/orqMS9datIcww==
|
||||||
|
|
||||||
"@napi-rs/canvas-darwin-arm64@0.1.87":
|
|
||||||
version "0.1.87"
|
|
||||||
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.87.tgz#54f82dc0cd032f85e770abcddbeafc855005931a"
|
|
||||||
integrity sha512-S6YbpXwajDKLTsYftEqR+Ne1lHpeC78okI3IqctVdFexN31Taprn6mdV4CkPY/4S8eGNuReBHvXNyWbGqBZ1eQ==
|
|
||||||
|
|
||||||
"@napi-rs/canvas-darwin-x64@0.1.80":
|
"@napi-rs/canvas-darwin-x64@0.1.80":
|
||||||
version "0.1.80"
|
version "0.1.80"
|
||||||
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.80.tgz#bd6bc048dbd4b02b9620d9d07117ed93e6970978"
|
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.80.tgz#bd6bc048dbd4b02b9620d9d07117ed93e6970978"
|
||||||
@@ -827,11 +817,6 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.84.tgz#e6ab8c534172d8a8d434fa090da8a205359d8769"
|
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.84.tgz#e6ab8c534172d8a8d434fa090da8a205359d8769"
|
||||||
integrity sha512-AUW45lJhYWwnA74LaNeqhvqYKK/2hNnBBBl03KRdqeCD4tKneUSrxUqIv8d22CBweOvrAASyKN3W87WO2zEr/A==
|
integrity sha512-AUW45lJhYWwnA74LaNeqhvqYKK/2hNnBBBl03KRdqeCD4tKneUSrxUqIv8d22CBweOvrAASyKN3W87WO2zEr/A==
|
||||||
|
|
||||||
"@napi-rs/canvas-darwin-x64@0.1.87":
|
|
||||||
version "0.1.87"
|
|
||||||
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.87.tgz#54c2be73ce69a65e70f3d94fb879907479cc12c5"
|
|
||||||
integrity sha512-OJLwP2WIUmRSqWTyV/NZ2TnvBzUsbNqQu6IL7oshwfxYg4BELPV279wrfQ/xZFqzr7wybfIzKaPF4du5ZdA2Cg==
|
|
||||||
|
|
||||||
"@napi-rs/canvas-linux-arm-gnueabihf@0.1.80":
|
"@napi-rs/canvas-linux-arm-gnueabihf@0.1.80":
|
||||||
version "0.1.80"
|
version "0.1.80"
|
||||||
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.80.tgz#ce6bfbeb19d9234c42df5c384e5989aa7d734789"
|
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.80.tgz#ce6bfbeb19d9234c42df5c384e5989aa7d734789"
|
||||||
@@ -842,11 +827,6 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.84.tgz#5898daa3050a8ba4619c1d6cea3a3217d46c5ffd"
|
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.84.tgz#5898daa3050a8ba4619c1d6cea3a3217d46c5ffd"
|
||||||
integrity sha512-8zs5ZqOrdgs4FioTxSBrkl/wHZB56bJNBqaIsfPL4ZkEQCinOkrFF7xIcXiHiKp93J3wUtbIzeVrhTIaWwqk+A==
|
integrity sha512-8zs5ZqOrdgs4FioTxSBrkl/wHZB56bJNBqaIsfPL4ZkEQCinOkrFF7xIcXiHiKp93J3wUtbIzeVrhTIaWwqk+A==
|
||||||
|
|
||||||
"@napi-rs/canvas-linux-arm-gnueabihf@0.1.87":
|
|
||||||
version "0.1.87"
|
|
||||||
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.87.tgz#1bc3c9280db381cc3893c3d13d7320666ce47ebe"
|
|
||||||
integrity sha512-Io3tY6ogc+oyvIGK9rQlnfH4gKiS35P7W6s22x3WCrLFR0dXzZP2IBBoEFEHd6FY6FR1ky5u9cRmADaiLRdX3g==
|
|
||||||
|
|
||||||
"@napi-rs/canvas-linux-arm64-gnu@0.1.80":
|
"@napi-rs/canvas-linux-arm64-gnu@0.1.80":
|
||||||
version "0.1.80"
|
version "0.1.80"
|
||||||
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.80.tgz#3b7a7832fef763826fa5fb740d5757204e52607d"
|
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.80.tgz#3b7a7832fef763826fa5fb740d5757204e52607d"
|
||||||
@@ -857,11 +837,6 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.84.tgz#fbbde94c04278259f1f40b4c199dfd9f95c82e66"
|
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.84.tgz#fbbde94c04278259f1f40b4c199dfd9f95c82e66"
|
||||||
integrity sha512-i204vtowOglJUpbAFWU5mqsJgH0lVpNk/Ml4mQtB4Lndd86oF+Otr6Mr5KQnZHqYGhlSIKiU2SYnUbhO28zGQA==
|
integrity sha512-i204vtowOglJUpbAFWU5mqsJgH0lVpNk/Ml4mQtB4Lndd86oF+Otr6Mr5KQnZHqYGhlSIKiU2SYnUbhO28zGQA==
|
||||||
|
|
||||||
"@napi-rs/canvas-linux-arm64-gnu@0.1.87":
|
|
||||||
version "0.1.87"
|
|
||||||
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.87.tgz#70af2d77d58d65559a43c55f6c37906c220af39e"
|
|
||||||
integrity sha512-Zq7h/PQzs37gaSR/gNRZOAaCC1kGt6NmDjA1PcqpONITh/rAfAwAeP98emrbBJ4FDoPkYRkxmxHlmXNLlsQIBw==
|
|
||||||
|
|
||||||
"@napi-rs/canvas-linux-arm64-musl@0.1.80":
|
"@napi-rs/canvas-linux-arm64-musl@0.1.80":
|
||||||
version "0.1.80"
|
version "0.1.80"
|
||||||
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.80.tgz#d8ccd91f31d70760628623cd575134ada17690a3"
|
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.80.tgz#d8ccd91f31d70760628623cd575134ada17690a3"
|
||||||
@@ -872,11 +847,6 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.84.tgz#8b02c46c5dbb0a58de87885c61ca1681b1199697"
|
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.84.tgz#8b02c46c5dbb0a58de87885c61ca1681b1199697"
|
||||||
integrity sha512-VyZq0EEw+OILnWk7G3ZgLLPaz1ERaPP++jLjeyLMbFOF+Tr4zHzWKiKDsEV/cT7btLPZbVoR3VX+T9/QubnURQ==
|
integrity sha512-VyZq0EEw+OILnWk7G3ZgLLPaz1ERaPP++jLjeyLMbFOF+Tr4zHzWKiKDsEV/cT7btLPZbVoR3VX+T9/QubnURQ==
|
||||||
|
|
||||||
"@napi-rs/canvas-linux-arm64-musl@0.1.87":
|
|
||||||
version "0.1.87"
|
|
||||||
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.87.tgz#31355f0debf35848851be97aa1136905db9cef2a"
|
|
||||||
integrity sha512-CUa5YJjpsFcUxJbtfoQ4bqO/Rq+JU/2RfTNFxx07q1AjuDjCM8+MOOLCvVOV1z3qhl6nKAtjJT0pA0J8EbnK8Q==
|
|
||||||
|
|
||||||
"@napi-rs/canvas-linux-riscv64-gnu@0.1.80":
|
"@napi-rs/canvas-linux-riscv64-gnu@0.1.80":
|
||||||
version "0.1.80"
|
version "0.1.80"
|
||||||
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.80.tgz#927a3b859a0e3c691beaf52a19bc4736c4ffc9b8"
|
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.80.tgz#927a3b859a0e3c691beaf52a19bc4736c4ffc9b8"
|
||||||
@@ -887,11 +857,6 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.84.tgz#787c9c207f69aaa51b852c7063a6eed2985b7fca"
|
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.84.tgz#787c9c207f69aaa51b852c7063a6eed2985b7fca"
|
||||||
integrity sha512-PSMTh8DiThvLRsbtc/a065I/ceZk17EXAATv9uNvHgkgo7wdEfTh2C3aveNkBMGByVO3tvnvD5v/YFtZL07cIg==
|
integrity sha512-PSMTh8DiThvLRsbtc/a065I/ceZk17EXAATv9uNvHgkgo7wdEfTh2C3aveNkBMGByVO3tvnvD5v/YFtZL07cIg==
|
||||||
|
|
||||||
"@napi-rs/canvas-linux-riscv64-gnu@0.1.87":
|
|
||||||
version "0.1.87"
|
|
||||||
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.87.tgz#031d3d30cf667586ad742c5846a0e086c7ada950"
|
|
||||||
integrity sha512-5KM4dBFEzFMNkJV2rheIQWpd+mRZA7VNDnxTT7nsCEf6DUjUnf6Hssq9bAwjVYTe4jqraDHbWRbF4uXLBLRFJg==
|
|
||||||
|
|
||||||
"@napi-rs/canvas-linux-x64-gnu@0.1.80":
|
"@napi-rs/canvas-linux-x64-gnu@0.1.80":
|
||||||
version "0.1.80"
|
version "0.1.80"
|
||||||
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.80.tgz#25c0416bcedd6fadc15295e9afa8d9697232050c"
|
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.80.tgz#25c0416bcedd6fadc15295e9afa8d9697232050c"
|
||||||
@@ -902,11 +867,6 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.84.tgz#fb6eaea81ce679575b5004bc2177ce2d9222642b"
|
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.84.tgz#fb6eaea81ce679575b5004bc2177ce2d9222642b"
|
||||||
integrity sha512-N1GY3noO1oqgEo3rYQIwY44kfM11vA0lDbN0orTOHfCSUZTUyiYCY0nZ197QMahZBm1aR/vYgsWpV74MMMDuNA==
|
integrity sha512-N1GY3noO1oqgEo3rYQIwY44kfM11vA0lDbN0orTOHfCSUZTUyiYCY0nZ197QMahZBm1aR/vYgsWpV74MMMDuNA==
|
||||||
|
|
||||||
"@napi-rs/canvas-linux-x64-gnu@0.1.87":
|
|
||||||
version "0.1.87"
|
|
||||||
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.87.tgz#9fcc1dd2574aebe7e57797196712106665948dd0"
|
|
||||||
integrity sha512-zSv+ozz9elT5YhocyogX5LwVYURChO4QGD6CQIW6OnuNA0UOMDD/b4wDzlJiMphISy3EVTntlKFhe4W3EuKcxw==
|
|
||||||
|
|
||||||
"@napi-rs/canvas-linux-x64-musl@0.1.80":
|
"@napi-rs/canvas-linux-x64-musl@0.1.80":
|
||||||
version "0.1.80"
|
version "0.1.80"
|
||||||
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.80.tgz#de85d644e09120a60996bbe165cc2efee804551b"
|
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.80.tgz#de85d644e09120a60996bbe165cc2efee804551b"
|
||||||
@@ -917,16 +877,6 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.84.tgz#54a37352a0be7f2a7218b6f11d8ae9b5cdbb3d6c"
|
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.84.tgz#54a37352a0be7f2a7218b6f11d8ae9b5cdbb3d6c"
|
||||||
integrity sha512-vUZmua6ADqTWyHyei81aXIt9wp0yjeNwTH0KdhdeoBb6azHmFR8uKTukZMXfLCC3bnsW0t4lW7K78KNMknmtjg==
|
integrity sha512-vUZmua6ADqTWyHyei81aXIt9wp0yjeNwTH0KdhdeoBb6azHmFR8uKTukZMXfLCC3bnsW0t4lW7K78KNMknmtjg==
|
||||||
|
|
||||||
"@napi-rs/canvas-linux-x64-musl@0.1.87":
|
|
||||||
version "0.1.87"
|
|
||||||
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.87.tgz#170b7fe76f1b52a947bc287cd3c84f15d210b863"
|
|
||||||
integrity sha512-jTNmicAZQ70X+cbjZz6G6w8lmORwxRBmj/U20ECNYvcWVLshgyCKWPFL2I0Z6pkJve0vZWls6oZ15iccm1sv8w==
|
|
||||||
|
|
||||||
"@napi-rs/canvas-win32-arm64-msvc@0.1.87":
|
|
||||||
version "0.1.87"
|
|
||||||
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-win32-arm64-msvc/-/canvas-win32-arm64-msvc-0.1.87.tgz#6536946c5a1796b0781700ee6b39ac18fc0e96b2"
|
|
||||||
integrity sha512-p6J7UNAxKHYc7AL0glEtYuW/E0OLLUNnLti8dA2OT51p08Il4T7yZCl+iNo6f73HntFP+dgOHh2cTXUhmk8GuA==
|
|
||||||
|
|
||||||
"@napi-rs/canvas-win32-x64-msvc@0.1.80":
|
"@napi-rs/canvas-win32-x64-msvc@0.1.80":
|
||||||
version "0.1.80"
|
version "0.1.80"
|
||||||
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.80.tgz#6bb95885d9377912d71f1372fc1916fb54d6ef0a"
|
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.80.tgz#6bb95885d9377912d71f1372fc1916fb54d6ef0a"
|
||||||
@@ -937,11 +887,6 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.84.tgz#e0039b89f8e04287c77bd1fb5e6fa671d6c9d3c8"
|
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.84.tgz#e0039b89f8e04287c77bd1fb5e6fa671d6c9d3c8"
|
||||||
integrity sha512-YSs8ncurc1xzegUMNnQUTYrdrAuaXdPMOa+iYYyAxydOtg0ppV386hyYMsy00Yip1NlTgLCseRG4sHSnjQx6og==
|
integrity sha512-YSs8ncurc1xzegUMNnQUTYrdrAuaXdPMOa+iYYyAxydOtg0ppV386hyYMsy00Yip1NlTgLCseRG4sHSnjQx6og==
|
||||||
|
|
||||||
"@napi-rs/canvas-win32-x64-msvc@0.1.87":
|
|
||||||
version "0.1.87"
|
|
||||||
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.87.tgz#058b13a9dd3a6180bdfa976b7c8814cfb9df9c8f"
|
|
||||||
integrity sha512-WrwfETMLBRFWkGU8fXU50gCpA2eIjR4NE9JyTKl86Kz5g6SDp0CcuqS2phYtB66TI2HDUhTPbNrk4V7Qf1FOLA==
|
|
||||||
|
|
||||||
"@napi-rs/canvas@0.1.80":
|
"@napi-rs/canvas@0.1.80":
|
||||||
version "0.1.80"
|
version "0.1.80"
|
||||||
resolved "https://registry.yarnpkg.com/@napi-rs/canvas/-/canvas-0.1.80.tgz#53615bea56fd94e07331ab13caa7a39efc4914ab"
|
resolved "https://registry.yarnpkg.com/@napi-rs/canvas/-/canvas-0.1.80.tgz#53615bea56fd94e07331ab13caa7a39efc4914ab"
|
||||||
@@ -974,23 +919,6 @@
|
|||||||
"@napi-rs/canvas-linux-x64-musl" "0.1.84"
|
"@napi-rs/canvas-linux-x64-musl" "0.1.84"
|
||||||
"@napi-rs/canvas-win32-x64-msvc" "0.1.84"
|
"@napi-rs/canvas-win32-x64-msvc" "0.1.84"
|
||||||
|
|
||||||
"@napi-rs/canvas@^0.1.87":
|
|
||||||
version "0.1.87"
|
|
||||||
resolved "https://registry.yarnpkg.com/@napi-rs/canvas/-/canvas-0.1.87.tgz#028e581af4499ee4ca569eb10cb5705526fee68d"
|
|
||||||
integrity sha512-Zb5tePmPMOYBcuNW3NQaVM1sIkvIfel39euiOab/XMjC5Oc/AnPJLa/BacJcToGyIvehecS6eqcsF7i0Wqe1Sw==
|
|
||||||
optionalDependencies:
|
|
||||||
"@napi-rs/canvas-android-arm64" "0.1.87"
|
|
||||||
"@napi-rs/canvas-darwin-arm64" "0.1.87"
|
|
||||||
"@napi-rs/canvas-darwin-x64" "0.1.87"
|
|
||||||
"@napi-rs/canvas-linux-arm-gnueabihf" "0.1.87"
|
|
||||||
"@napi-rs/canvas-linux-arm64-gnu" "0.1.87"
|
|
||||||
"@napi-rs/canvas-linux-arm64-musl" "0.1.87"
|
|
||||||
"@napi-rs/canvas-linux-riscv64-gnu" "0.1.87"
|
|
||||||
"@napi-rs/canvas-linux-x64-gnu" "0.1.87"
|
|
||||||
"@napi-rs/canvas-linux-x64-musl" "0.1.87"
|
|
||||||
"@napi-rs/canvas-win32-arm64-msvc" "0.1.87"
|
|
||||||
"@napi-rs/canvas-win32-x64-msvc" "0.1.87"
|
|
||||||
|
|
||||||
"@next/env@16.0.7":
|
"@next/env@16.0.7":
|
||||||
version "16.0.7"
|
version "16.0.7"
|
||||||
resolved "https://registry.yarnpkg.com/@next/env/-/env-16.0.7.tgz#eda56377a865d890d25122257d2b8a85b81d6d3d"
|
resolved "https://registry.yarnpkg.com/@next/env/-/env-16.0.7.tgz#eda56377a865d890d25122257d2b8a85b81d6d3d"
|
||||||
|
|||||||
Reference in New Issue
Block a user