Skip to content

Migrating from 1.0.00.7.x (the version reset)

lazybridge==1.0.0 shipped on PyPI in April 2026 with the original namespace (LazyAgent, LazyTool, LazySession, LazyContext). The project then went through a deliberate pre-1.0 reset: the public API was renamed and trimmed to the canonical Agent / Tool / Session / sentinels shape now documented site-wide, the version was rolled back to 0.7.0, and a sequence of point releases (through 0.7.9) tightened the surface.

If you installed 1.0.0 from PyPI and want to move forward, this is your migration path. If you're starting fresh today, skip this page — the rest of the documentation reflects the current API.

Why the version went backwards

The 1.0.0 cut leaked too many factory variants and internal helpers into the public surface. Calling it 1.0 would have locked us into supporting all of it indefinitely. Choosing to ship a 0.7.x reset is the explicit signal: pre-1.0, expect breaking changes between minor releases. The next 1.0.0 will be cut from the current line once the surface stabilises.

This is also why lazybridge.__stability__ == "alpha" and why pyproject.toml ships Development Status :: 3 - Alpha.

Symbol renames

Every renamed top-level symbol with its 0.7.x replacement. The same table is enforced machine-readably by lazybridge/llms.json under the renames key.

1.0 name 0.7.x name Notes
LazyAgent Agent Class renamed; semantics preserved
LazyTool Tool.wrap() factory (preferred) or Tool Tool.wrap() is the canonical multi-input dispatcher
LazySession Session
LazyContext sentinels + Store + Memory Decomposed — there is no single replacement
Agent.from_chain Agent.chain Alias deleted in 0.7.9
Agent.from_parallel Agent.parallel Alias deleted in 0.7.9
Agent.from_engine Agent(engine=…) Constructor only; the factory was a no-op
Agent.from_model Agent(model_or_engine, …) The positional shortcut covers it
Agent.from_plan Agent(engine=Plan(…)) Same — no factory variant kept
_ParallelAgent (private) ParallelAgent (public) Returns a single Envelope (with payload = list[Envelope])

Deleted configuration objects

The 1.0 line shipped three dataclass-based config bundles. All three were deleted in 0.7.9; pass the fields as flat kwargs on Agent(...) / LLMEngine(...) instead.

Deleted Was used to bundle Replace with
AgentRuntimeConfig timeout, output_validator, … Flat kwargs on Agent(...)
ResilienceConfig max_retries, retry_delay, fallback Flat kwargs on Agent(...)
ObservabilityConfig session, verbose Flat kwargs on Agent(...)

Deleted behaviour

Removed Why Replace with
Tool(mode="auto") Hidden-fallback ladder produced silent provider failures Pick "signature" (default), "hybrid", or "llm" explicitly
tool_choice="parallel" Never functioned; concurrent dispatch is the default Drop the argument; the engine emits parallel tool calls automatically
Silent fallback to Anthropic when a model string had no rule Cryptic provider-side errors several RTTs later LLMEngine now raises ValueError; either register a rule or pass provider=
Bare-provider-alias-as-model (LLMEngine("anthropic")) Constructed successfully but produced model_id "anthropic" at request time Agent.from_provider("anthropic", tier="…") for tier aliases, or Agent(engine=LLMEngine("<model-id>")) for pinned ids
MCP.stdio(...) / MCP.http(...) with no allow= / deny= Warn-and-proceed default was unsafe for filesystem / git / shell servers Deny-by-default since 0.7.9 — pass allow=["*"] after audit, or a glob list
lazybridge.external_tools.report_builder Reporting subsystem extracted to a sibling package pip install lazybridge-reports, then import lazybridge_reports

Quickstart diff

1.0:

from lazybridge import LazyAgent, LazyTool

agent = LazyAgent.from_chain([
    LazyAgent.from_model("claude-opus-4-1"),
    LazyAgent.from_model("gpt-4o"),
])
result = await agent.run("hello")

0.7.x:

from lazybridge import Agent, LLMEngine

researcher = Agent(name="research", engine=LLMEngine("claude-opus-4-7"))
writer     = Agent(name="write",    engine=LLMEngine("gpt-5.4-mini"))
pipeline   = Agent.chain(researcher, writer)

result = pipeline("hello")          # sync entry point — no asyncio.run wrapper

See also