Repository files navigation

JetBrains team project

Action Engine

Action Engine is a cross-language toolkit for building interactive applications that need streaming, multimodal, interactive capabilities. Think of:

  • GenAI prototypes and fully served applications that need different media modalities and interactivity—image generation and editing, speech to text, etc.
  • LLM agents that can interact with users and tools
  • Native applications that need to interact with LLMs or just combine API calls asynchronously in a flexible way

The core library is written in C++, and there are bindings for Python with almost complete feature coverage. A TypeScript library is also available for building UIs that interact with the core library.

Quickstart in Python

If there is a wheel already built for your platform, you can install Action Engine from PyPI (note that the package is still under development, so the API is not stable yet):

pip install action-engine
python -c 'import actionengine; print(actionengine.to_chunk("Hello, world!"))'

Otherwise, you can install Action Engine directly from the GitHub repository. First, make sure you have a recent C++20-compatible clang installed, then run:

pip install git+https://github.com/JetBrains/actionengine -v
python -c 'import actionengine; print(actionengine.to_chunk("Hello, world!"))'

You can then explore the examples in the examples folder, such as 007-python-generative-media, which showcases how to build generative media applications with LLMs and text-to-image models.

Action Engine requires Python 3.11 or higher.

Features

  • Flexible unopinionated architecture based on two core concepts:
    • async nodes, which are not more and not less than asynchronous data channels, with a bring-your-own storage system in mind,
    • actions, which are computations that transform data from input nodes to output nodes—and can produce side effects. This makes it easy to build complex data flows and interactions.
  • Agnostic to wire formats and connection contexts: The core library does not care about how data is serialized or transmitted. This makes it easy to integrate with different transport layers, such as WebSockets, gRPC, or custom protocols.
    • WebSockets and WebRTC WireStreams are supported out of the box.
    • msgpack serialisation is implemented by default, with Protobuf definitions available for Action Engine data structures, and customisation points for application-specific data types.
  • Streaming-first: Everything is designed to be streamed, from LLM outputs to images and audio. This enables low-latency, interactive applications.
  • Multimodal and extensible: Supports text, images, audio, and can be easily extended to support other modalities. No architecture components are mandatory; you can pick and choose what you need, combining and extending as you see fit.
  • Cross-language: Core library in C++ with bindings for Python and a TypeScript UI-centered library. Enables building applications in different environments: server backends, native apps, web UIs, peer-to-peer apps, etc.

Architecture diagram

Getting started

Core library and Python bindings

This library is under development, so the API is not stable yet, hence no packages to install from PyPI or similar. To get started, clone this repo and follow these steps:

  1. Make sure you have CMake (version 3.22 or higher), clang with C++20 support, and ninja-build installed on your system.

  2. Create and activate a Python virtual environment (optional but highly recommended).

  3. Compile and install the PyBind11 bindings and the Python package:

    ./scripts/configure.sh
    ./scripts/build_python.sh
  4. At this point, you should have an editable installation of the Python package actionengine in your virtual environment. This command should work:

    python -c "import actionengine; print('Action Engine imports successfully!')"

Run a trivial C++ example

All examples are in the examples folder and can be built with CMake. For instance, to build and run the 000-actions example:

cd build
cmake --build . --target 000-actions
chmod +x examples/000-actions/000-actions
./examples/000-actions/000-actions

Use the TypeScript library

The TypeScript library lives under the js folder. To get started, follow these steps:

  1. Make sure you have Node.js (version 23 or higher) and npm installed on your system.

  2. Build the bundle:

    cd js
    npm install
    npm run build:bundle
  3. Link the package for local development:

    npm link # (or yarn link if you use yarn, for example)
  4. Now you can use the package in your TypeScript projects by linking it:

    npm link actionengine # (or yarn link actionengine)

Examples that use the TypeScript library to build UIs will be added soon.

Demos and examples

At examples/007-python-generative-media, there is backend code for several demo applications that showcase the capabilities of Action Engine. TBD: insert images for text to image, deep research and stateful LLM conversations.

About

API and UI SDK for sleek applications with agentic, generative, streaming capabilities

Topics

Resources

