> ## Documentation Index
> Fetch the complete documentation index at: https://launchpad.datalumina.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Releases

> Release notes

<Update label="v3.4.1" description="2026-05-12">
  ## What's Changed

  ### Bug fixes

  * **Celery task discovery** now points at `launchpad.worker`, matching the packaged `app/launchpad/` module structure introduced in v3.4.0. Workers can discover tasks correctly after installing the project as a package.
  * **Event persistence** now stores the validated event model directly on `Event.data`, avoiding an unnecessary JSON dump step before the repository writes the event.
  * **Azure OpenAI provider setup** now uses pydantic-ai's `AzureProvider` with `AZURE_OPENAI_ENDPOINT`, `AZURE_OPENAI_API_KEY`, and `AZURE_OPENAI_API_VERSION` (default `2025-04-01-preview`).

  ### Provider cleanup

  * **Mistral support was removed** from `ModelProvider` and Docker Compose environment forwarding to keep the provider list aligned with the currently supported runtime paths.
  * **Google Vertex AI credential loading** now passes an empty string when `GOOGLE_APPLICATION_CREDENTIALS` is unset, making the expected configuration failure clearer.

  ### Dependencies and developer tooling

  * **pydantic-ai** was bumped from `>=1.80` to `>=1.94`.
  * **Pyright configuration** now points at the `app` package root and local `.venv`, improving editor/type-checker resolution for `launchpad.*` imports.
</Update>

<Update label="v3.4.0" description="2026-05-05">
  ## What's Changed

  ### Project layout

  The runtime code that used to live flat under `app/` is now a proper installable Python package: `app/launchpad/`. `pyproject.toml` declares hatchling as the build backend so `uv sync` installs the project in editable mode — no more `sys.path` tweaks in playground scripts, and IDE / pyright pick up the package tree natively.

  * **Imports**: every `from core.…`, `from workflows.…`, etc. is now `from launchpad.core.…` / `from launchpad.workflows.…`. Same applies to `api`, `services`, `database`, `worker`, `utils`, `schemas`.
  * **.env moved** to the repo root (was `app/.env`). `docker/.env` still lives under `docker/` for compose-level settings.
  * **Alembic** stays colocated with the package at `app/launchpad/alembic/`; `./migrate.sh` and `./makemigration.sh` are unchanged but now run from `app/launchpad/`.
  * **Docker** uses `WORKDIR /workspace`, installs the package editable via `uv pip install -e .`, and mounts `./app:/workspace/app` for hot reload. The Celery worker's `-A` target is `launchpad.worker.config`.
  * **Playground scripts** dropped their `sys.path.append(...)` preamble; fixtures and `.env` now load from their new paths.

  ### Reference workflows grouped under `examples/`

  Every shipped workflow now lives in its own package under `app/launchpad/workflows/examples/<name>/` with `schema.py`, `workflow.py`, a `nodes/` directory, a `request_examples/` folder, and a `README.md`. The `examples/` grouping makes it explicit that these are demos to read and replace — your own workflows belong at `app/launchpad/workflows/<name>/`. The `WorkflowRegistry` enum exposes five ready-to-run workflows:

  * **`STREAMING`** → `ExampleStreamingWorkflow` (renamed from `StreamingExampleWorkflow`), backs `POST /v1/chat/completions`.
  * **`QUICKSTART`** → `CustomerCareWorkflow`, concurrent analysis + routing + Jinja2 prompts colocated at `app/launchpad/workflows/examples/quickstart/prompts/`.
  * **`LANGFUSE_TRACING`** *(new)* → `LangfuseTracingWorkflow`, a small moderation pipeline used as a tracing demo.
  * **`PGVECTOR_RAG`** *(new)* → `RagExampleWorkflow`, two-node retrieval + generation on top of a `PgvectorRAGService` wrapper around `vecs` + OpenAI embeddings.
  * **`NESTED_WORKFLOW`** *(new)* → `NestedWorkflow`, a deterministic parent/child workflow composition demo that reuses the same `TaskContext`.

  ### Core

  * **Workflow composition** — `Workflow.run()` and `Workflow.run_async()` now accept an optional `context=` kwarg so a parent workflow can hand its `TaskContext` to a child workflow. The parent's node registry is preserved on return.
  * **Nested workflows** — workflows can now call other workflows from inside a node by using `await ChildWorkflow().run_async(context=task_context)`. The new `NESTED_WORKFLOW` example demonstrates a parent workflow delegating reply drafting to a child workflow while reusing the same `TaskContext`.
  * **`TaskContext`** gains `should_stop: bool` and a matching `stop_workflow()` helper, plus `trace_id: str | None` captured on entry when tracing is enabled.
  * **`Node.cleanup()`** is now explicit on the base class and invoked by the orchestrator after each node run, including when an exception propagates.
  * **`enable_tracing` defaults to `False`** — opt in per workflow instance. Invalid Langfuse credentials raise `LangfuseAuthenticationError` at construction time.
  * **`AgentConfig.instructions`** replaces `system_prompt`; `AgentNode` instances attach dynamic context with `@self.agent.instructions` instead of `@self.agent.system_prompt`.

  ### Prompt management

  * **Colocated prompts** — `PromptManager.get_prompt(..., prompts_dir=PROMPTS_DIR)` loads templates next to the workflow that owns them.
  * **Frontmatter support** — `python-frontmatter` parses YAML metadata at the top of each `.j2` file; surfaced via `PromptManager.get_template_info`.

  ### Playground

  * One script per reference workflow: `playground/{quickstart,nested_workflow,streaming,langfuse_tracing,pgvector_rag}.py`. The legacy `workflow_playground.py` and `send_event.py` scripts have been removed.

  ### Docker

  * Supabase remains excluded by default in `docker-compose.yml`; uncomment `docker-compose.supabase.yml` when you need Studio, Auth, Realtime, Storage, or the Supabase gateway. Caddy remains opt-in for HTTPS deployments.

  ### Dependencies

  * `langfuse>=3.10.5`, `jinja2>=3.1.6`, `python-frontmatter`, `vecs>=0.4`, `tiktoken>=0.12.0`
  * Python `==3.13.13`
  * `pydantic-ai>=1.80`
