{"slug": "show-hn-a11-typed-streams-and-reusable-actions-for-agentic-applications", "title": "Show HN: A11 – typed streams and reusable actions for agentic applications", "summary": "A11, an open-source runtime and RPC toolkit, was released to let developers define application operations as typed actions with independently streamed inputs and outputs, runnable locally, across services or browsers, or callable by an AI model as a tool. The toolkit provides orchestration, discovery, and persistence without requiring a graph or agent runtime, and its documentation states it can integrate with layers including LangGraph, Hermes, MCP, and gRPC. A11 supports the same action interface across Python, TypeScript, and C++.", "body_md": "`request` DeepResearchRequest`topic` string`parallelism` integer\nA11 is an open-source toolkit that turns ordinary async functions into actions: reusable capabilities with named inputs and outputs that can stream. Run the same action locally, across services or browsers, or let an AI model call it as a tool.\n\n`plan-research`…` investigate / architecture``investigate / lifecycles`\nNested calls keep their own timing and structured status.\n\n`plan` application/json0 values\nWaiting for output…\n\n`report` text/markdown0 chunks · stream`usage_metadata` application/json0 chunks · stream\nDescribe an action’s inputs and outputs once, then use the same thin, data-driven streaming interface for local models, APIs, agent tools, web agents, native code, and distributed or high-load services. If you have its schema, you can call it.\n\nA voice-enabled desktop app runs capture and recognition on the user’s machine. Words become text input as the person speaks, while microphone access and the speech model stay local.\n\n`capture_transcription`\n\n```\naction = capture_transcription().run()\nawait action[\"asr_options\"].finalize({\n    \"model\": \"ggml-base.en.bin\"\n})\n\nasync for text in action[\"transcription_pieces\"]:\n    composer.insert(text)\noptions = await action[\"asr_options\"].consume()\nmicrophone = open_microphone()\n\nasync for text in recognize(microphone, options):\n    await action[\"transcription_pieces\"].put(text)\n```\n\nA11 is an open-source runtime and RPC toolkit for defining application operations as typed actions with independently streamed inputs and outputs. AI frameworks such as LangGraph organize stateful workflows, agent harnesses such as Hermes provide a ready-made model-and-tool loop, MCP connects AI applications to tools and context, and gRPC defines remote service calls. A11 provides orchestration, discovery, persistence, and the same action interface for local or remote execution, without requiring a graph or agent runtime; it can also integrate with each of these other layers.\n\n| Capability | A11 | AI frameworkExample: LangGraph | Agent harnessExample: Hermes | Tool protocolExample: MCP | RPC toolkitExample: gRPC | \n|---|---|---|---|---|---|\n| Multiple named input and output streams |  |  |  |  |  | \n| Typed multimodal I/O |  |  |  |  |  | \n| Orchestration in ordinary async code |  |  |  |  |  | \n| No required agent or graph runtime |  |  |  |  |  | \n| Model and tool calls without an agent runtime |  |  |  |  |  | \n| One API for local and remote calls |  |  |  |  |  | \n| Runtime action discovery |  |  |  |  |  | \n| Storage separate from execution |  |  |  |  |  | \n| Pluggable transport |  |  |  |  |  | \n| Pluggable live-stream storage |  |  |  |  |  | \n| Swap infrastructure without app changes |  |  |  |  |  | \n| End-to-end local and remote tracing |  |  |  |  |  | \n\nThis compares their primary public abstractions, not every integration or extension. A11 can use gRPC infrastructure, expose operations through MCP, supply capabilities to LangGraph, or act as an execution layer for a harness such as Hermes. Green marks comparable support; yellow marks partial coverage. Hover over dotted values for context.\n\nStart by describing an async handler and its inputs and outputs. Add streaming, model calls, tool use, persistence, remote execution, or Flow when the application requires them. The linked guides show each capability in isolation and how the same action interface carries through Python, TypeScript, and C++.\n\nActions\n\nGive a handler named inputs and outputs, then run it in the current process or register it for remote calls. Existing loops, branches, and concurrent tasks remain ordinary application code.\n\nLocal-to-remote guide\nLLM integration\n\nSend conversation turns, read model text as it arrives, retain updated interactions, and derive model tools from existing action schemas.\n\nLLM interaction guide\nStreaming\n\nUse separate ordered streams for tokens, audio frames, records, progress, and final results. Several inputs and outputs can remain active during one call.\n\nStreaming guide\nMedia types\n\nDeclare text, JSON, audio, images, and binary values independently so callers know how to decode and present each result.\n\nGenerative media guide\nLifecycles\n\nObserve when every output is complete, propagate structured errors, set deadlines, and cancel work across nested or remote calls.\n\nAction lifecycle guide\nRemote calls\n\nKeep the same inputs and outputs when moving a handler to a service, GPU host, browser, or another connected process.\n\nRemote action guide\nStorage\n\nKeep temporary streams in memory, retain local data with SQLite, share streams through Redis, or provide another storage implementation.\n\nStorage API and examples\nmemory → sqlite → redis\n\nFlow\n\nUse Flow when a composition is supplied at runtime or needs validation before execution. Keep fixed application logic in ordinary code.\n\nFlow language guide\nFlow is A11’s declarative language for connecting existing actions while an application is running. A person or an AI model can supply a plan as data; A11 checks its syntax, types, inputs, outputs, and permissions before any work starts.\n\n```\nflow research {\n  in  question: string required \"What should the research answer?\"\n  out answer:   string stream   \"A sourced answer, emitted as it is written.\"\n\n  # Calls start eagerly; data supplies ordering.\n  search = run web-search(query: question, limit: 3)\n  brief = run summarize(question: question)\n\n  nodes fetched {\n    for hit in search.hits parallel 3 {\n      page = run web-fetch(url: hit.url)\n      page.text -> brief.pages\n    }\n  }\n\n  brief.summary -> answer\n}\n```\n\nA11 links application code, AI services, and user experiences through clear streaming interfaces. Adopt it incrementally and keep control of how your system is structured.", "url": "https://wpnews.pro/news/show-hn-a11-typed-streams-and-reusable-actions-for-agentic-applications", "canonical_source": "https://a11.to", "published_at": "2026-09-11 12:59:54+00:00", "updated_at": "2026-09-11 13:11:07.338473+00:00", "lang": "en", "topics": ["ai-agents", "ai-tools", "developer-tools", "ai-infrastructure", "ai-products"], "entities": ["A11", "LangGraph", "Hermes", "MCP", "gRPC", "Python", "TypeScript", "C++"], "alternates": {"html": "https://wpnews.pro/news/show-hn-a11-typed-streams-and-reusable-actions-for-agentic-applications", "markdown": "https://wpnews.pro/news/show-hn-a11-typed-streams-and-reusable-actions-for-agentic-applications.md", "text": "https://wpnews.pro/news/show-hn-a11-typed-streams-and-reusable-actions-for-agentic-applications.txt", "jsonld": "https://wpnews.pro/news/show-hn-a11-typed-streams-and-reusable-actions-for-agentic-applications.jsonld"}}