Code of conduct

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

JetBrains team project

Action Engine

Action Engine is a cross-language toolkit for building interactive applications that need streaming, multimodal, interactive capabilities. Think of:

  • GenAI prototypes and fully served applications that need different media modalities and interactivity—image generation and editing, speech to text, etc.
  • LLM agents that can interact with users and tools
  • Native applications that need to interact with LLMs or just combine API calls asynchronously in a flexible way

The core library is written in C++, and there are bindings for Python with almost complete feature coverage. A TypeScript library is also available for building UIs that interact with the core library.

Quickstart in Python

If there is a wheel already built for your platform, you can install Action Engine from PyPI (note that the package is still under development, so the API is not stable yet):

pip install action-engine
python -c 'import actionengine; print(actionengine.to_chunk("Hello, world!"))'

Otherwise, you can install Action Engine directly from the GitHub repository. First, make sure you have a recent C++20-compatible clang installed, then run:

pip install git+https://github.com/JetBrains/actionengine -v
python -c 'import actionengine; print(actionengine.to_chunk("Hello, world!"))'

You can then explore the examples in the examples folder, such as 007-python-generative-media, which showcases how to build generative media applications with LLMs and text-to-image models.

Action Engine requires Python 3.11 or higher.

Features

  • Flexible unopinionated architecture based on two core concepts:
    • async nodes, which are not more and not less than asynchronous data channels, with a bring-your-own storage system in mind,
    • actions, which are computations that transform data from input nodes to output nodes—and can produce side effects. This makes it easy to build complex data flows and interactions.
  • Agnostic to wire formats and connection contexts: The core library does not care about how data is serialized or transmitted. This makes it easy to integrate with different transport layers, such as WebSockets, gRPC, or custom protocols.
    • WebSockets and WebRTC WireStreams are supported out of the box.
    • msgpack serialisation is implemented by default, with Protobuf definitions available for Action Engine data structures, and customisation points for application-specific data types.
  • Streaming-first: Everything is designed to be streamed, from LLM outputs to images and audio. This enables low-latency, interactive applications.
  • Multimodal and extensible: Supports text, images, audio, and can be easily extended to support other modalities. No architecture components are mandatory; you can pick and choose what you need, combining and extending as you see fit.
  • Cross-language: Core library in C++ with bindings for Python and a TypeScript UI-centered library. Enables building applications in different environments: server backends, native apps, web UIs, peer-to-peer apps, etc.

Architecture diagram

Getting started

Core library and Python bindings

This library is under development, so the API is not stable yet, hence no packages to install from PyPI or similar. To get started, clone this repo and follow these steps:

  1. Make sure you have CMake (version 3.22 or higher), clang with C++20 support, and ninja-build installed on your system.

  2. Create and activate a Python virtual environment (optional but highly recommended).

  3. Compile and install the PyBind11 bindings and the Python package:

    ./scripts/configure.sh
    ./scripts/build_python.sh
  4. At this point, you should have an editable installation of the Python package actionengine in your virtual environment. This command should work:

    python -c "import actionengine; print('Action Engine imports successfully!')"

Run a trivial C++ example

All examples are in the examples folder and can be built with CMake. For instance, to build and run the 000-actions example:

cd build
cmake --build . --target 000-actions
chmod +x examples/000-actions/000-actions
./examples/000-actions/000-actions

Use the TypeScript library

The TypeScript library lives under the js folder. To get started, follow these steps:

  1. Make sure you have Node.js (version 23 or higher) and npm installed on your system.

  2. Build the bundle:

    cd js
    npm install
    npm run build:bundle
  3. Link the package for local development:

    npm link # (or yarn link if you use yarn, for example)
  4. Now you can use the package in your TypeScript projects by linking it:

    npm link actionengine # (or yarn link actionengine)

Examples that use the TypeScript library to build UIs will be added soon.

Demos and examples

At examples/007-python-generative-media, there is backend code for several demo applications that showcase the capabilities of Action Engine. TBD: insert images for text to image, deep research and stateful LLM conversations.

About

API and UI SDK for sleek applications with agentic, generative, streaming capabilities

Topics

Resources

Code of conduct

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

JetBrains team project

Action Engine

Action Engine is a cross-language toolkit for building interactive applications that need streaming, multimodal, interactive capabilities. Think of:

  • GenAI prototypes and fully served applications that need different media modalities and interactivity—image generation and editing, speech to text, etc.
  • LLM agents that can interact with users and tools
  • Native applications that need to interact with LLMs or just combine API calls asynchronously in a flexible way

The core library is written in C++, and there are bindings for Python with almost complete feature coverage. A TypeScript library is also available for building UIs that interact with the core library.

Quickstart in Python

If there is a wheel already built for your platform, you can install Action Engine from PyPI (note that the package is still under development, so the API is not stable yet):

pip install action-engine
python -c 'import actionengine; print(actionengine.to_chunk("Hello, world!"))'

Otherwise, you can install Action Engine directly from the GitHub repository. First, make sure you have a recent C++20-compatible clang installed, then run:

pip install git+https://github.com/JetBrains/actionengine -v
python -c 'import actionengine; print(actionengine.to_chunk("Hello, world!"))'

You can then explore the examples in the examples folder, such as 007-python-generative-media, which showcases how to build generative media applications with LLMs and text-to-image models.

Action Engine requires Python 3.11 or higher.

Features

  • Flexible unopinionated architecture based on two core concepts:
    • async nodes, which are not more and not less than asynchronous data channels, with a bring-your-own storage system in mind,
    • actions, which are computations that transform data from input nodes to output nodes—and can produce side effects. This makes it easy to build complex data flows and interactions.
  • Agnostic to wire formats and connection contexts: The core library does not care about how data is serialized or transmitted. This makes it easy to integrate with different transport layers, such as WebSockets, gRPC, or custom protocols.
    • WebSockets and WebRTC WireStreams are supported out of the box.
    • msgpack serialisation is implemented by default, with Protobuf definitions available for Action Engine data structures, and customisation points for application-specific data types.
  • Streaming-first: Everything is designed to be streamed, from LLM outputs to images and audio. This enables low-latency, interactive applications.
  • Multimodal and extensible: Supports text, images, audio, and can be easily extended to support other modalities. No architecture components are mandatory; you can pick and choose what you need, combining and extending as you see fit.
  • Cross-language: Core library in C++ with bindings for Python and a TypeScript UI-centered library. Enables building applications in different environments: server backends, native apps, web UIs, peer-to-peer apps, etc.

Architecture diagram

Getting started

Core library and Python bindings

This library is under development, so the API is not stable yet, hence no packages to install from PyPI or similar. To get started, clone this repo and follow these steps:

  1. Make sure you have CMake (version 3.22 or higher), clang with C++20 support, and ninja-build installed on your system.

  2. Create and activate a Python virtual environment (optional but highly recommended).

  3. Compile and install the PyBind11 bindings and the Python package:

    ./scripts/configure.sh
    ./scripts/build_python.sh
  4. At this point, you should have an editable installation of the Python package actionengine in your virtual environment. This command should work:

    python -c "import actionengine; print('Action Engine imports successfully!')"

Run a trivial C++ example

All examples are in the examples folder and can be built with CMake. For instance, to build and run the 000-actions example:

cd build
cmake --build . --target 000-actions
chmod +x examples/000-actions/000-actions
./examples/000-actions/000-actions

Use the TypeScript library

The TypeScript library lives under the js folder. To get started, follow these steps:

  1. Make sure you have Node.js (version 23 or higher) and npm installed on your system.

  2. Build the bundle:

    cd js
    npm install
    npm run build:bundle
  3. Link the package for local development:

    npm link # (or yarn link if you use yarn, for example)
  4. Now you can use the package in your TypeScript projects by linking it:

    npm link actionengine # (or yarn link actionengine)

Examples that use the TypeScript library to build UIs will be added soon.

Demos and examples

At examples/007-python-generative-media, there is backend code for several demo applications that showcase the capabilities of Action Engine. TBD: insert images for text to image, deep research and stateful LLM conversations.

About

API and UI SDK for sleek applications with agentic, generative, streaming capabilities

Topics

Resources

Code of conduct

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

JetBrains team project

Action Engine

Action Engine is a cross-language toolkit for building interactive applications that need streaming, multimodal, interactive capabilities. Think of:

  • GenAI prototypes and fully served applications that need different media modalities and interactivity—image generation and editing, speech to text, etc.
  • LLM agents that can interact with users and tools
  • Native applications that need to interact with LLMs or just combine API calls asynchronously in a flexible way

The core library is written in C++, and there are bindings for Python with almost complete feature coverage. A TypeScript library is also available for building UIs that interact with the core library.

Quickstart in Python

If there is a wheel already built for your platform, you can install Action Engine from PyPI (note that the package is still under development, so the API is not stable yet):

pip install action-engine
python -c 'import actionengine; print(actionengine.to_chunk("Hello, world!"))'

Otherwise, you can install Action Engine directly from the GitHub repository. First, make sure you have a recent C++20-compatible clang installed, then run:

pip install git+https://github.com/JetBrains/actionengine -v
python -c 'import actionengine; print(actionengine.to_chunk("Hello, world!"))'

You can then explore the examples in the examples folder, such as 007-python-generative-media, which showcases how to build generative media applications with LLMs and text-to-image models.

Action Engine requires Python 3.11 or higher.

Features

  • Flexible unopinionated architecture based on two core concepts:
    • async nodes, which are not more and not less than asynchronous data channels, with a bring-your-own storage system in mind,
    • actions, which are computations that transform data from input nodes to output nodes—and can produce side effects. This makes it easy to build complex data flows and interactions.
  • Agnostic to wire formats and connection contexts: The core library does not care about how data is serialized or transmitted. This makes it easy to integrate with different transport layers, such as WebSockets, gRPC, or custom protocols.
    • WebSockets and WebRTC WireStreams are supported out of the box.
    • msgpack serialisation is implemented by default, with Protobuf definitions available for Action Engine data structures, and customisation points for application-specific data types.
  • Streaming-first: Everything is designed to be streamed, from LLM outputs to images and audio. This enables low-latency, interactive applications.
  • Multimodal and extensible: Supports text, images, audio, and can be easily extended to support other modalities. No architecture components are mandatory; you can pick and choose what you need, combining and extending as you see fit.
  • Cross-language: Core library in C++ with bindings for Python and a TypeScript UI-centered library. Enables building applications in different environments: server backends, native apps, web UIs, peer-to-peer apps, etc.

Architecture diagram

Getting started

Core library and Python bindings

This library is under development, so the API is not stable yet, hence no packages to install from PyPI or similar. To get started, clone this repo and follow these steps:

  1. Make sure you have CMake (version 3.22 or higher), clang with C++20 support, and ninja-build installed on your system.

  2. Create and activate a Python virtual environment (optional but highly recommended).

  3. Compile and install the PyBind11 bindings and the Python package:

    ./scripts/configure.sh
    ./scripts/build_python.sh
  4. At this point, you should have an editable installation of the Python package actionengine in your virtual environment. This command should work:

    python -c "import actionengine; print('Action Engine imports successfully!')"

Run a trivial C++ example

All examples are in the examples folder and can be built with CMake. For instance, to build and run the 000-actions example:

cd build
cmake --build . --target 000-actions
chmod +x examples/000-actions/000-actions
./examples/000-actions/000-actions

Use the TypeScript library

The TypeScript library lives under the js folder. To get started, follow these steps:

  1. Make sure you have Node.js (version 23 or higher) and npm installed on your system.

  2. Build the bundle:

    cd js
    npm install
    npm run build:bundle
  3. Link the package for local development:

    npm link # (or yarn link if you use yarn, for example)
  4. Now you can use the package in your TypeScript projects by linking it:

    npm link actionengine # (or yarn link actionengine)

Examples that use the TypeScript library to build UIs will be added soon.

Demos and examples

At examples/007-python-generative-media, there is backend code for several demo applications that showcase the capabilities of Action Engine. TBD: insert images for text to image, deep research and stateful LLM conversations.

About

API and UI SDK for sleek applications with agentic, generative, streaming capabilities

Topics

Resources

Code of conduct

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

