Skip to main content

Developer personal-taste memory & self-evolution engine for AI coding agents.

Project description

๐Ÿงฌ PersonalEvoTaste

Teach your AI coding agent your taste โ€” and watch it evolve.

CI PyPI version Python License: MIT Ruff PRs Welcome


โœจ What is it?

LLM agents are great at writing generic code โ€” but they have zero memory of your personal preferences: indentation tastes, library choices, naming conventions, the brutalist UI you love, the verbose docstrings you hate. Every new chat resets to zero.

PersonalEvoTaste is a small, dependency-light library that gives an AI agent a persistent, self-evolving memory of your taste. Feed it the agent's output + your feedback, and it distils, deduplicates, reinforces and decays rules over time โ€” then re-injects the top ones into the next prompt.

        โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  feedback   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  rules   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
agent โ†’ โ”‚ your review  โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–บ โ”‚ PersonalEvoTaste โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–บ โ”‚ next promptโ”‚
        โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜             โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜          โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                              โ–ฒ  decay/reinforce        โ”‚
                                              โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๐Ÿš€ Features

  • ๐Ÿง  Typed memory โ€” Pydantic v2 models, JSON-schema-friendly, versioned on disk.
  • ๐Ÿ”Œ Pluggable storage โ€” YAML / JSON / SQLite out of the box; bring-your-own backend.
  • ๐Ÿ”ฌ Pluggable extractors โ€” deterministic heuristic by default; plug an LLM with CallableExtractor.
  • โ™ป๏ธ Self-evolution โ€” automatic deduplication, reinforcement on repetition, time decay.
  • โš–๏ธ Ranked injection โ€” top-N rules by weight, optionally filtered per project.
  • ๐Ÿ–ฅ๏ธ Zero-dep CLI โ€” personal-evotaste evolve / inject / list / remove / reset / export.
  • ๐Ÿงช Tested & typed โ€” pytest suite, ruff, mypy, CI on Python 3.9 โ†’ 3.12.
  • ๐Ÿ’พ Crash-safe writes โ€” atomic file replacement, SQLite transactions.

๐Ÿ“ฆ Installation

pip install personal-evotaste
# or from source
pip install -e ".[dev]"

โšก Quickstart

from personal_evotaste import PersonalEvoTaste

taste = PersonalEvoTaste(memory_path="my_taste.yaml")

# 1. Inject your evolving taste into any prompt
prompt = taste.inject_taste(
    "Generate a login page",
    context="brutalist minimal project",
)
# โ†’ send `prompt` to your LLM of choice

# 2. After reviewing the agent's output, teach it
taste.evolve(
    agent_output="A flashy gradient login page with neon buttons",
    user_feedback="Too loud. I want calmer, monochrome, brutalist typography.",
    project_name="acme-landing",
)

# 3. Next time, the rule is already in the prompt โ€” and reinforced if you repeat yourself
print(taste.inject_taste("Generate a signup page"))

๐Ÿ–ฅ๏ธ CLI

# Add a rule from feedback
personal-evotaste evolve \
  --output "A flashy gradient login page" \
  --feedback "Too loud. Prefer calm monochrome brutalist typography." \
  --project acme-landing

# Inject taste into a prompt
personal-evotaste inject "Generate a signup page" --context "acme-landing"

# Inspect the memory
personal-evotaste list
personal-evotaste export > snapshot.json

Memory backend is auto-selected from the file extension: .yaml / .json / .sqlite3.

๐Ÿ”Œ Plugging an LLM extractor

from personal_evotaste import PersonalEvoTaste, CallableExtractor

def summarise_with_llm(agent_output: str, feedback: str, project: str) -> str:
    # call OpenAI / Anthropic / a local model here and return one short rule
    ...

taste = PersonalEvoTaste(
    memory_path="my_taste.yaml",
    extractor=CallableExtractor(summarise_with_llm),
)

๐Ÿงฑ Architecture

personal_evotaste/
โ”œโ”€โ”€ models.py        # Pydantic models: TasteRule, FeedbackEvent, TasteMemory
โ”œโ”€โ”€ storage.py       # BaseStorage + YAML / JSON / SQLite backends (atomic writes)
โ”œโ”€โ”€ extractors.py    # RuleExtractor strategies + similarity-based deduplication
โ”œโ”€โ”€ core.py          # PersonalEvoTaste faรงade (evolve / inject / ranking / decay)
โ”œโ”€โ”€ cli.py           # argparse-based CLI (zero extra deps)
โ”œโ”€โ”€ exceptions.py    # Typed error hierarchy
โ””โ”€โ”€ logging_config.py

See docs/architecture.md for the design rationale.

๐Ÿค Contributing

PRs, issues and ideas are very welcome โ€” see CONTRIBUTING.md and our Code of Conduct. If PersonalEvoTaste helps you, a โญ on GitHub goes a long way.

๐Ÿ“œ License

MIT ยฉ PersonalEvoTaste Contributors. See LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

personal_evotaste-0.1.0.tar.gz (18.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

personal_evotaste-0.1.0-py3-none-any.whl (16.5 kB view details)

Uploaded Python 3

File details

Details for the file personal_evotaste-0.1.0.tar.gz.

File metadata

  • Download URL: personal_evotaste-0.1.0.tar.gz
  • Upload date:
  • Size: 18.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.8.10

File hashes

Hashes for personal_evotaste-0.1.0.tar.gz
Algorithm Hash digest
SHA256 38732258d4d54045b1ff89516cb9928f6bd84562d6edc29f0f65c029c4c43d94
MD5 ade835e8f3c8cf090588608305c03aa0
BLAKE2b-256 3767ac9f5e35e3a4fa1270bf65a22dcefb9126be31d1a59a4c0dc9755c63b1de

See more details on using hashes here.

File details

Details for the file personal_evotaste-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for personal_evotaste-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 4e40e2ca39a923b0d9617ba9e2331b88885118d4542a6022d749111d63038adf
MD5 555f08bb91f12e10e3272cce8585534a
BLAKE2b-256 c42253df6b847afbfd0609a1b270c69619261284075a3608e6a4e39c3e595857

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page