ai-identicon
Generative, animated avatars for AI agents — a deterministic visual identity grown from a seed string. Instead of a photoreal face (creepy) or a cartoon mascot (cheesy), each agent gets an irregular faceted presence: a "broken-whole" cluster of crystalline shards that reads as an object with character, and can come alive — listening, thinking, speaking — without ever pretending to be human.
Same seed → same avatar, forever, under a given generation version.
from ai_identicon import Genome, color_svg, line_art_svg
g = Genome.from_seed("agent://alice") # deterministic identity
open("alice.svg", "w").write(color_svg(g)) # a filled, shaded portrait
open("alice-line.svg", "w").write(line_art_svg(g, "white")) # line-art, for dark UIs
Why
- Deterministic & frozen. Every avatar is derived from
(seed, algo_version, brand, overrides). The generation algorithm is versioned and immutable: improving it later ships as a newALGO_VERSION, so an existing agent's face never changes under it. A committed golden-file suite locks each version. - Identicon-grade distinctness. Curated, perceptually-spaced hue buckets and categorical materials (the lesson from jazzicons/blockies) so two seeds are either clearly the same or clearly different — not a subtle blur.
- Alive, but calm. A headless state model (
idle / listening / thinking / speaking / streaming / notify / success / error) with gaze choreography, breathing, blinks, and shard micro-physics. Present without being noisy; never interrupts. - Zero-dependency core.
genome,geometry,model,portrait,controllerare pure Python. SVG portraits need nothing. The live animated widget and mic-reactive audio are an optional Qt extra.
The states
The orb expresses what an agent is doing through motion and light — never a
face. One seed (bmev5p5akc), all eight states:
idle at rest, breathing; the odd blink |
listening turns to face you; ripples drift inward |
thinking comes apart to turn it over, gaze down‑right |
speaking voice drawn as a waveform around it |
streaming text arriving; a bright point laps its edge |
notify a chirp and an excited spin; self‑returns |
success a warm pulse and spin‑up; self‑returns |
error seized: rotation frozen, flushed red, one flinch |
speaking is voice, streaming is text tokens landing — the two output channels. notify / success / error are transient: they play out and settle back to idle on their own.
Install
pip install ai-identicon # core: genomes + SVG portraits (no deps)
pip install "ai-identicon[qt]" # + the live animated widget and audio
Static portraits (pure, no Qt)
from ai_identicon import Genome, color_svg, line_art_svg, export_svg
g = Genome.from_seed("EK7f...aid-prefix")
color_svg(g, px=40) # tuned for a 40px avatar
line_art_svg(g, "black", px=40) # dark strokes for light UIs
line_art_svg(g, "white") # light strokes for dark UIs
export_svg(g, "out.svg", variant="color")
Portraits render the canonical front pose (physics-settled), size-aware: at small sizes strokes thicken and near-coplanar interior lines fade to whispers, so the mark still reads as a shape at 40px.
Live widget (Qt)
from ai_identicon import Genome, AvatarController
from ai_identicon.widget import PresenceWidget
from ai_identicon.audio import SoundBank
orb = PresenceWidget(Genome.from_seed("agent://alice"), sounds=SoundBank())
ctl = AvatarController(orb) # map your assistant's lifecycle to states
ctl.thinking(); ctl.speaking(); ctl.on_audio(amplitude=level)
Run the interactive gallery: python examples/gallery.py (its copy 📋
button puts the avatar on the clipboard to paste into chats/notes).
Copy to clipboard (Qt)
from ai_identicon import Genome
from ai_identicon.clipboard import copy_to_clipboard # needs a running Qt app
copy_to_clipboard(Genome.from_seed("agent://alice")) # pasteable PNG
Copies a PNG (with the SVG attached as a bonus MIME) — PNG is the format
that pastes reliably into Obsidian, MS Teams, Signal, Discord, Slack, and
docs, and it keeps transparency so the avatar drops onto any background. The
live widget has a convenience method too: presence_widget.copy_to_clipboard().
Customization & brands
from ai_identicon import Genome, Brand
# pin specific fields; everything unpinned still tracks the seed
g = Genome.from_seed("alice").with_overrides(material=1, hue=250)
# constrain a whole product's palette/materials to a brand
brand = Brand(hues=(215, 250, 285), materials=("crystal", "glass"))
g = Genome.from_seed("alice", brand=brand)
g.to_dict() # {seed, algo_version, brand, overrides} — the portable identity
Determinism contract
The package version (semver) and ALGO_VERSION (the avatar-generation
contract) are independent. Package releases never alter an existing seed's
avatar; only a new ALGO_VERSION may, and prior versions stay renderable. This
is enforced by tests/golden_v1.json.
Security note
An avatar is an identity affordance, not a control. A determined party can grind seeds toward a look-alike, so never let the avatar substitute for a verifiable identifier (e.g. show the full AID/prefix where trust matters).
Meet some of the faces
Sixteen names, sixteen seeds, sixteen agents you'd know on sight — each one
idling below: breathing, glowing, gently turning. All just
Genome.from_seed(name), deterministic, so "James" always looks like James,
everywhere, forever. 👋
James |
Mary |
Michael |
Jennifer |
William |
Elizabeth |
David |
Sarah |
John |
Jessica |
Robert |
Emily |
Joseph |
Emma |
Daniel |
Olivia |
License
MIT.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ai_identicon-0.8.0.tar.gz.
File metadata
- Download URL: ai_identicon-0.8.0.tar.gz
- Upload date:
- Size: 7.9 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
58c1ac9ebd17300d235981d1e74c1230d1fffa52e622bf700d6ca957d5dc848c
|
|
| MD5 |
cc44603f59c1889eabf41716da18ed36
|
|
| BLAKE2b-256 |
21b3d543a9b6671cb63a674541f96f56adfe29eee45a8312782407396fa6171b
|
Provenance
The following attestation bundles were made for ai_identicon-0.8.0.tar.gz:
Publisher:
publish.yml on seriouscoderone/ai-identicon
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ai_identicon-0.8.0.tar.gz -
Subject digest:
58c1ac9ebd17300d235981d1e74c1230d1fffa52e622bf700d6ca957d5dc848c - Sigstore transparency entry: 2387693847
- Sigstore integration time:
-
Permalink:
seriouscoderone/ai-identicon@92d23d32ff58603a9f9d1cb8d7774cc7e9fa3449 -
Branch / Tag:
refs/tags/v0.8.0 - Owner: https://github.com/seriouscoderone
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@92d23d32ff58603a9f9d1cb8d7774cc7e9fa3449 -
Trigger Event:
release
-
Statement type:
File details
Details for the file ai_identicon-0.8.0-py3-none-any.whl.
File metadata
- Download URL: ai_identicon-0.8.0-py3-none-any.whl
- Upload date:
- Size: 42.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ecac8ec0d54ce354feeaf674c46d3246d1d0d0b9c94b69443e6555a4d97f65d5
|
|
| MD5 |
41d8cd2565cec24d2b4f81fbc00ad040
|
|
| BLAKE2b-256 |
a7fd520528eb224aaa6483dfe400290112b1fbdcb2eab607ad832d617f57261f
|
Provenance
The following attestation bundles were made for ai_identicon-0.8.0-py3-none-any.whl:
Publisher:
publish.yml on seriouscoderone/ai-identicon
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ai_identicon-0.8.0-py3-none-any.whl -
Subject digest:
ecac8ec0d54ce354feeaf674c46d3246d1d0d0b9c94b69443e6555a4d97f65d5 - Sigstore transparency entry: 2387693849
- Sigstore integration time:
-
Permalink:
seriouscoderone/ai-identicon@92d23d32ff58603a9f9d1cb8d7774cc7e9fa3449 -
Branch / Tag:
refs/tags/v0.8.0 - Owner: https://github.com/seriouscoderone
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@92d23d32ff58603a9f9d1cb8d7774cc7e9fa3449 -
Trigger Event:
release
-
Statement type: