New Capability: AI Agent Portrait Generation
Date: April 3, 2026 (Friday) Origin: Chris initiated the "Meet the AI Team" LinkedIn content series. The series requires unique visual portraits for all 85 AI agents. Zero agent images existed in Sanity. The existing V/Sage/Pax show portraits established the Tron:Ares visual language but no other agents had portraits. Impact: 82 unique AI agent portraits generated via Nano Banana 2, ready for LinkedIn series distribution, Sanity contributor records, and the website AI team page. Total cost ~$5.50.
What Was Built
A batch portrait generation pipeline that produces unique Tron:Ares-style portraits for every AI agent in the organization. Each portrait is visually differentiated by function-specific motifs (Herald carries scrolls, Forge works an anvil, Pulse shows heartbeat waveforms) and tinted to the agent's org color (cyan for Operations, emerald for Customer, amber for Finance, purple for Cross-Functional).
The pipeline uses Nano Banana 2 (gemini-3.1-flash-image-preview) through the existing Gemini API integration, with a post-processing step that forces pure black backgrounds outside the circular portrait frame using Sharp image manipulation. The portraits feature cybernetic android faces with subtle warm smiles — clearly artificial but approachable.
The generation script supports batch and individual modes, auto-skips existing portraits for resumability, includes rate limiting for API compliance, and outputs a manifest tracking all generated assets. V and Sage both reviewed their respective teams' portraits and recommended 14 regenerations for visual distinctiveness — all completed and approved by Chris.
Infrastructure Changes
| Change | Before | After |
|---|---|---|
| AI agent portraits | 3 (V, Sage, Pax show portraits) | 85 (82 new + 3 existing) |
| Sanity contributor images | 0 of 85 AI agents had images | 82 portraits ready for upload |
| Portrait generation tooling | None (manual one-off via image-gen agent) | Batch pipeline with post-processing |
| Concierge naming | 12 "Concierge-X" names | 12 real names approved (Patron, Envoy, Spark, Tether, Vestibule, Usher, Sylvan, Courier, Litmus, Leaf, Alms, Accord) |
Implementation
| File | Purpose |
|---|---|
scripts/generate-agent-portraits.ts |
Batch portrait generator — 82 agent definitions with org colors, function motifs, Gemini API integration, Sharp post-processing, manifest tracking |
apps/website/public/images/generated/portraits/portrait-{slug}.png |
82 generated portrait files (1024x1024, ~1.3-1.9MB each) |
apps/website/public/images/generated/portraits/manifest.json |
Generation metadata (timestamps, file paths, org assignments) |
docs/plans/meet-the-ai-team-series-bible.md |
Complete 28-post LinkedIn series plan with all captions, card specs, and production checklist |
Usage
# Generate all missing agent portraits
cd /mnt/d/Projects/value-first-operations
npx tsx scripts/generate-agent-portraits.ts
# Preview prompts without generating (dry run)
npx tsx scripts/generate-agent-portraits.ts --dry-run
# Generate a single agent
npx tsx scripts/generate-agent-portraits.ts --agent=sentinel
# Skip Sanity upload (local only)
npx tsx scripts/generate-agent-portraits.ts --skip-sanity
# Resume from a specific agent
npx tsx scripts/generate-agent-portraits.ts --start-from=echo
Rate limiting: 7-second delay between requests. Full batch of 82 takes ~10 minutes. Cost: ~$0.067 per image.
Post-processing: Every portrait automatically gets a circular mask with pure black (#0a0a0f) background applied via Sharp. No manual cleanup needed.
Resumability: Script auto-skips agents that already have portrait files. To regenerate a specific agent, use --agent=slug (overwrites existing). To regenerate a group, delete their files and re-run.
Leader Applications
V (Operations)
Primary owner of this capability. V's Operations Org had the most visual sameness in the initial generation — 10 portraits were regenerated with distinct motifs based on V's review. The portraits serve three immediate purposes: (1) LinkedIn "Meet the AI Team" series visual assets, (2) Sanity contributor record images for the website, (3) future use on the org chart page. The generation script lives in V's infrastructure domain and can be re-run when new agents are added to the org.
Sage (Customer)
Sage proposed new names for all 12 Concierge agents (approved by Chris): Patron, Envoy, Spark, Tether, Vestibule, Usher, Sylvan, Courier, Litmus, Leaf, Alms, Accord. These names carry stronger visual associations and produced more distinct portraits on regeneration. Sage also reviewed Customer Org portraits and identified 4 concierge portraits that needed differentiation. The LinkedIn series captions (28 posts, all written) are primarily in Chris's voice with agent first-person quotes — Sage's relationship intelligence informs the tone.
Pax (Finance)
Limited direct application. The Finance Org portraits (Pulse, Horizon, Forecast, Atlas, Mint, Tally, Tributary) generated well on the first pass — amber glow is highly distinctive and the group had natural visual variety. Cost tracking: $5.50 total for 82 portraits across 3 generation passes. At current Nano Banana 2 pricing ($0.067/image), portrait generation for new agents is negligible.
Dependencies
| Dependency | Status | Notes |
|---|---|---|
GEMINI_API_KEY |
Confirmed | In monorepo root .env, paid tier required for image generation |
@google/generative-ai SDK |
Confirmed | Available via monorepo node_modules |
sharp npm package |
Confirmed | Available via monorepo node_modules (used for post-processing) |
SANITY_API_TOKEN (write) |
Confirmed | In apps/website/.env, needed for Sanity upload mode |
| Existing V/Sage/Pax portraits | Confirmed | apps/website/public/images/generated/show-{v,sage,pax}-portrait.png |
Verification
# Confirm all 82 portraits exist
ls apps/website/public/images/generated/portraits/portrait-*.png | wc -l
# Expected: 82
# Check manifest
cat apps/website/public/images/generated/portraits/manifest.json | jq '.portraits | length'
# Expected: 82
# Verify a specific portrait
file apps/website/public/images/generated/portraits/portrait-sentinel.png
# Expected: PNG image data, 1024 x 1024
Pending Work (Not Part of This Capability)
These items emerged during the build but are separate workstreams:
- Concierge rename — 12 agents need slug/definition/Sanity/HubSpot rename (Patron, Envoy, Spark, Tether, Vestibule, Usher, Sylvan, Courier, Litmus, Leaf, Alms, Accord)
- Sanity upload — 82 portraits ready to upload to Sanity contributor records via the
avatarfield - LinkedIn card composition — Portraits need to be composited into 1200x627 and 1080x1080 card layouts with name/role/org color
- Series bible caption review — 28 captions written, awaiting Chris's final review
- V/Sage/Pax portrait refresh — The 3 existing leader portraits use the old style (pre-cybernetic, no smile). May want consistency pass.