Flows is a visual automation builder that lets you create multi-step workflows by connecting components together on a drag-and-drop canvas. Each component performs a specific task: fetching data, processing it, calling an AI agent, sending an email, and you wire them together to build powerful automations without writing code.
What you can build with Flows:
- Content pipelines - Scrape a website, summarize it with AI, and email the result to your team
- Data processing - Call an API, extract fields, filter rows, and format the output
- AI-powered workflows - Chain agents with tools, knowledge bases, and conditional logic
- Automated notifications - Monitor data sources and trigger emails when conditions are met
- Knowledge management - Ingest documents into knowledge bases and retrieve them semantically
Understanding Data Types
Before building flows, it's important to understand the three data types that flow between components. Every connection carries one of these types, and components can only connect when their types are compatible.
Message
A Message is plain text, a string of characters. It's the simplest and most common data type.
"Hello, this is a message"
Where it comes from: Text Input, Agent responses, Prompt output, Mapping output, Calculator results
Where it goes: Agent input, Send Email fields, Text Output, any field that accepts text
Think of it as: A piece of text you could paste into a document.
Data
Data is a structured key-value object, similar to JSON. It holds named fields with values that can be strings, numbers, lists, or nested objects.
{
"status_code": 200,
"body": {
"name": "John",
"email": "john@example.com",
"tags": ["customer", "premium"]
},
"headers": { "content-type": "application/json" }
}Where it comes from: HTTP Request responses, Data Operations output, Agent data output
Where it goes: Data Operations (for extraction/transformation), Mapping (to format as text), Text Output
Think of it as: A structured record with labeled fields, like a JSON object or a Python dictionary.
Accessing nested values: Use dot notation in Data Operations, for example body.name, body.tags[0], headers.content-type.
DataFrame
A DataFrame is tabular data, rows and columns, like a spreadsheet or database table.
Where it comes from: Web Search results, URL/Browserless URL pages, DF Operations output
Where it goes: DF Operations (for filtering/sorting), Mapping (to format as text), HTML Parser, Text Output
Think of it as: A spreadsheet table where each row is a result and each column is a field.
Type Compatibility Rules
| From → To | Message | Data | DataFrame |
|---|---|---|---|
| Message | Yes | No | No |
| Data | No | Yes | No |
| DataFrame | No | No | Yes |
Some inputs accept multiple types. For example, Text Output accepts Message, Data, and DataFrame. The Mapping component accepts both Data and DataFrame and converts them to Message.
Can't connect? If a connection won't form between two components, it means the output type doesn't match the input type. Use Mapping to convert Data or DataFrame to Message, or Data Operations to transform Data structures.
Getting Started
Step 1: Add a Starter
Every flow begins with a Starter component. Open the sidebar, find the Starters category, and drag a component onto the canvas:
- Text Input - For entering text manually (simplest starter)
- Web Search - To search the web and get results as a table
- URL - To fetch content from web pages
- HTTP Request - To call an external API
Step 2: Add Processing or AI Components
Drag additional components to process your data. Common patterns:
- Mapping - Convert a DataFrame or Data into readable text
- Agent - Use AI to analyze, summarize, or generate content
- Data Operations - Extract specific fields from a Data object
- DF Operations - Filter, sort, or transform a DataFrame
Step 3: Connect Components
Hover over the output handle (right side circle) of one component. Click and drag to the input handle (left side circle) of another. A green highlight means the connection is valid.
Tip: If no highlight appears, the types don't match. Check the output type (Message, Data, or DataFrame) and make sure the target input accepts it.
Step 4: Configure Fields
Click on each component to see its fields. Required fields are marked with a red asterisk (*). Some fields have an info icon (i), hover over it for a tooltip explaining what the field does.
Fields with a left-side handle (colored circle) can receive data from other components instead of being filled manually. This is how you make dynamic flows.
Step 5: Add an Output
Every flow should end with an output to capture results:
- Text Output - Displays the final result in the flow canvas
- Send Email - Sends the result via email to recipients
- Add to Knowledge Base - Stores the result in a KB for future use
Step 6: Run the Flow
Click the Play button (▶) at the top of a component, or use the global Run button. Components execute in dependency order: starters first, then each downstream component as its inputs become available.
Watch the status indicator on each component: it shows a spinner while running, a green check on success, or a red X on failure with an error message.
Component Reference
Starters
Starters are the entry points of your flow. They provide the initial data that kicks off the pipeline. Every flow needs at least one starter.
Text Input
The simplest starter. Enter any text that downstream components will process: a question, a topic, a URL, or raw content.
| Field | Type | Required | Description |
|---|---|---|---|
| Text | Multiline text | Yes | The text content that starts your flow. This is the entry point, type a question, a topic, a URL, or any text you want to process downstream. |
Output: Message - The entered text, passed to the next component
When to use: When you want to manually provide input, a question for an Agent, a topic for Web Search, or any static text. This is the most common starting point for simple flows.
Web Search
Searches the web across multiple sources (Google, News, Scholar, YouTube, Reddit, and more) and returns structured results as a table.
| Field | Type | Required | Description |
|---|---|---|---|
| Mode | Tab | Yes | Choose the search source: Web (general), News (recent articles), Scholar (academic papers), Wikipedia, YouTube, Reddit, Twitter, or Patents |
| Query | Text | Yes | The search keywords. Be specific for better results, for example, "machine learning healthcare 2026" instead of just "AI" |
| Site Filter | Text | No | Restrict results to a specific website. Example: reddit.com to only search Reddit, or github.com for code repositories |
| Max Results | Number (1-20) | No | How many search results to return. Default: 10. Use fewer for faster execution, more for comprehensive research |
| Fetch Content | Boolean | No | When enabled, fetches the full page content for each result (slower but gives you the actual article text, not just snippets) |
| Language | Text | No | Language code for results, for example en (English), pt (Portuguese), de (German). Default: en |
| Country | Text | No | Country code to localize results, for example us, br, de. Default: us |
| Timeout | Number | No | Maximum seconds to wait for results. Default: 30 |
Output: DataFrame - A table with columns: title, link, snippet, and (if Fetch Content is on) content
Common next steps:
- Connect to Mapping to format results as readable text, then to Agent for summarization
- Connect to DF Operations to filter results by keyword
- Connect to HTML Parser to extract specific elements from fetched content
Web Crawler
Fetches text content from one or more web pages. Can follow links on the page and crawl multiple levels deep within the same domain.
| Field | Type | Required | Description |
|---|---|---|---|
| URLs | Text | Yes | The web page address(es) to fetch. Enter one URL per line, or connect from another component for dynamic URLs |
| Max Depth | Number (1-5) | No | How many levels of links to follow. 1 = only the given page, 2 = page + all linked pages, etc. Default: 1 |
| Prevent Outside | Boolean | No | When enabled (default), only follows links within the same domain. Disable to crawl across different websites |
| Use Async | Boolean | No | Loads pages in parallel for faster results. Default: Yes |
| Format | Dropdown | No | Output format: Text (clean readable text) or HTML (raw HTML markup). Default: Text |
| Timeout | Number | No | Maximum seconds to wait per page. Default: 30 |
| Continue on Failure | Boolean | No | If one URL fails, continue fetching the others instead of stopping. Default: Yes |
Output: DataFrame - A table with columns: url, content, success, error
URL vs Browserless URL: Use URL for simple, static pages (blogs, docs, news). If you get empty or incomplete results, the page likely needs JavaScript to render, switch to Browserless URL.
Web Scraper (Browserless URL)
Fetches web pages using a real headless browser, so it can handle JavaScript-rendered content and bot-protected sites (LinkedIn, Twitter/X, Amazon, etc.).
| Field | Type | Required | Description |
|---|---|---|---|
| URLs | List | Yes | Web addresses to fetch. Each URL opens in a headless browser that waits for JavaScript to finish rendering |
| Output Format | Dropdown | No | How to format the content: Markdown (best for AI processing), Text (plain text), or HTML (raw markup). Default: Markdown |
| Content Extraction | Dropdown | No | What to extract: Full Page, Main Content Only, or CSS Selector |
| CSS Selector | Text | Conditional | A CSS selector to extract specific elements, for example article.post-content, div.product-description. Only shown when Content Extraction is "CSS Selector" |
| Use Proxy | Boolean | No | Route through a residential proxy to bypass bot protection on sites like LinkedIn or Amazon. Default: No |
| Timeout | Number (10-120) | No | Maximum seconds to wait for the page to fully render. Default: 30 |
| Max Retries | Number (1-5) | No | How many times to retry a failed page load. Default: 2 |
| Continue on Error | Boolean | No | If one URL fails, continue with the remaining URLs. Default: Yes |
Output: DataFrame - A table with columns: url, title, content, success
When to use: For JavaScript-heavy sites (SPAs, dashboards), bot-protected pages, or when the regular URL component returns empty or incomplete content.
Webhook (HTTP Request)
Makes outbound HTTP requests to external APIs. Supports GET, POST, PUT, PATCH, DELETE methods with multiple authentication options.
| Field | Type | Required | Description |
|---|---|---|---|
| URL | Text | Yes | The full API endpoint URL, for example https://api.example.com/v1/data. You can also connect this to another component for dynamic URLs |
| Method | Dropdown | Yes | The HTTP method: GET, POST, PUT, PATCH, DELETE. Default: POST |
| Headers | Key-value pairs | No | Custom HTTP headers, for example Content-Type: application/json, X-Custom-Header: value |
| Body | Multiline text | No | The request body for POST, PUT, and PATCH requests. Usually JSON format. Ignored for GET and DELETE |
| Auth Type | Dropdown | No | Authentication method: None, Bearer Token, API Key Header, Basic Auth. Default: None |
| Auth Token | Secret | Conditional | Your Bearer token (shown when Auth Type = Bearer Token). Stored securely and never visible in flow exports |
| API Key Header Name | Text | Conditional | Header name for your API key, for example X-API-Key, Authorization |
| API Key Value | Secret | Conditional | Your API key value. Stored securely |
| Basic Auth Username | Text | Conditional | Username for Basic Authentication |
| Basic Auth Password | Secret | Conditional | Password for Basic Authentication. Stored securely |
| Timeout | Number (1-300) | No | Maximum seconds to wait for a response. Default: 30 |
Outputs:
response(Data) - The full API response as a Data object with fields:status_code,body,headers,urlstatus_code(Data) - Just the status code and asuccessboolean (hidden by default)
Common next steps: Connect the response output to Data Operations, then use "Select Keys" to extract body.results or any nested field.
Outputs
Output components are the endpoints of your flow. They capture the final result and either display it, send it somewhere, or store it.
Text Output
Displays the final result of your flow on the canvas. Accepts any data type and converts it to readable text. Use this during development to inspect what a component produces.
| Field | Type | Required | Description |
|---|---|---|---|
| Inputs | Handle | Yes | Connect any component's output here. Accepts Message, Data, and DataFrame, all are converted to readable text |
Output: Message - The text representation of whatever was connected
Send Email
Sends transactional emails to one or more recipients with HTML body support and optional call-to-action buttons.
| Field | Type | Required | Description |
|---|---|---|---|
| To | List of emails | Yes | Recipient email addresses. Click "Add Recipient" to send to multiple people |
| Subject | Text | Yes | The subject line recipients will see in their inbox. Connect to another component's output for dynamic subjects |
| Body | Multiline text | Yes | The email body content. Supports HTML formatting for rich emails. Connect to an Agent or Mapping output for dynamic content |
| Button URL | Text | No | URL for an optional call-to-action button in the email, for example https://yourapp.com/report |
| Button Label | Text | No | Text displayed on the CTA button, for example "View Report", "Open Dashboard". Only shown if Button URL is set |
Output: Message - A status report: which emails were sent successfully, which failed, and masked recipient addresses
Add to Knowledge Base
Uploads content into a TextCortex Knowledge Base so agents and the Retrieve component can search it later. Supports files, URLs, and raw text.
| Field | Type | Required | Description |
|---|---|---|---|
| Knowledge Base | Dropdown | Yes | Choose which Knowledge Base to store content in. Use "+ Create New" if you don't have one yet |
| Source Type | Dropdown | Yes | What type of content to add: File, URL, or Text |
| File | File upload | Conditional | Upload a document to index. Supported formats: PDF, TXT, MD, DOCX, DOC, PPTX, PPT, CSV, XLSX, XLS |
| URL | Text | Conditional | A web page URL to crawl and store in the KB. The page content is fetched, converted, and indexed automatically |
| Content | Text area | Conditional | Raw text content to add. Connect this to an Agent or Mapping output to dynamically store generated content |
| Title | Text | No | A display name for this entry in the Knowledge Base. If blank, a name is generated automatically from the content |
Outputs:
status(Message) - Success or failure statusfile_id(Data) - The ID of the created file entry (hidden)kb_id(Data) - The Knowledge Base ID (hidden)
Data Sources
Retrieve from Knowledge Base
Performs a semantic search on a Knowledge Base and returns the most relevant document chunks. Unlike keyword search, semantic search understands meaning, searching "employee benefits" will find documents about "health insurance" and "PTO policy."
| Field | Type | Required | Description |
|---|---|---|---|
| Knowledge Base | Dropdown | Yes | Choose which Knowledge Base to search. Use "+ Create New" if you don't have one yet, then add content with the "Add to Knowledge Base" component |
| Query | Text | Yes | A natural language question or topic to search for. The search uses AI embeddings to find semantically similar content, so describe what you're looking for in plain language |
| Number of Results | Number (1-20) | No | How many matching document chunks to return. Default: 5 |
Outputs:
retrieved_text(Message) - The matching document chunks formatted as numbered text, ready to feed into an Agent or Promptresults(Data) - Structured results withtext,url,file_id, andscorefor each chunk (hidden)
Common pattern: Retrieve from KB → Prompt ("Based on this context: {retrieved_text}, answer: {question}") → Agent → Text Output
Agents
Agent
The most powerful component. Uses an AI language model to process text, analyze, summarize, generate, classify, translate, extract, or answer questions. Can be enhanced with tools (web search, calculator) and knowledge bases.
| Field | Type | Required | Description |
|---|---|---|---|
| Agent | Dropdown | Yes | Choose a pre-built TextCortex agent or select "Blank Agent" to configure everything from scratch |
| Input | Message | Yes | The text for the agent to process. Connect from a Prompt, Mapping, or any component that outputs Message |
| Model | Dropdown | Yes | The AI model to use. Options include GPT-4o, Claude, Gemini, and others |
| Background | Text area | No | System instructions that define the agent's persona and behavior |
| Rules (Always) | Text area | No | Guidelines the agent must follow in every response |
| Rules (Never) | Text area | No | Behaviors the agent must avoid |
| Knowledge Bases | Multi-select | No | Knowledge Bases the agent can search during its response |
| Tools | Multi-select | No | Tools the agent can use: Web Search, Calculator, and others |
Outputs:
text_output(Message) - The agent's text response, ready to pass to other componentsdata_output(Data) - Structured response with metadata (model used, tokens consumed, etc.)
Tips:
- Start with "Blank Agent" for full control, or pick an existing agent to reuse its personality
- Combine with Prompt - Use a Prompt component to build the input dynamically with variables, then connect to the Agent
- Add Knowledge Bases to let the agent reference your company's documents instead of relying on general knowledge
- Enable Web Search when the agent needs current, real-time information beyond its training data
Prompts
Prompt
Creates dynamic text templates using {variable} syntax. Each {variable} automatically becomes a new input field on the component, so you can connect data from other components or fill them manually. This is the recommended way to build structured inputs for Agents.
| Field | Type | Required | Description |
|---|---|---|---|
| Template | Prompt editor | Yes | Write your prompt text and insert variables using {curly_braces}. Each unique variable name creates a new input field on this component |
| (auto-generated) | Text per variable | Varies | One input field appears for each {variable} in your template. Fill them manually or connect from other components |
Output: Message - The template with all variables replaced by their values
Example:
Template: "Write a {tone} email to {recipient} about {topic}. Keep it under {word_count} words."This creates four input fields: tone, recipient, topic, and word_count. If you connect the topic field to a Web Search's output (via Mapping), the prompt dynamically includes search results.
When to use: Whenever you need to combine multiple pieces of data into a single text before sending it to an Agent. Much more flexible than typing everything into the Agent's input field.
Processing
DF Operations (DataFrame Operations)
Performs table operations on DataFrames, filter rows, sort columns, merge tables, and more. You can chain multiple DF Operations to build data transformation pipelines.
| Field | Type | Required | Description |
|---|---|---|---|
| DataFrame | Handle | Yes | The table data to transform. Connect from Web Search, URL, Browserless URL, or another DF Operations component |
| Operation | Sortable list | Yes | Choose the operation to perform (see table below). You can apply operations sequentially |
Available Operations:
| Operation | What it does | Dynamic fields |
|---|---|---|
| Filter | Keep only rows that match a condition | Column name, operator, filter value |
| Sort | Reorder rows by a column | Column name, ascending/descending |
| Select Columns | Keep only specific columns, discard the rest | Comma-separated column names |
| Head | Keep only the first N rows | Number of rows |
| Tail | Keep only the last N rows | Number of rows |
| Drop Column | Remove a column | Column name |
| Drop Duplicates | Remove duplicate rows | Column to check (optional) |
| Add Column | Add a new column with a fixed value | Column name, value |
| Rename Column | Change a column's name | Old name, new name |
| Replace Value | Replace specific values in a column | Column, find value, replace value |
| Merge | Join two DataFrames on a shared column | Column name, join type |
| Concatenate | Stack two DataFrames vertically (append rows) | — |
| Count | Count the number of rows | — |
Output: DataFrame - The transformed table
Example pipeline: Web Search → DF Operations (Filter by "contains: AI") → DF Operations (Head: 5) → Mapping → Agent
Data Operations
Performs operations on Data objects (JSON-like key-value structures). Essential for working with API responses from HTTP Request.
| Field | Type | Required | Description |
|---|---|---|---|
| Data | Handle | Yes | The Data object to transform. Connect from HTTP Request, Agent data output, or another Data Operations component |
| Operation | Sortable list | Yes | Choose the operation to perform (see table below) |
Available Operations:
| Operation | What it does | Dynamic fields |
|---|---|---|
| Select Keys | Extract specific fields from the data | Key names (supports nested paths) |
| Remove Keys | Delete specific fields | Key names |
| Rename Keys | Change field names | Old key → new key mapping |
| Append or Update | Add new fields or overwrite existing ones | Key-value pairs |
| Filter Values | Filter items in an array field by condition | Key containing the array, operator, filter values |
| Combine | Merge multiple Data objects into one | — |
| Count | Count items in an array field | Field name |
| Literal Eval | Parse a string that looks like data into actual structured data | — |
Output: Data - The transformed data object
Example: HTTP Request returns { "data": { "users": [{"name": "John", "role": "admin"}] } } → Data Operations (Select Keys: data.users) → extracts just the users array.
Helpers
Calculator
Safely evaluates mathematical expressions. Use it for calculations within your flow, totals, percentages, conversions, and more.
| Field | Type | Required | Description |
|---|---|---|---|
| Expression | Text | Yes | A math expression to evaluate. Supports +, -, *, /, **, and parentheses |
Output: Data - The calculated numeric result
Current Date
Returns the current date and time, useful for timestamping, date-based logic, or including the date in generated content.
| Field | Type | Required | Description |
|---|---|---|---|
| Timezone | Dropdown | Yes | Select your timezone to get the correct local time |
Output: Message - Formatted date and time string (for example, "2026-03-09 10:30:00 EST")
HTML Parser
Extracts specific elements from HTML content using CSS selectors. Perfect for scraping structured data from web pages.
| Field | Type | Required | Description |
|---|---|---|---|
| HTML Content | Handle | Yes | HTML source to parse. Connect from the URL or Browserless URL component (make sure Format is set to HTML) |
| CSS Selector | Text | Yes | A CSS selector targeting the elements you want |
| Attribute | Dropdown | No | What to extract from each matched element. Default: text_content |
| Custom Attribute | Text | Conditional | The name of a custom HTML attribute to extract |
| Separator | Text | No | Character(s) used to join the extracted values. Default: newline (\n) |
Output: Message - All extracted values joined by the separator
Example pipeline:
- URL (Format: HTML) → HTML Parser (selector:
a.article-link, attribute:href) → Extracts all article URLs from a page - Browserless URL (Format: HTML) → HTML Parser (selector:
span.price, attribute:text_content) → Extracts all prices from an e-commerce page
JSON Validator
Validates JSON data against a JSON Schema definition. Use it to ensure API responses or generated data match an expected structure before processing.
| Field | Type | Required | Description |
|---|---|---|---|
| JSON Data | Handle | Yes | The JSON data to validate. Connect from HTTP Request, Agent, or any component that produces structured data |
| JSON Schema | Multiline text | Yes | A JSON Schema definition describing the expected structure. See json-schema.org for the specification |
| Strict Mode | Boolean | No | When enabled (default), the flow stops with an error if validation fails. When disabled, validation errors are attached as annotations but the data passes through |
Outputs:
validated_data(Message) - The validated JSON, pretty-printed for readabilityvalidation_result(Data) - Detailed validation report withvalid,errors, anddata
Mapping
Converts Data or DataFrame objects into formatted text using a template. This is the bridge between structured data and text-based components like Agents. Previously known as "Parser."
| Field | Type | Required | Description |
|---|---|---|---|
| Data or DataFrame | Handle | Yes | The structured data to format |
| Mode | Tab | Yes | Mapping uses a template with placeholders. Stringify converts the entire input to raw text |
| Template | Multiline text | Conditional | A template with {column_name} or {key_name} placeholders |
| Separator | Text | No | Character(s) inserted between each formatted row/item. Default: newline |
Output: Message - All rows/items formatted and joined by the separator
Field Picker - automatic field suggestions:
- Connect a Data or DataFrame source to the Mapping component's input.
- Run the upstream component to populate the field metadata.
- Click the arrow icon (↓) next to the Template field. A dropdown appears listing all available field names.
- Click a field name to insert it as a
{field_name}placeholder at the cursor position.
This eliminates guesswork, you don't need to remember exact column names. Just run the upstream component and browse the available fields.
Note: The field picker only shows fields after the upstream component has been executed at least once. If no fields appear, run the upstream component first.
Example with DataFrame (from Web Search):
Template: "**{title}**\n{link}\n{snippet}"
Separator: "\n---\n"Produces:
**AI in 2026** https://example.com/1 Latest trends in artificial intelligence... --- **Machine Learning Guide** https://example.com/2 A comprehensive beginner's guide...
Example with Data (from HTTP Request):
Template: "User: {name} ({email})\nRole: {role}"When to use: Always use Mapping between a DataFrame/Data source and an Agent. Agents work with text (Message), so Mapping converts your structured data into a format the Agent can understand.
Logic
If-Else
Evaluates a condition and routes data to one of two outputs: True or False. Use it to branch your flow based on text content, numbers, or patterns.
| Field | Type | Required | Description |
|---|---|---|---|
| Input Text | Text | Yes | The text value to evaluate. Connect from an Agent output, Mapping result, or any Message source |
| Operator | Dropdown | Yes | How to compare: equals, not equals, contains, starts with, ends with, regex, less than, greater than, and more |
| Match Text | Text | Yes | The value to compare against. For regex, enter a regular expression pattern |
| Case Sensitive | Boolean | No | Whether the comparison is case-sensitive. Default: Yes |
| True Message | Message | No | Optional message to pass through the True output |
| False Message | Message | No | Optional message to pass through the False output |
| Max Iterations | Number | No | Maximum loop iterations before defaulting. Default: 10 |
| Default Route | Dropdown | No | Which output to use when max iterations is reached |
Outputs:
true_result(Message) - Fires when the condition evaluates to truefalse_result(Message) - Fires when the condition evaluates to false
Example:
Input Text: (connected from Agent output) Operator: contains Match Text: "urgent" → True: Send Email (notify the team) → False: Text Output (log for review)
Example Workflows
1. Web Research Assistant
Goal: Search the web for a topic, summarize the findings with AI, and display the result.
Text Input → Web Search → Mapping → Agent → Text Output
- Text Input - Enter: "Latest developments in quantum computing 2026"
- Web Search - Mode: Web, Query: connected from Text Input, Max Results: 5, Fetch Content: Yes
- Mapping - Template:
**{title}**\n{link}\n{content}, Separator:\n---\n - Agent - Background: "You are a research analyst. Summarize the following articles into a concise briefing with key takeaways."
- Text Output - Displays the AI-generated summary
2. Email Newsletter from Web Content
Goal: Scrape a news site, extract headlines, generate a newsletter, and email it.
URL → HTML Parser → Agent → Send Email
- URL - URLs:
https://news.example.com, Format: HTML - HTML Parser - CSS Selector:
h2.headline a, Attribute:text_content - Agent - Background: "You are a newsletter editor. Write a professional email newsletter from these headlines. Include a brief intro and group by topic."
- Send Email - To:
team@company.com, Subject: "Daily News Digest", Body: connected from Agent
3. API Data Extraction Pipeline
Goal: Call an API, extract specific fields, filter results, and display them.
HTTP Request → Data Operations → Data Operations → Mapping → Text Output
- HTTP Request - URL:
https://api.example.com/products, Method: GET - Data Operations - Select Keys:
body.products(extracts the products array) - Data Operations - Filter Values: key=
category, operator=equals, value=electronics - Mapping - Template:
{name} - ${price} ({category}) - Text Output - Shows the filtered, formatted product list
4. Knowledge Base Q&A
Goal: Search your company's knowledge base and have an AI answer questions based on the results.
Text Input → Retrieve from KB ─┐
├→ Prompt → Agent → Text Output
Text Input ────────────────────┘- Text Input - Enter: "What is our refund policy for enterprise customers?"
- Retrieve from KB - Knowledge Base: "Company Policies", Query: connected from Text Input, Results: 5
- Prompt - Template:
Based on this context:\n\n{context}\n\nAnswer this question: {question} - Agent - Model: GPT-4o, Background: "Answer questions accurately based only on the provided context. If the context doesn't contain the answer, say so."
- Text Output - Shows the AI's answer grounded in your company's documents
5. Conditional Email Alert
Goal: Have an AI classify incoming content and send an email only if it's urgent.
Text Input → Agent → If-Else → Send Email (True)
→ Text Output (False)- Text Input - Enter the content to classify
- Agent - Background: "Classify the following content as 'urgent' or 'routine'. Respond with only one word."
- If-Else - Input Text: connected from Agent, Operator:
equals, Match Text:urgent, Case Sensitive: No - True branch → Send Email - Subject: "URGENT: Action Required", Body: connected from Text Input
- False branch → Text Output - Logs the content for review
Tips and Best Practices
Building Flows
- Start simple, iterate. Begin with 2-3 components, run the flow to verify it works, then add more. Debugging a 10-component flow from scratch is much harder than building incrementally.
- Always use Mapping before Agents. Agents expect text (Message), but many data sources output DataFrame or Data. The Mapping component bridges this gap by formatting structured data into readable text.
- Use Prompt for complex Agent inputs. Instead of typing everything into the Agent's input field, use a Prompt component with
{variables}to combine multiple data sources into a well-structured prompt.
Data Types
- Check types when connections fail. If you can't connect two components, the output type (Message, Data, DataFrame) doesn't match the input type. The handle colors give you a visual cue, same color means compatible.
- Use Data Operations for API responses. HTTP Request returns a Data object. Use Data Operations with "Select Keys" to extract the nested fields you need, for example
body.results[0].name. - Use DF Operations for table data. Web Search, URL, and Browserless URL return DataFrames. Use DF Operations to filter, sort, or select columns before passing data downstream.
Performance
- Limit results to what you need. Fetching 20 web search results with full content takes much longer than 5 results with just snippets. Start with fewer results and increase if needed.
- Use URL before Browserless URL. The regular URL component is much faster. Only switch to Browserless URL when you get empty or incomplete results.
Debugging
- Use Text Output to inspect data. Drop a Text Output after any component to see exactly what it produces. This is the fastest way to understand what data looks like at each step.
- Check the status indicator. After running a flow, each component shows its status. Click on a failed component to see the error message, it usually tells you exactly what went wrong.