Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
88 commits
Select commit Hold shift + click to select a range
330d15e
Agentics Bundle V1
Jan 29, 2026
42412f1
Agentics Bundle V1
Jan 29, 2026
994906b
add icon and improve component code
Cristhianzl Jan 30, 2026
a51b11f
[autofix.ci] apply automated fixes
autofix-ci[bot] Jan 30, 2026
0d1bde4
[autofix.ci] apply automated fixes (attempt 2/3)
autofix-ci[bot] Jan 30, 2026
7e89d87
Merge branch 'main' into feature/agentics_bundle_2
Cristhianzl Feb 2, 2026
b60e9d0
[autofix.ci] apply automated fixes
autofix-ci[bot] Feb 2, 2026
ca3f2ed
adjust the agentics icons
Cristhianzl Feb 2, 2026
a3c4e6f
Merge branch 'feature/agentics_bundle_2' of https://github.com/gliozz…
Cristhianzl Feb 2, 2026
62f5561
Semantic Operators
Feb 2, 2026
a9a3dad
code improvements
Cristhianzl Feb 3, 2026
ea81e61
merge fix
Cristhianzl Feb 3, 2026
da6faf4
add icon
Cristhianzl Feb 3, 2026
5387b34
ruff style
Cristhianzl Feb 3, 2026
94f342c
[autofix.ci] apply automated fixes
autofix-ci[bot] Feb 3, 2026
2573486
add tests to agentincs bundle
Cristhianzl Feb 3, 2026
2175a85
Merge branch 'feature/agentics_bundle_2' of https://github.com/gliozz…
Cristhianzl Feb 3, 2026
3c5420d
Implemented Semantic Operators, added documentation, improved existin…
Feb 4, 2026
cbf1bc0
add tests and improve code quality
Cristhianzl Feb 5, 2026
eb14e83
a review of agentics bundle documentation
junkyul Feb 10, 2026
ef7ac21
docs-cleanup-pages
mendonk Feb 11, 2026
dbb83b7
guidance-comments
mendonk Feb 11, 2026
37122bf
Improved bundle documentation for agentics
Feb 12, 2026
92673a9
Syntetic generator bug fix, order of agentics in the bundle
Feb 13, 2026
8410e01
Fixed freezing problem
Feb 14, 2026
66cdea5
List of user defined types allowed in semantic map and semantic aggre…
Feb 15, 2026
51b3d57
Aggregated list on semantic map
Feb 15, 2026
24344f7
modify name and description of the components in a user friendly way
junkyul Feb 17, 2026
57f048e
Revert JSON to version in main
Feb 17, 2026
72ded05
Fix version of agentics-py
Feb 17, 2026
101703f
bring back agentics components in the asset index
junkyul Feb 18, 2026
a9dc5db
display names for input and output are unfied as DataFrame; previousl…
junkyul Feb 18, 2026
28c78fb
update bundle documentation. The display names are updated
junkyul Feb 18, 2026
a3dbeb8
[autofix.ci] apply automated fixes
autofix-ci[bot] Feb 18, 2026
d29ba42
[autofix.ci] apply automated fixes (attempt 2/3)
autofix-ci[bot] Feb 18, 2026
6bae089
Luca's QA feedback addressed
Feb 19, 2026
be27c6f
Removed semantic operator names and used aMap, aReduce and aGenerate
Feb 20, 2026
2f27efa
remove one line mentioning aFilter, which is removed
junkyul Feb 20, 2026
6fa860e
removes blank component component
deon-sanchez Feb 24, 2026
3e6e0d9
updates templates
deon-sanchez Feb 24, 2026
6008a83
Merge origin/main into feature/agentics_bundle_2, resolve conflicts i…
HimavarshaVS Feb 24, 2026
ff4f5bc
Merge remote-tracking branch 'origin' into feature/agentics_bundle_2
HimavarshaVS Feb 25, 2026
e06af76
fix tests
HimavarshaVS Feb 25, 2026
da9cdac
fix tests
HimavarshaVS Feb 25, 2026
8edff85
fix: remove tests for deleted agentics components, update tests for r…
HimavarshaVS Feb 25, 2026
742623e
fix ruff errors
HimavarshaVS Feb 25, 2026
70d271c
Merge branch 'main' into feature/agentics_bundle_2
HimavarshaVS Feb 25, 2026
6d20f59
[autofix.ci] apply automated fixes
autofix-ci[bot] Feb 25, 2026
3549153
Merge remote-tracking branch 'origin' into feature/agentics_bundle_2
HimavarshaVS Feb 26, 2026
1c9a82e
Merge branch 'feature/agentics_bundle_2' of https://github.com/langfl…
HimavarshaVS Feb 26, 2026
964ae14
Merge branch 'feature/agentics_bundle_2' of https://github.com/gliozz…
HimavarshaVS Feb 26, 2026
446b53c
fix: add safe imports to Agentics components with clear error when ag…
HimavarshaVS Feb 26, 2026
7ba9eee
[autofix.ci] apply automated fixes
autofix-ci[bot] Feb 26, 2026
8b42de8
[autofix.ci] apply automated fixes (attempt 2/3)
autofix-ci[bot] Feb 26, 2026
1af635f
fix: add try/except in agentics tests to skip when agentics-py/crewai…
HimavarshaVS Feb 26, 2026
9e9232e
Merge branch 'feature/agentics_bundle_2' of https://github.com/gliozz…
HimavarshaVS Feb 26, 2026
80f7cca
fix: add agentics and crewai to optional deps skip list in test_all_m…
HimavarshaVS Feb 26, 2026
140f29e
chore: update component_index.json
HimavarshaVS Feb 26, 2026
aa89f0a
Merge origin/main into feature/agentics_bundle_2, resolve component_i…
HimavarshaVS Feb 26, 2026
7e99bc8
docs-cleanup
mendonk Feb 26, 2026
f048f03
Merge branch 'feature/agentics_bundle_2' of https://github.com/gliozz…
mendonk Feb 26, 2026
e27f15b
Revert "Merge branch 'feature/agentics_bundle_2' of https://github.co…
mendonk Feb 26, 2026
3251156
[autofix.ci] apply automated fixes
autofix-ci[bot] Feb 26, 2026
75cbfdf
[autofix.ci] apply automated fixes (attempt 2/3)
autofix-ci[bot] Feb 26, 2026
dd7e0b0
fix: add agentics-py to optional deps skip list in test_all_modules_i…
HimavarshaVS Feb 26, 2026
4807902
Merge origin/main into feature/agentics_bundle_2, resolve component_i…
HimavarshaVS Feb 26, 2026
4de42d5
Update component_index.json for agentics bundle
HimavarshaVS Feb 26, 2026
02c958d
[autofix.ci] apply automated fixes
autofix-ci[bot] Feb 26, 2026
ad0dd5a
Merge origin/main into feature/agentics_bundle_2, resolve component_i…
HimavarshaVS Feb 26, 2026
437cf84
Merge branch 'main' into feature/agentics_bundle_2
HimavarshaVS Feb 27, 2026
37f8d6c
Merge branch 'main' into feature/agentics_bundle_2
HimavarshaVS Feb 27, 2026
8c73d35
[autofix.ci] apply automated fixes
autofix-ci[bot] Feb 27, 2026
dfadec5
Merge remote-tracking branch 'origin' into feature/agentics_bundle_2
HimavarshaVS Feb 27, 2026
808a1a0
Merge branch 'main' into feature/agentics_bundle_2
Cristhianzl Feb 27, 2026
30caee3
merge fix
Cristhianzl Feb 27, 2026
84ddd76
[autofix.ci] apply automated fixes
autofix-ci[bot] Feb 27, 2026
a30d4db
Merge branch 'main' into feature/agentics_bundle_2
HimavarshaVS Feb 27, 2026
e204bff
Merge branch 'main' into feature/agentics_bundle_2
HimavarshaVS Feb 27, 2026
1f6603a
Merge branch 'main' into feature/agentics_bundle_2
HimavarshaVS Feb 27, 2026
c9e086d
fix: enhance file upload tests with multiple text inputs and improved…
viktoravelino Feb 27, 2026
1c7a215
Merge remote-tracking branch 'origin/main' into feature/agentics_bund…
HimavarshaVS Feb 27, 2026
5c41883
update component index
HimavarshaVS Feb 27, 2026
a9a76db
Merge branch 'main' into feature/agentics_bundle_2
HimavarshaVS Feb 27, 2026
a6f59d1
[autofix.ci] apply automated fixes
autofix-ci[bot] Feb 27, 2026
87f9014
Merge branch 'feature/agentics_bundle_2' of https://github.com/langfl…
HimavarshaVS Feb 27, 2026
0a796fc
Merge branch 'feature/agentics_bundle_2' of https://github.com/gliozz…
HimavarshaVS Feb 27, 2026
29cc0c5
update component index
HimavarshaVS Feb 27, 2026
072c3c8
Merge remote-tracking branch 'origin/main' into feature/agentics_bund…
HimavarshaVS Feb 27, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
157 changes: 157 additions & 0 deletions docs/docs/Components/bundles-agentics.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
---
title: Agentics
slug: /bundles-agentics
---

