ai: add common tool runtime and built-in tools

This commit is contained in:
2026-05-10 22:52:48 +03:00
parent 32c35f54aa
commit 355ae8e5da
14 changed files with 2864 additions and 0 deletions
+102
View File
@@ -0,0 +1,102 @@
import {Ollama} from "ollama";
export function asNonEmptyString(value: unknown): string | undefined {
return typeof value === "string" && value.trim().length > 0
? value.trim()
: undefined;
}
export function normalizeToolArguments(args: unknown): Record<string, unknown> {
if (!args) return {};
if (typeof args === "string") {
try {
const parsed = JSON.parse(args);
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
return parsed as Record<string, unknown>;
}
} catch {
return {
raw: args,
};
}
return {};
}
if (typeof args === "object" && !Array.isArray(args)) {
return args as Record<string, unknown>;
}
return {};
}
export function asBoolean(value: unknown, defaultValue = false): boolean {
if (typeof value === "boolean") return value;
if (typeof value === "string") {
const normalized = value.trim().toLowerCase();
if (normalized === "true") return true;
if (normalized === "false") return false;
}
return defaultValue;
}
export function asString(value: unknown, defaultValue = ""): string {
return typeof value === "string" ? value : defaultValue;
}
export function asPositiveInt(value: unknown, defaultValue: number, maxValue: number): number {
const n = typeof value === "number"
? value
: typeof value === "string"
? Number(value)
: NaN;
if (!Number.isFinite(n) || n <= 0) return defaultValue;
return Math.min(Math.floor(n), maxValue);
}
export async function unloadAllOllamaModels(ollama: Ollama, exceptFor?: string[]) {
try {
const runningModels = await ollama.ps();
const modelsToUnload = runningModels.models
.filter(m => !exceptFor?.includes(m.model));
const unloadPromises = modelsToUnload
.map(model =>
ollama.generate({
model: model.name,
keep_alive: 0,
stream: false,
prompt: ""
})
);
await Promise.all(unloadPromises);
console.log("All models have been requested to unload" + exceptFor?.length ? ` except for [${exceptFor?.join(", ")}].` : ".");
} catch (error) {
console.error("Error unloading models:", error);
}
}
export async function loadOllamaModel(model: string, ollama: Ollama, contextLength: number): Promise<boolean> {
try {
await ollama.generate({
model: model,
stream: false,
prompt: "",
options: {
num_ctx: contextLength
}
});
return true;
} catch (e: any) {
console.error("Error loading Ollama model:", model);
return false;
}
}