ai: add common tool runtime and built-in tools
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user