Skip to main content

Weave: composable AI agents with a universal interface. Connect any framework (LangChain, CrewAI, or any Python callable) with no rewrite.

Project description

Weave: composable AI agent framework

USB for AI agents. Build an agent once against an open contract, and connect it to any other compliant agent, regardless of LLM, language, or host.

Weave is a Python framework for building composable AI agents. Every agent exposes typed input/output ports and capability tags as its public interface; its brain (LLM), memory, and tools stay private. Any agent's output can plug into any compatible agent's input, and when types are compatible but not identical, Weave auto-injects a transform.

from weaveflow import agent, DataType, Pipeline

@agent(name="summarizer", input=DataType.TEXT, output=DataType.TEXT,
       tags=["summarization"], llm="anthropic:claude-opus-4-8")
async def summarize(ctx):
    return await ctx.complete(f"Summarize:\n{ctx.input.value}")

result = await Pipeline([summarize]).run("a long document ...")

Why Weave

Problem today Weave
Agents are locked to one framework Open port contract; any compliant agent connects
LLM vendor lock-in Swap brains via a "provider:model" string
Custom glue code between agents Connection protocol validates + auto-transforms handoffs
Hard to test multi-agent chains In-process LocalRunner with per-hop tracing

Install

make install                       # dev + all providers in a venv
# or, minimal core (zero deps) + one provider:
pip install "weaveflow[anthropic]"

The core has no runtime dependencies. Provider SDKs are optional extras: weaveflow[openai], weaveflow[anthropic], weaveflow[google], weaveflow[mistral], weaveflow[ollama], weaveflow[deepseek], weaveflow[all].

Core concepts

Weave models an agent as a body with a standard anatomy (PRD §5.3):

Layer Weave component
Skin (ports) PortSchema, the input/output typed contracts
Brain (LLM) LLMAdapter, swappable via create_adapter("provider:model")
Memory ShortTermMemory, LongTermMemory (vector search)
Nervous system Guardrails: pre / post / on_error hooks
Connection ConnectionProtocol + Router + transforms

Standard data types

text, structured_json, image, code, audio, document, embedding, stream.

Two ways to define an agent

# 1. Decorator (ergonomic)
@agent(name="x", input=DataType.TEXT, output=DataType.TEXT, llm="openai:gpt-4o")
async def x(ctx): ...

# 2. Subclass BaseAgent (full control / DI)
class MyAgent(BaseAgent):
    async def handle(self, ctx): ...

Swap LLM backends

"openai:gpt-4o" · "anthropic:claude-opus-4-8" · "google:gemini-1.5-pro"
"mistral:mistral-large-latest" · "deepseek:deepseek-chat" · "ollama:llama3"

Set the matching API key env var (OPENAI_API_KEY, ANTHROPIC_API_KEY, …). Ollama runs locally and needs none.

Compose and connect

from weaveflow import Pipeline, Parallel, LocalRunner

# Series:
pipe = Pipeline([cleaner, extractor, summarizer], llm="anthropic:claude-opus-4-8")
out = await pipe.run("raw input")

# Fan-out / fan-in (runs branches concurrently, then merges):
fan = Parallel([sentiment, topics, summary], input=DataType.TEXT)

# Any variant: Parallel is a BaseAgent, so it nests inside a Pipeline:
pipe = Pipeline([cleaner, Parallel([analyze_a, analyze_b]), report])

trace = await LocalRunner().simulate([cleaner, extractor], "raw input")
for hop in trace.hops:
    print(hop.agent, hop.output.value, hop.elapsed_ms)

Connect a foreign agent, no rewrite

If you can call it from Python, you can connect it to Weave. Already have an agent in LangChain, LangGraph, or CrewAI? Wrap it and plug it in, and the handoff auto-calibrates. Anything else (a plain function, a bound method, an HTTP or SDK call) goes through from_callable, the universal escape hatch. The bridges are duck-typed, so the zero-dependency core stays clean, and a wrapped agent becomes a BaseAgent that composes in Pipeline and Parallel exactly like a native one.

from weaveflow import from_langchain, from_crewai, from_callable, Pipeline

theirs = from_langchain(their_langchain_chain)   # also works with LangGraph graphs
mine   = my_weave_agent
out = await Pipeline([theirs, mine]).run("...")   # connected, no rebuild

# or any function / SDK call:
agent = from_callable(lambda text: external_sdk.run(text), name="legacy")

See docs/guide-interop.md.

CLI

weaveflow scaffold my-agent           # create a starter agent file
weaveflow validate my_agent.py        # validate ports + print manifest
weaveflow package my_agent.py         # portable .weave.zip (code + manifest.json)

Project layout

weaveflow/
  types/        # 8 primitive data types + compatibility graph
  schema/       # port schemas, validator, registry
  llm/          # adapter abstraction + 6 providers + factory
  memory/       # short-term buffer + long-term vector store
  guardrails/   # pre/post/on-error hooks
  agent/        # BaseAgent, context, @agent decorator
  connection/   # protocol engine, router, transforms
  interop/      # bridges: from_langchain / from_crewai / from_callable
  runtime/      # Pipeline (series) + Parallel (fan-out/in) + LocalRunner
  cli/          # scaffold / validate / package
tests/          # mirrors weaveflow/ one-to-one
examples/       # offline quickstart
example-agents/ # copy-paste agent templates (one per folder) + a connect demo

Development

make check      # lint + typecheck + tests (≥80% coverage gate)
make example    # run the offline quickstart
make docker-build

License

Apache-2.0.

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

weaveflow-2.0.0.tar.gz (122.2 kB view details)

Uploaded Source

Built Distribution

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

weaveflow-2.0.0-py3-none-any.whl (50.1 kB view details)

Uploaded Python 3

File details

Details for the file weaveflow-2.0.0.tar.gz.

File metadata

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

File hashes

Hashes for weaveflow-2.0.0.tar.gz
Algorithm Hash digest
SHA256 f35cab9f8cca992a5b4c998079fb1388afe489cb6f2e8bc4246c0cd3a8049a93
MD5 3dffb9625c50c503d44df8f198a5e679
BLAKE2b-256 1ea19ee40a7800ddafecf990c08c062e692e38f5c233ada3bebb00012468faee

See more details on using hashes here.

Provenance

The following attestation bundles were made for weaveflow-2.0.0.tar.gz:

Publisher: release.yml on TheDeveloperDoctor/weave

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

File details

Details for the file weaveflow-2.0.0-py3-none-any.whl.

File metadata

  • Download URL: weaveflow-2.0.0-py3-none-any.whl
  • Upload date:
  • Size: 50.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for weaveflow-2.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c29c64442b64b5c327edad7b3eb21e7e94643445347ede5b7fc4ed8157793e48
MD5 4339f20b4c9350e84c747e40fb555466
BLAKE2b-256 aa65a67d603318a67ea287e9e8dc780bee782841980dd708b56dc82e60aeba1e

See more details on using hashes here.

Provenance

The following attestation bundles were made for weaveflow-2.0.0-py3-none-any.whl:

Publisher: release.yml on TheDeveloperDoctor/weave

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