diff --git a/frontend/src/components/WorkspaceChat/ChatContainer/PromptInput/SlashCommands/index.jsx b/frontend/src/components/WorkspaceChat/ChatContainer/PromptInput/SlashCommands/index.jsx deleted file mode 100644 index 2350241ea4c..00000000000 --- a/frontend/src/components/WorkspaceChat/ChatContainer/PromptInput/SlashCommands/index.jsx +++ /dev/null @@ -1,90 +0,0 @@ -import { useEffect, useRef, useState } from "react"; -import SlashCommandIcon from "./icons/SlashCommandIcon"; -import { Tooltip } from "react-tooltip"; -import ResetCommand from "./reset"; -import EndAgentSession from "./endAgentSession"; -import SlashPresets from "./SlashPresets"; -import { useTranslation } from "react-i18next"; -import { useSlashCommandKeyboardNavigation } from "@/hooks/useSlashCommandKeyboardNavigation"; - -export default function SlashCommandsButton({ showing, setShowSlashCommand }) { - const { t } = useTranslation(); - return ( -
setShowSlashCommand(!showing)} - className={`flex justify-center items-center cursor-pointer opacity-60 hover:opacity-100 light:opacity-100 light:hover:opacity-60 ${ - showing ? "!opacity-100" : "" - }`} - > - - -
- ); -} - -export function SlashCommands({ - showing, - setShowing, - sendCommand, - promptRef, - centered = false, -}) { - const cmdRef = useRef(null); - useSlashCommandKeyboardNavigation({ showing }); - - useEffect(() => { - function listenForOutsideClick() { - if (!showing || !cmdRef.current) return false; - document.addEventListener("click", closeIfOutside); - } - listenForOutsideClick(); - }, [showing, cmdRef.current]); - - const closeIfOutside = ({ target }) => { - if (target.id === "slash-cmd-btn") return; - const isOutside = !cmdRef?.current?.contains(target); - if (!isOutside) return; - setShowing(false); - }; - - return ( - - ); -} - -export function useSlashCommands() { - const [showSlashCommand, setShowSlashCommand] = useState(false); - return { showSlashCommand, setShowSlashCommand }; -} diff --git a/frontend/src/components/WorkspaceChat/ChatContainer/index.jsx b/frontend/src/components/WorkspaceChat/ChatContainer/index.jsx index 26cb0e4ef17..1281ac7af2c 100644 --- a/frontend/src/components/WorkspaceChat/ChatContainer/index.jsx +++ b/frontend/src/components/WorkspaceChat/ChatContainer/index.jsx @@ -291,23 +291,6 @@ export default function ChatContainer({ } }, [workspace?.slug]); - useEffect(() => { - if (pendingMessageChecked.current || !workspace?.slug) return; - pendingMessageChecked.current = true; - - const pending = safeJsonParse(sessionStorage.getItem(PENDING_HOME_MESSAGE)); - if (pending?.message) { - setTimeout(() => { - sessionStorage.removeItem(PENDING_HOME_MESSAGE); - sendCommand({ - text: pending.message, - attachments: pending.attachments || [], - autoSubmit: true, - }); - }, 100); - } - }, [workspace?.slug]); - useEffect(() => { async function fetchReply() { const promptMessage = diff --git a/frontend/src/locales/dynamicKeyAllowlist.js b/frontend/src/locales/dynamicKeyAllowlist.js deleted file mode 100644 index 75243556520..00000000000 --- a/frontend/src/locales/dynamicKeyAllowlist.js +++ /dev/null @@ -1,19 +0,0 @@ -// Keys listed here are used dynamically (e.g. t(variable)) and should never -// be flagged as unused or deleted by findUnusedTranslations.mjs. -// -// When you add a dynamic t() call, add the affected key(s) here so the -// pruning script knows they are intentionally referenced at runtime. -const DYNAMIC_KEY_ALLOWLIST = [ - // Used dynamically in KeyboardShortcutsHelp via t(`keyboard-shortcuts.shortcuts.${shortcut.translationKey}`) - "keyboard-shortcuts.shortcuts.settings", - "keyboard-shortcuts.shortcuts.home", - "keyboard-shortcuts.shortcuts.workspaces", - "keyboard-shortcuts.shortcuts.apiKeys", - "keyboard-shortcuts.shortcuts.llmPreferences", - "keyboard-shortcuts.shortcuts.chatSettings", - "keyboard-shortcuts.shortcuts.help", - "keyboard-shortcuts.shortcuts.showLLMSelector", - "keyboard-shortcuts.shortcuts.workspaceSettings", -]; - -export default DYNAMIC_KEY_ALLOWLIST; diff --git a/frontend/src/pages/GeneralSettings/LLMPreference/index.jsx b/frontend/src/pages/GeneralSettings/LLMPreference/index.jsx index 09ac98bd6eb..601609b0ce9 100644 --- a/frontend/src/pages/GeneralSettings/LLMPreference/index.jsx +++ b/frontend/src/pages/GeneralSettings/LLMPreference/index.jsx @@ -100,15 +100,6 @@ export const MODEL_ROUTER_PROVIDER = { * This **never** includes the model router provider. */ export const AVAILABLE_LLM_PROVIDERS = [ - { - name: "Model Router", - value: "anythingllm-router", - logo: AnythingLLMIcon, - options: (settings) => , - description: - "Route messages to different LLM providers based on rules you define.", - requiredConfig: [], - }, { name: "OpenAI", value: "openai", diff --git a/server/endpoints/embed/index.js b/server/endpoints/embed/index.js index 4eb1d4a9e73..b8d5e65b496 100644 --- a/server/endpoints/embed/index.js +++ b/server/endpoints/embed/index.js @@ -48,7 +48,7 @@ function embeddedEndpoints(app) { multiUserMode: multiUserMode(response), LLMSelection: process.env.LLM_PROVIDER || "openai", Embedder: process.env.EMBEDDING_ENGINE || "inherit", - VectorDbSelection: process.env.VECTOR_DB || "lancedb", + VectorDbSelection: process.env.VECTOR_DB || "pgvector", }); response.end(); } catch (e) { diff --git a/server/package.json b/server/package.json index c29446bb11f..272fd75a244 100644 --- a/server/package.json +++ b/server/package.json @@ -30,7 +30,6 @@ "@langchain/core": "0.1.61", "@langchain/openai": "0.0.28", "@langchain/textsplitters": "0.0.0", - "@mdpdf/mdpdf": "0.1.4", "@mintplex-labs/bree": "^9.2.5", "@mintplex-labs/express-ws": "^5.0.7", "@mintplex-labs/mdpdf": "^0.1.9", @@ -71,7 +70,6 @@ "jsdom": "26.1.0", "jsonrepair": "^3.7.0", "jsonwebtoken": "^9.0.0", - "jsdom": "26.1.0", "langchain": "0.1.36", "marked": "15.0.12", "mime": "^3.0.0", diff --git a/server/utils/AiProviders/dellProAiStudio/index.js b/server/utils/AiProviders/dellProAiStudio/index.js deleted file mode 100644 index 0b5751742c1..00000000000 --- a/server/utils/AiProviders/dellProAiStudio/index.js +++ /dev/null @@ -1,217 +0,0 @@ -const { NativeEmbedder } = require("../../EmbeddingEngines/native"); -const { - handleDefaultStreamResponseV2, - formatChatHistory, -} = require("../../helpers/chat/responses"); -const { - LLMPerformanceMonitor, -} = require("../../helpers/chat/LLMPerformanceMonitor"); - -// hybrid of openAi LLM chat completion for Dell Pro AI Studio -class DellProAiStudioLLM { - constructor(embedder = null, modelPreference = null) { - if (!process.env.DPAIS_LLM_BASE_PATH) - throw new Error("No Dell Pro AI Studio Base Path was set."); - - this.className = "DellProAiStudioLLM"; - const { OpenAI: OpenAIApi } = require("openai"); - this.dpais = new OpenAIApi({ - baseURL: DellProAiStudioLLM.parseBasePath(), - apiKey: null, - }); - - this.model = modelPreference || process.env.DPAIS_LLM_MODEL_PREF; - this.limits = { - history: this.promptWindowLimit() * 0.15, - system: this.promptWindowLimit() * 0.15, - user: this.promptWindowLimit() * 0.7, - }; - - this.embedder = embedder ?? new NativeEmbedder(); - this.defaultTemp = 0.7; - this.log( - `Dell Pro AI Studio LLM initialized with ${this.model}. ctx: ${this.promptWindowLimit()}` - ); - } - - /** - * Parse the base path for the Dell Pro AI Studio API - * so we can use it for inference requests - * @param {string} providedBasePath - * @returns {string} - */ - static parseBasePath(providedBasePath = process.env.DPAIS_LLM_BASE_PATH) { - try { - const baseURL = new URL(providedBasePath); - const basePath = `${baseURL.origin}/v1/openai`; - return basePath; - } catch { - return null; - } - } - - log(text, ...args) { - console.log(`\x1b[36m[${this.className}]\x1b[0m ${text}`, ...args); - } - - #appendContext(contextTexts = []) { - if (!contextTexts || !contextTexts.length) return ""; - return ( - "\nContext:\n" + - contextTexts - .map((text, i) => { - return `[CONTEXT ${i}]:\n${text}\n[END CONTEXT ${i}]\n\n`; - }) - .join("") - ); - } - - streamingEnabled() { - return "streamGetChatCompletion" in this; - } - - static promptWindowLimit(_modelName) { - const limit = process.env.DPAIS_LLM_MODEL_TOKEN_LIMIT || 4096; - if (!limit || isNaN(Number(limit))) - throw new Error("No Dell Pro AI Studio token context limit was set."); - return Number(limit); - } - - // Ensure the user set a value for the token limit - // and if undefined - assume 4096 window. - promptWindowLimit() { - const limit = process.env.DPAIS_LLM_MODEL_TOKEN_LIMIT || 4096; - if (!limit || isNaN(Number(limit))) - throw new Error("No Dell Pro AI Studio token context limit was set."); - return Number(limit); - } - - async isValidChatCompletionModel(_ = "") { - return true; - } - - /** - * Generates appropriate content array for a message + attachments. - * @param {{userPrompt:string, attachments: import("../../helpers").Attachment[]}} - * @returns {string|object[]} - */ - #generateContent({ userPrompt, attachments = [] }) { - if (!attachments.length) return userPrompt; - - const content = [{ type: "text", text: userPrompt }]; - for (let attachment of attachments) { - content.push({ - type: "image_url", - image_url: { - url: attachment.contentString, - detail: "auto", - }, - }); - } - return content.flat(); - } - - /** - * Construct the user prompt for this model. - * @param {{attachments: import("../../helpers").Attachment[]}} param0 - * @returns - */ - constructPrompt({ - systemPrompt = "", - contextTexts = [], - chatHistory = [], - userPrompt = "", - _attachments = [], // not used for Dell Pro AI Studio - `attachments` passed in is ignored - }) { - const prompt = { - role: "system", - content: `${systemPrompt}${this.#appendContext(contextTexts)}`, - }; - return [ - prompt, - ...formatChatHistory(chatHistory, this.#generateContent), - { - role: "user", - content: this.#generateContent({ userPrompt, _attachments }), - }, - ]; - } - - async getChatCompletion(messages = null, { temperature = 0.7 }) { - if (!this.model) - throw new Error( - `Dell Pro AI Studio chat: ${this.model} is not valid or defined model for chat completion!` - ); - - const result = await LLMPerformanceMonitor.measureAsyncFunction( - this.dpais.chat.completions.create({ - model: this.model, - messages, - temperature, - }) - ); - - if ( - !result.output.hasOwnProperty("choices") || - result.output.choices.length === 0 - ) - return null; - - return { - textResponse: result.output.choices[0].message.content, - metrics: { - prompt_tokens: result.output.usage?.prompt_tokens || 0, - completion_tokens: result.output.usage?.completion_tokens || 0, - total_tokens: result.output.usage?.total_tokens || 0, - outputTps: result.output.usage?.completion_tokens / result.duration, - duration: result.duration, - model: this.model, - provider: this.className, - timestamp: new Date(), - }, - }; - } - - async streamGetChatCompletion(messages = null, { temperature = 0.7 }) { - if (!this.model) - throw new Error( - `Dell Pro AI Studio chat: ${this.model} is not valid or defined model for chat completion!` - ); - - const measuredStreamRequest = await LLMPerformanceMonitor.measureStream({ - func: this.dpais.chat.completions.create({ - model: this.model, - stream: true, - messages, - temperature, - }), - messages, - runPromptTokenCalculation: true, - modelTag: this.model, - provider: this.className, - }); - return measuredStreamRequest; - } - - handleStream(response, stream, responseProps) { - return handleDefaultStreamResponseV2(response, stream, responseProps); - } - - // Simple wrapper for dynamic embedder & normalize interface for all LLM implementations - async embedTextInput(textInput) { - return await this.embedder.embedTextInput(textInput); - } - async embedChunks(textChunks = []) { - return await this.embedder.embedChunks(textChunks); - } - - async compressMessages(promptArgs = {}, rawHistory = []) { - const { messageArrayCompressor } = require("../../helpers/chat"); - const messageArray = this.constructPrompt(promptArgs); - return await messageArrayCompressor(this, messageArray, rawHistory); - } -} - -module.exports = { - DellProAiStudioLLM, -}; diff --git a/server/utils/agents/aibitat/providers/apipie.js b/server/utils/agents/aibitat/providers/apipie.js index f7eeb279cc3..e788f134d86 100644 --- a/server/utils/agents/aibitat/providers/apipie.js +++ b/server/utils/agents/aibitat/providers/apipie.js @@ -33,15 +33,6 @@ class ApiPieProvider extends InheritMultiple([Provider, UnTooled]) { return true; } - /** - * Whether this provider supports native OpenAI-compatible tool calling. - * Override in subclass and return true to use native tool calling instead of UnTooled. - * @returns {boolean|Promise} - */ - supportsNativeToolCalling() { - return false; - } - async #handleFunctionCallChat({ messages = [] }) { return await this.client.chat.completions .create({ diff --git a/server/utils/agents/aibitat/providers/cohere.js b/server/utils/agents/aibitat/providers/cohere.js index a09d0f99e9d..0647402eb86 100644 --- a/server/utils/agents/aibitat/providers/cohere.js +++ b/server/utils/agents/aibitat/providers/cohere.js @@ -71,41 +71,6 @@ class CohereProvider extends InheritMultiple([Provider, UnTooled]) { }); } - /** - * Format a message with attachments for Cohere's v2 API. - * Cohere SDK uses camelCase (imageUrl) instead of snake_case (image_url). - * @param {Object} message - Message with potential attachments - * @returns {Object} Formatted message for Cohere SDK - */ - formatMessageWithAttachments(message) { - if (!message.attachments || message.attachments.length === 0) { - return message; - } - - const content = [{ type: "text", text: message.content }]; - for (const attachment of message.attachments) { - content.push({ - type: "image_url", - imageUrl: { - url: attachment.contentString, - }, - }); - } - - const { attachments: _, ...rest } = message; - return { - ...rest, - content, - }; - } - - /** - * Stream a chat completion using the Cohere v2 API. - * The v2 API accepts OpenAI-compatible message format directly, - * including multimodal content arrays for vision support. - * @param {Object} options - Options containing messages array - * @returns {AsyncIterable} Stream of events from Cohere - */ async #handleFunctionCallStream({ messages = [] }) { return await this.client.chat.completions.create({ model: this.model, diff --git a/server/utils/agents/aibitat/providers/cometapi.js b/server/utils/agents/aibitat/providers/cometapi.js index e94a7c6eae1..543b0b682a2 100644 --- a/server/utils/agents/aibitat/providers/cometapi.js +++ b/server/utils/agents/aibitat/providers/cometapi.js @@ -37,15 +37,6 @@ class CometApiProvider extends InheritMultiple([Provider, UnTooled]) { return false; } - /** - * Whether this provider supports native OpenAI-compatible tool calling. - * Override in subclass and return true to use native tool calling instead of UnTooled. - * @returns {boolean|Promise} - */ - supportsNativeToolCalling() { - return false; - } - async #handleFunctionCallChat({ messages = [] }) { return await this.client.chat.completions .create({ diff --git a/server/utils/agents/aibitat/providers/dellProAiStudio.js b/server/utils/agents/aibitat/providers/dellProAiStudio.js deleted file mode 100644 index d014e59140f..00000000000 --- a/server/utils/agents/aibitat/providers/dellProAiStudio.js +++ /dev/null @@ -1,108 +0,0 @@ -const OpenAI = require("openai"); -const Provider = require("./ai-provider.js"); -const InheritMultiple = require("./helpers/classes.js"); -const UnTooled = require("./helpers/untooled.js"); -const { - DellProAiStudioLLM, -} = require("../../../AiProviders/dellProAiStudio/index.js"); - -/** - * The agent provider for Dell Pro AI Studio. - */ -class DellProAiStudioProvider extends InheritMultiple([Provider, UnTooled]) { - model; - - /** - * - * @param {{model?: string}} config - */ - constructor(config = {}) { - super(); - this.providerTag = "dpais"; - const model = config?.model || process.env.DPAIS_LLM_MODEL_PREF; - const client = new OpenAI({ - baseURL: DellProAiStudioLLM.parseBasePath(), // Will use process.env.DPAIS_LLM_BASE_PATH if not provided - apiKey: null, - }); - - this._client = client; - this.model = model; - this.verbose = true; - } - - get client() { - return this._client; - } - - get supportsAgentStreaming() { - return true; - } - - /** - * Whether this provider supports native OpenAI-compatible tool calling. - * It is unknown if Dell Pro AI Studio supports tool calling since we dont have a great way to test it - * as the service seems mostly deprecated at this point. Just going to keep it as-is for now. - * @returns {boolean|Promise} - */ - supportsNativeToolCalling() { - return false; - } - - async #handleFunctionCallChat({ messages = [] }) { - return await this.client.chat.completions - .create({ - model: this.model, - messages, - }) - .then((result) => { - if (!result.hasOwnProperty("choices")) - throw new Error("DellProAiStudio chat: No results!"); - if (result.choices.length === 0) - throw new Error("DellProAiStudio chat: No results length!"); - return result.choices[0].message.content; - }) - .catch((_) => { - return null; - }); - } - - async #handleFunctionCallStream({ messages = [] }) { - return await this.client.chat.completions.create({ - model: this.model, - stream: true, - messages, - }); - } - - async stream(messages, functions = [], eventHandler = null) { - return await UnTooled.prototype.stream.call( - this, - messages, - functions, - this.#handleFunctionCallStream.bind(this), - eventHandler - ); - } - - async complete(messages, functions = []) { - return await UnTooled.prototype.complete.call( - this, - messages, - functions, - this.#handleFunctionCallChat.bind(this) - ); - } - - /** - * Get the cost of the completion. - * - * @param _usage The completion to get the cost for. - * @returns The cost of the completion. - * Stubbed since LMStudio has no cost basis. - */ - getCost(_usage) { - return 0; - } -} - -module.exports = DellProAiStudioProvider; diff --git a/server/utils/agents/aibitat/providers/fireworksai.js b/server/utils/agents/aibitat/providers/fireworksai.js index 35764e3b88e..a34ed8c90b8 100644 --- a/server/utils/agents/aibitat/providers/fireworksai.js +++ b/server/utils/agents/aibitat/providers/fireworksai.js @@ -34,15 +34,6 @@ class FireworksAIProvider extends InheritMultiple([Provider, UnTooled]) { return true; } - /** - * Whether this provider supports native OpenAI-compatible tool calling. - * Override in subclass and return true to use native tool calling instead of UnTooled. - * @returns {boolean|Promise} - */ - supportsNativeToolCalling() { - return false; - } - async #handleFunctionCallChat({ messages = [] }) { return await this.client.chat.completions .create({ diff --git a/server/utils/agents/aibitat/providers/genericOpenAi.js b/server/utils/agents/aibitat/providers/genericOpenAi.js index 47074b537c5..640a37f6625 100644 --- a/server/utils/agents/aibitat/providers/genericOpenAi.js +++ b/server/utils/agents/aibitat/providers/genericOpenAi.js @@ -49,31 +49,6 @@ class GenericOpenAiProvider extends InheritMultiple([Provider, UnTooled]) { return true; } - /** - * Whether this provider supports native OpenAI-compatible tool calling. - * - This can be any OpenAI compatible provider that supports tool calling - * - We check the ENV to see if the provider supports tool calling. - * - If the ENV is not set, we default to false. - * @returns {boolean|Promise} - */ - supportsNativeToolCalling() { - if (this._supportsToolCalling !== null) return this._supportsToolCalling; - const genericOpenAi = new GenericOpenAiLLM(null, this.model); - const capabilities = genericOpenAi.getModelCapabilities(); - this._supportsToolCalling = capabilities.tools === true; - - if (this._supportsToolCalling) - this.providerLog( - "Generic OpenAI supports native tool calling is ENABLED." - ); - else - this.providerLog( - "Generic OpenAI supports native tool calling is DISABLED. Will use UnTooled instead." - ); - - return this._supportsToolCalling; - } - async #handleFunctionCallChat({ messages = [] }) { return await this.client.chat.completions .create({ diff --git a/server/utils/agents/aibitat/providers/giteeai.js b/server/utils/agents/aibitat/providers/giteeai.js index 1240a21ce80..0da9499ecc8 100644 --- a/server/utils/agents/aibitat/providers/giteeai.js +++ b/server/utils/agents/aibitat/providers/giteeai.js @@ -28,15 +28,6 @@ class GiteeAIProvider extends InheritMultiple([Provider, UnTooled]) { return true; } - /** - * Whether this provider supports native OpenAI-compatible tool calling. - * Override in subclass and return true to use native tool calling instead of UnTooled. - * @returns {boolean|Promise} - */ - supportsNativeToolCalling() { - return false; - } - async #handleFunctionCallChat({ messages = [] }) { return await this.client.chat.completions .create({ diff --git a/server/utils/agents/aibitat/providers/groq.js b/server/utils/agents/aibitat/providers/groq.js index 730764c03a6..038d952d809 100644 --- a/server/utils/agents/aibitat/providers/groq.js +++ b/server/utils/agents/aibitat/providers/groq.js @@ -36,25 +36,6 @@ class GroqProvider extends InheritMultiple([Provider, UnTooled]) { return true; } - /** - * Whether this provider supports native OpenAI-compatible tool calling. - * - Since Groq models vary in tool calling support, we check the ENV. - * - If the ENV is not set, we default to false. - * @returns {boolean} - */ - supportsNativeToolCalling() { - if (this._supportsToolCalling !== null) return this._supportsToolCalling; - const supportsToolCalling = this.supportsNativeToolCallingViaEnv("groq"); - if (supportsToolCalling) - this.providerLog("Groq supports native tool calling is ENABLED via ENV."); - else - this.providerLog( - "Groq supports native tool calling is DISABLED via ENV. Will use UnTooled instead." - ); - this._supportsToolCalling = supportsToolCalling; - return supportsToolCalling; - } - async #handleFunctionCallChat({ messages = [] }) { return await this.client.chat.completions .create({ diff --git a/server/utils/agents/aibitat/providers/koboldcpp.js b/server/utils/agents/aibitat/providers/koboldcpp.js index 9363905876d..e0fa2fcfee5 100644 --- a/server/utils/agents/aibitat/providers/koboldcpp.js +++ b/server/utils/agents/aibitat/providers/koboldcpp.js @@ -34,15 +34,6 @@ class KoboldCPPProvider extends InheritMultiple([Provider, UnTooled]) { return true; } - /** - * Whether this provider supports native OpenAI-compatible tool calling. - * Override in subclass and return true to use native tool calling instead of UnTooled. - * @returns {boolean|Promise} - */ - supportsNativeToolCalling() { - return false; - } - async #handleFunctionCallChat({ messages = [] }) { return await this.client.chat.completions .create({ diff --git a/server/utils/agents/aibitat/providers/litellm.js b/server/utils/agents/aibitat/providers/litellm.js index 53137a20fe4..049aace3e9e 100644 --- a/server/utils/agents/aibitat/providers/litellm.js +++ b/server/utils/agents/aibitat/providers/litellm.js @@ -36,27 +36,6 @@ class LiteLLMProvider extends InheritMultiple([Provider, UnTooled]) { return true; } - /** - * Whether this provider supports native OpenAI-compatible tool calling. - * - Since LiteLLM models vary in tool calling support, we check the ENV. - * - If the ENV is not set, we default to false. - * @returns {boolean} - */ - supportsNativeToolCalling() { - if (this._supportsToolCalling !== null) return this._supportsToolCalling; - const supportsToolCalling = this.supportsNativeToolCallingViaEnv("litellm"); - if (supportsToolCalling) - this.providerLog( - "LiteLLM supports native tool calling is ENABLED via ENV." - ); - else - this.providerLog( - "LiteLLM supports native tool calling is DISABLED via ENV. Will use UnTooled instead." - ); - this._supportsToolCalling = supportsToolCalling; - return supportsToolCalling; - } - async #handleFunctionCallChat({ messages = [] }) { return await this.client.chat.completions .create({ diff --git a/server/utils/agents/aibitat/providers/mistral.js b/server/utils/agents/aibitat/providers/mistral.js index 11299c41170..709fceba950 100644 --- a/server/utils/agents/aibitat/providers/mistral.js +++ b/server/utils/agents/aibitat/providers/mistral.js @@ -33,15 +33,6 @@ class MistralProvider extends InheritMultiple([Provider, UnTooled]) { return true; } - /** - * Whether this provider supports native OpenAI-compatible tool calling. - * Override in subclass and return true to use native tool calling instead of UnTooled. - * @returns {boolean|Promise} - */ - supportsNativeToolCalling() { - return false; - } - async #handleFunctionCallChat({ messages = [] }) { return await this.client.chat.completions .create({ diff --git a/server/utils/agents/aibitat/providers/moonshotAi.js b/server/utils/agents/aibitat/providers/moonshotAi.js index 6fbff577541..e863f917e19 100644 --- a/server/utils/agents/aibitat/providers/moonshotAi.js +++ b/server/utils/agents/aibitat/providers/moonshotAi.js @@ -30,15 +30,6 @@ class MoonshotAiProvider extends InheritMultiple([Provider, UnTooled]) { return true; } - /** - * Whether this provider supports native OpenAI-compatible tool calling. - * Override in subclass and return true to use native tool calling instead of UnTooled. - * @returns {boolean|Promise} - */ - supportsNativeToolCalling() { - return false; - } - async #handleFunctionCallChat({ messages = [] }) { return await this.client.chat.completions .create({ diff --git a/server/utils/agents/aibitat/providers/openrouter.js b/server/utils/agents/aibitat/providers/openrouter.js index 757059fe7fc..4f4af421472 100644 --- a/server/utils/agents/aibitat/providers/openrouter.js +++ b/server/utils/agents/aibitat/providers/openrouter.js @@ -42,28 +42,6 @@ class OpenRouterProvider extends InheritMultiple([Provider, UnTooled]) { return true; } - /** - * Whether this provider supports native OpenAI-compatible tool calling. - * - Since OpenRouter models vary in tool calling support, we check the ENV. - * - If the ENV is not set, we default to false. - * @returns {boolean} - */ - supportsNativeToolCalling() { - if (this._supportsToolCalling !== null) return this._supportsToolCalling; - const supportsToolCalling = - this.supportsNativeToolCallingViaEnv("openrouter"); - if (supportsToolCalling) - this.providerLog( - "OpenRouter supports native tool calling is ENABLED via ENV." - ); - else - this.providerLog( - "OpenRouter supports native tool calling is DISABLED via ENV. Will use UnTooled instead." - ); - this._supportsToolCalling = supportsToolCalling; - return supportsToolCalling; - } - async #handleFunctionCallChat({ messages = [] }) { return await this.client.chat.completions .create({ diff --git a/server/utils/agents/aibitat/providers/ppio.js b/server/utils/agents/aibitat/providers/ppio.js index 193817332e3..2c6e46a7d43 100644 --- a/server/utils/agents/aibitat/providers/ppio.js +++ b/server/utils/agents/aibitat/providers/ppio.js @@ -37,15 +37,6 @@ class PPIOProvider extends InheritMultiple([Provider, UnTooled]) { return false; } - /** - * Whether this provider supports native OpenAI-compatible tool calling. - * Override in subclass and return true to use native tool calling instead of UnTooled. - * @returns {boolean|Promise} - */ - supportsNativeToolCalling() { - return false; - } - async #handleFunctionCallChat({ messages = [] }) { return await this.client.chat.completions .create({ diff --git a/server/utils/agents/aibitat/providers/privatemode.js b/server/utils/agents/aibitat/providers/privatemode.js index b0d2bc81e73..7cd4dedccc1 100644 --- a/server/utils/agents/aibitat/providers/privatemode.js +++ b/server/utils/agents/aibitat/providers/privatemode.js @@ -36,15 +36,6 @@ class PrivatemodelProvider extends InheritMultiple([Provider, UnTooled]) { return true; } - /** - * Whether this provider supports native OpenAI-compatible tool calling. - * Override in subclass and return true to use native tool calling instead of UnTooled. - * @returns {boolean|Promise} - */ - supportsNativeToolCalling() { - return false; - } - async #handleFunctionCallChat({ messages = [] }) { return await this.client.chat.completions .create({ diff --git a/server/utils/agents/aibitat/providers/sambanova.js b/server/utils/agents/aibitat/providers/sambanova.js index dc15a412590..d9454030c51 100644 --- a/server/utils/agents/aibitat/providers/sambanova.js +++ b/server/utils/agents/aibitat/providers/sambanova.js @@ -30,15 +30,6 @@ class SambaNovaProvider extends InheritMultiple([Provider, UnTooled]) { return true; } - /** - * Whether this provider supports native OpenAI-compatible tool calling. - * Override in subclass and return true to use native tool calling instead of UnTooled. - * @returns {boolean|Promise} - */ - supportsNativeToolCalling() { - return false; - } - async #handleFunctionCallChat({ messages = [] }) { return await this.client.chat.completions .create({ diff --git a/server/utils/agents/aibitat/providers/textgenwebui.js b/server/utils/agents/aibitat/providers/textgenwebui.js index 50dfa38b014..e457eff2b56 100644 --- a/server/utils/agents/aibitat/providers/textgenwebui.js +++ b/server/utils/agents/aibitat/providers/textgenwebui.js @@ -32,15 +32,6 @@ class TextWebGenUiProvider extends InheritMultiple([Provider, UnTooled]) { return true; } - /** - * Whether this provider supports native OpenAI-compatible tool calling. - * Override in subclass and return true to use native tool calling instead of UnTooled. - * @returns {boolean|Promise} - */ - supportsNativeToolCalling() { - return false; - } - async #handleFunctionCallChat({ messages = [] }) { return await this.client.chat.completions .create({ diff --git a/server/utils/agents/aibitat/providers/togetherai.js b/server/utils/agents/aibitat/providers/togetherai.js index 30e64279af1..4d44b69a4d8 100644 --- a/server/utils/agents/aibitat/providers/togetherai.js +++ b/server/utils/agents/aibitat/providers/togetherai.js @@ -33,15 +33,6 @@ class TogetherAIProvider extends InheritMultiple([Provider, UnTooled]) { return true; } - /** - * Whether this provider supports native OpenAI-compatible tool calling. - * Override in subclass and return true to use native tool calling instead of UnTooled. - * @returns {boolean|Promise} - */ - supportsNativeToolCalling() { - return false; - } - async #handleFunctionCallChat({ messages = [] }) { return await this.client.chat.completions .create({ diff --git a/server/utils/agents/aibitat/providers/xai.js b/server/utils/agents/aibitat/providers/xai.js index dc2f1f6fda2..02125d0f8dd 100644 --- a/server/utils/agents/aibitat/providers/xai.js +++ b/server/utils/agents/aibitat/providers/xai.js @@ -33,15 +33,6 @@ class XAIProvider extends InheritMultiple([Provider, UnTooled]) { return true; } - /** - * Whether this provider supports native OpenAI-compatible tool calling. - * Override in subclass and return true to use native tool calling instead of UnTooled. - * @returns {boolean|Promise} - */ - supportsNativeToolCalling() { - return false; - } - async #handleFunctionCallChat({ messages = [] }) { return await this.client.chat.completions .create({ diff --git a/server/utils/agents/aibitat/providers/zai.js b/server/utils/agents/aibitat/providers/zai.js index 8d20c2b3125..bbc5f97a122 100644 --- a/server/utils/agents/aibitat/providers/zai.js +++ b/server/utils/agents/aibitat/providers/zai.js @@ -30,15 +30,6 @@ class ZAIProvider extends InheritMultiple([Provider, UnTooled]) { return true; } - /** - * Whether this provider supports native OpenAI-compatible tool calling. - * Override in subclass and return true to use native tool calling instead of UnTooled. - * @returns {boolean|Promise} - */ - supportsNativeToolCalling() { - return false; - } - async #handleFunctionCallChat({ messages = [] }) { return await this.client.chat.completions .create({ diff --git a/server/utils/agents/defaults.js b/server/utils/agents/defaults.js index cfcda508d65..e3d48cd0a61 100644 --- a/server/utils/agents/defaults.js +++ b/server/utils/agents/defaults.js @@ -136,24 +136,6 @@ async function agentSkillsFromSystemSettings() { systemFunctions.push(AgentPlugins[skill].name); }); - // Load disabled filesystem sub-skills - const _disabledFilesystemSkills = safeJsonParse( - await SystemSettings.getValueOrFallback( - { label: "disabled_filesystem_skills" }, - "[]" - ), - [] - ); - - // Load disabled create-files sub-skills - const _disabledCreateFilesSkills = safeJsonParse( - await SystemSettings.getValueOrFallback( - { label: "disabled_create_files_skills" }, - "[]" - ), - [] - ); - // Load non-imported built-in skills that are configurable. const _setting = safeJsonParse( await SystemSettings.getValueOrFallback( diff --git a/server/utils/telegramBot/index.js b/server/utils/telegramBot/index.js index 98a594dd36f..503a71e457d 100644 --- a/server/utils/telegramBot/index.js +++ b/server/utils/telegramBot/index.js @@ -196,6 +196,7 @@ class TelegramBotService { } catch { // Polling may already be stopped } + // Kill any active workers before clearing state for (const chatId of this.#activeWorkers.keys()) { this.abortChat(chatId); diff --git a/server/utils/vectorDbProviders/pgvector/index.js b/server/utils/vectorDbProviders/pgvector/index.js index 28b28d3bc56..2915a15b9a0 100644 --- a/server/utils/vectorDbProviders/pgvector/index.js +++ b/server/utils/vectorDbProviders/pgvector/index.js @@ -57,7 +57,7 @@ class PGVector extends VectorDatabase { * @returns {string | null} */ static connectionString() { - return process.env.PGVECTOR_CONNECTION_STRING; + return process.env.DATABASE_URL || process.env.PGVECTOR_CONNECTION_STRING; } createTableSql(dimensions) { diff --git a/server/yarn.lock b/server/yarn.lock index aca5d5c3ebe..fb493c37d18 100644 --- a/server/yarn.lock +++ b/server/yarn.lock @@ -771,48 +771,6 @@ "@langchain/core" "~0.1" js-tiktoken "^1.0.11" -"@mdpdf/mdpdf-darwin-arm64@0.1.4": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@mdpdf/mdpdf-darwin-arm64/-/mdpdf-darwin-arm64-0.1.4.tgz#06e10d368512bcc19a77d702e1fbf32f00aba49d" - integrity sha512-WVfKlZgboAvudJHCr7PTdGgKNEUIUWwW/Md4MTzXamKfcfvJ6ORm8vQ6wx0jmfjBH1UwjqnINlxxYEUt1Jf7dw== - -"@mdpdf/mdpdf-darwin-x64@0.1.4": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@mdpdf/mdpdf-darwin-x64/-/mdpdf-darwin-x64-0.1.4.tgz#709e3cb191249f0b41785a01fb7aa2e9936badc7" - integrity sha512-tDaEuVhuFagWmSJuS44HeG4S2VzsMCV30JaF+1zMGKxnGYtuXEL+q+Lklvt1T6JkaHaZjHVEA5klz1XXTNDDHA== - -"@mdpdf/mdpdf-linux-arm64-gnu@0.1.4": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@mdpdf/mdpdf-linux-arm64-gnu/-/mdpdf-linux-arm64-gnu-0.1.4.tgz#fa4b4a319e47263df336c2a4620688cda242bfa5" - integrity sha512-Rhy5DI3uwKNjeS+JW33CZdguFYZ0uRmc5iOLDdHl2bvmDPUzfAQSD1g6KJtqrqyDXbTe2N9jP+NOCVtkOSpw3Q== - -"@mdpdf/mdpdf-linux-x64-gnu@0.1.4": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@mdpdf/mdpdf-linux-x64-gnu/-/mdpdf-linux-x64-gnu-0.1.4.tgz#bc4014b1da3bb6769665e002be162c993be99ddb" - integrity sha512-NWpMYDBr1z59H9GlQdBizI8H8ODygui7j9NHpn2qiMrcnMvPBtmkH84YaXSHSYmUQ41UafRA/bnY5h5tkQb+Bw== - -"@mdpdf/mdpdf-linux-x64-musl@0.1.4": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@mdpdf/mdpdf-linux-x64-musl/-/mdpdf-linux-x64-musl-0.1.4.tgz#f88fabab2ffd33a49b2213210d96c3d607cdd43f" - integrity sha512-dwwVfZpNONyYUFkFjrgRq5igEVqCMetkYR+cCmH0fD6b0mq2gsa7/mrSUPZGX5sz/dJ5hePmJb2hRBIL9Fu3yQ== - -"@mdpdf/mdpdf-win32-x64-msvc@0.1.4": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@mdpdf/mdpdf-win32-x64-msvc/-/mdpdf-win32-x64-msvc-0.1.4.tgz#75caba7ccc20d59f87bc7fa26e7597f803f13b2b" - integrity sha512-NQBTbhbe+i1HjC4F4WXDiYiItBm0j3LFVpz3uaZgz88umF656j0n4YgOeJKRRx6S4k+l3nzvu19GFoR3ocHLdg== - -"@mdpdf/mdpdf@0.1.4": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@mdpdf/mdpdf/-/mdpdf-0.1.4.tgz#5b244cccde9af845806deb949cd2530552e6cd1a" - integrity sha512-xGaqXEsuIylP0lQiA17BLb7ERMvcY3VRuyBOGbTRu6TjgrX4BZHPdoi6oUCUOi8sV/vZJYnjy7Xo/b/cX9lzsQ== - optionalDependencies: - "@mdpdf/mdpdf-darwin-arm64" "0.1.4" - "@mdpdf/mdpdf-darwin-x64" "0.1.4" - "@mdpdf/mdpdf-linux-arm64-gnu" "0.1.4" - "@mdpdf/mdpdf-linux-x64-gnu" "0.1.4" - "@mdpdf/mdpdf-linux-x64-musl" "0.1.4" - "@mdpdf/mdpdf-win32-x64-msvc" "0.1.4" - "@mintplex-labs/bree@^9.2.5": version "9.2.5" resolved "https://registry.npmjs.org/@mintplex-labs/bree/-/bree-9.2.5.tgz" @@ -1941,7 +1899,7 @@ call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: callsites@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== camelcase@6: @@ -4773,7 +4731,7 @@ jws@^4.0.0: keyv@^4.5.4: version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: json-buffer "3.0.1" @@ -4991,7 +4949,7 @@ lodash.isundefined@^3.0.1: lodash.merge@^4.6.2: version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== lodash.once@^4.0.0: @@ -5792,7 +5750,7 @@ pako@^1.0.10, pako@^1.0.11, pako@^1.0.6, pako@~1.0.2: parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" @@ -6419,7 +6377,7 @@ requires-port@^1.0.0: resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== resolve@^2.0.0-next.5: @@ -7039,7 +6997,7 @@ strip-final-newline@^2.0.0: strip-json-comments@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== strip-json-comments@~2.0.1: