Skip to main content

LangGraph-based runtime for emotionally adaptive AI companions.

Project description

Untamed Companion Runtime

LangGraph-based runtime primitives for emotionally adaptive AI companions.

This package exposes reusable graph builders, SSE event adapters, provider interfaces, store interfaces, prompt overrides, FastAPI routes, deterministic tests, and a local demo showcase. It is product-agnostic by design: application copy, private prompts, production deployment config, billing, and secrets stay outside this repository.

Release Status

This package is an alpha runtime. Public APIs, event payload details, and provider/store extension points may evolve before 1.0.0, but published patch/minor releases should remain backward compatible. Pin exact versions for application use and follow the release policy before upgrading.

The FastAPI router is intentionally unauthenticated by default. Production applications must pass auth_hook to create_chat_router(...) and enforce their own ownership, session, API key, or tenant policy.

Install

From source:

git clone https://github.com/wkddns40/untamedai-runtime.git
cd untamedai-runtime
pip install -e ".[fastapi,dev]"

From PyPI:

pip install untamedai-runtime

Optional extras:

pip install "untamedai-runtime[fastapi]"
pip install "untamedai-runtime[openai]"
pip install "untamedai-runtime[supabase]"
pip install "untamedai-runtime[postgres]"

Verify:

python -m pytest

Quickstart

from untamed_companion.graph import GraphRuntime, build_chat_graph
from untamed_companion.providers import FakeLLMProvider

runtime = GraphRuntime(llm_provider=FakeLLMProvider())
graph = build_chat_graph(runtime=runtime)

result = await graph.ainvoke(
    {
        "companion_id": "demo",
        "last_user_message": "your name is Luna",
        "user_lang": "en",
        "companion": {"name": "???"},
    }
)

print(result["emit"])

FastAPI

from fastapi import FastAPI

from untamed_companion.fastapi import ChatRouterSettings, create_chat_router
from untamed_companion.graph import GraphRuntime
from untamed_companion.store import InMemoryCompanionStore

app = FastAPI()
runtime = GraphRuntime(companion_store=InMemoryCompanionStore())
app.include_router(
    create_chat_router(
        runtime=runtime,
        prefix="/api",
        settings=ChatRouterSettings(history_limit_default=20, history_limit_max=50),
    )
)

Routes:

  • GET /api/chat/{companion_id}/history
  • GET /api/chat/{companion_id}/greeting
  • POST /api/chat/{companion_id}/stream

Auth is app-owned. Pass auth_hook to create_chat_router(...) to enforce ownership, sessions, API keys, or any other policy.

Demo Showcase

pip install -e ".[fastapi,dev]"
python examples/demo_showcase/backend/app.py

Open:

http://127.0.0.1:8000/demo

The showcase uses the public FastAPI router, in-memory store, fake providers, scenario presets, SSE event inspector, Korean/English language toggle, reset endpoint, and daily emotion dry-run.

Prompt Override

from untamed_companion.graph import GraphRuntime
from untamed_companion.prompts import StaticPromptProvider

runtime = GraphRuntime(
    prompt_provider=StaticPromptProvider(chat_prompt="Your app-owned prompt.")
)

Event Contract

SSE frames are emitted as JSON in data: lines:

data: {"type": "stream", "content": "Hello"}

Stable event types:

Type Purpose
stream Assistant text chunk or complete deterministic message.
end Stream completion marker. May include final content and intent.
greeting First greeting response.
name_reveal Companion name accepted.
user_name_set User display name accepted.
naming_prompt Runtime asks user to name the companion.
coffee_request Coffee-turn shortcut event.
error Stream failure frame.

Golden fixtures live under tests/golden/fixtures. They compare public event order and payloads with whitespace-tolerant diffs, using only fake providers and in-memory state.

Documentation

Intended Scope

  • LangGraph chat, greeting, and daily emotion graph builders
  • naming ceremony state machine
  • SSE event adapter
  • store/provider interfaces
  • neutral prompt provider with app-owned override support
  • in-memory demo and tests
  • optional FastAPI, OpenAI, Supabase, and Postgres integrations

Out of Scope

  • product frontend
  • private prompts and brand copy
  • production deployment config
  • billing/webhooks
  • service role keys or project-specific environment values

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

untamedai_runtime-0.4.0.tar.gz (48.6 kB view details)

Uploaded Source

Built Distribution

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

untamedai_runtime-0.4.0-py3-none-any.whl (32.1 kB view details)

Uploaded Python 3

File details

Details for the file untamedai_runtime-0.4.0.tar.gz.

File metadata

  • Download URL: untamedai_runtime-0.4.0.tar.gz
  • Upload date:
  • Size: 48.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for untamedai_runtime-0.4.0.tar.gz
Algorithm Hash digest
SHA256 964c9438d7cc655755a58e5e6a25f42e46ce815b8689fb66d91e1ebc9d3bb395
MD5 d2ca1f30af360af844ff053bf25bd206
BLAKE2b-256 b4536bb8c86e63003992f78dbb0929d37691c330d0c753f4ef79b1e2d831df01

See more details on using hashes here.

Provenance

The following attestation bundles were made for untamedai_runtime-0.4.0.tar.gz:

Publisher: publish.yml on wkddns40/untamedai-runtime

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file untamedai_runtime-0.4.0-py3-none-any.whl.

File metadata

File hashes

Hashes for untamedai_runtime-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 153f96216ba9661b22e4808735f590194b77159ac8d5b3434ebf1fe9a4feaefb
MD5 64f842f6566e942c02ea2c23cc6622c2
BLAKE2b-256 ab77120881df47d060ceefcd74caefebc5f2277dd1615a92d7d7528198c04d50

See more details on using hashes here.

Provenance

The following attestation bundles were made for untamedai_runtime-0.4.0-py3-none-any.whl:

Publisher: publish.yml on wkddns40/untamedai-runtime

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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