Skip to main content

Vibe Protocol - event-sourced agentic orchestration

Project description

mistralai-vibe-protocol

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

Overview

mistralai-vibe-protocol 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 mistralai.vibe.protocol import AgentTask, ToolTask, TaskState, PendingOutput, MessageEntry, MessageEntryPayload
from mistralai.vibe.protocol.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 pyright

# Linting
uv run ruff check .

# Tests
uv run pytest tests/

Project Structure

mistralai/vibe/protocol/
  __init__.py              # Package exports
  logging.py               # Structured logging configuration

  types/                   # 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)
    patch.py               # RFC 6902 JSON Patch ops + AppendOp extension

  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

  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/
  render.py                # Rendering utilities for example output
  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.3.0.tar.gz (74.1 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.3.0-py3-none-any.whl (98.1 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: mistralai_vibe_protocol-0.3.0.tar.gz
  • Upload date:
  • Size: 74.1 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.3.0.tar.gz
Algorithm Hash digest
SHA256 539b8313287f9ce2021dcd75b13d569d1e70f9d7274897de1d7edff8668f51d6
MD5 9eaad23eaabaa3ff229a385e6a739421
BLAKE2b-256 461cc5ff630bd83f777211296e316221a3145a8337703c988e4872194a2d601e

See more details on using hashes here.

Provenance

The following attestation bundles were made for mistralai_vibe_protocol-0.3.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.3.0-py3-none-any.whl.

File metadata

File hashes

Hashes for mistralai_vibe_protocol-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 ea0faa3ccd689427a747d4bd0d3b45fa9c7a2f0e59909ae3c8e07a577802159e
MD5 0854bc739ad3deb045ca6bb60305982a
BLAKE2b-256 2ba02637f32ceec1668264da060a7701dafbb3be3145d34ca2eaeaca09de13e6

See more details on using hashes here.

Provenance

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