Artifacts
Recipes
Practical patterns for saving, loading, and transforming artifacts
Upload → Process → Save Results
import { createTool } from "@iqai/adk";
import * as z from "zod";
export const analyzeCsv = createTool({
name: "analyze_csv",
description: "Analyze uploaded CSV",
schema: z.object({ filename: z.string() }),
fn: async ({ filename }, ctx) => {
const files = await ctx.listArtifacts();
if (!files.includes(filename)) return { error: "File not found", files };
const artifact = await ctx.loadArtifact(filename);
if (!artifact?.inlineData) return { error: "Could not load file" };
const text = Buffer.from(artifact.inlineData.data, "base64").toString(
"utf-8",
);
const [header, ...rows] = text.split("\n").filter(Boolean);
const headers = header.split(",").map(h => h.trim());
const result = {
summary: "CSV analysis complete",
rowCount: rows.length,
columnCount: headers.length,
headers,
};
const resultArtifact = {
inlineData: {
data: Buffer.from(JSON.stringify(result, null, 2)).toString("base64"),
mimeType: "application/json",
},
};
const out = `analysis_${filename.replace(/\.[^/.]+$/, "")}.json`;
await ctx.saveArtifact(out, resultArtifact);
return { output: out, ...result };
},
});Generate Media → Save + Reuse
import type { CallbackContext } from "@iqai/adk";
export async function generateSvg(ctx: CallbackContext) {
const svg = `<svg width="200" height="100" xmlns="http://www.w3.org/2000/svg"><rect width="200" height="100" fill="black"/></svg>`;
await ctx.saveArtifact("banner.svg", {
inlineData: {
data: Buffer.from(svg).toString("base64"),
mimeType: "image/svg+xml",
},
});
// Later
const loaded = await ctx.loadArtifact("banner.svg");
if (loaded) {
const svgText = Buffer.from(loaded.inlineData.data, "base64").toString(
"utf-8",
);
// Use svgText (serve to UI, embed in response, etc.)
}
}Cache Expensive Binary Output
import type { CallbackContext } from "@iqai/adk";
export async function cachedChart(ctx: CallbackContext) {
const cacheKey = "chart.png";
const cached = await ctx.loadArtifact(cacheKey);
if (cached) return { info: "hit", cacheKey };
const png = Buffer.from(/* expensive render */);
await ctx.saveArtifact(cacheKey, {
inlineData: { data: png.toString("base64"), mimeType: "image/png" },
});
return { info: "miss", cacheKey };
}