TypeScriptADK-TS
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 };
}