JetBrains team project

Action Engine

Action Engine is a cross-language toolkit for building interactive applications that need streaming, multimodal, interactive capabilities. Think of:

  • GenAI prototypes and fully served applications that need different media modalities and interactivity—image generation and editing, speech to text, etc.
  • LLM agents that can interact with users and tools
  • Native applications that need to interact with LLMs or just combine API calls asynchronously in a flexible way

The core library is written in C++, and there are bindings for Python with almost complete feature coverage. A TypeScript library is also available for building UIs that interact with the core library.

Quickstart in Python

If there is a wheel already built for your platform, you can install Action Engine from PyPI (note that the package is still under development, so the API is not stable yet):

pip install action-engine
python -c 'import actionengine; print(actionengine.to_chunk("Hello, world!"))'

Otherwise, you can install Action Engine directly from the GitHub repository. First, make sure you have a recent C++20-compatible clang installed, then run:

pip install git+https://github.com/JetBrains/actionengine -v
python -c 'import actionengine; print(actionengine.to_chunk("Hello, world!"))'

You can then explore the examples in the examples folder, such as 007-python-generative-media, which showcases how to build generative media applications with LLMs and text-to-image models.

Action Engine requires Python 3.11 or higher.

Features

  • Flexible unopinionated architecture based on two core concepts:
    • async nodes, which are not more and not less than asynchronous data channels, with a bring-your-own storage system in mind,
    • actions, which are computations that transform data from input nodes to output nodes—and can produce side effects. This makes it easy to build complex data flows and interactions.
  • Agnostic to wire formats and connection contexts: The core library does not care about how data is serialized or transmitted. This makes it easy to integrate with different transport layers, such as WebSockets, gRPC, or custom protocols.
    • WebSockets and WebRTC WireStreams are supported out of the box.
    • msgpack serialisation is implemented by default, with Protobuf definitions available for Action Engine data structures, and customisation points for application-specific data types.
  • Streaming-first: Everything is designed to be streamed, from LLM outputs to images and audio. This enables low-latency, interactive applications.
  • Multimodal and extensible: Supports text, images, audio, and can be easily extended to support other modalities. No architecture components are mandatory; you can pick and choose what you need, combining and extending as you see fit.
  • Cross-language: Core library in C++ with bindings for Python and a TypeScript UI-centered library. Enables building applications in different environments: server backends, native apps, web UIs, peer-to-peer apps, etc.

Architecture diagram

Getting started

Core library and Python bindings

This library is under development, so the API is not stable yet, hence no packages to install from PyPI or similar. To get started, clone this repo and follow these steps:

  1. Make sure you have CMake (version 3.22 or higher), clang with C++20 support, and ninja-build installed on your system.

  2. Create and activate a Python virtual environment (optional but highly recommended).

  3. Compile and install the PyBind11 bindings and the Python package:

    ./scripts/configure.sh
    ./scripts/build_python.sh
  4. At this point, you should have an editable installation of the Python package actionengine in your virtual environment. This command should work:

    python -c "import actionengine; print('Action Engine imports successfully!')"

Run a trivial C++ example

All examples are in the examples folder and can be built with CMake. For instance, to build and run the 000-actions example:

cd build
cmake --build . --target 000-actions
chmod +x examples/000-actions/000-actions
./examples/000-actions/000-actions

Use the TypeScript library

The TypeScript library lives under the js folder. To get started, follow these steps:

  1. Make sure you have Node.js (version 23 or higher) and npm installed on your system.

  2. Build the bundle:

    cd js
    npm install
    npm run build:bundle
  3. Link the package for local development:

    npm link # (or yarn link if you use yarn, for example)
  4. Now you can use the package in your TypeScript projects by linking it:

    npm link actionengine # (or yarn link actionengine)

Examples that use the TypeScript library to build UIs will be added soon.

Demos and examples

At examples/007-python-generative-media, there is backend code for several demo applications that showcase the capabilities of Action Engine. TBD: insert images for text to image, deep research and stateful LLM conversations.

About

API and UI SDK for sleek applications with agentic, generative, streaming capabilities

Topics

Resources

Code of conduct

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

