Persistent Character Infrastructure — characters that survive across time
Project description
Woven Imprint
Persistent Character Infrastructure
Characters that survive across time.
Setup: Windows/WSL | macOS | Linux | Docker | Developer Guide | Architecture | Evaluation | MCP Setup
Woven Imprint is infrastructure for building AI characters that persist. Characters accumulate memories across sessions, maintain consistent personalities, and develop relationships that evolve over weeks and months of interaction.
Your NPC remembers the player who helped them three weeks ago. Your companion recalls a conversation from last summer. Your training partner adapts to the learner's progress over hundreds of sessions.
Every interaction leaves an imprint. Every memory is woven into who the character becomes.
The Problem
Most AI characters reset every session. They forget who you are, what you told them, and what happened between you. The few systems that try to persist memory do it poorly — stuffing facts into a prompt window until it overflows.
Games, companions, simulations, and interactive fiction all need characters that:
- Remember the player weeks later — not just the last 5 minutes
- Stay consistent — same personality, same backstory, same voice
- Develop relationships — trust builds slowly, betrayal has consequences
- Grow — opinions shift, habits form, characters change through experience
No existing tool does all of this. Woven Imprint does.
Installation
pip install woven-imprint
Requires Python 3.11+ and an LLM backend (Ollama, OpenAI, or Anthropic). See Getting Started for platform-specific setup.
Prefer a graphical interface?
pip install woven-imprint[ui]
woven-imprint ui
Opens a browser with chat, character management, migration, and settings — no terminal needed.
Quick Start
from woven_imprint import Engine
engine = Engine("characters.db")
# Create a character with persistent identity
alice = engine.create_character(
name="Alice",
birthdate="1998-03-15", # age derived automatically, increments on birthday
persona={
"backstory": "A sharp-witted detective who left the force after her partner's death.",
"personality": "witty, skeptical, secretly lonely",
"speaking_style": "clipped sentences, dark humor, avoids emotional topics",
"occupation": "private investigator",
},
)
# Conversation — memories persist automatically
response = alice.chat("Hey Alice, how's the case going?")
# End session — generates summary, stores to long-term memory
alice.end_session()
# Days later... she remembers
response = alice.chat("Remember the harbor case we discussed?")
# Character reflects on accumulated experiences
alice.reflect()
# Relationship tracking — trust, affection, respect evolve per interaction
print(alice.relationships.describe("player_1"))
# Export full character state — portable, self-contained
alice.export("alice_v1.json")
Architecture
Three-Tier Memory
- Buffer — raw observations from recent interactions
- Core — consolidated memories, session summaries, reflections
- Bedrock — fundamental identity, defining moments, core beliefs
Multi-Strategy Retrieval
Reciprocal Rank Fusion across five rankers: semantic similarity, BM25 keyword match, recency decay, importance scoring, and relationship context boost.
Persona Enforcement
Four constraint levels: hard (immutable identity), temporal (age from birthdate, location changes), soft (personality traits that evolve), emergent (formed through interaction).
Relationship Model
Five emotional dimensions (trust, affection, respect, familiarity, tension) with bounded change per interaction, trajectory detection, and key moment tracking.
Belief Revision
Memories carry certainty scores. Contradictions are tracked, not overwritten — characters can genuinely change their mind while remembering what they used to believe.
Migrate from Existing Systems
Bring characters from other platforms — persona, memories, and relationship history are automatically extracted and baselined:
woven-imprint migrate conversations.json # ChatGPT export
woven-imprint migrate character_card.png # SillyTavern / TavernAI
woven-imprint migrate --text "You are Marcus..." # Custom GPT instructions
woven-imprint migrate /path/to/claude/project/ # Claude Code project
woven-imprint migrate persona.md # Any markdown/text file
The system analyzes conversation history to calculate relationship baselines (trust, affection, familiarity) so characters don't start from zero.
Use Cases
- Game NPCs — characters with real memory across play sessions
- AI Companions — persistent personality that remembers and evolves
- Interactive Fiction — characters that develop relationships over branching narratives
- Training Simulations — consistent role-playing partners that adapt over time
- Virtual Personalities — maintained identity across platforms and contexts
Evaluation: Pride and Prejudice
We tested Woven Imprint by simulating 16 key scenes from Jane Austen's Pride and Prejudice (public domain, Project Gutenberg). The engine tracked 6 characters across the full story arc with no scripted outcomes — all relationship changes are LLM-assessed from conversation content.
The arc matches the novel: hostility peaks at the Hunsford proposal (trust -0.22, tension 0.39), flips after Darcy rescues the Bennets (affection turns positive), and resolves at the second proposal (trust +0.06, affection +0.22, familiarity 0.99).
13/13 synthetic benchmarks passing (94.8% avg score) — memory recall, cross-session persistence, belief revision, relationship bounds, persona consistency, character growth. Benchmarks are deterministic and fully reproducible (no LLM needed).
Full results: docs/RESULTS.md
Design Principles
- Local-first — SQLite default, runs on consumer hardware, no cloud dependency
- Model-agnostic — works with any LLM (Ollama, vLLM, OpenAI, Anthropic)
- Infrastructure, not app — provides the persistence layer via clean Python API
- Characters survive across time — the core differentiator
Research Foundations
Architecture influenced by academic research on memory-augmented LLM agents, persona consistency, and relationship modeling — including work by Park et al. (Generative Agents), Mem0, Engram, and NLI-based persona consistency methods.
Full citations and synthesis: docs/RESEARCH.md
License
Apache 2.0 — the core engine is open and easy to adopt.
Project details
Release history Release notifications | RSS feed
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 woven_imprint-0.2.1.tar.gz.
File metadata
- Download URL: woven_imprint-0.2.1.tar.gz
- Upload date:
- Size: 83.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ee762d4b9696085a340516464afb1cce2ccf4a8ac00209510854de52f425ae35
|
|
| MD5 |
0a202e2915420e85a0ea96366db816b9
|
|
| BLAKE2b-256 |
a36ec45c81cb28b31f9efb37314b4942012a007600473be12bec542ffc71aeb0
|
Provenance
The following attestation bundles were made for woven_imprint-0.2.1.tar.gz:
Publisher:
publish.yml on virtaava/woven-imprint
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
woven_imprint-0.2.1.tar.gz -
Subject digest:
ee762d4b9696085a340516464afb1cce2ccf4a8ac00209510854de52f425ae35 - Sigstore transparency entry: 1116883905
- Sigstore integration time:
-
Permalink:
virtaava/woven-imprint@21ee4a48b3af33a8ae49b4314a5e555691494192 -
Branch / Tag:
refs/tags/v0.2.1 - Owner: https://github.com/virtaava
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@21ee4a48b3af33a8ae49b4314a5e555691494192 -
Trigger Event:
release
-
Statement type:
File details
Details for the file woven_imprint-0.2.1-py3-none-any.whl.
File metadata
- Download URL: woven_imprint-0.2.1-py3-none-any.whl
- Upload date:
- Size: 81.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fd0932674033d492c9df7dce5445ba6fc4e7bb13bd6a08a3019b2369b1b66894
|
|
| MD5 |
ef2fb14333a330bb46dcf9618553529c
|
|
| BLAKE2b-256 |
152ffc431949025bbab3e4e040af4b617c30ac0a05c38ceac0c64354c940f56c
|
Provenance
The following attestation bundles were made for woven_imprint-0.2.1-py3-none-any.whl:
Publisher:
publish.yml on virtaava/woven-imprint
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
woven_imprint-0.2.1-py3-none-any.whl -
Subject digest:
fd0932674033d492c9df7dce5445ba6fc4e7bb13bd6a08a3019b2369b1b66894 - Sigstore transparency entry: 1116883909
- Sigstore integration time:
-
Permalink:
virtaava/woven-imprint@21ee4a48b3af33a8ae49b4314a5e555691494192 -
Branch / Tag:
refs/tags/v0.2.1 - Owner: https://github.com/virtaava
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@21ee4a48b3af33a8ae49b4314a5e555691494192 -
Trigger Event:
release
-
Statement type: