Your AI agent loses its soul every time you switch models. Identa fixes that.
The agentic economy needs an identity layer. Identa is the open-source middleware that decouples who your agent is from what model it runs on. Define your agent's persona, memory, and behavioral DNA in a portable APF file. Migrate across providers in one command. Build agents that outlive any single model generation.
Every time you upgrade your LLM or switch providers, your agent loses its personality, memory, and brand voice. You start over. Again.
- Migrating from GPT-4o to Claude? Rebuild your system prompt from scratch.
- Upgrading to the next model generation? Drift happens silently.
- Scaling across a team? No standard way to version or share agent identity.
There is no passport for AI agents. Until now.
Identa introduces the Agent Persona Format (APF) — an open, provider-agnostic standard for encoding everything that makes an agent itself: its voice, its memory, its behavioral rules, and its provider-specific configurations.
pip install identa-agentidenta export --provider openai --agent-id my-agent --output aria.apf.jsonidenta import --provider anthropic --file aria.apf.jsonSerialize your agent's full identity — tone, behavioral rules, memory state, and instructions — into a portable APF file. Import it into any supported provider with automatic prompt translation.
Identa maintains episodic memory (what your agent has done) and procedural memory (how your agent behaves) across sessions, model switches, and upgrades. Your agent remembers who it is.
A developer-first command line interface to initialize, export, import, inspect, and diff agent identities. Works standalone or integrated into your CI/CD pipeline.
identa init # scaffold a new agent identity
identa export --provider openai # export current agent to APF
identa import --provider anthropic # import APF into new provider
identa diff aria-v1.apf.json aria-v2.apf.json # inspect what changed
identa validate aria.apf.json # validate against APF spec| Provider | Export | Import | Status |
|---|---|---|---|
| OpenAI (GPT-4o, GPT-4.1) | ⬜ | ⬜ | Planned |
| Anthropic (Claude Sonnet, Opus) | ⬜ | ⬜ | Planned |
| Google Gemini | ⬜ | ⬜ | Planned |
| Ollama / local models | ⬜ | ⬜ | Planned |
pip install identa-agentidenta init --name "Aria" --role "Customer success agent"This creates an aria.apf.json file in your working directory.
export OPENAI_API_KEY=sk-...
identa export --provider openai --agent-id asst_xxx --output aria.apf.jsonexport ANTHROPIC_API_KEY=sk-ant-...
identa import --provider anthropic --file aria.apf.jsonfrom identa_agent import IdentaAgent
agent = IdentaAgent.from_file("aria.apf.json")
response = agent.run("Hello, I need help with my order.")
print(response)The Agent Persona Format is an open JSON standard. Here's what an APF file looks like:
{
"identa_version": "0.1",
"metadata": {
"name": "Aria",
"role": "Customer success agent",
"created_at": "2026-03-21T00:00:00Z",
"version": "1.0.0"
},
"identity": {
"tone": ["warm", "concise", "professional"],
"avoid": ["filler phrases", "excessive apologies", "jargon"],
"core_traits": ["empathetic", "solution-focused", "brand-consistent"]
},
"operating_principles": {
"ambiguity_handling": "Ask one clarifying question before proceeding. Never assume.",
"initiative_level": "Suggest next steps when the path forward is obvious."
},
"behavioral_targets": {
"warmth": 0.75,
"verbosity": 0.3,
"formality": 0.6
},
"memory": {
"episodic": [],
"procedural": {
"escalation_threshold": "user expresses frustration twice"
}
},
"provider_adapters": {
"openai": {
"model": "gpt-4o",
"calibration": {
"verbosity_expression": "Keep responses under 3 sentences unless asked for detail."
}
},
"anthropic": {
"model": "claude-sonnet-4-6",
"calibration": {
"verbosity_expression": "Be direct. Claude's default is verbose — actively resist that."
}
}
}
}Full spec: SPEC.md | RFC discussion: #1
identa-agent/
├── src/
│ └── identa_agent/
│ ├── __init__.py
│ ├── cli.py # CLI entry point (Typer)
│ ├── core/
│ │ ├── schema.py # APF schema validation (Pydantic v2)
│ │ ├── memory.py # Memory persistence layer
│ │ └── adapters/
│ │ ├── base.py # Abstract adapter interface
│ │ ├── openai.py # OpenAI adapter
│ │ └── anthropic.py # Anthropic adapter
├── examples/
│ ├── customer_service/
│ └── sales_assistant/
├── tests/
├── pyproject.toml
├── SPEC.md
└── CONTRIBUTING.md
- ✅ APF schema definition
- ⬜ OpenAI adapter (export + import)
- ⬜ Anthropic adapter (export + import)
- ⬜ Core CLI (
init,export,import,validate) - ⬜ Memory persistence layer (episodic + procedural)
- ⬜
identa diff— inspect persona changes between versions - ⬜ LangChain integration
- ⬜ LangGraph integration
- ⬜ Example agents library
- ⬜ Google Gemini adapter
- ⬜ Ollama / local model support
- ⬜ APF registry (community-shared personas)
Identa is built in public. We want your fingerprints on the spec.
The best place to start is the RFC issue #1 — the open debate on what the APF format should look like. Every opinion matters at this stage.
See CONTRIBUTING.md for development setup, coding standards, and how to submit adapters for new providers.
Identa is released under the Apache 2.0 License with Commons Clause.
You are free to use, modify, and distribute Identa — including in commercial products you build with Identa. The Commons Clause restriction applies only to selling Identa itself as a hosted service or commercial offering.
See LICENSE for the full text.
The agentic economy is arriving fast. Enterprises are deploying long-horizon AI agents that carry real brand identity and customer relationships. But every model upgrade, every provider switch, every infrastructure change risks erasing what makes those agents valuable.
We believe agent identity should be portable, versionable, and provider-agnostic — just like your code.
Identa is the layer that makes that possible.
Built in public. Shaped by the community.
Star the repo if you believe agent identity matters.