import Icon from "@site/src/components/icon";
import PartialParams from '@site/docs/_partial-hidden-params.mdx';

The [Agentics](https://github.com/IBM/agentics/) component bundle uses LLMs to transform tabular data. Add or fill columns row-by-row with the [**aMap** component](#amap-component), collapse many rows into one with [**aReduce** component](#areduce-component), or generate synthetic rows with the [**aGenerate** component](#agenerate-component).

Define the structure of generated data in the components' **Schema** table.
For example:

| Column | Type | Description | Required |
|--------|------|-------------|----------|
| Name | String | The name of the output field | Yes |
| Type | Dropdown | `str`, `int`, `float`, `bool`, or `dict` | Yes |
| Description | String | What this field represents and how it should be generated | No |
| As List | Boolean | If true, field is a list of -componentthe specified type (e.g. list[str]) | No |

All Agentics components return a **DataFrame**.

## Prerequisites

1. Install the Agentics package in Langflow's virtual environment:

```bash
uv pip install agentics-py==0.3.1
```

2. Restart Langflow so the Agentics components are available:

```bash
uv run langflow run
```

3. Agentics components require an LLM. Configure your LLM provider API keys as [global variables](/configuration-global-variables) or environment variables.
Supported providers include OpenAI, Anthropic, Google Generative AI, IBM WatsonX, and Ollama.

## aGenerate component

aGenerate generates synthetic data from a schema or from an example DataFrame. Use it for test data, augmentation, or documentation examples.

For example, this schema definition creates the following DataFrame output:

**Schema definition:**
- `customer_name` (str): Full name
- `email` (str): Email address
- `age` (int): Age between 18–80
- `purchase_categories` (str, As List): List of product categories purchased

**Output DataFrame (example, 10 rows generated):**
| customer_name | email | age | purchase_categories |
|---------------|-------|-----|---------------------|
| Sarah Johnson | sarah.j@email.com | 34 | Electronics, Books, Home & Garden |
| Michael Chen | m.chen@email.com | 28 | Sports, Clothing, Electronics |
| ... | ... | ... | ... |

### Parameters

| Name | Type | Description |
|------|------|-------------|
| Language Model | Dropdown | Select the LLM provider and model. Use guided experience. |
| Input DataFrame | DataFrame | Optional. Example DataFrame to learn from; only first 50 rows used. If not provided, Schema is used. |
| Schema | Table | Define columns to generate when no Input DataFrame is provided. See [Output Schema Format](#output-schema-format). |
| Instructions | String | **Advanced.** Optional instructions for generation. |
| Number of Rows to Generate | Integer | How many synthetic rows to create. Default: 10. |

## aMap component

aMap transforms each row of input data using natural language instructions and a defined output schema (one row in, one row out).
Use **aMap** for enriching data with LLM-generated columns such as sentiment, categories, and entity extraction.

Rows are processed concurrently; default batch size is 10. Token usage scales with number of rows.

For example, **aMap** keeps each input row and fills in `sentiment`, `confidence`, and `key_topics` with the connected LLM.

**Input DataFrame:**
| review_id | text |
|-----------|------|
| 1 | Great product, fast shipping! |
| 2 | Terrible quality, broke after one use |

**Schema definition:**
- `sentiment` (str): "positive", "negative", or "neutral"
- `confidence` (float): Confidence score 0–1
- `key_topics` (str, As List): Main topics mentioned

**Output DataFrame:**
| review_id | text | sentiment | confidence | key_topics |
|-----------|------|-----------|------------|------------|
| 1 | Great product, fast shipping! | positive | 0.95 | product quality, shipping |
| 2 | Terrible quality, broke after one use | negative | 0.92 | quality, durability |

### Parameters

| Name | Type | Description |
|------|------|-------------|
| Language Model | Dropdown | Select the LLM provider and model. Use guided experience. |
| Input DataFrame | DataFrame | Input DataFrame (list of dicts or DataFrame). Each row is processed independently. |
| Schema | Table | Define the structure and types for generated columns. See [Output Schema Format](#output-schema-format). |
| Instructions | String | Natural language instructions for transforming each row into the output schema. |
| As List | Boolean | If true, generate multiple instances of the schema per row and concatenate. |
| Keep Source Columns | Boolean | If `true`, append new columns to original data; if false, return only generated columns. Ignored if As List is true. Default: `true`. |

## aReduce component

aReduce aggregates all rows in the input DataFrame into a single row following the output schema.
Use **aReduce** for summaries, reports, or consolidated insights.
To aggregate rows into a list, set `As List` to `true` in the component.

All rows are sent in one request; token usage can be high for large DataFrames.
Consider filtering or sampling first.

For example, **aReduce** takes all input rows and produces a single row with LLM-generated aggregates.
It sums revenue into `total_revenue`, identifies the best-selling product in `best_selling_product`, and writes a short `summary` of the sales.

**Input DataFrame:**

| date | product | revenue | units |
|------|---------|---------|-------|
| 2024-01-01 | Widget A | 1200 | 50 |
| 2024-01-02 | Widget B | 800 | 30 |
| 2024-01-03 | Widget A | 1500 | 60 |

**Schema definition:**
- `total_revenue` (float): Sum of all revenue
- `best_selling_product` (str): Product with highest units
- `summary` (str): Natural language summary

**Output DataFrame:**
| total_revenue | best_selling_product | summary |
|---------------|---------------------|---------|
| 3500 | Widget A | Over 3 days, Widget A was the best seller with 110 units, generating $2700 in revenue. |

### Parameters

| Name | Type | Description |
|------|------|-------------|
| Language Model | Dropdown | Select the LLM provider and model. |
| Input DataFrame | DataFrame | Input DataFrame (list of dicts or DataFrame). Required. |
| Schema | Table | Define the structure and types for the aggregated output. See [Output Schema Format](#output-schema-format). |
| As List | Boolean | If true, output is a list of instances of the schema. |
| Instructions | String | Optional instructions for aggregation. If omitted, the LLM infers from field descriptions. |

## Performance and troubleshooting

- **Token usage:** aMap scales with rows; aReduce sends all rows in one call; aGenerate scales with instances. Use smaller batches or sample large datasets to reduce cost.
- **Batch size:** Default 10; max 25. Larger batches improve throughput but increase latency per batch.
- **Errors:** If Agentics is not found, run `uv pip install agentics-py==0.3.1` and restart Langflow. For API/key errors, set the provider’s API key as a global variable or env var. For DataFrame errors, ensure input is a list of dicts or use a DataFrame component output.

## See also

- [Agentics official documentation](https://ibm.github.io/Agentics/)
- [Agentics GitHub repository](https://github.com/IBM/agentics/)
- [Transduction is All You Need for Structured Data Workflows](https://arxiv.org/abs/2508.15610)
- [Global variables configuration](/configuration-global-variables)
1 change: 1 addition & 0 deletions docs/sidebars.js
Original file line number Diff line number Diff line change
Expand Up @@ -357,6 +357,7 @@ module.exports = {
label: "Bundles",
items: [
"Components/components-bundles",
"Components/bundles-agentics",
"Components/bundles-aiml",
"Components/bundles-altk",
"Components/bundles-amazon",
Expand Down

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"""Unit tests for Agentics components."""
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
"""Unit tests for Agentics components."""

from __future__ import annotations

import pytest

try:
import agentics # noqa: F401
import crewai # noqa: F401
except ImportError:
pytest.skip("agentics-py and crewai not installed", allow_module_level=True)

from lfx.components.agentics import SemanticAggregator, SemanticMap, SyntheticDataGenerator
from lfx.components.agentics.constants import (
TRANSDUCTION_AMAP,
TRANSDUCTION_AREDUCE,
TRANSDUCTION_GENERATE,
)
from lfx.components.agentics.inputs.common_inputs import GENERATED_FIELDS_TABLE_SCHEMA


@pytest.mark.unit
class TestSemanticMapComponent:
"""Tests for SemanticMap (aMap) component metadata."""

def test_should_have_correct_display_name(self):
"""Test that component has correct display name."""
assert SemanticMap.display_name == "aMap"

def test_should_have_correct_icon(self):
"""Test that component has correct icon."""
assert SemanticMap.icon == "Agentics"

def test_should_have_correct_description(self):
"""Test that component has correct description."""
assert "augment" in SemanticMap.description.lower()
assert "dataframe" in SemanticMap.description.lower()

def test_should_have_required_inputs(self):
"""Test that component has all required inputs."""
input_names = {i.name for i in SemanticMap.inputs}

assert "model" in input_names
assert "api_key" in input_names
assert "source" in input_names
assert "schema" in input_names
assert "instructions" in input_names

def test_should_have_dataframe_output(self):
"""Test that component has DataFrame output."""
output_names = {o.name for o in SemanticMap.outputs}
assert "states" in output_names

def test_should_have_provider_specific_inputs(self):
"""Test that component has provider-specific inputs."""
input_names = {i.name for i in SemanticMap.inputs}

assert "base_url_ibm_watsonx" in input_names
assert "project_id" in input_names
assert "ollama_base_url" in input_names

def test_should_have_valid_transduction_constants(self):
"""Test that transduction type constants are defined."""
assert TRANSDUCTION_AMAP == "amap"
assert TRANSDUCTION_AREDUCE == "areduce"
assert TRANSDUCTION_GENERATE == "generate"

def test_should_have_model_input_with_real_time_refresh(self):
"""Test that model input has real_time_refresh enabled."""
model_input = next((i for i in SemanticMap.inputs if i.name == "model"), None)
assert model_input is not None
assert model_input.real_time_refresh is True

def test_should_have_schema_input_with_table_schema(self):
"""Test that schema input has table_schema defined."""
schema_input = next((i for i in SemanticMap.inputs if i.name == "schema"), None)
assert schema_input is not None
assert schema_input.table_schema is not None
assert len(schema_input.table_schema) > 0

field_names = {field["name"] for field in schema_input.table_schema}
assert "name" in field_names
assert "description" in field_names
assert "type" in field_names
assert "multiple" in field_names


@pytest.mark.unit
class TestSemanticAggregatorComponent:
"""Tests for SemanticAggregator (aReduce) component metadata."""

def test_should_have_correct_display_name(self):
"""Test that component has correct display name."""
assert SemanticAggregator.display_name == "aReduce"

def test_should_have_correct_icon(self):
"""Test that component has correct icon."""
assert SemanticAggregator.icon == "Agentics"

def test_should_have_required_inputs(self):
"""Test that component has all required inputs."""
input_names = {i.name for i in SemanticAggregator.inputs}

assert "model" in input_names
assert "api_key" in input_names
assert "source" in input_names
assert "schema" in input_names

def test_should_have_states_output(self):
"""Test that component has states output."""
output_names = {o.name for o in SemanticAggregator.outputs}
assert "states" in output_names


@pytest.mark.unit
class TestSyntheticDataGeneratorComponent:
"""Tests for SyntheticDataGenerator (aGenerate) component metadata."""

def test_should_have_correct_display_name(self):
"""Test that component has correct display name."""
assert SyntheticDataGenerator.display_name == "aGenerate"

def test_should_have_correct_icon(self):
"""Test that component has correct icon."""
assert SyntheticDataGenerator.icon == "Agentics"

def test_should_have_batch_size_input(self):
"""Test that component has batch_size input."""
input_names = {i.name for i in SyntheticDataGenerator.inputs}
assert "batch_size" in input_names

def test_should_have_states_output(self):
"""Test that component has states output."""
output_names = {o.name for o in SyntheticDataGenerator.outputs}
assert "states" in output_names


@pytest.mark.unit
class TestAgenticsSharedSchema:
"""Tests for shared schema structure across Agentics components."""

def test_generated_fields_schema_has_required_fields(self):
"""Test that GENERATED_FIELDS_TABLE_SCHEMA has required fields."""
field_names = {field["name"] for field in GENERATED_FIELDS_TABLE_SCHEMA}
assert "name" in field_names
assert "description" in field_names
assert "type" in field_names
assert "multiple" in field_names
Loading
Loading