Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

phuryn/agentlift

Repository files navigation

agentlift

Own the definition. Rent the runtime. One neutral agent folder, deployed to Claude Managed Agents, AWS Bedrock AgentCore, Google Agent Engine, and OpenAI.

PyPI License: MIT Claude Managed Agents AWS Bedrock AgentCore Google ADK OpenAI Agents SDK

Agent runtimes all want your agent in a different shape. agentlift lets you define it once as a neutral .managed-agents/ folder — system prompt, skills, MCP servers, tool allowlist, subagents — then audit, export, or deploy it to Anthropic Managed Agents, AWS Bedrock AgentCore, Google Agent Engine, or OpenAI Agents SDK. And now import reads a live agent back into the folder — so you can migrate between runtimes, not just deploy to them.

Own the definition. Rent the runtime.

It's the folder you already use with Claude Code / the Agent SDK (CLAUDE.md/agent.md + skills/ + .mcp.json + a roster). Nothing new to learn — the thing you have is the input, and it stays yours, not a vendor's.

pip install agentlift
agentlift audit ./my-agent # how portable is it, per provider? (offline)
agentlift deploy ./my-agent # → Anthropic Managed Agents (reference target)
agentlift deploy ./my-agent --target bedrock # → AWS Bedrock AgentCore (Claude-native)
agentlift deploy ./my-agent --target google # → Google Vertex AI Agent Engine (preview)
agentlift export openai-agents ./my-agent # → an OpenAI Agents SDK script (self-host)
agentlift import anthropic ./my-agent # ← read a live agent back into the folder

agentlift not found after install? Run it module-style — python -m agentlift.cli <cmd> (the launcher just landed off PATH; add it if you prefer the short form).

Migrate between runtimes

Because the folder is the neutral pivot, import + deploy is a migration — pull an agent out of one runtime and push it into another:

# Anthropic → AWS Bedrock
agentlift import anthropic ./agent # read the live agent into ./agent
agentlift deploy ./agent --target bedrock --mode harness # redeploy it to AWS Bedrock AgentCore
# (or `agentlift export bedrock-strands ./agent` for a self-host container instead)
# ...and back the other way
agentlift import bedrock ./agent --harness-name my-agent --bedrock-region us-west-2
agentlift deploy ./agent # → Anthropic Managed Agents

Anything that doesn't survive a given hop is surfaced as a agentlift plan diagnostic before you deploy — never a silent lossy copy. See docs/import.md for the round-trip details and the one-way limitations.

Why this exists

Adopt a provider's native tooling — Anthropic YAML, a Bedrock Strands container, Google ADK Python, an OpenAI graph — and your agents are now shaped by that provider. The day you want a different runtime, you re-author everything. agentlift makes the deploy unit the same folder you develop against, keeps it provider-neutral, and treats each runtime as a back-end of one compiler. One definition, many backends, no lock-in.

See it happen (a skill that runs in the cloud)

The believable bit isn't "we generated config" — it's that an uploaded skill actually fires inside the hosted runtime. plan is a deterministic, no-network dry run; deploy pushes it; run proves the skill rode along:

$ agentlift plan ./examples/quickstart
Skills to upload: 1
 - receipt-stamp (035823c8, 1 file) used by: knowledge-agent
Agents to create: 1
 - knowledge-agent [claude-haiku-4-5] tools: read/glob/grep skills: @skill:035823c8
Deployable: yes
$ agentlift deploy ./examples/quickstart -y
 skill 'receipt-stamp': uploaded skill_01Ph... agent 'knowledge-agent': created agent_019L...
 Lockfile written: ./examples/quickstart/.agentlift-lock.json
$ agentlift run knowledge-agent --project ./examples/quickstart --task "What is a North Star metric?"
 A North Star metric is the single measure that best captures the value users get...
 RECEIPT: metric captured ← the uploaded SKILL.md firing inside the hosted runtime
 latency 5.9s | in 4121 out 220 | ~0ドル.0044

The plan is a pure function of the folder (same input → same plan): it's the dry-run, the diff, and what the offline tests assert against.

The folder is the agent

agentlift reads a convention you may already use. A minimal single agent:

