# 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`: ```bash abi-core create project my-app --with-semantic-layer # MinIO runs on port 9000 (API) and 9001 (console) ``` In `compose.yaml`: ```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: ```yaml environment: - ARTIFACT_ENDPOINT=http://my-app-minio:9000 - ARTIFACT_ACCESS_KEY=minioadmin - ARTIFACT_SECRET_KEY=minioadmin - ARTIFACT_BUCKET=abi-artifacts ``` For execution logs: ```yaml environment: - LOG_TO_ARTIFACT_STORE=true - LOG_AGENT_NAME=orchestrator - LOG_BUCKET=abi-logs ``` ## Upload artifacts from an agent ```python 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: ```python 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](../reference/cli-reference.md)