JetBrains team project

Action Engine

Action Engine is a cross-language toolkit for building interactive applications that need streaming, multimodal, interactive capabilities. Think of:

  • GenAI prototypes and fully served applications that need different media modalities and interactivity—image generation and editing, speech to text, etc.
  • LLM agents that can interact with users and tools
  • Native applications that need to interact with LLMs or just combine API calls asynchronously in a flexible way

The core library is written in C++, and there are bindings for Python with almost complete feature coverage. A TypeScript library is also available for building UIs that interact with the core library.

Quickstart in Python

If there is a wheel already built for your platform, you can install Action Engine from PyPI (note that the package is still under development, so the API is not stable yet):

pip install action-engine
python -c 'import actionengine; print(actionengine.to_chunk("Hello, world!"))'

Otherwise, you can install Action Engine directly from the GitHub repository. First, make sure you have a recent C++20-compatible clang installed, then run:

pip install git+https://github.com/JetBrains/actionengine -v
python -c 'import actionengine; print(actionengine.to_chunk("Hello, world!"))'

You can then explore the examples in the examples folder, such as 007-python-generative-media, which showcases how to build generative media applications with LLMs and text-to-image models.

Action Engine requires Python 3.11 or higher.

Features

  • Flexible unopinionated architecture based on two core concepts:
    • async nodes, which are not more and not less than asynchronous data channels, with a bring-your-own storage system in mind,
    • actions, which are computations that transform data from input nodes to output nodes—and can produce side effects. This makes it easy to build complex data flows and interactions.
  • Agnostic to wire formats and connection contexts: The core library does not care about how data is serialized or transmitted. This makes it easy to integrate with different transport layers, such as WebSockets, gRPC, or custom protocols.
    • WebSockets and WebRTC WireStreams are supported out of the box.
    • msgpack serialisation is implemented by default, with Protobuf definitions available for Action Engine data structures, and customisation points for application-specific data types.
  • Streaming-first: Everything is designed to be streamed, from LLM outputs to images and audio. This enables low-latency, interactive applications.
  • Multimodal and extensible: Supports text, images, audio, and can be easily extended to support other modalities. No architecture components are mandatory; you can pick and choose what you need, combining and extending as you see fit.
  • Cross-language: Core library in C++ with bindings for Python and a TypeScript UI-centered library. Enables building applications in different environments: server backends, native apps, web UIs, peer-to-peer apps, etc.

Architecture diagram

Getting started

Core library and Python bindings

This library is under development, so the API is not stable yet, hence no packages to install from PyPI or similar. To get started, clone this repo and follow these steps:

  1. Make sure you have CMake (version 3.22 or higher), clang with C++20 support, and ninja-build installed on your system.

  2. Create and activate a Python virtual environment (optional but highly recommended).

  3. Compile and install the PyBind11 bindings and the Python package:

    ./scripts/configure.sh
    ./scripts/build_python.sh
  4. At this point, you should have an editable installation of the Python package actionengine in your virtual environment. This command should work:

    python -c "import actionengine; print('Action Engine imports successfully!')"

Run a trivial C++ example

All examples are in the examples folder and can be built with CMake. For instance, to build and run the 000-actions example:

cd build
cmake --build . --target 000-actions
chmod +x examples/000-actions/000-actions
./examples/000-actions/000-actions

Use the TypeScript library

The TypeScript library lives under the js folder. To get started, follow these steps:

  1. Make sure you have Node.js (version 23 or higher) and npm installed on your system.

  2. Build the bundle:

    cd js
    npm install
    npm run build:bundle
  3. Link the package for local development:

    npm link # (or yarn link if you use yarn, for example)
  4. Now you can use the package in your TypeScript projects by linking it:

    npm link actionengine # (or yarn link actionengine)

Examples that use the TypeScript library to build UIs will be added soon.

Demos and examples

At examples/007-python-generative-media, there is backend code for several demo applications that showcase the capabilities of Action Engine. TBD: insert images for text to image, deep research and stateful LLM conversations.

About

API and UI SDK for sleek applications with agentic, generative, streaming capabilities

Topics

Resources

Code of conduct

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