my-agent/.managed-agents/knowledge-agent/
├── agent.md # YAML frontmatter + system prompt
├── skills/receipt-stamp/SKILL.md # uploaded as a managed skill
└── knowledge/pm-basics.md # folded into the system prompt
---
name: knowledge-agent
model: claude-haiku-4-5
tools: [read, glob, grep] # built-in allowlist (omit = all)
---
You are the Knowledge Agent. Answer product questions concisely.

...and the same convention scales to a multi-agent system — a coordinator, workers, shared and private skills/MCP servers, all wired by frontmatter:

.managed-agents/
├── shared/skills/cite-sources/SKILL.md # shared skill — uploaded once, used by many
├── shared/mcp.json # shared MCP — one server, many agents
├── lead/agent.md # subagents: [bug-finder, researcher] → coordinator
├── bug-finder/ (agent.md + skills/bug-report/) # private skill
└── researcher/ (agent.md + mcp.json) # private MCP

A bare ref (search) resolves to the agent's own resource first, then shared/. Your local .claude/agents/ are never swept in. Full spec: docs/convention.md.

How it works

parse → plan → apply → run — and only apply/run touch the network.

  • parse — read the folder into an in-memory project (pure file IO).
  • plan — a deterministic list of API ops with symbolic refs, skill dedup, validation, and diagnostics. No network. This is the dry-run and the test contract.
  • apply — upload skills (deduped), create agents in order, write .agentlift-lock.json (local definition → remote IDs) so re-deploys are idempotent. Commit it.
  • run — invoke a deployed agent by ID, or run the same folder locally with --local.

Diagnostics surface anything a runtime can't represent — never a silent drop. Internals: docs/how-it-works.md.

Provider snapshot

One folder, four managed-agent runtimes — at different maturity tiers. agentlift audit rates portability per provider before you deploy; the table below is what agentlift ships today:

Runtime Deploy status Model Notes
Anthropic Managed Agents ✅ Live — reference target, fullest mapping Claude (native) skills · MCP · :ask · coordinator
AWS Bedrock AgentCore Liveboth primitives: managed Harness (single agent · skills · MCP · sandbox · browser, 6/6 live-verified ) and custom-container Runtime (multi-agent; subagent delegation live-verified ); the AWS AgentCore feature is in public preview Claude (native, no remap) --mode auto routes single→Harness, team→Runtime (deploy-bedrock.md)
Google Vertex AI Agent Engine 🟡 Live (preview) Claude → Gemini skills · MCP · web tools; deploy-google.md
OpenAI Agents SDK 📦 Export / self-host gpt-* as_tool composition; no hosted-deploy path

Each runtime captures the agent differently (Anthropic YAML, a Strands/AgentCore container, ADK Python, an Agents SDK script) — the full cell-by-cell map is docs/provider-matrix.md. Read the tier before assuming parity: Google is preview; on AWS a single agent deploys to the Harness and a multi-agent team deploys to the custom-container Runtime (both live) — and the Runtime's nested specialist skill/MCP calls are wired + output-corroborated, not independently exercised (the /invocations response is the container's JSON body, not a tool-event stream).

Proof, not assertion

agentlift's claims are pinned by tests and committed live receipts, not prose:

  • Live coverage matrix — one neutral fixture deployed + queried on Anthropic and Google, with all six portability dimensions (agents · subagents · shared/individual MCP · shared/individual skill) EXERCISED server-side (committed receipts under tests/live/receipts/).

  • AWS Bedrock AgentCore — both primitives live-verified (committed Nova receipts):

    • Harness, 6/6 (single agent): CreateHarness → READY then InvokeHarness exercising agent + base-session sandbox + remote MCP + S3-loaded skill + agentcore_browser.
    • Runtime, multi-agent (the headline): a real team (coordinator + 2 specialists) built to an ARM64 image → ECR → CreateAgentRuntime → READYInvokeAgentRuntime, with subagent DELEGATION exercised (the coordinator's top-level trace named both specialists); a single-agent smoke separately exercised a root-level MCP call. Nested specialist skill/MCP are wired + text-corroborated (the /invocations body isn't a tool-event stream).
    • Model mapping stays Claude-native; the receipts run on Nova to prove the control plane, container, invocation path, and delegation while Claude-on-Bedrock access is account-gated (a one-time entitlement, not a code gap). Evidence: docs/tested-platforms.md.
  • Managed vs local benchmark (benchmarks/results.md, claude-haiku-4-5):

    Arm Pass rate Median latency Avg cost
    managed (cloud) 100% on N=5 runs 5.9s 0ドル.0052
    local (your machine) 100% on N=5 runs 2.3s 0ドル.0034

    Pass = the uploaded skill fired and the answer was on-topic. Same folder, two runtimes, identical behavior.

