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: