Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
eb07a08
v0.5.35: helm updates, copilot improvements, 404 for docs, salesforce…
icecrasher321 Dec 19, 2025
4d1a9a3
v0.5.36: hitl improvements, opengraph, slack fixes, one-click unsubsc…
waleedlatif1 Dec 19, 2025
4431a1a
fix(helm): add custom egress rules to realtime network policy (#2481)
Lutherwaves Dec 20, 2025
3e697d9
v0.5.37: redaction utils consolidation, logs updates, autoconnect imp…
waleedlatif1 Dec 20, 2025
4827866
v0.5.38: snap to grid, copilot ux improvements, billing line items
waleedlatif1 Dec 21, 2025
0f4ec96
v0.5.39: notion, workflow variables fixes
waleedlatif1 Dec 21, 2025
3d9d9cb
v0.5.40: supabase ops to allow non-public schemas, jira uuid
icecrasher321 Dec 22, 2025
e12dd20
v0.5.41: memory fixes, copilot improvements, knowledgebase improvemen…
icecrasher321 Dec 23, 2025
57e4b49
v0.5.42: fix memory migration
icecrasher321 Dec 23, 2025
b304233
v0.5.43: export logs, circleback, grain, vertex, code hygiene, schedu…
waleedlatif1 Dec 24, 2025
b6ba3b5
v0.5.44: keyboard shortcuts, autolayout, light mode, byok, testing im…
waleedlatif1 Dec 27, 2025
dd3209a
v0.5.45: light mode fixes, realtime usage indicator, docker build imp…
waleedlatif1 Dec 28, 2025
f895bf4
v0.5.46: build improvements, greptile, light mode improvements
waleedlatif1 Dec 29, 2025
54ab82c
v0.5.47: deploy workflow as mcp, kb chunks tokenizer, UI improvements…
waleedlatif1 Dec 31, 2025
eb5d1f3
v0.5.48: copy-paste workflow blocks, docs updates, mcp tool fixes
waleedlatif1 Jan 1, 2026
3792bdd
v0.5.49: hitl improvements, new email styles, imap trigger, logs cont…
waleedlatif1 Jan 3, 2026
585f5e3
v0.5.50: import improvements, ui upgrades, kb styling and performance…
waleedlatif1 Jan 5, 2026
4fbec0a
v0.5.51: triggers, kb, condition block improvements, supabase and gra…
waleedlatif1 Jan 6, 2026
bfb6fff
v0.5.52: new port-based router block, combobox expression and variabl…
waleedlatif1 Jan 7, 2026
f5ab7f2
v0.5.53: hotkey improvements, added redis fallback, fixes for workflo…
waleedlatif1 Jan 7, 2026
13a6e6c
v0.5.54: seo, model blacklist, helm chart updates, fireflies integrat…
waleedlatif1 Jan 8, 2026
f415e5e
v0.5.55: polling groups, bedrock provider, devcontainer fixes, workfl…
waleedlatif1 Jan 9, 2026
be578e2
v0.5.56: batch operations, access control and permission groups, bill…
waleedlatif1 Jan 10, 2026
7ffc11a
v0.5.57: subagents, context menu improvements, bug fixes
icecrasher321 Jan 11, 2026
3907427
updates
lakeesiv Jan 12, 2026
217d4a9
Update apps/sim/components/icons.tsx
lakeesiv Jan 12, 2026
186c54f
code tag
lakeesiv Jan 12, 2026
a1ef5ab
updates
lakeesiv Jan 12, 2026
fc4ecc8
Merge branch 'lakees/tinybird' of https://github.com/lakeesiv/sim int…
lakeesiv Jan 12, 2026
0f686c8
Update apps/sim/blocks/blocks/tinybird.ts
lakeesiv Jan 12, 2026
254f799
Update apps/sim/tools/tinybird/query.ts
lakeesiv Jan 12, 2026
c9b0c2c
docs
lakeesiv Jan 12, 2026
c979c70
Merge branch 'lakees/tinybird' of https://github.com/lakeesiv/sim int…
lakeesiv Jan 12, 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
13 changes: 13 additions & 0 deletions apps/docs/components/icons.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -1872,6 +1872,19 @@ export function TelegramIcon(props: SVGProps<SVGSVGElement>) {
)
}

export function TinybirdIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none'>
<rect x='0' y='0' width='24' height='24' fill='#2EF598' rx='6' />
<g transform='translate(2, 2) scale(0.833)'>
<path d='M25 2.64 17.195.5 14.45 6.635z' fill='#1E7F63' />
<path d='M17.535 17.77 10.39 15.215 6.195 25.5z' fill='#1E7F63' />
<path d='M0 11.495 17.535 17.77 20.41 4.36z' fill='#1F2437' />
</g>
</svg>
)
}

export function ClayIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} xmlns='http://www.w3.org/2000/svg' width='40' height='40' viewBox='0 0 400 400'>
Expand Down
2 changes: 2 additions & 0 deletions apps/docs/components/ui/icon-mapping.ts
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ import {
SupabaseIcon,
TavilyIcon,
TelegramIcon,
TinybirdIcon,
TranslateIcon,
TrelloIcon,
TTSIcon,
Expand Down Expand Up @@ -227,6 +228,7 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
tavily: TavilyIcon,
telegram: TelegramIcon,
thinking: BrainIcon,
tinybird: TinybirdIcon,
translate: TranslateIcon,
trello: TrelloIcon,
tts: TTSIcon,
Expand Down
4 changes: 2 additions & 2 deletions apps/docs/content/docs/en/tools/google_drive.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -96,13 +96,13 @@ Download a file from Google Drive with complete metadata (exports Google Workspa
| `fileId` | string | Yes | The ID of the file to download |
| `mimeType` | string | No | The MIME type to export Google Workspace files to \(optional\) |
| `fileName` | string | No | Optional filename override |
| `includeRevisions` | boolean | No | Whether to include revision history in the metadata \(default: true\) |
| `includeRevisions` | boolean | No | Whether to include revision history in the metadata \(default: true, returns first 100 revisions\) |

#### Output

| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `file` | object | Downloaded file stored in execution files |
| `file` | object | Downloaded file data |

### `google_drive_list`

Expand Down
1 change: 1 addition & 0 deletions apps/docs/content/docs/en/tools/meta.json
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@
"tavily",
"telegram",
"thinking",
"tinybird",
"translate",
"trello",
"tts",
Expand Down
70 changes: 70 additions & 0 deletions apps/docs/content/docs/en/tools/tinybird.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
---
title: Tinybird
description: Send events and query data with Tinybird
---

import { BlockInfoCard } from "@/components/ui/block-info-card"

<BlockInfoCard
type="tinybird"
color="#2EF598"
/>

## Usage Instructions

Interact with Tinybird using the Events API to stream JSON or NDJSON events, or use the Query API to execute SQL queries against Pipes and Data Sources.



## Tools

### `tinybird_events`

Send events to a Tinybird Data Source using the Events API. Supports JSON and NDJSON formats with optional gzip compression.

#### Input

| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `base_url` | string | Yes | Tinybird API base URL \(e.g., https://api.tinybird.co or https://api.us-east.tinybird.co\) |
| `datasource` | string | Yes | Name of the Tinybird Data Source to send events to |
| `data` | string | Yes | Data to send as NDJSON \(newline-delimited JSON\) or JSON string. Each event should be a valid JSON object. |
| `wait` | boolean | No | Wait for database acknowledgment before responding. Enables safer retries but introduces latency. Defaults to false. |
| `format` | string | No | Format of the events data: "ndjson" \(default\) or "json" |
| `compression` | string | No | Compression format: "none" \(default\) or "gzip" |
| `token` | string | Yes | Tinybird API Token with DATASOURCE:APPEND or DATASOURCE:CREATE scope |

#### Output

| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `successful_rows` | number | Number of rows successfully ingested |
| `quarantined_rows` | number | Number of rows quarantined \(failed validation\) |

### `tinybird_query`

Execute SQL queries against Tinybird Pipes and Data Sources using the Query API.

#### Input

| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `base_url` | string | Yes | Tinybird API base URL \(e.g., https://api.tinybird.co\) |
| `query` | string | Yes | SQL query to execute. Specify your desired output format \(e.g., FORMAT JSON, FORMAT CSV, FORMAT TSV\). JSON format provides structured data, while other formats return raw text. |
| `pipeline` | string | No | Optional pipe name. When provided, enables SELECT * FROM _ syntax |
| `token` | string | Yes | Tinybird API Token with PIPE:READ scope |

#### Output

| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `data` | json | Query result data. For FORMAT JSON: array of objects. For other formats \(CSV, TSV, etc.\): raw text string. |
| `rows` | number | Number of rows returned \(only available with FORMAT JSON\) |
| `statistics` | json | Query execution statistics - elapsed time, rows read, bytes read \(only available with FORMAT JSON\) |



## Notes

- Category: `tools`
- Type: `tinybird`
206 changes: 206 additions & 0 deletions apps/sim/blocks/blocks/tinybird.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,206 @@
import { TinybirdIcon } from '@/components/icons'
import type { BlockConfig } from '@/blocks/types'
import { AuthMode } from '@/blocks/types'
import type { TinybirdResponse } from '@/tools/tinybird/types'

export const TinybirdBlock: BlockConfig<TinybirdResponse> = {
type: 'tinybird',
name: 'Tinybird',
description: 'Send events and query data with Tinybird',
authMode: AuthMode.ApiKey,
longDescription:
'Interact with Tinybird using the Events API to stream JSON or NDJSON events, or use the Query API to execute SQL queries against Pipes and Data Sources.',
docsLink: 'https://www.tinybird.co/docs/api-reference',
category: 'tools',
bgColor: '#2EF598',
icon: TinybirdIcon,
subBlocks: [
{
id: 'operation',
title: 'Operation',
type: 'dropdown',
options: [
{ label: 'Send Events', id: 'tinybird_events' },
{ label: 'Query', id: 'tinybird_query' },
],
value: () => 'tinybird_events',
},
{
id: 'base_url',
title: 'Base URL',
type: 'short-input',
placeholder: 'https://api.tinybird.co',
required: true,
},
{
id: 'token',
title: 'API Token',
type: 'short-input',
placeholder: 'Enter your Tinybird API token',
password: true,
required: true,
},
// Send Events operation inputs
{
id: 'datasource',
title: 'Data Source',
type: 'short-input',
placeholder: 'my_events_datasource',
condition: { field: 'operation', value: 'tinybird_events' },
required: true,
},
{
id: 'data',
title: 'Data',
type: 'code',
placeholder:
'{"event": "click", "timestamp": "2024-01-01T12:00:00Z"}\n{"event": "view", "timestamp": "2024-01-01T12:00:01Z"}',
condition: { field: 'operation', value: 'tinybird_events' },
required: true,
},
{
id: 'format',
title: 'Format',
type: 'dropdown',
options: [
{ label: 'NDJSON (Newline-delimited JSON)', id: 'ndjson' },
{ label: 'JSON', id: 'json' },
],
value: () => 'ndjson',
condition: { field: 'operation', value: 'tinybird_events' },
},
{
id: 'compression',
title: 'Compression',
type: 'dropdown',
options: [
{ label: 'None', id: 'none' },
{ label: 'Gzip', id: 'gzip' },
],
value: () => 'none',
mode: 'advanced',
condition: { field: 'operation', value: 'tinybird_events' },
},
{
id: 'wait',
title: 'Wait for Acknowledgment',
type: 'switch',
value: () => 'false',
mode: 'advanced',
condition: { field: 'operation', value: 'tinybird_events' },
},
// Query operation inputs
{
id: 'query',
title: 'SQL Query',
type: 'code',
placeholder: 'SELECT * FROM my_pipe FORMAT JSON\nOR\nSELECT * FROM my_pipe FORMAT CSV',
condition: { field: 'operation', value: 'tinybird_query' },
required: true,
},
{
id: 'pipeline',
title: 'Pipeline Name',
type: 'short-input',
placeholder: 'my_pipe (optional)',
condition: { field: 'operation', value: 'tinybird_query' },
},
],
tools: {
access: ['tinybird_events', 'tinybird_query'],
config: {
tool: (params) => params.operation || 'tinybird_events',
params: (params) => {
const operation = params.operation || 'tinybird_events'
const result: Record<string, any> = {
base_url: params.base_url,
token: params.token,
}

if (operation === 'tinybird_events') {
// Send Events operation
if (!params.datasource) {
throw new Error('Data Source is required for Send Events operation')
}
if (!params.data) {
throw new Error('Data is required for Send Events operation')
}

result.datasource = params.datasource
result.data = params.data
result.format = params.format || 'ndjson'
result.compression = params.compression || 'none'

// Convert wait from string to boolean
// Convert wait from string to boolean
if (params.wait !== undefined) {
const waitValue = typeof params.wait === 'string' ? params.wait.toLowerCase() : params.wait
result.wait = waitValue === 'true' || waitValue === true
}
} else if (operation === 'tinybird_query') {
// Query operation
if (!params.query) {
throw new Error('SQL Query is required for Query operation')
}

result.query = params.query
if (params.pipeline) {
result.pipeline = params.pipeline
}
}

return result
},
},
},
inputs: {
operation: { type: 'string', description: 'Operation to perform' },
base_url: { type: 'string', description: 'Tinybird API base URL' },
// Send Events inputs
datasource: {
type: 'string',
description: 'Name of the Tinybird Data Source',
},
data: {
type: 'string',
description: 'Data to send as JSON or NDJSON string',
},
wait: { type: 'boolean', description: 'Wait for database acknowledgment' },
format: {
type: 'string',
description: 'Format of the events (ndjson or json)',
},
compression: {
type: 'string',
description: 'Compression format (none or gzip)',
},
// Query inputs
query: { type: 'string', description: 'SQL query to execute' },
pipeline: { type: 'string', description: 'Optional pipeline name' },
// Common
token: { type: 'string', description: 'Tinybird API Token' },
},
outputs: {
// Send Events outputs
successful_rows: {
type: 'number',
description: 'Number of rows successfully ingested',
},
quarantined_rows: {
type: 'number',
description: 'Number of rows quarantined (failed validation)',
},
// Query outputs
data: {
type: 'json',
description:
'Query result data. FORMAT JSON: array of objects. Other formats (CSV, TSV, etc.): raw text string.',
},
rows: { type: 'number', description: 'Number of rows returned (only with FORMAT JSON)' },
statistics: {
type: 'json',
description:
'Query execution statistics - elapsed time, rows read, bytes read (only with FORMAT JSON)',
},
},
}
2 changes: 2 additions & 0 deletions apps/sim/blocks/registry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@ import { SupabaseBlock } from '@/blocks/blocks/supabase'
import { TavilyBlock } from '@/blocks/blocks/tavily'
import { TelegramBlock } from '@/blocks/blocks/telegram'
import { ThinkingBlock } from '@/blocks/blocks/thinking'
import { TinybirdBlock } from '@/blocks/blocks/tinybird'
import { TranslateBlock } from '@/blocks/blocks/translate'
import { TrelloBlock } from '@/blocks/blocks/trello'
import { TtsBlock } from '@/blocks/blocks/tts'
Expand Down Expand Up @@ -271,6 +272,7 @@ export const registry: Record<string, BlockConfig> = {
tavily: TavilyBlock,
telegram: TelegramBlock,
thinking: ThinkingBlock,
tinybird: TinybirdBlock,
translate: TranslateBlock,
trello: TrelloBlock,
twilio_sms: TwilioSMSBlock,
Expand Down
13 changes: 13 additions & 0 deletions apps/sim/components/icons.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -1872,6 +1872,19 @@ export function TelegramIcon(props: SVGProps<SVGSVGElement>) {
)
}

export function TinybirdIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none'>
<rect x='0' y='0' width='24' height='24' fill='#2EF598' rx='6' />
<g transform='translate(2, 2) scale(0.833)'>
<path d='M25 2.64 17.195.5 14.45 6.635z' fill='#1E7F63' />
<path d='M17.535 17.77 10.39 15.215 6.195 25.5z' fill='#1E7F63' />
<path d='M0 11.495 17.535 17.77 20.41 4.36z' fill='#1F2437' />
</g>
</svg>
)
}

export function ClayIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} xmlns='http://www.w3.org/2000/svg' width='40' height='40' viewBox='0 0 400 400'>
Expand Down
3 changes: 3 additions & 0 deletions apps/sim/tools/registry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1259,6 +1259,7 @@ import {
telegramSendVideoTool,
} from '@/tools/telegram'
import { thinkingTool } from '@/tools/thinking'
import { tinybirdEventsTool, tinybirdQueryTool } from '@/tools/tinybird'
import {
trelloAddCommentTool,
trelloCreateCardTool,
Expand Down Expand Up @@ -2016,6 +2017,8 @@ export const tools: Record<string, ToolConfig> = {
apollo_email_accounts: apolloEmailAccountsTool,
mistral_parser: mistralParserTool,
thinking_tool: thinkingTool,
tinybird_events: tinybirdEventsTool,
tinybird_query: tinybirdQueryTool,
stagehand_extract: stagehandExtractTool,
stagehand_agent: stagehandAgentTool,
mem0_add_memories: mem0AddMemoriesTool,
Expand Down
Loading