</Update>

<Update label="v3.3.0" description="2025-12-11">
  ## What's Changed

  ### New Features

  * **SSE Streaming with OpenAI-compatible API** - New `/v1/chat/completions` endpoint that streams responses using Server-Sent Events, following the OpenAI API specification
  * **Workflow streaming support** - Added `run_stream_async()` method to the `Workflow` class for streaming workflow execution
  * **AgentStreamingNode** - New node type for streaming LLM responses with `stream_text_deltas()` and `stream_structured_deltas()` methods
  * **StreamingExampleWorkflow** - Working example with `TextStreamingNode` and `StructuredStreamingNode` demonstrating both plain text and structured output streaming

  ### Langfuse Integration

  * **Native SDK integration** - Replaced OpenTelemetry-based tracing with the native Langfuse SDK
  * **Configurable tracing** - Enable or disable tracing per workflow with `enable_tracing` parameter: `Workflow(enable_tracing=True)`
  * **Automatic span creation** - Workflow and node executions are automatically traced when enabled

  ### Core Updates

  * **Python version requirement** - Bumped minimum Python version to `>=3.13.7`

  ### Docker Infrastructure

  * **Modular compose files** - Split Docker configuration into separate files for easier customization:
    * `docker-compose.launchpad.yml` - Core application (api, celery, redis, db)
    * `docker-compose.supabase.yml` - Full Supabase stack (studio, auth, realtime, storage, etc.)
    * `docker-compose.caddy.yml` - Reverse proxy with automatic HTTPS
  * **Updated Supabase images** - All Supabase services updated to latest versions:
    * Studio: 2025.11.26-sha-8f096b5
    * GoTrue (Auth): v2.183.0
    * PostgREST: v13.0.7
    * Realtime: v2.65.3
    * Storage API: v1.32.0
    * Postgres Meta: v0.93.1
    * Edge Runtime: v1.69.25
    * Logflare (Analytics): 1.26.13
    * Supavisor (Connection Pooler): 2.7.4

  ### Dependencies

  * Updated `pydantic-ai` from >=1.0.15 to >=1.26

  ### Files Changed

  * `app/api/openai.py` (new)
  * `app/core/nodes/agent_streaming_node.py` (new)
  * `app/core/workflow.py`
  * `app/workflows/streaming_example_workflow.py` (new)
  * `app/workflows/streaming_example_workflow_nodes/` (new)
  * `app/utils/event_stream_generator.py` (new)
  * `pyproject.toml`
  * `docker/docker-compose.yml` (restructured)
  * `docker/docker-compose.launchpad.yml` (new)
  * `docker/docker-compose.supabase.yml` (new)
  * `docker/docker-compose.caddy.yml` (new)
</Update>

<Update label="v3.2.0" description="2025-10-07">
  ## What's Changed

  ### Core Improvements

  * **Standardized node output management** - Added `save_output()` and `get_output()` methods to handle node outputs in a standardized way using Pydantic models. Users can now access node data by simply providing the node class, eliminating the need to memorize specific keys for storing and retrieving node outputs.
  * **Enhanced RouterNode functionality** - Added task context handling and improved output management capabilities
  * **Refactored node and workflow logic** - Updated base node and workflow classes to support task context handling across the system
  * **Code cleanup** - Removed unused OpenAI model imports from agent module

  ### Model Provider Updates

  * **OpenAI integration** - Migrated from `OpenAIModel` to `OpenAIChatModel` for improved consistency

  ### Dependencies

  * Updated `pydantic-ai` from >=0.7.5 to >=1.0.15
  * Updated `alembic` dependency to >=1.16.4
  * Updated `uv.lock` with latest package metadata

  ### Files Changed

  * `app/core/nodes/agent.py`
  * `app/core/nodes/base.py`
  * `app/core/nodes/router.py`
  * `app/core/workflow.py`
  * `pyproject.toml`
  * `uv.lock`
</Update>
