SDK / stack catalog #
Side-by-side agent education: each scenario is one SDK-agnostic task under scenarios/<id>/, with idiomatic demos in scenarios/<id>/<framework>/. Compare the same shape across tiers (raw API → agent SDK → platform → managed catalog). Prefer TypeScript when the vendor ships an official TS/JS client. Unit-1 leads with Letta verified cells; employer Managed is secondary. A demo is educationally trustworthy only when scenarios/GAPS.md marks it verified (smoke tripwire green) — linked — pending keys+PASS ≠ verified. Do not invent APIs for gaps (including Decisions API until public docs exist). No Modal.
Sourced from Notion Learning Index + Research docs checks (2026-09-30 PT).
Path convention #
| Role |
Path |
| Scenario body |
scenarios/<scenario-id>/README.md |
| Per-stack demo |
scenarios/<scenario-id>/<framework>/index.ts (or .py) |
| Package install + stack notes |
sdks/<framework>/ (this tree) |
| Coverage matrix |
scenarios/GAPS.md |
| Smoke runner |
tripwire/ |
cd sdks/letta && npm install
npx tsx ../../scenarios/hello/letta/index.ts
# or:
cd ../../tripwire && npx tsx run.ts --id hello/letta/index.ts
Tier 1 — Raw model APIs (baselines) #
| Framework id |
Product |
Lang |
Docs-backed strengths |
Honest gaps / lab rules |
claude |
Anthropic Messages |
TS + Python |
hello, tools, streaming |
No native handoffs / HITL / agent memory / MCP harness — leave gap unless a tiny idiomatic pattern exists |
openai |
OpenAI Responses |
TS + Python |
hello, tools, streaming |
Same; Conversations API ≠ agent memory product |
gemini |
Google Gen AI generateContent |
TS + Python |
hello, tools, streaming |
Same baseline stance |
Tier 2 — Agent SDKs / frameworks #
| Framework id |
Product |
Lang |
Docs-backed strengths |
Honest gaps / lab rules |
openai-agents |
OpenAI Agents SDK (@openai/agents) |
TS preferred (+ Python fills) |
tools, streaming, sessions, handoffs, approvals, MCP, sandboxes, compaction; computerTool (Phase 2) |
Distinct from Agents API hosted computer_use and from Decisions API |
claude-agent-sdk |
Claude Agent SDK |
TS |
query stream, resume, subagents, canUseTool, MCP, FS tools, skills |
Not Managed Agents; not raw Messages |
langchain |
LangChain create_agent |
Python (+ JS streaming) |
tools, SqliteSaver memory, HITL middleware, streamEvents |
Handoffs only when a tiny subgraph demo is obvious |
eve |
Vercel Eve |
TS |
filesystem agent, tools, subagents, approvals, skills |
Durable memory still a lab gap unless tiny resume demo lands |
| Framework id |
Product |
Lang |
Docs-backed strengths |
Honest gaps / lab rules |
cloudflare-agents |
Cloudflare Agents (DO) |
TS |
hello/tools, MemoryAgent setState, skills |
Streaming consumer + HITL still gap without tiny official quickstart |
Tier 4 — Managed / hosted agents #
Unit-1 teaching lead is Letta verified cells (see ../scenarios/UNIT-1.md). Other employer Managed / hosted stacks here are secondary catalog entries — same evidence bar (linked — pending keys+PASS until PASS); do not treat a path as done.
| Framework id |
Product |
Lang |
Docs-backed strengths |
Honest gaps / lab rules |
letta |
Letta Agent SDK |
TS |
sessions, stream, resume, tools, approvals, MCP, cloud sandbox |
Multi-agent = multiple agents + app orchestration, not handoffs=[]. Phase-1 + graduation cells verified where GAPS says so. |
claude-managed |
Claude Managed Agents |
TS preferred |
Agent/Environment/Session, SSE, memory store, MCP, sandbox, skills |
Secondary to Unit-1 Letta/agent-SDK spine. No fake native triage handoff; tool-use may be cloud bash — label in README. Lab cells linked — pending keys+PASS. |
gemini-managed |
Gemini Managed + Interactions |
TS preferred |
interactions, previous_interaction_id + environment, remote env, skills |
Secondary catalog. No native handoff; streaming left gap until idiomatic stream consumer is clear; HITL unknown for tiny demos. |
notion-agent |
Notion Agent APIs |
TS preferred |
sessions, SSE, session continue, required_actions approvals |
Host-side tool-use stays stub; tools live on Custom Agent / connectors |
Index stacks — not yet lab folders #
Per-stack notes: _preview/.
| Stack |
Status |
Lab posture |
| OpenAI Decisions API |
Limited preview; no public API guide |
Index-only. Do not invent a Decisions client or folder until official docs ship. Bounded router pattern sits next to handoffs conceptually. |
| OpenAI Agents API (hosted, beta) |
Docs exist; computer_use + origin/auth HITL |
Prefer SDK computerTool under openai-agents for Phase 2 |
| Google ADK |
Index tutorial track |
Folder when Index prioritizes |
| Bedrock Agents Classic |
Closed to new customers |
Do not add a Classic folder |
| Bedrock AgentCore |
Platform (any framework) |
Phase 3 when Index greenlights; distinct from BMA |
| Bedrock Managed Agents powered by OpenAI (BMA) |
Public preview |
Phase 3 separate folder; Python/shell-first until official TS client |
| Sandboxes: E2B, Daytona, Runloop, Blaxel |
Connectors |
Pair with a host framework; not Modal |
Capability cheat-sheet #
| Capability |
Strongest frameworks (docs) |
Lab note |
| hello / tools |
Nearly all |
Notion tools stay stub |
| streaming |
Broad |
Prefer dedicated scenarios/streaming/<fw>/ |
| memory / resume |
letta, claude-agent-sdk, claude-managed, gemini-managed, notion-agent, openai-agents, cloudflare-agents, langchain |
Raw APIs = gap |
| handoffs |
openai-agents, eve, claude-agent-sdk |
No fake managed handoffs; Decisions ≠ handoffs client |
| approvals |
letta, eve, langchain, openai-agents, claude-agent-sdk, notion-agent |
Browser origin/auth gates count |
| MCP / sandbox-files / skills |
Several managed + agent SDKs |
Phase 2 fills; computer-use under sandbox + approvals |
| Decisions (bounded route) |
OpenAI Decisions API (preview) |
No code until public guide |
Learning Index #
Deep self-study tutorials live in Notion Managed Agents: Learning Index (parent of Agent Lab: Curriculum + Capability Matrix). Prefer official quickstart shapes from those tutorials over inventing APIs.
Lab smoke honesty lives in-repo: ../scenarios/GAPS.md — verified vs linked — pending keys+PASS (linked ≠ done). The Notion Curriculum page should mirror that wording (not “filled”).