JetBrains team project

Action Engine

Action Engine is a cross-language toolkit for building interactive applications that need streaming, multimodal, interactive capabilities. Think of:

  • GenAI prototypes and fully served applications that need different media modalities and interactivity—image generation and editing, speech to text, etc.
  • LLM agents that can interact with users and tools
  • Native applications that need to interact with LLMs or just combine API calls asynchronously in a flexible way

The core library is written in C++, and there are bindings for Python with almost complete feature coverage. A TypeScript library is also available for building UIs that interact with the core library.

Quickstart in Python

If there is a wheel already built for your platform, you can install Action Engine from PyPI (note that the package is still under development, so the API is not stable yet):

pip install action-engine
python -c 'import actionengine; print(actionengine.to_chunk("Hello, world!"))'

Otherwise, you can install Action Engine directly from the GitHub repository. First, make sure you have a recent C++20-compatible clang installed, then run:

pip install git+https://github.com/JetBrains/actionengine -v
python -c 'import actionengine; print(actionengine.to_chunk("Hello, world!"))'

You can then explore the examples in the examples folder, such as 007-python-generative-media, which showcases how to build generative media applications with LLMs and text-to-image models.

Action Engine requires Python 3.11 or higher.

Features

  • Flexible unopinionated architecture based on two core concepts:
    • async nodes, which are not more and not less than asynchronous data channels, with a bring-your-own storage system in mind,
    • actions, which are computations that transform data from input nodes to output nodes—and can produce side effects. This makes it easy to build complex data flows and interactions.
  • Agnostic to wire formats and connection contexts: The core library does not care about how data is serialized or transmitted. This makes it easy to integrate with different transport layers, such as WebSockets, gRPC, or custom protocols.
    • WebSockets and WebRTC WireStreams are supported out of the box.
    • msgpack serialisation is implemented by default, with Protobuf definitions available for Action Engine data structures, and customisation points for application-specific data types.
  • Streaming-first: Everything is designed to be streamed, from LLM outputs to images and audio. This enables low-latency, interactive applications.
  • Multimodal and extensible: Supports text, images, audio, and can be easily extended to support other modalities. No architecture components are mandatory; you can pick and choose what you need, combining and extending as you see fit.
  • Cross-language: Core library in C++ with bindings for Python and a TypeScript UI-centered library. Enables building applications in different environments: server backends, native apps, web UIs, peer-to-peer apps, etc.

Architecture diagram

Getting started

Core library and Python bindings

This library is under development, so the API is not stable yet, hence no packages to install from PyPI or similar. To get started, clone this repo and follow these steps:

  1. Make sure you have CMake (version 3.22 or higher), clang with C++20 support, and ninja-build installed on your system.

  2. Create and activate a Python virtual environment (optional but highly recommended).

  3. Compile and install the PyBind11 bindings and the Python package:

    ./scripts/configure.sh
    ./scripts/build_python.sh
  4. At this point, you should have an editable installation of the Python package actionengine in your virtual environment. This command should work:

    python -c "import actionengine; print('Action Engine imports successfully!')"

Run a trivial C++ example

All examples are in the examples folder and can be built with CMake. For instance, to build and run the 000-actions example:

cd build
cmake --build . --target 000-actions
chmod +x examples/000-actions/000-actions
./examples/000-actions/000-actions

Use the TypeScript library

The TypeScript library lives under the js folder. To get started, follow these steps:

  1. Make sure you have Node.js (version 23 or higher) and npm installed on your system.

  2. Build the bundle:

    cd js
    npm install
    npm run build:bundle
  3. Link the package for local development:

    npm link # (or yarn link if you use yarn, for example)
  4. Now you can use the package in your TypeScript projects by linking it:

    npm link actionengine # (or yarn link actionengine)

Examples that use the TypeScript library to build UIs will be added soon.

Demos and examples

At examples/007-python-generative-media, there is backend code for several demo applications that showcase the capabilities of Action Engine. TBD: insert images for text to image, deep research and stateful LLM conversations.

About

API and UI SDK for sleek applications with agentic, generative, streaming capabilities

Topics

Resources

Code of conduct

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

