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, 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.2.0.tar.gz (40.4 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.2.0-py3-none-any.whl (30.5 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: untamedai_runtime-0.2.0.tar.gz
  • Upload date:
  • Size: 40.4 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.2.0.tar.gz
Algorithm Hash digest
SHA256 b6128fd76e388a6912e33e1ef2169667e9cdfd873b95aed39897f04870a0583c
MD5 b1c589737d1fd4c8baabc58d2a6b778d
BLAKE2b-256 6cfa79f9c9b79d336b20ff9304d5ea22f874d404f4f1cf95fddb1010cfdca2e0

See more details on using hashes here.

Provenance

The following attestation bundles were made for untamedai_runtime-0.2.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.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for untamedai_runtime-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 da4603917ca4a4a18d550b82a0fb23782817d922f20b732dbf74440e02a02a67
MD5 09e4d4074d350449e238b21bd0472d41
BLAKE2b-256 1bdaff9a715a1d27335d556aac4236c6ded2a8fbe91bb5837858ff425ebb4520

See more details on using hashes here.

Provenance

The following attestation bundles were made for untamedai_runtime-0.2.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