Skip to main content

Vibe Protocol - event-sourced agentic orchestration

Project description

Vibe Protocol

Package for the Task protocol — composable, observable, durable agentic orchestration.

Overview

vibe_sdk is built around the Task, a single abstraction that unifies tools, agents, and workflows under one protocol. Every Task shares the same interface: input, output, streaming history updates, a terminal result event, and recursive subtask composition.

  • One interface for everything: Tools, LLM agents, workflows, and sandboxed code are all Tasks
  • Recursive composability: Tasks compose into observable trees at any depth
  • Streaming observability: History updates stream as JSON patches, followed by one terminal task result
  • Port/adapter design: Pluggable LLM backends via the CompletionModel protocol
  • Durability-ready: TaskState is the complete checkpoint — serialize, store, resume

Installation

uv sync

For development dependencies:

uv sync --all-extras

Quick Start

MISTRAL_API_KEY=<your-key> uv run python examples/demo_simple.py

Simple Agent with Tools

from vibe_sdk import AgentTask, ToolTask, TaskState, PendingOutput, MessageEntry, MessageEntryPayload
from vibe_sdk.patterns.completion.adapters.mistral import MistralAdapter

def add_numbers(a: float, b: float) -> str:
    return str(a + b)

completion = MistralAdapter(api_key=api_key)
add_tool = ToolTask(fn=add_numbers, name="add_numbers", description="Add two numbers")

agent = AgentTask(
    completion=completion,
    tasks={"add_numbers": add_tool},
    system_prompt="You are a helpful assistant.",
)

state = TaskState(
    id="demo",
    output=PendingOutput(),
    history=[MessageEntry(payload=MessageEntryPayload(role="user", content="What is 3 + 4?"))],
)

channel = await agent.run(state)
async for message in channel:
    # history_update events stream while the task runs,
    # then one terminal task_result carries the final TaskState.
    print(message)

Nested Agents (Subtask Delegation)

researcher = AgentTask(
    completion=completion,
    tasks={"search_web": search_tool},
    name="researcher",
    description="Research a topic using web search",
    system_prompt="Research the given topic, then summarize findings.",
    input_schema={"type": "object", "properties": {"topic": {"type": "string"}}},
)

orchestrator = AgentTask(
    completion=completion,
    tasks={"researcher": researcher},
    system_prompt="Delegate research to the 'researcher' tool, then synthesize.",
)

channel = await orchestrator.run(state)
async for message in channel:
    print(message)

The orchestrator LLM sees researcher as a tool. When it calls researcher(topic="quantum computing"), the runtime spawns a nested agent loop with its own LLM and tools. The parent receives structured output as a tool result.

Documentation

Development

# Type checking
uv run mypy src/vibe_sdk/

# Linting
uv run ruff check src/vibe_sdk/

# Tests
uv run pytest tests/

Project Structure

src/vibe_sdk/
  __init__.py              # Package exports
  patch.py                 # RFC 6902 JSON Patch ops + AppendOp extension
  logging.py               # Structured logging configuration

  protocol/                # Pure types and contracts
    state.py               # TaskState, HistoryEntry, TaskOutput
    events.py              # history_update, task_result, callback_* messages
    channel.py             # Channel protocol
    task.py                # Task protocol (@runtime_checkable)

  modules/                 # Generic engine components
    execution.py           # ExecutionLoop, StateModule ABC, Downstream protocol
    sub_task.py            # sub_task_reducer, subtask event/effect types
    produce.py             # Immer-like produce() + diff()
    json_patch.py          # apply_patches(), reroute_patches()
    task.py                # ModuleTask base class, TaskConfigBase

  bindings/                # Transport integrations
    local.py               # LocalChannel (in-process, asyncio.Queue)
    streamable_http.py     # HTTP/SSE transport for cross-process communication
    workflow_api/          # Temporal workflow integration
      channel.py          # WorkflowAPIChannel (NATS JetStream)
      callback.py          # WorkflowCallbackBridge
      executor.py          # WorkflowEffectExecutor
      streaming.py         # WorkflowStateSink
      task.py              # WorkflowAPIRemoteTask
      types.py             # Workflow-specific types
      workflow.py          # DurableAgentWorkflow

  patterns/                # Concrete task implementations
    agent.py               # AgentTask, AgentModule (LLM-driven orchestration)
    tool.py                # ToolTask (function wrapper)
    completion/            # LLM completion domain
      port.py              # CompletionModel protocol
      types.py             # CompletionRequest, CompletionChunk
      messages.py          # Message, ToolCall, FunctionCall
      bridge.py            # stream_to_mutations, build_completion_request
      adapters/
        mistral.py         # Mistral API adapter

