Artifact Store (MinIO)

MinIO is where agents save files — reports, logs, generated documents, images. When an agent creates something, it uploads it here, and the system generates a download link for the user.

What it stores

Content

Who writes it

Example

Generated artifacts

Ephemeral agents (Zombie)

PDFs, CSVs, code files

Execution logs

Any agent (if LOG_TO_ARTIFACT_STORE=true)

JSON logs per request

Uploaded files

Tools that produce output

Charts, images, exports

How it’s included

MinIO is added automatically when you create a project with --with-semantic-layer:

abi-core create project my-app --with-semantic-layer
# MinIO runs on port 9000 (API) and 9001 (console)

In compose.yaml:

services:
  my-app-minio:
    image: minio/minio:latest
    command: server /data --console-address ":9001"
    ports:
      - 9000:9000   # S3-compatible API
      - 9001:9001   # Web console
    environment:
      - MINIO_ROOT_USER=minioadmin
      - MINIO_ROOT_PASSWORD=minioadmin

Configuration

Agents connect to MinIO via environment variables:

environment:
  - ARTIFACT_ENDPOINT=http://my-app-minio:9000
  - ARTIFACT_ACCESS_KEY=minioadmin
  - ARTIFACT_SECRET_KEY=minioadmin
  - ARTIFACT_BUCKET=abi-artifacts

For execution logs:

environment:
  - LOG_TO_ARTIFACT_STORE=true
  - LOG_AGENT_NAME=orchestrator
  - LOG_BUCKET=abi-logs

Upload artifacts from an agent

from abi_core.common.artifact_store import upload_artifact

# Upload a file
artifact = await upload_artifact(
    content=pdf_bytes,
    filename="quarterly-report.pdf",
    content_type="application/pdf",
    metadata={"agent": "reporter", "task_id": "task-42"},
)
# Returns: {"filename": "quarterly-report.pdf", "url": "...", "bucket": "abi-artifacts"}

Generate download URLs

The Orchestrator generates pre-signed URLs so users can download artifacts:

from abi_core.common.artifact_store import generate_download_urls, format_artifact_links

# Generate temporary download URLs (valid for 1 hour)
await generate_download_urls(artifacts)

# Format as markdown links for the response
links = format_artifact_links(artifacts)
# "📎 quarterly-report.pdf: https://minio.../presigned-url"

Access the web console

Open http://localhost:9001 in your browser. Login with minioadmin / minioadmin.

From there you can:

  • Browse buckets and files

  • Download artifacts manually

  • Check storage usage

  • Manage access policies

Buckets

Bucket

Content

abi-artifacts

Files generated by agents (reports, exports, etc.)

abi-logs

Execution logs (JSON, one file per request)

How the Orchestrator uses it

After a workflow completes:

  1. Ephemeral agents upload their output to abi-artifacts

  2. Orchestrator collects artifact metadata from A2A responses

  3. Generates pre-signed download URLs

  4. Includes links in the synthesized response to the user

event: result
data: {"conclusion": "Report generated successfully.",
       "artifacts": [{"filename": "report.pdf", "download_url": "https://..."}]}

Production notes

  • Change MINIO_ROOT_USER and MINIO_ROOT_PASSWORD in production

  • Use a persistent volume for /data (already configured in compose)

  • Pre-signed URLs expire after 1 hour by default

  • MinIO is S3-compatible — you can swap it for AWS S3 by changing the endpoint

Next step

👉 CLI Reference