@@ -76,35 +83,73 @@ const Page = () => {
-
- {discover &&
- discover?.map((item, i) => (
-
-

-
-
- {item.title.slice(0, 100)}...
-
-
- {item.content.slice(0, 100)}...
-
-
-
- ))}
+
+ {topics.map((t, i) => (
+
setActiveTopic(t.key)}
+ >
+ {t.display}
+
+ ))}
+
+ {loading ? (
+
+ ) : (
+
+ {discover &&
+ discover?.map((item, i) => (
+
+

+
+
+ {item.title.slice(0, 100)}...
+
+
+ {item.content.slice(0, 100)}...
+
+
+
+ ))}
+
+ )}
>
);
diff --git a/src/app/globals.css b/src/app/globals.css
index f75daca..6bdc1a8 100644
--- a/src/app/globals.css
+++ b/src/app/globals.css
@@ -11,3 +11,11 @@
display: none;
}
}
+
+@media screen and (-webkit-min-device-pixel-ratio: 0) {
+ select,
+ textarea,
+ input {
+ font-size: 16px !important;
+ }
+}
diff --git a/src/app/manifest.ts b/src/app/manifest.ts
new file mode 100644
index 0000000..792e752
--- /dev/null
+++ b/src/app/manifest.ts
@@ -0,0 +1,54 @@
+import type { MetadataRoute } from 'next';
+
+export default function manifest(): MetadataRoute.Manifest {
+ return {
+ name: 'Perplexica - Chat with the internet',
+ short_name: 'Perplexica',
+ description:
+ 'Perplexica is an AI powered chatbot that is connected to the internet.',
+ start_url: '/',
+ display: 'standalone',
+ background_color: '#0a0a0a',
+ theme_color: '#0a0a0a',
+ screenshots: [
+ {
+ src: '/screenshots/p1.png',
+ form_factor: 'wide',
+ sizes: '2560x1600',
+ },
+ {
+ src: '/screenshots/p2.png',
+ form_factor: 'wide',
+ sizes: '2560x1600',
+ },
+ {
+ src: '/screenshots/p1_small.png',
+ form_factor: 'narrow',
+ sizes: '828x1792',
+ },
+ {
+ src: '/screenshots/p2_small.png',
+ form_factor: 'narrow',
+ sizes: '828x1792',
+ },
+ ],
+ icons: [
+ {
+ src: '/icon-50.png',
+ sizes: '50x50',
+ type: 'image/png' as const,
+ },
+ {
+ src: '/icon-100.png',
+ sizes: '100x100',
+ type: 'image/png',
+ },
+ {
+ src: '/icon.png',
+ sizes: '440x440',
+ type: 'image/png',
+ purpose: 'any',
+ },
+ ],
+ };
+}
diff --git a/src/app/page.tsx b/src/app/page.tsx
index e18aca9..25981b5 100644
--- a/src/app/page.tsx
+++ b/src/app/page.tsx
@@ -1,4 +1,5 @@
import ChatWindow from '@/components/ChatWindow';
+import { ChatProvider } from '@/lib/hooks/useChat';
import { Metadata } from 'next';
import { Suspense } from 'react';
@@ -11,7 +12,9 @@ const Home = () => {
return (
-
+
+
+
);
diff --git a/src/app/settings/page.tsx b/src/app/settings/page.tsx
index 6f20f01..6fb8255 100644
--- a/src/app/settings/page.tsx
+++ b/src/app/settings/page.tsx
@@ -21,8 +21,10 @@ interface SettingsType {
anthropicApiKey: string;
geminiApiKey: string;
ollamaApiUrl: string;
+ ollamaApiKey: string;
lmStudioApiUrl: string;
deepseekApiKey: string;
+ aimlApiKey: string;
customOpenaiApiKey: string;
customOpenaiApiUrl: string;
customOpenaiModelName: string;
@@ -147,6 +149,9 @@ const Page = () => {
const [automaticImageSearch, setAutomaticImageSearch] = useState(false);
const [automaticVideoSearch, setAutomaticVideoSearch] = useState(false);
const [systemInstructions, setSystemInstructions] = useState
('');
+ const [measureUnit, setMeasureUnit] = useState<'Imperial' | 'Metric'>(
+ 'Metric',
+ );
const [savingStates, setSavingStates] = useState>({});
useEffect(() => {
@@ -209,6 +214,10 @@ const Page = () => {
setSystemInstructions(localStorage.getItem('systemInstructions')!);
+ setMeasureUnit(
+ localStorage.getItem('measureUnit')! as 'Imperial' | 'Metric',
+ );
+
setIsLoading(false);
};
@@ -367,6 +376,8 @@ const Page = () => {
localStorage.setItem('embeddingModel', value);
} else if (key === 'systemInstructions') {
localStorage.setItem('systemInstructions', value);
+ } else if (key === 'measureUnit') {
+ localStorage.setItem('measureUnit', value.toString());
}
} catch (err) {
console.error('Failed to save:', err);
@@ -415,13 +426,35 @@ const Page = () => {
) : (
config && (
-
+
+
+
+ Measurement Units
+
+
@@ -515,7 +548,7 @@ const Page = () => {
+
+
+ Ollama API Key (Can be left blank)
+
+
{
+ setConfig((prev) => ({
+ ...prev!,
+ ollamaApiKey: e.target.value,
+ }));
+ }}
+ onSave={(value) => saveConfig('ollamaApiKey', value)}
+ />
+
+
GROQ API Key
@@ -862,6 +914,25 @@ const Page = () => {
/>
+
+
+ AI/ML API Key
+
+
{
+ setConfig((prev) => ({
+ ...prev!,
+ aimlApiKey: e.target.value,
+ }));
+ }}
+ onSave={(value) => saveConfig('aimlApiKey', value)}
+ />
+
+
LM Studio API URL
diff --git a/src/components/Chat.tsx b/src/components/Chat.tsx
index 0cf125b..a5d8cf9 100644
--- a/src/components/Chat.tsx
+++ b/src/components/Chat.tsx
@@ -5,28 +5,11 @@ import MessageInput from './MessageInput';
import { File, Message } from './ChatWindow';
import MessageBox from './MessageBox';
import MessageBoxLoading from './MessageBoxLoading';
+import { useChat } from '@/lib/hooks/useChat';
+
+const Chat = () => {
+ const { messages, loading, messageAppeared } = useChat();
-const Chat = ({
- loading,
- messages,
- sendMessage,
- messageAppeared,
- rewrite,
- fileIds,
- setFileIds,
- files,
- setFiles,
-}: {
- messages: Message[];
- sendMessage: (message: string) => void;
- loading: boolean;
- messageAppeared: boolean;
- rewrite: (messageId: string) => void;
- fileIds: string[];
- setFileIds: (fileIds: string[]) => void;
- files: File[];
- setFiles: (files: File[]) => void;
-}) => {
const [dividerWidth, setDividerWidth] = useState(0);
const dividerRef = useRef(null);
const messageEnd = useRef(null);
@@ -72,12 +55,8 @@ const Chat = ({
key={i}
message={msg}
messageIndex={i}
- history={messages}
- loading={loading}
dividerRef={isLast ? dividerRef : undefined}
isLast={isLast}
- rewrite={rewrite}
- sendMessage={sendMessage}
/>
{!isLast && msg.role === 'assistant' && (
@@ -92,14 +71,7 @@ const Chat = ({
className="bottom-24 lg:bottom-10 fixed z-40"
style={{ width: dividerWidth }}
>
-
+
)}
diff --git a/src/components/ChatWindow.tsx b/src/components/ChatWindow.tsx
index 93c8a0c..0d40c83 100644
--- a/src/components/ChatWindow.tsx
+++ b/src/components/ChatWindow.tsx
@@ -1,17 +1,13 @@
'use client';
-import { useEffect, useRef, useState } from 'react';
import { Document } from '@langchain/core/documents';
import Navbar from './Navbar';
import Chat from './Chat';
import EmptyChat from './EmptyChat';
-import crypto from 'crypto';
-import { toast } from 'sonner';
-import { useSearchParams } from 'next/navigation';
-import { getSuggestions } from '@/lib/actions';
import { Settings } from 'lucide-react';
import Link from 'next/link';
import NextError from 'next/error';
+import { useChat } from '@/lib/hooks/useChat';
export type Message = {
messageId: string;
@@ -29,512 +25,8 @@ export interface File {
fileId: string;
}
-interface ChatModelProvider {
- name: string;
- provider: string;
-}
-
-interface EmbeddingModelProvider {
- name: string;
- provider: string;
-}
-
-const checkConfig = async (
- setChatModelProvider: (provider: ChatModelProvider) => void,
- setEmbeddingModelProvider: (provider: EmbeddingModelProvider) => void,
- setIsConfigReady: (ready: boolean) => void,
- setHasError: (hasError: boolean) => void,
-) => {
- try {
- let chatModel = localStorage.getItem('chatModel');
- let chatModelProvider = localStorage.getItem('chatModelProvider');
- let embeddingModel = localStorage.getItem('embeddingModel');
- let embeddingModelProvider = localStorage.getItem('embeddingModelProvider');
-
- const autoImageSearch = localStorage.getItem('autoImageSearch');
- const autoVideoSearch = localStorage.getItem('autoVideoSearch');
-
- if (!autoImageSearch) {
- localStorage.setItem('autoImageSearch', 'true');
- }
-
- if (!autoVideoSearch) {
- localStorage.setItem('autoVideoSearch', 'false');
- }
-
- const providers = await fetch(`/api/models`, {
- headers: {
- 'Content-Type': 'application/json',
- },
- }).then(async (res) => {
- if (!res.ok)
- throw new Error(
- `Failed to fetch models: ${res.status} ${res.statusText}`,
- );
- return res.json();
- });
-
- if (
- !chatModel ||
- !chatModelProvider ||
- !embeddingModel ||
- !embeddingModelProvider
- ) {
- if (!chatModel || !chatModelProvider) {
- const chatModelProviders = providers.chatModelProviders;
-
- chatModelProvider =
- chatModelProvider || Object.keys(chatModelProviders)[0];
-
- chatModel = Object.keys(chatModelProviders[chatModelProvider])[0];
-
- if (!chatModelProviders || Object.keys(chatModelProviders).length === 0)
- return toast.error('No chat models available');
- }
-
- if (!embeddingModel || !embeddingModelProvider) {
- const embeddingModelProviders = providers.embeddingModelProviders;
-
- if (
- !embeddingModelProviders ||
- Object.keys(embeddingModelProviders).length === 0
- )
- return toast.error('No embedding models available');
-
- embeddingModelProvider = Object.keys(embeddingModelProviders)[0];
- embeddingModel = Object.keys(
- embeddingModelProviders[embeddingModelProvider],
- )[0];
- }
-
- localStorage.setItem('chatModel', chatModel!);
- localStorage.setItem('chatModelProvider', chatModelProvider);
- localStorage.setItem('embeddingModel', embeddingModel!);
- localStorage.setItem('embeddingModelProvider', embeddingModelProvider);
- } else {
- const chatModelProviders = providers.chatModelProviders;
- const embeddingModelProviders = providers.embeddingModelProviders;
-
- if (
- Object.keys(chatModelProviders).length > 0 &&
- !chatModelProviders[chatModelProvider]
- ) {
- const chatModelProvidersKeys = Object.keys(chatModelProviders);
- chatModelProvider =
- chatModelProvidersKeys.find(
- (key) => Object.keys(chatModelProviders[key]).length > 0,
- ) || chatModelProvidersKeys[0];
-
- localStorage.setItem('chatModelProvider', chatModelProvider);
- }
-
- if (
- chatModelProvider &&
- !chatModelProviders[chatModelProvider][chatModel]
- ) {
- chatModel = Object.keys(
- chatModelProviders[
- Object.keys(chatModelProviders[chatModelProvider]).length > 0
- ? chatModelProvider
- : Object.keys(chatModelProviders)[0]
- ],
- )[0];
- localStorage.setItem('chatModel', chatModel);
- }
-
- if (
- Object.keys(embeddingModelProviders).length > 0 &&
- !embeddingModelProviders[embeddingModelProvider]
- ) {
- embeddingModelProvider = Object.keys(embeddingModelProviders)[0];
- localStorage.setItem('embeddingModelProvider', embeddingModelProvider);
- }
-
- if (
- embeddingModelProvider &&
- !embeddingModelProviders[embeddingModelProvider][embeddingModel]
- ) {
- embeddingModel = Object.keys(
- embeddingModelProviders[embeddingModelProvider],
- )[0];
- localStorage.setItem('embeddingModel', embeddingModel);
- }
- }
-
- setChatModelProvider({
- name: chatModel!,
- provider: chatModelProvider,
- });
-
- setEmbeddingModelProvider({
- name: embeddingModel!,
- provider: embeddingModelProvider,
- });
-
- setIsConfigReady(true);
- } catch (err) {
- console.error('An error occurred while checking the configuration:', err);
- setIsConfigReady(false);
- setHasError(true);
- }
-};
-
-const loadMessages = async (
- chatId: string,
- setMessages: (messages: Message[]) => void,
- setIsMessagesLoaded: (loaded: boolean) => void,
- setChatHistory: (history: [string, string][]) => void,
- setFocusMode: (mode: string) => void,
- setNotFound: (notFound: boolean) => void,
- setFiles: (files: File[]) => void,
- setFileIds: (fileIds: string[]) => void,
-) => {
- const res = await fetch(`/api/chats/${chatId}`, {
- method: 'GET',
- headers: {
- 'Content-Type': 'application/json',
- },
- });
-
- if (res.status === 404) {
- setNotFound(true);
- setIsMessagesLoaded(true);
- return;
- }
-
- const data = await res.json();
-
- const messages = data.messages.map((msg: any) => {
- return {
- ...msg,
- ...JSON.parse(msg.metadata),
- };
- }) as Message[];
-
- setMessages(messages);
-
- const history = messages.map((msg) => {
- return [msg.role, msg.content];
- }) as [string, string][];
-
- console.debug(new Date(), 'app:messages_loaded');
-
- document.title = messages[0].content;
-
- const files = data.chat.files.map((file: any) => {
- return {
- fileName: file.name,
- fileExtension: file.name.split('.').pop(),
- fileId: file.fileId,
- };
- });
-
- setFiles(files);
- setFileIds(files.map((file: File) => file.fileId));
-
- setChatHistory(history);
- setFocusMode(data.chat.focusMode);
- setIsMessagesLoaded(true);
-};
-
-const ChatWindow = ({ id }: { id?: string }) => {
- const searchParams = useSearchParams();
- const initialMessage = searchParams.get('q');
-
- const [chatId, setChatId] = useState(id);
- const [newChatCreated, setNewChatCreated] = useState(false);
-
- const [chatModelProvider, setChatModelProvider] = useState(
- {
- name: '',
- provider: '',
- },
- );
-
- const [embeddingModelProvider, setEmbeddingModelProvider] =
- useState({
- name: '',
- provider: '',
- });
-
- const [isConfigReady, setIsConfigReady] = useState(false);
- const [hasError, setHasError] = useState(false);
- const [isReady, setIsReady] = useState(false);
-
- useEffect(() => {
- checkConfig(
- setChatModelProvider,
- setEmbeddingModelProvider,
- setIsConfigReady,
- setHasError,
- );
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, []);
-
- const [loading, setLoading] = useState(false);
- const [messageAppeared, setMessageAppeared] = useState(false);
-
- const [chatHistory, setChatHistory] = useState<[string, string][]>([]);
- const [messages, setMessages] = useState([]);
-
- const [files, setFiles] = useState([]);
- const [fileIds, setFileIds] = useState([]);
-
- const [focusMode, setFocusMode] = useState('webSearch');
- const [optimizationMode, setOptimizationMode] = useState('speed');
-
- const [isMessagesLoaded, setIsMessagesLoaded] = useState(false);
-
- const [notFound, setNotFound] = useState(false);
-
- useEffect(() => {
- if (
- chatId &&
- !newChatCreated &&
- !isMessagesLoaded &&
- messages.length === 0
- ) {
- loadMessages(
- chatId,
- setMessages,
- setIsMessagesLoaded,
- setChatHistory,
- setFocusMode,
- setNotFound,
- setFiles,
- setFileIds,
- );
- } else if (!chatId) {
- setNewChatCreated(true);
- setIsMessagesLoaded(true);
- setChatId(crypto.randomBytes(20).toString('hex'));
- }
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, []);
-
- const messagesRef = useRef([]);
-
- useEffect(() => {
- messagesRef.current = messages;
- }, [messages]);
-
- useEffect(() => {
- if (isMessagesLoaded && isConfigReady) {
- setIsReady(true);
- console.debug(new Date(), 'app:ready');
- } else {
- setIsReady(false);
- }
- }, [isMessagesLoaded, isConfigReady]);
-
- const sendMessage = async (message: string, messageId?: string) => {
- if (loading) return;
- if (!isConfigReady) {
- toast.error('Cannot send message before the configuration is ready');
- return;
- }
-
- setLoading(true);
- setMessageAppeared(false);
-
- let sources: Document[] | undefined = undefined;
- let recievedMessage = '';
- let added = false;
-
- messageId = messageId ?? crypto.randomBytes(7).toString('hex');
-
- setMessages((prevMessages) => [
- ...prevMessages,
- {
- content: message,
- messageId: messageId,
- chatId: chatId!,
- role: 'user',
- createdAt: new Date(),
- },
- ]);
-
- const messageHandler = async (data: any) => {
- if (data.type === 'error') {
- toast.error(data.data);
- setLoading(false);
- return;
- }
-
- if (data.type === 'sources') {
- sources = data.data;
- if (!added) {
- setMessages((prevMessages) => [
- ...prevMessages,
- {
- content: '',
- messageId: data.messageId,
- chatId: chatId!,
- role: 'assistant',
- sources: sources,
- createdAt: new Date(),
- },
- ]);
- added = true;
- }
- setMessageAppeared(true);
- }
-
- if (data.type === 'message') {
- if (!added) {
- setMessages((prevMessages) => [
- ...prevMessages,
- {
- content: data.data,
- messageId: data.messageId,
- chatId: chatId!,
- role: 'assistant',
- sources: sources,
- createdAt: new Date(),
- },
- ]);
- added = true;
- }
-
- setMessages((prev) =>
- prev.map((message) => {
- if (message.messageId === data.messageId) {
- return { ...message, content: message.content + data.data };
- }
-
- return message;
- }),
- );
-
- recievedMessage += data.data;
- setMessageAppeared(true);
- }
-
- if (data.type === 'messageEnd') {
- setChatHistory((prevHistory) => [
- ...prevHistory,
- ['human', message],
- ['assistant', recievedMessage],
- ]);
-
- setLoading(false);
-
- const lastMsg = messagesRef.current[messagesRef.current.length - 1];
-
- const autoImageSearch = localStorage.getItem('autoImageSearch');
- const autoVideoSearch = localStorage.getItem('autoVideoSearch');
-
- if (autoImageSearch === 'true') {
- document
- .getElementById(`search-images-${lastMsg.messageId}`)
- ?.click();
- }
-
- if (autoVideoSearch === 'true') {
- document
- .getElementById(`search-videos-${lastMsg.messageId}`)
- ?.click();
- }
-
- if (
- lastMsg.role === 'assistant' &&
- lastMsg.sources &&
- lastMsg.sources.length > 0 &&
- !lastMsg.suggestions
- ) {
- const suggestions = await getSuggestions(messagesRef.current);
- setMessages((prev) =>
- prev.map((msg) => {
- if (msg.messageId === lastMsg.messageId) {
- return { ...msg, suggestions: suggestions };
- }
- return msg;
- }),
- );
- }
- }
- };
-
- const res = await fetch('/api/chat', {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify({
- content: message,
- message: {
- messageId: messageId,
- chatId: chatId!,
- content: message,
- },
- chatId: chatId!,
- files: fileIds,
- focusMode: focusMode,
- optimizationMode: optimizationMode,
- history: chatHistory,
- chatModel: {
- name: chatModelProvider.name,
- provider: chatModelProvider.provider,
- },
- embeddingModel: {
- name: embeddingModelProvider.name,
- provider: embeddingModelProvider.provider,
- },
- systemInstructions: localStorage.getItem('systemInstructions'),
- }),
- });
-
- if (!res.body) throw new Error('No response body');
-
- const reader = res.body?.getReader();
- const decoder = new TextDecoder('utf-8');
-
- let partialChunk = '';
-
- while (true) {
- const { value, done } = await reader.read();
- if (done) break;
-
- partialChunk += decoder.decode(value, { stream: true });
-
- try {
- const messages = partialChunk.split('\n');
- for (const msg of messages) {
- if (!msg.trim()) continue;
- const json = JSON.parse(msg);
- messageHandler(json);
- }
- partialChunk = '';
- } catch (error) {
- console.warn('Incomplete JSON, waiting for next chunk...');
- }
- }
- };
-
- const rewrite = (messageId: string) => {
- const index = messages.findIndex((msg) => msg.messageId === messageId);
-
- if (index === -1) return;
-
- const message = messages[index - 1];
-
- setMessages((prev) => {
- return [...prev.slice(0, messages.length > 2 ? index - 1 : 0)];
- });
- setChatHistory((prev) => {
- return [...prev.slice(0, messages.length > 2 ? index - 1 : 0)];
- });
-
- sendMessage(message.content, message.messageId);
- };
-
- useEffect(() => {
- if (isReady && initialMessage && isConfigReady) {
- sendMessage(initialMessage);
- }
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [isConfigReady, isReady, initialMessage]);
-
+const ChatWindow = () => {
+ const { hasError, isReady, notFound, messages } = useChat();
if (hasError) {
return (
@@ -559,31 +51,11 @@ const ChatWindow = ({ id }: { id?: string }) => {
{messages.length > 0 ? (
<>
-
-
+
+
>
) : (
-
+
)}
)
diff --git a/src/components/EmptyChat.tsx b/src/components/EmptyChat.tsx
index 2a06d1d..e40a338 100644
--- a/src/components/EmptyChat.tsx
+++ b/src/components/EmptyChat.tsx
@@ -1,32 +1,11 @@
import { Settings } from 'lucide-react';
import EmptyChatMessageInput from './EmptyChatMessageInput';
-import { useEffect, useState } from 'react';
import { File } from './ChatWindow';
import Link from 'next/link';
import WeatherWidget from './WeatherWidget';
import NewsArticleWidget from './NewsArticleWidget';
-const EmptyChat = ({
- sendMessage,
- focusMode,
- setFocusMode,
- optimizationMode,
- setOptimizationMode,
- fileIds,
- setFileIds,
- files,
- setFiles,
-}: {
- sendMessage: (message: string) => void;
- focusMode: string;
- setFocusMode: (mode: string) => void;
- optimizationMode: string;
- setOptimizationMode: (mode: string) => void;
- fileIds: string[];
- setFileIds: (fileIds: string[]) => void;
- files: File[];
- setFiles: (files: File[]) => void;
-}) => {
+const EmptyChat = () => {
return (
@@ -34,26 +13,18 @@ const EmptyChat = ({
-
-
- Research begins here.
-
-
+
+
+
+ Research begins here.
+
+
+
-
+
-
diff --git a/src/components/EmptyChatMessageInput.tsx b/src/components/EmptyChatMessageInput.tsx
index 43d1e28..3c5ff6b 100644
--- a/src/components/EmptyChatMessageInput.tsx
+++ b/src/components/EmptyChatMessageInput.tsx
@@ -1,34 +1,15 @@
import { ArrowRight } from 'lucide-react';
import { useEffect, useRef, useState } from 'react';
import TextareaAutosize from 'react-textarea-autosize';
-import CopilotToggle from './MessageInputActions/Copilot';
import Focus from './MessageInputActions/Focus';
import Optimization from './MessageInputActions/Optimization';
import Attach from './MessageInputActions/Attach';
-import { File } from './ChatWindow';
+import { useChat } from '@/lib/hooks/useChat';
-const EmptyChatMessageInput = ({
- sendMessage,
- focusMode,
- setFocusMode,
- optimizationMode,
- setOptimizationMode,
- fileIds,
- setFileIds,
- files,
- setFiles,
-}: {
- sendMessage: (message: string) => void;
- focusMode: string;
- setFocusMode: (mode: string) => void;
- optimizationMode: string;
- setOptimizationMode: (mode: string) => void;
- fileIds: string[];
- setFileIds: (fileIds: string[]) => void;
- files: File[];
- setFiles: (files: File[]) => void;
-}) => {
- const [copilotEnabled, setCopilotEnabled] = useState(false);
+const EmptyChatMessageInput = () => {
+ const { sendMessage } = useChat();
+
+ /* const [copilotEnabled, setCopilotEnabled] = useState(false); */
const [message, setMessage] = useState('');
const inputRef = useRef
(null);
@@ -84,20 +65,11 @@ const EmptyChatMessageInput = ({
/>
-
+
);
diff --git a/src/components/ThinkBox.tsx b/src/components/ThinkBox.tsx
index 9c6a576..f830945 100644
--- a/src/components/ThinkBox.tsx
+++ b/src/components/ThinkBox.tsx
@@ -1,15 +1,23 @@
'use client';
-import { useState } from 'react';
-import { cn } from '@/lib/utils';
+import { useEffect, useState } from 'react';
import { ChevronDown, ChevronUp, BrainCircuit } from 'lucide-react';
interface ThinkBoxProps {
content: string;
+ thinkingEnded: boolean;
}
-const ThinkBox = ({ content }: ThinkBoxProps) => {
- const [isExpanded, setIsExpanded] = useState(false);
+const ThinkBox = ({ content, thinkingEnded }: ThinkBoxProps) => {
+ const [isExpanded, setIsExpanded] = useState(true);
+
+ useEffect(() => {
+ if (thinkingEnded) {
+ setIsExpanded(false);
+ } else {
+ setIsExpanded(true);
+ }
+ }, [thinkingEnded]);
return (
diff --git a/src/components/WeatherWidget.tsx b/src/components/WeatherWidget.tsx
index e6a631e..8eaf871 100644
--- a/src/components/WeatherWidget.tsx
+++ b/src/components/WeatherWidget.tsx
@@ -9,7 +9,10 @@ const WeatherWidget = () => {
humidity: 0,
windSpeed: 0,
icon: '',
+ temperatureUnit: 'C',
+ windSpeedUnit: 'm/s',
});
+
const [loading, setLoading] = useState(true);
useEffect(() => {
@@ -31,30 +34,40 @@ const WeatherWidget = () => {
city: string;
}) => void,
) => {
- /*
- // Geolocation doesn't give city so we'll country using ipapi for now
- if (navigator.geolocation) {
- const result = await navigator.permissions.query({
- name: 'geolocation',
- })
-
- if (result.state === 'granted') {
- navigator.geolocation.getCurrentPosition(position => {
- callback({
- latitude: position.coords.latitude,
- longitude: position.coords.longitude,
- })
- })
- } else if (result.state === 'prompt') {
- callback(await getApproxLocation())
- navigator.geolocation.getCurrentPosition(position => {})
- } else if (result.state === 'denied') {
- callback(await getApproxLocation())
- }
- } else {
- callback(await getApproxLocation())
- } */
- callback(await getApproxLocation());
+ if (navigator.geolocation) {
+ const result = await navigator.permissions.query({
+ name: 'geolocation',
+ });
+
+ if (result.state === 'granted') {
+ navigator.geolocation.getCurrentPosition(async (position) => {
+ const res = await fetch(
+ `https://api-bdc.io/data/reverse-geocode-client?latitude=${position.coords.latitude}&longitude=${position.coords.longitude}&localityLanguage=en`,
+ {
+ method: 'GET',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ },
+ );
+
+ const data = await res.json();
+
+ callback({
+ latitude: position.coords.latitude,
+ longitude: position.coords.longitude,
+ city: data.locality,
+ });
+ });
+ } else if (result.state === 'prompt') {
+ callback(await getApproxLocation());
+ navigator.geolocation.getCurrentPosition((position) => {});
+ } else if (result.state === 'denied') {
+ callback(await getApproxLocation());
+ }
+ } else {
+ callback(await getApproxLocation());
+ }
};
getLocation(async (location) => {
@@ -63,6 +76,7 @@ const WeatherWidget = () => {
body: JSON.stringify({
lat: location.latitude,
lng: location.longitude,
+ measureUnit: localStorage.getItem('measureUnit') ?? 'Metric',
}),
});
@@ -81,6 +95,8 @@ const WeatherWidget = () => {
humidity: data.humidity,
windSpeed: data.windSpeed,
icon: data.icon,
+ temperatureUnit: data.temperatureUnit,
+ windSpeedUnit: data.windSpeedUnit,
});
setLoading(false);
});
@@ -115,7 +131,7 @@ const WeatherWidget = () => {
className="h-10 w-auto"
/>
- {data.temperature}°C
+ {data.temperature}°{data.temperatureUnit}
@@ -125,7 +141,7 @@ const WeatherWidget = () => {
- {data.windSpeed} km/h
+ {data.windSpeed} {data.windSpeedUnit}
diff --git a/src/lib/chains/imageSearchAgent.ts b/src/lib/chains/imageSearchAgent.ts
index 4fd684f..a91b7bb 100644
--- a/src/lib/chains/imageSearchAgent.ts
+++ b/src/lib/chains/imageSearchAgent.ts
@@ -3,32 +3,18 @@ import {
RunnableMap,
RunnableLambda,
} from '@langchain/core/runnables';
-import { PromptTemplate } from '@langchain/core/prompts';
+import { ChatPromptTemplate } from '@langchain/core/prompts';
import formatChatHistoryAsString from '../utils/formatHistory';
import { BaseMessage } from '@langchain/core/messages';
import { StringOutputParser } from '@langchain/core/output_parsers';
import { searchSearxng } from '../searxng';
import type { BaseChatModel } from '@langchain/core/language_models/chat_models';
+import LineOutputParser from '../outputParsers/lineOutputParser';
const imageSearchChainPrompt = `
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.
-
-Example:
-1. Follow up question: What is a cat?
-Rephrased: A cat
-
-2. Follow up question: What is a car? How does it works?
-Rephrased: Car working
-
-3. Follow up question: How does an AC work?
-Rephrased: AC working
-
-Conversation:
-{chat_history}
-
-Follow up question: {query}
-Rephrased question:
+Output only the rephrased query wrapped in an XML element. Do not include any explanation or additional text.
`;
type ImageSearchChainInput = {
@@ -54,12 +40,39 @@ const createImageSearchChain = (llm: BaseChatModel) => {
return input.query;
},
}),
- PromptTemplate.fromTemplate(imageSearchChainPrompt),
+ ChatPromptTemplate.fromMessages([
+ ['system', imageSearchChainPrompt],
+ [
+ 'user',
+ '\n\n\nWhat is a cat?\n',
+ ],
+ ['assistant', 'A cat'],
+
+ [
+ 'user',
+ '\n\n\nWhat is a car? How does it work?\n',
+ ],
+ ['assistant', 'Car working'],
+ [
+ 'user',
+ '\n\n\nHow does an AC work?\n',
+ ],
+ ['assistant', 'AC working'],
+ [
+ 'user',
+ '{chat_history}\n\n{query}\n',
+ ],
+ ]),
llm,
strParser,
RunnableLambda.from(async (input: string) => {
- input = input.replace(/.*?<\/think>/g, '');
+ const queryParser = new LineOutputParser({
+ key: 'query',
+ });
+ return await queryParser.parse(input);
+ }),
+ RunnableLambda.from(async (input: string) => {
const res = await searchSearxng(input, {
engines: ['bing images', 'google images'],
});
diff --git a/src/lib/chains/videoSearchAgent.ts b/src/lib/chains/videoSearchAgent.ts
index f7cb156..3f878a8 100644
--- a/src/lib/chains/videoSearchAgent.ts
+++ b/src/lib/chains/videoSearchAgent.ts
@@ -3,33 +3,19 @@ import {
RunnableMap,
RunnableLambda,
} from '@langchain/core/runnables';
-import { PromptTemplate } from '@langchain/core/prompts';
+import { ChatPromptTemplate } from '@langchain/core/prompts';
import formatChatHistoryAsString from '../utils/formatHistory';
import { BaseMessage } from '@langchain/core/messages';
import { StringOutputParser } from '@langchain/core/output_parsers';
import { searchSearxng } from '../searxng';
import type { BaseChatModel } from '@langchain/core/language_models/chat_models';
+import LineOutputParser from '../outputParsers/lineOutputParser';
-const VideoSearchChainPrompt = `
- 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.
-
- Example:
- 1. Follow up question: How does a car work?
- Rephrased: How does a car work?
-
- 2. Follow up question: What is the theory of relativity?
- Rephrased: What is theory of relativity
-
- 3. Follow up question: How does an AC work?
- Rephrased: How does an AC work
-
- Conversation:
- {chat_history}
-
- Follow up question: {query}
- Rephrased question:
- `;
+const videoSearchChainPrompt = `
+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.
+Output only the rephrased query wrapped in an XML element. Do not include any explanation or additional text.
+`;
type VideoSearchChainInput = {
chat_history: BaseMessage[];
@@ -55,12 +41,37 @@ const createVideoSearchChain = (llm: BaseChatModel) => {
return input.query;
},
}),
- PromptTemplate.fromTemplate(VideoSearchChainPrompt),
+ ChatPromptTemplate.fromMessages([
+ ['system', videoSearchChainPrompt],
+ [
+ 'user',
+ '\n\n\nHow does a car work?\n',
+ ],
+ ['assistant', 'How does a car work?'],
+ [
+ 'user',
+ '\n\n\nWhat is the theory of relativity?\n',
+ ],
+ ['assistant', 'Theory of relativity'],
+ [
+ 'user',
+ '\n\n\nHow does an AC work?\n',
+ ],
+ ['assistant', 'AC working'],
+ [
+ 'user',
+ '{chat_history}\n\n{query}\n',
+ ],
+ ]),
llm,
strParser,
RunnableLambda.from(async (input: string) => {
- input = input.replace(/.*?<\/think>/g, '');
-
+ const queryParser = new LineOutputParser({
+ key: 'query',
+ });
+ return await queryParser.parse(input);
+ }),
+ RunnableLambda.from(async (input: string) => {
const res = await searchSearxng(input, {
engines: ['youtube'],
});
@@ -92,8 +103,8 @@ const handleVideoSearch = (
input: VideoSearchChainInput,
llm: BaseChatModel,
) => {
- const VideoSearchChain = createVideoSearchChain(llm);
- return VideoSearchChain.invoke(input);
+ const videoSearchChain = createVideoSearchChain(llm);
+ return videoSearchChain.invoke(input);
};
export default handleVideoSearch;
diff --git a/src/lib/config.ts b/src/lib/config.ts
index 78ad09c..79d69dc 100644
--- a/src/lib/config.ts
+++ b/src/lib/config.ts
@@ -31,10 +31,14 @@ interface Config {
};
OLLAMA: {
API_URL: string;
+ API_KEY: string;
};
DEEPSEEK: {
API_KEY: string;
};
+ AIMLAPI: {
+ API_KEY: string;
+ };
LM_STUDIO: {
API_URL: string;
};
@@ -83,8 +87,12 @@ export const getSearxngApiEndpoint = () =>
export const getOllamaApiEndpoint = () => loadConfig().MODELS.OLLAMA.API_URL;
+export const getOllamaApiKey = () => loadConfig().MODELS.OLLAMA.API_KEY;
+
export const getDeepseekApiKey = () => loadConfig().MODELS.DEEPSEEK.API_KEY;
+export const getAimlApiKey = () => loadConfig().MODELS.AIMLAPI.API_KEY;
+
export const getCustomOpenaiApiKey = () =>
loadConfig().MODELS.CUSTOM_OPENAI.API_KEY;
diff --git a/src/lib/hooks/useChat.tsx b/src/lib/hooks/useChat.tsx
new file mode 100644
index 0000000..573ac6b
--- /dev/null
+++ b/src/lib/hooks/useChat.tsx
@@ -0,0 +1,643 @@
+'use client';
+
+import { Message } from '@/components/ChatWindow';
+import { createContext, useContext, useEffect, useRef, useState } from 'react';
+import crypto from 'crypto';
+import { useSearchParams } from 'next/navigation';
+import { toast } from 'sonner';
+import { Document } from '@langchain/core/documents';
+import { getSuggestions } from '../actions';
+
+type ChatContext = {
+ messages: Message[];
+ chatHistory: [string, string][];
+ files: File[];
+ fileIds: string[];
+ focusMode: string;
+ chatId: string | undefined;
+ optimizationMode: string;
+ isMessagesLoaded: boolean;
+ loading: boolean;
+ notFound: boolean;
+ messageAppeared: boolean;
+ isReady: boolean;
+ hasError: boolean;
+ setOptimizationMode: (mode: string) => void;
+ setFocusMode: (mode: string) => void;
+ setFiles: (files: File[]) => void;
+ setFileIds: (fileIds: string[]) => void;
+ sendMessage: (
+ message: string,
+ messageId?: string,
+ rewrite?: boolean,
+ ) => Promise;
+ rewrite: (messageId: string) => void;
+};
+
+export interface File {
+ fileName: string;
+ fileExtension: string;
+ fileId: string;
+}
+
+interface ChatModelProvider {
+ name: string;
+ provider: string;
+}
+
+interface EmbeddingModelProvider {
+ name: string;
+ provider: string;
+}
+
+const checkConfig = async (
+ setChatModelProvider: (provider: ChatModelProvider) => void,
+ setEmbeddingModelProvider: (provider: EmbeddingModelProvider) => void,
+ setIsConfigReady: (ready: boolean) => void,
+ setHasError: (hasError: boolean) => void,
+) => {
+ try {
+ let chatModel = localStorage.getItem('chatModel');
+ let chatModelProvider = localStorage.getItem('chatModelProvider');
+ let embeddingModel = localStorage.getItem('embeddingModel');
+ let embeddingModelProvider = localStorage.getItem('embeddingModelProvider');
+
+ const autoImageSearch = localStorage.getItem('autoImageSearch');
+ const autoVideoSearch = localStorage.getItem('autoVideoSearch');
+
+ if (!autoImageSearch) {
+ localStorage.setItem('autoImageSearch', 'true');
+ }
+
+ if (!autoVideoSearch) {
+ localStorage.setItem('autoVideoSearch', 'false');
+ }
+
+ const providers = await fetch(`/api/models`, {
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ }).then(async (res) => {
+ if (!res.ok)
+ throw new Error(
+ `Failed to fetch models: ${res.status} ${res.statusText}`,
+ );
+ return res.json();
+ });
+
+ if (
+ !chatModel ||
+ !chatModelProvider ||
+ !embeddingModel ||
+ !embeddingModelProvider
+ ) {
+ if (!chatModel || !chatModelProvider) {
+ const chatModelProviders = providers.chatModelProviders;
+ const chatModelProvidersKeys = Object.keys(chatModelProviders);
+
+ if (!chatModelProviders || chatModelProvidersKeys.length === 0) {
+ return toast.error('No chat models available');
+ } else {
+ chatModelProvider =
+ chatModelProvidersKeys.find(
+ (provider) =>
+ Object.keys(chatModelProviders[provider]).length > 0,
+ ) || chatModelProvidersKeys[0];
+ }
+
+ if (
+ chatModelProvider === 'custom_openai' &&
+ Object.keys(chatModelProviders[chatModelProvider]).length === 0
+ ) {
+ toast.error(
+ "Looks like you haven't configured any chat model providers. Please configure them from the settings page or the config file.",
+ );
+ return setHasError(true);
+ }
+
+ chatModel = Object.keys(chatModelProviders[chatModelProvider])[0];
+ }
+
+ if (!embeddingModel || !embeddingModelProvider) {
+ const embeddingModelProviders = providers.embeddingModelProviders;
+
+ if (
+ !embeddingModelProviders ||
+ Object.keys(embeddingModelProviders).length === 0
+ )
+ return toast.error('No embedding models available');
+
+ embeddingModelProvider = Object.keys(embeddingModelProviders)[0];
+ embeddingModel = Object.keys(
+ embeddingModelProviders[embeddingModelProvider],
+ )[0];
+ }
+
+ localStorage.setItem('chatModel', chatModel!);
+ localStorage.setItem('chatModelProvider', chatModelProvider);
+ localStorage.setItem('embeddingModel', embeddingModel!);
+ localStorage.setItem('embeddingModelProvider', embeddingModelProvider);
+ } else {
+ const chatModelProviders = providers.chatModelProviders;
+ const embeddingModelProviders = providers.embeddingModelProviders;
+
+ if (
+ Object.keys(chatModelProviders).length > 0 &&
+ (!chatModelProviders[chatModelProvider] ||
+ Object.keys(chatModelProviders[chatModelProvider]).length === 0)
+ ) {
+ const chatModelProvidersKeys = Object.keys(chatModelProviders);
+ chatModelProvider =
+ chatModelProvidersKeys.find(
+ (key) => Object.keys(chatModelProviders[key]).length > 0,
+ ) || chatModelProvidersKeys[0];
+
+ localStorage.setItem('chatModelProvider', chatModelProvider);
+ }
+
+ if (
+ chatModelProvider &&
+ !chatModelProviders[chatModelProvider][chatModel]
+ ) {
+ if (
+ chatModelProvider === 'custom_openai' &&
+ Object.keys(chatModelProviders[chatModelProvider]).length === 0
+ ) {
+ toast.error(
+ "Looks like you haven't configured any chat model providers. Please configure them from the settings page or the config file.",
+ );
+ return setHasError(true);
+ }
+
+ chatModel = Object.keys(
+ chatModelProviders[
+ Object.keys(chatModelProviders[chatModelProvider]).length > 0
+ ? chatModelProvider
+ : Object.keys(chatModelProviders)[0]
+ ],
+ )[0];
+
+ localStorage.setItem('chatModel', chatModel);
+ }
+
+ if (
+ Object.keys(embeddingModelProviders).length > 0 &&
+ !embeddingModelProviders[embeddingModelProvider]
+ ) {
+ embeddingModelProvider = Object.keys(embeddingModelProviders)[0];
+ localStorage.setItem('embeddingModelProvider', embeddingModelProvider);
+ }
+
+ if (
+ embeddingModelProvider &&
+ !embeddingModelProviders[embeddingModelProvider][embeddingModel]
+ ) {
+ embeddingModel = Object.keys(
+ embeddingModelProviders[embeddingModelProvider],
+ )[0];
+ localStorage.setItem('embeddingModel', embeddingModel);
+ }
+ }
+
+ setChatModelProvider({
+ name: chatModel!,
+ provider: chatModelProvider,
+ });
+
+ setEmbeddingModelProvider({
+ name: embeddingModel!,
+ provider: embeddingModelProvider,
+ });
+
+ setIsConfigReady(true);
+ } catch (err) {
+ console.error('An error occurred while checking the configuration:', err);
+ setIsConfigReady(false);
+ setHasError(true);
+ }
+};
+
+const loadMessages = async (
+ chatId: string,
+ setMessages: (messages: Message[]) => void,
+ setIsMessagesLoaded: (loaded: boolean) => void,
+ setChatHistory: (history: [string, string][]) => void,
+ setFocusMode: (mode: string) => void,
+ setNotFound: (notFound: boolean) => void,
+ setFiles: (files: File[]) => void,
+ setFileIds: (fileIds: string[]) => void,
+) => {
+ const res = await fetch(`/api/chats/${chatId}`, {
+ method: 'GET',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ });
+
+ if (res.status === 404) {
+ setNotFound(true);
+ setIsMessagesLoaded(true);
+ return;
+ }
+
+ const data = await res.json();
+
+ const messages = data.messages.map((msg: any) => {
+ return {
+ ...msg,
+ ...JSON.parse(msg.metadata),
+ };
+ }) as Message[];
+
+ setMessages(messages);
+
+ const history = messages.map((msg) => {
+ return [msg.role, msg.content];
+ }) as [string, string][];
+
+ console.debug(new Date(), 'app:messages_loaded');
+
+ document.title = messages[0].content;
+
+ const files = data.chat.files.map((file: any) => {
+ return {
+ fileName: file.name,
+ fileExtension: file.name.split('.').pop(),
+ fileId: file.fileId,
+ };
+ });
+
+ setFiles(files);
+ setFileIds(files.map((file: File) => file.fileId));
+
+ setChatHistory(history);
+ setFocusMode(data.chat.focusMode);
+ setIsMessagesLoaded(true);
+};
+
+export const chatContext = createContext({
+ chatHistory: [],
+ chatId: '',
+ fileIds: [],
+ files: [],
+ focusMode: '',
+ hasError: false,
+ isMessagesLoaded: false,
+ isReady: false,
+ loading: false,
+ messageAppeared: false,
+ messages: [],
+ notFound: false,
+ optimizationMode: '',
+ rewrite: () => {},
+ sendMessage: async () => {},
+ setFileIds: () => {},
+ setFiles: () => {},
+ setFocusMode: () => {},
+ setOptimizationMode: () => {},
+});
+
+export const ChatProvider = ({
+ children,
+ id,
+}: {
+ children: React.ReactNode;
+ id?: string;
+}) => {
+ const searchParams = useSearchParams();
+ const initialMessage = searchParams.get('q');
+
+ const [chatId, setChatId] = useState(id);
+ const [newChatCreated, setNewChatCreated] = useState(false);
+
+ const [loading, setLoading] = useState(false);
+ const [messageAppeared, setMessageAppeared] = useState(false);
+
+ const [chatHistory, setChatHistory] = useState<[string, string][]>([]);
+ const [messages, setMessages] = useState([]);
+
+ const [files, setFiles] = useState([]);
+ const [fileIds, setFileIds] = useState([]);
+
+ const [focusMode, setFocusMode] = useState('webSearch');
+ const [optimizationMode, setOptimizationMode] = useState('speed');
+
+ const [isMessagesLoaded, setIsMessagesLoaded] = useState(false);
+
+ const [notFound, setNotFound] = useState(false);
+
+ const [chatModelProvider, setChatModelProvider] = useState(
+ {
+ name: '',
+ provider: '',
+ },
+ );
+
+ const [embeddingModelProvider, setEmbeddingModelProvider] =
+ useState({
+ name: '',
+ provider: '',
+ });
+
+ const [isConfigReady, setIsConfigReady] = useState(false);
+ const [hasError, setHasError] = useState(false);
+ const [isReady, setIsReady] = useState(false);
+
+ const messagesRef = useRef([]);
+
+ useEffect(() => {
+ checkConfig(
+ setChatModelProvider,
+ setEmbeddingModelProvider,
+ setIsConfigReady,
+ setHasError,
+ );
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, []);
+
+ useEffect(() => {
+ if (
+ chatId &&
+ !newChatCreated &&
+ !isMessagesLoaded &&
+ messages.length === 0
+ ) {
+ loadMessages(
+ chatId,
+ setMessages,
+ setIsMessagesLoaded,
+ setChatHistory,
+ setFocusMode,
+ setNotFound,
+ setFiles,
+ setFileIds,
+ );
+ } else if (!chatId) {
+ setNewChatCreated(true);
+ setIsMessagesLoaded(true);
+ setChatId(crypto.randomBytes(20).toString('hex'));
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, []);
+
+ useEffect(() => {
+ messagesRef.current = messages;
+ }, [messages]);
+
+ useEffect(() => {
+ if (isMessagesLoaded && isConfigReady) {
+ setIsReady(true);
+ console.debug(new Date(), 'app:ready');
+ } else {
+ setIsReady(false);
+ }
+ }, [isMessagesLoaded, isConfigReady]);
+
+ const rewrite = (messageId: string) => {
+ const index = messages.findIndex((msg) => msg.messageId === messageId);
+
+ if (index === -1) return;
+
+ const message = messages[index - 1];
+
+ setMessages((prev) => {
+ return [...prev.slice(0, messages.length > 2 ? index - 1 : 0)];
+ });
+ setChatHistory((prev) => {
+ return [...prev.slice(0, messages.length > 2 ? index - 1 : 0)];
+ });
+
+ sendMessage(message.content, message.messageId, true);
+ };
+
+ useEffect(() => {
+ if (isReady && initialMessage && isConfigReady) {
+ if (!isConfigReady) {
+ toast.error('Cannot send message before the configuration is ready');
+ return;
+ }
+ sendMessage(initialMessage);
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [isConfigReady, isReady, initialMessage]);
+
+ const sendMessage: ChatContext['sendMessage'] = async (
+ message,
+ messageId,
+ rewrite = false,
+ ) => {
+ if (loading) return;
+ setLoading(true);
+ setMessageAppeared(false);
+
+ let sources: Document[] | undefined = undefined;
+ let recievedMessage = '';
+ let added = false;
+
+ messageId = messageId ?? crypto.randomBytes(7).toString('hex');
+
+ setMessages((prevMessages) => [
+ ...prevMessages,
+ {
+ content: message,
+ messageId: messageId,
+ chatId: chatId!,
+ role: 'user',
+ createdAt: new Date(),
+ },
+ ]);
+
+ const messageHandler = async (data: any) => {
+ if (data.type === 'error') {
+ toast.error(data.data);
+ setLoading(false);
+ return;
+ }
+
+ if (data.type === 'sources') {
+ sources = data.data;
+ if (!added) {
+ setMessages((prevMessages) => [
+ ...prevMessages,
+ {
+ content: '',
+ messageId: data.messageId,
+ chatId: chatId!,
+ role: 'assistant',
+ sources: sources,
+ createdAt: new Date(),
+ },
+ ]);
+ added = true;
+ }
+ setMessageAppeared(true);
+ }
+
+ if (data.type === 'message') {
+ if (!added) {
+ setMessages((prevMessages) => [
+ ...prevMessages,
+ {
+ content: data.data,
+ messageId: data.messageId,
+ chatId: chatId!,
+ role: 'assistant',
+ sources: sources,
+ createdAt: new Date(),
+ },
+ ]);
+ added = true;
+ }
+
+ setMessages((prev) =>
+ prev.map((message) => {
+ if (message.messageId === data.messageId) {
+ return { ...message, content: message.content + data.data };
+ }
+
+ return message;
+ }),
+ );
+
+ recievedMessage += data.data;
+ setMessageAppeared(true);
+ }
+
+ if (data.type === 'messageEnd') {
+ setChatHistory((prevHistory) => [
+ ...prevHistory,
+ ['human', message],
+ ['assistant', recievedMessage],
+ ]);
+
+ setLoading(false);
+
+ const lastMsg = messagesRef.current[messagesRef.current.length - 1];
+
+ const autoImageSearch = localStorage.getItem('autoImageSearch');
+ const autoVideoSearch = localStorage.getItem('autoVideoSearch');
+
+ if (autoImageSearch === 'true') {
+ document
+ .getElementById(`search-images-${lastMsg.messageId}`)
+ ?.click();
+ }
+
+ if (autoVideoSearch === 'true') {
+ document
+ .getElementById(`search-videos-${lastMsg.messageId}`)
+ ?.click();
+ }
+
+ if (
+ lastMsg.role === 'assistant' &&
+ lastMsg.sources &&
+ lastMsg.sources.length > 0 &&
+ !lastMsg.suggestions
+ ) {
+ const suggestions = await getSuggestions(messagesRef.current);
+ setMessages((prev) =>
+ prev.map((msg) => {
+ if (msg.messageId === lastMsg.messageId) {
+ return { ...msg, suggestions: suggestions };
+ }
+ return msg;
+ }),
+ );
+ }
+ }
+ };
+
+ const messageIndex = messages.findIndex((m) => m.messageId === messageId);
+
+ const res = await fetch('/api/chat', {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify({
+ content: message,
+ message: {
+ messageId: messageId,
+ chatId: chatId!,
+ content: message,
+ },
+ chatId: chatId!,
+ files: fileIds,
+ focusMode: focusMode,
+ optimizationMode: optimizationMode,
+ history: rewrite
+ ? chatHistory.slice(0, messageIndex === -1 ? undefined : messageIndex)
+ : chatHistory,
+ chatModel: {
+ name: chatModelProvider.name,
+ provider: chatModelProvider.provider,
+ },
+ embeddingModel: {
+ name: embeddingModelProvider.name,
+ provider: embeddingModelProvider.provider,
+ },
+ systemInstructions: localStorage.getItem('systemInstructions'),
+ }),
+ });
+
+ if (!res.body) throw new Error('No response body');
+
+ const reader = res.body?.getReader();
+ const decoder = new TextDecoder('utf-8');
+
+ let partialChunk = '';
+
+ while (true) {
+ const { value, done } = await reader.read();
+ if (done) break;
+
+ partialChunk += decoder.decode(value, { stream: true });
+
+ try {
+ const messages = partialChunk.split('\n');
+ for (const msg of messages) {
+ if (!msg.trim()) continue;
+ const json = JSON.parse(msg);
+ messageHandler(json);
+ }
+ partialChunk = '';
+ } catch (error) {
+ console.warn('Incomplete JSON, waiting for next chunk...');
+ }
+ }
+ };
+
+ return (
+
+ {children}
+
+ );
+};
+
+export const useChat = () => {
+ const ctx = useContext(chatContext);
+ return ctx;
+};
diff --git a/src/lib/providers/aimlapi.ts b/src/lib/providers/aimlapi.ts
new file mode 100644
index 0000000..9c982fe
--- /dev/null
+++ b/src/lib/providers/aimlapi.ts
@@ -0,0 +1,94 @@
+import { ChatOpenAI, OpenAIEmbeddings } from '@langchain/openai';
+import { getAimlApiKey } from '../config';
+import { ChatModel, EmbeddingModel } from '.';
+import { BaseChatModel } from '@langchain/core/language_models/chat_models';
+import { Embeddings } from '@langchain/core/embeddings';
+import axios from 'axios';
+
+export const PROVIDER_INFO = {
+ key: 'aimlapi',
+ displayName: 'AI/ML API',
+};
+
+interface AimlApiModel {
+ id: string;
+ name?: string;
+ type?: string;
+}
+
+const API_URL = 'https://api.aimlapi.com';
+
+export const loadAimlApiChatModels = async () => {
+ const apiKey = getAimlApiKey();
+
+ if (!apiKey) return {};
+
+ try {
+ const response = await axios.get(`${API_URL}/models`, {
+ headers: {
+ 'Content-Type': 'application/json',
+ Authorization: `Bearer ${apiKey}`,
+ },
+ });
+
+ const chatModels: Record = {};
+
+ response.data.data.forEach((model: AimlApiModel) => {
+ if (model.type === 'chat-completion') {
+ chatModels[model.id] = {
+ displayName: model.name || model.id,
+ model: new ChatOpenAI({
+ apiKey: apiKey,
+ modelName: model.id,
+ temperature: 0.7,
+ configuration: {
+ baseURL: API_URL,
+ },
+ }) as unknown as BaseChatModel,
+ };
+ }
+ });
+
+ return chatModels;
+ } catch (err) {
+ console.error(`Error loading AI/ML API models: ${err}`);
+ return {};
+ }
+};
+
+export const loadAimlApiEmbeddingModels = async () => {
+ const apiKey = getAimlApiKey();
+
+ if (!apiKey) return {};
+
+ try {
+ const response = await axios.get(`${API_URL}/models`, {
+ headers: {
+ 'Content-Type': 'application/json',
+ Authorization: `Bearer ${apiKey}`,
+ },
+ });
+
+ const embeddingModels: Record = {};
+
+ response.data.data.forEach((model: AimlApiModel) => {
+ if (model.type === 'embedding') {
+ embeddingModels[model.id] = {
+ displayName: model.name || model.id,
+ model: new OpenAIEmbeddings({
+ apiKey: apiKey,
+ modelName: model.id,
+ configuration: {
+ baseURL: API_URL,
+ },
+ }) as unknown as Embeddings,
+ };
+ }
+ });
+
+ return embeddingModels;
+ } catch (err) {
+ console.error(`Error loading AI/ML API embeddings models: ${err}`);
+ return {};
+ }
+};
diff --git a/src/lib/providers/anthropic.ts b/src/lib/providers/anthropic.ts
index 2b0f2cc..6af2115 100644
--- a/src/lib/providers/anthropic.ts
+++ b/src/lib/providers/anthropic.ts
@@ -9,6 +9,18 @@ export const PROVIDER_INFO = {
import { BaseChatModel } from '@langchain/core/language_models/chat_models';
const anthropicChatModels: Record[] = [
+ {
+ displayName: 'Claude 4.1 Opus',
+ key: 'claude-opus-4-1-20250805',
+ },
+ {
+ displayName: 'Claude 4 Opus',
+ key: 'claude-opus-4-20250514',
+ },
+ {
+ displayName: 'Claude 4 Sonnet',
+ key: 'claude-sonnet-4-20250514',
+ },
{
displayName: 'Claude 3.7 Sonnet',
key: 'claude-3-7-sonnet-20250219',
diff --git a/src/lib/providers/deepseek.ts b/src/lib/providers/deepseek.ts
index 46f2398..9c9ef5a 100644
--- a/src/lib/providers/deepseek.ts
+++ b/src/lib/providers/deepseek.ts
@@ -31,7 +31,7 @@ export const loadDeepseekChatModels = async () => {
chatModels[model.key] = {
displayName: model.displayName,
model: new ChatOpenAI({
- openAIApiKey: deepseekApiKey,
+ apiKey: deepseekApiKey,
modelName: model.key,
temperature: 0.7,
configuration: {
diff --git a/src/lib/providers/gemini.ts b/src/lib/providers/gemini.ts
index 6cf2243..418e0a4 100644
--- a/src/lib/providers/gemini.ts
+++ b/src/lib/providers/gemini.ts
@@ -14,8 +14,16 @@ import { Embeddings } from '@langchain/core/embeddings';
const geminiChatModels: Record[] = [
{
- displayName: 'Gemini 2.5 Pro Experimental',
- key: 'gemini-2.5-pro-exp-03-25',
+ displayName: 'Gemini 2.5 Flash',
+ key: 'gemini-2.5-flash',
+ },
+ {
+ displayName: 'Gemini 2.5 Flash-Lite',
+ key: 'gemini-2.5-flash-lite',
+ },
+ {
+ displayName: 'Gemini 2.5 Pro',
+ key: 'gemini-2.5-pro',
},
{
displayName: 'Gemini 2.0 Flash',
@@ -67,7 +75,7 @@ export const loadGeminiChatModels = async () => {
displayName: model.displayName,
model: new ChatGoogleGenerativeAI({
apiKey: geminiApiKey,
- modelName: model.key,
+ model: model.key,
temperature: 0.7,
}) as unknown as BaseChatModel,
};
@@ -100,7 +108,7 @@ export const loadGeminiEmbeddingModels = async () => {
return embeddingModels;
} catch (err) {
- console.error(`Error loading OpenAI embeddings models: ${err}`);
+ console.error(`Error loading Gemini embeddings models: ${err}`);
return {};
}
};
diff --git a/src/lib/providers/groq.ts b/src/lib/providers/groq.ts
index 5435de4..4e7db51 100644
--- a/src/lib/providers/groq.ts
+++ b/src/lib/providers/groq.ts
@@ -1,4 +1,4 @@
-import { ChatOpenAI } from '@langchain/openai';
+import { ChatGroq } from '@langchain/groq';
import { getGroqApiKey } from '../config';
import { ChatModel } from '.';
@@ -28,13 +28,10 @@ export const loadGroqChatModels = async () => {
groqChatModels.forEach((model: any) => {
chatModels[model.id] = {
displayName: model.id,
- model: new ChatOpenAI({
- openAIApiKey: groqApiKey,
- modelName: model.id,
+ model: new ChatGroq({
+ apiKey: groqApiKey,
+ model: model.id,
temperature: 0.7,
- configuration: {
- baseURL: 'https://api.groq.com/openai/v1',
- },
}) as unknown as BaseChatModel,
};
});
diff --git a/src/lib/providers/index.ts b/src/lib/providers/index.ts
index e536431..1b6bb2f 100644
--- a/src/lib/providers/index.ts
+++ b/src/lib/providers/index.ts
@@ -35,6 +35,11 @@ import {
loadDeepseekChatModels,
PROVIDER_INFO as DeepseekInfo,
} from './deepseek';
+import {
+ loadAimlApiChatModels,
+ loadAimlApiEmbeddingModels,
+ PROVIDER_INFO as AimlApiInfo,
+} from './aimlapi';
import {
loadLMStudioChatModels,
loadLMStudioEmbeddingsModels,
@@ -49,6 +54,7 @@ export const PROVIDER_METADATA = {
gemini: GeminiInfo,
transformers: TransformersInfo,
deepseek: DeepseekInfo,
+ aimlapi: AimlApiInfo,
lmstudio: LMStudioInfo,
custom_openai: {
key: 'custom_openai',
@@ -76,6 +82,7 @@ export const chatModelProviders: Record<
anthropic: loadAnthropicChatModels,
gemini: loadGeminiChatModels,
deepseek: loadDeepseekChatModels,
+ aimlapi: loadAimlApiChatModels,
lmstudio: loadLMStudioChatModels,
};
@@ -87,6 +94,7 @@ export const embeddingModelProviders: Record<
ollama: loadOllamaEmbeddingModels,
gemini: loadGeminiEmbeddingModels,
transformers: loadTransformersEmbeddingsModels,
+ aimlapi: loadAimlApiEmbeddingModels,
lmstudio: loadLMStudioEmbeddingsModels,
};
@@ -110,7 +118,7 @@ export const getAvailableChatModelProviders = async () => {
[customOpenAiModelName]: {
displayName: customOpenAiModelName,
model: new ChatOpenAI({
- openAIApiKey: customOpenAiApiKey,
+ apiKey: customOpenAiApiKey,
modelName: customOpenAiModelName,
temperature: 0.7,
configuration: {
diff --git a/src/lib/providers/lmstudio.ts b/src/lib/providers/lmstudio.ts
index 811208f..f79c0aa 100644
--- a/src/lib/providers/lmstudio.ts
+++ b/src/lib/providers/lmstudio.ts
@@ -47,7 +47,7 @@ export const loadLMStudioChatModels = async () => {
chatModels[model.id] = {
displayName: model.name || model.id,
model: new ChatOpenAI({
- openAIApiKey: 'lm-studio',
+ apiKey: 'lm-studio',
configuration: {
baseURL: ensureV1Endpoint(endpoint),
},
@@ -83,7 +83,7 @@ export const loadLMStudioEmbeddingsModels = async () => {
embeddingsModels[model.id] = {
displayName: model.name || model.id,
model: new OpenAIEmbeddings({
- openAIApiKey: 'lm-studio',
+ apiKey: 'lm-studio',
configuration: {
baseURL: ensureV1Endpoint(endpoint),
},
diff --git a/src/lib/providers/ollama.ts b/src/lib/providers/ollama.ts
index cca2142..cb0b848 100644
--- a/src/lib/providers/ollama.ts
+++ b/src/lib/providers/ollama.ts
@@ -1,16 +1,17 @@
import axios from 'axios';
-import { getKeepAlive, getOllamaApiEndpoint } from '../config';
+import { getKeepAlive, getOllamaApiEndpoint, getOllamaApiKey } from '../config';
import { ChatModel, EmbeddingModel } from '.';
export const PROVIDER_INFO = {
key: 'ollama',
displayName: 'Ollama',
};
-import { ChatOllama } from '@langchain/community/chat_models/ollama';
-import { OllamaEmbeddings } from '@langchain/community/embeddings/ollama';
+import { ChatOllama } from '@langchain/ollama';
+import { OllamaEmbeddings } from '@langchain/ollama';
export const loadOllamaChatModels = async () => {
const ollamaApiEndpoint = getOllamaApiEndpoint();
+ const ollamaApiKey = getOllamaApiKey();
if (!ollamaApiEndpoint) return {};
@@ -33,6 +34,9 @@ export const loadOllamaChatModels = async () => {
model: model.model,
temperature: 0.7,
keepAlive: getKeepAlive(),
+ ...(ollamaApiKey
+ ? { headers: { Authorization: `Bearer ${ollamaApiKey}` } }
+ : {}),
}),
};
});
@@ -46,6 +50,7 @@ export const loadOllamaChatModels = async () => {
export const loadOllamaEmbeddingModels = async () => {
const ollamaApiEndpoint = getOllamaApiEndpoint();
+ const ollamaApiKey = getOllamaApiKey();
if (!ollamaApiEndpoint) return {};
@@ -66,6 +71,9 @@ export const loadOllamaEmbeddingModels = async () => {
model: new OllamaEmbeddings({
baseUrl: ollamaApiEndpoint,
model: model.model,
+ ...(ollamaApiKey
+ ? { headers: { Authorization: `Bearer ${ollamaApiKey}` } }
+ : {}),
}),
};
});
diff --git a/src/lib/providers/openai.ts b/src/lib/providers/openai.ts
index e68e574..7e26763 100644
--- a/src/lib/providers/openai.ts
+++ b/src/lib/providers/openai.ts
@@ -42,6 +42,18 @@ const openaiChatModels: Record[] = [
displayName: 'GPT 4.1',
key: 'gpt-4.1',
},
+ {
+ displayName: 'GPT 5 nano',
+ key: 'gpt-5-nano',
+ },
+ {
+ displayName: 'GPT 5 mini',
+ key: 'gpt-5-mini',
+ },
+ {
+ displayName: 'GPT 5',
+ key: 'gpt-5',
+ },
];
const openaiEmbeddingModels: Record[] = [
@@ -67,9 +79,9 @@ export const loadOpenAIChatModels = async () => {
chatModels[model.key] = {
displayName: model.displayName,
model: new ChatOpenAI({
- openAIApiKey: openaiApiKey,
+ apiKey: openaiApiKey,
modelName: model.key,
- temperature: 0.7,
+ temperature: model.key.includes('gpt-5') ? 1 : 0.7,
}) as unknown as BaseChatModel,
};
});
@@ -93,7 +105,7 @@ export const loadOpenAIEmbeddingModels = async () => {
embeddingModels[model.key] = {
displayName: model.displayName,
model: new OpenAIEmbeddings({
- openAIApiKey: openaiApiKey,
+ apiKey: openaiApiKey,
modelName: model.key,
}) as unknown as Embeddings,
};
diff --git a/src/lib/utils/formatHistory.ts b/src/lib/utils/formatHistory.ts
index 6d0d309..733ffc0 100644
--- a/src/lib/utils/formatHistory.ts
+++ b/src/lib/utils/formatHistory.ts
@@ -1,8 +1,11 @@
-import { BaseMessage } from '@langchain/core/messages';
+import { BaseMessage, isAIMessage } from '@langchain/core/messages';
const formatChatHistoryAsString = (history: BaseMessage[]) => {
return history
- .map((message) => `${message._getType()}: ${message.content}`)
+ .map(
+ (message) =>
+ `${isAIMessage(message) ? 'AI' : 'User'}: ${message.content}`,
+ )
.join('\n');
};
diff --git a/yarn.lock b/yarn.lock
index f2b847c..8a6859a 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -12,33 +12,10 @@
resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30"
integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==
-"@anthropic-ai/sdk@^0.37.0":
- version "0.37.0"
- resolved "https://registry.yarnpkg.com/@anthropic-ai/sdk/-/sdk-0.37.0.tgz#0018127404ecb9b8a12968068e0c4b3e8bbd6386"
- integrity sha512-tHjX2YbkUBwEgg0JZU3EFSSAQPoK4qQR/NFYa8Vtzd5UAyXzZksCw2In69Rml4R/TyHPBfRYaLK35XiOe33pjw==
- dependencies:
- "@types/node" "^18.11.18"
- "@types/node-fetch" "^2.6.4"
- abort-controller "^3.0.0"
- agentkeepalive "^4.2.1"
- form-data-encoder "1.7.2"
- formdata-node "^4.3.2"
- node-fetch "^2.6.7"
-
-"@anthropic-ai/sdk@^0.9.1":
- version "0.9.1"
- resolved "https://registry.yarnpkg.com/@anthropic-ai/sdk/-/sdk-0.9.1.tgz#b2d2b7bf05c90dce502c9a2e869066870f69ba88"
- integrity sha512-wa1meQ2WSfoY8Uor3EdrJq0jTiZJoKoSii2ZVWRY1oN4Tlr5s59pADg9T79FTbPe1/se5c3pBeZgJL63wmuoBA==
- dependencies:
- "@types/node" "^18.11.18"
- "@types/node-fetch" "^2.6.4"
- abort-controller "^3.0.0"
- agentkeepalive "^4.2.1"
- digest-fetch "^1.3.0"
- form-data-encoder "1.7.2"
- formdata-node "^4.3.2"
- node-fetch "^2.6.7"
- web-streams-polyfill "^3.2.1"
+"@anthropic-ai/sdk@^0.56.0":
+ version "0.56.0"
+ resolved "https://registry.yarnpkg.com/@anthropic-ai/sdk/-/sdk-0.56.0.tgz#8b6366d5d22235c3ec978c05b2c9420fdf426ed9"
+ integrity sha512-SLCB8M8+VMg1cpCucnA1XWHGWqVSZtIWzmOdDOEu3eTFZMB+A0sGZ1ESO5MHDnqrNTXz3safMrWx9x4rMZSOqA==
"@babel/runtime@^7.12.5", "@babel/runtime@^7.26.7":
version "7.27.3"
@@ -393,9 +370,32 @@
integrity sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==
"@google/generative-ai@^0.24.0":
- version "0.24.0"
- resolved "https://registry.yarnpkg.com/@google/generative-ai/-/generative-ai-0.24.0.tgz#4d27af7d944c924a27a593c17ad1336535d53846"
- integrity sha512-fnEITCGEB7NdX0BhoYZ/cq/7WPZ1QS5IzJJfC3Tg/OwkvBetMiVJciyaan297OvE4B9Jg1xvo0zIazX/9sGu1Q==
+ version "0.24.1"
+ resolved "https://registry.yarnpkg.com/@google/generative-ai/-/generative-ai-0.24.1.tgz#634a3c06f8ea7a6125c1b0d6c1e66bb11afb52c9"
+ integrity sha512-MqO+MLfM6kjxcKoy0p1wRzG3b4ZZXtPI+z2IE26UogS2Cm/XHO+7gGRBh6gcJsOiIVoH93UwKvW4HdgiOZCy9Q==
+
+"@graphql-typed-document-node/core@^3.2.0":
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.2.0.tgz#5f3d96ec6b2354ad6d8a28bf216a1d97b5426861"
+ integrity sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==
+
+"@grpc/grpc-js@^1.13.1":
+ version "1.13.4"
+ resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.13.4.tgz#922fbc496e229c5fa66802d2369bf181c1df1c5a"
+ integrity sha512-GsFaMXCkMqkKIvwCQjCrwH+GHbPKBjhwo/8ZuUkWHqbI73Kky9I+pQltrlT0+MWpedCoosda53lgjYfyEPgxBg==
+ dependencies:
+ "@grpc/proto-loader" "^0.7.13"
+ "@js-sdsl/ordered-map" "^4.4.2"
+
+"@grpc/proto-loader@^0.7.13":
+ version "0.7.15"
+ resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.15.tgz#4cdfbf35a35461fc843abe8b9e2c0770b5095e60"
+ integrity sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==
+ dependencies:
+ lodash.camelcase "^4.3.0"
+ long "^5.0.0"
+ protobufjs "^7.2.5"
+ yargs "^17.7.2"
"@headlessui/react@^2.2.0":
version "2.2.0"
@@ -598,120 +598,85 @@
"@jridgewell/resolve-uri" "^3.1.0"
"@jridgewell/sourcemap-codec" "^1.4.14"
-"@langchain/anthropic@^0.3.15":
- version "0.3.15"
- resolved "https://registry.yarnpkg.com/@langchain/anthropic/-/anthropic-0.3.15.tgz#0244cdb345cb492eb40aedd681881ebadfbb73f2"
- integrity sha512-Ar2viYcZ64idgV7EtCBCb36tIkNtPAhQRxSaMTWPHGspFgMfvwRoleVri9e90sCpjpS9xhlHsIQ0LlUS/Atsrw==
- dependencies:
- "@anthropic-ai/sdk" "^0.37.0"
- fast-xml-parser "^4.4.1"
- zod "^3.22.4"
- zod-to-json-schema "^3.22.4"
+"@js-sdsl/ordered-map@^4.4.2":
+ version "4.4.2"
+ resolved "https://registry.yarnpkg.com/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz#9299f82874bab9e4c7f9c48d865becbfe8d6907c"
+ integrity sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==
-"@langchain/community@^0.3.36":
- version "0.3.36"
- resolved "https://registry.yarnpkg.com/@langchain/community/-/community-0.3.36.tgz#e4c13b8f928b17e0f9257395f43be2246dfada40"
- integrity sha512-4jBB4yqux8CGfCwlBbtXck5qP0yJPwDvtwI4KUN2j/At+zSZn1FyTL11G75ctG2b5GO7u+cR6QatDXIPooJphA==
+"@langchain/anthropic@^0.3.24":
+ version "0.3.24"
+ resolved "https://registry.yarnpkg.com/@langchain/anthropic/-/anthropic-0.3.24.tgz#bc64ccab419fa61f0e3a1abb733046cc12bfadb4"
+ integrity sha512-Gi1TwXu5vkCxUMToiXaiwTTWq9v3WMyU3ldB/VEWjzbkr3nKF5kcp+HLqhvV7WWOFVTTNgG+pzfq8JALecq5MA==
dependencies:
- "@langchain/openai" ">=0.2.0 <0.5.0"
+ "@anthropic-ai/sdk" "^0.56.0"
+ fast-xml-parser "^4.4.1"
+
+"@langchain/community@^0.3.49":
+ version "0.3.49"
+ resolved "https://registry.yarnpkg.com/@langchain/community/-/community-0.3.49.tgz#9e67791c686cfbd378439afb7044cec571dca0f4"
+ integrity sha512-1AAo9mvr1FmqYHUpXhYI8P4NBPC4t9TfUAuvefEImrtb3gZ60fPelVu17ljWlKJcHC1hPSHYpPJWm0Yx7yRvrw==
+ dependencies:
+ "@langchain/openai" ">=0.2.0 <0.7.0"
+ "@langchain/weaviate" "^0.2.0"
binary-extensions "^2.2.0"
expr-eval "^2.0.2"
flat "^5.0.2"
js-yaml "^4.1.0"
langchain ">=0.2.3 <0.3.0 || >=0.3.4 <0.4.0"
- langsmith ">=0.2.8 <0.4.0"
+ langsmith "^0.3.33"
uuid "^10.0.0"
- zod "^3.22.3"
- zod-to-json-schema "^3.22.5"
+ zod "^3.25.32"
-"@langchain/community@~0.0.41":
- version "0.0.44"
- resolved "https://registry.yarnpkg.com/@langchain/community/-/community-0.0.44.tgz#b4f3453e3fd0b7a8c704fc35b004d7d738bd3416"
- integrity sha512-II9Hz90jJmfWRICtxTg1auQWzFw0npqacWiiOpaxNhzs6rptdf56gyfC48Z6n1ii4R8FfAlfX6YxhOE7lGGKXg==
- dependencies:
- "@langchain/core" "~0.1.44"
- "@langchain/openai" "~0.0.19"
- expr-eval "^2.0.2"
- flat "^5.0.2"
- langsmith "~0.1.1"
- uuid "^9.0.0"
- zod "^3.22.3"
- zod-to-json-schema "^3.22.5"
-
-"@langchain/core@^0.3.42":
- version "0.3.42"
- resolved "https://registry.yarnpkg.com/@langchain/core/-/core-0.3.42.tgz#f1fa38425626d8efe9fe2ee51d36c91506632363"
- integrity sha512-pT/jC5lqWK3YGDq8dQwgKoa6anqAhMtG1x5JbnrOj9NdaLeBbCKBDQ+/Ykzk3nZ8o+0UMsaXNZo7IVL83VVjHg==
+"@langchain/core@^0.3.66":
+ version "0.3.66"
+ resolved "https://registry.yarnpkg.com/@langchain/core/-/core-0.3.66.tgz#cd20687f29a07148436cd8b72b88c66d076c500c"
+ integrity sha512-d3SgSDOlgOjdIbReIXVQl9HaQzKqO/5+E+o3kJwoKXLGP9dxi7+lMyaII7yv7G8/aUxMWLwFES9zc1jFoeJEZw==
dependencies:
"@cfworker/json-schema" "^4.0.2"
ansi-styles "^5.0.0"
camelcase "6"
decamelize "1.2.0"
js-tiktoken "^1.0.12"
- langsmith ">=0.2.8 <0.4.0"
+ langsmith "^0.3.46"
mustache "^4.2.0"
p-queue "^6.6.2"
p-retry "4"
uuid "^10.0.0"
- zod "^3.22.4"
+ zod "^3.25.32"
zod-to-json-schema "^3.22.3"
-"@langchain/core@~0.1.44", "@langchain/core@~0.1.45":
- version "0.1.54"
- resolved "https://registry.yarnpkg.com/@langchain/core/-/core-0.1.54.tgz#63dfbd5c116798f6d080fbe675a68a87d84a1be4"
- integrity sha512-87pQ8dnWY8P1Kgnu/SgnRijLRNSEzTzkjBK6O/Z1klXf/eQTXAG5O5cKwe3lwM6Afn+4U2byzSMYjwViAYuR4g==
- dependencies:
- ansi-styles "^5.0.0"
- camelcase "6"
- decamelize "1.2.0"
- js-tiktoken "^1.0.8"
- langsmith "~0.1.7"
- ml-distance "^4.0.0"
- p-queue "^6.6.2"
- p-retry "4"
- uuid "^9.0.0"
- zod "^3.22.4"
- zod-to-json-schema "^3.22.3"
-
-"@langchain/google-genai@^0.1.12":
- version "0.1.12"
- resolved "https://registry.yarnpkg.com/@langchain/google-genai/-/google-genai-0.1.12.tgz#6727253bda6f0d87cd74cf0bb6b1e0f398f60f32"
- integrity sha512-0Ea0E2g63ejCuormVxbuoyJQ5BYN53i2/fb6WP8bMKzyh+y43R13V8JqOtr3e/GmgNyv3ou/VeaZjx7KAvu/0g==
+"@langchain/google-genai@^0.2.15":
+ version "0.2.15"
+ resolved "https://registry.yarnpkg.com/@langchain/google-genai/-/google-genai-0.2.15.tgz#bf8c7f14ee5a0c16aaafc71f902ad8619e8089f2"
+ integrity sha512-fAD3xjzd5TxWQCKlttNeEc+b5tUX43hBqKH3rk3g+wbl1ToLqe3ocWawKRmGotEuI5jhDVmoHjDxoNMifFDgmg==
dependencies:
"@google/generative-ai" "^0.24.0"
- zod-to-json-schema "^3.22.4"
+ uuid "^11.1.0"
-"@langchain/openai@>=0.1.0 <0.5.0", "@langchain/openai@>=0.2.0 <0.5.0":
- version "0.4.5"
- resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.4.5.tgz#d18e207c3ec3f2ecaa4698a5a5888092f643da52"
- integrity sha512-S/sqC71GVsCDiFGU0A0VQDFGNrjcuz72FxlfuSxwOuo955qad/0Yp0hRhWJilPOjgDByGwaeZkOaxC/oE9ABdQ==
+"@langchain/groq@^0.2.3":
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/@langchain/groq/-/groq-0.2.3.tgz#3bfcbfc827cf469df3a1b5bb9799f4b0212b4625"
+ integrity sha512-r+yjysG36a0IZxTlCMr655Feumfb4IrOyA0jLLq4l7gEhVyMpYXMwyE6evseyU2LRP+7qOPbGRVpGqAIK0MsUA==
+ dependencies:
+ groq-sdk "^0.19.0"
+ zod "^3.22.4"
+
+"@langchain/ollama@^0.2.3":
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/@langchain/ollama/-/ollama-0.2.3.tgz#4868e66db4fc480f08c42fc652274abbab0416f0"
+ integrity sha512-1Obe45jgQspqLMBVlayQbGdywFmri8DgmGRdzNu0li56cG5RReYlRCFVDZBRMMvF9JhsP5eXRyfyivtKfITHWQ==
+ dependencies:
+ ollama "^0.5.12"
+ uuid "^10.0.0"
+
+"@langchain/openai@>=0.1.0 <0.7.0", "@langchain/openai@>=0.2.0 <0.7.0", "@langchain/openai@^0.6.2":
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.6.2.tgz#fb68fa7305ef419e772a56c29146810c0923513d"
+ integrity sha512-OjdSfGENdz4tR9TPN4KTat7vJIE6cgt7vT0z69qU1J1aHCs9MyNwqdaQFF++LVlZAae9aTpyCyqeODyge42oKw==
dependencies:
js-tiktoken "^1.0.12"
- openai "^4.87.3"
- zod "^3.22.4"
- zod-to-json-schema "^3.22.3"
-
-"@langchain/openai@^0.0.25":
- version "0.0.25"
- resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.0.25.tgz#8332abea1e3acb9b1169f90636e518c0ee90622e"
- integrity sha512-cD9xPDDXK2Cjs6yYg27BpdzBnQZvBb1yaNgMoGLWIT27UQVRyT96PLC1OVMQOmMmHaKDBCj/1bW4GQQgX7+d2Q==
- dependencies:
- "@langchain/core" "~0.1.45"
- js-tiktoken "^1.0.7"
- openai "^4.26.0"
- zod "^3.22.4"
- zod-to-json-schema "^3.22.3"
-
-"@langchain/openai@~0.0.19", "@langchain/openai@~0.0.26":
- version "0.0.26"
- resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.0.26.tgz#ab989085e03f8bcc26a40d4d5abe9a2b73e5f2a8"
- integrity sha512-FpqYvVRP2CkFFjTLrj2tbXeY6JTIgbq8tRoi0rvGzmhRpoi6cWHlfgclSzDm+e6P9DqKBkzDjo6SPTJgTOabNA==
- dependencies:
- "@langchain/core" "~0.1.45"
- js-tiktoken "^1.0.7"
- openai "^4.32.1"
- zod "^3.22.4"
- zod-to-json-schema "^3.22.3"
+ openai "^5.3.0"
+ zod "^3.25.32"
"@langchain/textsplitters@>=0.0.0 <0.2.0", "@langchain/textsplitters@^0.1.0":
version "0.1.0"
@@ -720,6 +685,14 @@
dependencies:
js-tiktoken "^1.0.12"
+"@langchain/weaviate@^0.2.0":
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/@langchain/weaviate/-/weaviate-0.2.1.tgz#51ad20cf6d40e63d6149e5d01f91597cdff66744"
+ integrity sha512-rlfAKF+GB0A5MUrol34oDrBkl4q6AefARk9KDW+LfzhV/74pZZLZyIPYPxvE4XwI3gvpwp024DNsDxK/4UW0/g==
+ dependencies:
+ uuid "^10.0.0"
+ weaviate-client "^3.5.2"
+
"@next/env@15.2.2":
version "15.2.2"
resolved "https://registry.yarnpkg.com/@next/env/-/env-15.2.2.tgz#6345352365a811c523cecf284874ff489b675e59"
@@ -983,14 +956,6 @@
resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a"
integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==
-"@types/node-fetch@^2.6.4":
- version "2.6.11"
- resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.11.tgz#9b39b78665dae0e82a08f02f4967d62c66f95d24"
- integrity sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==
- dependencies:
- "@types/node" "*"
- form-data "^4.0.0"
-
"@types/node@*", "@types/node@^20":
version "20.12.5"
resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.5.tgz#74c4f31ab17955d0b5808cdc8fd2839526ad00b3"
@@ -1005,13 +970,6 @@
dependencies:
undici-types "~6.20.0"
-"@types/node@^18.11.18":
- version "18.19.30"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.30.tgz#0b1e6f824ed7ce37ef6e56f8f0d7d0ec2847b327"
- integrity sha512-453z1zPuJLVDbyahaa1sSD5C2sht6ZpHp5rgJNs+H8YGqhluCXcuOUmBYsAo0Tos0cHySJ3lVUGbGgLlqIkpyg==
- dependencies:
- undici-types "~5.26.4"
-
"@types/pdf-parse@^1.1.4":
version "1.1.4"
resolved "https://registry.yarnpkg.com/@types/pdf-parse/-/pdf-parse-1.1.4.tgz#21a539efd2f16009d08aeed3350133948b5d7ed1"
@@ -1062,11 +1020,6 @@
resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-10.0.0.tgz#e9c07fe50da0f53dc24970cca94d619ff03f6f6d"
integrity sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==
-"@types/uuid@^9.0.1":
- version "9.0.8"
- resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.8.tgz#7545ba4fc3c003d6c756f651f3bf163d8f0f29ba"
- integrity sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==
-
"@typescript-eslint/parser@^5.4.2 || ^6.0.0":
version "6.21.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.21.0.tgz#af8fcf66feee2edc86bc5d1cf45e33b0630bf35b"
@@ -1134,12 +1087,10 @@
resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99"
integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==
-abort-controller@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392"
- integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==
- dependencies:
- event-target-shim "^5.0.0"
+abort-controller-x@^0.4.0, abort-controller-x@^0.4.3:
+ version "0.4.3"
+ resolved "https://registry.yarnpkg.com/abort-controller-x/-/abort-controller-x-0.4.3.tgz#ff269788386fabd58a7b6eeaafcb6cf55c2958e0"
+ integrity sha512-VtUwTNU8fpMwvWGn4xE93ywbogTYsuT+AUxAXOeelbXuQVIwNmC5YLeho9sH4vZ4ITW8414TTAOG1nW6uIVHCA==
acorn-jsx@^5.3.2:
version "5.3.2"
@@ -1151,13 +1102,6 @@ acorn@^8.9.0:
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a"
integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==
-agentkeepalive@^4.2.1:
- version "4.5.0"
- resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923"
- integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==
- dependencies:
- humanize-ms "^1.2.1"
-
ajv@^6.12.4:
version "6.12.6"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
@@ -1439,11 +1383,6 @@ bare-stream@^2.0.0:
dependencies:
streamx "^2.21.0"
-base-64@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb"
- integrity sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA==
-
base64-arraybuffer@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz#1c37589a7c4b0746e34bd1feb951da2df01c1bdc"
@@ -1467,11 +1406,6 @@ binary-extensions@^2.0.0, binary-extensions@^2.2.0:
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522"
integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==
-binary-search@^1.3.5:
- version "1.3.6"
- resolved "https://registry.yarnpkg.com/binary-search/-/binary-search-1.3.6.tgz#e32426016a0c5092f0f3598836a1c7da3560565c"
- integrity sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA==
-
bindings@^1.5.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df"
@@ -1608,11 +1542,6 @@ chalk@^4.0.0, chalk@^4.1.2:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
-charenc@0.0.2:
- version "0.0.2"
- resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667"
- integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==
-
chokidar@^3.5.3:
version "3.6.0"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b"
@@ -1638,6 +1567,15 @@ client-only@0.0.1:
resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1"
integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==
+cliui@^8.0.1:
+ version "8.0.1"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa"
+ integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==
+ dependencies:
+ string-width "^4.2.0"
+ strip-ansi "^6.0.1"
+ wrap-ansi "^7.0.0"
+
clsx@^2.0.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999"
@@ -1711,11 +1649,6 @@ combined-stream@^1.0.8:
dependencies:
delayed-stream "~1.0.0"
-commander@^10.0.1:
- version "10.0.1"
- resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06"
- integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==
-
commander@^4.0.0:
version "4.1.1"
resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068"
@@ -1753,9 +1686,9 @@ concat-map@0.0.1:
integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
console-table-printer@^2.12.1:
- version "2.12.1"
- resolved "https://registry.yarnpkg.com/console-table-printer/-/console-table-printer-2.12.1.tgz#4a9646537a246a6d8de57075d4fae1e08abae267"
- integrity sha512-wKGOQRRvdnd89pCeH96e2Fn4wkbenSP6LMHfjfyNLMbGuHEFbMqQNuxXqd0oXG9caIOQ1FTvc5Uijp9/4jujnQ==
+ version "2.14.6"
+ resolved "https://registry.yarnpkg.com/console-table-printer/-/console-table-printer-2.14.6.tgz#edfe0bf311fa2701922ed509443145ab51e06436"
+ integrity sha512-MCBl5HNVaFuuHW6FGbL/4fB7N/ormCy+tQ+sxTrF6QtSbSNETvPuOVbkJBhzDgYhvjWGrTma4eYJa37ZuoQsPw==
dependencies:
simple-wcswidth "^1.0.1"
@@ -1769,6 +1702,13 @@ core-util-is@~1.0.0:
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85"
integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==
+cross-fetch@^3.1.5:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.2.0.tgz#34e9192f53bc757d6614304d9e5e6fb4edb782e3"
+ integrity sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==
+ dependencies:
+ node-fetch "^2.7.0"
+
cross-spawn@^7.0.0, cross-spawn@^7.0.2:
version "7.0.3"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
@@ -1778,11 +1718,6 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2:
shebang-command "^2.0.0"
which "^2.0.1"
-crypt@0.0.2:
- version "0.0.2"
- resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b"
- integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==
-
css-line-break@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/css-line-break/-/css-line-break-2.1.0.tgz#bfef660dfa6f5397ea54116bb3cb4873edbc4fa0"
@@ -1911,14 +1846,6 @@ didyoumean@^1.2.2:
resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037"
integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==
-digest-fetch@^1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/digest-fetch/-/digest-fetch-1.3.0.tgz#898e69264d00012a23cf26e8a3e40320143fc661"
- integrity sha512-CGJuv6iKNM7QyZlM2T3sPAdZWd/p9zQiRNS9G+9COUCwzWFTs0Xp8NF5iePx7wtvhDykReiRRrSeNb4oMmB8lA==
- dependencies:
- base-64 "^0.1.0"
- md5 "^2.3.0"
-
dingbat-to-unicode@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/dingbat-to-unicode/-/dingbat-to-unicode-1.0.1.tgz#5091dd673241453e6b5865e26e5a4452cdef5c83"
@@ -2458,11 +2385,6 @@ esutils@^2.0.2:
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
-event-target-shim@^5.0.0:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789"
- integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==
-
eventemitter3@^4.0.4:
version "4.0.7"
resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f"
@@ -2609,11 +2531,6 @@ foreground-child@^3.1.0:
cross-spawn "^7.0.0"
signal-exit "^4.0.1"
-form-data-encoder@1.7.2:
- version "1.7.2"
- resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-1.7.2.tgz#1f1ae3dccf58ed4690b86d87e4f57c654fbab040"
- integrity sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==
-
form-data@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
@@ -2623,14 +2540,6 @@ form-data@^4.0.0:
combined-stream "^1.0.8"
mime-types "^2.1.12"
-formdata-node@^4.3.2:
- version "4.4.1"
- resolved "https://registry.yarnpkg.com/formdata-node/-/formdata-node-4.4.1.tgz#23f6a5cb9cb55315912cbec4ff7b0f59bbd191e2"
- integrity sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==
- dependencies:
- node-domexception "1.0.0"
- web-streams-polyfill "4.0.0-beta.3"
-
fraction.js@^4.3.7:
version "4.3.7"
resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7"
@@ -2683,6 +2592,11 @@ gel@^2.0.0:
shell-quote "^1.8.1"
which "^4.0.0"
+get-caller-file@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
+ integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
+
get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4:
version "1.2.4"
resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd"
@@ -2813,6 +2727,32 @@ graphemer@^1.4.0:
resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6"
integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==
+graphql-request@^6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/graphql-request/-/graphql-request-6.1.0.tgz#f4eb2107967af3c7a5907eb3131c671eac89be4f"
+ integrity sha512-p+XPfS4q7aIpKVcgmnZKhMNqhltk20hfXtkaIkTfjjmiKMJ5xrt5c743cL03y/K7y1rg3WrIC49xGiEQ4mxdNw==
+ dependencies:
+ "@graphql-typed-document-node/core" "^3.2.0"
+ cross-fetch "^3.1.5"
+
+graphql@^16.11.0:
+ version "16.11.0"
+ resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.11.0.tgz#96d17f66370678027fdf59b2d4c20b4efaa8a633"
+ integrity sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw==
+
+groq-sdk@^0.19.0:
+ version "0.19.0"
+ resolved "https://registry.yarnpkg.com/groq-sdk/-/groq-sdk-0.19.0.tgz#564ce018172dc3e2e2793398e0227a035a357d09"
+ integrity sha512-vdh5h7ORvwvOvutA80dKF81b0gPWHxu6K/GOJBOM0n6p6CSqAVLhFfeS79Ef0j/yCycDR09jqY7jkYz9dLiS6w==
+ dependencies:
+ "@types/node" "^18.11.18"
+ "@types/node-fetch" "^2.6.4"
+ abort-controller "^3.0.0"
+ agentkeepalive "^4.2.1"
+ form-data-encoder "1.7.2"
+ formdata-node "^4.3.2"
+ node-fetch "^2.6.7"
+
guid-typescript@^1.0.9:
version "1.0.9"
resolved "https://registry.yarnpkg.com/guid-typescript/-/guid-typescript-1.0.9.tgz#e35f77003535b0297ea08548f5ace6adb1480ddc"
@@ -2888,13 +2828,6 @@ htmlparser2@^8.0.2:
domutils "^3.0.1"
entities "^4.4.0"
-humanize-ms@^1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed"
- integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==
- dependencies:
- ms "^2.0.0"
-
ieee754@^1.1.13:
version "1.2.1"
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
@@ -2950,11 +2883,6 @@ internal-slot@^1.0.7:
hasown "^2.0.0"
side-channel "^1.0.4"
-is-any-array@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/is-any-array/-/is-any-array-2.0.1.tgz#9233242a9c098220290aa2ec28f82ca7fa79899e"
- integrity sha512-UtilS7hLRu++wb/WBAw9bNuP1Eg04Ivn1vERJck8zJthEvXCBEBpGR/33u/xLKWEQf95803oalHrVDptcAvFdQ==
-
is-array-buffer@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98"
@@ -2997,11 +2925,6 @@ is-boolean-object@^1.1.0:
call-bind "^1.0.2"
has-tostringtag "^1.0.0"
-is-buffer@~1.1.6:
- version "1.1.6"
- resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
- integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
-
is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7:
version "1.2.7"
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055"
@@ -3198,16 +3121,9 @@ jiti@^1.21.0:
integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==
js-tiktoken@^1.0.12:
- version "1.0.19"
- resolved "https://registry.yarnpkg.com/js-tiktoken/-/js-tiktoken-1.0.19.tgz#0298b584382f1d47d4b45cb93d382f11780eab78"
- integrity sha512-XC63YQeEcS47Y53gg950xiZ4IWmkfMe4p2V9OSaBt26q+p47WHn18izuXzSclCI73B7yGqtfRsT6jcZQI0y08g==
- dependencies:
- base64-js "^1.5.1"
-
-js-tiktoken@^1.0.7, js-tiktoken@^1.0.8:
- version "1.0.10"
- resolved "https://registry.yarnpkg.com/js-tiktoken/-/js-tiktoken-1.0.10.tgz#2b343ec169399dcee8f9ef9807dbd4fafd3b30dc"
- integrity sha512-ZoSxbGjvGyMT13x6ACo9ebhDha/0FHdKA+OsQcMOWcm1Zs7r90Rhk5lhERLzji+3rA7EKpXCgwXcM5fF3DMpdA==
+ version "1.0.20"
+ resolved "https://registry.yarnpkg.com/js-tiktoken/-/js-tiktoken-1.0.20.tgz#fa2733bf147acaf1bdcf9ab8a878e79c581c95f2"
+ integrity sha512-Xlaqhhs8VfCd6Sh7a1cFkZHQbYTLCwVJJWiHVxBYzLPxW0XsoxBy1hitmjkdIjD3Aon5BXLHFwU5O8WUx6HH+A==
dependencies:
base64-js "^1.5.1"
@@ -3297,56 +3213,27 @@ kuler@^2.0.0:
resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3"
integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==
-"langchain@>=0.2.3 <0.3.0 || >=0.3.4 <0.4.0":
- version "0.3.19"
- resolved "https://registry.yarnpkg.com/langchain/-/langchain-0.3.19.tgz#a0329036c4c870018897b91af2ac442c1f07294b"
- integrity sha512-aGhoTvTBS5ulatA67RHbJ4bcV5zcYRYdm5IH+hpX99RYSFXG24XF3ghSjhYi6sxW+SUnEQ99fJhA5kroVpKNhw==
+"langchain@>=0.2.3 <0.3.0 || >=0.3.4 <0.4.0", langchain@^0.3.30:
+ version "0.3.30"
+ resolved "https://registry.yarnpkg.com/langchain/-/langchain-0.3.30.tgz#9fc0467007009dc5e799d1f8fb9dd1137654e387"
+ integrity sha512-UyVsfwHDpHbrnWrjWuhJHqi8Non+Zcsf2kdpDTqyJF8NXrHBOpjdHT5LvPuW9fnE7miDTWf5mLcrWAGZgcrznQ==
dependencies:
- "@langchain/openai" ">=0.1.0 <0.5.0"
+ "@langchain/openai" ">=0.1.0 <0.7.0"
"@langchain/textsplitters" ">=0.0.0 <0.2.0"
js-tiktoken "^1.0.12"
js-yaml "^4.1.0"
jsonpointer "^5.0.1"
- langsmith ">=0.2.8 <0.4.0"
+ langsmith "^0.3.33"
openapi-types "^12.1.3"
p-retry "4"
uuid "^10.0.0"
yaml "^2.2.1"
- zod "^3.22.4"
- zod-to-json-schema "^3.22.3"
+ zod "^3.25.32"
-langchain@^0.1.30:
- version "0.1.31"
- resolved "https://registry.yarnpkg.com/langchain/-/langchain-0.1.31.tgz#4f3a0e84a00d77214b325156e661762f945f33ae"
- integrity sha512-J2iZZL48Nwdo1XDU5cS5YYm91b2L6sL3a8hH1gBljvDzCY7jbtUOTuIoRVx5iHN3DXuuLnszS4lhqg0u9hQxBQ==
- dependencies:
- "@anthropic-ai/sdk" "^0.9.1"
- "@langchain/community" "~0.0.41"
- "@langchain/core" "~0.1.44"
- "@langchain/openai" "~0.0.26"
- binary-extensions "^2.2.0"
- js-tiktoken "^1.0.7"
- js-yaml "^4.1.0"
- jsonpointer "^5.0.1"
- langchainhub "~0.0.8"
- langsmith "~0.1.7"
- ml-distance "^4.0.0"
- openapi-types "^12.1.3"
- p-retry "4"
- uuid "^9.0.0"
- yaml "^2.2.1"
- zod "^3.22.4"
- zod-to-json-schema "^3.22.3"
-
-langchainhub@~0.0.8:
- version "0.0.8"
- resolved "https://registry.yarnpkg.com/langchainhub/-/langchainhub-0.0.8.tgz#fd4b96dc795e22e36c1a20bad31b61b0c33d3110"
- integrity sha512-Woyb8YDHgqqTOZvWIbm2CaFDGfZ4NTSyXV687AG4vXEfoNo7cGQp7nhl7wL3ehenKWmNEmcxCLgOZzW8jE6lOQ==
-
-"langsmith@>=0.2.8 <0.4.0":
- version "0.3.14"
- resolved "https://registry.yarnpkg.com/langsmith/-/langsmith-0.3.14.tgz#4dfde17d77f8d80c69c28fb647dbe310c2352e6f"
- integrity sha512-MzoxdRkFFV/6140vpP5V2e2fkTG6x/0zIjw77bsRwAXEMjPRTUyDazfXeSyrS5uJvbLgxAXc+MF1h6vPWe6SXQ==
+langsmith@^0.3.33, langsmith@^0.3.46:
+ version "0.3.46"
+ resolved "https://registry.yarnpkg.com/langsmith/-/langsmith-0.3.46.tgz#6d369f2c91aa771f49a5f7c4e4e67c12763cf737"
+ integrity sha512-Hhi4/cMjhWIGpu0DW5eQrXBbeeKQWPYYQyJCYzhFjod+xinMry4i8QR0gxrrgjGOgfMuU6nyK79YqjGTEPVbDA==
dependencies:
"@types/uuid" "^10.0.0"
chalk "^4.1.2"
@@ -3356,17 +3243,6 @@ langchainhub@~0.0.8:
semver "^7.6.3"
uuid "^10.0.0"
-langsmith@~0.1.1, langsmith@~0.1.7:
- version "0.1.14"
- resolved "https://registry.yarnpkg.com/langsmith/-/langsmith-0.1.14.tgz#2b889dbcfb49547614df276a4a5a063092a1585d"
- integrity sha512-iEzQLLB7/0nRpAwNBAR7B7N64fyByg5UsNjSvLaCCkQ9AS68PSafjB8xQkyI8QXXrGjU1dEqDRoa8m4SUuRdUw==
- dependencies:
- "@types/uuid" "^9.0.1"
- commander "^10.0.1"
- p-queue "^6.6.2"
- p-retry "4"
- uuid "^9.0.0"
-
language-subtag-registry@^0.3.20:
version "0.3.22"
resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d"
@@ -3421,6 +3297,11 @@ locate-path@^6.0.0:
dependencies:
p-locate "^5.0.0"
+lodash.camelcase@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
+ integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==
+
lodash.castarray@^4.4.0:
version "4.4.0"
resolved "https://registry.yarnpkg.com/lodash.castarray/-/lodash.castarray-4.4.0.tgz#c02513515e309daddd4c24c60cfddcf5976d9115"
@@ -3453,6 +3334,11 @@ long@^4.0.0:
resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28"
integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==
+long@^5.0.0, long@^5.3.2:
+ version "5.3.2"
+ resolved "https://registry.yarnpkg.com/long/-/long-5.3.2.tgz#1d84463095999262d7d7b7f8bfd4a8cc55167f83"
+ integrity sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==
+
loose-envify@^1.1.0, loose-envify@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
@@ -3507,15 +3393,6 @@ markdown-to-jsx@^7.7.2:
resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-7.7.2.tgz#59c1dd64f48b53719311ab140be3cd51cdabccd3"
integrity sha512-N3AKfYRvxNscvcIH6HDnDKILp4S8UWbebp+s92Y8SwIq0CuSbLW4Jgmrbjku3CWKjTQO0OyIMS6AhzqrwjEa3g==
-md5@^2.3.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f"
- integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==
- dependencies:
- charenc "0.0.2"
- crypt "0.0.2"
- is-buffer "~1.1.6"
-
merge2@^1.3.0, merge2@^1.4.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
@@ -3582,48 +3459,12 @@ mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3:
resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113"
integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==
-ml-array-mean@^1.1.6:
- version "1.1.6"
- resolved "https://registry.yarnpkg.com/ml-array-mean/-/ml-array-mean-1.1.6.tgz#d951a700dc8e3a17b3e0a583c2c64abd0c619c56"
- integrity sha512-MIdf7Zc8HznwIisyiJGRH9tRigg3Yf4FldW8DxKxpCCv/g5CafTw0RRu51nojVEOXuCQC7DRVVu5c7XXO/5joQ==
- dependencies:
- ml-array-sum "^1.1.6"
-
-ml-array-sum@^1.1.6:
- version "1.1.6"
- resolved "https://registry.yarnpkg.com/ml-array-sum/-/ml-array-sum-1.1.6.tgz#d1d89c20793cd29c37b09d40e85681aa4515a955"
- integrity sha512-29mAh2GwH7ZmiRnup4UyibQZB9+ZLyMShvt4cH4eTK+cL2oEMIZFnSyB3SS8MlsTh6q/w/yh48KmqLxmovN4Dw==
- dependencies:
- is-any-array "^2.0.0"
-
-ml-distance-euclidean@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/ml-distance-euclidean/-/ml-distance-euclidean-2.0.0.tgz#3a668d236649d1b8fec96380b9435c6f42c9a817"
- integrity sha512-yC9/2o8QF0A3m/0IXqCTXCzz2pNEzvmcE/9HFKOZGnTjatvBbsn4lWYJkxENkA4Ug2fnYl7PXQxnPi21sgMy/Q==
-
-ml-distance@^4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/ml-distance/-/ml-distance-4.0.1.tgz#4741d17a1735888c5388823762271dfe604bd019"
- integrity sha512-feZ5ziXs01zhyFUUUeZV5hwc0f5JW0Sh0ckU1koZe/wdVkJdGxcP06KNQuF0WBTj8FttQUzcvQcpcrOp/XrlEw==
- dependencies:
- ml-array-mean "^1.1.6"
- ml-distance-euclidean "^2.0.0"
- ml-tree-similarity "^1.0.0"
-
-ml-tree-similarity@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/ml-tree-similarity/-/ml-tree-similarity-1.0.0.tgz#24705a107e32829e24d945e87219e892159c53f0"
- integrity sha512-XJUyYqjSuUQkNQHMscr6tcjldsOoAekxADTplt40QKfwW6nd++1wHWV9AArl0Zvw/TIHgNaZZNvr8QGvE8wLRg==
- dependencies:
- binary-search "^1.3.5"
- num-sort "^2.0.0"
-
ms@2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
-ms@^2.0.0, ms@^2.1.1:
+ms@^2.1.1:
version "2.1.3"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
@@ -3690,6 +3531,30 @@ next@^15.2.2:
"@next/swc-win32-x64-msvc" "15.2.2"
sharp "^0.33.5"
+nice-grpc-client-middleware-retry@^3.1.11:
+ version "3.1.11"
+ resolved "https://registry.yarnpkg.com/nice-grpc-client-middleware-retry/-/nice-grpc-client-middleware-retry-3.1.11.tgz#4fc0128b891d184b6c98af3bfd6aca1b608a3fd1"
+ integrity sha512-xW/imz/kNG2g0DwTfH2eYEGrg1chSLrXtvGp9fg2qkhTgGFfAS/Pq3+t+9G8KThcC4hK/xlEyKvZWKk++33S6A==
+ dependencies:
+ abort-controller-x "^0.4.0"
+ nice-grpc-common "^2.0.2"
+
+nice-grpc-common@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/nice-grpc-common/-/nice-grpc-common-2.0.2.tgz#e6aeebb2bd19d87114b351e291e30d79dd38acf7"
+ integrity sha512-7RNWbls5kAL1QVUOXvBsv1uO0wPQK3lHv+cY1gwkTzirnG1Nop4cBJZubpgziNbaVc/bl9QJcyvsf/NQxa3rjQ==
+ dependencies:
+ ts-error "^1.0.6"
+
+nice-grpc@^2.1.12:
+ version "2.1.12"
+ resolved "https://registry.yarnpkg.com/nice-grpc/-/nice-grpc-2.1.12.tgz#56ffdcc4d5bc3d0271c176210680c4bd10c5149b"
+ integrity sha512-J1n4Wg+D3IhRhGQb+iqh2OpiM0GzTve/kf2lnlW4S+xczmIEd0aHUDV1OsJ5a3q8GSTqJf+s4Rgg1M8uJltarw==
+ dependencies:
+ "@grpc/grpc-js" "^1.13.1"
+ abort-controller-x "^0.4.0"
+ nice-grpc-common "^2.0.2"
+
node-abi@^3.3.0:
version "3.74.0"
resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.74.0.tgz#5bfb4424264eaeb91432d2adb9da23c63a301ed0"
@@ -3702,17 +3567,12 @@ node-addon-api@^6.1.0:
resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-6.1.0.tgz#ac8470034e58e67d0c6f1204a18ae6995d9c0d76"
integrity sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==
-node-domexception@1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5"
- integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==
-
node-ensure@^0.0.0:
version "0.0.0"
resolved "https://registry.yarnpkg.com/node-ensure/-/node-ensure-0.0.0.tgz#ecae764150de99861ec5c810fd5d096b183932a7"
integrity sha512-DRI60hzo2oKN1ma0ckc6nQWlHU69RH6xN0sjQTjMpChPfTYvKZdcQFfdYK2RWbJcKyUizSIy/l8OTGxMAM1QDw==
-node-fetch@^2.6.7:
+node-fetch@^2.7.0:
version "2.7.0"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d"
integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==
@@ -3734,11 +3594,6 @@ normalize-range@^0.1.2:
resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942"
integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==
-num-sort@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/num-sort/-/num-sort-2.1.0.tgz#1cbb37aed071329fdf41151258bc011898577a9b"
- integrity sha512-1MQz1Ed8z2yckoBeSfkQHHO9K1yDRxxtotKSJ9yvcTUUxSvfvzEq5GwBrjjHEpMlq/k5gvXdmJ1SbYxWtpNoVg==
-
object-assign@^4.0.1, object-assign@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
@@ -3815,6 +3670,13 @@ object.values@^1.1.6, object.values@^1.1.7:
define-properties "^1.2.1"
es-object-atoms "^1.0.0"
+ollama@^0.5.12:
+ version "0.5.16"
+ resolved "https://registry.yarnpkg.com/ollama/-/ollama-0.5.16.tgz#cb695b4aab6f6c07236a04b3aee40160f4f9e892"
+ integrity sha512-OEbxxOIUZtdZgOaTPAULo051F5y+Z1vosxEYOoABPnQKeW7i4O8tJNlxCB+xioyoorVqgjkdj+TA1f1Hy2ug/w==
+ dependencies:
+ whatwg-fetch "^3.6.20"
+
once@^1.3.0, once@^1.3.1, once@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
@@ -3860,32 +3722,10 @@ onnxruntime-web@1.14.0:
onnxruntime-common "~1.14.0"
platform "^1.3.6"
-openai@^4.26.0, openai@^4.32.1:
- version "4.33.0"
- resolved "https://registry.yarnpkg.com/openai/-/openai-4.33.0.tgz#8c33da687d4a7f3dd7576179318341615394c79d"
- integrity sha512-Sh4KvplkvkAREuhb8yZpohqsOo08cBBu6LNWLD8YyMxe8yCxbE+ouJYUs1X2oDPrzQGANj0rFNQYiwW9gWLBOg==
- dependencies:
- "@types/node" "^18.11.18"
- "@types/node-fetch" "^2.6.4"
- abort-controller "^3.0.0"
- agentkeepalive "^4.2.1"
- form-data-encoder "1.7.2"
- formdata-node "^4.3.2"
- node-fetch "^2.6.7"
- web-streams-polyfill "^3.2.1"
-
-openai@^4.87.3:
- version "4.87.4"
- resolved "https://registry.yarnpkg.com/openai/-/openai-4.87.4.tgz#f9d8da366a1ded2c7aa92cb9f2256755d0e58902"
- integrity sha512-lsfM20jZY4A0lNexfoUAkfmrEXxaTXvv8OKYicpeAJUNHObpRgkvC7pxPgMnB6gc9ID8OCwzzhEhBpNy69UR7w==
- dependencies:
- "@types/node" "^18.11.18"
- "@types/node-fetch" "^2.6.4"
- abort-controller "^3.0.0"
- agentkeepalive "^4.2.1"
- form-data-encoder "1.7.2"
- formdata-node "^4.3.2"
- node-fetch "^2.6.7"
+openai@^5.3.0:
+ version "5.10.1"
+ resolved "https://registry.yarnpkg.com/openai/-/openai-5.10.1.tgz#4535a9603f4d03b2392bb2ca41a618a80fdcfacd"
+ integrity sha512-fq6xVfv1/gpLbsj8fArEt3b6B9jBxdhAK+VJ+bDvbUvNd+KTLlA3bnDeYZaBsGH9LUhJ1M1yXfp9sEyBLMx6eA==
openapi-types@^12.1.3:
version "12.1.3"
@@ -4183,6 +4023,24 @@ protobufjs@^6.8.8:
"@types/node" ">=13.7.0"
long "^4.0.0"
+protobufjs@^7.2.5:
+ version "7.5.3"
+ resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.5.3.tgz#13f95a9e3c84669995ec3652db2ac2fb00b89363"
+ integrity sha512-sildjKwVqOI2kmFDiXQ6aEB0fjYTafpEvIBs8tOR8qI4spuL9OPROLVu2qZqi/xgCfsHIwVqlaF8JBjWFHnKbw==
+ dependencies:
+ "@protobufjs/aspromise" "^1.1.2"
+ "@protobufjs/base64" "^1.1.2"
+ "@protobufjs/codegen" "^2.0.4"
+ "@protobufjs/eventemitter" "^1.1.0"
+ "@protobufjs/fetch" "^1.1.0"
+ "@protobufjs/float" "^1.0.2"
+ "@protobufjs/inquire" "^1.1.0"
+ "@protobufjs/path" "^1.1.2"
+ "@protobufjs/pool" "^1.1.0"
+ "@protobufjs/utf8" "^1.1.0"
+ "@types/node" ">=13.7.0"
+ long "^5.0.0"
+
proxy-from-env@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
@@ -4326,6 +4184,11 @@ regexp.prototype.flags@^1.5.2:
es-errors "^1.3.0"
set-function-name "^2.0.1"
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+ integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==
+
resolve-from@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
@@ -4572,9 +4435,9 @@ simple-swizzle@^0.2.2:
is-arrayish "^0.3.1"
simple-wcswidth@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/simple-wcswidth/-/simple-wcswidth-1.0.1.tgz#8ab18ac0ae342f9d9b629604e54d2aa1ecb018b2"
- integrity sha512-xMO/8eNREtaROt7tJvWJqHBDTMFN4eiQ5I4JRMuilwfnFcV5W9u7RUkueNkdw0jPqGMX36iCywelS5yilTuOxg==
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/simple-wcswidth/-/simple-wcswidth-1.1.2.tgz#66722f37629d5203f9b47c5477b1225b85d6525b"
+ integrity sha512-j7piyCjAeTDSjzTSQ7DokZtMNwNlEAyxqSZeCS+CXH7fJ4jx3FuJ/mTW3mE+6JLs4VJBbcll0Kjn+KXI5t21Iw==
slash@^3.0.0:
version "3.0.0"
@@ -4648,7 +4511,7 @@ streamx@^2.15.0, streamx@^2.21.0:
is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.1"
-string-width@^4.1.0:
+string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
@@ -4950,6 +4813,11 @@ ts-api-utils@^1.0.1:
resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1"
integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==
+ts-error@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/ts-error/-/ts-error-1.0.6.tgz#277496f2a28de6c184cfce8dfd5cdd03a4e6b0fc"
+ integrity sha512-tLJxacIQUM82IR7JO1UUkKlYuUTmoY9HBJAmNWFzheSlDS5SPMcNIepejHJa4BpPQLAcbRhRf3GDJzyj6rbKvA==
+
ts-interface-checker@^0.1.9:
version "0.1.13"
resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699"
@@ -5112,7 +4980,12 @@ uuid@^10.0.0:
resolved "https://registry.yarnpkg.com/uuid/-/uuid-10.0.0.tgz#5a95aa454e6e002725c79055fd42aaba30ca6294"
integrity sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==
-uuid@^9.0.0:
+uuid@^11.1.0:
+ version "11.1.0"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-11.1.0.tgz#9549028be1753bb934fc96e2bca09bb4105ae912"
+ integrity sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==
+
+uuid@^9.0.1:
version "9.0.1"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30"
integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==
@@ -5127,21 +5000,30 @@ validate.io-function@^1.0.2:
resolved "https://registry.yarnpkg.com/validate.io-function/-/validate.io-function-1.0.2.tgz#343a19802ed3b1968269c780e558e93411c0bad7"
integrity sha512-LlFybRJEriSuBnUhQyG5bwglhh50EpTL2ul23MPIuR1odjO7XaMLFV8vHGwp7AZciFxtYOeiSCT5st+XSPONiQ==
-web-streams-polyfill@4.0.0-beta.3:
- version "4.0.0-beta.3"
- resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz#2898486b74f5156095e473efe989dcf185047a38"
- integrity sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==
-
-web-streams-polyfill@^3.2.1:
- version "3.3.3"
- resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz#2073b91a2fdb1fbfbd401e7de0ac9f8214cecb4b"
- integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==
+weaviate-client@^3.5.2:
+ version "3.7.0"
+ resolved "https://registry.yarnpkg.com/weaviate-client/-/weaviate-client-3.7.0.tgz#cf11ccbc90ee1849869d6bebb79ec4a33056b722"
+ integrity sha512-q888bkHWJBdPgPHFoIc2GiFig42WbxHOgiSBVYYQUqJGA9VszaOpU/7Ip1fVATyyVjhjzRDvMebmRltirvpfMg==
+ dependencies:
+ abort-controller-x "^0.4.3"
+ graphql "^16.11.0"
+ graphql-request "^6.1.0"
+ long "^5.3.2"
+ nice-grpc "^2.1.12"
+ nice-grpc-client-middleware-retry "^3.1.11"
+ nice-grpc-common "^2.0.2"
+ uuid "^9.0.1"
webidl-conversions@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==
+whatwg-fetch@^3.6.20:
+ version "3.6.20"
+ resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz#580ce6d791facec91d37c72890995a0b48d31c70"
+ integrity sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==
+
whatwg-url@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d"
@@ -5249,6 +5131,15 @@ winston@^3.17.0:
string-width "^4.1.0"
strip-ansi "^6.0.0"
+wrap-ansi@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
+ integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
wrap-ansi@^8.1.0:
version "8.1.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"
@@ -5268,16 +5159,44 @@ xmlbuilder@^10.0.0:
resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-10.1.1.tgz#8cae6688cc9b38d850b7c8d3c0a4161dcaf475b0"
integrity sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg==
+y18n@^5.0.5:
+ version "5.0.8"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
+ integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
+
yallist@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
-yaml@^2.2.1, yaml@^2.3.4:
+yaml@^2.2.1:
+ version "2.8.0"
+ resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.8.0.tgz#15f8c9866211bdc2d3781a0890e44d4fa1a5fff6"
+ integrity sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==
+
+yaml@^2.3.4:
version "2.4.1"
resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.1.tgz#2e57e0b5e995292c25c75d2658f0664765210eed"
integrity sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==
+yargs-parser@^21.1.1:
+ version "21.1.1"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35"
+ integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==
+
+yargs@^17.7.2:
+ version "17.7.2"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269"
+ integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==
+ dependencies:
+ cliui "^8.0.1"
+ escalade "^3.1.1"
+ get-caller-file "^2.0.5"
+ require-directory "^2.1.1"
+ string-width "^4.2.3"
+ y18n "^5.0.5"
+ yargs-parser "^21.1.1"
+
yet-another-react-lightbox@^3.17.2:
version "3.17.2"
resolved "https://registry.yarnpkg.com/yet-another-react-lightbox/-/yet-another-react-lightbox-3.17.2.tgz#00474b83189ec4d81302792211ca31ffb808554c"
@@ -5288,17 +5207,17 @@ yocto-queue@^0.1.0:
resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
-zod-to-json-schema@^3.22.3, zod-to-json-schema@^3.22.5:
- version "3.22.5"
- resolved "https://registry.yarnpkg.com/zod-to-json-schema/-/zod-to-json-schema-3.22.5.tgz#3646e81cfc318dbad2a22519e5ce661615418673"
- integrity sha512-+akaPo6a0zpVCCseDed504KBJUQpEW5QZw7RMneNmKw+fGaML1Z9tUNLnHHAC8x6dzVRO1eB2oEMyZRnuBZg7Q==
+zod-to-json-schema@^3.22.3:
+ version "3.24.6"
+ resolved "https://registry.yarnpkg.com/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz#5920f020c4d2647edfbb954fa036082b92c9e12d"
+ integrity sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==
-zod-to-json-schema@^3.22.4:
- version "3.24.5"
- resolved "https://registry.yarnpkg.com/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz#d1095440b147fb7c2093812a53c54df8d5df50a3"
- integrity sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==
-
-zod@^3.22.3, zod@^3.22.4:
+zod@^3.22.4:
version "3.22.4"
resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.4.tgz#f31c3a9386f61b1f228af56faa9255e845cf3fff"
integrity sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==
+
+zod@^3.25.32:
+ version "3.25.76"
+ resolved "https://registry.yarnpkg.com/zod/-/zod-3.25.76.tgz#26841c3f6fd22a6a2760e7ccb719179768471e34"
+ integrity sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==