Skip to main content

LLM-chained psychological profile generator for fictional characters (Psygen revised).

Project description

psygen-llm

Python package implementing Psygen Revised: a three-stage (optional fourth) LLM pipeline that produces a structured psychological profile for a character from a natural-language query.

  • Schema: JSON Schema for each layer and the merged profile (package data).
  • Runner: ProfileGenerator chains axiom → intermediate → emergent calls, validates JSON, merges evidence.
  • Prompt surface: to_prompt_string() emits dialogue-ready text (20 emergent traits + coping style + role identity), capped at 600 characters per the design contract.

Install and publish (uv)

Requires uv and Python 3.10+ (see requires-python in pyproject.toml). PyPI name psygen-llm, import psygen_llm, CLI psygen-llm.

For publishing, the path is: build with uv, publish the artifacts. For using the package from PyPI, install into a local virtual environment (for example uv venv then activate the .venv, or use whatever venv your project already uses) — not system-wide Python.

From the repository root, bump version in pyproject.toml when publishing a new release, and configure PyPI credentials for Twine (for example ~/.pypirc or the usual TWINE_* environment variables).

Install dev mode

uv pip install -e .

Build and push (maintainers):

uv build
uvx twine upload dist/*

Install into the active venv (after the release is on PyPI; with that environment selected — no --system):

uv pip install "psygen-llm"

Use uv pip install "psygen-llm[openai]" for the optional OpenAI dependency. To remove: uv pip uninstall psygen-llm (it is fine if nothing is installed). Quote extras so the shell does not treat [openai] as a glob.

OpenAI config

Create a JSON file (e.g. psygen.json, keep it private — chmod 600 — and do not commit it):

{
  "openai": {
    "api_key": "sk-...",
    "model": "gpt-4o-mini",
    "base_url": null
  }
}

openai.api_key and openai.model are required. openai.base_url is optional; omit it or set it to null for the default OpenAI API URL.

Quick use

import asyncio
from psygen_llm import ProfileGenerator, OpenAiLlmClient

async def main():
    client = OpenAiLlmClient.from_config_file("psygen.json")
    gen = ProfileGenerator(client)
    profile = await gen.generate("Linus from Stardew Valley")
    print(profile.to_prompt_string())
    print(profile.to_json())

asyncio.run(main())

Custom LLM backend

Implement psygen_llm.protocols.LlmClient (complete(system, user) -> str) and pass it to ProfileGenerator.

CLI

By default the merged profile JSON is written to output/<slug>.json (slug derived from your query; the output/ directory is created if needed). Use -o for another path, or -o - to print JSON to stdout.

psygen-llm --config psygen.json "Linus from Stardew Valley"
psygen-llm --config psygen.json "Linus from Stardew Valley" -o /tmp/linus.json
psygen-llm --config psygen.json "Linus from Stardew Valley" -o -

Design

See DESIGN.md and PLAN.md in this directory.

License

MIT

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

psygen_llm-0.3.0.tar.gz (18.0 kB view details)

Uploaded Source

Built Distribution

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

psygen_llm-0.3.0-py3-none-any.whl (23.9 kB view details)

Uploaded Python 3

File details

Details for the file psygen_llm-0.3.0.tar.gz.

File metadata

  • Download URL: psygen_llm-0.3.0.tar.gz
  • Upload date:
  • Size: 18.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.13

File hashes

Hashes for psygen_llm-0.3.0.tar.gz
Algorithm Hash digest
SHA256 6f63a46e9cfe7c5af623ee1c47d016ede36201e42e57657b1dbb4400a412825d
MD5 149f39a36122318e46316f427d7689df
BLAKE2b-256 6134b22c62208776bd1228833af02396fe30e952171ebbc19d6929ece8179936

See more details on using hashes here.

File details

Details for the file psygen_llm-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: psygen_llm-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 23.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.13

File hashes

Hashes for psygen_llm-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 081418c3db0c6d580ba021f062c03df5b8edc014f8c433acf3d2f862c582d25a
MD5 cfc29fff8cbab802e65fba910b22fd9a
BLAKE2b-256 a4f392624ba6cfbbe4498ec448556626e085041ebefeceb7a90515f62f94676e

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