pytest -m "not live" # deterministic translation + idempotency — no API key, runs in CI
pytest -m live # deploy to the real API, run, LLM-grade (needs credentials)

What you get, briefly

  • Isolation by construction — a deployed agent gets only its own folder (+ shared/); the repo-root CLAUDE.md, a sibling's skills, and your machine's MCP servers can't leak in. Pinned by tests/test_isolation.py.
  • Permissions that deploy — append :ask to any tool (bash:ask, create_issue:ask) and the hosted agent pauses for caller approval — the deployable form of a hook.
  • Deploy how you work — a command (deploy --yes), a git-push workflow, or from inside Claude Code. Idempotent via the lockfile.
  • A full CLIvalidate · plan · audit · export · diff · deploy · import · run · list · destroy · bench. See docs/deploying.md.
  • Round-trip, so you can migrateimport reads a live Anthropic agent (or a Bedrock harness) back into the folder; deploy it elsewhere and the folder is the neutral pivot. See docs/import.md.

Documentation

Doc What's in it
docs/convention.md The .managed-agents/ folder spec — frontmatter, skills, MCP, :ask, subagents
docs/how-it-works.md parse → plan → apply → run, determinism, idempotency, the lockfile
docs/import.md import — read a live agent back into the folder; the round-trip + migration story, one-way losses
docs/deploying.md The three deploy paths, commands, the lockfile, install/PATH
docs/provider-matrix.md Cell-by-cell capability matrix across all four runtimes
docs/anthropic-mapping.md Exact local → Managed Agents field mapping
docs/deploy-bedrock.md · deploy-google.md Per-provider credentials, gates, and caveats
docs/tested-platforms.md Per-platform live receipts + reproduce steps
docs/limitations.md Honest constraints (stdio MCP, MCP auth, knowledge inlining)

Examples: quickstart/ (one agent) · team/ (coordinator + roster, shared skill, MCP, bash:ask) · in-a-project/ (embedded in a real repo, proves isolation) · deploy-workflow/ · claude-code-skill/.

Limitations

Each is surfaced as a agentlift plan diagnostic, never a silent surprise — full list in docs/limitations.md:

  • Remote MCP only — local stdio servers (npx ...) can't be deployed; host behind HTTPS.
  • No inline MCP auth on Anthropic (Bedrock + Google carry it via runtime env vars).
  • Knowledge files are inlined into the system prompt (no persistent FS in the sandbox).
  • Maturity varies — Anthropic is live/full; AWS is live on both AgentCore primitives (Harness single-agent + Runtime multi-agent; the AgentCore feature is in AWS preview); Google is live preview; OpenAI is export-only.
  • Runtime nested-tool visibility — on the AWS Runtime, subagent delegation is objectively traced, but a specialist's internal skill/MCP calls don't cross the /invocations boundary (wired + output-corroborated, not independently exercised).
  • Import is read-only, and one-way in placesimport reads Anthropic (full) and the Bedrock harness back into the folder; a Bedrock Runtime is an opaque container and refuses. Knowledge inlining, custom tools, and MCP auth values don't round-trip (each flagged as a diagnostic). See docs/import.md.

Roadmap

Current focus: a same-Claude-brain AWS receipt (Gate A: the one-time Anthropic use-case entitlement — the hosted Runtime + Harness are already live-proven on Nova), surfacing the Runtime's nested specialist tool calls past the /invocations boundary, and a self-hostable openai-chatkit export. Per-provider gaps and status live in their deploy docs and docs/provider-matrix.md.

License

MIT — see LICENSE.

About

Deploy agents to Claude Managed Agents, AWS Bedrock AgentCore, and Google. One folder, one definition, one command.

Topics

Resources

License

Contributing

Stars

Watchers

Forks

Packages

Contributors

Languages

AltStyle によって変換されたページ (->オリジナル) /