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 };
}How is this guide?