feat(ollama): add tool calling support

Add Ollama tool integration for web search, weather, datetime, filesystem operations, and shell evaluation. Implement multi-round tool call handling, streaming updates, thinking cleanup, and safer path validation for file tools.

Also add related environment configuration, command execution helper, MarkdownV2 cancel handling fixes, and remove unused TryAgain callback command.
This commit is contained in:
2026-05-03 15:16:14 +03:00
parent 86b26813e2
commit 2fc60806ff
7 changed files with 2046 additions and 129 deletions
+20 -9
View File
@@ -28,12 +28,18 @@ export class Environment {
static PROCESS_LINKS: boolean;
static DEFAULT_AI_PROVIDER: AiProvider;
static RATE_LIMIT_FALLBACK_POLICY: RateLimitFallbackPolicy;
static IMAGE_HANDLE_POLICY: ImageHandlePolicy;
static IMAGE_HANDLE_FALLBACK_POLICY: ImageHandleFallbackPolicy;
static BRAVE_SEARCH_API_KEY?: string;
static OPEN_WEATHER_MAP_API_KEY?: string;
static FILE_TOOLS_ROOT_DIR?: string;
// AI Stuff
static DEFAULT_AI_PROVIDER: AiProvider;
static SYSTEM_PROMPT?: string;
static USE_NAMES_IN_PROMPT: boolean;
static USE_SYSTEM_PROMPT: boolean;
@@ -84,13 +90,6 @@ export class Environment {
Environment.PROCESS_LINKS = ifTrue(process.env.PROCESS_LINKS);
const aiProvider = process.env.DEFAULT_AI_PROVIDER || "OLLAMA";
if (Object.values(AiProvider).includes(aiProvider as AiProvider)) {
Environment.DEFAULT_AI_PROVIDER = aiProvider as AiProvider;
} else {
Environment.DEFAULT_AI_PROVIDER = AiProvider.OLLAMA;
}
const rateLimitFallbackPolicy = process.env.RATE_LIMIT_FALLBACK_POLICY || "NOTIFY_USER";
if (Object.values(RateLimitFallbackPolicy).includes(rateLimitFallbackPolicy as RateLimitFallbackPolicy)) {
Environment.RATE_LIMIT_FALLBACK_POLICY = rateLimitFallbackPolicy as RateLimitFallbackPolicy;
@@ -112,6 +111,18 @@ export class Environment {
Environment.IMAGE_HANDLE_FALLBACK_POLICY = ImageHandleFallbackPolicy.NOTIFY_USER;
}
Environment.BRAVE_SEARCH_API_KEY = process.env.BRAVE_SEARCH_API_KEY;
Environment.OPEN_WEATHER_MAP_API_KEY = process.env.OPEN_WEATHER_MAP_API_KEY;
Environment.FILE_TOOLS_ROOT_DIR = process.env.FILE_TOOLS_ROOT_DIR;
const aiProvider = process.env.DEFAULT_AI_PROVIDER || "OLLAMA";
if (Object.values(AiProvider).includes(aiProvider as AiProvider)) {
Environment.DEFAULT_AI_PROVIDER = aiProvider as AiProvider;
} else {
Environment.DEFAULT_AI_PROVIDER = AiProvider.OLLAMA;
}
Environment.USE_NAMES_IN_PROMPT = ifTrue(process.env.USE_NAMES_IN_PROMPT);
Environment.USE_SYSTEM_PROMPT = ifTrue(process.env.USE_SYSTEM_PROMPT || "true");
Environment.SEND_TIME_TOOK = ifTrue(process.env.SEND_TOOK_TIME || "false");