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:
ProfileGeneratorchains 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
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 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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6f63a46e9cfe7c5af623ee1c47d016ede36201e42e57657b1dbb4400a412825d
|
|
| MD5 |
149f39a36122318e46316f427d7689df
|
|
| BLAKE2b-256 |
6134b22c62208776bd1228833af02396fe30e952171ebbc19d6929ece8179936
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
081418c3db0c6d580ba021f062c03df5b8edc014f8c433acf3d2f862c582d25a
|
|
| MD5 |
cfc29fff8cbab802e65fba910b22fd9a
|
|
| BLAKE2b-256 |
a4f392624ba6cfbbe4498ec448556626e085041ebefeceb7a90515f62f94676e
|