tests/
  conftest.py              # Shared test factories and mocks
  test_protocol_types.py   # Protocol type tests
  test_produce.py          # produce() / diff() tests
  test_execution_loop.py   # ExecutionLoop tests
  test_replay_invariants.py # Reducer/loop invariant tests
  test_effect_handlers.py  # Standalone effect handler tests
  test_agent_reducer.py    # AgentModule reducer unit tests
  test_sub_task.py         # sub_task_reducer tests
  test_tool_task.py        # ToolTask tests
  test_stream_bridge.py    # LLM streaming bridge tests
  test_agent_task.py       # AgentTask integration tests

examples/
  demo_simple.py           # Simple tool-calling agent
  demo_subagents.py        # Nested agents with parallel subtasks
  demo_callbacks.py        # Callback mechanism demonstration
  demo_networked_server.py # Agent served over Streamable HTTP (uvicorn)
  demo_networked_client.py # Orchestrator calling a remote agent over HTTP
  render.py                # Rendering utilities for example output
  run.py                   # Unified demo runner (YAML config-based)
  configs/                 # Demo configurations
    simple.yaml            # Basic agent with tools
    subagents.yaml         # Parent with child researchers
    callbacks.yaml         # Callback resolution patterns
    triple_callback.yaml   # 3-level callback chain
    agent_callback.yaml    # Agent-as-callback implementation

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

mistralai_vibe_protocol-0.1.0.tar.gz (49.5 kB view details)

Uploaded Source

Built Distribution

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

mistralai_vibe_protocol-0.1.0-py3-none-any.whl (65.9 kB view details)

Uploaded Python 3

File details

Details for the file mistralai_vibe_protocol-0.1.0.tar.gz.

File metadata

  • Download URL: mistralai_vibe_protocol-0.1.0.tar.gz
  • Upload date:
  • Size: 49.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for mistralai_vibe_protocol-0.1.0.tar.gz
Algorithm Hash digest
SHA256 b3ad7858932b41779ade606d9aafe03c08b6804d4416576997d438dd8785f0f8
MD5 d0c1a47c90d52c3a49daaa74d9e8675a
BLAKE2b-256 26f9d6254cfe0ff2523e1e85ed8f5b7710cca7217e9c2ce8d006f2bfb55514e9

See more details on using hashes here.

Provenance

The following attestation bundles were made for mistralai_vibe_protocol-0.1.0.tar.gz:

Publisher: release.yml on mistralai/vibe-protocol

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

File details

Details for the file mistralai_vibe_protocol-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for mistralai_vibe_protocol-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a340f9040ecacfb28cea8d0034ab25ba883d9c364ae005c43db015a9c63254ac
MD5 f3bff081e41da232d677511d5cd08754
BLAKE2b-256 e669947b11d27b85b1aac1ac4d1234d5694ae099b254e45e484f33fe9d88f8a7

See more details on using hashes here.

Provenance

The following attestation bundles were made for mistralai_vibe_protocol-0.1.0-py3-none-any.whl:

Publisher: release.yml on mistralai/vibe-protocol

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