<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Helena Pankov</title>
    <description>The latest articles on DEV Community by Helena Pankov (@helenapankov).</description>
    <link>https://dev.to/helenapankov</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3583719%2F42c5c72f-3b9d-47a4-8fd2-abeaf6c02781.jpeg</url>
      <title>DEV Community: Helena Pankov</title>
      <link>https://dev.to/helenapankov</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/helenapankov"/>
    <language>en</language>
    <item>
      <title>A truly flexible API and agent builder's kit, with smooth devX for streaming, multimodality and integrations</title>
      <dc:creator>Helena Pankov</dc:creator>
      <pubDate>Mon, 27 Oct 2025 15:54:41 +0000</pubDate>
      <link>https://dev.to/helenapankov/an-adaptable-toolkit-to-build-apis-and-agents-with-friendly-interfaces-for-streaming-1bn1</link>
      <guid>https://dev.to/helenapankov/an-adaptable-toolkit-to-build-apis-and-agents-with-friendly-interfaces-for-streaming-1bn1</guid>
      <description>&lt;p&gt;Hi everyone! &lt;/p&gt;

&lt;p&gt;I have been working on a toolkit/framework to build APIs and agents easily, in a way friendly to developers that does not hide complexity behind abstractions, but also be is in step with modern requirements and capabilities: stateful, async execution, streaming, multimodality, persistence, etc.&lt;/p&gt;

&lt;p&gt;I thought sharing would be a perfect opportunity to get feedback, and also that the library itself is genuinely useful, so feedback is very welcome! Quick link: &lt;a href="https://actionengine.dev/" rel="noopener noreferrer"&gt;https://actionengine.dev/&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why another framework?
&lt;/h2&gt;

&lt;p&gt;I don't really like the word, but it's hard to find anything better and still have people understand what the project is about. The problem of &lt;em&gt;“agentic frameworks”&lt;/em&gt; is that they give excessively rigid abstractions. The novel challenge is not to define “agents”. They are just chains of calls in some distributed context. &lt;/p&gt;

&lt;p&gt;The actual novel challenge is to &lt;em&gt;cultivate a common language&lt;/em&gt; to express highly dynamic, highly experimental interactions performantly (and safely!) in very different kinds of applications and environments—and &lt;em&gt;build tools&lt;/em&gt; to do so. In other words, the challenge is to acknowledge and enable the diversity of applications and contexts code runs from.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That means that the framework itself should allow experimentation and adapt to applications, not have applications adapt to it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I work at Google DeepMind (hence releasing Action Engine under the org), and the intention for me, co-authors and internal supporters is to validate some shifts we think the agent landscape is experiencing, and have a quick-feedback way to navigate that, including checking very non-mainstream approaches. Some examples for me are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;developers don't seem to really need &lt;em&gt;“loop runner”&lt;/em&gt; type frameworks with tight abstractions, but rather a set of thin layers they can combine to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;relieve “daily”, “boring” issues (e.g. serialisation of custom types, chaining tasks),&lt;/li&gt;
&lt;li&gt;have consistent, similar ways to store and transmit state and express agentic behaviour across backend peers, browser clients, model servers etc. (maybe edge devices even),&lt;/li&gt;
&lt;li&gt;“productionise”: serve, scale, authorise, discover,&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;it is important to design such tools and frameworks at the full stack to enable builders of all types of apps: web/native, client orchestration or a worker group in a cluster, etc.,&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;data representation, storage and transport matter much more than the runtime/execution context.&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;I'm strongly convinced that such a framework should be absolutely flexible to runtimes, and should accommodate different “wire” protocols and different storage backends to be useful for the general public. Therefore interactions with those layers are extensible:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;for “wire” connections, there are websockets and WebRTC (and Stubby internally at Google), and this can be extended,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;for “store”, there is an in-memory implementation and one over Redis streams (also can be extended!)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What the library is, exactly
&lt;/h2&gt;

&lt;p&gt;Action Engine is built as a kit of optional components, for different needs of different applications. That makes it stand out from other frameworks: they lock you in the whole set of abstractions, which you might not need.&lt;/p&gt;

&lt;p&gt;The core concepts are &lt;em&gt;action&lt;/em&gt; and &lt;em&gt;async node&lt;/em&gt;. “Action” is simple: it's just executable code with a name and i/o schema assigned, and some well-defined behaviour to prepare and clean up. Async node is a logical “stream” of data: a channel-like interface that one party (or parties!) can write into, and another can read with a “block with timeout” semantic.&lt;/p&gt;

&lt;p&gt;These core concepts are easy to understand. Unlike with loaded terms like “agent”, “context” or “graph executor”, you won't make any huge mistake thinking about &lt;em&gt;actions&lt;/em&gt; as about &lt;em&gt;functions&lt;/em&gt;, and about &lt;em&gt;async nodes&lt;/em&gt; as about &lt;em&gt;channels&lt;/em&gt; or &lt;em&gt;queues&lt;/em&gt; that go as inputs and outputs to those functions.&lt;/p&gt;

&lt;p&gt;The rest of the library simply cares about building context to run or call actions, and lets you do that yourself—there are implementations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;for particular-backend &lt;em&gt;wire streams&lt;/em&gt;,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;for &lt;em&gt;sessions&lt;/em&gt; that share a data context between action runs,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;for &lt;em&gt;services&lt;/em&gt; that hold multiple sessions and route wire connections into them,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;for &lt;em&gt;servers&lt;/em&gt; that listen to connections / do access control / etc.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;...but it's not a package offering.&lt;/strong&gt; No layer is obligatory, and in your particular project, you may end up having a nicer integration and less complexity than if you used &lt;a href="https://google.github.io/adk-docs/" rel="noopener noreferrer"&gt;ADK&lt;/a&gt;, for example.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Flexibility to integrate any use case, model or API, and flexibility to run in different infrastructure are first-class concerns here, and so is avoiding large cognitive footprint.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Anyway, I'd be grateful for feedback! Have a look, try it out—the project is WIP and the level of documentation is definitely less than needed, but I'll be happy to answer any questions!&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;p&gt;Landing page with a few nice demos: &lt;a href="https://actionengine.dev/" rel="noopener noreferrer"&gt;https://actionengine.dev/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Code examples in Python, TypeScript, C++: &lt;a href="https://github.com/google-deepmind/actionengine/tree/main/examples" rel="noopener noreferrer"&gt;https://github.com/google-deepmind/actionengine/tree/main/examples&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To get an overall grasp, check out the stateful ollama chat sessions example: &lt;a href="https://actionengine.dev/gemini?q=ollama" rel="noopener noreferrer"&gt;demo&lt;/a&gt;, &lt;a href="https://github.com/google-deepmind/actionengine/blob/main/examples/007-python-generative-media/actions/gemini.py" rel="noopener noreferrer"&gt;backend handlers&lt;/a&gt;, &lt;a href="https://github.com/google-deepmind/actionengine/blob/main/examples/007-python-generative-media/server.py" rel="noopener noreferrer"&gt;server&lt;/a&gt;, &lt;a href="https://github.com/google-deepmind/actionengine/blob/main/web/app/gemini/page.tsx" rel="noopener noreferrer"&gt;chat page frontend code&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>ai</category>
      <category>opensource</category>
      <category>resources</category>
    </item>
  </channel>
</rss>
