@directus/api
Version:
Directus is a real-time API and App dashboard for managing SQL database content
63 lines (61 loc) • 2.25 kB
JavaScript
import { FilesService } from "../../../services/files.js";
import { AssetsService } from "../../../services/assets.js";
import { requireText } from "../../../utils/require-text.js";
import { defineTool } from "../define-tool.js";
import { UnsupportedMediaTypeError } from "@directus/errors";
import { fileURLToPath } from "node:url";
import { z as z$1 } from "zod";
import { dirname, resolve } from "node:path";
//#region src/ai/tools/assets/index.ts
const __dirname = dirname(fileURLToPath(import.meta.url));
const AssetsValidateSchema = z$1.strictObject({ id: z$1.string() });
const AssetsInputSchema = z$1.object({ id: z$1.string() });
const assets = defineTool({
name: "assets",
description: "Retrieves image or audio file bytes for model inspection. Use after finding a Directus file id that needs visual or audio analysis.",
instructions: requireText(resolve(__dirname, "./prompt.md")),
keywords: [
"image",
"audio",
"media",
"vision",
"base64",
"file contents"
],
annotations: {
title: "Directus - Assets",
readOnlyHint: true
},
inputSchema: AssetsInputSchema,
validateSchema: AssetsValidateSchema,
readOnly: true,
async handler({ args, schema, accountability }) {
const serviceOptions = {
accountability,
schema
};
const file = await new FilesService(serviceOptions).readOne(args.id, { limit: 1 });
if (!file.type || !["image", "audio"].some((t) => file.type?.startsWith(t))) throw new UnsupportedMediaTypeError({
mediaType: file.type ?? "unknown",
where: "asset tool"
});
let transformation = void 0;
if (file.type.startsWith("image") && file.width && file.height && (file.width > 1200 || file.height > 1200)) transformation = { transformationParams: { transforms: file.width > file.height ? [["resize", {
width: 800,
fit: "contain"
}]] : [["resize", {
height: 800,
fit: "contain"
}]] } };
const asset = await new AssetsService(serviceOptions).getAsset(args.id, transformation);
const chunks = [];
for await (const chunk of asset.stream) chunks.push(Buffer.from(chunk));
return {
type: file.type.startsWith("image") ? "image" : "audio",
data: Buffer.concat(chunks).toString("base64"),
mimeType: file.type
};
}
});
//#endregion
export { assets };