JetBrains team project

Action Engine

Action Engine is a cross-language toolkit for building interactive applications that need streaming, multimodal, interactive capabilities. Think of:

  • GenAI prototypes and fully served applications that need different media modalities and interactivity—image generation and editing, speech to text, etc.
  • LLM agents that can interact with users and tools
  • Native applications that need to interact with LLMs or just combine API calls asynchronously in a flexible way

The core library is written in C++, and there are bindings for Python with almost complete feature coverage. A TypeScript library is also available for building UIs that interact with the core library.

Quickstart in Python

If there is a wheel already built for your platform, you can install Action Engine from PyPI (note that the package is still under development, so the API is not stable yet):

pip install action-engine
python -c 'import actionengine; print(actionengine.to_chunk("Hello, world!"))'

Otherwise, you can install Action Engine directly from the GitHub repository. First, make sure you have a recent C++20-compatible clang installed, then run:

pip install git+https://github.com/JetBrains/actionengine -v
python -c 'import actionengine; print(actionengine.to_chunk("Hello, world!"))'

You can then explore the examples in the examples folder, such as 007-python-generative-media, which showcases how to build generative media applications with LLMs and text-to-image models.

Action Engine requires Python 3.11 or higher.

Features

  • Flexible unopinionated architecture based on two core concepts:
    • async nodes, which are not more and not less than asynchronous data channels, with a bring-your-own storage system in mind,
    • actions, which are computations that transform data from input nodes to output nodes—and can produce side effects. This makes it easy to build complex data flows and interactions.
  • Agnostic to wire formats and connection contexts: The core library does not care about how data is serialized or transmitted. This makes it easy to integrate with different transport layers, such as WebSockets, gRPC, or custom protocols.
    • WebSockets and WebRTC WireStreams are supported out of the box.
    • msgpack serialisation is implemented by default, with Protobuf definitions available for Action Engine data structures, and customisation points for application-specific data types.
  • Streaming-first: Everything is designed to be streamed, from LLM outputs to images and audio. This enables low-latency, interactive applications.
  • Multimodal and extensible: Supports text, images, audio, and can be easily extended to support other modalities. No architecture components are mandatory; you can pick and choose what you need, combining and extending as you see fit.
  • Cross-language: Core library in C++ with bindings for Python and a TypeScript UI-centered library. Enables building applications in different environments: server backends, native apps, web UIs, peer-to-peer apps, etc.

Architecture diagram

Getting started

Core library and Python bindings

This library is under development, so the API is not stable yet, hence no packages to install from PyPI or similar. To get started, clone this repo and follow these steps:

  1. Make sure you have CMake (version 3.22 or higher), clang with C++20 support, and ninja-build installed on your system.

  2. Create and activate a Python virtual environment (optional but highly recommended).

  3. Compile and install the PyBind11 bindings and the Python package:

    ./scripts/configure.sh
    ./scripts/build_python.sh
  4. At this point, you should have an editable installation of the Python package actionengine in your virtual environment. This command should work:

    python -c "import actionengine; print('Action Engine imports successfully!')"

Run a trivial C++ example

All examples are in the examples folder and can be built with CMake. For instance, to build and run the 000-actions example:

cd build
cmake --build . --target 000-actions
chmod +x examples/000-actions/000-actions
./examples/000-actions/000-actions

Use the TypeScript library

The TypeScript library lives under the js folder. To get started, follow these steps:

  1. Make sure you have Node.js (version 23 or higher) and npm installed on your system.

  2. Build the bundle:

    cd js
    npm install
    npm run build:bundle
  3. Link the package for local development:

    npm link # (or yarn link if you use yarn, for example)
  4. Now you can use the package in your TypeScript projects by linking it:

    npm link actionengine # (or yarn link actionengine)

Examples that use the TypeScript library to build UIs will be added soon.

Demos and examples

At examples/007-python-generative-media, there is backend code for several demo applications that showcase the capabilities of Action Engine. TBD: insert images for text to image, deep research and stateful LLM conversations.

About

API and UI SDK for sleek applications with agentic, generative, streaming capabilities

Topics

Resources

Code of conduct

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages