Compare commits

..

65 Commits

Author SHA1 Message Date
Siddharth Ganesan
2e4945508c I hate thsi 2025-08-30 16:36:45 -07:00
Waleed
1feef4ce4b improvement(tools): update mysql to respect ssl pref (#1205) 2025-08-30 16:36:45 -07:00
Waleed
2404f8af14 feat(parsers): added pptx, md, & html parsers (#1202)
* feat(parsers): added pptx, md, & html parsers

* ack PR comments

* file renaming, reorganization
2025-08-30 16:36:45 -07:00
Waleed
ba72e35d43 fix(deps): downgrade nextjs (#1200) 2025-08-30 16:36:45 -07:00
Waleed
ab52458191 improvement(kb): add fallbacks for kb configs (#1199) 2025-08-30 16:36:45 -07:00
Waleed
ef5e2b699c feat(kb): add adjustable concurrency and batching to uploads and embeddings (#1198) 2025-08-30 16:36:45 -07:00
Waleed
ba45404423 imporvement(pg): added wand config for writing sql queries for generic db blocks & supabase postgrest syntax (#1197)
* add parallel ai, postgres, mysql, slight modifications to dark mode styling

* bun install frozen lockfile

* new deps

* improve security, add wand to short input and update wand config
2025-08-30 16:36:44 -07:00
Waleed
4ce2fc760a feat(tools): add parallel ai, postgres, mysql, slight modifications to dark mode styling (#1192)
* add parallel ai, postgres, mysql, slight modifications to dark mode styling

* bun install frozen lockfile

* new deps
2025-08-30 16:36:44 -07:00
Waleed
71e06f2b31 fix(billing-ui): open settings when enterprise sub folks press usage indicator (#1194) 2025-08-30 16:36:44 -07:00
Siddharth Ganesan
ce04d56d79 Use direct fetch (#1193) 2025-08-30 16:36:44 -07:00
Siddharth Ganesan
626e9a37da Fix/wand (#1191)
* Switch to node

* Refactor
2025-08-30 16:36:44 -07:00
Siddharth Ganesan
100ae1d23e Switch to node (#1190) 2025-08-30 16:36:44 -07:00
Vikhyath Mondreti
792df1a9f0 run bun install 2025-08-30 16:36:44 -07:00
Vikhyath Mondreti
d313a0f171 Revert "feat(integrations): added parallel AI, mySQL, and postgres block/tools (#1126)"
This reverts commit 766279bb8b.
2025-08-30 16:36:44 -07:00
Vikhyath Mondreti
29270d15ff change bun install to be based on frozen-lockfile flag"
"
2025-08-30 16:36:44 -07:00
Vikhyath Mondreti
879711d786 revert drizzle-orm version 2025-08-30 16:36:44 -07:00
Vikhyath Mondreti
f98138a550 remove bun lock 2025-08-30 16:36:44 -07:00
Vikhyath Mondreti
888609a93c revert package.json 2025-08-30 16:36:44 -07:00
Siddharth Ganesan
a516325733 Stuff 2025-08-30 15:46:20 -07:00
Siddharth Ganesan
396c9db204 Updates 2025-08-30 13:43:10 -07:00
Siddharth Ganesan
a1acbc9616 Load final state 2025-08-30 11:24:40 -07:00
Siddharth Ganesan
5a74ab28e2 Cleaning 2025-08-30 11:14:41 -07:00
Siddharth Ganesan
cf5532c852 Checkpoint 2025-08-29 18:32:06 -07:00
Siddharth Ganesan
3e6d454de3 Fix execution input 2025-08-29 17:34:31 -07:00
Siddharth Ganesan
4c4b3351e6 Checkpoint 2025-08-29 16:53:36 -07:00
Siddharth Ganesan
0c1ee239fe Broken checkpoint 2025-08-29 15:27:15 -07:00
Siddharth Ganesan
9c065a1c2a Execution dropdown 2025-08-29 14:55:55 -07:00
Siddharth Ganesan
dc92a79f33 Debugger 2025-08-29 12:53:03 -07:00
Siddharth Ganesan
efb0d22d3f Debugger fixes 2025-08-29 12:50:18 -07:00
Siddharth Ganesan
9af445fa25 Updates 2025-08-29 12:21:46 -07:00
Siddharth Ganesan
e09088bafc Updates 2025-08-29 12:07:09 -07:00
Siddharth Ganesan
994c81ba3c Functionality 2025-08-29 11:59:42 -07:00
Siddharth Ganesan
4bba1eb8f6 Startpos stuff 2025-08-29 11:54:06 -07:00
Siddharth Ganesan
de06e8c35c Rollback checkpoint 2025-08-29 11:00:33 -07:00
Siddharth Ganesan
61534b05dd Breakpoint color 2025-08-29 10:25:11 -07:00
Siddharth Ganesan
694538e1ee Lint 2025-08-29 10:25:11 -07:00
Siddharth Ganesan
6df565e4c8 Panel toggle 2025-08-29 10:25:11 -07:00
Siddharth Ganesan
422df2be0f Stuff 2025-08-29 10:25:11 -07:00
Siddharth Ganesan
692b385ece Checkpoint 2025-08-29 10:25:11 -07:00
Siddharth Ganesan
728f5812ac HIde env vars 2025-08-29 10:25:11 -07:00
Siddharth Ganesan
1d51706057 Loops and parallels 2025-08-29 10:25:11 -07:00
Siddharth Ganesan
c166c60d9b Ui updates 2025-08-29 10:25:11 -07:00
Siddharth Ganesan
120b7ffd5c Ui 2025-08-29 10:25:11 -07:00
Siddharth Ganesan
ecc2a55f9e Breakpoint ui 2025-08-29 10:25:11 -07:00
Siddharth Ganesan
f10b7c0493 Stuff 2025-08-29 10:25:11 -07:00
Siddharth Ganesan
5835df3496 Fix resume 2025-08-29 10:25:11 -07:00
Siddharth Ganesan
c4924776b6 Update 2025-08-29 10:25:10 -07:00
Siddharth Ganesan
9444661d98 Updates 2025-08-29 10:25:10 -07:00
Siddharth Ganesan
9137b2eab3 Variable highlighting 2025-08-29 10:25:10 -07:00
Siddharth Ganesan
fa0ef07981 Remove number styling 2025-08-29 10:25:10 -07:00
Siddharth Ganesan
463ba208f4 Fix env vars 2025-08-29 10:25:10 -07:00
Siddharth Ganesan
2cedac5ffb Fix workflow vars 2025-08-29 10:25:10 -07:00
Siddharth Ganesan
9c3f559a91 Fix scoping 2025-08-29 10:25:10 -07:00
Siddharth Ganesan
0d7ab06bd1 Fix 2025-08-29 10:25:10 -07:00
Siddharth Ganesan
7bda4468b8 Ui updates 2025-08-29 10:25:10 -07:00
Siddharth Ganesan
bdb9b866ab UI improvements 2025-08-29 10:25:10 -07:00
Siddharth Ganesan
460d515df2 Execution status 2025-08-29 10:25:10 -07:00
Siddharth Ganesan
7b49515798 Fixes 2025-08-29 10:25:10 -07:00
Siddharth Ganesan
049f188d2e Var improvements 2025-08-29 10:25:10 -07:00
Siddharth Ganesan
6c8a7f0594 Checkpoitn 2025-08-29 10:25:10 -07:00
Siddharth Ganesan
3727b5d395 Checkpoint 2025-08-29 10:25:10 -07:00
Siddharth Ganesan
75a3f4cce7 Checkpoint 2025-08-29 10:25:10 -07:00
Siddharth Ganesan
63616a1239 Updates 2025-08-29 10:25:10 -07:00
Siddharth Ganesan
7cb6dfc211 Updates 2025-08-29 10:25:10 -07:00
Siddharth Ganesan
b94d942204 Updates 2025-08-29 10:25:09 -07:00
1596 changed files with 25346 additions and 175433 deletions

View File

@@ -2,7 +2,8 @@ name: Build and Publish Docker Image
on:
push:
branches: [main, staging]
branches: [main]
tags: ['v*']
jobs:
build-and-push:
@@ -55,7 +56,7 @@ jobs:
uses: docker/setup-buildx-action@v3
- name: Log in to the Container registry
if: github.event_name != 'pull_request' && github.ref == 'refs/heads/main'
if: github.event_name != 'pull_request'
uses: docker/login-action@v3
with:
registry: ghcr.io
@@ -69,7 +70,10 @@ jobs:
images: ${{ matrix.image }}
tags: |
type=raw,value=latest-${{ matrix.arch }},enable=${{ github.ref == 'refs/heads/main' }}
type=raw,value=staging-${{ github.sha }}-${{ matrix.arch }},enable=${{ github.ref == 'refs/heads/staging' }}
type=ref,event=pr,suffix=-${{ matrix.arch }}
type=semver,pattern={{version}},suffix=-${{ matrix.arch }}
type=semver,pattern={{major}}.{{minor}},suffix=-${{ matrix.arch }}
type=semver,pattern={{major}}.{{minor}}.{{patch}},suffix=-${{ matrix.arch }}
type=sha,format=long,suffix=-${{ matrix.arch }}
- name: Build and push Docker image
@@ -78,7 +82,7 @@ jobs:
context: .
file: ${{ matrix.dockerfile }}
platforms: ${{ matrix.platform }}
push: ${{ github.event_name != 'pull_request' && github.ref == 'refs/heads/main' }}
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha,scope=build-v3
@@ -89,7 +93,7 @@ jobs:
create-manifests:
runs-on: ubuntu-latest
needs: build-and-push
if: github.event_name != 'pull_request' && github.ref == 'refs/heads/main'
if: github.event_name != 'pull_request'
strategy:
matrix:
include:
@@ -115,6 +119,10 @@ jobs:
images: ${{ matrix.image }}
tags: |
type=raw,value=latest,enable=${{ github.ref == 'refs/heads/main' }}
type=ref,event=pr
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=semver,pattern={{major}}.{{minor}}.{{patch}}
type=sha,format=long
- name: Create and push manifest

View File

@@ -32,7 +32,6 @@ jobs:
env:
NODE_OPTIONS: '--no-warnings'
NEXT_PUBLIC_APP_URL: 'https://www.sim.ai'
DATABASE_URL: 'postgresql://postgres:postgres@localhost:5432/simstudio'
ENCRYPTION_KEY: '7cf672e460e430c1fba707575c2b0e2ad5a99dddf9b7b7e3b5646e630861db1c' # dummy key for CI only
run: bun run test
@@ -40,7 +39,6 @@ jobs:
env:
NODE_OPTIONS: '--no-warnings'
NEXT_PUBLIC_APP_URL: 'https://www.sim.ai'
DATABASE_URL: 'postgresql://postgres:postgres@localhost:5432/simstudio'
STRIPE_SECRET_KEY: 'dummy_key_for_ci_only'
STRIPE_WEBHOOK_SECRET: 'dummy_secret_for_ci_only'
RESEND_API_KEY: 'dummy_key_for_ci_only'
@@ -73,7 +71,7 @@ jobs:
run: bun install
- name: Apply migrations
working-directory: ./packages/db
working-directory: ./apps/sim
env:
DATABASE_URL: ${{ github.ref == 'refs/heads/main' && secrets.DATABASE_URL || secrets.STAGING_DATABASE_URL }}
run: bunx drizzle-kit migrate --config=./drizzle.config.ts
run: bunx drizzle-kit migrate

View File

@@ -1,151 +0,0 @@
name: 'Auto-translate Documentation'
on:
push:
branches: [ staging ]
paths:
- 'apps/docs/content/docs/en/**'
- 'apps/docs/i18n.json'
workflow_dispatch: # Allow manual triggers
permissions:
contents: write
pull-requests: write
jobs:
translate:
runs-on: ubuntu-latest
if: github.actor != 'github-actions[bot]' # Prevent infinite loops
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
token: ${{ secrets.GH_PAT }}
fetch-depth: 0
- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: latest
- name: Run Lingo.dev translations
env:
LINGODOTDEV_API_KEY: ${{ secrets.LINGODOTDEV_API_KEY }}
run: |
cd apps/docs
bunx lingo.dev@latest i18n
- name: Check for translation changes
id: changes
run: |
cd apps/docs
git config --local user.email "action@github.com"
git config --local user.name "GitHub Action"
if [ -n "$(git status --porcelain content/docs)" ]; then
echo "changes=true" >> $GITHUB_OUTPUT
else
echo "changes=false" >> $GITHUB_OUTPUT
fi
- name: Create Pull Request with translations
if: steps.changes.outputs.changes == 'true'
uses: peter-evans/create-pull-request@v5
with:
token: ${{ secrets.GH_PAT }}
commit-message: "feat(i18n): update translations"
title: "🌐 Auto-update translations"
body: |
## Summary
Automated translation updates triggered by changes to documentation.
This PR was automatically created after content changes were made, updating translations for all supported languages using Lingo.dev AI translation engine.
**Original trigger**: ${{ github.event.head_commit.message }}
**Commit**: ${{ github.sha }}
**Workflow**: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
## Type of Change
- [ ] Bug fix
- [ ] New feature
- [ ] Breaking change
- [x] Documentation
- [ ] Other: ___________
## Testing
This PR includes automated translations for modified English documentation content:
- 🇪🇸 Spanish (es) translations
- 🇫🇷 French (fr) translations
- 🇨🇳 Chinese (zh) translations
**What reviewers should focus on:**
- Verify translated content accuracy and context
- Check that all links and references work correctly in translated versions
- Ensure formatting, code blocks, and structure are preserved
- Validate that technical terms are appropriately translated
## Checklist
- [x] Code follows project style guidelines (automated translation)
- [x] Self-reviewed my changes (automated process)
- [ ] Tests added/updated and passing
- [x] No new warnings introduced
- [x] I confirm that I have read and agree to the terms outlined in the [Contributor License Agreement (CLA)](./CONTRIBUTING.md#contributor-license-agreement-cla)
## Screenshots/Videos
<!-- Translation changes are text-based - no visual changes expected -->
<!-- Reviewers should check the documentation site renders correctly for all languages -->
branch: auto-translate/staging-merge-${{ github.run_id }}
base: staging
labels: |
i18n
verify-translations:
needs: translate
runs-on: ubuntu-latest
if: always() # Run even if translation fails
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
ref: staging
- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: latest
- name: Install dependencies
run: |
cd apps/docs
bun install
- name: Build documentation to verify translations
run: |
cd apps/docs
bun run build
- name: Report translation status
run: |
cd apps/docs
echo "## Translation Status Report" >> $GITHUB_STEP_SUMMARY
echo "**Triggered by merge to staging branch**" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
en_count=$(find content/docs/en -name "*.mdx" | wc -l)
es_count=$(find content/docs/es -name "*.mdx" 2>/dev/null | wc -l || echo 0)
fr_count=$(find content/docs/fr -name "*.mdx" 2>/dev/null | wc -l || echo 0)
zh_count=$(find content/docs/zh -name "*.mdx" 2>/dev/null | wc -l || echo 0)
es_percentage=$((es_count * 100 / en_count))
fr_percentage=$((fr_count * 100 / en_count))
zh_percentage=$((zh_count * 100 / en_count))
echo "### Coverage Statistics" >> $GITHUB_STEP_SUMMARY
echo "- **🇬🇧 English**: $en_count files (source)" >> $GITHUB_STEP_SUMMARY
echo "- **🇪🇸 Spanish**: $es_count/$en_count files ($es_percentage%)" >> $GITHUB_STEP_SUMMARY
echo "- **🇫🇷 French**: $fr_count/$en_count files ($fr_percentage%)" >> $GITHUB_STEP_SUMMARY
echo "- **🇨🇳 Chinese**: $zh_count/$en_count files ($zh_percentage%)" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "🔄 **Auto-translation PR**: Check for new pull request with updated translations" >> $GITHUB_STEP_SUMMARY

3
.gitignore vendored
View File

@@ -68,5 +68,4 @@ start-collector.sh
.vscode
## Helm Chart Tests
helm/sim/test
i18n.cache
helm/sim/test

View File

@@ -125,11 +125,10 @@ Update your `.env` file with the database URL:
DATABASE_URL="postgresql://postgres:your_password@localhost:5432/simstudio"
```
4. Set up the database (from packages/db):
4. Set up the database:
```bash
cd packages/db
bunx drizzle-kit migrate --config=./drizzle.config.ts
bunx drizzle-kit migrate
```
5. Start the development servers:
@@ -160,7 +159,7 @@ bun run dev:sockets
Copilot is a Sim-managed service. To use Copilot on a self-hosted instance:
- Go to https://sim.ai → Settings → Copilot and generate a Copilot API key
- Set `COPILOT_API_KEY` environment variable in your self-hosted apps/sim/.env file to that value
- Set `COPILOT_API_KEY` in your self-hosted environment to that value
## Tech Stack
@@ -175,7 +174,6 @@ Copilot is a Sim-managed service. To use Copilot on a self-hosted instance:
- **Monorepo**: [Turborepo](https://turborepo.org/)
- **Realtime**: [Socket.io](https://socket.io/)
- **Background Jobs**: [Trigger.dev](https://trigger.dev/)
- **Remote Code Execution**: [E2B](https://www.e2b.dev/)
## Contributing

View File

@@ -0,0 +1,5 @@
import type { ReactNode } from 'react'
export default function SlugLayout({ children }: { children: ReactNode }) {
return children
}

View File

@@ -0,0 +1,58 @@
import { DocsBody, DocsDescription, DocsPage, DocsTitle } from 'fumadocs-ui/page'
import { notFound } from 'next/navigation'
import mdxComponents from '@/components/mdx-components'
import { source } from '@/lib/source'
export const dynamic = 'force-dynamic'
export default async function Page(props: { params: Promise<{ slug?: string[] }> }) {
const params = await props.params
const page = source.getPage(params.slug)
if (!page) notFound()
const MDX = page.data.body
return (
<DocsPage
toc={page.data.toc}
full={page.data.full}
tableOfContent={{
style: 'clerk',
enabled: true,
header: <div className='mb-2 font-medium text-sm'>On this page</div>,
single: false,
}}
article={{
className: 'scroll-smooth max-sm:pb-16',
}}
tableOfContentPopover={{
style: 'clerk',
enabled: true,
}}
footer={{
enabled: false,
}}
>
<DocsTitle>{page.data.title}</DocsTitle>
<DocsDescription>{page.data.description}</DocsDescription>
<DocsBody>
<MDX components={mdxComponents} />
</DocsBody>
</DocsPage>
)
}
export async function generateStaticParams() {
return source.generateParams()
}
export async function generateMetadata(props: { params: Promise<{ slug?: string[] }> }) {
const params = await props.params
const page = source.getPage(params.slug)
if (!page) notFound()
return {
title: page.data.title,
description: page.data.description,
}
}

View File

@@ -0,0 +1,46 @@
import type { ReactNode } from 'react'
import { DocsLayout } from 'fumadocs-ui/layouts/docs'
import { ExternalLink, GithubIcon } from 'lucide-react'
import Link from 'next/link'
import { source } from '@/lib/source'
const GitHubLink = () => (
<div className='fixed right-4 bottom-4 z-50'>
<Link
href='https://github.com/simstudioai/sim'
target='_blank'
rel='noopener noreferrer'
className='flex h-8 w-8 items-center justify-center rounded-full border border-border bg-background transition-colors hover:bg-muted'
>
<GithubIcon className='h-4 w-4' />
</Link>
</div>
)
export default function Layout({ children }: { children: ReactNode }) {
return (
<>
<DocsLayout
tree={source.pageTree}
nav={{
title: <div className='flex items-center font-medium'>Sim</div>,
}}
links={[
{
text: 'Visit Sim',
url: 'https://sim.ai',
icon: <ExternalLink className='h-4 w-4' />,
},
]}
sidebar={{
defaultOpenLevel: 1,
collapsible: true,
footer: null,
}}
>
{children}
</DocsLayout>
<GitHubLink />
</>
)
}

View File

@@ -1,161 +0,0 @@
import { findNeighbour } from 'fumadocs-core/server'
import defaultMdxComponents from 'fumadocs-ui/mdx'
import { DocsBody, DocsDescription, DocsPage, DocsTitle } from 'fumadocs-ui/page'
import { ChevronLeft, ChevronRight } from 'lucide-react'
import Link from 'next/link'
import { notFound } from 'next/navigation'
import { StructuredData } from '@/components/structured-data'
import { source } from '@/lib/source'
export const dynamic = 'force-dynamic'
export default async function Page(props: { params: Promise<{ slug?: string[]; lang: string }> }) {
const params = await props.params
const page = source.getPage(params.slug, params.lang)
if (!page) notFound()
const MDX = page.data.body
const baseUrl = 'https://docs.sim.ai'
const pageTreeRecord = source.pageTree as Record<string, any>
const pageTree =
pageTreeRecord[params.lang] ?? pageTreeRecord.en ?? Object.values(pageTreeRecord)[0]
const neighbours = pageTree ? findNeighbour(pageTree, page.url) : null
const CustomFooter = () => (
<div className='mt-12 flex items-center justify-between border-border border-t py-8'>
{neighbours?.previous ? (
<Link
href={neighbours.previous.url}
className='group flex items-center gap-2 text-muted-foreground transition-colors hover:text-foreground'
>
<ChevronLeft className='group-hover:-translate-x-1 h-4 w-4 transition-transform' />
<span className='font-medium'>{neighbours.previous.name}</span>
</Link>
) : (
<div />
)}
{neighbours?.next ? (
<Link
href={neighbours.next.url}
className='group flex items-center gap-2 text-muted-foreground transition-colors hover:text-foreground'
>
<span className='font-medium'>{neighbours.next.name}</span>
<ChevronRight className='h-4 w-4 transition-transform group-hover:translate-x-1' />
</Link>
) : (
<div />
)}
</div>
)
return (
<>
<StructuredData
title={page.data.title}
description={page.data.description || ''}
url={`${baseUrl}${page.url}`}
lang={params.lang}
/>
<DocsPage
toc={page.data.toc}
full={page.data.full}
tableOfContent={{
style: 'clerk',
enabled: true,
header: <div className='mb-2 font-medium text-sm'>On this page</div>,
single: false,
}}
article={{
className: 'scroll-smooth max-sm:pb-16',
}}
tableOfContentPopover={{
style: 'clerk',
enabled: true,
}}
footer={{
enabled: true,
component: <CustomFooter />,
}}
>
<DocsTitle>{page.data.title}</DocsTitle>
<DocsDescription>{page.data.description}</DocsDescription>
<DocsBody>
<MDX components={defaultMdxComponents} />
</DocsBody>
</DocsPage>
</>
)
}
export async function generateStaticParams() {
return source.generateParams()
}
export async function generateMetadata(props: {
params: Promise<{ slug?: string[]; lang: string }>
}) {
const params = await props.params
const page = source.getPage(params.slug, params.lang)
if (!page) notFound()
const baseUrl = 'https://docs.sim.ai'
const fullUrl = `${baseUrl}${page.url}`
return {
title: page.data.title,
description:
page.data.description || 'Sim visual workflow builder for AI applications documentation',
keywords: [
'AI workflow builder',
'visual workflow editor',
'AI automation',
'workflow automation',
'AI agents',
'no-code AI',
'drag and drop workflows',
page.data.title?.toLowerCase().split(' '),
]
.flat()
.filter(Boolean),
authors: [{ name: 'Sim Team' }],
category: 'Developer Tools',
openGraph: {
title: page.data.title,
description:
page.data.description || 'Sim visual workflow builder for AI applications documentation',
url: fullUrl,
siteName: 'Sim Documentation',
type: 'article',
locale: params.lang,
alternateLocale: ['en', 'fr', 'zh'].filter((lang) => lang !== params.lang),
},
twitter: {
card: 'summary',
title: page.data.title,
description:
page.data.description || 'Sim visual workflow builder for AI applications documentation',
},
robots: {
index: true,
follow: true,
googleBot: {
index: true,
follow: true,
'max-video-preview': -1,
'max-image-preview': 'large',
'max-snippet': -1,
},
},
canonical: fullUrl,
alternates: {
canonical: fullUrl,
languages: {
en: `${baseUrl}/en${page.url.replace(`/${params.lang}`, '')}`,
fr: `${baseUrl}/fr${page.url.replace(`/${params.lang}`, '')}`,
zh: `${baseUrl}/zh${page.url.replace(`/${params.lang}`, '')}`,
},
},
}
}

View File

@@ -1,99 +0,0 @@
import type { ReactNode } from 'react'
import { defineI18nUI } from 'fumadocs-ui/i18n'
import { DocsLayout } from 'fumadocs-ui/layouts/docs'
import { RootProvider } from 'fumadocs-ui/provider'
import { ExternalLink, GithubIcon } from 'lucide-react'
import { Inter } from 'next/font/google'
import Image from 'next/image'
import Link from 'next/link'
import { LanguageDropdown } from '@/components/ui/language-dropdown'
import { i18n } from '@/lib/i18n'
import { source } from '@/lib/source'
import '../global.css'
import { Analytics } from '@vercel/analytics/next'
const inter = Inter({
subsets: ['latin'],
})
const { provider } = defineI18nUI(i18n, {
translations: {
en: {
displayName: 'English',
},
es: {
displayName: 'Español',
},
fr: {
displayName: 'Français',
},
zh: {
displayName: '简体中文',
},
},
})
const GitHubLink = () => (
<div className='fixed right-4 bottom-4 z-50'>
<Link
href='https://github.com/simstudioai/sim'
target='_blank'
rel='noopener noreferrer'
className='flex h-8 w-8 items-center justify-center rounded-full border border-border bg-background transition-colors hover:bg-muted'
>
<GithubIcon className='h-4 w-4' />
</Link>
</div>
)
type LayoutProps = {
children: ReactNode
params: Promise<{ lang: string }>
}
export default async function Layout({ children, params }: LayoutProps) {
const { lang } = await params
return (
<html lang={lang} className={inter.className} suppressHydrationWarning>
<body className='flex min-h-screen flex-col'>
<RootProvider i18n={provider(lang)}>
<DocsLayout
tree={source.pageTree[lang]}
nav={{
title: (
<div className='flex items-center gap-3'>
<Image
src='/static/logo.png'
alt='Sim'
width={60}
height={24}
className='h-6 w-auto'
/>
<LanguageDropdown />
</div>
),
}}
links={[
{
text: 'Visit Sim',
url: 'https://sim.ai',
icon: <ExternalLink className='h-4 w-4' />,
},
]}
sidebar={{
defaultOpenLevel: 0,
collapsible: true,
footer: null,
banner: null,
}}
>
{children}
</DocsLayout>
<GitHubLink />
<Analytics />
</RootProvider>
</body>
</html>
)
}

View File

@@ -6,150 +6,6 @@
--color-fd-primary: #802fff; /* Purple from control-bar component */
}
/* Target any potential border classes */
* {
--fd-border-sidebar: transparent !important;
}
/* Override any CSS custom properties for borders */
:root {
--fd-border: transparent !important;
--fd-border-sidebar: transparent !important;
}
/* Sidebar improvements for cleaner design */
[data-sidebar] {
--fd-sidebar-width: 280px;
background-color: rgb(255 255 255);
padding-top: 16px;
}
/* Clean sidebar container */
[data-sidebar] > div {
padding: 0 16px;
}
/* Section headers/separators styling */
[data-sidebar] .text-sm.font-medium.text-muted-foreground,
[data-sidebar] [data-separator] {
font-size: 11px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.05em;
margin-top: 20px;
margin-bottom: 6px;
padding-left: 12px;
padding-right: 12px;
color: rgb(115 115 115);
border: none;
background: none;
}
/* First separator should have less top margin */
[data-sidebar] [data-separator]:first-of-type {
margin-top: 12px;
}
/* Clean sidebar item styling */
[data-sidebar] a {
padding: 8px 12px;
margin: 1px 0;
border-radius: 6px;
font-size: 14px;
font-weight: 400;
line-height: 1.4;
transition: all 0.15s ease;
display: block;
color: rgb(71 85 105);
text-decoration: none;
}
[data-sidebar] a[data-active="true"] {
background-color: rgba(128, 47, 255, 0.08);
color: var(--color-fd-primary);
font-weight: 500;
}
[data-sidebar] a:hover:not([data-active="true"]) {
background-color: rgb(248 250 252);
color: rgb(51 65 85);
}
/* Improve spacing between sidebar items */
[data-sidebar] nav > * + * {
margin-top: 2px;
}
/* Section group styling */
[data-sidebar] [data-folder] {
margin-bottom: 4px;
}
[data-sidebar] [data-folder] > div:first-child {
font-weight: 500;
font-size: 13px;
color: rgb(15 23 42);
padding: 6px 12px;
margin-bottom: 4px;
}
/* Clean up folder toggle buttons */
[data-sidebar] button[data-folder-toggle] {
padding: 4px 8px 4px 12px;
border-radius: 6px;
font-size: 13px;
font-weight: 500;
color: rgb(51 65 85);
}
[data-sidebar] button[data-folder-toggle]:hover {
background-color: rgb(248 250 252);
}
/* Nested item indentation */
[data-sidebar] [data-folder] a {
padding-left: 24px;
font-size: 14px;
}
/* Dark mode adjustments */
@media (prefers-color-scheme: dark) {
[data-sidebar] {
background-color: rgb(2 8 23);
}
[data-sidebar] a {
color: rgb(148 163 184);
}
[data-sidebar] a:hover:not([data-active="true"]) {
background-color: rgb(30 41 59);
color: rgb(226 232 240);
}
[data-sidebar] a[data-active="true"] {
background-color: rgba(128, 47, 255, 0.15);
color: var(--color-fd-primary);
}
[data-sidebar] .text-sm.font-medium.text-muted-foreground,
[data-sidebar] [data-separator] {
color: rgb(148 163 184);
}
[data-sidebar] [data-folder] > div:first-child {
color: rgb(226 232 240);
}
[data-sidebar] button[data-folder-toggle] {
color: rgb(148 163 184);
}
[data-sidebar] button[data-folder-toggle]:hover {
background-color: rgb(30 41 59);
}
}
/* Custom text highlighting styles */
.text-highlight {
color: var(--color-fd-primary);
@@ -160,23 +16,6 @@
color: var(--color-fd-primary);
}
/* Add bottom spacing to prevent abrupt page endings */
[data-content] {
padding-bottom: 4rem;
}
/* Alternative fallback for different Fumadocs versions */
main article,
.docs-page main {
padding-bottom: 4rem;
}
/* Remove any unwanted borders/outlines from video elements */
video {
outline: none !important;
border-style: solid !important;
}
/* Tailwind v4 content sources */
@source '../app/**/*.{js,ts,jsx,tsx,mdx}';
@source '../components/**/*.{js,ts,jsx,tsx,mdx}';

View File

@@ -1,32 +1,30 @@
import type { ReactNode } from 'react'
import { RootProvider } from 'fumadocs-ui/provider'
import { Inter } from 'next/font/google'
import './global.css'
import { Analytics } from '@vercel/analytics/next'
export default function RootLayout({ children }: { children: ReactNode }) {
return children
const inter = Inter({
subsets: ['latin'],
})
export default function Layout({ children }: { children: ReactNode }) {
return (
<html lang='en' className={inter.className} suppressHydrationWarning>
<body className='flex min-h-screen flex-col'>
<RootProvider>
{children}
<Analytics />
</RootProvider>
</body>
</html>
)
}
export const metadata = {
metadataBase: new URL('https://docs.sim.ai'),
title: {
default: 'Sim Documentation - Visual Workflow Builder for AI Applications',
template: '%s',
},
title: 'Sim',
description:
'Comprehensive documentation for Sim - the visual workflow builder for AI applications. Create powerful AI agents, automation workflows, and data processing pipelines by connecting blocks on a canvas—no coding required.',
keywords: [
'AI workflow builder',
'visual workflow editor',
'AI automation',
'workflow automation',
'AI agents',
'no-code AI',
'drag and drop workflows',
'AI integrations',
'workflow canvas',
'AI development platform',
],
authors: [{ name: 'Sim Team', url: 'https://sim.ai' }],
category: 'Developer Tools',
classification: 'Developer Documentation',
'Build agents in seconds with a drag and drop workflow builder. Access comprehensive documentation to help you create efficient workflows and maximize your automation capabilities.',
manifest: '/favicon/site.webmanifest',
icons: {
icon: [
@@ -41,40 +39,4 @@ export const metadata = {
statusBarStyle: 'default',
title: 'Sim Docs',
},
openGraph: {
type: 'website',
locale: 'en_US',
alternateLocale: ['fr_FR', 'zh_CN'],
url: 'https://docs.sim.ai',
siteName: 'Sim Documentation',
title: 'Sim Documentation - Visual Workflow Builder for AI Applications',
description:
'Comprehensive documentation for Sim - the visual workflow builder for AI applications. Create powerful AI agents, automation workflows, and data processing pipelines.',
},
twitter: {
card: 'summary',
title: 'Sim Documentation - Visual Workflow Builder for AI Applications',
description:
'Comprehensive documentation for Sim - the visual workflow builder for AI applications.',
creator: '@sim_ai',
},
robots: {
index: true,
follow: true,
googleBot: {
index: true,
follow: true,
'max-video-preview': -1,
'max-image-preview': 'large',
'max-snippet': -1,
},
},
alternates: {
canonical: 'https://docs.sim.ai',
languages: {
en: '/en',
fr: '/fr',
zh: '/zh',
},
},
}

View File

@@ -1,6 +1,7 @@
import { getLLMText } from '@/lib/llms'
import { source } from '@/lib/source'
// cached forever
export const revalidate = false
export async function GET() {

View File

@@ -1,58 +0,0 @@
export const revalidate = false
export async function GET() {
const baseUrl = 'https://docs.sim.ai'
const robotsTxt = `# Robots.txt for Sim Documentation
# Generated on ${new Date().toISOString()}
User-agent: *
Allow: /
# Allow all well-behaved crawlers
User-agent: Googlebot
Allow: /
User-agent: Bingbot
Allow: /
# AI and LLM crawlers
User-agent: GPTBot
Allow: /
User-agent: ChatGPT-User
Allow: /
User-agent: CCBot
Allow: /
User-agent: anthropic-ai
Allow: /
User-agent: Claude-Web
Allow: /
# Disallow admin and internal paths (if any exist)
Disallow: /.next/
Disallow: /api/internal/
Disallow: /_next/static/
Disallow: /admin/
# Allow but don't prioritize these
Allow: /api/search
Allow: /llms.txt
Allow: /llms.mdx/
# Sitemaps
Sitemap: ${baseUrl}/sitemap.xml
# Additional resources for AI indexing
# See https://github.com/AnswerDotAI/llms-txt for more info
# LLM-friendly content available at: ${baseUrl}/llms.txt`
return new Response(robotsTxt, {
headers: {
'Content-Type': 'text/plain',
},
})
}

View File

@@ -1,54 +0,0 @@
import { i18n } from '@/lib/i18n'
import { source } from '@/lib/source'
export const revalidate = false
export async function GET() {
const baseUrl = 'https://docs.sim.ai'
const allPages = source.getPages()
const urls = allPages
.flatMap((page) => {
const urlWithoutLang = page.url.replace(/^\/[a-z]{2}\//, '/')
return i18n.languages.map((lang) => {
const url =
lang === i18n.defaultLanguage
? `${baseUrl}${urlWithoutLang}`
: `${baseUrl}/${lang}${urlWithoutLang}`
return ` <url>
<loc>${url}</loc>
<lastmod>${new Date().toISOString().split('T')[0]}</lastmod>
<changefreq>weekly</changefreq>
<priority>${urlWithoutLang === '/introduction' ? '1.0' : '0.8'}</priority>
${i18n.languages.length > 1 ? generateAlternateLinks(baseUrl, urlWithoutLang) : ''}
</url>`
})
})
.join('\n')
const sitemap = `<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml">
${urls}
</urlset>`
return new Response(sitemap, {
headers: {
'Content-Type': 'application/xml',
},
})
}
function generateAlternateLinks(baseUrl: string, urlWithoutLang: string): string {
return i18n.languages
.map((lang) => {
const url =
lang === i18n.defaultLanguage
? `${baseUrl}${urlWithoutLang}`
: `${baseUrl}/${lang}${urlWithoutLang}`
return ` <xhtml:link rel="alternate" hreflang="${lang}" href="${url}" />`
})
.join('\n')
}

View File

@@ -0,0 +1,10 @@
import defaultMdxComponents from 'fumadocs-ui/mdx'
import { ThemeImage } from './ui/theme-image'
// Extend the default MDX components with our custom components
const mdxComponents = {
...defaultMdxComponents,
ThemeImage,
}
export default mdxComponents

View File

@@ -1,174 +0,0 @@
import Script from 'next/script'
interface StructuredDataProps {
title: string
description: string
url: string
lang: string
dateModified?: string
breadcrumb?: Array<{ name: string; url: string }>
}
export function StructuredData({
title,
description,
url,
lang,
dateModified,
breadcrumb,
}: StructuredDataProps) {
const baseUrl = 'https://docs.sim.ai'
const articleStructuredData = {
'@context': 'https://schema.org',
'@type': 'TechArticle',
headline: title,
description: description,
url: url,
datePublished: dateModified || new Date().toISOString(),
dateModified: dateModified || new Date().toISOString(),
author: {
'@type': 'Organization',
name: 'Sim Team',
url: baseUrl,
},
publisher: {
'@type': 'Organization',
name: 'Sim',
url: baseUrl,
logo: {
'@type': 'ImageObject',
url: `${baseUrl}/static/logo.png`,
},
},
mainEntityOfPage: {
'@type': 'WebPage',
'@id': url,
},
inLanguage: lang,
isPartOf: {
'@type': 'WebSite',
name: 'Sim Documentation',
url: baseUrl,
},
potentialAction: {
'@type': 'ReadAction',
target: url,
},
}
const breadcrumbStructuredData = breadcrumb && {
'@context': 'https://schema.org',
'@type': 'BreadcrumbList',
itemListElement: breadcrumb.map((item, index) => ({
'@type': 'ListItem',
position: index + 1,
name: item.name,
item: item.url,
})),
}
const websiteStructuredData = url === baseUrl && {
'@context': 'https://schema.org',
'@type': 'WebSite',
name: 'Sim Documentation',
url: baseUrl,
description:
'Comprehensive documentation for Sim visual workflow builder for AI applications. Create powerful AI agents, automation workflows, and data processing pipelines.',
publisher: {
'@type': 'Organization',
name: 'Sim',
url: baseUrl,
},
potentialAction: {
'@type': 'SearchAction',
target: {
'@type': 'EntryPoint',
urlTemplate: `${baseUrl}/search?q={search_term_string}`,
},
'query-input': 'required name=search_term_string',
},
inLanguage: ['en', 'fr', 'zh'],
}
const faqStructuredData = title.toLowerCase().includes('faq') && {
'@context': 'https://schema.org',
'@type': 'FAQPage',
mainEntity: [],
}
const softwareStructuredData = {
'@context': 'https://schema.org',
'@type': 'SoftwareApplication',
name: 'Sim',
applicationCategory: 'DeveloperApplication',
operatingSystem: 'Any',
description:
'Visual workflow builder for AI applications. Create powerful AI agents, automation workflows, and data processing pipelines by connecting blocks on a canvas—no coding required.',
url: baseUrl,
author: {
'@type': 'Organization',
name: 'Sim Team',
},
offers: {
'@type': 'Offer',
category: 'Developer Tools',
},
featureList: [
'Visual workflow builder with drag-and-drop interface',
'AI agent creation and automation',
'80+ built-in integrations',
'Real-time team collaboration',
'Multiple deployment options',
'Custom integrations via MCP protocol',
],
}
return (
<>
<Script
id='article-structured-data'
type='application/ld+json'
dangerouslySetInnerHTML={{
__html: JSON.stringify(articleStructuredData),
}}
/>
{breadcrumbStructuredData && (
<Script
id='breadcrumb-structured-data'
type='application/ld+json'
dangerouslySetInnerHTML={{
__html: JSON.stringify(breadcrumbStructuredData),
}}
/>
)}
{websiteStructuredData && (
<Script
id='website-structured-data'
type='application/ld+json'
dangerouslySetInnerHTML={{
__html: JSON.stringify(websiteStructuredData),
}}
/>
)}
{faqStructuredData && (
<Script
id='faq-structured-data'
type='application/ld+json'
dangerouslySetInnerHTML={{
__html: JSON.stringify(faqStructuredData),
}}
/>
)}
{url === baseUrl && (
<Script
id='software-structured-data'
type='application/ld+json'
dangerouslySetInnerHTML={{
__html: JSON.stringify(softwareStructuredData),
}}
/>
)}
</>
)
}

View File

@@ -0,0 +1,163 @@
import {
AgentIcon,
ApiIcon,
ChartBarIcon,
CodeIcon,
ConditionalIcon,
ConnectIcon,
ResponseIcon,
} from '@/components/icons'
import { cn } from '@/lib/utils'
// Custom Feature component specifically for BlockTypes to handle the 6-item layout
const BlockFeature = ({
title,
description,
icon,
href,
index,
totalItems,
itemsPerRow,
}: {
title: string
description: string
icon: React.ReactNode
href?: string
index: number
totalItems: number
itemsPerRow: number
}) => {
const blockColor = {
'--block-color':
title === 'Agent'
? '#8b5cf6'
: title === 'API'
? '#3b82f6'
: title === 'Condition'
? '#f59e0b'
: title === 'Function'
? '#10b981'
: title === 'Router'
? '#6366f1'
: title === 'Evaluator'
? '#ef4444'
: '#8b5cf6',
} as React.CSSProperties
const content = (
<>
{index < itemsPerRow && (
<div className='pointer-events-none absolute inset-0 h-full w-full bg-gradient-to-t from-neutral-100 to-transparent opacity-0 transition duration-200 group-hover/feature:opacity-100 dark:from-neutral-800' />
)}
{index >= itemsPerRow && (
<div className='pointer-events-none absolute inset-0 h-full w-full bg-gradient-to-b from-neutral-100 to-transparent opacity-0 transition duration-200 group-hover/feature:opacity-100 dark:from-neutral-800' />
)}
<div
className='relative z-10 mb-4 px-10 text-neutral-500 transition-colors duration-200 group-hover/feature:text-[color:var(--block-color,#8b5cf6)] dark:text-neutral-400 dark:group-hover/feature:text-[color:var(--block-color,#a78bfa)]'
style={blockColor}
>
{icon}
</div>
<div className='relative z-10 mb-2 px-10 font-bold text-lg'>
<div
className='absolute inset-y-0 left-0 h-6 w-1 origin-center rounded-tr-full rounded-br-full bg-neutral-300 transition-all duration-200 group-hover/feature:h-8 group-hover/feature:bg-[color:var(--block-color,#8b5cf6)] dark:bg-neutral-700'
style={blockColor}
/>
<span className='inline-block text-neutral-800 transition duration-200 group-hover/feature:translate-x-2 dark:text-neutral-100'>
{title}
</span>
</div>
<p className='relative z-10 max-w-xs px-10 text-neutral-600 text-sm dark:text-neutral-300'>
{description}
</p>
</>
)
const containerClasses = cn(
'flex flex-col lg:border-r py-5 relative group/feature dark:border-neutral-800',
(index === 0 || index === itemsPerRow) && 'lg:border-l dark:border-neutral-800',
index < itemsPerRow && 'lg:border-b dark:border-neutral-800',
href && 'cursor-pointer hover:bg-neutral-50 dark:hover:bg-neutral-900/50 transition-colors'
)
if (href) {
return (
<a href={href} className={containerClasses} style={{ textDecoration: 'none' }}>
{content}
</a>
)
}
return <div className={containerClasses}>{content}</div>
}
export function BlockTypes() {
const features = [
{
title: 'Agent',
description:
'Create powerful AI agents using any LLM provider with customizable system prompts and tool integrations.',
icon: <AgentIcon className='h-6 w-6' />,
href: '/blocks/agent',
},
{
title: 'API',
description:
'Connect to any external API with support for all standard HTTP methods and customizable request parameters.',
icon: <ApiIcon className='h-6 w-6' />,
href: '/blocks/api',
},
{
title: 'Condition',
description:
'Add a condition to the workflow to branch the execution path based on a boolean expression.',
icon: <ConditionalIcon className='h-6 w-6' />,
href: '/blocks/condition',
},
{
title: 'Function',
description:
'Execute custom JavaScript or TypeScript code within your workflow to transform data or implement complex logic.',
icon: <CodeIcon className='h-6 w-6' />,
href: '/blocks/function',
},
{
title: 'Router',
description:
'Intelligently direct workflow execution to different paths based on input analysis.',
icon: <ConnectIcon className='h-6 w-6' />,
href: '/blocks/router',
},
{
title: 'Evaluator',
description:
'Assess content using customizable evaluation metrics and scoring criteria across multiple dimensions.',
icon: <ChartBarIcon className='h-6 w-6' />,
href: '/blocks/evaluator',
},
{
title: 'Response',
description:
'Send a response back to the caller with customizable data, status, and headers.',
icon: <ResponseIcon className='h-6 w-6' />,
href: '/blocks/response',
},
]
const totalItems = features.length
const itemsPerRow = 3 // For large screens
return (
<div className='relative z-10 mx-auto grid max-w-7xl grid-cols-1 py-10 md:grid-cols-2 lg:grid-cols-3'>
{features.map((feature, index) => (
<BlockFeature
key={feature.title}
{...feature}
index={index}
totalItems={totalItems}
itemsPerRow={itemsPerRow}
/>
))}
</div>
)
}

View File

@@ -0,0 +1,102 @@
import {
IconAdjustmentsBolt,
IconCloud,
IconEaseInOut,
IconHeart,
IconHelp,
IconHistory,
IconRouteAltLeft,
IconTerminal2,
} from '@tabler/icons-react'
import { cn } from '@/lib/utils'
export function Features() {
const features = [
{
title: 'Multi-LLM Support',
description: 'Connect to any LLM provider including OpenAI, Anthropic, and more',
icon: <IconCloud />,
},
{
title: 'API Deployment',
description: 'Deploy your workflows as secure, scalable APIs',
icon: <IconTerminal2 />,
},
{
title: 'Webhook Integration',
description: 'Trigger workflows via webhooks from external services',
icon: <IconRouteAltLeft />,
},
{
title: 'Scheduled Execution',
description: 'Schedule workflows to run at specific times or intervals',
icon: <IconEaseInOut />,
},
{
title: '40+ Integrations',
description: 'Connect to hundreds of external services and data sources',
icon: <IconAdjustmentsBolt />,
},
{
title: 'Visual Debugging',
description: 'Debug workflows visually with detailed execution logs',
icon: <IconHelp />,
},
{
title: 'Version Control',
description: 'Track changes and roll back to previous versions',
icon: <IconHistory />,
},
{
title: 'Team Collaboration',
description: 'Collaborate with team members on workflow development',
icon: <IconHeart />,
},
]
return (
<div className='relative z-20 mx-auto grid max-w-7xl grid-cols-1 py-10 md:grid-cols-2 lg:grid-cols-4'>
{features.map((feature, index) => (
<Feature key={feature.title} {...feature} index={index} />
))}
</div>
)
}
export const Feature = ({
title,
description,
icon,
index,
}: {
title: string
description: string
icon: React.ReactNode
index: number
}) => {
return (
<div
className={cn(
'group/feature relative flex flex-col py-5 lg:border-r dark:border-neutral-800',
(index === 0 || index === 4) && 'lg:border-l dark:border-neutral-800',
index < 4 && 'lg:border-b dark:border-neutral-800'
)}
>
{index < 4 && (
<div className='pointer-events-none absolute inset-0 h-full w-full bg-gradient-to-t from-neutral-100 to-transparent opacity-0 transition duration-200 group-hover/feature:opacity-100 dark:from-neutral-800' />
)}
{index >= 4 && (
<div className='pointer-events-none absolute inset-0 h-full w-full bg-gradient-to-b from-neutral-100 to-transparent opacity-0 transition duration-200 group-hover/feature:opacity-100 dark:from-neutral-800' />
)}
<div className='relative z-10 mb-4 px-10 text-neutral-600 dark:text-neutral-400'>{icon}</div>
<div className='relative z-10 mb-2 px-10 font-bold text-lg'>
<div className='absolute inset-y-0 left-0 h-6 w-1 origin-center rounded-tr-full rounded-br-full bg-neutral-300 transition-all duration-200 group-hover/feature:h-8 group-hover/feature:bg-purple-500 dark:bg-neutral-700' />
<span className='inline-block text-neutral-800 transition duration-200 group-hover/feature:translate-x-2 dark:text-neutral-100'>
{title}
</span>
</div>
<p className='relative z-10 max-w-xs px-10 text-neutral-600 text-sm dark:text-neutral-300'>
{description}
</p>
</div>
)
}

View File

@@ -1,53 +0,0 @@
'use client'
import { useState } from 'react'
import NextImage, { type ImageProps as NextImageProps } from 'next/image'
import { cn } from '@/lib/utils'
import { Lightbox } from './lightbox'
interface ImageProps extends Omit<NextImageProps, 'className'> {
className?: string
enableLightbox?: boolean
}
export function Image({
className = 'w-full',
enableLightbox = true,
alt = '',
src,
...props
}: ImageProps) {
const [isLightboxOpen, setIsLightboxOpen] = useState(false)
const handleImageClick = () => {
if (enableLightbox) {
setIsLightboxOpen(true)
}
}
return (
<>
<NextImage
className={cn(
'overflow-hidden rounded-xl border border-border object-cover shadow-sm',
enableLightbox && 'cursor-pointer transition-opacity hover:opacity-90',
className
)}
alt={alt}
src={src}
onClick={handleImageClick}
{...props}
/>
{enableLightbox && (
<Lightbox
isOpen={isLightboxOpen}
onClose={() => setIsLightboxOpen(false)}
src={typeof src === 'string' ? src : String(src)}
alt={alt}
type='image'
/>
)}
</>
)
}

View File

@@ -1,107 +0,0 @@
'use client'
import { useEffect, useState } from 'react'
import { Check, ChevronDown } from 'lucide-react'
import { useParams, usePathname } from 'next/navigation'
const languages = {
en: { name: 'English', flag: '🇺🇸' },
es: { name: 'Español', flag: '🇪🇸' },
fr: { name: 'Français', flag: '🇫🇷' },
zh: { name: '简体中文', flag: '🇨🇳' },
}
export function LanguageDropdown() {
const [isOpen, setIsOpen] = useState(false)
const pathname = usePathname()
const params = useParams()
const [currentLang, setCurrentLang] = useState(() => {
const langFromParams = params?.lang as string
return langFromParams && Object.keys(languages).includes(langFromParams) ? langFromParams : 'en'
})
useEffect(() => {
const langFromParams = params?.lang as string
if (langFromParams && Object.keys(languages).includes(langFromParams)) {
if (langFromParams !== currentLang) {
setCurrentLang(langFromParams)
}
} else {
if (currentLang !== 'en') {
setCurrentLang('en')
}
}
}, [params, currentLang])
const handleLanguageChange = (locale: string) => {
if (locale === currentLang) {
setIsOpen(false)
return
}
setIsOpen(false)
const segments = pathname.split('/').filter(Boolean)
if (segments[0] && Object.keys(languages).includes(segments[0])) {
segments.shift()
}
let newPath = ''
if (locale === 'en') {
newPath = segments.length > 0 ? `/${segments.join('/')}` : '/introduction'
} else {
newPath = `/${locale}${segments.length > 0 ? `/${segments.join('/')}` : '/introduction'}`
}
window.location.href = newPath
}
return (
<div className='relative'>
<button
onClick={(e) => {
e.preventDefault()
e.stopPropagation()
setIsOpen(!isOpen)
}}
className='flex items-center gap-2 rounded-xl border border-border/20 bg-muted/50 px-3 py-2 text-sm backdrop-blur-sm transition-colors hover:bg-muted'
>
<span className='text-base'>{languages[currentLang as keyof typeof languages]?.flag}</span>
<span className='font-medium text-foreground'>
{languages[currentLang as keyof typeof languages]?.name}
</span>
<ChevronDown
className={`h-3 w-3 text-muted-foreground transition-transform ${isOpen ? 'rotate-180' : ''}`}
/>
</button>
{isOpen && (
<>
<div className='fixed inset-0 z-10' onClick={() => setIsOpen(false)} />
<div className='absolute top-full left-0 z-20 mt-1 w-48 rounded-lg border border-border/50 bg-background/95 shadow-xl backdrop-blur-md'>
{Object.entries(languages).map(([code, lang]) => (
<button
key={code}
onClick={(e) => {
e.preventDefault()
e.stopPropagation()
handleLanguageChange(code)
}}
className={`flex w-full items-center gap-3 px-3 py-2.5 text-sm transition-colors first:rounded-t-lg last:rounded-b-lg hover:bg-muted/80 ${
currentLang === code ? 'bg-muted/60 font-medium text-primary' : 'text-foreground'
}`}
>
<span className='text-base'>{lang.flag}</span>
<span>{lang.name}</span>
{currentLang === code && <Check className='ml-auto h-4 w-4 text-primary' />}
</button>
))}
</div>
</>
)}
</div>
)
}

View File

@@ -1,74 +0,0 @@
'use client'
import { useEffect, useRef } from 'react'
import { getVideoUrl } from '@/lib/utils'
interface LightboxProps {
isOpen: boolean
onClose: () => void
src: string
alt: string
type: 'image' | 'video'
}
export function Lightbox({ isOpen, onClose, src, alt, type }: LightboxProps) {
const overlayRef = useRef<HTMLDivElement>(null)
useEffect(() => {
const handleKeyDown = (event: KeyboardEvent) => {
if (event.key === 'Escape') {
onClose()
}
}
const handleClickOutside = (event: MouseEvent) => {
if (overlayRef.current && event.target === overlayRef.current) {
onClose()
}
}
if (isOpen) {
document.addEventListener('keydown', handleKeyDown)
document.addEventListener('click', handleClickOutside)
document.body.style.overflow = 'hidden'
}
return () => {
document.removeEventListener('keydown', handleKeyDown)
document.removeEventListener('click', handleClickOutside)
document.body.style.overflow = 'unset'
}
}, [isOpen, onClose])
if (!isOpen) return null
return (
<div
ref={overlayRef}
className='fixed inset-0 z-50 flex items-center justify-center bg-black/80 p-12 backdrop-blur-sm'
role='dialog'
aria-modal='true'
aria-label='Media viewer'
>
<div className='relative max-h-full max-w-full overflow-hidden rounded-xl shadow-2xl'>
{type === 'image' ? (
<img
src={src}
alt={alt}
className='max-h-[calc(100vh-6rem)] max-w-[calc(100vw-6rem)] rounded-xl object-contain'
loading='lazy'
/>
) : (
<video
src={getVideoUrl(src)}
autoPlay
loop
muted
playsInline
className='max-h-[calc(100vh-6rem)] max-w-[calc(100vw-6rem)] rounded-xl outline-none focus:outline-none'
/>
)}
</div>
</div>
)
}

View File

@@ -0,0 +1,48 @@
'use client'
import { useEffect, useState } from 'react'
import Image from 'next/image'
import { useTheme } from 'next-themes'
interface ThemeImageProps {
lightSrc: string
darkSrc: string
alt: string
width?: number
height?: number
className?: string
}
export function ThemeImage({
lightSrc,
darkSrc,
alt,
width = 600,
height = 400,
className = 'rounded-lg border border-border my-6',
}: ThemeImageProps) {
const { resolvedTheme } = useTheme()
const [imageSrc, setImageSrc] = useState(lightSrc)
const [mounted, setMounted] = useState(false)
// Wait until component is mounted to avoid hydration mismatch
useEffect(() => {
setMounted(true)
}, [])
useEffect(() => {
if (mounted) {
setImageSrc(resolvedTheme === 'dark' ? darkSrc : lightSrc)
}
}, [resolvedTheme, lightSrc, darkSrc, mounted])
if (!mounted) {
return null
}
return (
<div className='flex justify-center'>
<Image src={imageSrc} alt={alt} width={width} height={height} className={className} />
</div>
)
}

View File

@@ -1,8 +1,4 @@
'use client'
import { useState } from 'react'
import { getVideoUrl } from '@/lib/utils'
import { Lightbox } from './lightbox'
interface VideoProps {
src: string
@@ -11,47 +7,24 @@ interface VideoProps {
loop?: boolean
muted?: boolean
playsInline?: boolean
enableLightbox?: boolean
}
export function Video({
src,
className = 'w-full rounded-xl border border-border shadow-sm overflow-hidden outline-none focus:outline-none',
className = 'w-full -mb-2 rounded-lg',
autoPlay = true,
loop = true,
muted = true,
playsInline = true,
enableLightbox = true,
}: VideoProps) {
const [isLightboxOpen, setIsLightboxOpen] = useState(false)
const handleVideoClick = () => {
if (enableLightbox) {
setIsLightboxOpen(true)
}
}
return (
<>
<video
autoPlay={autoPlay}
loop={loop}
muted={muted}
playsInline={playsInline}
className={`${className} ${enableLightbox ? 'cursor-pointer transition-opacity hover:opacity-90' : ''}`}
src={getVideoUrl(src)}
onClick={handleVideoClick}
/>
{enableLightbox && (
<Lightbox
isOpen={isLightboxOpen}
onClose={() => setIsLightboxOpen(false)}
src={src}
alt={`Video: ${src}`}
type='video'
/>
)}
</>
<video
autoPlay={autoPlay}
loop={loop}
muted={muted}
playsInline={playsInline}
className={className}
src={getVideoUrl(src)}
/>
)
}

View File

@@ -1,24 +1,22 @@
---
title: Agent
description: Create powerful AI agents using any LLM provider
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Step, Steps } from 'fumadocs-ui/components/steps'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { Image } from '@/components/ui/image'
import { Video } from '@/components/ui/video'
import { ThemeImage } from '@/components/ui/theme-image'
The Agent block serves as the interface between your workflow and Large Language Models (LLMs). It executes inference requests against various AI providers, processes natural language inputs according to defined instructions, and generates structured or unstructured outputs for downstream consumption.
<div className="flex justify-center">
<Image
src="/static/blocks/agent.png"
alt="Agent Block Configuration"
width={500}
height={400}
className="my-6"
/>
</div>
<ThemeImage
lightSrc="/static/light/agent-light.png"
darkSrc="/static/dark/agent-dark.png"
alt="Agent Block Configuration"
width={350}
height={175}
/>
## Overview
@@ -70,7 +68,7 @@ The Agent block supports multiple LLM providers through a unified inference inte
**Local Deployment**: Ollama-compatible models (self-hosted inference)
<div className="mx-auto w-3/5 overflow-hidden rounded-lg">
<Video src="models.mp4" width={500} height={350} />
<video autoPlay loop muted playsInline className="w-full -mb-2 rounded-lg" src="/models.mp4"></video>
</div>
### Temperature
@@ -92,9 +90,9 @@ Control the creativity and randomness of responses:
</Tab>
</Tabs>
<div className="mt-4 text-sm text-gray-600 dark:text-gray-400">
<p className="mt-4 text-sm text-gray-600 dark:text-gray-400">
The temperature range (0-1 or 0-2) varies depending on the selected model.
</div>
</p>
### API Key
@@ -110,7 +108,7 @@ Tools extend the agent's capabilities through external API integrations and serv
3. Configure authentication parameters and operational constraints
<div className="mx-auto w-3/5 overflow-hidden rounded-lg">
<Video src="tools.mp4" width={500} height={350} />
<video autoPlay loop muted playsInline className="w-full -mb-2 rounded-lg" src="/tools.mp4"></video>
</div>
**Available Tool Categories**:
@@ -126,7 +124,7 @@ Tools extend the agent's capabilities through external API integrations and serv
- **None**: Tool definition available but excluded from model context
<div className="mx-auto w-3/5 overflow-hidden rounded-lg">
<Video src="granular-tool-control.mp4" width={500} height={350} />
<video autoPlay loop muted playsInline className="w-full -mb-2 rounded-lg" src="/granular-tool-control.mp4"></video>
</div>
### Response Format
@@ -167,41 +165,42 @@ After an agent completes, you can access its outputs:
## Advanced Features
### Memory + Agent: Conversation History
### Memory Integration
Use a `Memory` block with a consistent `id` (for example, `chat`) to persist messages between runs, and include that history in the Agent's prompt.
Agents can maintain context across interactions using the memory system:
- Add the user's message before the Agent
- Read the conversation history for context
- Append the Agent's reply after it runs
```yaml
# 1) Add latest user message
- Memory (operation: add)
id: chat
role: user
content: {{input}}
# 2) Load conversation history
- Memory (operation: get)
id: chat
# 3) Run the agent with prior messages available
- Agent
System Prompt: ...
User Prompt: |
Use the conversation so far:
{{memory_get.memories}}
Current user message: {{input}}
# 4) Store the agent reply
- Memory (operation: add)
id: chat
role: assistant
content: {{agent.content}}
```javascript
// In a Function block before the agent
const memory = {
conversation_history: previousMessages,
user_preferences: userProfile,
session_data: currentSession
};
```
See the `Memory` block reference for details: [/tools/memory](/tools/memory).
### Structured Output Validation
Use JSON Schema to ensure consistent, machine-readable responses:
```json
{
"type": "object",
"properties": {
"analysis": {"type": "string"},
"confidence": {"type": "number", "minimum": 0, "maximum": 1},
"categories": {"type": "array", "items": {"type": "string"}}
},
"required": ["analysis", "confidence"]
}
```
### Error Handling
Agents automatically handle common errors:
- API rate limits with exponential backoff
- Invalid tool calls with retry logic
- Network failures with connection recovery
- Schema validation errors with fallback responses
## Inputs and Outputs
@@ -266,12 +265,10 @@ See the `Memory` block reference for details: [/tools/memory](/tools/memory).
<div className="mb-4 rounded-md border p-4">
<h4 className="font-medium">Scenario: Handle customer inquiries with database access</h4>
<ol className="list-decimal pl-5 text-sm">
<li>User submits a support ticket via the API block</li>
<li>Agent checks orders/subscriptions in Postgres and searches the knowledge base for guidance</li>
<li>If escalation is needed, the Agent creates a Linear issue with relevant context</li>
<li>Agent drafts a clear email reply</li>
<li>Gmail sends the reply to the customer</li>
<li>Conversation is saved to Memory to maintain history for future messages</li>
<li>User submits support ticket via API block</li>
<li>Agent processes inquiry with product database tools</li>
<li>Agent generates response and creates follow-up ticket</li>
<li>Response block sends reply to customer</li>
</ol>
</div>

View File

@@ -1,23 +1,22 @@
---
title: API
description: Connect to external services through API endpoints
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Step, Steps } from 'fumadocs-ui/components/steps'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { Image } from '@/components/ui/image'
import { ThemeImage } from '@/components/ui/theme-image'
The API block enables you to connect your workflow to external services through API endpoints using HTTP requests. It supports various methods like GET, POST, PUT, DELETE, and PATCH, allowing you to interact with virtually any API endpoint.
The API block enables you to connect your workflow to external services through HTTP requests. It supports various methods like GET, POST, PUT, DELETE, and PATCH, allowing you to interact with virtually any API endpoint.
<div className="flex justify-center">
<Image
src="/static/blocks/api.png"
alt="API Block"
width={500}
height={400}
className="my-6"
/>
</div>
<ThemeImage
lightSrc="/static/light/api-light.png"
darkSrc="/static/dark/api-dark.png"
alt="API Block"
width={350}
height={175}
/>
## Overview
@@ -38,15 +37,6 @@ The API block enables you to:
</Step>
</Steps>
## How It Works
The API block processes HTTP requests through a structured approach:
1. **Configure Request** - Set URL, method, headers, and body parameters
2. **Execute Request** - Send HTTP request to the specified endpoint
3. **Process Response** - Handle response data, status codes, and headers
4. **Error Handling** - Manage timeouts, retries, and error conditions
## Configuration Options
### URL
@@ -212,6 +202,18 @@ if (<api.status> === 200) {
</ol>
</div>
### Create Support Ticket
<div className="mb-4 rounded-md border p-4">
<h4 className="font-medium">Scenario: Submit support request to ticketing system</h4>
<ol className="list-decimal pl-5 text-sm">
<li>Agent analyzes user issue and generates ticket data</li>
<li>API block POSTs ticket to support system</li>
<li>Condition block checks if ticket was created successfully</li>
<li>Response block confirms ticket creation with ID</li>
</ol>
</div>
### Payment Processing
<div className="mb-4 rounded-md border p-4">
@@ -220,7 +222,7 @@ if (<api.status> === 200) {
<li>Function block validates payment data</li>
<li>API block creates payment intent via Stripe</li>
<li>Condition block handles payment success/failure</li>
<li>Supabase block updates order status in database</li>
<li>Function block updates order status in database</li>
</ol>
</div>

View File

@@ -1,24 +1,23 @@
---
title: Condition
description: Create conditional logic and branching in your workflows
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Step, Steps } from 'fumadocs-ui/components/steps'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'
import { Image } from '@/components/ui/image'
import { ThemeImage } from '@/components/ui/theme-image'
The Condition block allows you to branch your workflow execution path based on boolean expressions, enabling you to create dynamic, responsive workflows with different execution paths. It evaluates conditions and routes the workflow accordingly, letting you control execution flow based on data or logic without requiring an LLM.
The Condition block allows you to branch your workflow execution path based on boolean expressions. It evaluates conditions and routes the workflow accordingly, enabling you to create dynamic, responsive workflows with different execution paths.
<div className="flex justify-center">
<Image
src="/static/blocks/condition.png"
alt="Condition Block"
width={500}
height={350}
className="my-6"
/>
</div>
<ThemeImage
lightSrc="/static/light/condition-light.png"
darkSrc="/static/dark/condition-dark.png"
alt="Condition Block"
width={350}
height={175}
/>
<Callout>
Condition blocks enable deterministic decision-making without requiring an LLM, making them ideal

View File

@@ -0,0 +1,131 @@
---
title: Evaluator
description: Assess content quality using customizable evaluation metrics
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Step, Steps } from 'fumadocs-ui/components/steps'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { ThemeImage } from '@/components/ui/theme-image'
import { Video } from '@/components/ui/video'
The Evaluator block uses AI to score and assess content quality based on metrics you define. Perfect for quality control, A/B testing, and ensuring your AI outputs meet specific standards.
<ThemeImage
lightSrc="/static/light/evaluator-light.png"
darkSrc="/static/dark/evaluator-dark.png"
alt="Evaluator Block Configuration"
width={350}
height={175}
/>
## What You Can Evaluate
**AI-Generated Content**: Score chatbot responses, generated articles, or marketing copy
**User Input**: Evaluate customer feedback, survey responses, or form submissions
**Content Quality**: Assess clarity, accuracy, relevance, and tone
**Performance Metrics**: Track improvements over time with consistent scoring
**A/B Testing**: Compare different approaches with objective metrics
## Configuration Options
### Evaluation Metrics
Define custom metrics to evaluate content against. Each metric includes:
- **Name**: A short identifier for the metric
- **Description**: A detailed explanation of what the metric measures
- **Range**: The numeric range for scoring (e.g., 1-5, 0-10)
Example metrics:
```
Accuracy (1-5): How factually accurate is the content?
Clarity (1-5): How clear and understandable is the content?
Relevance (1-5): How relevant is the content to the original query?
```
### Content
The content to be evaluated. This can be:
- Directly provided in the block configuration
- Connected from another block's output (typically an Agent block)
- Dynamically generated during workflow execution
### Model Selection
Choose an AI model to perform the evaluation:
**OpenAI**: GPT-4o, o1, o3, o4-mini, gpt-4.1
**Anthropic**: Claude 3.7 Sonnet
**Google**: Gemini 2.5 Pro, Gemini 2.0 Flash
**Other Providers**: Groq, Cerebras, xAI, DeepSeek
**Local Models**: Any model running on Ollama
<div className="w-full max-w-2xl mx-auto overflow-hidden rounded-lg">
<Video src="models.mp4" />
</div>
**Recommendation**: Use models with strong reasoning capabilities like GPT-4o or Claude 3.7 Sonnet for more accurate evaluations.
### API Key
Your API key for the selected LLM provider. This is securely stored and used for authentication.
## How It Works
1. The Evaluator block takes the provided content and your custom metrics
2. It generates a specialized prompt that instructs the LLM to evaluate the content
3. The prompt includes clear guidelines on how to score each metric
4. The LLM evaluates the content and returns numeric scores for each metric
5. The Evaluator block formats these scores as structured output for use in your workflow
## Inputs and Outputs
### Inputs
- **Content**: The text or structured data to evaluate
- **Metrics**: Custom evaluation criteria with scoring ranges
- **Model Settings**: LLM provider and parameters
### Outputs
- **Content**: A summary of the evaluation
- **Model**: The model used for evaluation
- **Tokens**: Usage statistics
- **Metric Scores**: Numeric scores for each defined metric
## Example Usage
Here's an example of how an Evaluator block might be configured for assessing customer service responses:
```yaml
# Example Evaluator Configuration
metrics:
- name: Empathy
description: How well does the response acknowledge and address the customer's emotional state?
range:
min: 1
max: 5
- name: Solution
description: How effectively does the response solve the customer's problem?
range:
min: 1
max: 5
- name: Clarity
description: How clear and easy to understand is the response?
range:
min: 1
max: 5
model: Anthropic/claude-3-opus
```
## Best Practices
- **Use specific metric descriptions**: Clearly define what each metric measures to get more accurate evaluations
- **Choose appropriate ranges**: Select scoring ranges that provide enough granularity without being overly complex
- **Connect with Agent blocks**: Use Evaluator blocks to assess Agent block outputs and create feedback loops
- **Use consistent metrics**: For comparative analysis, maintain consistent metrics across similar evaluations
- **Combine multiple metrics**: Use several metrics to get a comprehensive evaluation

View File

@@ -0,0 +1,313 @@
---
title: Function
description: Execute custom JavaScript or TypeScript code in your workflows
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Step, Steps } from 'fumadocs-ui/components/steps'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { ThemeImage } from '@/components/ui/theme-image'
The Function block lets you run custom JavaScript or TypeScript code in your workflow. Use it to transform data, perform calculations, or implement custom logic that isn't available in other blocks.
<ThemeImage
lightSrc="/static/light/function-light.png"
darkSrc="/static/dark/function-dark.png"
alt="Function Block with Code Editor"
width={350}
height={175}
/>
## Overview
The Function block enables you to:
<Steps>
<Step>
<strong>Transform data</strong>: Convert formats, parse text, manipulate arrays and objects
</Step>
<Step>
<strong>Perform calculations</strong>: Math operations, statistics, financial calculations
</Step>
<Step>
<strong>Implement custom logic</strong>: Complex conditionals, loops, and algorithms
</Step>
<Step>
<strong>Process external data</strong>: Parse responses, format requests, handle authentication
</Step>
</Steps>
## How It Works
The Function block runs your code in a secure, isolated environment:
1. **Receive Input**: Access data from previous blocks via the `input` object
2. **Execute Code**: Run your JavaScript/TypeScript code
3. **Return Results**: Use `return` to pass data to the next block
4. **Handle Errors**: Built-in error handling and logging
## Configuration Options
### Code Editor
Write your JavaScript/TypeScript code in a full-featured editor with:
- Syntax highlighting and error checking
- Line numbers and bracket matching
- Support for modern JavaScript features
- Native support for `fetch`
### Accessing Input Data
Use the `input` object to access data from previous blocks:
```javascript
// Access data from connected blocks
const userData = <agent.userData>;
const orderData = <agent.orderData>;
// Access specific fields
const customerName = <agent.customer.name>;
const total = <agent.order.total>;
```
### Common Examples
**Data Transformation**:
```javascript
// Convert and format data
const formatted = {
name: <agent.user.firstName> + ' ' + <agent.user.lastName>,
email: <agent.user.email>.toLowerCase(),
joinDate: new Date(<agent.user.created>).toLocaleDateString()
};
return formatted;
```
**Calculations**:
```javascript
// Calculate discounts and totals
const subtotal = <agent.items>.reduce((sum, item) => sum + item.price, 0);
const discount = subtotal > 100 ? 0.1 : 0;
const total = subtotal * (1 - discount);
return { subtotal, discount, total };
```
**Data Validation**:
```javascript
// Validate email format
const email = <agent.email>;
const isValid = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
if (!isValid) {
throw new Error('Invalid email format');
}
return { email, isValid };
```
### Accessing Results
After a function executes, you can access its outputs:
- **`<function.result>`**: The value returned from your function
- **`<function.stdout>`**: Any console.log() output from your code
## Advanced Features
### Async/Await Support
Use async functions for complex operations:
```javascript
// Async function example
const processData = async () => {
const data = <api.response>;
// Process data with async operations
const processed = await Promise.all(
data.map(async (item) => {
return {
id: item.id,
processed: true,
timestamp: new Date().toISOString()
};
})
);
return processed;
};
return await processData();
```
### Error Handling
Implement robust error handling:
```javascript
try {
const result = <api.data>;
if (!result || !result.length) {
throw new Error('No data received');
}
return result.map(item => ({
id: item.id,
name: item.name.trim(),
valid: true
}));
} catch (error) {
console.error('Processing failed:', error.message);
return { error: error.message, valid: false };
}
```
### Performance Optimization
Optimize for large datasets:
```javascript
// Efficient data processing
const data = <api.large_dataset>;
// Use efficient array methods
const processed = data
.filter(item => item.status === 'active')
.map(item => ({
id: item.id,
summary: item.description.substring(0, 100)
}))
.slice(0, 1000); // Limit results
return processed;
```
## Security and Limitations
<Callout type="warning">
Functions run in a secure environment with these restrictions:
- **Execution timeout**: 30 seconds maximum to prevent infinite loops
- **Memory limits**: Limited memory to prevent resource exhaustion
- **No network access**: Cannot make HTTP requests (use API blocks instead)
- **Limited APIs**: Only safe JavaScript APIs are available
</Callout>
## Inputs and Outputs
<Tabs items={['Configuration', 'Variables', 'Results']}>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>Code</strong>: Your JavaScript/TypeScript code to execute
</li>
<li>
<strong>Timeout</strong>: Maximum execution time (defaults to 30 seconds)
</li>
<li>
<strong>Input Data</strong>: All connected block outputs available via variables
</li>
</ul>
</Tab>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>function.result</strong>: The value returned from your function
</li>
<li>
<strong>function.stdout</strong>: Console.log() output from your code
</li>
<li>
<strong>function.error</strong>: Error details if function failed
</li>
<li>
<strong>function.execution_time</strong>: Time taken to execute
</li>
</ul>
</Tab>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>Function Result</strong>: Primary output from your code
</li>
<li>
<strong>Debug Information</strong>: Logs and execution details
</li>
<li>
<strong>Access</strong>: Available in blocks after the function
</li>
</ul>
</Tab>
</Tabs>
## Example Use Cases
### Data Processing Pipeline
<div className="mb-4 rounded-md border p-4">
<h4 className="font-medium">Scenario: Transform API response into structured data</h4>
<ol className="list-decimal pl-5 text-sm">
<li>API block fetches raw customer data</li>
<li>Function block processes and validates data</li>
<li>Function block calculates derived metrics</li>
<li>Response block returns formatted results</li>
</ol>
</div>
### Business Logic Implementation
<div className="mb-4 rounded-md border p-4">
<h4 className="font-medium">Scenario: Calculate loyalty scores and tiers</h4>
<ol className="list-decimal pl-5 text-sm">
<li>Agent retrieves customer purchase history</li>
<li>Function block calculates loyalty metrics</li>
<li>Function block determines customer tier</li>
<li>Condition block routes based on tier level</li>
</ol>
</div>
### Data Validation and Sanitization
<div className="mb-4 rounded-md border p-4">
<h4 className="font-medium">Scenario: Validate and clean user input</h4>
<ol className="list-decimal pl-5 text-sm">
<li>User input received from form submission</li>
<li>Function block validates email format and phone numbers</li>
<li>Function block sanitizes and normalizes data</li>
<li>API block saves validated data to database</li>
</ol>
</div>
### Example: Loyalty Score Calculator
```javascript title="loyalty-calculator.js"
// Process customer data and calculate loyalty score
const { purchaseHistory, accountAge, supportTickets } = <agent>;
// Calculate metrics
const totalSpent = purchaseHistory.reduce((sum, purchase) => sum + purchase.amount, 0);
const purchaseFrequency = purchaseHistory.length / (accountAge / 365);
const ticketRatio = supportTickets.resolved / supportTickets.total;
// Calculate loyalty score (0-100)
const spendScore = Math.min(totalSpent / 1000 * 30, 30);
const frequencyScore = Math.min(purchaseFrequency * 20, 40);
const supportScore = ticketRatio * 30;
const loyaltyScore = Math.round(spendScore + frequencyScore + supportScore);
return {
customer: <agent.name>,
loyaltyScore,
loyaltyTier: loyaltyScore >= 80 ? "Platinum" : loyaltyScore >= 60 ? "Gold" : "Silver",
metrics: { spendScore, frequencyScore, supportScore }
};
```
## Best Practices
- **Keep functions focused**: Write functions that do one thing well to improve maintainability and debugging
- **Handle errors gracefully**: Use try/catch blocks to handle potential errors and provide meaningful error messages
- **Test edge cases**: Ensure your code handles unusual inputs, null values, and boundary conditions correctly
- **Optimize for performance**: Be mindful of computational complexity and memory usage for large datasets
- **Use console.log() for debugging**: Leverage stdout output to debug and monitor function execution

View File

@@ -6,12 +6,13 @@ description: The building components of your AI workflows
import { Card, Cards } from 'fumadocs-ui/components/card'
import { Step, Steps } from 'fumadocs-ui/components/steps'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { BlockTypes } from '@/components/ui/block-types'
import { Video } from '@/components/ui/video'
Blocks are the building components you connect together to create AI workflows. Think of them as specialized modules that each handle a specific task—from chatting with AI models to making API calls or processing data.
<div className="w-full max-w-2xl mx-auto overflow-hidden rounded-lg">
<Video src="connections.mp4" width={700} height={450} />
<Video src="connections.mp4" />
</div>
## Core Block Types
@@ -31,6 +32,8 @@ Sim provides seven core block types that handle the essential functions of AI wo
### Output Blocks
- **[Response](/blocks/response)** - Format and return final results from your workflow
<BlockTypes />
## How Blocks Work
Each block has three main components:
@@ -60,7 +63,7 @@ You create workflows by connecting blocks together. The output of one block beco
- **Branching paths**: Some blocks can route to different paths based on conditions
<div className="w-full max-w-2xl mx-auto overflow-hidden rounded-lg">
<Video src="connections.mp4" width={700} height={450} />
<Video src="connections.mp4" />
</div>
## Common Patterns

View File

@@ -1,15 +1,22 @@
---
title: Loop
description: Create iterative workflows with loops that execute blocks repeatedly
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Step, Steps } from 'fumadocs-ui/components/steps'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { Image } from '@/components/ui/image'
import { ThemeImage } from '@/components/ui/theme-image'
The Loop block is a container block in Sim that allows you to create iterative workflows by executing a group of blocks repeatedly. Loops enable iterative processing in your workflows.
The Loop block is a container block in Sim that allows you to execute a group of blocks repeatedly. Loops enable iterative processing in your workflows.
The Loop block supports two types of iteration:
<ThemeImage
lightSrc="/static/light/loop-light.png"
darkSrc="/static/dark/loop-dark.png"
alt="Loop Block"
width={500}
height={300}
/>
<Callout type="info">
Loop blocks are container nodes that can hold other blocks inside them. The blocks inside a loop will execute multiple times based on your configuration.
@@ -26,23 +33,8 @@ The Loop block enables you to:
<Step>
<strong>Repeat operations</strong>: Execute blocks a fixed number of times
</Step>
<Step>
<strong>Sequential processing</strong>: Handle data transformation in ordered iterations
</Step>
<Step>
<strong>Aggregate results</strong>: Collect outputs from all loop iterations
</Step>
</Steps>
## How It Works
The Loop block executes contained blocks through sequential iteration:
1. **Initialize Loop** - Set up iteration parameters (count or collection)
2. **Execute Iteration** - Run contained blocks for current iteration
3. **Collect Results** - Store output from each iteration
4. **Continue or Complete** - Move to next iteration or finish loop
## Configuration Options
### Loop Type
@@ -51,19 +43,7 @@ Choose between two types of loops:
<Tabs items={['For Loop', 'ForEach Loop']}>
<Tab>
**For Loop (Iterations)** - A numeric loop that executes a fixed number of times:
<div className="flex justify-center">
<Image
src="/static/blocks/loop-1.png"
alt="For Loop with iterations"
width={500}
height={400}
className="my-6"
/>
</div>
Use this when you need to repeat an operation a specific number of times.
A numeric loop that executes a fixed number of times. Use this when you need to repeat an operation a specific number of times.
```
Example: Run 5 times
@@ -75,19 +55,7 @@ Choose between two types of loops:
```
</Tab>
<Tab>
**ForEach Loop (Collection)** - A collection-based loop that iterates over each item in an array or object:
<div className="flex justify-center">
<Image
src="/static/blocks/loop-2.png"
alt="ForEach Loop with collection"
width={500}
height={400}
className="my-6"
/>
</div>
Use this when you need to process a collection of items.
A collection-based loop that iterates over each item in an array or object. Use this when you need to process a collection of items.
```
Example: Process ["apple", "banana", "orange"]

View File

@@ -0,0 +1,15 @@
{
"title": "Blocks",
"pages": [
"agent",
"api",
"condition",
"evaluator",
"function",
"loop",
"parallel",
"response",
"router",
"workflow"
]
}

View File

@@ -1,15 +1,22 @@
---
title: Parallel
description: Execute multiple blocks concurrently for faster workflow processing
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Step, Steps } from 'fumadocs-ui/components/steps'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { Image } from '@/components/ui/image'
import { ThemeImage } from '@/components/ui/theme-image'
The Parallel block is a container block in Sim that allows you to execute multiple instances of blocks concurrently for faster workflow processing.
The Parallel block is a container block in Sim that allows you to execute multiple instances of blocks concurrently.
The Parallel block supports two types of concurrent execution:
<ThemeImage
lightSrc="/static/light/parallel-light.png"
darkSrc="/static/dark/parallel-dark.png"
alt="Parallel Block"
width={500}
height={300}
/>
<Callout type="info">
Parallel blocks are container nodes that execute their contents multiple times simultaneously, unlike loops which execute sequentially.
@@ -42,19 +49,7 @@ Choose between two types of parallel execution:
<Tabs items={['Count-based', 'Collection-based']}>
<Tab>
**Count-based Parallel** - Execute a fixed number of parallel instances:
<div className="flex justify-center">
<Image
src="/static/blocks/parallel-1.png"
alt="Count-based parallel execution"
width={500}
height={400}
className="my-6"
/>
</div>
Use this when you need to run the same operation multiple times concurrently.
Execute a fixed number of parallel instances. Use this when you need to run the same operation multiple times concurrently.
```
Example: Run 5 parallel instances
@@ -66,19 +61,7 @@ Choose between two types of parallel execution:
```
</Tab>
<Tab>
**Collection-based Parallel** - Distribute a collection across parallel instances:
<div className="flex justify-center">
<Image
src="/static/blocks/parallel-2.png"
alt="Collection-based parallel execution"
width={500}
height={400}
className="my-6"
/>
</div>
Each instance processes one item from the collection simultaneously.
Distribute a collection across parallel instances. Each instance processes one item from the collection simultaneously.
```
Example: Process ["task1", "task2", "task3"] in parallel
@@ -122,8 +105,8 @@ After a parallel block completes, you can access aggregated results:
<div className="mb-4 rounded-md border p-4">
<h4 className="font-medium">Scenario: Get responses from multiple AI models</h4>
<ol className="list-decimal pl-5 text-sm">
<li>Collection-based parallel over a list of model IDs (e.g., ["gpt-4o", "claude-3.7-sonnet", "gemini-2.5-pro"])</li>
<li>Inside parallel: Agent's model is set to the current item from the collection</li>
<li>Count-based parallel set to 3 instances</li>
<li>Inside parallel: Agent configured with different model per instance</li>
<li>After parallel: Compare and select best response</li>
</ol>
</div>

View File

@@ -0,0 +1,186 @@
---
title: Response
description: Send a structured response back to API calls
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Step, Steps } from 'fumadocs-ui/components/steps'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { ThemeImage } from '@/components/ui/theme-image'
The Response block is the final step in your workflow that formats and returns data to whoever called your workflow. It's like the "return" statement for your entire workflow—it packages up results and sends them back.
<ThemeImage
lightSrc="/static/light/response-light.png"
darkSrc="/static/dark/response-dark.png"
alt="Response Block Configuration"
width={350}
height={175}
/>
<Callout type="info">
Response blocks are terminal blocks - they end the workflow execution and cannot connect to other blocks.
</Callout>
## When You Need Response Blocks
**API Endpoints**: When your workflow is called via API, Response blocks format the return data
**Webhooks**: Return confirmation or data back to the calling system
**Testing**: See formatted results when testing your workflow
**Data Export**: Structure data for external systems or reports
## Two Ways to Build Responses
### Builder Mode (Recommended)
Visual interface for building response structure:
- Drag and drop fields
- Reference workflow variables easily
- Visual preview of response structure
### Editor Mode (Advanced)
Write JSON directly:
- Full control over response format
- Support for complex nested structures
- Use `<variable.name>` syntax for dynamic values
## Configuration Options
### Response Data
The response data is the main content that will be sent back to the API caller. This should be formatted as JSON and can include:
- Static values
- Dynamic references to workflow variables using the `<variable.name>` syntax
- Nested objects and arrays
- Any valid JSON structure
### Status Code
Set the HTTP status code for the response. Common status codes include:
<Tabs items={['Success (2xx)', 'Client Error (4xx)', 'Server Error (5xx)']}>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li><strong>200</strong>: OK - Standard success response</li>
<li><strong>201</strong>: Created - Resource successfully created</li>
<li><strong>204</strong>: No Content - Success with no response body</li>
</ul>
</Tab>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li><strong>400</strong>: Bad Request - Invalid request parameters</li>
<li><strong>401</strong>: Unauthorized - Authentication required</li>
<li><strong>404</strong>: Not Found - Resource doesn't exist</li>
<li><strong>422</strong>: Unprocessable Entity - Validation errors</li>
</ul>
</Tab>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li><strong>500</strong>: Internal Server Error - Server-side error</li>
<li><strong>502</strong>: Bad Gateway - External service error</li>
<li><strong>503</strong>: Service Unavailable - Service temporarily down</li>
</ul>
</Tab>
</Tabs>
<p className="mt-4 text-sm text-gray-600 dark:text-gray-400">
Default status code is 200 if not specified.
</p>
### Response Headers
Configure additional HTTP headers to include in the response.
Headers are configured as key-value pairs:
| Key | Value |
|-----|-------|
| Content-Type | application/json |
| Cache-Control | no-cache |
| X-API-Version | 1.0 |
## Inputs and Outputs
<Tabs items={['Inputs', 'Outputs']}>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>data</strong> (JSON, optional): The JSON data to send in the response body
</li>
<li>
<strong>status</strong> (number, optional): HTTP status code (default: 200)
</li>
<li>
<strong>headers</strong> (JSON, optional): Additional response headers
</li>
</ul>
</Tab>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li><strong>data</strong>: The response body data</li>
<li><strong>status</strong>: HTTP status code</li>
<li><strong>headers</strong>: Response headers</li>
</ul>
</Tab>
</Tabs>
## Variable References
Use the `<variable.name>` syntax to dynamically insert workflow variables into your response:
```json
{
"user": {
"id": "<variable.userId>",
"name": "<variable.userName>",
"email": "<variable.userEmail>"
},
"query": "<variable.searchQuery>",
"results": "<variable.searchResults>",
"totalFound": "<variable.resultCount>",
"processingTime": "<variable.executionTime>ms"
}
```
<Callout type="warning">
Variable names are case-sensitive and must match exactly with the variables available in your workflow.
</Callout>
## Example Usage
Here's an example of how a Response block might be configured for a user search API:
```yaml
data: |
{
"success": true,
"data": {
"users": "<variable.searchResults>",
"pagination": {
"page": "<variable.currentPage>",
"limit": "<variable.pageSize>",
"total": "<variable.totalUsers>"
}
},
"query": {
"searchTerm": "<variable.searchTerm>",
"filters": "<variable.appliedFilters>"
},
"timestamp": "<variable.timestamp>"
}
status: 200
headers:
- key: X-Total-Count
value: <variable.totalUsers>
- key: Cache-Control
value: public, max-age=300
```
## Best Practices
- **Use meaningful status codes**: Choose appropriate HTTP status codes that accurately reflect the outcome of the workflow
- **Structure your responses consistently**: Maintain a consistent JSON structure across all your API endpoints for better developer experience
- **Include relevant metadata**: Add timestamps and version information to help with debugging and monitoring
- **Handle errors gracefully**: Use conditional logic in your workflow to set appropriate error responses with descriptive messages
- **Validate variable references**: Ensure all referenced variables exist and contain the expected data types before the Response block executes

View File

@@ -1,25 +1,24 @@
---
title: Router
description: Route workflow execution based on specific conditions or logic
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Step, Steps } from 'fumadocs-ui/components/steps'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'
import { Image } from '@/components/ui/image'
import { ThemeImage } from '@/components/ui/theme-image'
import { Video } from '@/components/ui/video'
The Router block uses AI to intelligently decide which path your workflow should take next, routing workflow execution based on specific conditions or logic. Unlike Condition blocks that use simple rules, Router blocks can understand context and make smart routing decisions based on content analysis.
The Router block uses AI to intelligently decide which path your workflow should take next. Unlike Condition blocks that use simple rules, Router blocks can understand context and make smart routing decisions based on content analysis.
<div className="flex justify-center">
<Image
src="/static/blocks/router.png"
alt="Router Block with Multiple Paths"
width={500}
height={400}
className="my-6"
/>
</div>
<ThemeImage
lightSrc="/static/light/router-light.png"
darkSrc="/static/dark/router-dark.png"
alt="Router Block with Multiple Paths"
width={350}
height={175}
/>
## Overview
@@ -105,7 +104,7 @@ Choose an AI model to power the routing decision:
**Local Models**: Any model running on Ollama
<div className="w-full max-w-2xl mx-auto overflow-hidden rounded-lg">
<Video src="router-model-dropdown.mp4" width={500} height={350} />
<Video src="router-model-dropdown.mp4" />
</div>
**Recommendation**: Use models with strong reasoning capabilities like GPT-4o or Claude 3.7 Sonnet for more accurate routing decisions.
@@ -118,10 +117,9 @@ Your API key for the selected LLM provider. This is securely stored and used for
After a router makes a decision, you can access its outputs:
- **`<router.prompt>`**: Summary of the routing prompt used
- **`<router.content>`**: Summary of the routing decision made
- **`<router.selected_path>`**: Details of the chosen destination block
- **`<router.tokens>`**: Token usage statistics from the LLM
- **`<router.cost>`**: Cost summary for the routing call (input, output, total)
- **`<router.model>`**: The model used for decision-making
## Advanced Features
@@ -137,9 +135,34 @@ Target Block 2: "Billing inquiries, subscription changes, payment issues"
Target Block 3: "General questions, feedback, feature requests"
```
### Multi-Model Routing
Use different models for different routing scenarios:
```javascript
// Fast routing for simple cases
Model: GPT-4o-mini
Criteria: Simple, common routing patterns
// Complex routing for nuanced decisions
Model: Claude 3.7 Sonnet
Criteria: Complex content analysis required
```
### Fallback Handling
Implement robust fallback mechanisms:
```javascript
// Router configuration
Primary Targets: ["Support", "Sales", "Technical"]
Fallback Target: "General" // Default when no specific match
Confidence Threshold: 0.7 // Minimum confidence for routing
```
## Inputs and Outputs
<Tabs items={['Configuration', 'Variables']}>
<Tabs items={['Configuration', 'Variables', 'Results']}>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
@@ -159,7 +182,7 @@ Target Block 3: "General questions, feedback, feature requests"
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>router.prompt</strong>: Summary of routing prompt used
<strong>router.content</strong>: Summary of routing decision
</li>
<li>
<strong>router.selected_path</strong>: Details of chosen destination
@@ -168,10 +191,20 @@ Target Block 3: "General questions, feedback, feature requests"
<strong>router.tokens</strong>: Token usage statistics
</li>
<li>
<strong>router.cost</strong>: Cost summary for the routing call (input, output, total)
<strong>router.model</strong>: Model used for decision-making
</li>
</ul>
</Tab>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>Routing Decision</strong>: Primary path selection result
</li>
<li>
<strong>router.model</strong>: Model used for decision-making
<strong>Decision Context</strong>: Analysis summary and reasoning
</li>
<li>
<strong>Access</strong>: Available in blocks after the router
</li>
</ul>
</Tab>

View File

@@ -1,23 +1,22 @@
---
title: Workflow
description: Execute other workflows as reusable components within your current workflow
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Step, Steps } from 'fumadocs-ui/components/steps'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { Image } from '@/components/ui/image'
import { ThemeImage } from '@/components/ui/theme-image'
The Workflow block allows you to execute other workflows as reusable components within your current workflow. This enables modular design, code reuse, and the creation of complex nested workflows that can be composed from smaller, focused workflows.
The Workflow block allows you to execute other workflows as reusable components within your current workflow. This powerful feature enables modular design, code reuse, and the creation of complex nested workflows that can be composed from smaller, focused workflows.
<div className="flex justify-center">
<Image
src="/static/blocks/workflow.png"
alt="Workflow Block"
width={500}
height={350}
className="my-6"
/>
</div>
<ThemeImage
lightSrc="/static/light/workflow-light.png"
darkSrc="/static/dark/workflow-dark.png"
alt="Workflow Block"
width={300}
height={175}
/>
<Callout type="info">
Workflow blocks enable modular design by allowing you to compose complex workflows from smaller, reusable components.
@@ -47,9 +46,9 @@ The Workflow block serves as a bridge between workflows, enabling you to:
The Workflow block:
1. Takes a reference to another workflow in your workspace
2. Passes input data from the current workflow to the child workflow (available via start.input)
2. Passes input data from the current workflow to the child workflow
3. Executes the child workflow in an isolated context
4. Returns the result back to the parent workflow for further processing
4. Returns the results back to the parent workflow for further processing
## Configuration Options
@@ -61,6 +60,26 @@ Choose which workflow to execute from a dropdown list of available workflows in
- Workflows shared with you by other team members
- Both enabled and disabled workflows (though only enabled workflows can be executed)
### Input Data
Define the data to pass to the child workflow:
- **Single Variable Input**: Select a variable or block output to pass to the child workflow
- **Variable References**: Use `<variable.name>` to reference workflow variables
- **Block References**: Use `<blockName.field>` to reference outputs from previous blocks
- **Automatic Mapping**: The selected data is automatically available as `start.input` in the child workflow
- **Optional**: The input field is optional - child workflows can run without input data
- **Type Preservation**: Variable types (strings, numbers, objects, etc.) are preserved when passed to the child workflow
### Accessing Results
After a workflow executes, you can access its outputs:
- **`<workflow.response>`**: The complete output from the child workflow
- **`<workflow.name>`**: The name of the executed child workflow
- **`<workflow.success>`**: Boolean indicating successful completion
- **`<workflow.error>`**: Error details if the workflow failed
- **`<workflow.execution_time>`**: Time taken to execute the workflow
### Execution Context
@@ -69,12 +88,58 @@ The child workflow executes with:
- Its own isolated execution context
- Access to the same workspace resources (API keys, environment variables)
- Proper workspace membership and permission checks
- Nested tracespan in the execution log
- Independent logging and monitoring
## Safety and Limitations
To prevent infinite recursion and ensure system stability, the Workflow block includes several safety mechanisms:
<Callout type="warning">
**Cycle Detection**: The system automatically detects and prevents circular dependencies between workflows to avoid infinite loops.
</Callout>
- **Maximum Depth Limit**: Nested workflows are limited to a maximum depth of 10 levels
- **Cycle Detection**: Automatic detection and prevention of circular workflow dependencies
- **Timeout Protection**: Child workflows inherit timeout settings to prevent indefinite execution
- **Resource Limits**: Memory and execution time limits apply to prevent resource exhaustion
## Advanced Features
### Dynamic Workflow Selection
Select workflows dynamically based on runtime conditions:
```javascript
// In a Function block before the Workflow block
const workflowId = <condition.result> ? 'premium-workflow' : 'standard-workflow';
return { selectedWorkflow: workflowId };
```
### Error Handling and Fallbacks
Implement robust error handling for child workflows:
```javascript
// In a Function block after the Workflow block
if (!<workflow.success>) {
console.error('Child workflow failed:', <workflow.error>);
// Implement fallback logic
return { fallback: true, error: <workflow.error> };
}
return <workflow.response>;
```
### Workflow Chaining
Chain multiple workflows together:
```javascript
// Pass output from one workflow to another
Workflow 1 Input: <start.input>
Workflow 2 Input: <workflow1.response>
Workflow 3 Input: <workflow2.response>
```
## Inputs and Outputs
<Tabs items={['Configuration', 'Variables', 'Results']}>
@@ -93,18 +158,21 @@ The child workflow executes with:
</Tab>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>workflow.response</strong>: Complete output from child workflow
</li>
<li>
<strong>workflow.name</strong>: Name of executed child workflow
</li>
<li>
<strong>workflow.success</strong>: Boolean indicating completion status
</li>
<li>
<strong>workflow.childWorkflowName</strong>: Name of executed child workflow
</li>
<li>
<strong>workflow.result</strong>: Result returned by the child workflow
</li>
<li>
<strong>workflow.error</strong>: Error details if workflow failed
</li>
<li>
<strong>workflow.execution_time</strong>: Time taken to execute
</li>
</ul>
</Tab>
<Tab>
@@ -160,10 +228,32 @@ The child workflow executes with:
</ol>
</div>
### Example: Customer Validation Workflow
```javascript title="validation-workflow.js"
// Main workflow passes customer data to validation workflow
const customerData = <start.input>;
// Validation workflow processes the data
const emailValid = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(customerData.email);
const phoneValid = /^\+?[1-9]\d{1,14}$/.test(customerData.phone);
return {
customer: customerData,
validation: {
email: emailValid,
phone: phoneValid,
overall: emailValid && phoneValid
}
};
```
## Best Practices
- **Keep workflows focused**: Design child workflows to handle specific, well-defined tasks with clear inputs and outputs
- **Minimize nesting depth**: Avoid deeply nested workflow hierarchies for better maintainability and performance
- **Handle errors gracefully**: Implement proper error handling for child workflow failures and provide fallback mechanisms
- **Document dependencies**: Clearly document which workflows depend on others and maintain dependency maps
- **Test independently**: Ensure child workflows can be tested and validated independently from parent workflows
- **Monitor performance**: Be aware that nested workflows can impact overall execution time and resource usage
- **Use semantic naming**: Give workflows descriptive names that clearly indicate their purpose and functionality

View File

@@ -0,0 +1,190 @@
---
title: Accessing Connected Data
description: Techniques for accessing and manipulating data from connected blocks
---
import { Callout } from 'fumadocs-ui/components/callout'
import { File, Files, Folder } from 'fumadocs-ui/components/files'
Once blocks are connected, you can access data from source blocks in destination blocks using connection tags and various data access techniques.
## Basic Data Access
The simplest way to access data is through direct references using connection tags:
<Files>
<File name="Simple Property" annotation="<block.content>" />
<File name="Nested Property" annotation="<block.tokens.total>" />
<File name="Array Element" annotation="<block.items[0].name>" />
<File name="Complex Path" annotation="<block.data.users[2].profile.email>" />
</Files>
## Advanced Data Access Techniques
### Array Access
You can access array elements using square bracket notation:
```javascript
// Access the first item in an array
<block.items[0]>
// Access a specific property of an array item
<block.items[2].name>
// Access the last item in an array (in Function blocks)
const items = input.block.items;
const lastItem = items[items.length - 1];
```
### Object Property Access
Access object properties using dot notation:
```javascript
// Access a simple property
<block.content>
// Access a nested property
<block.data.user.profile.name>
// Access a property with special characters (in Function blocks)
const data = input.block.data;
const specialProp = data['property-with-dashes'];
```
### Dynamic References
Connection references are evaluated at runtime, allowing for dynamic data flow through your workflow:
```javascript
// In a Function block, you can access connected data
const userName = input.userBlock.name;
const orderTotal = input.apiBlock.body.order.total;
// Process the data
const discount = orderTotal > 100 ? 0.1 : 0;
const finalPrice = orderTotal * (1 - discount);
// Return the result
return {
userName,
originalTotal: orderTotal,
discount: discount * 100 + '%',
finalPrice
};
```
## Data Transformation
### Using Function Blocks
Function blocks are the most powerful way to transform data between connections:
```javascript
// Example: Transform API response data
const apiResponse = input.apiBlock.data;
const transformedData = {
users: apiResponse.results.map(user => ({
id: user.id,
fullName: `${user.firstName} ${user.lastName}`,
email: user.email.toLowerCase(),
isActive: user.status === 'active'
})),
totalCount: apiResponse.count,
timestamp: new Date().toISOString()
};
return transformedData;
```
### String Interpolation
You can combine connection tags with static text:
```
Hello, <userBlock.name>! Your order #<orderBlock.id> has been processed.
```
### Conditional Content
In Function blocks, you can create conditional content based on connected data:
```javascript
const user = input.userBlock;
const orderTotal = input.orderBlock.total;
let message = `Thank you for your order, ${user.name}!`;
if (orderTotal > 100) {
message += " You've qualified for free shipping!";
} else {
message += ` Add $${(100 - orderTotal).toFixed(2)} more to qualify for free shipping.`;
}
return { message };
```
## Handling Missing Data
It's important to handle cases where connected data might be missing or null:
<Callout type="warning">
Always validate connected data before using it, especially when accessing nested properties or
array elements.
</Callout>
### Default Values
In Function blocks, you can provide default values for missing data:
```javascript
const userName = input.userBlock?.name || 'Guest'
const items = input.orderBlock?.items || []
const total = input.orderBlock?.total ?? 0
```
### Conditional Checks
Check if data exists before accessing nested properties:
```javascript
let userEmail = 'No email provided'
if (input.userBlock && input.userBlock.contact && input.userBlock.contact.email) {
userEmail = input.userBlock.contact.email
}
```
### Optional Chaining
In Function blocks, use optional chaining to safely access nested properties:
```javascript
const userCity = input.userBlock?.address?.city
const firstItemName = input.orderBlock?.items?.[0]?.name
```
## Debugging Connection Data
When troubleshooting connection issues, these techniques can help:
1. **Log Data**: In Function blocks, use `console.log()` to inspect connected data
2. **Return Full Objects**: Return the full input object to see all available data
3. **Check Types**: Verify the data types of connected values
4. **Validate Paths**: Ensure you're using the correct path to access nested data
```javascript
// Example debugging function
function debugConnections() {
console.log('All inputs:', input)
console.log('User data type:', typeof input.userBlock)
console.log('Order items:', input.orderBlock?.items)
return {
debug: true,
allInputs: input,
userExists: !!input.userBlock,
orderItemCount: input.orderBlock?.items?.length || 0,
}
}
```

View File

@@ -0,0 +1,76 @@
---
title: Connection Basics
description: Learn how connections work in Sim
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Step, Steps } from 'fumadocs-ui/components/steps'
## How Connections Work
Connections are the pathways that allow data to flow between blocks in your workflow. When you connect two blocks in Sim, you're establishing a data flow relationship that defines how information passes from one block to another.
<Callout type="info">
Each connection represents a directed relationship where data flows from a source block's output
to a destination block's input.
</Callout>
### Creating Connections
<Steps>
<Step>
<strong>Select Source Block</strong>: Click on the output port of the block you want to connect
from
</Step>
<Step>
<strong>Draw Connection</strong>: Drag to the input port of the destination block
</Step>
<Step>
<strong>Confirm Connection</strong>: Release to create the connection
</Step>
<Step>
<strong>Configure (Optional)</strong>: Some connections may require additional configuration
</Step>
</Steps>
### Connection Flow
The flow of data through connections follows these principles:
1. **Directional Flow**: Data always flows from outputs to inputs
2. **Execution Order**: Blocks execute in order based on their connections
3. **Data Transformation**: Data may be transformed as it passes between blocks
4. **Conditional Paths**: Some blocks (like Router and Condition) can direct flow to different paths
### Connection Visualization
Connections are visually represented in the workflow editor:
- **Solid Lines**: Active connections that will pass data
- **Animated Flow**: During execution, data flow is visualized along connections
- **Color Coding**: Different connection types may have different colors
- **Connection Tags**: Visual indicators showing what data is available
### Managing Connections
You can manage your connections in several ways:
- **Delete**: Click on a connection and press Delete or use the context menu
- **Reroute**: Drag a connection to change its path
- **Inspect**: Click on a connection to see details about the data being passed
- **Disable**: Temporarily disable a connection without deleting it
<Callout type="warning">
Deleting a connection will immediately stop data flow between the blocks. Make sure this is
intended before removing connections.
</Callout>
## Connection Compatibility
Not all blocks can be connected to each other. Compatibility depends on:
1. **Data Type Compatibility**: The output type must be compatible with the input type
2. **Block Restrictions**: Some blocks may have restrictions on what they can connect to
3. **Workflow Logic**: Connections must make logical sense in the context of your workflow
The editor will indicate when connections are invalid or incompatible.

View File

@@ -0,0 +1,208 @@
---
title: Connection Best Practices
description: Recommended patterns for effective connection management
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Step, Steps } from 'fumadocs-ui/components/steps'
## Workflow Organization
### Organize Your Connections
Keep your workflow clean and understandable by organizing connections logically:
- **Minimize crossing connections** when possible to reduce visual complexity
- **Group related blocks together** to make data flow more intuitive
- **Use consistent flow direction** (typically left-to-right or top-to-bottom)
- **Label complex connections** with descriptive names
<Callout type="info">
A well-organized workflow is easier to understand, debug, and maintain. Take time to arrange your
blocks and connections in a logical manner.
</Callout>
### Connection Naming Conventions
When working with multiple connections, consistent naming helps maintain clarity:
<Steps>
<Step>
<strong>Use descriptive block names</strong>: Name blocks based on their function (e.g.,
"UserDataFetcher", "ResponseGenerator")
</Step>
<Step>
<strong>Be specific with connection references</strong>: Use clear variable names when
referencing connections in code
</Step>
<Step>
<strong>Document complex connections</strong>: Add comments explaining non-obvious data
transformations
</Step>
</Steps>
## Data Validation
### Validate Data Flow
Ensure that the data being passed between blocks is compatible:
- **Check that required fields are available** in the source block
- **Verify data types match expectations** before using them
- **Use Function blocks to transform data** when necessary
- **Handle missing or null values** with default values or conditional logic
```javascript
// Example: Validating and transforming data in a Function block
function processUserData() {
// Validate required fields
if (!input.userBlock || !input.userBlock.id) {
return { error: 'Missing user data', valid: false }
}
// Transform and validate data types
const userId = String(input.userBlock.id)
const userName = input.userBlock.name || 'Unknown User'
const userScore = Number(input.userBlock.score) || 0
return {
valid: true,
user: {
id: userId,
name: userName,
score: userScore,
isHighScore: userScore > 100,
},
}
}
```
## Documentation
### Document Connection Purpose
Add comments or descriptions to clarify the purpose of connections, especially in complex workflows:
- **What data is being passed**: Document the key fields and their purpose
- **Why this connection exists**: Explain the relationship between blocks
- **Any transformations or conditions applied**: Note any data processing that occurs
```javascript
// Example: Documenting connection purpose in a Function block
/*
* This function processes user data from the UserFetcher block
* and order history from the OrderHistory block to generate
* personalized product recommendations.
*
* Input:
* - userBlock: User profile data (id, preferences, history)
* - orderBlock: Recent order history (items, dates, amounts)
*
* Output:
* - recommendations: Array of recommended product IDs
* - userSegment: Calculated user segment for marketing
* - conversionProbability: Estimated likelihood of purchase
*/
function generateRecommendations() {
// Implementation...
}
```
## Testing and Debugging
### Test Connection References
Verify that connection references work as expected:
- **Test with different input values** to ensure robustness
- **Check edge cases** (empty values, large datasets, special characters)
- **Ensure error handling for missing or invalid data**
- **Use console logging in Function blocks** to debug connection issues
```javascript
// Example: Testing connection references with edge cases
function testConnections() {
console.log('Testing connections...')
// Log all inputs for debugging
console.log('All inputs:', JSON.stringify(input, null, 2))
// Test for missing data
const hasUserData = !!input.userBlock
console.log('Has user data:', hasUserData)
// Test edge cases
const items = input.orderBlock?.items || []
console.log('Item count:', items.length)
console.log('Empty items test:', items.length === 0 ? 'Passed' : 'Failed')
// Return test results
return {
tests: {
hasUserData,
hasItems: items.length > 0,
hasLargeOrder: items.length > 10,
},
}
}
```
## Performance Considerations
### Optimize Data Flow
Keep your workflows efficient by optimizing how data flows through connections:
- **Pass only necessary data** between blocks to reduce memory usage
- **Use Function blocks to filter large datasets** before passing them on
- **Consider caching results** for expensive operations
- **Break complex workflows into smaller, reusable components**
```javascript
// Example: Optimizing data flow by filtering
function optimizeUserData() {
const userData = input.userBlock
// Only pass necessary fields to downstream blocks
return {
id: userData.id,
name: userData.name,
email: userData.email,
// Filter out unnecessary profile data, history, etc.
}
}
```
## Security Best Practices
### Secure Sensitive Data
Protect sensitive information when using connections:
- **Never expose API keys or credentials** in connection data
- **Sanitize user input** before processing it
- **Redact sensitive information** when logging connection data
- **Use secure connections** for external API calls
<Callout type="warning">
Be careful when logging connection data that might contain sensitive information. Always redact or
mask sensitive fields like passwords, API keys, or personal information.
</Callout>
## Advanced Patterns
### Conditional Connections
Use Condition blocks to create dynamic workflows:
- **Route data based on content** to different processing paths
- **Implement fallback paths** for error handling
- **Create decision trees** for complex business logic
### Feedback Loops
Create more sophisticated workflows with feedback connections:
- **Implement iterative processing** by connecting later blocks back to earlier ones
- **Use Memory blocks** to store state between iterations
- **Set termination conditions** to prevent infinite loops

View File

@@ -1,11 +1,12 @@
---
title: Connection Data Structure
description: Understanding the data structure of different block outputs
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
When you connect blocks, understanding the data structure of different block outputs is important because the output data structure from the source block determines what values are available in the destination block. Each block type produces a specific output structure that you can reference in downstream blocks.
When you connect blocks, the output data structure from the source block determines what values are available in the destination block. Each block type produces a specific output structure that you can reference in downstream blocks.
<Callout type="info">
Understanding these data structures is essential for effectively using connection tags and
@@ -179,7 +180,7 @@ Some blocks may produce custom output structures based on their configuration:
Many block outputs contain nested data structures. You can access these using dot notation in connection tags:
```
<blockName.path.to.nested.data>
<blockId.path.to.nested.data>
```
For example:

View File

@@ -0,0 +1,4 @@
{
"title": "Connections",
"pages": ["basics", "tags", "data-structure", "accessing-data", "best-practices"]
}

View File

@@ -1,11 +1,12 @@
---
title: Connection Tags
description: Using connection tags to reference data between blocks
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Video } from '@/components/ui/video'
Connection tags are visual representations of the data available from connected blocks, providing an easy way to reference data between blocks and outputs from previous blocks in your workflow.
Connection tags are visual representations of the data available from connected blocks. They provide an easy way to reference outputs from previous blocks in your workflow.
<div className="mx-auto w-full overflow-hidden rounded-lg">
<Video src="connections.mp4" />
@@ -65,12 +66,12 @@ There are two primary ways to use connection tags in your workflows:
Connection tags use a simple syntax to reference data:
```
<blockName.path.to.data>
<blockId.path.to.data>
```
Where:
- `blockName` is the name of the source block
- `blockId` is the identifier of the source block
- `path.to.data` is the path to the specific data field
For example:

View File

@@ -1,13 +1,13 @@
---
title: Copilot
description: Build and edit workflows with Sim Copilot
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Card, Cards } from 'fumadocs-ui/components/card'
import { Image } from '@/components/ui/image'
import { MessageCircle, Package, Zap, Infinity as InfinityIcon, Brain, BrainCircuit } from 'lucide-react'
Copilot is your in-editor assistant that helps you build and edit workflows with Sim Copilot, as well as understand and improve them. It can:
Copilot is your in-editor assistant that helps you build, understand, and improve workflows. It can:
- **Explain**: Answer questions about Sim and your current workflow
- **Guide**: Suggest edits and best practices
@@ -19,29 +19,6 @@ Copilot is your in-editor assistant that helps you build and edit workflows with
2. Set `COPILOT_API_KEY` in your self-hosted environment to that value
</Callout>
## Context Menu (@)
Use the `@` symbol to reference various resources and give Copilot more context about your workspace:
<Image
src="/static/copilot/copilot-menu.png"
alt="Copilot context menu showing available reference options"
width={600}
height={400}
/>
The `@` menu provides access to:
- **Chats**: Reference previous copilot conversations
- **All workflows**: Reference any workflow in your workspace
- **Workflow Blocks**: Reference specific blocks from workflows
- **Blocks**: Reference block types and templates
- **Knowledge**: Reference your uploaded documents and knowledgebase
- **Docs**: Reference Sim documentation
- **Templates**: Reference workflow templates
- **Logs**: Reference execution logs and results
This contextual information helps Copilot provide more accurate and relevant assistance for your specific use case.
## Modes
<Cards>
@@ -114,49 +91,4 @@ This contextual information helps Copilot provide more accurate and relevant ass
>
<div className="m-0 text-sm">Maximum reasoning for deep planning, debugging, and complex architectural changes.</div>
</Card>
</Cards>
### Mode Selection Interface
You can easily switch between different reasoning modes using the mode selector in the Copilot interface:
<Image
src="/static/copilot/copilot-models.png"
alt="Copilot mode selection showing Advanced mode with MAX toggle"
width={600}
height={300}
/>
The interface allows you to:
- **Select reasoning level**: Choose from Fast, Auto, Advanced, or Behemoth
- **Enable MAX mode**: Toggle for maximum reasoning capabilities when you need the most thorough analysis
- **See mode descriptions**: Understand what each mode is optimized for
Choose your mode based on the complexity of your task - use Fast for simple questions and Behemoth for complex architectural changes.
## Billing and Cost Calculation
### How Costs Are Calculated
Copilot usage is billed per token from the underlying LLM:
- **Input tokens**: billed at the provider's base rate (**at-cost**)
- **Output tokens**: billed at **1.5×** the provider's base output rate
```javascript
copilotCost = (inputTokens × inputPrice + outputTokens × (outputPrice × 1.5)) / 1,000,000
```
| Component | Rate Applied |
|----------|----------------------|
| Input | inputPrice |
| Output | outputPrice × 1.5 |
<Callout type="warning">
Pricing shown reflects rates as of September 4, 2025. Check provider documentation for current pricing.
</Callout>
<Callout type="info">
Model prices are per million tokens. The calculation divides by 1,000,000 to get the actual cost. See <a href="/execution/costs">the Cost Calculation page</a> for background and examples.
</Callout>
</Cards>

View File

@@ -0,0 +1,4 @@
{
"title": "Copilot",
"pages": ["index"]
}

View File

@@ -1,199 +0,0 @@
---
title: Evaluator
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Step, Steps } from 'fumadocs-ui/components/steps'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { Image } from '@/components/ui/image'
import { Video } from '@/components/ui/video'
The Evaluator block uses AI to score and assess content quality using customizable evaluation metrics that you define. Perfect for quality control, A/B testing, and ensuring your AI outputs meet specific standards.
<div className="flex justify-center">
<Image
src="/static/blocks/evaluator.png"
alt="Evaluator Block Configuration"
width={500}
height={400}
className="my-6"
/>
</div>
## Overview
The Evaluator block enables you to:
<Steps>
<Step>
<strong>Score Content Quality</strong>: Use AI to evaluate content against custom metrics with numeric scores
</Step>
<Step>
<strong>Define Custom Metrics</strong>: Create specific evaluation criteria tailored to your use case
</Step>
<Step>
<strong>Automate Quality Control</strong>: Build workflows that automatically assess and filter content
</Step>
<Step>
<strong>Track Performance</strong>: Monitor improvements and consistency over time with objective scoring
</Step>
</Steps>
## How It Works
The Evaluator block processes content through AI-powered assessment:
1. **Receive Content** - Takes input content from previous blocks in your workflow
2. **Apply Metrics** - Evaluates content against your defined custom metrics
3. **Generate Scores** - AI model assigns numeric scores for each metric
4. **Provide Summary** - Returns detailed evaluation with scores and explanations
## Configuration Options
### Evaluation Metrics
Define custom metrics to evaluate content against. Each metric includes:
- **Name**: A short identifier for the metric
- **Description**: A detailed explanation of what the metric measures
- **Range**: The numeric range for scoring (e.g., 1-5, 0-10)
Example metrics:
```
Accuracy (1-5): How factually accurate is the content?
Clarity (1-5): How clear and understandable is the content?
Relevance (1-5): How relevant is the content to the original query?
```
### Content
The content to be evaluated. This can be:
- Directly provided in the block configuration
- Connected from another block's output (typically an Agent block)
- Dynamically generated during workflow execution
### Model Selection
Choose an AI model to perform the evaluation:
**OpenAI**: GPT-4o, o1, o3, o4-mini, gpt-4.1
**Anthropic**: Claude 3.7 Sonnet
**Google**: Gemini 2.5 Pro, Gemini 2.0 Flash
**Other Providers**: Groq, Cerebras, xAI, DeepSeek
**Local Models**: Any model running on Ollama
<div className="w-full max-w-2xl mx-auto overflow-hidden rounded-lg">
<Video src="models.mp4" width={500} height={350} />
</div>
**Recommendation**: Use models with strong reasoning capabilities like GPT-4o or Claude 3.7 Sonnet for more accurate evaluations.
### API Key
Your API key for the selected LLM provider. This is securely stored and used for authentication.
## How It Works
1. The Evaluator block takes the provided content and your custom metrics
2. It generates a specialized prompt that instructs the LLM to evaluate the content
3. The prompt includes clear guidelines on how to score each metric
4. The LLM evaluates the content and returns numeric scores for each metric
5. The Evaluator block formats these scores as structured output for use in your workflow
## Example Use Cases
### Content Quality Assessment
<div className="mb-4 rounded-md border p-4">
<h4 className="font-medium">Scenario: Evaluate blog post quality before publication</h4>
<ol className="list-decimal pl-5 text-sm">
<li>Agent block generates blog post content</li>
<li>Evaluator assesses accuracy, readability, and engagement</li>
<li>Condition block checks if scores meet minimum thresholds</li>
<li>High scores → Publish, Low scores → Revise and retry</li>
</ol>
</div>
### A/B Testing Content
<div className="mb-4 rounded-md border p-4">
<h4 className="font-medium">Scenario: Compare multiple AI-generated responses</h4>
<ol className="list-decimal pl-5 text-sm">
<li>Parallel block generates multiple response variations</li>
<li>Evaluator scores each variation on clarity and relevance</li>
<li>Function block selects highest-scoring response</li>
<li>Response block returns the best result</li>
</ol>
</div>
### Customer Support Quality Control
<div className="mb-4 rounded-md border p-4">
<h4 className="font-medium">Scenario: Ensure support responses meet quality standards</h4>
<ol className="list-decimal pl-5 text-sm">
<li>Support agent generates response to customer inquiry</li>
<li>Evaluator scores helpfulness, empathy, and accuracy</li>
<li>Scores logged for training and performance monitoring</li>
<li>Low scores trigger human review process</li>
</ol>
</div>
## Inputs and Outputs
<Tabs items={['Configuration', 'Variables', 'Results']}>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>Content</strong>: The text or structured data to evaluate
</li>
<li>
<strong>Evaluation Metrics</strong>: Custom criteria with scoring ranges
</li>
<li>
<strong>Model</strong>: AI model for evaluation analysis
</li>
<li>
<strong>API Key</strong>: Authentication for selected LLM provider
</li>
</ul>
</Tab>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>evaluator.content</strong>: Summary of the evaluation
</li>
<li>
<strong>evaluator.model</strong>: Model used for evaluation
</li>
<li>
<strong>evaluator.tokens</strong>: Token usage statistics
</li>
<li>
<strong>evaluator.cost</strong>: Cost summary for the evaluation call
</li>
</ul>
</Tab>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>Metric Scores</strong>: Numeric scores for each defined metric
</li>
<li>
<strong>Evaluation Summary</strong>: Detailed assessment with explanations
</li>
<li>
<strong>Access</strong>: Available in blocks after the evaluator
</li>
</ul>
</Tab>
</Tabs>
## Best Practices
- **Use specific metric descriptions**: Clearly define what each metric measures to get more accurate evaluations
- **Choose appropriate ranges**: Select scoring ranges that provide enough granularity without being overly complex
- **Connect with Agent blocks**: Use Evaluator blocks to assess Agent block outputs and create feedback loops
- **Use consistent metrics**: For comparative analysis, maintain consistent metrics across similar evaluations
- **Combine multiple metrics**: Use several metrics to get a comprehensive evaluation

View File

@@ -1,156 +0,0 @@
---
title: Function
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Step, Steps } from 'fumadocs-ui/components/steps'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { Image } from '@/components/ui/image'
The Function block lets you execute custom JavaScript or TypeScript code in your workflows. Use it to transform data, perform calculations, or implement custom logic that isn't available in other blocks.
<div className="flex justify-center">
<Image
src="/static/blocks/function.png"
alt="Function Block with Code Editor"
width={500}
height={350}
className="my-6"
/>
</div>
## Overview
The Function block enables you to:
<Steps>
<Step>
<strong>Transform data</strong>: Convert formats, parse text, manipulate arrays and objects
</Step>
<Step>
<strong>Perform calculations</strong>: Math operations, statistics, financial calculations
</Step>
<Step>
<strong>Implement custom logic</strong>: Complex conditionals, loops, and algorithms
</Step>
<Step>
<strong>Process external data</strong>: Parse responses, format requests, handle authentication
</Step>
</Steps>
## How It Works
The Function block runs your code in a secure, isolated environment:
1. **Receive Input**: Access data from previous blocks via the `input` object
2. **Execute Code**: Run your JavaScript/Python code
3. **Return Results**: Use `return` to pass data to the next block
4. **Handle Errors**: Built-in error handling and logging
## Remote Execution (E2B)
- **Languages**: Run JavaScript and Python in an isolated E2B sandbox.
- **How to enable**: Toggle “Remote Code Execution” in the Function block.
- **When to use**: Heavier logic, external libraries, or Python-specific code.
- **Performance**: Slower than local JS due to sandbox startup and network overhead.
- **Notes**: Requires `E2B_API_KEY` if running locally. For lowest latency, use natively local JS (Fast Mode).
## Inputs and Outputs
<Tabs items={['Configuration', 'Variables']}>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>Code</strong>: Your JavaScript/Python code to execute
</li>
<li>
<strong>Timeout</strong>: Maximum execution time (defaults to 30 seconds)
</li>
<li>
<strong>Input Data</strong>: All connected block outputs available via variables
</li>
</ul>
</Tab>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>function.result</strong>: The value returned from your function
</li>
<li>
<strong>function.stdout</strong>: Console.log() output from your code
</li>
</ul>
</Tab>
</Tabs>
## Example Use Cases
### Data Processing Pipeline
<div className="mb-4 rounded-md border p-4">
<h4 className="font-medium">Scenario: Transform API response into structured data</h4>
<ol className="list-decimal pl-5 text-sm">
<li>API block fetches raw customer data</li>
<li>Function block processes and validates data</li>
<li>Function block calculates derived metrics</li>
<li>Response block returns formatted results</li>
</ol>
</div>
### Business Logic Implementation
<div className="mb-4 rounded-md border p-4">
<h4 className="font-medium">Scenario: Calculate loyalty scores and tiers</h4>
<ol className="list-decimal pl-5 text-sm">
<li>Agent retrieves customer purchase history</li>
<li>Function block calculates loyalty metrics</li>
<li>Function block determines customer tier</li>
<li>Condition block routes based on tier level</li>
</ol>
</div>
### Data Validation and Sanitization
<div className="mb-4 rounded-md border p-4">
<h4 className="font-medium">Scenario: Validate and clean user input</h4>
<ol className="list-decimal pl-5 text-sm">
<li>User input received from form submission</li>
<li>Function block validates email format and phone numbers</li>
<li>Function block sanitizes and normalizes data</li>
<li>API block saves validated data to database</li>
</ol>
</div>
### Example: Loyalty Score Calculator
```javascript title="loyalty-calculator.js"
// Process customer data and calculate loyalty score
const { purchaseHistory, accountAge, supportTickets } = <agent>;
// Calculate metrics
const totalSpent = purchaseHistory.reduce((sum, purchase) => sum + purchase.amount, 0);
const purchaseFrequency = purchaseHistory.length / (accountAge / 365);
const ticketRatio = supportTickets.resolved / supportTickets.total;
// Calculate loyalty score (0-100)
const spendScore = Math.min(totalSpent / 1000 * 30, 30);
const frequencyScore = Math.min(purchaseFrequency * 20, 40);
const supportScore = ticketRatio * 30;
const loyaltyScore = Math.round(spendScore + frequencyScore + supportScore);
return {
customer: <agent.name>,
loyaltyScore,
loyaltyTier: loyaltyScore >= 80 ? "Platinum" : loyaltyScore >= 60 ? "Gold" : "Silver",
metrics: { spendScore, frequencyScore, supportScore }
};
```
## Best Practices
- **Keep functions focused**: Write functions that do one thing well to improve maintainability and debugging
- **Handle errors gracefully**: Use try/catch blocks to handle potential errors and provide meaningful error messages
- **Test edge cases**: Ensure your code handles unusual inputs, null values, and boundary conditions correctly
- **Optimize for performance**: Be mindful of computational complexity and memory usage for large datasets
- **Use console.log() for debugging**: Leverage stdout output to debug and monitor function execution

View File

@@ -1,247 +0,0 @@
---
title: Response
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Step, Steps } from 'fumadocs-ui/components/steps'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { Image } from '@/components/ui/image'
The Response block is the final step in your workflow that formats and sends a structured response back to API calls. It's like the "return" statement for your entire workflow—it packages up results and sends them back.
<div className="flex justify-center">
<Image
src="/static/blocks/response.png"
alt="Response Block Configuration"
width={500}
height={400}
className="my-6"
/>
</div>
<Callout type="info">
Response blocks are terminal blocks - they end the workflow execution and cannot connect to other blocks.
</Callout>
## Overview
The Response block enables you to:
<Steps>
<Step>
<strong>Format API Responses</strong>: Structure workflow results into proper HTTP responses
</Step>
<Step>
<strong>Set Status Codes</strong>: Configure appropriate HTTP status codes based on workflow outcomes
</Step>
<Step>
<strong>Control Headers</strong>: Add custom headers for API responses and webhooks
</Step>
<Step>
<strong>Transform Data</strong>: Convert workflow variables into client-friendly response formats
</Step>
</Steps>
## How It Works
The Response block finalizes workflow execution:
1. **Collect Data** - Gathers variables and outputs from previous blocks
2. **Format Response** - Structures data according to your configuration
3. **Set HTTP Details** - Applies status codes and headers
4. **Send Response** - Returns the formatted response to the API caller
## When You Need Response Blocks
- **API Endpoints**: When your workflow is called via API, Response blocks format the return data
- **Webhooks**: Return confirmation or data back to the calling system
- **Testing**: See formatted results when testing your workflow
## Two Ways to Build Responses
### Builder Mode (Recommended)
Visual interface for building response structure:
- Drag and drop fields
- Reference workflow variables easily
- Visual preview of response structure
### Editor Mode (Advanced)
Write JSON directly:
- Full control over response format
- Support for complex nested structures
- Use `<variable.name>` syntax for dynamic values
## Configuration Options
### Response Data
The response data is the main content that will be sent back to the API caller. This should be formatted as JSON and can include:
- Static values
- Dynamic references to workflow variables using the `<variable.name>` syntax
- Nested objects and arrays
- Any valid JSON structure
### Status Code
Set the HTTP status code for the response. Common status codes include:
<Tabs items={['Success (2xx)', 'Client Error (4xx)', 'Server Error (5xx)']}>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li><strong>200</strong>: OK - Standard success response</li>
<li><strong>201</strong>: Created - Resource successfully created</li>
<li><strong>204</strong>: No Content - Success with no response body</li>
</ul>
</Tab>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li><strong>400</strong>: Bad Request - Invalid request parameters</li>
<li><strong>401</strong>: Unauthorized - Authentication required</li>
<li><strong>404</strong>: Not Found - Resource doesn't exist</li>
<li><strong>422</strong>: Unprocessable Entity - Validation errors</li>
</ul>
</Tab>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li><strong>500</strong>: Internal Server Error - Server-side error</li>
<li><strong>502</strong>: Bad Gateway - External service error</li>
<li><strong>503</strong>: Service Unavailable - Service temporarily down</li>
</ul>
</Tab>
</Tabs>
<div className="mt-4 text-sm text-gray-600 dark:text-gray-400">
Default status code is 200 if not specified.
</div>
### Response Headers
Configure additional HTTP headers to include in the response.
Headers are configured as key-value pairs:
| Key | Value |
|-----|-------|
| Content-Type | application/json |
| Cache-Control | no-cache |
| X-API-Version | 1.0 |
## Example Use Cases
### API Endpoint Response
<div className="mb-4 rounded-md border p-4">
<h4 className="font-medium">Scenario: Return structured data from a search API</h4>
<ol className="list-decimal pl-5 text-sm">
<li>Workflow processes search query and retrieves results</li>
<li>Function block formats and paginates results</li>
<li>Response block returns JSON with data, pagination, and metadata</li>
<li>Client receives structured response with 200 status</li>
</ol>
</div>
### Webhook Confirmation
<div className="mb-4 rounded-md border p-4">
<h4 className="font-medium">Scenario: Acknowledge webhook receipt and processing</h4>
<ol className="list-decimal pl-5 text-sm">
<li>Webhook trigger receives external system data</li>
<li>Workflow processes the incoming data</li>
<li>Response block returns confirmation with processing status</li>
<li>External system receives acknowledgment</li>
</ol>
</div>
### Error Response Handling
<div className="mb-4 rounded-md border p-4">
<h4 className="font-medium">Scenario: Return appropriate error responses</h4>
<ol className="list-decimal pl-5 text-sm">
<li>Condition block detects validation failure or system error</li>
<li>Router directs to error handling path</li>
<li>Response block returns 400/500 status with error details</li>
<li>Client receives structured error information</li>
</ol>
</div>
## Inputs and Outputs
<Tabs items={['Configuration', 'Variables', 'Results']}>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>Response Data</strong>: JSON structure for response body
</li>
<li>
<strong>Status Code</strong>: HTTP status code (default: 200)
</li>
<li>
<strong>Headers</strong>: Custom HTTP headers as key-value pairs
</li>
<li>
<strong>Mode</strong>: Builder or Editor mode for response construction
</li>
</ul>
</Tab>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>response.data</strong>: The structured response body
</li>
<li>
<strong>response.status</strong>: HTTP status code sent
</li>
<li>
<strong>response.headers</strong>: Headers included in response
</li>
<li>
<strong>response.success</strong>: Boolean indicating successful completion
</li>
</ul>
</Tab>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>HTTP Response</strong>: Complete response sent to API caller
</li>
<li>
<strong>Workflow Termination</strong>: Ends workflow execution
</li>
<li>
<strong>Access</strong>: Response blocks are terminal - no subsequent blocks
</li>
</ul>
</Tab>
</Tabs>
## Variable References
Use the `<variable.name>` syntax to dynamically insert workflow variables into your response:
```json
{
"user": {
"id": "<variable.userId>",
"name": "<variable.userName>",
"email": "<variable.userEmail>"
},
"query": "<variable.searchQuery>",
"results": "<variable.searchResults>",
"totalFound": "<variable.resultCount>",
"processingTime": "<variable.executionTime>ms"
}
```
<Callout type="warning">
Variable names are case-sensitive and must match exactly with the variables available in your workflow.
</Callout>
## Best Practices
- **Use meaningful status codes**: Choose appropriate HTTP status codes that accurately reflect the outcome of the workflow
- **Structure your responses consistently**: Maintain a consistent JSON structure across all your API endpoints for better developer experience
- **Include relevant metadata**: Add timestamps and version information to help with debugging and monitoring
- **Handle errors gracefully**: Use conditional logic in your workflow to set appropriate error responses with descriptive messages
- **Validate variable references**: Ensure all referenced variables exist and contain the expected data types before the Response block executes

View File

@@ -1,44 +0,0 @@
---
title: Connection Basics
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Step, Steps } from 'fumadocs-ui/components/steps'
## How Connections Work
Connections are the pathways that allow data to flow between blocks in your workflow. In Sim, connections define how information passes from one block to another, enabling data flow throughout your workflow.
<Callout type="info">
Each connection represents a directed relationship where data flows from a source block's output
to a destination block's input.
</Callout>
### Creating Connections
<Steps>
<Step>
<strong>Select Source Block</strong>: Click on the output port of the block you want to connect
from
</Step>
<Step>
<strong>Draw Connection</strong>: Drag to the input port of the destination block
</Step>
<Step>
<strong>Confirm Connection</strong>: Release to create the connection
</Step>
</Steps>
### Connection Flow
The flow of data through connections follows these principles:
1. **Directional Flow**: Data always flows from outputs to inputs
2. **Execution Order**: Blocks execute in order based on their connections
3. **Data Transformation**: Data may be transformed as it passes between blocks
4. **Conditional Paths**: Some blocks (like Router and Condition) can direct flow to different paths
<Callout type="warning">
Deleting a connection will immediately stop data flow between the blocks. Make sure this is
intended before removing connections.
</Callout>

View File

@@ -1,536 +0,0 @@
---
title: External API
---
import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'
import { Callout } from 'fumadocs-ui/components/callout'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { CodeBlock } from 'fumadocs-ui/components/codeblock'
import { Video } from '@/components/ui/video'
Sim provides a comprehensive external API for querying workflow execution logs and setting up webhooks for real-time notifications when workflows complete.
## Authentication
All API requests require an API key passed in the `x-api-key` header:
```bash
curl -H "x-api-key: YOUR_API_KEY" \
https://sim.ai/api/v1/logs?workspaceId=YOUR_WORKSPACE_ID
```
You can generate API keys from your user settings in the Sim dashboard.
## Logs API
All API responses include information about your workflow execution limits and usage:
```json
"limits": {
"workflowExecutionRateLimit": {
"sync": {
"limit": 60, // Max sync workflow executions per minute
"remaining": 58, // Remaining sync workflow executions
"resetAt": "..." // When the window resets
},
"async": {
"limit": 60, // Max async workflow executions per minute
"remaining": 59, // Remaining async workflow executions
"resetAt": "..." // When the window resets
}
},
"usage": {
"currentPeriodCost": 1.234, // Current billing period usage in USD
"limit": 10, // Usage limit in USD
"plan": "pro", // Current subscription plan
"isExceeded": false // Whether limit is exceeded
}
}
```
**Note:** The rate limits in the response body are for workflow executions. The rate limits for calling this API endpoint are in the response headers (`X-RateLimit-*`).
### Query Logs
Query workflow execution logs with extensive filtering options.
<Tabs items={['Request', 'Response']}>
<Tab value="Request">
```http
GET /api/v1/logs
```
**Required Parameters:**
- `workspaceId` - Your workspace ID
**Optional Filters:**
- `workflowIds` - Comma-separated workflow IDs
- `folderIds` - Comma-separated folder IDs
- `triggers` - Comma-separated trigger types: `api`, `webhook`, `schedule`, `manual`, `chat`
- `level` - Filter by level: `info`, `error`
- `startDate` - ISO timestamp for date range start
- `endDate` - ISO timestamp for date range end
- `executionId` - Exact execution ID match
- `minDurationMs` - Minimum execution duration in milliseconds
- `maxDurationMs` - Maximum execution duration in milliseconds
- `minCost` - Minimum execution cost
- `maxCost` - Maximum execution cost
- `model` - Filter by AI model used
**Pagination:**
- `limit` - Results per page (default: 100)
- `cursor` - Cursor for next page
- `order` - Sort order: `desc`, `asc` (default: desc)
**Detail Level:**
- `details` - Response detail level: `basic`, `full` (default: basic)
- `includeTraceSpans` - Include trace spans (default: false)
- `includeFinalOutput` - Include final output (default: false)
</Tab>
<Tab value="Response">
```json
{
"data": [
{
"id": "log_abc123",
"workflowId": "wf_xyz789",
"executionId": "exec_def456",
"level": "info",
"trigger": "api",
"startedAt": "2025-01-01T12:34:56.789Z",
"endedAt": "2025-01-01T12:34:57.123Z",
"totalDurationMs": 334,
"cost": {
"total": 0.00234
},
"files": null
}
],
"nextCursor": "eyJzIjoiMjAyNS0wMS0wMVQxMjozNDo1Ni43ODlaIiwiaWQiOiJsb2dfYWJjMTIzIn0",
"limits": {
"workflowExecutionRateLimit": {
"sync": {
"limit": 60,
"remaining": 58,
"resetAt": "2025-01-01T12:35:56.789Z"
},
"async": {
"limit": 60,
"remaining": 59,
"resetAt": "2025-01-01T12:35:56.789Z"
}
},
"usage": {
"currentPeriodCost": 1.234,
"limit": 10,
"plan": "pro",
"isExceeded": false
}
}
}
```
</Tab>
</Tabs>
### Get Log Details
Retrieve detailed information about a specific log entry.
<Tabs items={['Request', 'Response']}>
<Tab value="Request">
```http
GET /api/v1/logs/{id}
```
</Tab>
<Tab value="Response">
```json
{
"data": {
"id": "log_abc123",
"workflowId": "wf_xyz789",
"executionId": "exec_def456",
"level": "info",
"trigger": "api",
"startedAt": "2025-01-01T12:34:56.789Z",
"endedAt": "2025-01-01T12:34:57.123Z",
"totalDurationMs": 334,
"workflow": {
"id": "wf_xyz789",
"name": "My Workflow",
"description": "Process customer data"
},
"executionData": {
"traceSpans": [...],
"finalOutput": {...}
},
"cost": {
"total": 0.00234,
"tokens": {
"prompt": 123,
"completion": 456,
"total": 579
},
"models": {
"gpt-4o": {
"input": 0.001,
"output": 0.00134,
"total": 0.00234,
"tokens": {
"prompt": 123,
"completion": 456,
"total": 579
}
}
}
},
"limits": {
"workflowExecutionRateLimit": {
"sync": {
"limit": 60,
"remaining": 58,
"resetAt": "2025-01-01T12:35:56.789Z"
},
"async": {
"limit": 60,
"remaining": 59,
"resetAt": "2025-01-01T12:35:56.789Z"
}
},
"usage": {
"currentPeriodCost": 1.234,
"limit": 10,
"plan": "pro",
"isExceeded": false
}
}
}
}
```
</Tab>
</Tabs>
### Get Execution Details
Retrieve execution details including the workflow state snapshot.
<Tabs items={['Request', 'Response']}>
<Tab value="Request">
```http
GET /api/v1/logs/executions/{executionId}
```
</Tab>
<Tab value="Response">
```json
{
"executionId": "exec_def456",
"workflowId": "wf_xyz789",
"workflowState": {
"blocks": {...},
"edges": [...],
"loops": {...},
"parallels": {...}
},
"executionMetadata": {
"trigger": "api",
"startedAt": "2025-01-01T12:34:56.789Z",
"endedAt": "2025-01-01T12:34:57.123Z",
"totalDurationMs": 334,
"cost": {...}
}
}
```
</Tab>
</Tabs>
## Webhook Subscriptions
Get real-time notifications when workflow executions complete. Webhooks are configured through the Sim UI in the workflow editor.
### Configuration
Webhooks can be configured for each workflow through the workflow editor UI. Click the webhook icon in the control bar to set up your webhook subscriptions.
<div className="mx-auto w-full overflow-hidden rounded-lg">
<Video src="configure-webhook.mp4" width={700} height={450} />
</div>
**Available Configuration Options:**
- `url`: Your webhook endpoint URL
- `secret`: Optional secret for HMAC signature verification
- `includeFinalOutput`: Include the workflow's final output in the payload
- `includeTraceSpans`: Include detailed execution trace spans
- `includeRateLimits`: Include the workflow owner's rate limit information
- `includeUsageData`: Include the workflow owner's usage and billing data
- `levelFilter`: Array of log levels to receive (`info`, `error`)
- `triggerFilter`: Array of trigger types to receive (`api`, `webhook`, `schedule`, `manual`, `chat`)
- `active`: Enable/disable the webhook subscription
### Webhook Payload
When a workflow execution completes, Sim sends a POST request to your webhook URL:
```json
{
"id": "evt_123",
"type": "workflow.execution.completed",
"timestamp": 1735925767890,
"data": {
"workflowId": "wf_xyz789",
"executionId": "exec_def456",
"status": "success",
"level": "info",
"trigger": "api",
"startedAt": "2025-01-01T12:34:56.789Z",
"endedAt": "2025-01-01T12:34:57.123Z",
"totalDurationMs": 334,
"cost": {
"total": 0.00234,
"tokens": {
"prompt": 123,
"completion": 456,
"total": 579
},
"models": {
"gpt-4o": {
"input": 0.001,
"output": 0.00134,
"total": 0.00234,
"tokens": {
"prompt": 123,
"completion": 456,
"total": 579
}
}
}
},
"files": null,
"finalOutput": {...}, // Only if includeFinalOutput=true
"traceSpans": [...], // Only if includeTraceSpans=true
"rateLimits": {...}, // Only if includeRateLimits=true
"usage": {...} // Only if includeUsageData=true
},
"links": {
"log": "/v1/logs/log_abc123",
"execution": "/v1/logs/executions/exec_def456"
}
}
```
### Webhook Headers
Each webhook request includes these headers:
- `sim-event`: Event type (always `workflow.execution.completed`)
- `sim-timestamp`: Unix timestamp in milliseconds
- `sim-delivery-id`: Unique delivery ID for idempotency
- `sim-signature`: HMAC-SHA256 signature for verification (if secret configured)
- `Idempotency-Key`: Same as delivery ID for duplicate detection
### Signature Verification
If you configure a webhook secret, verify the signature to ensure the webhook is from Sim:
<Tabs items={['Node.js', 'Python']}>
<Tab value="Node.js">
```javascript
import crypto from 'crypto';
function verifyWebhookSignature(body, signature, secret) {
const [timestampPart, signaturePart] = signature.split(',');
const timestamp = timestampPart.replace('t=', '');
const expectedSignature = signaturePart.replace('v1=', '');
const signatureBase = `${timestamp}.${body}`;
const hmac = crypto.createHmac('sha256', secret);
hmac.update(signatureBase);
const computedSignature = hmac.digest('hex');
return computedSignature === expectedSignature;
}
// In your webhook handler
app.post('/webhook', (req, res) => {
const signature = req.headers['sim-signature'];
const body = JSON.stringify(req.body);
if (!verifyWebhookSignature(body, signature, process.env.WEBHOOK_SECRET)) {
return res.status(401).send('Invalid signature');
}
// Process the webhook...
});
```
</Tab>
<Tab value="Python">
```python
import hmac
import hashlib
import json
def verify_webhook_signature(body: str, signature: str, secret: str) -> bool:
timestamp_part, signature_part = signature.split(',')
timestamp = timestamp_part.replace('t=', '')
expected_signature = signature_part.replace('v1=', '')
signature_base = f"{timestamp}.{body}"
computed_signature = hmac.new(
secret.encode(),
signature_base.encode(),
hashlib.sha256
).hexdigest()
return hmac.compare_digest(computed_signature, expected_signature)
# In your webhook handler
@app.route('/webhook', methods=['POST'])
def webhook():
signature = request.headers.get('sim-signature')
body = json.dumps(request.json)
if not verify_webhook_signature(body, signature, os.environ['WEBHOOK_SECRET']):
return 'Invalid signature', 401
# Process the webhook...
```
</Tab>
</Tabs>
### Retry Policy
Failed webhook deliveries are retried with exponential backoff and jitter:
- Maximum attempts: 5
- Retry delays: 5 seconds, 15 seconds, 1 minute, 3 minutes, 10 minutes
- Jitter: Up to 10% additional delay to prevent thundering herd
- Only HTTP 5xx and 429 responses trigger retries
- Deliveries timeout after 30 seconds
<Callout type="info">
Webhook deliveries are processed asynchronously and don't affect workflow execution performance.
</Callout>
## Best Practices
1. **Polling Strategy**: When polling for logs, use cursor-based pagination with `order=asc` and `startDate` to fetch new logs efficiently.
2. **Webhook Security**: Always configure a webhook secret and verify signatures to ensure requests are from Sim.
3. **Idempotency**: Use the `Idempotency-Key` header to detect and handle duplicate webhook deliveries.
4. **Privacy**: By default, `finalOutput` and `traceSpans` are excluded from responses. Only enable these if you need the data and understand the privacy implications.
5. **Rate Limiting**: Implement exponential backoff when you receive 429 responses. Check the `Retry-After` header for the recommended wait time.
## Rate Limiting
The API implements rate limiting to ensure fair usage:
- **Free plan**: 10 requests per minute
- **Pro plan**: 30 requests per minute
- **Team plan**: 60 requests per minute
- **Enterprise plan**: Custom limits
Rate limit information is included in response headers:
- `X-RateLimit-Limit`: Maximum requests per window
- `X-RateLimit-Remaining`: Requests remaining in current window
- `X-RateLimit-Reset`: ISO timestamp when the window resets
## Example: Polling for New Logs
```javascript
let cursor = null;
const workspaceId = 'YOUR_WORKSPACE_ID';
const startDate = new Date().toISOString();
async function pollLogs() {
const params = new URLSearchParams({
workspaceId,
startDate,
order: 'asc',
limit: '100'
});
if (cursor) {
params.append('cursor', cursor);
}
const response = await fetch(
`https://sim.ai/api/v1/logs?${params}`,
{
headers: {
'x-api-key': 'YOUR_API_KEY'
}
}
);
if (response.ok) {
const data = await response.json();
// Process new logs
for (const log of data.data) {
console.log(`New execution: ${log.executionId}`);
}
// Update cursor for next poll
if (data.nextCursor) {
cursor = data.nextCursor;
}
}
}
// Poll every 30 seconds
setInterval(pollLogs, 30000);
```
## Example: Processing Webhooks
```javascript
import express from 'express';
import crypto from 'crypto';
const app = express();
app.use(express.json());
app.post('/sim-webhook', (req, res) => {
// Verify signature
const signature = req.headers['sim-signature'];
const body = JSON.stringify(req.body);
if (!verifyWebhookSignature(body, signature, process.env.WEBHOOK_SECRET)) {
return res.status(401).send('Invalid signature');
}
// Check timestamp to prevent replay attacks
const timestamp = parseInt(req.headers['sim-timestamp']);
const fiveMinutesAgo = Date.now() - (5 * 60 * 1000);
if (timestamp < fiveMinutesAgo) {
return res.status(401).send('Timestamp too old');
}
// Process the webhook
const event = req.body;
switch (event.type) {
case 'workflow.execution.completed':
const { workflowId, executionId, status, cost } = event.data;
if (status === 'error') {
console.error(`Workflow ${workflowId} failed: ${executionId}`);
// Handle error...
} else {
console.log(`Workflow ${workflowId} completed: ${executionId}`);
console.log(`Cost: $${cost.total}`);
// Process successful execution...
}
break;
}
// Return 200 to acknowledge receipt
res.status(200).send('OK');
});
app.listen(3000, () => {
console.log('Webhook server listening on port 3000');
});
```

View File

@@ -1,132 +0,0 @@
---
title: Execution Basics
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Card, Cards } from 'fumadocs-ui/components/card'
import { Step, Steps } from 'fumadocs-ui/components/steps'
import { Image } from '@/components/ui/image'
import { Video } from '@/components/ui/video'
Understanding how workflows execute in Sim is key to building efficient and reliable automations. The execution engine automatically handles dependencies, concurrency, and data flow to ensure your workflows run smoothly and predictably.
## How Workflows Execute
Sim's execution engine processes workflows intelligently by analyzing dependencies and running blocks in the most efficient order possible.
### Concurrent Execution by Default
Multiple blocks run concurrently when they don't depend on each other. This parallel execution dramatically improves performance without requiring manual configuration.
<Image
src="/static/execution/concurrency.png"
alt="Multiple blocks running concurrently after the Start block"
width={800}
height={500}
/>
In this example, both the Customer Support and Deep Researcher agent blocks execute simultaneously after the Start block, maximizing efficiency.
### Automatic Output Combination
When blocks have multiple dependencies, the execution engine automatically waits for all dependencies to complete, then provides their combined outputs to the next block. No manual combining required.
<Image
src="/static/execution/combination.png"
alt="Function block automatically receiving outputs from multiple previous blocks"
width={800}
height={500}
/>
The Function block receives outputs from both agent blocks as soon as they complete, allowing you to process the combined results.
### Smart Routing
Workflows can branch in multiple directions using routing blocks. The execution engine supports both deterministic routing (with Condition blocks) and AI-powered routing (with Router blocks).
<Image
src="/static/execution/routing.png"
alt="Workflow showing both conditional and router-based branching"
width={800}
height={500}
/>
This workflow demonstrates how execution can follow different paths based on conditions or AI decisions, with each path executing independently.
## Block Types
Sim provides different types of blocks that serve specific purposes in your workflows:
<Cards>
<Card title="Triggers" href="/triggers">
**Starter blocks** initiate workflows and **Webhook blocks** respond to external events. Every workflow needs a trigger to begin execution.
</Card>
<Card title="Processing Blocks" href="/blocks">
**Agent blocks** interact with AI models, **Function blocks** run custom code, and **API blocks** connect to external services. These blocks transform and process your data.
</Card>
<Card title="Control Flow" href="/blocks">
**Router blocks** use AI to choose paths, **Condition blocks** branch based on logic, and **Loop/Parallel blocks** handle iterations and concurrency.
</Card>
<Card title="Output & Response" href="/blocks">
**Response blocks** format final outputs for APIs and chat interfaces, returning structured results from your workflows.
</Card>
</Cards>
All blocks execute automatically based on their dependencies - you don't need to manually manage execution order or timing.
## Execution Triggers
Workflows can be triggered in several ways, depending on your use case:
### Manual Testing
Click "Run" in the workflow editor to test your workflow during development. Perfect for debugging and validation.
### Scheduled Execution
Set up recurring executions using cron expressions. Great for regular data processing, reports, or maintenance tasks.
### API Deployment
Deploy workflows as HTTP endpoints that can be called programmatically from your applications.
### Webhook Integration
Respond to events from external services like GitHub, Stripe, or custom systems in real-time.
### Chat Interface
Create conversational interfaces hosted on custom subdomains for user-facing AI applications.
<Callout type="info">
Learn more about each trigger type in the [Triggers section](/triggers) of the documentation.
</Callout>
## Execution Monitoring
When workflows run, Sim provides real-time visibility into the execution process:
- **Live Block States**: See which blocks are currently executing, completed, or failed
- **Execution Logs**: Detailed logs appear in real-time showing inputs, outputs, and any errors
- **Performance Metrics**: Track execution time and costs for each block
- **Path Visualization**: Understand which execution paths were taken through your workflow
<Callout type="info">
All execution details are captured and available for review even after workflows complete, helping with debugging and optimization.
</Callout>
## Key Execution Principles
Understanding these core principles will help you build better workflows:
1. **Dependency-Based Execution**: Blocks only run when all their dependencies have completed
2. **Automatic Parallelization**: Independent blocks run concurrently without configuration
3. **Smart Data Flow**: Outputs flow automatically to connected blocks
4. **Error Handling**: Failed blocks stop their execution path but don't affect independent paths
5. **State Persistence**: All block outputs and execution details are preserved for debugging
## Next Steps
Now that you understand execution basics, explore:
- **[Block Types](/blocks)** - Learn about specific block capabilities
- **[Logging](/execution/logging)** - Monitor workflow executions and debug issues
- **[Cost Calculation](/execution/costs)** - Understand and optimize workflow costs
- **[Triggers](/triggers)** - Set up different ways to run your workflows

View File

@@ -1,182 +0,0 @@
---
title: Cost Calculation
---
import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'
import { Callout } from 'fumadocs-ui/components/callout'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { Image } from '@/components/ui/image'
Sim automatically calculates costs for all workflow executions, providing transparent pricing based on AI model usage and execution charges. Understanding these costs helps you optimize workflows and manage your budget effectively.
## How Costs Are Calculated
Every workflow execution includes two cost components:
**Base Execution Charge**: $0.001 per execution
**AI Model Usage**: Variable cost based on token consumption
```javascript
modelCost = (inputTokens × inputPrice + outputTokens × outputPrice) / 1,000,000
totalCost = baseExecutionCharge + modelCost
```
<Callout type="info">
AI model prices are per million tokens. The calculation divides by 1,000,000 to get the actual cost. Workflows without AI blocks only incur the base execution charge.
</Callout>
## Model Breakdown in Logs
For workflows using AI blocks, you can view detailed cost information in the logs:
<div className="flex justify-center">
<Image
src="/static/logs/logs-cost.png"
alt="Model Breakdown"
width={600}
height={400}
className="my-6"
/>
</div>
The model breakdown shows:
- **Token Usage**: Input and output token counts for each model
- **Cost Breakdown**: Individual costs per model and operation
- **Model Distribution**: Which models were used and how many times
- **Total Cost**: Aggregate cost for the entire workflow execution
## Pricing Options
<Tabs items={['Hosted Models', 'Bring Your Own API Key']}>
<Tab>
**Hosted Models** - Sim provides API keys with a 2.5x pricing multiplier:
| Model | Base Price (Input/Output) | Hosted Price (Input/Output) |
|-------|---------------------------|----------------------------|
| GPT-4o | $2.50 / $10.00 | $6.25 / $25.00 |
| GPT-4.1 | $2.00 / $8.00 | $5.00 / $20.00 |
| o1 | $15.00 / $60.00 | $37.50 / $150.00 |
| o3 | $2.00 / $8.00 | $5.00 / $20.00 |
| Claude 3.5 Sonnet | $3.00 / $15.00 | $7.50 / $37.50 |
| Claude Opus 4.0 | $15.00 / $75.00 | $37.50 / $187.50 |
*The 2.5x multiplier covers infrastructure and API management costs.*
</Tab>
<Tab>
**Your Own API Keys** - Use any model at base pricing:
| Provider | Models | Input / Output |
|----------|---------|----------------|
| Google | Gemini 2.5 | $0.15 / $0.60 |
| Deepseek | V3, R1 | $0.75 / $1.00 |
| xAI | Grok 4, Grok 3 | $5.00 / $25.00 |
| Groq | Llama 4 Scout | $0.40 / $0.60 |
| Cerebras | Llama 3.3 70B | $0.94 / $0.94 |
| Ollama | Local models | Free |
*Pay providers directly with no markup*
</Tab>
</Tabs>
<Callout type="warning">
Pricing shown reflects rates as of September 10, 2025. Check provider documentation for current pricing.
</Callout>
## Cost Optimization Strategies
<Accordions>
<Accordion title="Model Selection">
Choose models based on task complexity. Simple tasks can use GPT-4.1-nano ($0.10/$0.40) while complex reasoning might need o1 or Claude Opus.
</Accordion>
<Accordion title="Prompt Engineering">
Well-structured, concise prompts reduce token usage without sacrificing quality.
</Accordion>
<Accordion title="Local Models">
Use Ollama for non-critical tasks to eliminate API costs entirely.
</Accordion>
<Accordion title="Caching and Reuse">
Store frequently used results in variables or files to avoid repeated AI model calls.
</Accordion>
<Accordion title="Batch Processing">
Process multiple items in a single AI request rather than making individual calls.
</Accordion>
</Accordions>
## Usage Monitoring
Monitor your usage and billing in Settings → Subscription:
- **Current Usage**: Real-time usage and costs for the current period
- **Usage Limits**: Plan limits with visual progress indicators
- **Billing Details**: Projected charges and minimum commitments
- **Plan Management**: Upgrade options and billing history
### Programmatic Usage Tracking
You can query your current usage and limits programmatically using the API:
**Endpoint:**
```text
GET /api/users/me/usage-limits
```
**Authentication:**
- Include your API key in the `X-API-Key` header
**Example Request:**
```bash
curl -X GET -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" https://sim.ai/api/users/me/usage-limits
```
**Example Response:**
```json
{
"success": true,
"rateLimit": {
"sync": { "isLimited": false, "limit": 10, "remaining": 10, "resetAt": "2025-09-08T22:51:55.999Z" },
"async": { "isLimited": false, "limit": 50, "remaining": 50, "resetAt": "2025-09-08T22:51:56.155Z" },
"authType": "api"
},
"usage": {
"currentPeriodCost": 12.34,
"limit": 100,
"plan": "pro"
}
}
```
**Response Fields:**
- `currentPeriodCost` reflects usage in the current billing period
- `limit` is derived from individual limits (Free/Pro) or pooled organization limits (Team/Enterprise)
- `plan` is the highest-priority active plan associated with your user
## Plan Limits
Different subscription plans have different usage limits:
| Plan | Monthly Usage Limit | Rate Limits (per minute) |
|------|-------------------|-------------------------|
| **Free** | $10 | 5 sync, 10 async |
| **Pro** | $100 | 10 sync, 50 async |
| **Team** | $500 (pooled) | 50 sync, 100 async |
| **Enterprise** | Custom | Custom |
## Cost Management Best Practices
1. **Monitor Regularly**: Check your usage dashboard frequently to avoid surprises
2. **Set Budgets**: Use plan limits as guardrails for your spending
3. **Optimize Workflows**: Review high-cost executions and optimize prompts or model selection
4. **Use Appropriate Models**: Match model complexity to task requirements
5. **Batch Similar Tasks**: Combine multiple requests when possible to reduce overhead
## Next Steps
- Review your current usage in [Settings → Subscription](https://sim.ai/settings/subscription)
- Learn about [Logging](/execution/logging) to track execution details
- Explore the [External API](/execution/api) for programmatic cost monitoring
- Check out [workflow optimization techniques](/blocks) to reduce costs

View File

@@ -1,150 +0,0 @@
---
title: Logging
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { Image } from '@/components/ui/image'
Sim provides comprehensive logging for all workflow executions, giving you complete visibility into how your workflows run, what data flows through them, and where issues might occur.
## Logging System
Sim offers two complementary logging interfaces to match different workflows and use cases:
### Real-Time Console
During manual or chat workflow execution, logs appear in real-time in the Console panel on the right side of the workflow editor:
<div className="flex justify-center">
<Image
src="/static/logs/console.png"
alt="Real-time Console Panel"
width={400}
height={300}
className="my-6"
/>
</div>
The console shows:
- Block execution progress with active block highlighting
- Real-time outputs as blocks complete
- Execution timing for each block
- Success/error status indicators
### Logs Page
All workflow executions—whether triggered manually, via API, Chat, Schedule, or Webhook—are logged to the dedicated Logs page:
<div className="flex justify-center">
<Image
src="/static/logs/logs.png"
alt="Logs Page"
width={600}
height={400}
className="my-6"
/>
</div>
The Logs page provides:
- Comprehensive filtering by time range, status, trigger type, folder, and workflow
- Search functionality across all logs
- Live mode for real-time updates
- 7-day log retention (upgradeable for longer retention)
## Log Details Sidebar
Clicking on any log entry opens a detailed sidebar view:
<div className="flex justify-center">
<Image
src="/static/logs/logs-sidebar.png"
alt="Logs Sidebar Details"
width={600}
height={400}
className="my-6"
/>
</div>
### Block Input/Output
View the complete data flow for each block with tabs to switch between:
<Tabs items={['Output', 'Input']}>
<Tab>
**Output Tab** shows the block's execution result:
- Structured data with JSON formatting
- Markdown rendering for AI-generated content
- Copy button for easy data extraction
</Tab>
<Tab>
**Input Tab** displays what was passed to the block:
- Resolved variable values
- Referenced outputs from other blocks
- Environment variables used
- API keys are automatically redacted for security
</Tab>
</Tabs>
### Execution Timeline
For workflow-level logs, view detailed execution metrics:
- Start and end timestamps
- Total workflow duration
- Individual block execution times
- Performance bottleneck identification
## Workflow Snapshots
For any logged execution, click "View Snapshot" to see the exact workflow state at execution time:
<div className="flex justify-center">
<Image
src="/static/logs/logs-frozen-canvas.png"
alt="Workflow Snapshot"
width={600}
height={400}
className="my-6"
/>
</div>
The snapshot provides:
- Frozen canvas showing the workflow structure
- Block states and connections as they were during execution
- Click any block to see its inputs and outputs
- Useful for debugging workflows that have since been modified
<Callout type="info">
Workflow snapshots are only available for executions after the enhanced logging system was introduced. Older migrated logs show a "Logged State Not Found" message.
</Callout>
## Log Retention
- **Free Plan**: 7 days of log retention
- **Pro Plan**: 30 days of log retention
- **Team Plan**: 90 days of log retention
- **Enterprise Plan**: Custom retention periods available
## Best Practices
### For Development
- Use the real-time console for immediate feedback during testing
- Check block inputs and outputs to verify data flow
- Use workflow snapshots to compare working vs. broken versions
### For Production
- Monitor the Logs page regularly for errors or performance issues
- Set up filters to focus on specific workflows or time periods
- Use live mode during critical deployments to watch executions in real-time
### For Debugging
- Always check the execution timeline to identify slow blocks
- Compare inputs between working and failing executions
- Use workflow snapshots to see the exact state when issues occurred
## Next Steps
- Learn about [Cost Calculation](/execution/costs) to understand workflow pricing
- Explore the [External API](/execution/api) for programmatic log access
- Set up [Webhook notifications](/execution/api#webhook-subscriptions) for real-time alerts

View File

@@ -1,60 +0,0 @@
---
title: Documentation
---
import { Card, Cards } from 'fumadocs-ui/components/card'
# Sim Documentation
Welcome to Sim, a visual workflow builder for AI applications. Build powerful AI agents, automation workflows, and data processing pipelines by connecting blocks on a canvas.
## Quick Start
<Cards>
<Card title="Introduction" href="/introduction">
Learn what you can build with Sim
</Card>
<Card title="Getting Started" href="/getting-started">
Create your first workflow in 10 minutes
</Card>
<Card title="Workflow Blocks" href="/blocks">
Learn about the building blocks
</Card>
<Card title="Tools & Integrations" href="/tools">
Explore 80+ built-in integrations
</Card>
</Cards>
## Core Concepts
<Cards>
<Card title="Connections" href="/connections">
Understand how data flows between blocks
</Card>
<Card title="Variables" href="/variables">
Work with workflow and environment variables
</Card>
<Card title="Execution" href="/execution">
Monitor workflow runs and manage costs
</Card>
<Card title="Triggers" href="/triggers">
Start workflows via API, webhooks, or schedules
</Card>
</Cards>
## Advanced Features
<Cards>
<Card title="Team Management" href="/permissions/roles-and-permissions">
Set up workspace roles and permissions
</Card>
<Card title="YAML Configuration" href="/yaml">
Define workflows as code
</Card>
<Card title="MCP Integration" href="/mcp">
Connect external services with Model Context Protocol
</Card>
<Card title="SDKs" href="/sdks">
Integrate Sim into your applications
</Card>
</Cards>

View File

@@ -1,85 +0,0 @@
---
title: Introduction
---
import { Card, Cards } from 'fumadocs-ui/components/card'
import { Callout } from 'fumadocs-ui/components/callout'
import { Image } from '@/components/ui/image'
Sim is a visual workflow builder for AI applications that lets you build AI agent workflows visually. Create powerful AI agents, automation workflows, and data processing pipelines by connecting blocks on a canvas—no coding required.
<div className="flex justify-center">
<Image
src="/static/introduction.png"
alt="Sim visual workflow canvas"
width={700}
height={450}
className="my-6"
/>
</div>
## What You Can Build
**AI Assistants & Chatbots**
Create intelligent agents that can search the web, access your calendar, send emails, and interact with your business tools.
**Business Process Automation**
Automate repetitive tasks like data entry, report generation, customer support responses, and content creation.
**Data Processing & Analysis**
Extract insights from documents, analyze datasets, generate reports, and sync data between systems.
**API Integration Workflows**
Connect multiple services into unified endpoints, orchestrate complex business logic, and handle event-driven automation.
## How It Works
**Visual Canvas**
Drag and drop blocks to build workflows. Connect AI models, databases, APIs, and business tools with simple point-and-click connections.
**Smart Blocks**
Choose from processing blocks (AI agents, APIs, functions), logic blocks (conditions, loops, routers), and output blocks (responses, evaluators).
**Multiple Triggers**
Start workflows via chat interface, REST API, webhooks, scheduled jobs, or external events from services like Slack and GitHub.
**Team Collaboration**
Work simultaneously with team members on the same workflow with real-time editing and permissions management.
## Built-in Integrations
Sim connects to 80+ services out of the box:
- **AI Models**: OpenAI, Anthropic, Google, Groq, Cerebras, local Ollama models
- **Communication**: Gmail, Slack, Teams, Telegram, WhatsApp
- **Productivity**: Notion, Google Sheets, Airtable, Monday.com
- **Development**: GitHub, Jira, Linear, browser automation
- **Search & Web**: Google Search, Perplexity, Firecrawl, Exa AI
- **Databases**: PostgreSQL, MySQL, Supabase, Pinecone, Qdrant
Need something custom? Use our [MCP integration](/mcp) to connect any external service.
## Deployment Options
**Cloud-hosted**: Get started instantly at [sim.ai](https://sim.ai) with managed infrastructure, automatic scaling, and built-in monitoring.
**Self-hosted**: Deploy on your own infrastructure using Docker, with support for local AI models via Ollama for complete data privacy.
## Next Steps
Ready to build your first AI workflow?
<Cards>
<Card title="Getting Started" href="/getting-started">
Create your first workflow in 10 minutes
</Card>
<Card title="Workflow Blocks" href="/blocks">
Learn about the building blocks
</Card>
<Card title="Tools & Integrations" href="/tools">
Explore 60+ built-in integrations
</Card>
<Card title="Team Permissions" href="/permissions/roles-and-permissions">
Set up workspace roles and permissions
</Card>
</Cards>

View File

@@ -1,113 +0,0 @@
---
title: Knowledgebase
---
import { Video } from '@/components/ui/video'
import { Image } from '@/components/ui/image'
The knowledgebase allows you to upload, process, and search through your documents with intelligent vector search and chunking. Documents of various types are automatically processed, embedded, and made searchable. Your documents are intelligently chunked, and you can view, edit, and search through them using natural language queries.
## Upload and Processing
Simply upload your documents to get started. Sim automatically processes them in the background, extracting text, creating embeddings, and breaking them into searchable chunks.
<div className="mx-auto w-full overflow-hidden rounded-lg">
<Video src="knowledgebase-1.mp4" width={700} height={450} />
</div>
The system handles the entire processing pipeline for you:
1. **Text Extraction**: Content is extracted from your documents using specialized parsers for each file type
2. **Intelligent Chunking**: Documents are broken into meaningful chunks with configurable size and overlap
3. **Embedding Generation**: Vector embeddings are created for semantic search capabilities
4. **Processing Status**: Track the progress as your documents are processed
## Supported File Types
Sim supports PDF, Word (DOC/DOCX), plain text (TXT), Markdown (MD), HTML, Excel (XLS/XLSX), PowerPoint (PPT/PPTX), and CSV files. Files can be up to 100MB each, with optimal performance for files under 50MB. You can upload multiple documents simultaneously, and PDF files include OCR processing for scanned documents.
## Viewing and Editing Chunks
Once your documents are processed, you can view and edit the individual chunks. This gives you full control over how your content is organized and searched.
<Image src="/static/knowledgebase/knowledgebase.png" alt="Document chunks view showing processed content" width={800} height={500} />
### Chunk Configuration
- **Default chunk size**: 1,024 characters
- **Configurable range**: 100-4,000 characters per chunk
- **Smart overlap**: 200 characters by default for context preservation
- **Hierarchical splitting**: Respects document structure (sections, paragraphs, sentences)
### Editing Capabilities
- **Edit chunk content**: Modify the text content of individual chunks
- **Adjust chunk boundaries**: Merge or split chunks as needed
- **Add metadata**: Enhance chunks with additional context
- **Bulk operations**: Manage multiple chunks efficiently
## Advanced PDF Processing
For PDF documents, Sim offers enhanced processing capabilities:
### OCR Support
When configured with Azure or [Mistral OCR](https://docs.mistral.ai/ocr/):
- **Scanned document processing**: Extract text from image-based PDFs
- **Mixed content handling**: Process PDFs with both text and images
- **High accuracy**: Advanced AI models ensure accurate text extraction
## Using The Knowledge Block in Workflows
Once your documents are processed, you can use them in your AI workflows through the Knowledge block. This enables Retrieval-Augmented Generation (RAG), allowing your AI agents to access and reason over your document content to provide more accurate, contextual responses.
<Image src="/static/knowledgebase/knowledgebase-2.png" alt="Using Knowledge Block in Workflows" width={800} height={500} />
### Knowledge Block Features
- **Semantic search**: Find relevant content using natural language queries
- **Context integration**: Automatically include relevant chunks in agent prompts
- **Dynamic retrieval**: Search happens in real-time during workflow execution
- **Relevance scoring**: Results ranked by semantic similarity
### Integration Options
- **System prompts**: Provide context to your AI agents
- **Dynamic context**: Search and include relevant information during conversations
- **Multi-document search**: Query across your entire knowledgebase
- **Filtered search**: Combine with tags for precise content retrieval
## Vector Search Technology
Sim uses vector search powered by [pgvector](https://github.com/pgvector/pgvector) to understand the meaning and context of your content:
### Semantic Understanding
- **Contextual search**: Finds relevant content even when exact keywords don't match
- **Concept-based retrieval**: Understands relationships between ideas
- **Multi-language support**: Works across different languages
- **Synonym recognition**: Finds related terms and concepts
### Search Capabilities
- **Natural language queries**: Ask questions in plain English
- **Similarity search**: Find conceptually similar content
- **Hybrid search**: Combines vector and traditional keyword search
- **Configurable results**: Control the number and relevance threshold of results
## Document Management
### Organization Features
- **Bulk upload**: Upload multiple files at once via the asynchronous API
- **Processing status**: Real-time updates on document processing
- **Search and filter**: Find documents quickly in large collections
- **Metadata tracking**: Automatic capture of file information and processing details
### Security and Privacy
- **Secure storage**: Documents stored with enterprise-grade security
- **Access control**: Workspace-based permissions
- **Processing isolation**: Each workspace has isolated document processing
- **Data retention**: Configure document retention policies
## Getting Started
1. **Navigate to your knowledgebase**: Access from your workspace sidebar
2. **Upload documents**: Drag and drop or select files to upload
3. **Monitor processing**: Watch as documents are processed and chunked
4. **Explore chunks**: View and edit the processed content
5. **Add to workflows**: Use the Knowledge block to integrate with your AI agents
The knowledgebase transforms your static documents into an intelligent, searchable resource that your AI workflows can leverage for more informed and contextual responses.

View File

@@ -1,108 +0,0 @@
---
title: Tags and Filtering
---
import { Video } from '@/components/ui/video'
Tags provide a powerful way to organize your documents and create precise filtering for your vector searches. By combining tag-based filtering with semantic search, you can retrieve exactly the content you need from your knowledgebase.
## Adding Tags to Documents
You can add custom tags to any document in your knowledgebase to organize and categorize your content for easier retrieval.
<div className="mx-auto w-full overflow-hidden rounded-lg">
<Video src="knowledgebase-tag.mp4" width={700} height={450} />
</div>
### Tag Management
- **Custom tags**: Create your own tag system that fits your workflow
- **Multiple tags per document**: Apply as many tags as needed to each document, there are 7 tag slots available per knowledgebase that are shared by all documents in the knowledgebase
- **Tag organization**: Group related documents with consistent tagging
### Tag Best Practices
- **Consistent naming**: Use standardized tag names across your documents
- **Descriptive tags**: Use clear, meaningful tag names
- **Regular cleanup**: Remove unused or outdated tags periodically
## Using Tags in Knowledge Blocks
Tags become powerful when combined with the Knowledge block in your workflows. You can filter your searches to specific tagged content, ensuring your AI agents get the most relevant information.
<div className="mx-auto w-full overflow-hidden rounded-lg">
<Video src="knowledgebase-tag2.mp4" width={700} height={450} />
</div>
## Search Modes
The Knowledge block supports three different search modes depending on what you provide:
### 1. Tag-Only Search
When you **only provide tags** (no search query):
- **Direct retrieval**: Fetches all documents that have the specified tags
- **No vector search**: Results are based purely on tag matching
- **Fast performance**: Quick retrieval without semantic processing
- **Exact matching**: Only documents with all specified tags are returned
**Use case**: When you need all documents from a specific category or project
### 2. Vector Search Only
When you **only provide a search query** (no tags):
- **Semantic search**: Finds content based on meaning and context
- **Full knowledgebase**: Searches across all documents
- **Relevance ranking**: Results ordered by semantic similarity
- **Natural language**: Use questions or phrases to find relevant content
**Use case**: When you need the most relevant content regardless of organization
### 3. Combined Tag Filtering + Vector Search
When you **provide both tags and a search query**:
1. **First**: Filter documents to only those with the specified tags
2. **Then**: Perform vector search within that filtered subset
3. **Result**: Semantically relevant content from your tagged documents only
**Use case**: When you need relevant content from a specific category or project
### Search Configuration
#### Tag Filtering
- **Multiple tags**: Use multiple tags for OR logic (document must have one or more of the tags)
- **Tag combinations**: Mix different tag types for precise filtering
- **Case sensitivity**: Tag matching is case-insensitive
- **Partial matching**: Exact tag name matching required
#### Vector Search Parameters
- **Query complexity**: Natural language questions work best
- **Result limits**: Configure how many chunks to retrieve
- **Relevance threshold**: Set minimum similarity scores
- **Context window**: Adjust chunk size for your use case
## Integration with Workflows
### Knowledge Block Configuration
1. **Select knowledgebase**: Choose which knowledgebase to search
2. **Add tags**: Specify filtering tags (optional)
3. **Enter query**: Add your search query (optional)
4. **Configure results**: Set number of chunks to retrieve
5. **Test search**: Preview results before using in workflow
### Dynamic Tag Usage
- **Variable tags**: Use workflow variables as tag values
- **Conditional filtering**: Apply different tags based on workflow logic
- **Context-aware search**: Adjust tags based on conversation context
- **Multi-step filtering**: Refine searches through workflow steps
### Performance Optimization
- **Efficient filtering**: Tag filtering happens before vector search for better performance
- **Caching**: Frequently used tag combinations are cached for speed
- **Parallel processing**: Multiple tag searches can run simultaneously
- **Resource management**: Automatic optimization of search resources
## Getting Started with Tags
1. **Plan your tag structure**: Decide on consistent naming conventions
2. **Start tagging**: Add relevant tags to your existing documents
3. **Test combinations**: Experiment with tag + search query combinations
4. **Integrate into workflows**: Use the Knowledge block with your tagging strategy
5. **Refine over time**: Adjust your tagging approach based on search results
Tags transform your knowledgebase from a simple document store into a precisely organized, searchable intelligence system that your AI workflows can navigate with surgical precision.

View File

@@ -1,140 +0,0 @@
---
title: MCP (Model Context Protocol)
---
import { Video } from '@/components/ui/video'
import { Callout } from 'fumadocs-ui/components/callout'
The Model Context Protocol ([MCP](https://modelcontextprotocol.com/)) allows you to connect external tools and services using a standardized protocol, enabling you to integrate APIs and services directly into your workflows. With MCP, you can extend Sim's capabilities by adding custom integrations that work seamlessly with your agents and workflows.
## What is MCP?
MCP is an open standard that enables AI assistants to securely connect to external data sources and tools. It provides a standardized way to:
- Connect to databases, APIs, and file systems
- Access real-time data from external services
- Execute custom tools and scripts
- Maintain secure, controlled access to external resources
## Adding MCP Servers
MCP servers provide collections of tools that your agents can use. You can add MCP servers in two ways:
### From Workspace Settings
Configure MCP servers at the workspace level so all team members can use them:
<div className="mx-auto w-full overflow-hidden rounded-lg">
<Video src="mcp-1.mp4" width={700} height={450} />
</div>
1. Navigate to your workspace settings
2. Go to the **MCP Servers** section
3. Click **Add MCP Server**
4. Enter the server configuration details
5. Save the configuration
<Callout type="info">
MCP servers configured in workspace settings are available to all workspace members based on their permission levels.
</Callout>
### From Agent Configuration
You can also add and configure MCP servers directly from within an agent block:
<div className="mx-auto w-full overflow-hidden rounded-lg">
<Video src="mcp-2.mp4" width={700} height={450} />
</div>
This is useful when you need to quickly set up a specific integration for a particular workflow.
## Using MCP Tools in Agents
Once MCP servers are configured, their tools become available within your agent blocks:
<div className="mx-auto w-full overflow-hidden rounded-lg">
<Video src="mcp-3.mp4" width={700} height={450} />
</div>
1. Open an **Agent** block
2. In the **Tools** section, you'll see available MCP tools
3. Select the tools you want the agent to use
4. The agent can now access these tools during execution
## Standalone MCP Tool Block
For more granular control, you can use the dedicated MCP Tool block to execute specific MCP tools:
<div className="mx-auto w-full overflow-hidden rounded-lg">
<Video src="mcp-4.mp4" width={700} height={450} />
</div>
The MCP Tool block allows you to:
- Execute any configured MCP tool directly
- Pass specific parameters to the tool
- Use the tool's output in subsequent workflow steps
- Chain multiple MCP tools together
### When to Use MCP Tool vs Agent
**Use Agent with MCP tools when:**
- You want the AI to decide which tools to use
- You need complex reasoning about when and how to use tools
- You want natural language interaction with the tools
**Use MCP Tool block when:**
- You need deterministic tool execution
- You want to execute a specific tool with known parameters
- You're building structured workflows with predictable steps
## Permission Requirements
MCP functionality requires specific workspace permissions:
| Action | Required Permission |
|--------|-------------------|
| Configure MCP servers in settings | **Admin** |
| Use MCP tools in agents | **Write** or **Admin** |
| View available MCP tools | **Read**, **Write**, or **Admin** |
| Execute MCP Tool blocks | **Write** or **Admin** |
## Common Use Cases
### Database Integration
Connect to databases to query, insert, or update data within your workflows.
### API Integrations
Access external APIs and web services that don't have built-in Sim integrations.
### File System Access
Read, write, and manipulate files on local or remote file systems.
### Custom Business Logic
Execute custom scripts or tools specific to your organization's needs.
### Real-time Data Access
Fetch live data from external systems during workflow execution.
## Security Considerations
- MCP servers run with the permissions of the user who configured them
- Always verify MCP server sources before installation
- Use environment variables for sensitive configuration data
- Review MCP server capabilities before granting access to agents
## Troubleshooting
### MCP Server Not Appearing
- Verify the server configuration is correct
- Check that you have the required permissions
- Ensure the MCP server is running and accessible
### Tool Execution Failures
- Verify tool parameters are correctly formatted
- Check MCP server logs for error messages
- Ensure required authentication is configured
### Permission Errors
- Confirm your workspace permission level
- Check if the MCP server requires additional authentication
- Verify the server is properly configured for your workspace

View File

@@ -1,161 +0,0 @@
---
title: "Roles and Permissions"
---
import { Video } from '@/components/ui/video'
When you invite team members to your organization or workspace, you'll need to choose what level of access to give them. This guide explains what each permission level allows users to do, helping you understand team roles and what access each permission level provides.
## How to Invite Someone to a Workspace
<div className="mx-auto w-full overflow-hidden rounded-lg">
<Video src="invitations.mp4" width={700} height={450} />
</div>
## Workspace Permission Levels
When inviting someone to a workspace, you can assign one of three permission levels:
| Permission | What They Can Do |
|------------|------------------|
| **Read** | View workflows, see execution results, but cannot make any changes |
| **Write** | Create and edit workflows, run workflows, manage environment variables |
| **Admin** | Everything Write can do, plus invite/remove users and manage workspace settings |
## What Each Permission Level Can Do
Here's a detailed breakdown of what users can do with each permission level:
### Read Permission
**Perfect for:** Stakeholders, observers, or team members who need visibility but shouldn't make changes
**What they can do:**
- View all workflows in the workspace
- See workflow execution results and logs
- Browse workflow configurations and settings
- View environment variables (but not edit them)
**What they cannot do:**
- Create, edit, or delete workflows
- Run or deploy workflows
- Change any workspace settings
- Invite other users
### Write Permission
**Perfect for:** Developers, content creators, or team members actively working on automation
**What they can do:**
- Everything Read users can do, plus:
- Create, edit, and delete workflows
- Run and deploy workflows
- Add, edit, and delete workspace environment variables
- Use all available tools and integrations
- Collaborate in real-time on workflow editing
**What they cannot do:**
- Invite or remove users from the workspace
- Change workspace settings
- Delete the workspace
### Admin Permission
**Perfect for:** Team leads, project managers, or technical leads who need to manage the workspace
**What they can do:**
- Everything Write users can do, plus:
- Invite new users to the workspace with any permission level
- Remove users from the workspace
- Manage workspace settings and integrations
- Configure external tool connections
- Delete workflows created by other users
**What they cannot do:**
- Delete the workspace (only the workspace owner can do this)
- Remove the workspace owner from the workspace
---
## Workspace Owner vs Admin
Every workspace has one **Owner** (the person who created it) plus any number of **Admins**.
### Workspace Owner
- Has all Admin permissions
- Can delete the workspace
- Cannot be removed from the workspace
- Can transfer ownership to another user
### Workspace Admin
- Can do everything except delete the workspace or remove the owner
- Can be removed from the workspace by the owner or other admins
---
## Common Scenarios
### Adding a New Developer to Your Team
1. **Organization level**: Invite them as an **Organization Member**
2. **Workspace level**: Give them **Write** permission so they can create and edit workflows
### Adding a Project Manager
1. **Organization level**: Invite them as an **Organization Member**
2. **Workspace level**: Give them **Admin** permission so they can manage the team and see everything
### Adding a Stakeholder or Client
1. **Organization level**: Invite them as an **Organization Member**
2. **Workspace level**: Give them **Read** permission so they can see progress but not make changes
---
## Environment Variables
Users can create two types of environment variables:
### Personal Environment Variables
- Only visible to the individual user
- Available in all workflows they run
- Managed in user settings
### Workspace Environment Variables
- **Read permission**: Can see variable names and values
- **Write/Admin permission**: Can add, edit, and delete variables
- Available to all workspace members
- If a personal variable has the same name as a workspace variable, the personal one takes priority
---
## Best Practices
### Start with Minimal Permissions
Give users the lowest permission level they need to do their job. You can always increase permissions later.
### Use Organization Structure Wisely
- Make trusted team leads **Organization Admins**
- Most team members should be **Organization Members**
- Reserve workspace **Admin** permissions for people who need to manage users
### Review Permissions Regularly
Periodically review who has access to what, especially when team members change roles or leave the company.
### Environment Variable Security
- Use personal environment variables for sensitive API keys
- Use workspace environment variables for shared configuration
- Regularly audit who has access to sensitive variables
---
## Organization Roles
When inviting someone to your organization, you can assign one of two roles:
### Organization Admin
**What they can do:**
- Invite and remove team members from the organization
- Create new workspaces
- Manage billing and subscription settings
- Access all workspaces within the organization
### Organization Member
**What they can do:**
- Access workspaces they've been specifically invited to
- View the list of organization members
- Cannot invite new people or manage organization settings

View File

@@ -1,86 +0,0 @@
---
title: Google Forms
description: Read responses from a Google Form
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="google_forms"
color="#E0E0E0"
icon={true}
iconSvg={`<svg className="block-icon" xmlns='http://www.w3.org/2000/svg' viewBox='0 0 48 65' fill='none'>
<path
d='M29.583 0H4.438C1.997 0 0 1.997 0 4.438v56.208C0 63.086 1.997 65.083 4.438 65.083h38.458c2.44 0 4.437-1.997 4.437-4.437V17.75L36.979 10.354 29.583 0Z'
fill='#673AB7'
/>
<path
d='M29.583 0v10.354c0 2.45 1.986 4.438 4.438 4.438h13.312L36.979 10.354 29.583 0Z'
fill='#B39DDB'
/>
<path
d='M19.229 50.292h16.271v-2.959H19.229v2.959Zm0-17.75v2.958h16.271v-2.958H19.229Zm-3.698 1.479c0 1.224-0.995 2.219-2.219 2.219s-2.219-0.995-2.219-2.219c0-1.224 0.995-2.219 2.219-2.219s2.219 0.995 2.219 2.219Zm0 7.396c0 1.224-0.995 2.219-2.219 2.219s-2.219-0.995-2.219-2.219c0-1.224 0.995-2.219 2.219-2.219s2.219 0.995 2.219 2.219Zm0 7.396c0 1.224-0.995 2.219-2.219 2.219s-2.219-0.995-2.219-2.219c0-1.224 0.995-2.219 2.219-2.219s2.219 0.995 2.219 2.219Zm3.698-5.917h16.271v-2.959H19.229v2.959Z'
fill='#F1F1F1'
/>
<defs>
<linearGradient
id='gf-gradient'
x1='30.881'
y1='16.452'
x2='47.333'
y2='32.9'
gradientUnits='userSpaceOnUse'
>
<stop stopColor='#9575CD' />
<stop offset='1' stopColor='#7E57C2' />
</linearGradient>
</defs>
</svg>`}
/>
{/* MANUAL-CONTENT-START:intro */}
[Google Forms](https://forms.google.com) is Google's online survey and form tool that allows users to create forms, collect responses, and analyze results. As part of Google's productivity suite, Google Forms makes it easy to gather information, feedback, and data from users.
Learn how to integrate the Google Forms tool in Sim to automatically read and process form responses in your workflows. This tutorial walks you through connecting Google Forms, retrieving responses, and using collected data to power automation. Perfect for syncing survey results, registrations, or feedback with your agents in real-time.
With Google Forms, you can:
- **Create surveys and forms**: Design custom forms for feedback, registration, quizzes, and more
- **Collect responses automatically**: Gather data from users in real-time
- **Analyze results**: View responses in Google Forms or export to Google Sheets for further analysis
- **Collaborate easily**: Share forms and work with others to build and review questions
- **Integrate with other Google services**: Connect with Google Sheets, Drive, and more
In Sim, the Google Forms integration enables your agents to programmatically access form responses. This allows for powerful automation scenarios such as processing survey data, triggering workflows based on new submissions, and syncing form results with other tools. Your agents can fetch all responses for a form, retrieve a specific response, and use the data to drive intelligent automation. By connecting Sim with Google Forms, you can automate data collection, streamline feedback processing, and incorporate form responses into your agent's capabilities.
{/* MANUAL-CONTENT-END */}
## Usage Instructions
Integrate Google Forms into your workflow. Provide a Form ID to list responses, or specify a Response ID to fetch a single response. Requires OAuth.
## Tools
### `google_forms_get_responses`
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| formId | string | Yes | The ID of the Google Form |
| responseId | string | No | If provided, returns this specific response |
| pageSize | number | No | Max responses to return (service may return fewer). Defaults to 5000 |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `data` | json | Response or list of responses |
## Notes
- Category: `tools`
- Type: `google_forms`

View File

@@ -1,70 +0,0 @@
---
title: Mail
description: Send emails using the internal mail service
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="mail"
color="#181C1E"
icon={true}
iconSvg={`<svg className="block-icon"
viewBox='0 0 30 24'
fill='none'
xmlns='http://www.w3.org/2000/svg'
>
<path
d='M2.35742 5.83288L11.7674 12.1071C13.0656 12.9712 13.7141 13.404 14.4151 13.5725C15.0352 13.7208 15.681 13.7208 16.2998 13.5725C17.0008 13.404 17.6492 12.9712 18.9475 12.1071L28.3574 5.83288M8.82844 21.7219H21.8864C24.1513 21.7219 25.2837 21.7219 26.1492 21.2811C26.9097 20.8931 27.5278 20.2744 27.9152 19.5137C28.3574 18.6482 28.3574 17.5158 28.3574 15.2509V7.97102C28.3574 5.70616 28.3574 4.57373 27.9166 3.70823C27.5288 2.94727 26.9102 2.32858 26.1492 1.94084C25.2837 1.5 24.1513 1.5 21.8864 1.5H8.82844C6.56358 1.5 5.43115 1.5 4.56566 1.94084C3.80519 2.32881 3.187 2.94747 2.79961 3.70823C2.35742 4.57373 2.35742 5.70616 2.35742 7.97102V15.2509C2.35742 17.5158 2.35742 18.6482 2.79826 19.5137C3.186 20.2747 3.80469 20.8933 4.56566 21.2811C5.43115 21.7219 6.56358 21.7219 8.82844 21.7219Z'
stroke='currentColor'
strokeWidth='2.5'
strokeLinecap='round'
strokeLinejoin='round'
/>
</svg>`}
/>
{/* MANUAL-CONTENT-START:intro */}
The Mail block allows you to send emails directly from your workflows using Sim's own mail sending infrastructure powered by [Resend](https://resend.com/). This integration enables you to programmatically deliver notifications, alerts, and other important information to users' email addresses without requiring any external configuration or OAuth.
Our internal mail service is designed for reliability and ease of use, making it ideal for automating communications and ensuring your messages reach recipients efficiently.
{/* MANUAL-CONTENT-END */}
## Usage Instructions
Send emails directly using the internal mail service. Uses MAIL_BLOCK_FROM_ADDRESS if configured, otherwise falls back to FROM_EMAIL_ADDRESS. No external configuration or OAuth required. Perfect for sending notifications, alerts, or general purpose emails from your workflows. Supports HTML formatting.
## Tools
### `mail_send`
Send an email using the internal mail service without requiring OAuth or external configuration
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `to` | string | Yes | Recipient email address |
| `subject` | string | Yes | Email subject |
| `body` | string | Yes | Email body content |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Whether the email was sent successfully |
| `to` | string | Recipient email address |
| `subject` | string | Email subject |
| `body` | string | Email body content |
## Notes
- Category: `tools`
- Type: `mail`

View File

@@ -1,40 +0,0 @@
---
title: MCP Tool
description: Execute tools from Model Context Protocol (MCP) servers
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="mcp"
color="#181C1E"
icon={true}
iconSvg={`<svg className="block-icon"
xmlns='http://www.w3.org/2000/svg'
viewBox='0 0 24 24'
fill='none'
stroke='currentColor'
strokeWidth='2'
strokeLinecap='round'
strokeLinejoin='round'
>
<rect x='2' y='2' rx='2' ry='2' />
<rect x='2' y='14' rx='2' ry='2' />
<line x1='6' x2='6.01' y1='6' y2='6' />
<line x1='6' x2='6.01' y1='18' y2='18' />
</svg>`}
/>
## Usage Instructions
Integrate MCP into the workflow. Can execute tools from MCP servers. Requires MCP servers in workspace settings.
## Notes
- Category: `tools`
- Type: `mcp`

View File

@@ -1,264 +0,0 @@
---
title: MongoDB
description: Connect to MongoDB database
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="mongodb"
color="#E0E0E0"
icon={true}
iconSvg={`<svg className="block-icon" xmlns='http://www.w3.org/2000/svg' viewBox='0 0 128 128'>
<path
fillRule='evenodd'
clipRule='evenodd'
fill='currentColor'
d='M88.038 42.812c1.605 4.643 2.761 9.383 3.141 14.296.472 6.095.256 12.147-1.029 18.142-.035.165-.109.32-.164.48-.403.001-.814-.049-1.208.012-3.329.523-6.655 1.065-9.981 1.604-3.438.557-6.881 1.092-10.313 1.687-1.216.21-2.721-.041-3.212 1.641-.014.046-.154.054-.235.08l.166-10.051-.169-24.252 1.602-.275c2.62-.429 5.24-.864 7.862-1.281 3.129-.497 6.261-.98 9.392-1.465 1.381-.215 2.764-.412 4.148-.618z'
/>
<path
fillRule='evenodd'
clipRule='evenodd'
fill='#45A538'
d='M61.729 110.054c-1.69-1.453-3.439-2.842-5.059-4.37-8.717-8.222-15.093-17.899-18.233-29.566-.865-3.211-1.442-6.474-1.627-9.792-.13-2.322-.318-4.665-.154-6.975.437-6.144 1.325-12.229 3.127-18.147l.099-.138c.175.233.427.439.516.702 1.759 5.18 3.505 10.364 5.242 15.551 5.458 16.3 10.909 32.604 16.376 48.9.107.318.384.579.583.866l-.87 2.969z'
/>
<path
fillRule='evenodd'
clipRule='evenodd'
fill='#46A037'
d='M88.038 42.812c-1.384.206-2.768.403-4.149.616-3.131.485-6.263.968-9.392 1.465-2.622.417-5.242.852-7.862 1.281l-1.602.275-.012-1.045c-.053-.859-.144-1.717-.154-2.576-.069-5.478-.112-10.956-.18-16.434-.042-3.429-.105-6.857-.175-10.285-.043-2.13-.089-4.261-.185-6.388-.052-1.143-.236-2.28-.311-3.423-.042-.657.016-1.319.029-1.979.817 1.583 1.616 3.178 2.456 4.749 1.327 2.484 3.441 4.314 5.344 6.311 7.523 7.892 12.864 17.068 16.193 27.433z'
/>
<path
fillRule='evenodd'
clipRule='evenodd'
fill='#409433'
d='M65.036 80.753c.081-.026.222-.034.235-.08.491-1.682 1.996-1.431 3.212-1.641 3.432-.594 6.875-1.13 10.313-1.687 3.326-.539 6.652-1.081 9.981-1.604.394-.062.805-.011 1.208-.012-.622 2.22-1.112 4.488-1.901 6.647-.896 2.449-1.98 4.839-3.131 7.182a49.142 49.142 0 01-6.353 9.763c-1.919 2.308-4.058 4.441-6.202 6.548-1.185 1.165-2.582 2.114-3.882 3.161l-.337-.23-1.214-1.038-1.256-2.753a41.402 41.402 0 01-1.394-9.838l.023-.561.171-2.426c.057-.828.133-1.655.168-2.485.129-2.982.241-5.964.359-8.946z'
/>
<path
fillRule='evenodd'
clipRule='evenodd'
fill='#4FAA41'
d='M65.036 80.753c-.118 2.982-.23 5.964-.357 8.947-.035.83-.111 1.657-.168 2.485l-.765.289c-1.699-5.002-3.399-9.951-5.062-14.913-2.75-8.209-5.467-16.431-8.213-24.642a4498.887 4498.887 0 00-6.7-19.867c-.105-.31-.407-.552-.617-.826l4.896-9.002c.168.292.39.565.496.879a6167.476 6167.476 0 016.768 20.118c2.916 8.73 5.814 17.467 8.728 26.198.116.349.308.671.491 1.062l.67-.78-.167 10.052z'
/>
<path
fillRule='evenodd'
clipRule='evenodd'
fill='#4AA73C'
d='M43.155 32.227c.21.274.511.516.617.826a4498.887 4498.887 0 016.7 19.867c2.746 8.211 5.463 16.433 8.213 24.642 1.662 4.961 3.362 9.911 5.062 14.913l.765-.289-.171 2.426-.155.559c-.266 2.656-.49 5.318-.814 7.968-.163 1.328-.509 2.632-.772 3.947-.198-.287-.476-.548-.583-.866-5.467-16.297-10.918-32.6-16.376-48.9a3888.972 3888.972 0 00-5.242-15.551c-.089-.263-.34-.469-.516-.702l3.272-8.84z'
/>
<path
fillRule='evenodd'
clipRule='evenodd'
fill='#57AE47'
d='M65.202 70.702l-.67.78c-.183-.391-.375-.714-.491-1.062-2.913-8.731-5.812-17.468-8.728-26.198a6167.476 6167.476 0 00-6.768-20.118c-.105-.314-.327-.588-.496-.879l6.055-7.965c.191.255.463.482.562.769 1.681 4.921 3.347 9.848 5.003 14.778 1.547 4.604 3.071 9.215 4.636 13.813.105.308.47.526.714.786l.012 1.045c.058 8.082.115 16.167.171 24.251z'
/>
<path
fillRule='evenodd'
clipRule='evenodd'
fill='#60B24F'
d='M65.021 45.404c-.244-.26-.609-.478-.714-.786-1.565-4.598-3.089-9.209-4.636-13.813-1.656-4.93-3.322-9.856-5.003-14.778-.099-.287-.371-.514-.562-.769 1.969-1.928 3.877-3.925 5.925-5.764 1.821-1.634 3.285-3.386 3.352-5.968.003-.107.059-.214.145-.514l.519 1.306c-.013.661-.072 1.322-.029 1.979.075 1.143.259 2.28.311 3.423.096 2.127.142 4.258.185 6.388.069 3.428.132 6.856.175 10.285.067 5.478.111 10.956.18 16.434.008.861.098 1.718.152 2.577z'
/>
<path
fillRule='evenodd'
clipRule='evenodd'
fill='#A9AA88'
d='M62.598 107.085c.263-1.315.609-2.62.772-3.947.325-2.649.548-5.312.814-7.968l.066-.01.066.011a41.402 41.402 0 001.394 9.838c-.176.232-.425.439-.518.701-.727 2.05-1.412 4.116-2.143 6.166-.1.28-.378.498-.574.744l-.747-2.566.87-2.969z'
/>
<path
fillRule='evenodd'
clipRule='evenodd'
fill='#B6B598'
d='M62.476 112.621c.196-.246.475-.464.574-.744.731-2.05 1.417-4.115 2.143-6.166.093-.262.341-.469.518-.701l1.255 2.754c-.248.352-.59.669-.728 1.061l-2.404 7.059c-.099.283-.437.483-.663.722l-.695-3.985z'
/>
<path
fillRule='evenodd'
clipRule='evenodd'
fill='#C2C1A7'
d='M63.171 116.605c.227-.238.564-.439.663-.722l2.404-7.059c.137-.391.48-.709.728-1.061l1.215 1.037c-.587.58-.913 1.25-.717 2.097l-.369 1.208c-.168.207-.411.387-.494.624-.839 2.403-1.64 4.819-2.485 7.222-.107.305-.404.544-.614.812-.109-1.387-.22-2.771-.331-4.158z'
/>
<path
fillRule='evenodd'
clipRule='evenodd'
fill='#CECDB7'
d='M63.503 120.763c.209-.269.506-.508.614-.812.845-2.402 1.646-4.818 2.485-7.222.083-.236.325-.417.494-.624l-.509 5.545c-.136.157-.333.294-.398.477-.575 1.614-1.117 3.24-1.694 4.854-.119.333-.347.627-.525.938-.158-.207-.441-.407-.454-.623-.051-.841-.016-1.688-.013-2.533z'
/>
<path
fillRule='evenodd'
clipRule='evenodd'
fill='#DBDAC7'
d='M63.969 123.919c.178-.312.406-.606.525-.938.578-1.613 1.119-3.239 1.694-4.854.065-.183.263-.319.398-.477l.012 3.64-1.218 3.124-1.411-.495z'
/>
<path
fillRule='evenodd'
clipRule='evenodd'
fill='#EBE9DC'
d='M65.38 124.415l1.218-3.124.251 3.696-1.469-.572z'
/>
<path
fillRule='evenodd'
clipRule='evenodd'
fill='#CECDB7'
d='M67.464 110.898c-.196-.847.129-1.518.717-2.097l.337.23-1.054 1.867z'
/>
<path
fillRule='evenodd'
clipRule='evenodd'
fill='#4FAA41'
d='M64.316 95.172l-.066-.011-.066.01.155-.559-.023.56z'
/>
</svg>`}
/>
## Usage Instructions
Integrate MongoDB into the workflow. Can find, insert, update, delete, and aggregate data.
## Tools
### `mongodb_query`
Execute find operation on MongoDB collection
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `host` | string | Yes | MongoDB server hostname or IP address |
| `port` | number | Yes | MongoDB server port \(default: 27017\) |
| `database` | string | Yes | Database name to connect to |
| `username` | string | No | MongoDB username |
| `password` | string | No | MongoDB password |
| `authSource` | string | No | Authentication database |
| `ssl` | string | No | SSL connection mode \(disabled, required, preferred\) |
| `collection` | string | Yes | Collection name to query |
| `query` | string | No | MongoDB query filter as JSON string |
| `limit` | number | No | Maximum number of documents to return |
| `sort` | string | No | Sort criteria as JSON string |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `message` | string | Operation status message |
| `documents` | array | Array of documents returned from the query |
| `documentCount` | number | Number of documents returned |
### `mongodb_insert`
Insert documents into MongoDB collection
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `host` | string | Yes | MongoDB server hostname or IP address |
| `port` | number | Yes | MongoDB server port \(default: 27017\) |
| `database` | string | Yes | Database name to connect to |
| `username` | string | No | MongoDB username |
| `password` | string | No | MongoDB password |
| `authSource` | string | No | Authentication database |
| `ssl` | string | No | SSL connection mode \(disabled, required, preferred\) |
| `collection` | string | Yes | Collection name to insert into |
| `documents` | array | Yes | Array of documents to insert |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `message` | string | Operation status message |
| `documentCount` | number | Number of documents inserted |
| `insertedId` | string | ID of inserted document \(single insert\) |
| `insertedIds` | array | Array of inserted document IDs \(multiple insert\) |
### `mongodb_update`
Update documents in MongoDB collection
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `host` | string | Yes | MongoDB server hostname or IP address |
| `port` | number | Yes | MongoDB server port \(default: 27017\) |
| `database` | string | Yes | Database name to connect to |
| `username` | string | No | MongoDB username |
| `password` | string | No | MongoDB password |
| `authSource` | string | No | Authentication database |
| `ssl` | string | No | SSL connection mode \(disabled, required, preferred\) |
| `collection` | string | Yes | Collection name to update |
| `filter` | string | Yes | Filter criteria as JSON string |
| `update` | string | Yes | Update operations as JSON string |
| `upsert` | boolean | No | Create document if not found |
| `multi` | boolean | No | Update multiple documents |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `message` | string | Operation status message |
| `matchedCount` | number | Number of documents matched by filter |
| `modifiedCount` | number | Number of documents modified |
| `documentCount` | number | Total number of documents affected |
| `insertedId` | string | ID of inserted document \(if upsert\) |
### `mongodb_delete`
Delete documents from MongoDB collection
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `host` | string | Yes | MongoDB server hostname or IP address |
| `port` | number | Yes | MongoDB server port \(default: 27017\) |
| `database` | string | Yes | Database name to connect to |
| `username` | string | No | MongoDB username |
| `password` | string | No | MongoDB password |
| `authSource` | string | No | Authentication database |
| `ssl` | string | No | SSL connection mode \(disabled, required, preferred\) |
| `collection` | string | Yes | Collection name to delete from |
| `filter` | string | Yes | Filter criteria as JSON string |
| `multi` | boolean | No | Delete multiple documents |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `message` | string | Operation status message |
| `deletedCount` | number | Number of documents deleted |
| `documentCount` | number | Total number of documents affected |
### `mongodb_execute`
Execute MongoDB aggregation pipeline
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `host` | string | Yes | MongoDB server hostname or IP address |
| `port` | number | Yes | MongoDB server port \(default: 27017\) |
| `database` | string | Yes | Database name to connect to |
| `username` | string | No | MongoDB username |
| `password` | string | No | MongoDB password |
| `authSource` | string | No | Authentication database |
| `ssl` | string | No | SSL connection mode \(disabled, required, preferred\) |
| `collection` | string | Yes | Collection name to execute pipeline on |
| `pipeline` | string | Yes | Aggregation pipeline as JSON string |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `message` | string | Operation status message |
| `documents` | array | Array of documents returned from aggregation |
| `documentCount` | number | Number of documents returned |
## Notes
- Category: `tools`
- Type: `mongodb`

View File

@@ -1,53 +0,0 @@
---
title: SMS
description: Send SMS messages using the internal SMS service
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="sms"
color="#E0E0E0"
icon={true}
iconSvg={`<svg className="block-icon" fill="#000000" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg"><path d="M 2 5 L 2 25 L 7 25 L 7 30.09375 L 8.625 28.78125 L 13.34375 25 L 30 25 L 30 5 Z M 4 7 L 28 7 L 28 23 L 12.65625 23 L 12.375 23.21875 L 9 25.90625 L 9 23 L 4 23 Z M 8 12 L 8 14 L 24 14 L 24 12 Z M 8 16 L 8 18 L 20 18 L 20 16 Z"/></svg>`}
/>
{/* MANUAL-CONTENT-START:intro */}
The SMS block allows you to send text messages directly from your workflows using Sim's own SMS sending infrastructure powered by Twilio. This integration enables you to programmatically deliver notifications, alerts, and other important information to users' mobile devices without requiring any external configuration or OAuth.
Our internal SMS service is designed for reliability and ease of use, making it ideal for automating communications and ensuring your messages reach recipients efficiently.
{/* MANUAL-CONTENT-END */}
## Usage Instructions
Send SMS messages directly using the internal SMS service powered by Twilio. No external configuration or OAuth required. Perfect for sending notifications, alerts, or general purpose text messages from your workflows. Requires valid phone numbers with country codes.
## Tools
### `sms_send`
Send an SMS message using the internal SMS service powered by Twilio
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `to` | string | Yes | Recipient phone number \(include country code, e.g., +1234567890\) |
| `body` | string | Yes | SMS message content |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Whether the SMS was sent successfully |
| `to` | string | Recipient phone number |
| `body` | string | SMS message content |
## Notes
- Category: `tools`
- Type: `sms`

View File

@@ -1,63 +0,0 @@
---
title: Starter
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { Image } from '@/components/ui/image'
import { Video } from '@/components/ui/video'
The Starter block allows you to manually initiate workflow execution with input parameters, offering two input modes: structured parameters or conversational chat.
<div className="flex justify-center">
<Image
src="/static/starter.png"
alt="Starter Block with Manual and Chat Mode Options"
width={500}
height={400}
className="my-6"
/>
</div>
## Execution Modes
Choose your input method from the dropdown:
<Tabs items={['Manual Mode', 'Chat Mode']}>
<Tab>
<div className="space-y-4">
<ul className="list-disc space-y-1 pl-6">
<li><strong>API Friendly Structured inputs</strong>: Define specific parameters (text, number, boolean, JSON, file, date)</li>
<li><strong>Testing while Building Your Workflow</strong>: Quick iteration while debugging workflows</li>
</ul>
<div className="mx-auto w-full overflow-hidden rounded-lg">
<Video src="input-format.mp4" width={700} height={450} />
</div>
<p className="text-sm text-gray-600">Configure input parameters that will be available when deploying as an API endpoint.</p>
</div>
</Tab>
<Tab>
<div className="space-y-4">
<ul className="list-disc space-y-1 pl-6">
<li><strong>Natural language</strong>: Users type questions or requests</li>
<li><strong>Conversational</strong>: Ideal for AI-powered workflows</li>
</ul>
<div className="mx-auto w-full overflow-hidden rounded-lg">
<Video src="chat-input.mp4" width={700} height={450} />
</div>
<p className="text-sm text-gray-600">Chat with your workflow and access input text, conversation ID, and uploaded files for context-aware responses.</p>
</div>
</Tab>
</Tabs>
## Using Chat Variables
In Chat mode, access user input and conversation context through special variables:
- **`<start.input>`** - Contains the user's message text
- **`<start.conversationId>`** - Unique identifier for the conversation thread
- **`<start.files>`** - Array of files uploaded by the user (if any)

View File

@@ -1,126 +0,0 @@
---
title: Webhooks
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { Video } from '@/components/ui/video'
Webhooks allow external services to trigger workflow execution from external webhooks by sending HTTP requests to your workflow. Sim supports two approaches for webhook-based triggers.
## Generic Webhook Trigger
The Generic Webhook block creates a flexible endpoint that can receive any payload and trigger your workflow:
<div className="mx-auto w-full overflow-hidden rounded-lg">
<Video src="webhooks-1.mp4" width={700} height={450} />
</div>
### How It Works
1. **Add Generic Webhook Block** - Drag the Generic Webhook block to start your workflow
2. **Configure Payload** - Set up the expected payload structure (optional)
3. **Get Webhook URL** - Copy the automatically generated unique endpoint
4. **External Integration** - Configure your external service to send POST requests to this URL
5. **Workflow Execution** - Every request to the webhook URL triggers the workflow
### Features
- **Flexible Payload**: Accepts any JSON payload structure
- **Automatic Parsing**: Webhook data is automatically parsed and available to subsequent blocks
- **Authentication**: Optional bearer token or custom header authentication
- **Rate Limiting**: Built-in protection against abuse
- **Deduplication**: Prevents duplicate executions from repeated requests
<Callout type="info">
The Generic Webhook trigger fires every time the webhook URL receives a request, making it perfect for real-time integrations.
</Callout>
## Trigger Mode for Service Blocks
Alternatively, you can use specific service blocks (like Slack, GitHub, etc.) in "trigger mode" to create more specialized webhook endpoints:
<div className="mx-auto w-full overflow-hidden rounded-lg">
<Video src="slack-trigger.mp4" width={700} height={450} />
</div>
### Setting Up Trigger Mode
1. **Add Service Block** - Choose a service block (e.g., Slack, GitHub, Airtable)
2. **Enable Trigger Mode** - Toggle "Use as Trigger" in the block settings
3. **Configure Service** - Set up authentication and event filters specific to that service
4. **Webhook Registration** - The service automatically registers the webhook with the external platform
5. **Event-Based Execution** - Workflow triggers only for specific events from that service
### When to Use Each Approach
**Use Generic Webhook when:**
- Integrating with custom applications or services
- You need maximum flexibility in payload structure
- Working with services that don't have dedicated blocks
- Building internal integrations
**Use Trigger Mode when:**
- Working with supported services (Slack, GitHub, etc.)
- You want service-specific event filtering
- You need automatic webhook registration
- You want structured data handling for that service
## Supported Services for Trigger Mode
The following service blocks support trigger mode:
- **Slack** - Messages, mentions, reactions
- **GitHub** - Push, PR, issue events
- **Airtable** - Record changes
- **Telegram** - Bot messages and commands
- **Gmail** - Email notifications
- **WhatsApp** - Messaging events
- **Jira** - Issue updates, comments
- **Linear** - Issue state changes
- **Notion** - Page updates
## Security and Best Practices
### Authentication Options
- **Bearer Tokens**: Include `Authorization: Bearer <token>` header
- **Custom Headers**: Define custom authentication headers
### Payload Handling
- **Validation**: Validate incoming payloads to prevent malformed data
- **Size Limits**: Webhooks have payload size limits for security
- **Error Handling**: Configure error responses for invalid requests
### Testing Webhooks
1. Use tools like Postman or curl to test your webhook endpoints
2. Check workflow execution logs for debugging
3. Verify payload structure matches your expectations
4. Test authentication and error scenarios
<Callout type="warning">
Always validate and sanitize incoming webhook data before processing it in your workflows.
</Callout>
## Common Use Cases
### Real-time Notifications
- Slack messages triggering automated responses
- Email notifications for critical events
### CI/CD Integration
- GitHub pushes triggering deployment workflows
- Build status updates
- Automated testing pipelines
### Data Synchronization
- Airtable changes updating other systems
- Form submissions triggering follow-up actions
- E-commerce order processing
### Customer Support
- Support ticket creation workflows
- Automated escalation processes
- Multi-channel communication routing

View File

@@ -1,96 +0,0 @@
---
title: Environment Variables
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Image } from '@/components/ui/image'
Environment variables provide a secure way to manage configuration values and secrets across your workflows, including API keys and other sensitive data that your workflows need to access. They keep secrets out of your workflow definitions while making them available during execution.
## Variable Types
Environment variables in Sim work at two levels:
- **Personal Environment Variables**: Private to your account, only you can see and use them
- **Workspace Environment Variables**: Shared across the entire workspace, available to all team members
<Callout type="info">
Workspace environment variables take precedence over personal ones when there's a naming conflict.
</Callout>
## Setting up Environment Variables
Navigate to Settings to configure your environment variables:
<Image
src="/static/environment/environment-1.png"
alt="Environment variables modal for creating new variables"
width={500}
height={350}
/>
From your workspace settings, you can create and manage both personal and workspace-level environment variables. Personal variables are private to your account, while workspace variables are shared with all team members.
### Making Variables Workspace-Scoped
Use the workspace scope toggle to make variables available to your entire team:
<Image
src="/static/environment/environment-2.png"
alt="Toggle workspace scope for environment variables"
width={500}
height={350}
/>
When you enable workspace scope, the variable becomes available to all workspace members and can be used in any workflow within that workspace.
### Workspace Variables View
Once you have workspace-scoped variables, they appear in your environment variables list:
<Image
src="/static/environment/environment-3.png"
alt="Workspace-scoped variables in the environment variables list"
width={500}
height={350}
/>
## Using Variables in Workflows
To reference environment variables in your workflows, use the `{{}}` notation. When you type `{{` in any input field, a dropdown will appear showing both your personal and workspace-level environment variables. Simply select the variable you want to use.
<Image
src="/static/environment/environment-4.png"
alt="Using environment variables with double brace notation"
width={500}
height={350}
/>
## Variable Precedence
When you have both personal and workspace variables with the same name:
1. **Workspace variables take precedence** over personal variables
2. This prevents naming conflicts and ensures consistent behavior across team workflows
3. If a workspace variable exists, the personal variable with the same name is ignored
<Callout type="warning">
Choose variable names carefully to avoid unintended overrides. Consider prefixing personal variables with your initials or workspace variables with the project name.
</Callout>
## Security Best Practices
### For Sensitive Data
- Store API keys, tokens, and passwords as environment variables instead of hardcoding them
- Use workspace variables for shared resources that multiple team members need
- Keep personal credentials in personal variables
### Variable Naming
- Use descriptive names: `DATABASE_URL` instead of `DB`
- Follow consistent naming conventions across your team
- Consider prefixes to avoid conflicts: `PROD_API_KEY`, `DEV_API_KEY`
### Access Control
- Workspace environment variables respect workspace permissions
- Only users with write access or higher can create/modify workspace variables
- Personal variables are always private to the individual user

View File

@@ -1,306 +0,0 @@
---
title: Agente
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Step, Steps } from 'fumadocs-ui/components/steps'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { Image } from '@/components/ui/image'
import { Video } from '@/components/ui/video'
El bloque Agente sirve como interfaz entre tu flujo de trabajo y los Modelos de Lenguaje Grandes (LLMs). Ejecuta solicitudes de inferencia contra varios proveedores de IA, procesa entradas de lenguaje natural según las instrucciones definidas y genera salidas estructuradas o no estructuradas para su consumo posterior.
<div className="flex justify-center">
<Image
src="/static/blocks/agent.png"
alt="Configuración del bloque Agente"
width={500}
height={400}
className="my-6"
/>
</div>
## Descripción general
El bloque Agente te permite:
<Steps>
<Step>
<strong>Procesar lenguaje natural</strong>: Analizar la entrada del usuario y generar respuestas contextuales
</Step>
<Step>
<strong>Ejecutar tareas impulsadas por IA</strong>: Realizar análisis de contenido, generación y toma de decisiones
</Step>
<Step>
<strong>Llamar a herramientas externas</strong>: Acceder a APIs, bases de datos y servicios durante el procesamiento
</Step>
<Step>
<strong>Generar salida estructurada</strong>: Devolver datos JSON que coincidan con los requisitos de tu esquema
</Step>
</Steps>
## Opciones de configuración
### Prompt del sistema
El prompt del sistema establece los parámetros operativos y las restricciones de comportamiento del agente. Esta configuración define el rol del agente, la metodología de respuesta y los límites de procesamiento para todas las solicitudes entrantes.
```markdown
You are a helpful assistant that specializes in financial analysis.
Always provide clear explanations and cite sources when possible.
When responding to questions about investments, include risk disclaimers.
```
### Prompt del usuario
El prompt del usuario representa los datos de entrada principales para el procesamiento de inferencia. Este parámetro acepta texto en lenguaje natural o datos estructurados que el agente analizará y a los que responderá. Las fuentes de entrada incluyen:
- **Configuración estática**: Entrada de texto directa especificada en la configuración del bloque
- **Entrada dinámica**: Datos pasados desde bloques anteriores a través de interfaces de conexión
- **Generación en tiempo de ejecución**: Contenido generado programáticamente durante la ejecución del flujo de trabajo
### Selección de modelo
El bloque Agente admite múltiples proveedores de LLM a través de una interfaz de inferencia unificada. Los modelos disponibles incluyen:
**Modelos de OpenAI**: GPT-5, GPT-4o, o1, o3, o4-mini, gpt-4.1 (inferencia basada en API)
**Modelos de Anthropic**: Claude 3.7 Sonnet (inferencia basada en API)
**Modelos de Google**: Gemini 2.5 Pro, Gemini 2.0 Flash (inferencia basada en API)
**Proveedores alternativos**: Groq, Cerebras, xAI, DeepSeek (inferencia basada en API)
**Despliegue local**: Modelos compatibles con Ollama (inferencia autohospedada)
<div className="mx-auto w-3/5 overflow-hidden rounded-lg">
<Video src="models.mp4" width={500} height={350} />
</div>
### Temperatura
Controla la creatividad y aleatoriedad de las respuestas:
<Tabs items={['Baja (0-0.3)', 'Media (0.3-0.7)', 'Alta (0.7-2.0)']}>
<Tab>
Respuestas más deterministas y enfocadas. Ideal para tareas factuales, atención al cliente y
situaciones donde la precisión es crítica.
</Tab>
<Tab>
Equilibrio entre creatividad y enfoque. Adecuado para aplicaciones de uso general que requieren
tanto precisión como cierta creatividad.
</Tab>
<Tab>
Respuestas más creativas y variadas. Ideal para escritura creativa, lluvia de ideas y generación
de ideas diversas.
</Tab>
</Tabs>
<div className="mt-4 text-sm text-gray-600 dark:text-gray-400">
El rango de temperatura (0-1 o 0-2) varía dependiendo del modelo seleccionado.
</div>
### Clave API
Tu clave API para el proveedor de LLM seleccionado. Se almacena de forma segura y se utiliza para la autenticación.
### Herramientas
Las herramientas amplían las capacidades del agente mediante integraciones de API externas y conexiones de servicios. El sistema de herramientas permite la llamada a funciones, permitiendo al agente ejecutar operaciones más allá de la generación de texto.
**Proceso de integración de herramientas**:
1. Accede a la sección de configuración de Herramientas dentro del bloque del Agente
2. Selecciona entre más de 60 integraciones predefinidas o define funciones personalizadas
3. Configura los parámetros de autenticación y las restricciones operativas
<div className="mx-auto w-3/5 overflow-hidden rounded-lg">
<Video src="tools.mp4" width={500} height={350} />
</div>
**Categorías de herramientas disponibles**:
- **Comunicación**: Gmail, Slack, Telegram, WhatsApp, Microsoft Teams
- **Fuentes de datos**: Notion, Google Sheets, Airtable, Supabase, Pinecone
- **Servicios web**: Firecrawl, Google Search, Exa AI, automatización de navegador
- **Desarrollo**: GitHub, Jira, gestión de repositorios y problemas en Linear
- **Servicios de IA**: OpenAI, Perplexity, Hugging Face, ElevenLabs
**Control de ejecución de herramientas**:
- **Auto**: El modelo determina la invocación de herramientas según el contexto y la necesidad
- **Requerido**: La herramienta debe ser llamada durante cada solicitud de inferencia
- **Ninguno**: Definición de herramienta disponible pero excluida del contexto del modelo
<div className="mx-auto w-3/5 overflow-hidden rounded-lg">
<Video src="granular-tool-control.mp4" width={500} height={350} />
</div>
### Formato de respuesta
El parámetro de formato de respuesta impone la generación de salidas estructuradas mediante la validación de esquemas JSON. Esto asegura respuestas consistentes y legibles por máquina que se ajustan a estructuras de datos predefinidas:
```json
{
"name": "user_analysis",
"schema": {
"type": "object",
"properties": {
"sentiment": {
"type": "string",
"enum": ["positive", "negative", "neutral"]
},
"confidence": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": ["sentiment", "confidence"]
}
}
```
Esta configuración restringe la salida del modelo para que cumpla con el esquema especificado, evitando respuestas de texto libre y asegurando la generación de datos estructurados.
### Acceso a los resultados
Después de que un agente completa su tarea, puedes acceder a sus salidas:
- **`<agent.content>`**: El texto de respuesta o datos estructurados del agente
- **`<agent.tokens>`**: Estadísticas de uso de tokens (prompt, completado, total)
- **`<agent.tool_calls>`**: Detalles de cualquier herramienta que el agente utilizó durante la ejecución
- **`<agent.cost>`**: Costo estimado de la llamada a la API (si está disponible)
## Funciones avanzadas
### Memoria + Agente: Historial de conversación
Utiliza un bloque `Memory` con un `id` consistente (por ejemplo, `chat`) para persistir mensajes entre ejecuciones, e incluir ese historial en el prompt del agente.
- Añade el mensaje del usuario antes del agente
- Lee el historial de conversación para contexto
- Añade la respuesta del agente después de que se ejecute
```yaml
# 1) Add latest user message
- Memory (operation: add)
id: chat
role: user
content: {{input}}
# 2) Load conversation history
- Memory (operation: get)
id: chat
# 3) Run the agent with prior messages available
- Agent
System Prompt: ...
User Prompt: |
Use the conversation so far:
{{memory_get.memories}}
Current user message: {{input}}
# 4) Store the agent reply
- Memory (operation: add)
id: chat
role: assistant
content: {{agent.content}}
```
Consulta la referencia del bloque `Memory` para más detalles: [/tools/memory](/tools/memory).
## Entradas y salidas
<Tabs items={['Configuración', 'Variables', 'Resultados']}>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>Prompt del sistema</strong>: Instrucciones que definen el comportamiento y rol del agente
</li>
<li>
<strong>Prompt del usuario</strong>: Texto de entrada o datos a procesar
</li>
<li>
<strong>Modelo</strong>: Selección del modelo de IA (OpenAI, Anthropic, Google, etc.)
</li>
<li>
<strong>Temperatura</strong>: Control de aleatoriedad de respuesta (0-2)
</li>
<li>
<strong>Herramientas</strong>: Array de herramientas disponibles para llamadas a funciones
</li>
<li>
<strong>Formato de respuesta</strong>: Esquema JSON para salida estructurada
</li>
</ul>
</Tab>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>agent.content</strong>: Texto de respuesta o datos estructurados del agente
</li>
<li>
<strong>agent.tokens</strong>: Objeto de estadísticas de uso de tokens
</li>
<li>
<strong>agent.tool_calls</strong>: Array de detalles de ejecución de herramientas
</li>
<li>
<strong>agent.cost</strong>: Costo estimado de la llamada a la API (si está disponible)
</li>
</ul>
</Tab>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>Contenido</strong>: Salida de respuesta principal del agente
</li>
<li>
<strong>Metadatos</strong>: Estadísticas de uso y detalles de ejecución
</li>
<li>
<strong>Acceso</strong>: Disponible en bloques después del agente
</li>
</ul>
</Tab>
</Tabs>
## Ejemplos de casos de uso
### Automatización de atención al cliente
<div className="mb-4 rounded-md border p-4">
<h4 className="font-medium">Escenario: Gestionar consultas de clientes con acceso a base de datos</h4>
<ol className="list-decimal pl-5 text-sm">
<li>El usuario envía un ticket de soporte a través del bloque API</li>
<li>El agente verifica pedidos/suscripciones en Postgres y busca en la base de conocimientos para obtener orientación</li>
<li>Si se necesita escalamiento, el agente crea una incidencia en Linear con el contexto relevante</li>
<li>El agente redacta una respuesta clara por correo electrónico</li>
<li>Gmail envía la respuesta al cliente</li>
<li>La conversación se guarda en Memoria para mantener el historial para mensajes futuros</li>
</ol>
</div>
### Análisis de contenido multi-modelo
<div className="mb-4 rounded-md border p-4">
<h4 className="font-medium">Escenario: Analizar contenido con diferentes modelos de IA</h4>
<ol className="list-decimal pl-5 text-sm">
<li>El bloque de función procesa el documento cargado</li>
<li>El agente con GPT-4o realiza análisis técnico</li>
<li>El agente con Claude analiza el sentimiento y tono</li>
<li>El bloque de función combina los resultados para el informe final</li>
</ol>
</div>
### Asistente de investigación con herramientas
<div className="mb-4 rounded-md border p-4">
<h4 className="font-medium">Escenario: Asistente de investigación con búsqueda web y acceso a documentos</h4>
<ol className="list-decimal pl-5 text-sm">
<li>Consulta del usuario recibida a través de entrada</li>
<li>El agente busca en la web usando la herramienta de Google Search</li>
<li>El agente accede a la base de datos de Notion para documentos internos</li>
<li>El agente compila un informe de investigación completo</li>
</ol>
</div>
## Mejores prácticas
- **Sé específico en los prompts del sistema**: Define claramente el rol, tono y limitaciones del agente. Cuanto más específicas sean tus instrucciones, mejor podrá el agente cumplir con su propósito previsto.
- **Elige la configuración de temperatura adecuada**: Usa configuraciones de temperatura más bajas (0-0.3) cuando la precisión es importante, o aumenta la temperatura (0.7-2.0) para respuestas más creativas o variadas
- **Aprovecha las herramientas de manera efectiva**: Integra herramientas que complementen el propósito del agente y mejoren sus capacidades. Sé selectivo sobre qué herramientas proporcionas para evitar sobrecargar al agente. Para tareas con poca superposición, usa otro bloque de Agente para obtener los mejores resultados.

View File

@@ -1,232 +0,0 @@
---
title: API
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Step, Steps } from 'fumadocs-ui/components/steps'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { Image } from '@/components/ui/image'
El bloque API te permite conectar tu flujo de trabajo a servicios externos a través de endpoints API utilizando peticiones HTTP. Admite varios métodos como GET, POST, PUT, DELETE y PATCH, permitiéndote interactuar con prácticamente cualquier endpoint API.
<div className="flex justify-center">
<Image
src="/static/blocks/api.png"
alt="Bloque API"
width={500}
height={400}
className="my-6"
/>
</div>
## Descripción general
El bloque API te permite:
<Steps>
<Step>
<strong>Conectar con servicios externos</strong>: Realizar peticiones HTTP a APIs REST y servicios web
</Step>
<Step>
<strong>Enviar y recibir datos</strong>: Procesar respuestas y transformar datos de fuentes externas
</Step>
<Step>
<strong>Integrar plataformas de terceros</strong>: Conectar con servicios como Stripe, Slack o APIs personalizadas
</Step>
<Step>
<strong>Gestionar la autenticación</strong>: Admitir varios métodos de autenticación, incluyendo tokens Bearer y claves API
</Step>
</Steps>
## Cómo funciona
El bloque API procesa las peticiones HTTP a través de un enfoque estructurado:
1. **Configurar petición** - Establecer URL, método, cabeceras y parámetros del cuerpo
2. **Ejecutar petición** - Enviar petición HTTP al endpoint especificado
3. **Procesar respuesta** - Gestionar datos de respuesta, códigos de estado y cabeceras
4. **Gestión de errores** - Administrar tiempos de espera, reintentos y condiciones de error
## Opciones de configuración
### URL
La URL del endpoint para la petición API. Puede ser:
- Una URL estática introducida directamente en el bloque
- Una URL dinámica conectada desde la salida de otro bloque
- Una URL con parámetros de ruta
### Método
Selecciona el método HTTP para tu petición:
- **GET**: Recuperar datos del servidor
- **POST**: Enviar datos al servidor para crear un recurso
- **PUT**: Actualizar un recurso existente en el servidor
- **DELETE**: Eliminar un recurso del servidor
- **PATCH**: Actualizar parcialmente un recurso existente
### Parámetros de consulta
Define pares clave-valor que se añadirán a la URL como parámetros de consulta. Por ejemplo:
```
Key: apiKey
Value: your_api_key_here
Key: limit
Value: 10
```
Estos se añadirían a la URL como `?apiKey=your_api_key_here&limit=10`.
### Cabeceras
Configura las cabeceras HTTP para tu solicitud. Las cabeceras comunes incluyen:
```
Key: Content-Type
Value: application/json
Key: Authorization
Value: Bearer your_token_here
```
### Cuerpo de la solicitud
Para métodos que admiten un cuerpo de solicitud (POST, PUT, PATCH), puedes definir los datos a enviar. El cuerpo puede ser:
- Datos JSON introducidos directamente en el bloque
- Datos conectados desde la salida de otro bloque
- Generados dinámicamente durante la ejecución del flujo de trabajo
### Acceso a los resultados
Después de completar una solicitud API, puedes acceder a sus salidas:
- **`<api.data>`**: Los datos del cuerpo de respuesta de la API
- **`<api.status>`**: Código de estado HTTP (200, 404, 500, etc.)
- **`<api.headers>`**: Cabeceras de respuesta del servidor
- **`<api.error>`**: Detalles del error si la solicitud falló
## Funciones avanzadas
### Construcción dinámica de URL
Construye URLs dinámicamente usando variables de bloques anteriores:
```javascript
// In a Function block before the API
const userId = <start.userId>;
const apiUrl = `https://api.example.com/users/${userId}/profile`;
```
### Reintentos de solicitud
El bloque API gestiona automáticamente:
- Tiempos de espera de red con retroceso exponencial
- Respuestas de límite de velocidad (códigos de estado 429)
- Errores del servidor (códigos de estado 5xx) con lógica de reintento
- Fallos de conexión con intentos de reconexión
### Validación de respuesta
Valida las respuestas de la API antes de procesarlas:
```javascript
// In a Function block after the API
if (<api.status> === 200) {
const data = <api.data>;
// Process successful response
} else {
// Handle error response
console.error(`API Error: ${<api.status>}`);
}
```
## Entradas y salidas
<Tabs items={['Configuration', 'Variables', 'Results']}>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>URL</strong>: El endpoint al que enviar la solicitud
</li>
<li>
<strong>Method</strong>: Método HTTP (GET, POST, PUT, DELETE, PATCH)
</li>
<li>
<strong>Query Parameters</strong>: Pares clave-valor para parámetros de URL
</li>
<li>
<strong>Headers</strong>: Cabeceras HTTP para autenticación y tipo de contenido
</li>
<li>
<strong>Body</strong>: Carga de solicitud para métodos POST/PUT/PATCH
</li>
</ul>
</Tab>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>api.data</strong>: Datos del cuerpo de respuesta de la llamada API
</li>
<li>
<strong>api.status</strong>: Código de estado HTTP devuelto por el servidor
</li>
<li>
<strong>api.headers</strong>: Cabeceras de respuesta del servidor
</li>
<li>
<strong>api.error</strong>: Detalles del error si la solicitud falló
</li>
</ul>
</Tab>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>Response Data</strong>: Contenido principal de respuesta de la API
</li>
<li>
<strong>Status Information</strong>: Estado HTTP y detalles de error
</li>
<li>
<strong>Access</strong>: Disponible en bloques después de la llamada API
</li>
</ul>
</Tab>
</Tabs>
## Ejemplos de casos de uso
### Obtener datos de perfil de usuario
<div className="mb-4 rounded-md border p-4">
<h4 className="font-medium">Escenario: Recuperar información de usuario desde un servicio externo</h4>
<ol className="list-decimal pl-5 text-sm">
<li>El bloque de función construye el ID de usuario desde la entrada</li>
<li>El bloque API llama al endpoint GET /users/&#123;id&#125;</li>
<li>El bloque de función procesa y formatea los datos del usuario</li>
<li>El bloque de respuesta devuelve el perfil formateado</li>
</ol>
</div>
### Procesamiento de pagos
<div className="mb-4 rounded-md border p-4">
<h4 className="font-medium">Escenario: Procesar pago a través de la API de Stripe</h4>
<ol className="list-decimal pl-5 text-sm">
<li>El bloque de función valida los datos de pago</li>
<li>El bloque API crea la intención de pago a través de Stripe</li>
<li>El bloque de condición gestiona el éxito/fracaso del pago</li>
<li>El bloque Supabase actualiza el estado del pedido en la base de datos</li>
</ol>
</div>
## Mejores prácticas
- **Usa variables de entorno para datos sensibles**: No codifiques directamente claves API o credenciales
- **Maneja los errores con elegancia**: Conecta lógica de manejo de errores para solicitudes fallidas
- **Valida las respuestas**: Comprueba los códigos de estado y formatos de respuesta antes de procesar datos
- **Respeta los límites de tasa**: Ten en cuenta los límites de tasa de la API e implementa la limitación apropiada

View File

@@ -1,242 +0,0 @@
---
title: Condición
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Step, Steps } from 'fumadocs-ui/components/steps'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'
import { Image } from '@/components/ui/image'
El bloque de Condición te permite ramificar la ruta de ejecución de tu flujo de trabajo basándose en expresiones booleanas, permitiéndote crear flujos de trabajo dinámicos y receptivos con diferentes rutas de ejecución. Evalúa condiciones y dirige el flujo de trabajo en consecuencia, permitiéndote controlar el flujo de ejecución basado en datos o lógica sin requerir un LLM.
<div className="flex justify-center">
<Image
src="/static/blocks/condition.png"
alt="Bloque de Condición"
width={500}
height={350}
className="my-6"
/>
</div>
<Callout>
Los bloques de Condición permiten una toma de decisiones determinista sin requerir un LLM, haciéndolos ideales
para lógica de ramificación sencilla.
</Callout>
## Descripción general
El bloque de Condición te permite:
<Steps>
<Step>
<strong>Crear lógica de ramificación</strong>: dirigir flujos de trabajo basados en expresiones booleanas
</Step>
<Step>
<strong>Tomar decisiones basadas en datos</strong>: evaluar condiciones usando salidas de bloques anteriores
</Step>
<Step>
<strong>Manejar múltiples escenarios</strong>: definir múltiples condiciones con diferentes rutas
</Step>
<Step>
<strong>Proporcionar enrutamiento determinista</strong>: tomar decisiones sin requerir un LLM
</Step>
</Steps>
## Cómo funciona
El bloque de Condición opera a través de un proceso de evaluación secuencial:
1. **Evaluar expresión** - Procesa la expresión booleana de JavaScript/TypeScript usando los datos actuales del flujo de trabajo
2. **Determinar resultado** - Devuelve verdadero o falso basado en la evaluación de la expresión
3. **Dirigir flujo de trabajo** - Dirige la ejecución al bloque de destino apropiado basado en el resultado
4. **Proporcionar contexto** - Genera metadatos sobre la decisión para depuración y monitoreo
## Opciones de configuración
### Condiciones
Define una o más condiciones que serán evaluadas. Cada condición incluye:
- **Expresión**: una expresión JavaScript/TypeScript que evalúa a verdadero o falso
- **Ruta**: el bloque de destino al que dirigir si la condición es verdadera
- **Descripción**: explicación opcional de lo que comprueba la condición
Puedes crear múltiples condiciones que se evalúan en orden, donde la primera condición que coincida determina la ruta de ejecución.
### Formato de expresión de condición
Las condiciones utilizan sintaxis JavaScript y pueden hacer referencia a valores de entrada de bloques anteriores.
<Tabs items={['Umbral de puntuación', 'Análisis de texto', 'Múltiples condiciones']}>
<Tab>
```javascript
// Check if a score is above a threshold
<agent.score> > 75
```
</Tab>
<Tab>
```javascript
// Check if a text contains specific keywords
<agent.text>.includes('urgent') || <agent.text>.includes('emergency')
```
</Tab>
<Tab>
```javascript
// Check multiple conditions
<agent.age> >= 18 && <agent.country> === 'US'
```
</Tab>
</Tabs>
### Acceso a resultados
Después de evaluar una condición, puedes acceder a sus salidas:
- **`<condition.result>`**: Resultado booleano de la evaluación de la condición
- **`<condition.matched_condition>`**: ID de la condición que coincidió
- **`<condition.content>`**: Descripción del resultado de la evaluación
- **`<condition.path>`**: Detalles del destino de enrutamiento elegido
## Funciones avanzadas
### Expresiones complejas
Usa operadores y funciones de JavaScript en las condiciones:
```javascript
// String operations
<user.email>.endsWith('@company.com')
// Array operations
<api.tags>.includes('urgent')
// Mathematical operations
<agent.confidence> * 100 > 85
// Date comparisons
new Date(<api.created_at>) > new Date('2024-01-01')
```
### Evaluación de múltiples condiciones
Las condiciones se evalúan en orden hasta que una coincida:
```javascript
// Condition 1: Check for high priority
<ticket.priority> === 'high'
// Condition 2: Check for urgent keywords
<ticket.subject>.toLowerCase().includes('urgent')
// Condition 3: Default fallback
true
```
### Manejo de errores
Las condiciones manejan automáticamente:
- Valores indefinidos o nulos con evaluación segura
- Incompatibilidades de tipo con alternativas apropiadas
- Expresiones inválidas con registro de errores
- Variables faltantes con valores predeterminados
## Entradas y salidas
<Tabs items={['Configuración', 'Variables', 'Resultados']}>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>Condiciones</strong>: Array de expresiones booleanas para evaluar
</li>
<li>
<strong>Expresiones</strong>: Condiciones JavaScript/TypeScript usando salidas de bloques
</li>
<li>
<strong>Rutas de enrutamiento</strong>: Bloques de destino para cada resultado de condición
</li>
</ul>
</Tab>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>condition.result</strong>: Resultado booleano de la evaluación de condición
</li>
<li>
<strong>condition.matched_condition</strong>: ID de la condición coincidente
</li>
<li>
<strong>condition.content</strong>: Descripción del resultado de evaluación
</li>
<li>
<strong>condition.path</strong>: Detalles del destino de enrutamiento elegido
</li>
</ul>
</Tab>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>Resultado booleano</strong>: Resultado principal de la evaluación de condición
</li>
<li>
<strong>Información de enrutamiento</strong>: Selección de ruta y detalles de condición
</li>
<li>
<strong>Acceso</strong>: Disponible en bloques después de la condición
</li>
</ul>
</Tab>
</Tabs>
## Ejemplos de casos de uso
### Enrutamiento de atención al cliente
<div className="mb-4 rounded-md border p-4">
<h4 className="font-medium">Escenario: Enrutar tickets de soporte según la prioridad</h4>
<ol className="list-decimal pl-5 text-sm">
<li>El bloque API obtiene datos de tickets de soporte</li>
<li>La condición verifica si `<api.priority>` es igual a 'high'</li>
<li>Tickets de alta prioridad → Agente con herramientas de escalación</li>
<li>Tickets de prioridad normal → Agente de soporte estándar</li>
</ol>
</div>
### Moderación de contenido
<div className="mb-4 rounded-md border p-4">
<h4 className="font-medium">Escenario: Filtrar contenido basado en resultados de análisis</h4>
<ol className="list-decimal pl-5 text-sm">
<li>El agente analiza contenido generado por usuarios</li>
<li>La condición verifica si `<agent.toxicity_score>` > 0.7</li>
<li>Contenido tóxico → Flujo de moderación</li>
<li>Contenido limpio → Flujo de publicación</li>
</ol>
</div>
### Flujo de incorporación de usuarios
<div className="mb-4 rounded-md border p-4">
<h4 className="font-medium">Escenario: Personalizar la incorporación según el tipo de usuario</h4>
<ol className="list-decimal pl-5 text-sm">
<li>El bloque de función procesa datos de registro de usuarios</li>
<li>La condición verifica si `<user.account_type>` === 'enterprise'</li>
<li>Usuarios empresariales → Flujo de configuración avanzada</li>
<li>Usuarios individuales → Flujo de incorporación simple</li>
</ol>
</div>
## Mejores prácticas
- **Ordenar las condiciones correctamente**: Coloca las condiciones más específicas antes que las generales para asegurar que la lógica específica tenga prioridad sobre las alternativas
- **Incluir una condición predeterminada**: Añade una condición general (`true`) como última condición para manejar casos no coincidentes y evitar que la ejecución del flujo de trabajo se quede atascada
- **Mantener las expresiones simples**: Usa expresiones booleanas claras y directas para mejorar la legibilidad y facilitar la depuración
- **Documentar tus condiciones**: Añade descripciones para explicar el propósito de cada condición para una mejor colaboración en equipo y mantenimiento
- **Probar casos límite**: Verifica que las condiciones manejen correctamente los valores límite probando con valores en los extremos de los rangos de tus condiciones

View File

@@ -1,199 +0,0 @@
---
title: Evaluador
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Step, Steps } from 'fumadocs-ui/components/steps'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { Image } from '@/components/ui/image'
import { Video } from '@/components/ui/video'
El bloque Evaluador utiliza IA para puntuar y evaluar la calidad del contenido mediante métricas de evaluación personalizables que tú defines. Perfecto para control de calidad, pruebas A/B y para garantizar que tus resultados de IA cumplan con estándares específicos.
<div className="flex justify-center">
<Image
src="/static/blocks/evaluator.png"
alt="Configuración del bloque Evaluador"
width={500}
height={400}
className="my-6"
/>
</div>
## Descripción general
El bloque Evaluador te permite:
<Steps>
<Step>
<strong>Puntuar la calidad del contenido</strong>: Usa IA para evaluar contenido según métricas personalizadas con puntuaciones numéricas
</Step>
<Step>
<strong>Definir métricas personalizadas</strong>: Crea criterios de evaluación específicos adaptados a tu caso de uso
</Step>
<Step>
<strong>Automatizar el control de calidad</strong>: Construye flujos de trabajo que evalúan y filtran contenido automáticamente
</Step>
<Step>
<strong>Seguir el rendimiento</strong>: Monitoriza mejoras y consistencia a lo largo del tiempo con puntuaciones objetivas
</Step>
</Steps>
## Cómo funciona
El bloque Evaluador procesa contenido mediante evaluación impulsada por IA:
1. **Recibe contenido** - Toma el contenido de entrada de bloques previos en tu flujo de trabajo
2. **Aplica métricas** - Evalúa el contenido según tus métricas personalizadas definidas
3. **Genera puntuaciones** - El modelo de IA asigna puntuaciones numéricas para cada métrica
4. **Proporciona resumen** - Devuelve una evaluación detallada con puntuaciones y explicaciones
## Opciones de configuración
### Métricas de evaluación
Define métricas personalizadas para evaluar el contenido. Cada métrica incluye:
- **Nombre**: Un identificador corto para la métrica
- **Descripción**: Una explicación detallada de lo que mide la métrica
- **Rango**: El rango numérico para la puntuación (p. ej., 1-5, 0-10)
Ejemplos de métricas:
```
Accuracy (1-5): How factually accurate is the content?
Clarity (1-5): How clear and understandable is the content?
Relevance (1-5): How relevant is the content to the original query?
```
### Contenido
El contenido a evaluar. Esto puede ser:
- Proporcionado directamente en la configuración del bloque
- Conectado desde la salida de otro bloque (típicamente un bloque de Agente)
- Generado dinámicamente durante la ejecución del flujo de trabajo
### Selección de modelo
Elige un modelo de IA para realizar la evaluación:
**OpenAI**: GPT-4o, o1, o3, o4-mini, gpt-4.1
**Anthropic**: Claude 3.7 Sonnet
**Google**: Gemini 2.5 Pro, Gemini 2.0 Flash
**Otros proveedores**: Groq, Cerebras, xAI, DeepSeek
**Modelos locales**: Cualquier modelo ejecutándose en Ollama
<div className="w-full max-w-2xl mx-auto overflow-hidden rounded-lg">
<Video src="models.mp4" width={500} height={350} />
</div>
**Recomendación**: Utiliza modelos con fuertes capacidades de razonamiento como GPT-4o o Claude 3.7 Sonnet para evaluaciones más precisas.
### Clave API
Tu clave API para el proveedor de LLM seleccionado. Esta se almacena de forma segura y se utiliza para la autenticación.
## Cómo funciona
1. El bloque Evaluador toma el contenido proporcionado y tus métricas personalizadas
2. Genera un prompt especializado que instruye al LLM para evaluar el contenido
3. El prompt incluye directrices claras sobre cómo puntuar cada métrica
4. El LLM evalúa el contenido y devuelve puntuaciones numéricas para cada métrica
5. El bloque Evaluador formatea estas puntuaciones como salida estructurada para su uso en tu flujo de trabajo
## Ejemplos de casos de uso
### Evaluación de calidad de contenido
<div className="mb-4 rounded-md border p-4">
<h4 className="font-medium">Escenario: Evaluar la calidad de un artículo de blog antes de su publicación</h4>
<ol className="list-decimal pl-5 text-sm">
<li>El bloque de Agente genera el contenido del artículo</li>
<li>El Evaluador evalúa la precisión, legibilidad y engagement</li>
<li>El bloque de Condición verifica si las puntuaciones cumplen con los umbrales mínimos</li>
<li>Puntuaciones altas → Publicar, Puntuaciones bajas → Revisar y reintentar</li>
</ol>
</div>
### Pruebas A/B de contenido
<div className="mb-4 rounded-md border p-4">
<h4 className="font-medium">Escenario: Comparar múltiples respuestas generadas por IA</h4>
<ol className="list-decimal pl-5 text-sm">
<li>El bloque paralelo genera múltiples variaciones de respuesta</li>
<li>El evaluador puntúa cada variación según claridad y relevancia</li>
<li>El bloque de función selecciona la respuesta con mayor puntuación</li>
<li>El bloque de respuesta devuelve el mejor resultado</li>
</ol>
</div>
### Control de calidad de atención al cliente
<div className="mb-4 rounded-md border p-4">
<h4 className="font-medium">Escenario: Asegurar que las respuestas de soporte cumplan con los estándares de calidad</h4>
<ol className="list-decimal pl-5 text-sm">
<li>El agente de soporte genera una respuesta a la consulta del cliente</li>
<li>El evaluador puntúa la utilidad, empatía y precisión</li>
<li>Las puntuaciones se registran para entrenamiento y monitoreo de rendimiento</li>
<li>Las puntuaciones bajas activan un proceso de revisión humana</li>
</ol>
</div>
## Entradas y salidas
<Tabs items={['Configuración', 'Variables', 'Resultados']}>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>Contenido</strong>: El texto o datos estructurados a evaluar
</li>
<li>
<strong>Métricas de evaluación</strong>: Criterios personalizados con rangos de puntuación
</li>
<li>
<strong>Modelo</strong>: Modelo de IA para análisis de evaluación
</li>
<li>
<strong>Clave API</strong>: Autenticación para el proveedor de LLM seleccionado
</li>
</ul>
</Tab>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>evaluator.content</strong>: Resumen de la evaluación
</li>
<li>
<strong>evaluator.model</strong>: Modelo utilizado para la evaluación
</li>
<li>
<strong>evaluator.tokens</strong>: Estadísticas de uso de tokens
</li>
<li>
<strong>evaluator.cost</strong>: Resumen de costos para la llamada de evaluación
</li>
</ul>
</Tab>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>Puntuaciones de métricas</strong>: Puntuaciones numéricas para cada métrica definida
</li>
<li>
<strong>Resumen de evaluación</strong>: Evaluación detallada con explicaciones
</li>
<li>
<strong>Acceso</strong>: Disponible en bloques después del evaluador
</li>
</ul>
</Tab>
</Tabs>
## Mejores prácticas
- **Usar descripciones específicas de métricas**: Define claramente qué mide cada métrica para obtener evaluaciones más precisas
- **Elegir rangos apropiados**: Selecciona rangos de puntuación que proporcionen suficiente detalle sin ser excesivamente complejos
- **Conectar con bloques de agente**: Utiliza bloques evaluadores para evaluar las salidas de bloques de agente y crear bucles de retroalimentación
- **Usar métricas consistentes**: Para análisis comparativos, mantén métricas consistentes en evaluaciones similares
- **Combinar múltiples métricas**: Usa varias métricas para obtener una evaluación integral

View File

@@ -1,156 +0,0 @@
---
title: Función
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Step, Steps } from 'fumadocs-ui/components/steps'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { Image } from '@/components/ui/image'
El bloque Función te permite ejecutar código JavaScript o TypeScript personalizado en tus flujos de trabajo. Úsalo para transformar datos, realizar cálculos o implementar lógica personalizada que no está disponible en otros bloques.
<div className="flex justify-center">
<Image
src="/static/blocks/function.png"
alt="Bloque de función con editor de código"
width={500}
height={350}
className="my-6"
/>
</div>
## Descripción general
El bloque Función te permite:
<Steps>
<Step>
<strong>Transformar datos</strong>: Convertir formatos, analizar texto, manipular arrays y objetos
</Step>
<Step>
<strong>Realizar cálculos</strong>: Operaciones matemáticas, estadísticas, cálculos financieros
</Step>
<Step>
<strong>Implementar lógica personalizada</strong>: Condicionales complejos, bucles y algoritmos
</Step>
<Step>
<strong>Procesar datos externos</strong>: Analizar respuestas, formatear solicitudes, gestionar autenticación
</Step>
</Steps>
## Cómo funciona
El bloque Función ejecuta tu código en un entorno seguro y aislado:
1. **Recibir entrada**: Accede a los datos de bloques anteriores a través del objeto `input`
2. **Ejecutar código**: Ejecuta tu código JavaScript/Python
3. **Devolver resultados**: Usa `return` para pasar datos al siguiente bloque
4. **Manejar errores**: Gestión de errores y registro integrados
## Ejecución remota (E2B)
- **Lenguajes**: Ejecuta JavaScript y Python en un sandbox E2B aislado.
- **Cómo activarlo**: Activa “Ejecución de código remoto” en el bloque Función.
- **Cuándo usarlo**: Lógica más pesada, bibliotecas externas o código específico de Python.
- **Rendimiento**: Más lento que JS local debido al inicio del sandbox y la sobrecarga de red.
- **Notas**: Requiere `E2B_API_KEY` si se ejecuta localmente. Para la menor latencia, usa JS nativo local (Modo rápido).
## Entradas y salidas
<Tabs items={['Configuration', 'Variables']}>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>Código</strong>: Tu código JavaScript/Python para ejecutar
</li>
<li>
<strong>Tiempo de espera</strong>: Tiempo máximo de ejecución (por defecto 30 segundos)
</li>
<li>
<strong>Datos de entrada</strong>: Todas las salidas de bloques conectados disponibles a través de variables
</li>
</ul>
</Tab>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>function.result</strong>: El valor devuelto por tu función
</li>
<li>
<strong>function.stdout</strong>: Salida de console.log() de tu código
</li>
</ul>
</Tab>
</Tabs>
## Casos de uso de ejemplo
### Pipeline de procesamiento de datos
<div className="mb-4 rounded-md border p-4">
<h4 className="font-medium">Escenario: Transformar respuesta de API en datos estructurados</h4>
<ol className="list-decimal pl-5 text-sm">
<li>El bloque de API obtiene datos brutos del cliente</li>
<li>El bloque de función procesa y valida los datos</li>
<li>El bloque de función calcula métricas derivadas</li>
<li>El bloque de respuesta devuelve resultados formateados</li>
</ol>
</div>
### Implementación de lógica de negocio
<div className="mb-4 rounded-md border p-4">
<h4 className="font-medium">Escenario: Calcular puntuaciones y niveles de fidelidad</h4>
<ol className="list-decimal pl-5 text-sm">
<li>El agente recupera el historial de compras del cliente</li>
<li>El bloque de función calcula métricas de fidelidad</li>
<li>El bloque de función determina el nivel del cliente</li>
<li>El bloque de condición enruta según el nivel</li>
</ol>
</div>
### Validación y limpieza de datos
<div className="mb-4 rounded-md border p-4">
<h4 className="font-medium">Escenario: Validar y limpiar la entrada del usuario</h4>
<ol className="list-decimal pl-5 text-sm">
<li>Entrada del usuario recibida desde el envío del formulario</li>
<li>El bloque de función valida el formato de correo electrónico y números de teléfono</li>
<li>El bloque de función limpia y normaliza los datos</li>
<li>El bloque de API guarda los datos validados en la base de datos</li>
</ol>
</div>
### Ejemplo: Calculadora de puntuación de fidelidad
```javascript title="loyalty-calculator.js"
// Process customer data and calculate loyalty score
const { purchaseHistory, accountAge, supportTickets } = <agent>;
// Calculate metrics
const totalSpent = purchaseHistory.reduce((sum, purchase) => sum + purchase.amount, 0);
const purchaseFrequency = purchaseHistory.length / (accountAge / 365);
const ticketRatio = supportTickets.resolved / supportTickets.total;
// Calculate loyalty score (0-100)
const spendScore = Math.min(totalSpent / 1000 * 30, 30);
const frequencyScore = Math.min(purchaseFrequency * 20, 40);
const supportScore = ticketRatio * 30;
const loyaltyScore = Math.round(spendScore + frequencyScore + supportScore);
return {
customer: <agent.name>,
loyaltyScore,
loyaltyTier: loyaltyScore >= 80 ? "Platinum" : loyaltyScore >= 60 ? "Gold" : "Silver",
metrics: { spendScore, frequencyScore, supportScore }
};
```
## Mejores prácticas
- **Mantén las funciones enfocadas**: Escribe funciones que hagan una sola cosa bien para mejorar la mantenibilidad y la depuración
- **Maneja los errores con elegancia**: Usa bloques try/catch para manejar posibles errores y proporcionar mensajes de error significativos
- **Prueba casos extremos**: Asegúrate de que tu código maneje correctamente entradas inusuales, valores nulos y condiciones límite
- **Optimiza el rendimiento**: Ten en cuenta la complejidad computacional y el uso de memoria para grandes conjuntos de datos
- **Usa console.log() para depuración**: Aprovecha la salida stdout para depurar y monitorear la ejecución de funciones

View File

@@ -1,129 +0,0 @@
---
title: Bloques
description: Los componentes de construcción de tus flujos de trabajo de IA
---
import { Card, Cards } from 'fumadocs-ui/components/card'
import { Step, Steps } from 'fumadocs-ui/components/steps'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { Video } from '@/components/ui/video'
Los bloques son los componentes de construcción que conectas para crear flujos de trabajo de IA. Piensa en ellos como módulos especializados que manejan tareas específicas—desde chatear con modelos de IA hasta realizar llamadas API o procesar datos.
<div className="w-full max-w-2xl mx-auto overflow-hidden rounded-lg">
<Video src="connections.mp4" width={700} height={450} />
</div>
## Tipos de bloques principales
Sim proporciona siete tipos de bloques principales que manejan las funciones esenciales de los flujos de trabajo de IA:
### Bloques de procesamiento
- **[Agente](/blocks/agent)** - Chatea con modelos de IA (OpenAI, Anthropic, Google, modelos locales)
- **[Función](/blocks/function)** - Ejecuta código personalizado de JavaScript/TypeScript
- **[API](/blocks/api)** - Conecta con servicios externos mediante peticiones HTTP
### Bloques lógicos
- **[Condición](/blocks/condition)** - Ramifica caminos de flujo de trabajo basados en expresiones booleanas
- **[Enrutador](/blocks/router)** - Usa IA para dirigir inteligentemente las solicitudes a diferentes caminos
- **[Evaluador](/blocks/evaluator)** - Puntúa y evalúa la calidad del contenido usando IA
### Bloques de salida
- **[Respuesta](/blocks/response)** - Formatea y devuelve resultados finales de tu flujo de trabajo
## Cómo funcionan los bloques
Cada bloque tiene tres componentes principales:
**Entradas**: Datos que llegan al bloque desde otros bloques o entrada del usuario
**Configuración**: Ajustes que controlan cómo se comporta el bloque
**Salidas**: Datos que el bloque produce para que otros bloques los utilicen
<Steps>
<Step>
<strong>Recibir entrada</strong>: El bloque recibe datos de bloques conectados o entrada del usuario
</Step>
<Step>
<strong>Procesar</strong>: El bloque procesa la entrada según su configuración
</Step>
<Step>
<strong>Resultados de salida</strong>: El bloque produce datos de salida para los siguientes bloques en el flujo de trabajo
</Step>
</Steps>
## Conectando bloques
Creas flujos de trabajo conectando bloques entre sí. La salida de un bloque se convierte en la entrada de otro:
- **Arrastra para conectar**: Arrastra desde un puerto de salida a un puerto de entrada
- **Conexiones múltiples**: Una salida puede conectarse a múltiples entradas
- **Rutas ramificadas**: Algunos bloques pueden dirigir a diferentes rutas según las condiciones
<div className="w-full max-w-2xl mx-auto overflow-hidden rounded-lg">
<Video src="connections.mp4" width={700} height={450} />
</div>
## Patrones comunes
### Procesamiento secuencial
Conecta bloques en cadena donde cada bloque procesa la salida del anterior:
```
User Input → Agent → Function → Response
```
### Ramificación condicional
Utiliza bloques de Condición o Enrutador para crear diferentes rutas:
```
User Input → Router → Agent A (for questions)
→ Agent B (for commands)
```
### Control de calidad
Utiliza bloques Evaluadores para evaluar y filtrar salidas:
```
Agent → Evaluator → Condition → Response (if good)
→ Agent (retry if bad)
```
## Configuración de bloques
Cada tipo de bloque tiene opciones de configuración específicas:
**Todos los bloques**:
- Conexiones de entrada/salida
- Comportamiento de manejo de errores
- Configuración de tiempo de espera de ejecución
**Bloques de IA** (Agente, Enrutador, Evaluador):
- Selección de modelo (OpenAI, Anthropic, Google, local)
- Claves API y autenticación
- Temperatura y otros parámetros del modelo
- Instrucciones y prompts del sistema
**Bloques lógicos** (Condición, Función):
- Expresiones o código personalizado
- Referencias de variables
- Configuración del entorno de ejecución
**Bloques de integración** (API, Respuesta):
- Configuración de endpoint
- Cabeceras y autenticación
- Formato de solicitud/respuesta
<Cards>
<Card title="Bloque de agente" href="/blocks/agent">
Conéctate a modelos de IA y crea respuestas inteligentes
</Card>
<Card title="Bloque de función" href="/blocks/function">
Ejecuta código personalizado para procesar y transformar datos
</Card>
<Card title="Bloque de API" href="/blocks/api">
Intégrate con servicios externos y APIs
</Card>
<Card title="Bloque de condición" href="/blocks/condition">
Crea lógica de ramificación basada en evaluación de datos
</Card>
</Cards>

View File

@@ -1,211 +0,0 @@
---
title: Loop
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Step, Steps } from 'fumadocs-ui/components/steps'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { Image } from '@/components/ui/image'
El bloque Loop es un bloque contenedor en Sim que permite crear flujos de trabajo iterativos ejecutando un grupo de bloques repetidamente. Los bucles permiten el procesamiento iterativo en tus flujos de trabajo.
El bloque Loop admite dos tipos de iteración:
<Callout type="info">
Los bloques Loop son nodos contenedores que pueden albergar otros bloques dentro de ellos. Los bloques dentro de un bucle se ejecutarán múltiples veces según tu configuración.
</Callout>
## Descripción general
El bloque Loop te permite:
<Steps>
<Step>
<strong>Iterar sobre colecciones</strong>: Procesar arrays u objetos un elemento a la vez
</Step>
<Step>
<strong>Repetir operaciones</strong>: Ejecutar bloques un número fijo de veces
</Step>
<Step>
<strong>Procesamiento secuencial</strong>: Manejar transformación de datos en iteraciones ordenadas
</Step>
<Step>
<strong>Agregar resultados</strong>: Recopilar salidas de todas las iteraciones del bucle
</Step>
</Steps>
## Cómo funciona
El bloque Loop ejecuta los bloques contenidos a través de iteración secuencial:
1. **Inicializar bucle** - Configurar parámetros de iteración (contador o colección)
2. **Ejecutar iteración** - Ejecutar bloques contenidos para la iteración actual
3. **Recopilar resultados** - Almacenar la salida de cada iteración
4. **Continuar o completar** - Pasar a la siguiente iteración o finalizar el bucle
## Opciones de configuración
### Tipo de bucle
Elige entre dos tipos de bucles:
<Tabs items={['For Loop', 'ForEach Loop']}>
<Tab>
**For Loop (Iteraciones)** - Un bucle numérico que se ejecuta un número fijo de veces:
<div className="flex justify-center">
<Image
src="/static/blocks/loop-1.png"
alt="Bucle For con iteraciones"
width={500}
height={400}
className="my-6"
/>
</div>
Úsalo cuando necesites repetir una operación un número específico de veces.
```
Example: Run 5 times
- Iteration 1
- Iteration 2
- Iteration 3
- Iteration 4
- Iteration 5
```
</Tab>
<Tab>
**Bucle ForEach (Colección)** - Un bucle basado en colecciones que itera sobre cada elemento en un array u objeto:
<div className="flex justify-center">
<Image
src="/static/blocks/loop-2.png"
alt="Bucle ForEach con colección"
width={500}
height={400}
className="my-6"
/>
</div>
Úsalo cuando necesites procesar una colección de elementos.
```
Example: Process ["apple", "banana", "orange"]
- Iteration 1: Process "apple"
- Iteration 2: Process "banana"
- Iteration 3: Process "orange"
```
</Tab>
</Tabs>
## Cómo usar los bucles
### Creación de un bucle
1. Arrastra un bloque de bucle desde la barra de herramientas a tu lienzo
2. Configura el tipo de bucle y los parámetros
3. Arrastra otros bloques dentro del contenedor del bucle
4. Conecta los bloques según sea necesario
### Acceso a los resultados
Después de que un bucle se completa, puedes acceder a los resultados agregados:
- **`<loop.results>`**: Array de resultados de todas las iteraciones del bucle
## Ejemplos de casos de uso
### Procesamiento de resultados de API
<div className="mb-4 rounded-md border p-4">
<h4 className="font-medium">Escenario: Procesar múltiples registros de clientes</h4>
<ol className="list-decimal pl-5 text-sm">
<li>El bloque API obtiene la lista de clientes</li>
<li>El bucle ForEach itera sobre cada cliente</li>
<li>Dentro del bucle: El agente analiza los datos del cliente</li>
<li>Dentro del bucle: La función almacena los resultados del análisis</li>
</ol>
</div>
### Generación iterativa de contenido
<div className="mb-4 rounded-md border p-4">
<h4 className="font-medium">Escenario: Generar múltiples variaciones</h4>
<ol className="list-decimal pl-5 text-sm">
<li>Configurar el bucle For para 5 iteraciones</li>
<li>Dentro del bucle: El agente genera una variación de contenido</li>
<li>Dentro del bucle: El evaluador puntúa el contenido</li>
<li>Después del bucle: La función selecciona la mejor variación</li>
</ol>
</div>
## Características avanzadas
### Limitaciones
<Callout type="warning">
Los bloques contenedores (Bucles y Paralelos) no pueden anidarse unos dentro de otros. Esto significa:
- No puedes colocar un bloque de Bucle dentro de otro bloque de Bucle
- No puedes colocar un bloque Paralelo dentro de un bloque de Bucle
- No puedes colocar ningún bloque contenedor dentro de otro bloque contenedor
Si necesitas iteración multidimensional, considera reestructurar tu flujo de trabajo para usar bucles secuenciales o procesar datos por etapas.
</Callout>
<Callout type="info">
Los bucles se ejecutan secuencialmente, no en paralelo. Si necesitas ejecución concurrente, utiliza el bloque Paralelo en su lugar.
</Callout>
## Entradas y salidas
<Tabs items={['Configuration', 'Variables', 'Results']}>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>Tipo de bucle</strong>: Elige entre 'for' o 'forEach'
</li>
<li>
<strong>Iteraciones</strong>: Número de veces a ejecutar (bucles for)
</li>
<li>
<strong>Colección</strong>: Array u objeto sobre el que iterar (bucles forEach)
</li>
</ul>
</Tab>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>loop.currentItem</strong>: Elemento actual que se está procesando
</li>
<li>
<strong>loop.index</strong>: Número de iteración actual (base 0)
</li>
<li>
<strong>loop.items</strong>: Colección completa (bucles forEach)
</li>
</ul>
</Tab>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>loop.results</strong>: Array con todos los resultados de las iteraciones
</li>
<li>
<strong>Estructura</strong>: Los resultados mantienen el orden de iteración
</li>
<li>
<strong>Acceso</strong>: Disponible en bloques después del bucle
</li>
</ul>
</Tab>
</Tabs>
## Mejores prácticas
- **Establece límites razonables**: Mantén un número razonable de iteraciones para evitar tiempos de ejecución largos
- **Usa ForEach para colecciones**: Cuando proceses arrays u objetos, usa bucles ForEach en lugar de bucles For
- **Maneja los errores con elegancia**: Considera añadir manejo de errores dentro de los bucles para flujos de trabajo robustos

View File

@@ -1,231 +0,0 @@
---
title: Paralelo
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Step, Steps } from 'fumadocs-ui/components/steps'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { Image } from '@/components/ui/image'
El bloque Paralelo es un bloque contenedor en Sim que permite ejecutar múltiples instancias de bloques simultáneamente para un procesamiento más rápido del flujo de trabajo.
El bloque Paralelo admite dos tipos de ejecución concurrente:
<Callout type="info">
Los bloques Paralelos son nodos contenedores que ejecutan su contenido múltiples veces simultáneamente, a diferencia de los bucles que ejecutan secuencialmente.
</Callout>
## Descripción general
El bloque Paralelo te permite:
<Steps>
<Step>
<strong>Distribuir trabajo</strong>: Procesar múltiples elementos concurrentemente
</Step>
<Step>
<strong>Acelerar la ejecución</strong>: Ejecutar operaciones independientes simultáneamente
</Step>
<Step>
<strong>Manejar operaciones masivas</strong>: Procesar grandes conjuntos de datos eficientemente
</Step>
<Step>
<strong>Agregar resultados</strong>: Recopilar salidas de todas las ejecuciones paralelas
</Step>
</Steps>
## Opciones de configuración
### Tipo de paralelo
Elige entre dos tipos de ejecución paralela:
<Tabs items={['Count-based', 'Collection-based']}>
<Tab>
**Paralelo basado en conteo** - Ejecuta un número fijo de instancias paralelas:
<div className="flex justify-center">
<Image
src="/static/blocks/parallel-1.png"
alt="Ejecución paralela basada en conteo"
width={500}
height={400}
className="my-6"
/>
</div>
Usa esto cuando necesites ejecutar la misma operación múltiples veces concurrentemente.
```
Example: Run 5 parallel instances
- Instance 1 ┐
- Instance 2 ├─ All execute simultaneously
- Instance 3 │
- Instance 4 │
- Instance 5 ┘
```
</Tab>
<Tab>
**Paralelo basado en colección** - Distribuye una colección entre instancias paralelas:
<div className="flex justify-center">
<Image
src="/static/blocks/parallel-2.png"
alt="Ejecución paralela basada en colección"
width={500}
height={400}
className="my-6"
/>
</div>
Cada instancia procesa un elemento de la colección simultáneamente.
```
Example: Process ["task1", "task2", "task3"] in parallel
- Instance 1: Process "task1" ┐
- Instance 2: Process "task2" ├─ All execute simultaneously
- Instance 3: Process "task3" ┘
```
</Tab>
</Tabs>
## Cómo usar bloques paralelos
### Creación de un bloque paralelo
1. Arrastra un bloque Paralelo desde la barra de herramientas a tu lienzo
2. Configura el tipo de paralelo y los parámetros
3. Arrastra un solo bloque dentro del contenedor paralelo
4. Conecta el bloque según sea necesario
### Acceso a los resultados
Después de que un bloque paralelo se complete, puedes acceder a los resultados agregados:
- **`<parallel.results>`**: Array de resultados de todas las instancias paralelas
## Ejemplos de casos de uso
### Procesamiento de API por lotes
<div className="mb-4 rounded-md border p-4">
<h4 className="font-medium">Escenario: Procesar múltiples llamadas API simultáneamente</h4>
<ol className="list-decimal pl-5 text-sm">
<li>Bloque paralelo con colección de endpoints API</li>
<li>Dentro del paralelo: El bloque API llama a cada endpoint</li>
<li>Después del paralelo: Procesar todas las respuestas juntas</li>
</ol>
</div>
### Procesamiento de IA con múltiples modelos
<div className="mb-4 rounded-md border p-4">
<h4 className="font-medium">Escenario: Obtener respuestas de múltiples modelos de IA</h4>
<ol className="list-decimal pl-5 text-sm">
<li>Paralelo basado en colección sobre una lista de IDs de modelos (p. ej., ["gpt-4o", "claude-3.7-sonnet", "gemini-2.5-pro"])</li>
<li>Dentro del paralelo: El modelo del agente se establece al elemento actual de la colección</li>
<li>Después del paralelo: Comparar y seleccionar la mejor respuesta</li>
</ol>
</div>
## Características avanzadas
### Agregación de resultados
Los resultados de todas las instancias paralelas se recopilan automáticamente:
```javascript
// In a Function block after the parallel
const allResults = input.parallel.results;
// Returns: [result1, result2, result3, ...]
```
### Aislamiento de instancias
Cada instancia paralela se ejecuta independientemente:
- Ámbitos de variables separados
- Sin estado compartido entre instancias
- Los fallos en una instancia no afectan a las demás
### Limitaciones
<Callout type="warning">
Los bloques contenedores (Bucles y Paralelos) no pueden anidarse unos dentro de otros. Esto significa:
- No puedes colocar un bloque de Bucle dentro de un bloque Paralelo
- No puedes colocar otro bloque Paralelo dentro de un bloque Paralelo
- No puedes colocar ningún bloque contenedor dentro de otro bloque contenedor
</Callout>
<Callout type="warning">
Los bloques paralelos solo pueden contener un único bloque. No puedes tener múltiples bloques conectados entre sí dentro de un paralelo - en ese caso, solo se ejecutaría el primer bloque.
</Callout>
<Callout type="info">
Aunque la ejecución paralela es más rápida, ten en cuenta:
- Los límites de tasa de las API al realizar solicitudes concurrentes
- El uso de memoria con conjuntos de datos grandes
- Máximo de 20 instancias concurrentes para evitar el agotamiento de recursos
</Callout>
## Paralelo vs Bucle
Entendiendo cuándo usar cada uno:
| Característica | Paralelo | Bucle |
|---------|----------|------|
| Ejecución | Concurrente | Secuencial |
| Velocidad | Más rápido para operaciones independientes | Más lento pero ordenado |
| Orden | Sin orden garantizado | Mantiene el orden |
| Caso de uso | Operaciones independientes | Operaciones dependientes |
| Uso de recursos | Mayor | Menor |
## Entradas y Salidas
<Tabs items={['Configuration', 'Variables', 'Results']}>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>Tipo de paralelo</strong>: Elige entre 'count' o 'collection'
</li>
<li>
<strong>Count</strong>: Número de instancias a ejecutar (basado en conteo)
</li>
<li>
<strong>Collection</strong>: Array u objeto a distribuir (basado en colección)
</li>
</ul>
</Tab>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>parallel.currentItem</strong>: Elemento para esta instancia
</li>
<li>
<strong>parallel.index</strong>: Número de instancia (base 0)
</li>
<li>
<strong>parallel.items</strong>: Colección completa (basado en colección)
</li>
</ul>
</Tab>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>parallel.results</strong>: Array de todos los resultados de instancias
</li>
<li>
<strong>Access</strong>: Disponible en bloques después del paralelo
</li>
</ul>
</Tab>
</Tabs>
## Mejores prácticas
- **Solo operaciones independientes**: Asegúrate de que las operaciones no dependan entre sí
- **Manejo de límites de tasa**: Añade retrasos o limitaciones para flujos de trabajo con uso intensivo de API
- **Manejo de errores**: Cada instancia debe manejar sus propios errores correctamente

View File

@@ -1,246 +0,0 @@
---
title: Respuesta
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Step, Steps } from 'fumadocs-ui/components/steps'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { Image } from '@/components/ui/image'
El bloque de Respuesta es el paso final en tu flujo de trabajo que formatea y envía una respuesta estructurada a las llamadas API. Es como la declaración "return" para todo tu flujo de trabajo—empaqueta los resultados y los envía de vuelta.
<div className="flex justify-center">
<Image
src="/static/blocks/response.png"
alt="Configuración del bloque de respuesta"
width={500}
height={400}
className="my-6"
/>
</div>
<Callout type="info">
Los bloques de respuesta son bloques terminales - finalizan la ejecución del flujo de trabajo y no pueden conectarse a otros bloques.
</Callout>
## Descripción general
El bloque de Respuesta te permite:
<Steps>
<Step>
<strong>Formatear respuestas API</strong>: Estructurar los resultados del flujo de trabajo en respuestas HTTP adecuadas
</Step>
<Step>
<strong>Establecer códigos de estado</strong>: Configurar códigos de estado HTTP apropiados según los resultados del flujo de trabajo
</Step>
<Step>
<strong>Controlar encabezados</strong>: Añadir encabezados personalizados para respuestas API y webhooks
</Step>
<Step>
<strong>Transformar datos</strong>: Convertir variables del flujo de trabajo en formatos de respuesta amigables para el cliente
</Step>
</Steps>
## Cómo funciona
El bloque de Respuesta finaliza la ejecución del flujo de trabajo:
1. **Recopilar datos** - Reúne variables y salidas de bloques anteriores
2. **Formatear respuesta** - Estructura los datos según tu configuración
3. **Establecer detalles HTTP** - Aplica códigos de estado y encabezados
4. **Enviar respuesta** - Devuelve la respuesta formateada al solicitante de la API
## Cuándo necesitas bloques de respuesta
- **Endpoints API**: Cuando tu flujo de trabajo es llamado vía API, los bloques de Respuesta formatean los datos de retorno
- **Webhooks**: Devuelven confirmación o datos al sistema que realiza la llamada
- **Pruebas**: Ver resultados formateados al probar tu flujo de trabajo
## Dos formas de construir respuestas
### Modo constructor (recomendado)
Interfaz visual para construir la estructura de respuesta:
- Arrastrar y soltar campos
- Referenciar variables de flujo de trabajo fácilmente
- Vista previa visual de la estructura de respuesta
### Modo editor (avanzado)
Escribir JSON directamente:
- Control total sobre el formato de respuesta
- Soporte para estructuras anidadas complejas
- Usar sintaxis `<variable.name>` para valores dinámicos
## Opciones de configuración
### Datos de respuesta
Los datos de respuesta son el contenido principal que se enviará de vuelta al solicitante de la API. Deben estar formateados como JSON y pueden incluir:
- Valores estáticos
- Referencias dinámicas a variables de flujo de trabajo usando la sintaxis `<variable.name>`
- Objetos y matrices anidados
- Cualquier estructura JSON válida
### Código de estado
Establece el código de estado HTTP para la respuesta. Los códigos de estado comunes incluyen:
<Tabs items={['Éxito (2xx)', 'Error del cliente (4xx)', 'Error del servidor (5xx)']}>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li><strong>200</strong>: OK - Respuesta estándar de éxito</li>
<li><strong>201</strong>: Creado - Recurso creado con éxito</li>
<li><strong>204</strong>: Sin contenido - Éxito sin cuerpo de respuesta</li>
</ul>
</Tab>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li><strong>400</strong>: Solicitud incorrecta - Parámetros de solicitud inválidos</li>
<li><strong>401</strong>: No autorizado - Se requiere autenticación</li>
<li><strong>404</strong>: No encontrado - El recurso no existe</li>
<li><strong>422</strong>: Entidad no procesable - Errores de validación</li>
</ul>
</Tab>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li><strong>500</strong>: Error interno del servidor - Error del lado del servidor</li>
<li><strong>502</strong>: Puerta de enlace incorrecta - Error de servicio externo</li>
<li><strong>503</strong>: Servicio no disponible - Servicio temporalmente inactivo</li>
</ul>
</Tab>
</Tabs>
<div className="mt-4 text-sm text-gray-600 dark:text-gray-400">
El código de estado predeterminado es 200 si no se especifica.
</div>
### Cabeceras de respuesta
Configura cabeceras HTTP adicionales para incluir en la respuesta.
Los encabezados se configuran como pares clave-valor:
| Clave | Valor |
|-----|-------|
| Content-Type | application/json |
| Cache-Control | no-cache |
| X-API-Version | 1.0 |
## Ejemplos de casos de uso
### Respuesta del punto final de la API
<div className="mb-4 rounded-md border p-4">
<h4 className="font-medium">Escenario: Devolver datos estructurados desde una API de búsqueda</h4>
<ol className="list-decimal pl-5 text-sm">
<li>El flujo de trabajo procesa la consulta de búsqueda y recupera resultados</li>
<li>El bloque de función formatea y pagina los resultados</li>
<li>El bloque de respuesta devuelve JSON con datos, paginación y metadatos</li>
<li>El cliente recibe una respuesta estructurada con estado 200</li>
</ol>
</div>
### Confirmación de webhook
<div className="mb-4 rounded-md border p-4">
<h4 className="font-medium">Escenario: Confirmar recepción y procesamiento del webhook</h4>
<ol className="list-decimal pl-5 text-sm">
<li>El disparador de webhook recibe datos del sistema externo</li>
<li>El flujo de trabajo procesa los datos entrantes</li>
<li>El bloque de respuesta devuelve una confirmación con el estado del procesamiento</li>
<li>El sistema externo recibe la confirmación</li>
</ol>
</div>
### Manejo de respuestas de error
<div className="mb-4 rounded-md border p-4">
<h4 className="font-medium">Escenario: Devolver respuestas de error apropiadas</h4>
<ol className="list-decimal pl-5 text-sm">
<li>El bloque de condición detecta fallos de validación o errores del sistema</li>
<li>El enrutador dirige hacia la ruta de manejo de errores</li>
<li>El bloque de respuesta devuelve estado 400/500 con detalles del error</li>
<li>El cliente recibe información estructurada del error</li>
</ol>
</div>
## Entradas y salidas
<Tabs items={['Configuration', 'Variables', 'Results']}>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>Datos de respuesta</strong>: Estructura JSON para el cuerpo de la respuesta
</li>
<li>
<strong>Código de estado</strong>: Código de estado HTTP (predeterminado: 200)
</li>
<li>
<strong>Encabezados</strong>: Encabezados HTTP personalizados como pares clave-valor
</li>
<li>
<strong>Modo</strong>: Modo Constructor o Editor para la construcción de respuestas
</li>
</ul>
</Tab>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>response.data</strong>: El cuerpo de respuesta estructurado
</li>
<li>
<strong>response.status</strong>: Código de estado HTTP enviado
</li>
<li>
<strong>response.headers</strong>: Encabezados incluidos en la respuesta
</li>
<li>
<strong>response.success</strong>: Booleano que indica finalización exitosa
</li>
</ul>
</Tab>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>Respuesta HTTP</strong>: Respuesta completa enviada al solicitante de la API
</li>
<li>
<strong>Terminación del flujo de trabajo</strong>: Finaliza la ejecución del flujo de trabajo
</li>
<li>
<strong>Acceso</strong>: Los bloques de respuesta son terminales - no hay bloques subsiguientes
</li>
</ul>
</Tab>
</Tabs>
## Referencias de variables
Utiliza la sintaxis `<variable.name>` para insertar dinámicamente variables del flujo de trabajo en tu respuesta:
```json
{
"user": {
"id": "<variable.userId>",
"name": "<variable.userName>",
"email": "<variable.userEmail>"
},
"query": "<variable.searchQuery>",
"results": "<variable.searchResults>",
"totalFound": "<variable.resultCount>",
"processingTime": "<variable.executionTime>ms"
}
```
<Callout type="warning">
Los nombres de variables distinguen entre mayúsculas y minúsculas y deben coincidir exactamente con las variables disponibles en tu flujo de trabajo.
</Callout>
## Mejores prácticas
- **Usa códigos de estado significativos**: Elige códigos de estado HTTP apropiados que reflejen con precisión el resultado del flujo de trabajo
- **Estructura tus respuestas de manera consistente**: Mantén una estructura JSON consistente en todos tus endpoints de API para una mejor experiencia del desarrollador
- **Incluye metadatos relevantes**: Añade marcas de tiempo e información de versión para ayudar con la depuración y el monitoreo
- **Maneja los errores con elegancia**: Utiliza lógica condicional en tu flujo de trabajo para establecer respuestas de error apropiadas con mensajes descriptivos
- **Valida las referencias de variables**: Asegúrate de que todas las variables referenciadas existan y contengan los tipos de datos esperados antes de que se ejecute el bloque de Respuesta

View File

@@ -1,225 +0,0 @@
---
title: Router
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Step, Steps } from 'fumadocs-ui/components/steps'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'
import { Image } from '@/components/ui/image'
import { Video } from '@/components/ui/video'
El bloque Router utiliza IA para decidir de manera inteligente qué camino debe tomar tu flujo de trabajo a continuación, dirigiendo la ejecución del flujo de trabajo según condiciones o lógica específicas. A diferencia de los bloques de Condición que utilizan reglas simples, los bloques Router pueden entender el contexto y tomar decisiones inteligentes de enrutamiento basadas en el análisis de contenido.
<div className="flex justify-center">
<Image
src="/static/blocks/router.png"
alt="Bloque Router con múltiples caminos"
width={500}
height={400}
className="my-6"
/>
</div>
## Descripción general
El bloque Router te permite:
<Steps>
<Step>
<strong>Enrutamiento inteligente de contenido</strong>: Usa IA para entender la intención y el contexto
</Step>
<Step>
<strong>Selección dinámica de rutas</strong>: Dirige flujos de trabajo basados en análisis de contenido no estructurado
</Step>
<Step>
<strong>Decisiones conscientes del contexto</strong>: Toma decisiones inteligentes de enrutamiento más allá de reglas simples
</Step>
<Step>
<strong>Gestión de múltiples rutas</strong>: Maneja flujos de trabajo complejos con múltiples destinos potenciales
</Step>
</Steps>
## Router vs bloques de Condición
<Accordions>
<Accordion title="Cuándo usar Router">
- Se necesita análisis de contenido impulsado por IA
- Contenido no estructurado o tipos de contenido variables
- Enrutamiento basado en intención (p. ej., "dirigir tickets de soporte a departamentos")
- Se requiere toma de decisiones consciente del contexto
</Accordion>
<Accordion title="Cuándo usar Condición">
- Decisiones simples basadas en reglas
- Datos estructurados o comparaciones numéricas
- Se necesita enrutamiento rápido y determinista
- Lógica booleana suficiente
</Accordion>
</Accordions>
## Cómo funciona
El bloque Router:
<Steps>
<Step>
<strong>Analiza el contenido</strong>: Utiliza un LLM para entender el contenido y el contexto de entrada
</Step>
<Step>
<strong>Evalúa objetivos</strong>: Compara el contenido con los bloques de destino disponibles
</Step>
<Step>
<strong>Selecciona el destino</strong>: Identifica la ruta más apropiada basada en la intención
</Step>
<Step>
<strong>Ejecuta el enrutamiento</strong>: Dirige el flujo de trabajo al bloque seleccionado
</Step>
</Steps>
## Opciones de configuración
### Contenido/Prompt
El contenido o prompt que el Router analizará para tomar decisiones de enrutamiento. Esto puede ser:
- Una consulta o entrada directa del usuario
- Resultado de un bloque anterior
- Un mensaje generado por el sistema
### Bloques de destino
Los posibles bloques de destino entre los que el Router puede seleccionar. El Router detectará automáticamente los bloques conectados, pero también puedes:
- Personalizar las descripciones de los bloques de destino para mejorar la precisión del enrutamiento
- Especificar criterios de enrutamiento para cada bloque de destino
- Excluir ciertos bloques para que no sean considerados como destinos de enrutamiento
### Selección de modelo
Elige un modelo de IA para potenciar la decisión de enrutamiento:
**OpenAI**: GPT-4o, o1, o3, o4-mini, gpt-4.1 \
**Anthropic**: Claude 3.7 Sonnet \
**Google**: Gemini 2.5 Pro, Gemini 2.0 Flash \
**Otros proveedores**: Groq, Cerebras, xAI, DeepSeek \
**Modelos locales**: Cualquier modelo ejecutándose en Ollama
<div className="w-full max-w-2xl mx-auto overflow-hidden rounded-lg">
<Video src="router-model-dropdown.mp4" width={500} height={350} />
</div>
**Recomendación**: Utiliza modelos con fuertes capacidades de razonamiento como GPT-4o o Claude 3.7 Sonnet para decisiones de enrutamiento más precisas.
### Clave API
Tu clave API para el proveedor de LLM seleccionado. Esta se almacena de forma segura y se utiliza para la autenticación.
### Acceso a los resultados
Después de que un router tome una decisión, puedes acceder a sus resultados:
- **`<router.prompt>`**: Resumen del prompt de enrutamiento utilizado
- **`<router.selected_path>`**: Detalles del bloque de destino elegido
- **`<router.tokens>`**: Estadísticas de uso de tokens del LLM
- **`<router.cost>`**: Resumen de costos para la llamada de enrutamiento (entrada, salida, total)
- **`<router.model>`**: El modelo utilizado para la toma de decisiones
## Funciones avanzadas
### Criterios de enrutamiento personalizados
Define criterios específicos para cada bloque de destino:
```javascript
// Example routing descriptions
Target Block 1: "Technical support issues, API problems, integration questions"
Target Block 2: "Billing inquiries, subscription changes, payment issues"
Target Block 3: "General questions, feedback, feature requests"
```
## Entradas y salidas
<Tabs items={['Configuración', 'Variables']}>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>Contenido/Prompt</strong>: Texto a analizar para decisiones de enrutamiento
</li>
<li>
<strong>Bloques de destino</strong>: Bloques conectados como destinos potenciales
</li>
<li>
<strong>Modelo</strong>: Modelo de IA para análisis de enrutamiento
</li>
<li>
<strong>Clave API</strong>: Autenticación para el proveedor LLM seleccionado
</li>
</ul>
</Tab>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>router.prompt</strong>: Resumen del prompt de enrutamiento utilizado
</li>
<li>
<strong>router.selected_path</strong>: Detalles del destino elegido
</li>
<li>
<strong>router.tokens</strong>: Estadísticas de uso de tokens
</li>
<li>
<strong>router.cost</strong>: Resumen de costos para la llamada de enrutamiento (entrada, salida, total)
</li>
<li>
<strong>router.model</strong>: Modelo utilizado para la toma de decisiones
</li>
</ul>
</Tab>
</Tabs>
## Ejemplos de casos de uso
### Clasificación de soporte al cliente
<div className="mb-4 rounded-md border p-4">
<h4 className="font-medium">Escenario: Enrutar tickets de soporte a departamentos especializados</h4>
<ol className="list-decimal pl-5 text-sm">
<li>El usuario envía una solicitud de soporte mediante un formulario</li>
<li>El enrutador analiza el contenido y contexto del ticket</li>
<li>Problemas técnicos → Agente de soporte de ingeniería</li>
<li>Preguntas de facturación → Agente de soporte financiero</li>
</ol>
</div>
### Clasificación de contenido
<div className="mb-4 rounded-md border p-4">
<h4 className="font-medium">Escenario: Clasificar y enrutar contenido generado por usuarios</h4>
<ol className="list-decimal pl-5 text-sm">
<li>El usuario envía contenido o comentarios</li>
<li>El enrutador analiza el tipo de contenido y el sentimiento</li>
<li>Solicitudes de funciones → Flujo de trabajo del equipo de producto</li>
<li>Informes de errores → Flujo de trabajo de soporte técnico</li>
</ol>
</div>
### Calificación de leads
<div className="mb-4 rounded-md border p-4">
<h4 className="font-medium">Escenario: Enrutar leads según criterios de calificación</h4>
<ol className="list-decimal pl-5 text-sm">
<li>Información del lead capturada desde un formulario</li>
<li>El enrutador analiza el tamaño de la empresa, la industria y las necesidades</li>
<li>Leads empresariales → Equipo de ventas con precios personalizados</li>
<li>Leads de PYMES → Flujo de incorporación autoservicio</li>
</ol>
</div>
## Mejores prácticas
- **Proporcionar descripciones claras de destino**: Ayuda al enrutador a entender cuándo seleccionar cada destino con descripciones específicas y detalladas
- **Usar criterios de enrutamiento específicos**: Define condiciones claras y ejemplos para cada ruta para mejorar la precisión
- **Implementar rutas alternativas**: Conecta un destino predeterminado para cuando ninguna ruta específica sea apropiada
- **Probar con entradas diversas**: Asegúrate de que el enrutador maneja varios tipos de entrada, casos extremos y contenido inesperado
- **Monitorear el rendimiento del enrutamiento**: Revisa las decisiones de enrutamiento regularmente y refina los criterios basándote en patrones de uso reales
- **Elegir modelos apropiados**: Utiliza modelos con fuertes capacidades de razonamiento para decisiones de enrutamiento complejas

View File

@@ -1,168 +0,0 @@
---
title: Flujo de trabajo
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Step, Steps } from 'fumadocs-ui/components/steps'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { Image } from '@/components/ui/image'
El bloque de Flujo de trabajo te permite ejecutar otros flujos de trabajo como componentes reutilizables dentro de tu flujo de trabajo actual. Esto permite un diseño modular, reutilización de código y la creación de flujos de trabajo complejos anidados que pueden componerse a partir de flujos de trabajo más pequeños y enfocados.
<div className="flex justify-center">
<Image
src="/static/blocks/workflow.png"
alt="Bloque de Flujo de trabajo"
width={500}
height={350}
className="my-6"
/>
</div>
<Callout type="info">
Los bloques de Flujo de trabajo permiten un diseño modular al permitirte componer flujos de trabajo complejos a partir de componentes más pequeños y reutilizables.
</Callout>
## Descripción general
El bloque de Flujo de trabajo sirve como puente entre flujos de trabajo, permitiéndote:
<Steps>
<Step>
<strong>Reutilizar flujos de trabajo existentes</strong>: Ejecutar flujos de trabajo previamente creados como componentes dentro de nuevos flujos de trabajo
</Step>
<Step>
<strong>Crear diseños modulares</strong>: Desglosar procesos complejos en flujos de trabajo más pequeños y manejables
</Step>
<Step>
<strong>Mantener la separación de responsabilidades</strong>: Mantener diferentes lógicas de negocio aisladas en flujos de trabajo separados
</Step>
<Step>
<strong>Facilitar la colaboración en equipo</strong>: Compartir y reutilizar flujos de trabajo entre diferentes proyectos y miembros del equipo
</Step>
</Steps>
## Cómo funciona
El bloque de Flujo de trabajo:
1. Toma una referencia a otro flujo de trabajo en tu espacio de trabajo
2. Pasa datos de entrada desde el flujo de trabajo actual al flujo de trabajo hijo (disponible a través de start.input)
3. Ejecuta el flujo de trabajo hijo en un contexto aislado
4. Devuelve el resultado al flujo de trabajo padre para su posterior procesamiento
## Opciones de configuración
### Selección de flujo de trabajo
Elige qué flujo de trabajo ejecutar desde una lista desplegable de flujos de trabajo disponibles en tu espacio de trabajo. La lista incluye:
- Todos los flujos de trabajo a los que tienes acceso en el espacio de trabajo actual
- Flujos de trabajo compartidos contigo por otros miembros del equipo
- Tanto flujos de trabajo habilitados como deshabilitados (aunque solo los habilitados pueden ser ejecutados)
### Contexto de ejecución
El flujo de trabajo secundario se ejecuta con:
- Su propio contexto de ejecución aislado
- Acceso a los mismos recursos del espacio de trabajo (claves API, variables de entorno)
- Verificaciones adecuadas de permisos y membresía del espacio de trabajo
- Tracespan anidado en el registro de ejecución
<Callout type="warning">
**Detección de ciclos**: El sistema detecta y previene automáticamente dependencias circulares entre flujos de trabajo para evitar bucles infinitos.
</Callout>
## Entradas y salidas
<Tabs items={['Configuration', 'Variables', 'Results']}>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>Selección de flujo de trabajo</strong>: Elige qué flujo de trabajo ejecutar
</li>
<li>
<strong>Datos de entrada</strong>: Variable o referencia de bloque para pasar al flujo de trabajo secundario
</li>
<li>
<strong>Contexto de ejecución</strong>: Entorno aislado con recursos del espacio de trabajo
</li>
</ul>
</Tab>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>workflow.success</strong>: Booleano que indica el estado de finalización
</li>
<li>
<strong>workflow.childWorkflowName</strong>: Nombre del flujo de trabajo secundario ejecutado
</li>
<li>
<strong>workflow.result</strong>: Resultado devuelto por el flujo de trabajo secundario
</li>
<li>
<strong>workflow.error</strong>: Detalles del error si el flujo de trabajo falló
</li>
</ul>
</Tab>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>Respuesta del flujo de trabajo</strong>: Salida principal del flujo de trabajo secundario
</li>
<li>
<strong>Estado de ejecución</strong>: Estado de éxito e información de error
</li>
<li>
<strong>Acceso</strong>: Disponible en bloques después del flujo de trabajo
</li>
</ul>
</Tab>
</Tabs>
## Ejemplos de casos de uso
### Incorporación modular de clientes
<div className="mb-4 rounded-md border p-4">
<h4 className="font-medium">Escenario: Dividir la incorporación compleja en componentes reutilizables</h4>
<ol className="list-decimal pl-5 text-sm">
<li>El flujo de trabajo principal recibe datos del cliente</li>
<li>El bloque de flujo de trabajo ejecuta el flujo de validación</li>
<li>El bloque de flujo de trabajo ejecuta el flujo de configuración de cuenta</li>
<li>El bloque de flujo de trabajo ejecuta el flujo de correo de bienvenida</li>
</ol>
</div>
### Arquitectura de microservicios
<div className="mb-4 rounded-md border p-4">
<h4 className="font-medium">Escenario: Crear flujos de trabajo de servicios independientes</h4>
<ol className="list-decimal pl-5 text-sm">
<li>El flujo de trabajo de procesamiento de pagos gestiona transacciones</li>
<li>El flujo de trabajo de gestión de inventario actualiza el stock</li>
<li>El flujo de trabajo de notificaciones envía confirmaciones</li>
<li>El flujo de trabajo principal orquesta todos los servicios</li>
</ol>
</div>
### Procesamiento condicional
<div className="mb-4 rounded-md border p-4">
<h4 className="font-medium">Escenario: Ejecutar diferentes flujos de trabajo según condiciones</h4>
<ol className="list-decimal pl-5 text-sm">
<li>El bloque de condición evalúa el tipo de usuario</li>
<li>Usuarios empresariales → Flujo de trabajo de aprobación complejo</li>
<li>Usuarios estándar → Flujo de trabajo de aprobación simple</li>
<li>Usuarios gratuitos → Flujo de trabajo de procesamiento básico</li>
</ol>
</div>
## Mejores prácticas
- **Mantén los flujos de trabajo enfocados**: Diseña flujos de trabajo secundarios para manejar tareas específicas y bien definidas con entradas y salidas claras
- **Minimiza la profundidad de anidación**: Evita jerarquías de flujos de trabajo profundamente anidadas para mejorar la mantenibilidad y el rendimiento
- **Maneja los errores con elegancia**: Implementa un manejo adecuado de errores para fallos en flujos de trabajo secundarios y proporciona mecanismos alternativos
- **Prueba de forma independiente**: Asegúrate de que los flujos de trabajo secundarios puedan ser probados y validados independientemente de los flujos de trabajo principales
- **Usa nomenclatura semántica**: Asigna a los flujos de trabajo nombres descriptivos que indiquen claramente su propósito y funcionalidad

View File

@@ -1,43 +0,0 @@
---
title: Conceptos básicos de conexión
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Step, Steps } from 'fumadocs-ui/components/steps'
## Cómo funcionan las conexiones
Las conexiones son las vías que permiten que los datos fluyan entre bloques en tu flujo de trabajo. En Sim, las conexiones definen cómo la información pasa de un bloque a otro, permitiendo el flujo de datos a través de tu flujo de trabajo.
<Callout type="info">
Cada conexión representa una relación dirigida donde los datos fluyen desde la salida de un bloque de origen
hacia la entrada de un bloque de destino.
</Callout>
### Creación de conexiones
<Steps>
<Step>
<strong>Seleccionar bloque de origen</strong>: Haz clic en el puerto de salida del bloque desde el que quieres conectar
</Step>
<Step>
<strong>Dibujar conexión</strong>: Arrastra hasta el puerto de entrada del bloque de destino
</Step>
<Step>
<strong>Confirmar conexión</strong>: Suelta para crear la conexión
</Step>
</Steps>
### Flujo de conexión
El flujo de datos a través de las conexiones sigue estos principios:
1. **Flujo direccional**: Los datos siempre fluyen de las salidas a las entradas
2. **Orden de ejecución**: Los bloques se ejecutan en orden según sus conexiones
3. **Transformación de datos**: Los datos pueden transformarse al pasar entre bloques
4. **Rutas condicionales**: Algunos bloques (como Router y Condition) pueden dirigir el flujo a diferentes rutas
<Callout type="warning">
Eliminar una conexión detendrá inmediatamente el flujo de datos entre los bloques. Asegúrate de que esto es
lo que deseas antes de eliminar conexiones.
</Callout>

View File

@@ -1,195 +0,0 @@
---
title: Estructura de datos de conexión
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
Cuando conectas bloques, entender la estructura de datos de las diferentes salidas de bloques es importante porque la estructura de datos de salida del bloque de origen determina qué valores están disponibles en el bloque de destino. Cada tipo de bloque produce una estructura de salida específica a la que puedes hacer referencia en bloques posteriores.
<Callout type="info">
Entender estas estructuras de datos es esencial para utilizar eficazmente las etiquetas de conexión y
acceder a los datos correctos en tus flujos de trabajo.
</Callout>
## Estructuras de salida de bloques
Diferentes tipos de bloques producen diferentes estructuras de salida. Esto es lo que puedes esperar de cada tipo de bloque:
<Tabs items={['Salida del agente', 'Salida de API', 'Salida de función', 'Salida del evaluador', 'Salida de condición', 'Salida del enrutador']}>
<Tab>
```json
{
"content": "The generated text response",
"model": "gpt-4o",
"tokens": {
"prompt": 120,
"completion": 85,
"total": 205
},
"toolCalls": [...],
"cost": [...],
"usage": [...]
}
```
### Campos de salida del bloque de agente
- **content**: La respuesta de texto principal generada por el agente
- **model**: El modelo de IA utilizado (p. ej., "gpt-4o", "claude-3-opus")
- **tokens**: Estadísticas de uso de tokens
- **prompt**: Número de tokens en el prompt
- **completion**: Número de tokens en la respuesta
- **total**: Total de tokens utilizados
- **toolCalls**: Array de llamadas a herramientas realizadas por el agente (si las hay)
- **cost**: Array de objetos de costo para cada llamada a herramienta (si las hay)
- **usage**: Estadísticas de uso de tokens para toda la respuesta
</Tab>
<Tab>
```json
{
"data": "Response data",
"status": 200,
"headers": {
"content-type": "application/json",
"cache-control": "no-cache"
}
}
```
### Campos de salida del bloque de API
- **data**: Los datos de respuesta de la API (puede ser de cualquier tipo)
- **status**: Código de estado HTTP de la respuesta
- **headers**: Cabeceras HTTP devueltas por la API
</Tab>
<Tab>
```json
{
"result": "Function return value",
"stdout": "Console output",
}
```
### Campos de salida del bloque de función
- **result**: El valor de retorno de la función (puede ser de cualquier tipo)
- **stdout**: Salida de consola capturada durante la ejecución de la función
</Tab>
<Tab>
```json
{
"content": "Evaluation summary",
"model": "gpt-5",
"tokens": {
"prompt": 120,
"completion": 85,
"total": 205
},
"metric1": 8.5,
"metric2": 7.2,
"metric3": 9.0
}
```
### Campos de salida del bloque evaluador
- **content**: Resumen de la evaluación
- **model**: El modelo de IA utilizado para la evaluación
- **tokens**: Estadísticas de uso de tokens
- **[metricName]**: Puntuación para cada métrica definida en el evaluador (campos dinámicos)
</Tab>
<Tab>
```json
{
"content": "Original content passed through",
"conditionResult": true,
"selectedPath": {
"blockId": "2acd9007-27e8-4510-a487-73d3b825e7c1",
"blockType": "agent",
"blockTitle": "Follow-up Agent"
},
"selectedConditionId": "condition-1"
}
```
### Campos de salida del bloque de condición
- **content**: El contenido original que se transmite
- **conditionResult**: Resultado booleano de la evaluación de la condición
- **selectedPath**: Información sobre la ruta seleccionada
- **blockId**: ID del siguiente bloque en la ruta seleccionada
- **blockType**: Tipo del siguiente bloque
- **blockTitle**: Título del siguiente bloque
- **selectedConditionId**: ID de la condición seleccionada
</Tab>
<Tab>
```json
{
"content": "Routing decision",
"model": "gpt-4o",
"tokens": {
"prompt": 120,
"completion": 85,
"total": 205
},
"selectedPath": {
"blockId": "2acd9007-27e8-4510-a487-73d3b825e7c1",
"blockType": "agent",
"blockTitle": "Customer Service Agent"
}
}
```
### Campos de salida del bloque enrutador
- **content**: El texto de decisión de enrutamiento
- **model**: El modelo de IA utilizado para el enrutamiento
- **tokens**: Estadísticas de uso de tokens
- **selectedPath**: Información sobre la ruta seleccionada
- **blockId**: ID del bloque de destino seleccionado
- **blockType**: Tipo del bloque seleccionado
- **blockTitle**: Título del bloque seleccionado
</Tab>
</Tabs>
## Estructuras de salida personalizadas
Algunos bloques pueden producir estructuras de salida personalizadas según su configuración:
1. **Bloques de agente con formato de respuesta**: Al usar un formato de respuesta en un bloque de agente, la estructura de salida coincidirá con el esquema definido en lugar de la estructura estándar.
2. **Bloques de función**: El campo `result` puede contener cualquier estructura de datos devuelta por el código de tu función.
3. **Bloques de API**: El campo `data` contendrá lo que devuelva la API, que podría ser cualquier estructura JSON válida.
<Callout type="warning">
Verifica siempre la estructura de salida real de tus bloques durante el desarrollo para asegurarte de que
estás referenciando los campos correctos en tus conexiones.
</Callout>
## Estructuras de datos anidadas
Muchas salidas de bloques contienen estructuras de datos anidadas. Puedes acceder a estas utilizando la notación de punto en las etiquetas de conexión:
```
<blockName.path.to.nested.data>
```
Por ejemplo:
- `<agent1.tokens.total>` - Accede al total de tokens desde un bloque de Agente
- `<api1.data.results[0].id>` - Accede al ID del primer resultado de una respuesta de API
- `<function1.result.calculations.total>` - Accede a un campo anidado en el resultado de un bloque de Función

View File

@@ -1,42 +0,0 @@
---
title: Conexiones
description: Conecta tus bloques entre sí.
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Card, Cards } from 'fumadocs-ui/components/card'
import { ConnectIcon } from '@/components/icons'
import { Video } from '@/components/ui/video'
Las conexiones son las vías que permiten que los datos fluyan entre bloques en tu flujo de trabajo. Definen cómo se pasa la información de un bloque a otro, permitiéndote crear procesos sofisticados de múltiples pasos.
<Callout type="info">
Las conexiones correctamente configuradas son esenciales para crear flujos de trabajo efectivos. Determinan cómo
se mueven los datos a través de tu sistema y cómo los bloques interactúan entre sí.
</Callout>
<div className="mx-auto w-full overflow-hidden rounded-lg">
<Video src="connections.mp4" />
</div>
## Tipos de conexiones
Sim admite diferentes tipos de conexiones que permiten varios patrones de flujo de trabajo:
<Cards>
<Card title="Conceptos básicos de conexiones" href="/connections/basics">
Aprende cómo funcionan las conexiones y cómo crearlas en tus flujos de trabajo
</Card>
<Card title="Etiquetas de conexión" href="/connections/tags">
Comprende cómo usar etiquetas de conexión para referenciar datos entre bloques
</Card>
<Card title="Estructura de datos" href="/connections/data-structure">
Explora las estructuras de datos de salida de diferentes tipos de bloques
</Card>
<Card title="Acceso a datos" href="/connections/accessing-data">
Aprende técnicas para acceder y manipular datos conectados
</Card>
<Card title="Mejores prácticas" href="/connections/best-practices">
Sigue los patrones recomendados para una gestión eficaz de conexiones
</Card>
</Cards>

View File

@@ -1,109 +0,0 @@
---
title: Etiquetas de conexión
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Video } from '@/components/ui/video'
Las etiquetas de conexión son representaciones visuales de los datos disponibles desde bloques conectados, proporcionando una manera fácil de referenciar datos entre bloques y salidas de bloques anteriores en tu flujo de trabajo.
<div className="mx-auto w-full overflow-hidden rounded-lg">
<Video src="connections.mp4" />
</div>
### ¿Qué son las etiquetas de conexión?
Las etiquetas de conexión son elementos interactivos que aparecen cuando los bloques están conectados. Representan los datos que pueden fluir de un bloque a otro y te permiten:
- Visualizar datos disponibles de bloques de origen
- Referenciar campos de datos específicos en bloques de destino
- Crear flujos de datos dinámicos entre bloques
<Callout type="info">
Las etiquetas de conexión facilitan ver qué datos están disponibles de bloques anteriores y usarlos en tu
bloque actual sin tener que recordar estructuras de datos complejas.
</Callout>
## Uso de etiquetas de conexión
Hay dos formas principales de usar etiquetas de conexión en tus flujos de trabajo:
<div className="my-6 grid grid-cols-1 gap-4 md:grid-cols-2">
<div className="rounded-lg border border-gray-200 p-4 dark:border-gray-800">
<h3 className="mb-2 text-lg font-medium">Arrastrar y soltar</h3>
<div className="text-sm text-gray-600 dark:text-gray-400">
Haz clic en una etiqueta de conexión y arrástrala a los campos de entrada de los bloques de destino. Aparecerá un menú desplegable
mostrando los valores disponibles.
</div>
<ol className="mt-2 list-decimal pl-5 text-sm text-gray-600 dark:text-gray-400">
<li>Pasa el cursor sobre una etiqueta de conexión para ver los datos disponibles</li>
<li>Haz clic y arrastra la etiqueta a un campo de entrada</li>
<li>Selecciona el campo de datos específico del menú desplegable</li>
<li>La referencia se inserta automáticamente</li>
</ol>
</div>
<div className="rounded-lg border border-gray-200 p-4 dark:border-gray-800">
<h3 className="mb-2 text-lg font-medium">Sintaxis de corchetes angulares</h3>
<div className="text-sm text-gray-600 dark:text-gray-400">
Escribe <code>&lt;&gt;</code> en los campos de entrada para ver un menú desplegable de valores de conexión disponibles
de bloques anteriores.
</div>
<ol className="mt-2 list-decimal pl-5 text-sm text-gray-600 dark:text-gray-400">
<li>Haz clic en cualquier campo de entrada donde quieras usar datos conectados</li>
<li>
Escribe <code>&lt;&gt;</code> para activar el menú desplegable de conexión
</li>
<li>Navega y selecciona los datos que quieres referenciar</li>
<li>Continúa escribiendo o selecciona del menú desplegable para completar la referencia</li>
</ol>
</div>
</div>
## Sintaxis de etiquetas
Las etiquetas de conexión utilizan una sintaxis simple para hacer referencia a los datos:
```
<blockName.path.to.data>
```
Donde:
- `blockName` es el nombre del bloque de origen
- `path.to.data` es la ruta al campo de datos específico
Por ejemplo:
- `<agent1.content>` - Hace referencia al campo de contenido de un bloque con ID "agent1"
- `<api2.data.users[0].name>` - Hace referencia al nombre del primer usuario en el array de usuarios desde el campo de datos de un bloque con ID "api2"
## Referencias dinámicas de etiquetas
Las etiquetas de conexión se evalúan en tiempo de ejecución, lo que significa:
1. Siempre hacen referencia a los datos más actuales
2. Pueden utilizarse en expresiones y combinarse con texto estático
3. Pueden anidarse dentro de otras estructuras de datos
### Ejemplos
```javascript
// Reference in text
"The user's name is <userBlock.name>"
// Reference in JSON
{
"userName": "<userBlock.name>",
"orderTotal": <apiBlock.data.total>
}
// Reference in code
const greeting = "Hello, <userBlock.name>!";
const total = <apiBlock.data.total> * 1.1; // Add 10% tax
```
<Callout type="warning">
Cuando utilices etiquetas de conexión en contextos numéricos, asegúrate de que los datos referenciados sean realmente un número
para evitar problemas de conversión de tipos.
</Callout>

View File

@@ -1,161 +0,0 @@
---
title: Copilot
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Card, Cards } from 'fumadocs-ui/components/card'
import { Image } from '@/components/ui/image'
import { MessageCircle, Package, Zap, Infinity as InfinityIcon, Brain, BrainCircuit } from 'lucide-react'
Copilot es tu asistente integrado en el editor que te ayuda a crear y editar flujos de trabajo con Sim Copilot, así como a entenderlos y mejorarlos. Puede:
- **Explicar**: Responder preguntas sobre Sim y tu flujo de trabajo actual
- **Guiar**: Sugerir ediciones y mejores prácticas
- **Editar**: Realizar cambios en bloques, conexiones y configuraciones cuando los apruebes
<Callout type="info">
Copilot es un servicio gestionado por Sim. Para implementaciones autoalojadas, genera una clave API de Copilot en la aplicación alojada (sim.ai → Configuración → Copilot)
1. Ve a [sim.ai](https://sim.ai) → Configuración → Copilot y genera una clave API de Copilot
2. Establece `COPILOT_API_KEY` en tu entorno autoalojado con ese valor
</Callout>
## Menú contextual (@)
Usa el símbolo `@` para hacer referencia a varios recursos y proporcionar a Copilot más contexto sobre tu espacio de trabajo:
<Image
src="/static/copilot/copilot-menu.png"
alt="Menú contextual de Copilot mostrando opciones de referencia disponibles"
width={600}
height={400}
/>
El menú `@` proporciona acceso a:
- **Chats**: Referencia conversaciones previas con copilot
- **Todos los flujos de trabajo**: Referencia cualquier flujo de trabajo en tu espacio de trabajo
- **Bloques de flujo de trabajo**: Referencia bloques específicos de los flujos de trabajo
- **Bloques**: Referencia tipos de bloques y plantillas
- **Conocimiento**: Referencia tus documentos subidos y base de conocimientos
- **Documentación**: Referencia la documentación de Sim
- **Plantillas**: Referencia plantillas de flujo de trabajo
- **Registros**: Referencia registros de ejecución y resultados
Esta información contextual ayuda a Copilot a proporcionar asistencia más precisa y relevante para tu caso de uso específico.
## Modos
<Cards>
<Card
title={
<span className="inline-flex items-center gap-2">
<MessageCircle className="h-4 w-4 text-muted-foreground" />
Preguntar
</span>
}
>
<div className="m-0 text-sm">
Modo de preguntas y respuestas para explicaciones, orientación y sugerencias sin realizar cambios en tu flujo de trabajo.
</div>
</Card>
<Card
title={
<span className="inline-flex items-center gap-2">
<Package className="h-4 w-4 text-muted-foreground" />
Agente
</span>
}
>
<div className="m-0 text-sm">
Modo de construcción y edición. Copilot propone ediciones específicas (añadir bloques, conectar variables, ajustar configuraciones) y las aplica cuando las apruebas.
</div>
</Card>
</Cards>
## Niveles de profundidad
<Cards>
<Card
title={
<span className="inline-flex items-center gap-2">
<Zap className="h-4 w-4 text-muted-foreground" />
Rápido
</span>
}
>
<div className="m-0 text-sm">El más rápido y económico. Ideal para ediciones pequeñas, flujos de trabajo simples y ajustes menores.</div>
</Card>
<Card
title={
<span className="inline-flex items-center gap-2">
<InfinityIcon className="h-4 w-4 text-muted-foreground" />
Auto
</span>
}
>
<div className="m-0 text-sm">Equilibrio entre velocidad y razonamiento. Opción predeterminada recomendada para la mayoría de las tareas.</div>
</Card>
<Card
title={
<span className="inline-flex items-center gap-2">
<Brain className="h-4 w-4 text-muted-foreground" />
Avanzado
</span>
}
>
<div className="m-0 text-sm">Mayor capacidad de razonamiento para flujos de trabajo más grandes y ediciones complejas sin perder rendimiento.</div>
</Card>
<Card
title={
<span className="inline-flex items-center gap-2">
<BrainCircuit className="h-4 w-4 text-muted-foreground" />
Behemoth
</span>
}
>
<div className="m-0 text-sm">Máxima capacidad de razonamiento para planificación profunda, depuración y cambios arquitectónicos complejos.</div>
</Card>
</Cards>
### Interfaz de selección de modo
Puedes cambiar fácilmente entre diferentes modos de razonamiento usando el selector de modo en la interfaz de Copilot:
<Image
src="/static/copilot/copilot-models.png"
alt="Selección de modo de Copilot mostrando el modo Avanzado con el interruptor MAX"
width={600}
height={300}
/>
La interfaz te permite:
- **Seleccionar nivel de razonamiento**: Elige entre Rápido, Auto, Avanzado o Behemoth
- **Activar modo MAX**: Activa el interruptor para obtener las máximas capacidades de razonamiento cuando necesites el análisis más exhaustivo
- **Ver descripciones de modos**: Comprende para qué está optimizado cada modo
Elige tu modo según la complejidad de tu tarea - usa Rápido para preguntas simples y Behemoth para cambios arquitectónicos complejos.
## Facturación y cálculo de costos
### Cómo se calculan los costos
El uso de Copilot se factura por token del LLM subyacente:
- **Tokens de entrada**: facturados a la tarifa base del proveedor (**a costo**)
- **Tokens de salida**: facturados a **1,5×** la tarifa base de salida del proveedor
```javascript
copilotCost = (inputTokens × inputPrice + outputTokens × (outputPrice × 1.5)) / 1,000,000
```
| Componente | Tarifa aplicada |
|------------|----------------------|
| Entrada | inputPrice |
| Salida | outputPrice × 1.5 |
<Callout type="warning">
Los precios mostrados reflejan las tarifas a partir del 4 de septiembre de 2025. Consulte la documentación del proveedor para conocer los precios actuales.
</Callout>
<Callout type="info">
Los precios de los modelos son por millón de tokens. El cálculo divide por 1.000.000 para obtener el costo real. Consulte <a href="/execution/costs">la página de Cálculo de Costos</a> para antecedentes y ejemplos.
</Callout>

View File

@@ -1,551 +0,0 @@
---
title: API externa
---
import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'
import { Callout } from 'fumadocs-ui/components/callout'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { CodeBlock } from 'fumadocs-ui/components/codeblock'
import { Video } from '@/components/ui/video'
Sim proporciona una API externa completa para consultar registros de ejecución de flujos de trabajo y configurar webhooks para notificaciones en tiempo real cuando los flujos de trabajo se completan.
## Autenticación
Todas las solicitudes a la API requieren una clave de API pasada en el encabezado `x-api-key`:
```bash
curl -H "x-api-key: YOUR_API_KEY" \
https://sim.ai/api/v1/logs?workspaceId=YOUR_WORKSPACE_ID
```
Puedes generar claves de API desde la configuración de usuario en el panel de control de Sim.
## API de registros
Todas las respuestas de la API incluyen información sobre tus límites de ejecución de flujos de trabajo y su uso:
```json
"limits": {
"workflowExecutionRateLimit": {
"sync": {
"limit": 60, // Max sync workflow executions per minute
"remaining": 58, // Remaining sync workflow executions
"resetAt": "..." // When the window resets
},
"async": {
"limit": 60, // Max async workflow executions per minute
"remaining": 59, // Remaining async workflow executions
"resetAt": "..." // When the window resets
}
},
"usage": {
"currentPeriodCost": 1.234, // Current billing period usage in USD
"limit": 10, // Usage limit in USD
"plan": "pro", // Current subscription plan
"isExceeded": false // Whether limit is exceeded
}
}
```
**Nota:** Los límites de tasa en el cuerpo de la respuesta son para ejecuciones de flujos de trabajo. Los límites de tasa para llamar a este endpoint de la API están en los encabezados de respuesta (`X-RateLimit-*`).
### Consultar registros
Consulta los registros de ejecución de flujos de trabajo con amplias opciones de filtrado.
<Tabs items={['Request', 'Response']}>
<Tab value="Request">
```http
GET /api/v1/logs
```
**Parámetros requeridos:**
- `workspaceId` - Tu ID de espacio de trabajo
**Filtros opcionales:**
- `workflowIds` - IDs de flujos de trabajo separados por comas
- `folderIds` - IDs de carpetas separados por comas
- `triggers` - Tipos de disparadores separados por comas: `api`, `webhook`, `schedule`, `manual`, `chat`
- `level` - Filtrar por nivel: `info`, `error`
- `startDate` - Marca de tiempo ISO para el inicio del rango de fechas
- `endDate` - Marca de tiempo ISO para el fin del rango de fechas
- `executionId` - Coincidencia exacta de ID de ejecución
- `minDurationMs` - Duración mínima de ejecución en milisegundos
- `maxDurationMs` - Duración máxima de ejecución en milisegundos
- `minCost` - Costo mínimo de ejecución
- `maxCost` - Costo máximo de ejecución
- `model` - Filtrar por modelo de IA utilizado
**Paginación:**
- `limit` - Resultados por página (predeterminado: 100)
- `cursor` - Cursor para la siguiente página
- `order` - Orden de clasificación: `desc`, `asc` (predeterminado: desc)
**Nivel de detalle:**
- `details` - Nivel de detalle de la respuesta: `basic`, `full` (predeterminado: básico)
- `includeTraceSpans` - Incluir intervalos de seguimiento (predeterminado: falso)
- `includeFinalOutput` - Incluir salida final (predeterminado: falso)
</Tab>
<Tab value="Response">
```json
{
"data": [
{
"id": "log_abc123",
"workflowId": "wf_xyz789",
"executionId": "exec_def456",
"level": "info",
"trigger": "api",
"startedAt": "2025-01-01T12:34:56.789Z",
"endedAt": "2025-01-01T12:34:57.123Z",
"totalDurationMs": 334,
"cost": {
"total": 0.00234
},
"files": null
}
],
"nextCursor": "eyJzIjoiMjAyNS0wMS0wMVQxMjozNDo1Ni43ODlaIiwiaWQiOiJsb2dfYWJjMTIzIn0",
"limits": {
"workflowExecutionRateLimit": {
"sync": {
"limit": 60,
"remaining": 58,
"resetAt": "2025-01-01T12:35:56.789Z"
},
"async": {
"limit": 60,
"remaining": 59,
"resetAt": "2025-01-01T12:35:56.789Z"
}
},
"usage": {
"currentPeriodCost": 1.234,
"limit": 10,
"plan": "pro",
"isExceeded": false
}
}
}
```
</Tab>
</Tabs>
### Obtener detalles del registro
Recupera información detallada sobre una entrada de registro específica.
<Tabs items={['Request', 'Response']}>
<Tab value="Request">
```http
GET /api/v1/logs/{id}
```
</Tab>
<Tab value="Response">
```json
{
"data": {
"id": "log_abc123",
"workflowId": "wf_xyz789",
"executionId": "exec_def456",
"level": "info",
"trigger": "api",
"startedAt": "2025-01-01T12:34:56.789Z",
"endedAt": "2025-01-01T12:34:57.123Z",
"totalDurationMs": 334,
"workflow": {
"id": "wf_xyz789",
"name": "My Workflow",
"description": "Process customer data"
},
"executionData": {
"traceSpans": [...],
"finalOutput": {...}
},
"cost": {
"total": 0.00234,
"tokens": {
"prompt": 123,
"completion": 456,
"total": 579
},
"models": {
"gpt-4o": {
"input": 0.001,
"output": 0.00134,
"total": 0.00234,
"tokens": {
"prompt": 123,
"completion": 456,
"total": 579
}
}
}
},
"limits": {
"workflowExecutionRateLimit": {
"sync": {
"limit": 60,
"remaining": 58,
"resetAt": "2025-01-01T12:35:56.789Z"
},
"async": {
"limit": 60,
"remaining": 59,
"resetAt": "2025-01-01T12:35:56.789Z"
}
},
"usage": {
"currentPeriodCost": 1.234,
"limit": 10,
"plan": "pro",
"isExceeded": false
}
}
}
}
```
</Tab>
</Tabs>
### Obtener detalles de ejecución
Recupera detalles de ejecución incluyendo la instantánea del estado del flujo de trabajo.
<Tabs items={['Request', 'Response']}>
<Tab value="Request">
```http
GET /api/v1/logs/executions/{executionId}
```
</Tab>
<Tab value="Response">
```json
{
"executionId": "exec_def456",
"workflowId": "wf_xyz789",
"workflowState": {
"blocks": {...},
"edges": [...],
"loops": {...},
"parallels": {...}
},
"executionMetadata": {
"trigger": "api",
"startedAt": "2025-01-01T12:34:56.789Z",
"endedAt": "2025-01-01T12:34:57.123Z",
"totalDurationMs": 334,
"cost": {...}
}
}
```
</Tab>
</Tabs>
## Suscripciones a webhooks
Recibe notificaciones en tiempo real cuando se completan las ejecuciones de flujos de trabajo. Los webhooks se configuran a través de la interfaz de usuario de Sim en el editor de flujos de trabajo.
### Configuración
Los webhooks pueden configurarse para cada flujo de trabajo a través de la interfaz de usuario del editor de flujos de trabajo. Haz clic en el icono de webhook en la barra de control para configurar tus suscripciones a webhooks.
<div className="mx-auto w-full overflow-hidden rounded-lg">
<Video src="configure-webhook.mp4" width={700} height={450} />
</div>
**Opciones de configuración disponibles:**
- `url`: URL del punto final de tu webhook
- `secret`: Secreto opcional para verificación de firma HMAC
- `includeFinalOutput`: Incluir la salida final del flujo de trabajo en la carga útil
- `includeTraceSpans`: Incluir intervalos de seguimiento de ejecución detallados
- `includeRateLimits`: Incluir información del límite de tasa del propietario del flujo de trabajo
- `includeUsageData`: Incluir datos de uso y facturación del propietario del flujo de trabajo
- `levelFilter`: Array de niveles de registro a recibir (`info`, `error`)
- `triggerFilter`: Array de tipos de disparadores a recibir (`api`, `webhook`, `schedule`, `manual`, `chat`)
- `active`: Habilitar/deshabilitar la suscripción al webhook
### Carga útil del webhook
Cuando se completa la ejecución de un flujo de trabajo, Sim envía una solicitud POST a tu URL de webhook:
```json
{
"id": "evt_123",
"type": "workflow.execution.completed",
"timestamp": 1735925767890,
"data": {
"workflowId": "wf_xyz789",
"executionId": "exec_def456",
"status": "success",
"level": "info",
"trigger": "api",
"startedAt": "2025-01-01T12:34:56.789Z",
"endedAt": "2025-01-01T12:34:57.123Z",
"totalDurationMs": 334,
"cost": {
"total": 0.00234,
"tokens": {
"prompt": 123,
"completion": 456,
"total": 579
},
"models": {
"gpt-4o": {
"input": 0.001,
"output": 0.00134,
"total": 0.00234,
"tokens": {
"prompt": 123,
"completion": 456,
"total": 579
}
}
}
},
"files": null,
"finalOutput": {...}, // Only if includeFinalOutput=true
"traceSpans": [...], // Only if includeTraceSpans=true
"rateLimits": {...}, // Only if includeRateLimits=true
"usage": {...} // Only if includeUsageData=true
},
"links": {
"log": "/v1/logs/log_abc123",
"execution": "/v1/logs/executions/exec_def456"
}
}
```
### Cabeceras de webhook
Cada solicitud de webhook incluye estas cabeceras:
- `sim-event`: Tipo de evento (siempre `workflow.execution.completed`)
- `sim-timestamp`: Marca de tiempo Unix en milisegundos
- `sim-delivery-id`: ID único de entrega para idempotencia
- `sim-signature`: Firma HMAC-SHA256 para verificación (si se configura un secreto)
- `Idempotency-Key`: Igual que el ID de entrega para detección de duplicados
### Verificación de firma
Si configuras un secreto de webhook, verifica la firma para asegurar que el webhook proviene de Sim:
<Tabs items={['Node.js', 'Python']}>
<Tab value="Node.js">
```javascript
import crypto from 'crypto';
function verifyWebhookSignature(body, signature, secret) {
const [timestampPart, signaturePart] = signature.split(',');
const timestamp = timestampPart.replace('t=', '');
const expectedSignature = signaturePart.replace('v1=', '');
const signatureBase = `${timestamp}.${body}`;
const hmac = crypto.createHmac('sha256', secret);
hmac.update(signatureBase);
const computedSignature = hmac.digest('hex');
return computedSignature === expectedSignature;
}
// In your webhook handler
app.post('/webhook', (req, res) => {
const signature = req.headers['sim-signature'];
const body = JSON.stringify(req.body);
if (!verifyWebhookSignature(body, signature, process.env.WEBHOOK_SECRET)) {
return res.status(401).send('Invalid signature');
}
// Process the webhook...
});
```
</Tab>
<Tab value="Python">
```python
import hmac
import hashlib
import json
def verify_webhook_signature(body: str, signature: str, secret: str) -> bool:
timestamp_part, signature_part = signature.split(',')
timestamp = timestamp_part.replace('t=', '')
expected_signature = signature_part.replace('v1=', '')
signature_base = f"{timestamp}.{body}"
computed_signature = hmac.new(
secret.encode(),
signature_base.encode(),
hashlib.sha256
).hexdigest()
return hmac.compare_digest(computed_signature, expected_signature)
# In your webhook handler
@app.route('/webhook', methods=['POST'])
def webhook():
signature = request.headers.get('sim-signature')
body = json.dumps(request.json)
if not verify_webhook_signature(body, signature, os.environ['WEBHOOK_SECRET']):
return 'Invalid signature', 401
# Process the webhook...
```
</Tab>
</Tabs>
### Política de reintentos
Las entregas de webhook fallidas se reintentan con retroceso exponencial y fluctuación:
- Máximo de intentos: 5
- Retrasos de reintento: 5 segundos, 15 segundos, 1 minuto, 3 minutos, 10 minutos
- Fluctuación: Hasta un 10% de retraso adicional para prevenir el efecto de manada
- Solo las respuestas HTTP 5xx y 429 activan reintentos
- Las entregas agotan el tiempo de espera después de 30 segundos
<Callout type="info">
Las entregas de webhook se procesan de forma asíncrona y no afectan al rendimiento de ejecución del flujo de trabajo.
</Callout>
## Mejores prácticas
1. **Estrategia de sondeo**: Al sondear registros, utiliza paginación basada en cursor con `order=asc` y `startDate` para obtener nuevos registros de manera eficiente.
2. **Seguridad de webhook**: Siempre configura un secreto de webhook y verifica las firmas para asegurar que las solicitudes provienen de Sim.
3. **Idempotencia**: Utiliza la cabecera `Idempotency-Key` para detectar y manejar entregas duplicadas de webhook.
4. **Privacidad**: Por defecto, `finalOutput` y `traceSpans` están excluidos de las respuestas. Habilítalos solo si necesitas los datos y comprendes las implicaciones de privacidad.
5. **Limitación de tasa**: Implementa retroceso exponencial cuando recibas respuestas 429. Consulta la cabecera `Retry-After` para conocer el tiempo de espera recomendado.
## Limitación de tasa
La API implementa limitación de tasa para garantizar un uso justo:
- **Plan gratuito**: 10 solicitudes por minuto
- **Plan Pro**: 30 solicitudes por minuto
- **Plan Team**: 60 solicitudes por minuto
- **Plan Enterprise**: Límites personalizados
La información del límite de tasa se incluye en los encabezados de respuesta:
- `X-RateLimit-Limit`: Máximo de solicitudes por ventana
- `X-RateLimit-Remaining`: Solicitudes restantes en la ventana actual
- `X-RateLimit-Reset`: Marca de tiempo ISO cuando se reinicia la ventana
## Ejemplo: Sondeo para nuevos registros
```javascript
let cursor = null;
const workspaceId = 'YOUR_WORKSPACE_ID';
const startDate = new Date().toISOString();
async function pollLogs() {
const params = new URLSearchParams({
workspaceId,
startDate,
order: 'asc',
limit: '100'
});
if (cursor) {
params.append('cursor', cursor);
}
const response = await fetch(
`https://sim.ai/api/v1/logs?${params}`,
{
headers: {
'x-api-key': 'YOUR_API_KEY'
}
}
);
if (response.ok) {
const data = await response.json();
// Process new logs
for (const log of data.data) {
console.log(`New execution: ${log.executionId}`);
}
// Update cursor for next poll
if (data.nextCursor) {
cursor = data.nextCursor;
}
}
}
// Poll every 30 seconds
setInterval(pollLogs, 30000);
```
## Ejemplo: Procesamiento de webhooks
```javascript
import express from 'express';
import crypto from 'crypto';
const app = express();
app.use(express.json());
app.post('/sim-webhook', (req, res) => {
// Verify signature
const signature = req.headers['sim-signature'];
const body = JSON.stringify(req.body);
if (!verifyWebhookSignature(body, signature, process.env.WEBHOOK_SECRET)) {
return res.status(401).send('Invalid signature');
}
// Check timestamp to prevent replay attacks
const timestamp = parseInt(req.headers['sim-timestamp']);
const fiveMinutesAgo = Date.now() - (5 * 60 * 1000);
if (timestamp < fiveMinutesAgo) {
return res.status(401).send('Timestamp too old');
}
// Process the webhook
const event = req.body;
switch (event.type) {
case 'workflow.execution.completed':
const { workflowId, executionId, status, cost } = event.data;
if (status === 'error') {
console.error(`Workflow ${workflowId} failed: ${executionId}`);
// Handle error...
} else {
console.log(`Workflow ${workflowId} completed: ${executionId}`);
console.log(`Cost: ${cost.total}`);
// Process successful execution...
}
break;
}
// Return 200 to acknowledge receipt
res.status(200).send('OK');
});
app.listen(3000, () => {
console.log('Webhook server listening on port 3000');
});
```

View File

@@ -1,132 +0,0 @@
---
title: Conceptos básicos de ejecución
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Card, Cards } from 'fumadocs-ui/components/card'
import { Step, Steps } from 'fumadocs-ui/components/steps'
import { Image } from '@/components/ui/image'
import { Video } from '@/components/ui/video'
Entender cómo se ejecutan los flujos de trabajo en Sim es clave para crear automatizaciones eficientes y confiables. El motor de ejecución gestiona automáticamente las dependencias, la concurrencia y el flujo de datos para garantizar que tus flujos de trabajo funcionen de manera fluida y predecible.
## Cómo se ejecutan los flujos de trabajo
El motor de ejecución de Sim procesa los flujos de trabajo de manera inteligente analizando las dependencias y ejecutando los bloques en el orden más eficiente posible.
### Ejecución concurrente por defecto
Múltiples bloques se ejecutan simultáneamente cuando no dependen entre sí. Esta ejecución paralela mejora dramáticamente el rendimiento sin requerir configuración manual.
<Image
src="/static/execution/concurrency.png"
alt="Múltiples bloques ejecutándose concurrentemente después del bloque de Inicio"
width={800}
height={500}
/>
En este ejemplo, tanto el bloque de agente de Atención al Cliente como el de Investigador Profundo se ejecutan simultáneamente después del bloque de Inicio, maximizando la eficiencia.
### Combinación automática de salidas
Cuando los bloques tienen múltiples dependencias, el motor de ejecución espera automáticamente a que todas las dependencias se completen, y luego proporciona sus salidas combinadas al siguiente bloque. No se requiere combinación manual.
<Image
src="/static/execution/combination.png"
alt="Bloque de función recibiendo automáticamente salidas de múltiples bloques anteriores"
width={800}
height={500}
/>
El bloque de Función recibe las salidas de ambos bloques de agente tan pronto como se completan, permitiéndote procesar los resultados combinados.
### Enrutamiento inteligente
Los flujos de trabajo pueden ramificarse en múltiples direcciones utilizando bloques de enrutamiento. El motor de ejecución admite tanto el enrutamiento determinista (con bloques de Condición) como el enrutamiento basado en IA (con bloques de Router).
<Image
src="/static/execution/routing.png"
alt="Flujo de trabajo mostrando ramificación tanto condicional como basada en router"
width={800}
height={500}
/>
Este flujo de trabajo demuestra cómo la ejecución puede seguir diferentes caminos basados en condiciones o decisiones de IA, con cada camino ejecutándose independientemente.
## Tipos de bloques
Sim proporciona diferentes tipos de bloques que sirven para propósitos específicos en tus flujos de trabajo:
<Cards>
<Card title="Disparadores" href="/triggers">
Los **bloques de inicio** inician flujos de trabajo y los **bloques de Webhook** responden a eventos externos. Cada flujo de trabajo necesita un disparador para comenzar la ejecución.
</Card>
<Card title="Bloques de procesamiento" href="/blocks">
Los **bloques de agente** interactúan con modelos de IA, los **bloques de función** ejecutan código personalizado, y los **bloques de API** conectan con servicios externos. Estos bloques transforman y procesan tus datos.
</Card>
<Card title="Control de flujo" href="/blocks">
Los **bloques de enrutador** usan IA para elegir caminos, los **bloques de condición** ramifican basándose en lógica, y los **bloques de bucle/paralelo** manejan iteraciones y concurrencia.
</Card>
<Card title="Salida y respuesta" href="/blocks">
Los **bloques de respuesta** formatean las salidas finales para APIs e interfaces de chat, devolviendo resultados estructurados de tus flujos de trabajo.
</Card>
</Cards>
Todos los bloques se ejecutan automáticamente basándose en sus dependencias - no necesitas gestionar manualmente el orden de ejecución o el tiempo.
## Disparadores de ejecución
Los flujos de trabajo pueden activarse de varias maneras, dependiendo de tu caso de uso:
### Pruebas manuales
Haz clic en "Ejecutar" en el editor de flujo de trabajo para probar tu flujo de trabajo durante el desarrollo. Perfecto para depuración y validación.
### Ejecución programada
Configura ejecuciones recurrentes usando expresiones cron. Ideal para procesamiento regular de datos, informes o tareas de mantenimiento.
### Despliegue de API
Despliega flujos de trabajo como endpoints HTTP que pueden ser llamados programáticamente desde tus aplicaciones.
### Integración de Webhook
Responde a eventos de servicios externos como GitHub, Stripe o sistemas personalizados en tiempo real.
### Interfaz de chat
Crea interfaces conversacionales alojadas en subdominios personalizados para aplicaciones de IA orientadas al usuario.
<Callout type="info">
Aprende más sobre cada tipo de disparador en la [sección de Disparadores](/triggers) de la documentación.
</Callout>
## Monitoreo de ejecución
Cuando los flujos de trabajo se ejecutan, Sim proporciona visibilidad en tiempo real del proceso de ejecución:
- **Estados de bloques en vivo**: Ve qué bloques se están ejecutando actualmente, cuáles han completado o fallado
- **Registros de ejecución**: Los registros detallados aparecen en tiempo real mostrando entradas, salidas y cualquier error
- **Métricas de rendimiento**: Realiza seguimiento del tiempo de ejecución y costos para cada bloque
- **Visualización de rutas**: Comprende qué rutas de ejecución se tomaron a través de tu flujo de trabajo
<Callout type="info">
Todos los detalles de ejecución son capturados y están disponibles para revisión incluso después de que los flujos de trabajo se completen, ayudando con la depuración y optimización.
</Callout>
## Principios clave de ejecución
Entender estos principios fundamentales te ayudará a construir mejores flujos de trabajo:
1. **Ejecución basada en dependencias**: Los bloques solo se ejecutan cuando todas sus dependencias han completado
2. **Paralelización automática**: Los bloques independientes se ejecutan simultáneamente sin configuración
3. **Flujo inteligente de datos**: Las salidas fluyen automáticamente a los bloques conectados
4. **Manejo de errores**: Los bloques fallidos detienen su ruta de ejecución pero no afectan rutas independientes
5. **Persistencia de estado**: Todas las salidas de bloques y detalles de ejecución se conservan para depuración
## Próximos pasos
Ahora que entiendes los conceptos básicos de ejecución, explora:
- **[Tipos de bloques](/blocks)** - Aprende sobre las capacidades específicas de los bloques
- **[Registro](/execution/logging)** - Monitorea ejecuciones de flujos de trabajo y depura problemas
- **[Cálculo de costos](/execution/costs)** - Comprende y optimiza los costos de flujos de trabajo
- **[Disparadores](/triggers)** - Configura diferentes formas de ejecutar tus flujos de trabajo

View File

@@ -1,186 +0,0 @@
---
title: Cálculo de costos
---
import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'
import { Callout } from 'fumadocs-ui/components/callout'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { Image } from '@/components/ui/image'
Sim calcula automáticamente los costos de todas las ejecuciones de flujos de trabajo, proporcionando precios transparentes basados en el uso de modelos de IA y cargos de ejecución. Entender estos costos te ayuda a optimizar los flujos de trabajo y gestionar tu presupuesto de manera efectiva.
## Cómo se calculan los costos
Cada ejecución de flujo de trabajo incluye dos componentes de costo:
**Cargo base por ejecución**: $0.001 por ejecución
**Uso de modelos de IA**: Costo variable basado en el consumo de tokens
```javascript
modelCost = (inputTokens × inputPrice + outputTokens × outputPrice) / 1,000,000
totalCost = baseExecutionCharge + modelCost
```
<Callout type="info">
Los precios de los modelos de IA son por millón de tokens. El cálculo divide por 1.000.000 para obtener el costo real. Los flujos de trabajo sin bloques de IA solo incurren en el cargo base de ejecución.
</Callout>
## Desglose de modelos en los registros
Para flujos de trabajo que utilizan bloques de IA, puedes ver información detallada de costos en los registros:
<div className="flex justify-center">
<Image
src="/static/logs/logs-cost.png"
alt="Desglose de modelos"
width={600}
height={400}
className="my-6"
/>
</div>
El desglose del modelo muestra:
- **Uso de tokens**: Recuentos de tokens de entrada y salida para cada modelo
- **Desglose de costos**: Costos individuales por modelo y operación
- **Distribución de modelos**: Qué modelos se utilizaron y cuántas veces
- **Costo total**: Costo agregado para toda la ejecución del flujo de trabajo
## Opciones de precios
<Tabs items={['Modelos alojados', 'Trae tu propia clave API']}>
<Tab>
**Modelos alojados** - Sim proporciona claves API con un multiplicador de precio de 2,5x:
| Modelo | Precio base (Entrada/Salida) | Precio alojado (Entrada/Salida) |
|-------|---------------------------|----------------------------|
| GPT-4o | $2.50 / $10.00 | $6.25 / $25.00 |
| GPT-4.1 | $2.00 / $8.00 | $5.00 / $20.00 |
| o1 | $15.00 / $60.00 | $37.50 / $150.00 |
| o3 | $2.00 / $8.00 | $5.00 / $20.00 |
| Claude 3.5 Sonnet | $3.00 / $15.00 | $7.50 / $37.50 |
| Claude Opus 4.0 | $15.00 / $75.00 | $37.50 / $187.50 |
*El multiplicador de 2,5x cubre los costos de infraestructura y gestión de API.*
</Tab>
<Tab>
**Tus propias claves API** - Usa cualquier modelo con precio base:
| Proveedor | Modelos | Entrada / Salida |
|----------|---------|----------------|
| Google | Gemini 2.5 | $0.15 / $0.60 |
| Deepseek | V3, R1 | $0.75 / $1.00 |
| xAI | Grok 4, Grok 3 | $5.00 / $25.00 |
| Groq | Llama 4 Scout | $0.40 / $0.60 |
| Cerebras | Llama 3.3 70B | $0.94 / $0.94 |
| Ollama | Modelos locales | Gratis |
*Paga directamente a los proveedores sin recargo*
</Tab>
</Tabs>
<Callout type="warning">
Los precios mostrados reflejan las tarifas a partir del 10 de septiembre de 2025. Consulta la documentación del proveedor para conocer los precios actuales.
</Callout>
## Estrategias de optimización de costos
<Accordions>
<Accordion title="Selección de modelos">
Elige modelos según la complejidad de la tarea. Las tareas simples pueden usar GPT-4.1-nano ($0.10/$0.40) mientras que el razonamiento complejo podría necesitar o1 o Claude Opus.
</Accordion>
<Accordion title="Ingeniería de prompts">
Los prompts bien estructurados y concisos reducen el uso de tokens sin sacrificar la calidad.
</Accordion>
<Accordion title="Modelos locales">
Usa Ollama para tareas no críticas para eliminar por completo los costos de API.
</Accordion>
<Accordion title="Almacenamiento en caché y reutilización">
Almacena resultados frecuentemente utilizados en variables o archivos para evitar llamadas repetidas al modelo de IA.
</Accordion>
<Accordion title="Procesamiento por lotes">
Procesa múltiples elementos en una sola solicitud de IA en lugar de hacer llamadas individuales.
</Accordion>
</Accordions>
## Monitoreo de uso
Monitorea tu uso y facturación en Configuración → Suscripción:
- **Uso actual**: Uso y costos en tiempo real para el período actual
- **Límites de uso**: Límites del plan con indicadores visuales de progreso
- **Detalles de facturación**: Cargos proyectados y compromisos mínimos
- **Gestión del plan**: Opciones de actualización e historial de facturación
### Seguimiento programático del uso
Puedes consultar tu uso actual y límites de forma programática utilizando la API:
**Endpoint:**
```text
GET /api/users/me/usage-limits
```
**Autenticación:**
- Incluye tu clave API en el encabezado `X-API-Key`
**Ejemplo de solicitud:**
```bash
curl -X GET -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" https://sim.ai/api/users/me/usage-limits
```
**Ejemplo de respuesta:**
```json
{
"success": true,
"rateLimit": {
"sync": { "isLimited": false, "limit": 10, "remaining": 10, "resetAt": "2025-09-08T22:51:55.999Z" },
"async": { "isLimited": false, "limit": 50, "remaining": 50, "resetAt": "2025-09-08T22:51:56.155Z" },
"authType": "api"
},
"usage": {
"currentPeriodCost": 12.34,
"limit": 100,
"plan": "pro"
}
}
```
**Campos de respuesta:**
- `currentPeriodCost` refleja el uso en el período de facturación actual
- `limit` se deriva de límites individuales (Gratuito/Pro) o límites de organización agrupados (Equipo/Empresa)
- `plan` es el plan activo de mayor prioridad asociado a tu usuario
## Límites del plan
Los diferentes planes de suscripción tienen diferentes límites de uso:
| Plan | Límite de uso mensual | Límites de tasa (por minuto) |
|------|-------------------|-------------------------|
| **Gratuito** | $10 | 5 síncronos, 10 asíncronos |
| **Pro** | $100 | 10 síncronos, 50 asíncronos |
| **Equipo** | $500 (agrupado) | 50 síncronos, 100 asíncronos |
| **Empresa** | Personalizado | Personalizado |
## Mejores prácticas para la gestión de costos
1. **Monitorear regularmente**: Revisa tu panel de uso frecuentemente para evitar sorpresas
2. **Establecer presupuestos**: Utiliza los límites del plan como guías para tu gasto
3. **Optimizar flujos de trabajo**: Revisa las ejecuciones de alto costo y optimiza los prompts o la selección de modelos
4. **Usar modelos apropiados**: Ajusta la complejidad del modelo a los requisitos de la tarea
5. **Agrupar tareas similares**: Combina múltiples solicitudes cuando sea posible para reducir la sobrecarga
## Próximos pasos
- Revisa tu uso actual en [Configuración → Suscripción](https://sim.ai/settings/subscription)
- Aprende sobre [Registro](/execution/logging) para seguir los detalles de ejecución
- Explora la [API externa](/execution/api) para monitoreo programático de costos
- Consulta las [técnicas de optimización de flujo de trabajo](/blocks) para reducir costos

View File

@@ -1,136 +0,0 @@
---
title: Ejecución
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Card, Cards } from 'fumadocs-ui/components/card'
El motor de ejecución de Sim da vida a tus flujos de trabajo procesando bloques en el orden correcto, gestionando el flujo de datos y manejando errores con elegancia, para que puedas entender exactamente cómo se ejecutan los flujos de trabajo en Sim.
<Callout type="info">
Cada ejecución de flujo de trabajo sigue una ruta determinista basada en tus conexiones de bloques y lógica, asegurando resultados predecibles y confiables.
</Callout>
## Resumen de la documentación
<Cards>
<Card title="Fundamentos de ejecución" href="/execution/basics">
Aprende sobre el flujo de ejecución fundamental, tipos de bloques y cómo fluyen los datos a través de tu
flujo de trabajo
</Card>
<Card title="Registro" href="/execution/logging">
Monitorea las ejecuciones de flujos de trabajo con registro completo y visibilidad en tiempo real
</Card>
<Card title="Cálculo de costos" href="/execution/costs">
Comprende cómo se calculan y optimizan los costos de ejecución de flujos de trabajo
</Card>
<Card title="API externa" href="/execution/api">
Accede a registros de ejecución y configura webhooks programáticamente a través de API REST
</Card>
</Cards>
## Conceptos clave
### Ejecución topológica
Los bloques se ejecutan en orden de dependencia, similar a cómo una hoja de cálculo recalcula celdas. El motor de ejecución determina automáticamente qué bloques pueden ejecutarse basándose en las dependencias completadas.
### Seguimiento de rutas
El motor rastrea activamente las rutas de ejecución a través de tu flujo de trabajo. Los bloques de enrutador y condición actualizan dinámicamente estas rutas, asegurando que solo se ejecuten los bloques relevantes.
### Procesamiento basado en capas
En lugar de ejecutar bloques uno por uno, el motor identifica capas de bloques que pueden ejecutarse en paralelo, optimizando el rendimiento para flujos de trabajo complejos.
### Contexto de ejecución
Cada flujo de trabajo mantiene un contexto enriquecido durante la ejecución que contiene:
- Salidas y estados de bloques
- Rutas de ejecución activas
- Seguimiento de iteraciones de bucle y paralelas
- Variables de entorno
- Decisiones de enrutamiento
## Disparadores de ejecución
Los flujos de trabajo pueden ejecutarse a través de múltiples canales:
- **Manual**: Prueba y depura directamente en el editor
- **Desplegar como API**: Crea un punto de conexión HTTP protegido con claves API
- **Desplegar como Chat**: Crea una interfaz conversacional en un subdominio personalizado
- **Webhooks**: Responde a eventos externos de servicios de terceros
- **Programado**: Ejecuta en un horario recurrente usando expresiones cron
### Desplegar como API
Cuando despliegas un flujo de trabajo como API, Sim:
- Crea un punto de conexión HTTP único: `https://sim.ai/api/workflows/{workflowId}/execute`
- Genera una clave API para autenticación
- Acepta solicitudes POST con cargas útiles JSON
- Devuelve los resultados de ejecución del flujo de trabajo como JSON
Ejemplo de llamada API:
```bash
curl -X POST https://sim.ai/api/workflows/your-workflow-id/execute \
-H "X-API-Key: your-api-key" \
-H "Content-Type: application/json" \
-d '{"input": "your data here"}'
```
### Desplegar como Chat
El despliegue de chat crea una interfaz conversacional para tu flujo de trabajo:
- Alojado en un subdominio personalizado: `https://your-name.sim.ai`
- Autenticación opcional (pública, con contraseña o basada en correo electrónico)
- Interfaz de usuario personalizable con tu marca
- Respuestas en streaming para interacción en tiempo real
- Perfecto para asistentes de IA, bots de soporte o herramientas interactivas
Cada método de despliegue pasa datos al bloque inicial de tu flujo de trabajo, comenzando el flujo de ejecución.
## Ejecución programática
Ejecuta flujos de trabajo desde tus aplicaciones usando nuestros SDK oficiales:
```bash
# TypeScript/JavaScript
npm install simstudio-ts-sdk
# Python
pip install simstudio-sdk
```
```typescript
// TypeScript Example
import { SimStudioClient } from 'simstudio-ts-sdk';
const client = new SimStudioClient({
apiKey: 'your-api-key'
});
const result = await client.executeWorkflow('workflow-id', {
input: { message: 'Hello' }
});
```
## Mejores prácticas
### Diseño para fiabilidad
- Maneja los errores con elegancia mediante rutas de respaldo apropiadas
- Usa variables de entorno para datos sensibles
- Añade registro en bloques de Función para depuración
### Optimiza el rendimiento
- Minimiza las llamadas a API externas cuando sea posible
- Usa ejecución paralela para operaciones independientes
- Almacena en caché los resultados con bloques de Memoria cuando sea apropiado
### Monitorea las ejecuciones
- Revisa los registros regularmente para entender patrones de rendimiento
- Realiza seguimiento de costos para el uso de modelos de IA
- Usa instantáneas de flujo de trabajo para depurar problemas
## ¿Qué sigue?
Comienza con [Conceptos básicos de ejecución](/execution/basics) para entender cómo funcionan los flujos de trabajo, luego explora [Registro](/execution/logging) para monitorear tus ejecuciones y [Cálculo de costos](/execution/costs) para optimizar tu gasto.

View File

@@ -1,150 +0,0 @@
---
title: Registro
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { Image } from '@/components/ui/image'
Sim proporciona un registro completo para todas las ejecuciones de flujos de trabajo, dándote visibilidad total sobre cómo se ejecutan tus flujos de trabajo, qué datos fluyen a través de ellos y dónde podrían ocurrir problemas.
## Sistema de registro
Sim ofrece dos interfaces de registro complementarias para adaptarse a diferentes flujos de trabajo y casos de uso:
### Consola en tiempo real
Durante la ejecución manual o por chat del flujo de trabajo, los registros aparecen en tiempo real en el panel de Consola en el lado derecho del editor de flujo de trabajo:
<div className="flex justify-center">
<Image
src="/static/logs/console.png"
alt="Panel de consola en tiempo real"
width={400}
height={300}
className="my-6"
/>
</div>
La consola muestra:
- Progreso de ejecución de bloques con resaltado del bloque activo
- Resultados en tiempo real a medida que se completan los bloques
- Tiempo de ejecución para cada bloque
- Indicadores de estado de éxito/error
### Página de registros
Todas las ejecuciones de flujos de trabajo, ya sean activadas manualmente, a través de API, Chat, Programación o Webhook, se registran en la página dedicada de Registros:
<div className="flex justify-center">
<Image
src="/static/logs/logs.png"
alt="Página de registros"
width={600}
height={400}
className="my-6"
/>
</div>
La página de Registros proporciona:
- Filtrado completo por rango de tiempo, estado, tipo de activación, carpeta y flujo de trabajo
- Funcionalidad de búsqueda en todos los registros
- Modo en vivo para actualizaciones en tiempo real
- Retención de registros de 7 días (ampliable para una retención más larga)
## Barra lateral de detalles de registro
Al hacer clic en cualquier entrada de registro se abre una vista detallada en la barra lateral:
<div className="flex justify-center">
<Image
src="/static/logs/logs-sidebar.png"
alt="Detalles de la barra lateral de registros"
width={600}
height={400}
className="my-6"
/>
</div>
### Entrada/Salida de bloque
Visualiza el flujo de datos completo para cada bloque con pestañas para cambiar entre:
<Tabs items={['Output', 'Input']}>
<Tab>
**Pestaña de salida** muestra el resultado de la ejecución del bloque:
- Datos estructurados con formato JSON
- Renderizado de Markdown para contenido generado por IA
- Botón de copiar para fácil extracción de datos
</Tab>
<Tab>
**Pestaña de entrada** muestra lo que se pasó al bloque:
- Valores de variables resueltos
- Salidas referenciadas de otros bloques
- Variables de entorno utilizadas
- Las claves API se redactan automáticamente por seguridad
</Tab>
</Tabs>
### Cronología de ejecución
Para los registros a nivel de flujo de trabajo, visualiza métricas detalladas de ejecución:
- Marcas de tiempo de inicio y fin
- Duración total del flujo de trabajo
- Tiempos de ejecución de bloques individuales
- Identificación de cuellos de botella de rendimiento
## Instantáneas del flujo de trabajo
Para cualquier ejecución registrada, haz clic en "Ver instantánea" para ver el estado exacto del flujo de trabajo en el momento de la ejecución:
<div className="flex justify-center">
<Image
src="/static/logs/logs-frozen-canvas.png"
alt="Instantánea del flujo de trabajo"
width={600}
height={400}
className="my-6"
/>
</div>
La instantánea proporciona:
- Lienzo congelado que muestra la estructura del flujo de trabajo
- Estados de los bloques y conexiones tal como estaban durante la ejecución
- Haz clic en cualquier bloque para ver sus entradas y salidas
- Útil para depurar flujos de trabajo que han sido modificados desde entonces
<Callout type="info">
Las instantáneas de flujo de trabajo solo están disponibles para ejecuciones posteriores a la introducción del sistema mejorado de registro. Los registros migrados más antiguos muestran un mensaje de "Estado registrado no encontrado".
</Callout>
## Retención de registros
- **Plan gratuito**: 7 días de retención de registros
- **Plan pro**: 30 días de retención de registros
- **Plan de equipo**: 90 días de retención de registros
- **Plan empresarial**: Períodos de retención personalizados disponibles
## Mejores prácticas
### Para desarrollo
- Utiliza la consola en tiempo real para obtener retroalimentación inmediata durante las pruebas
- Verifica las entradas y salidas de los bloques para comprobar el flujo de datos
- Usa instantáneas del flujo de trabajo para comparar versiones funcionales vs. defectuosas
### Para producción
- Supervisa regularmente la página de registros para detectar errores o problemas de rendimiento
- Configura filtros para centrarte en flujos de trabajo específicos o períodos de tiempo
- Utiliza el modo en vivo durante implementaciones críticas para observar las ejecuciones en tiempo real
### Para depuración
- Siempre verifica la cronología de ejecución para identificar bloques lentos
- Compara las entradas entre ejecuciones exitosas y fallidas
- Utiliza instantáneas del flujo de trabajo para ver el estado exacto cuando ocurrieron los problemas
## Próximos pasos
- Aprende sobre [Cálculo de costos](/execution/costs) para entender los precios de los flujos de trabajo
- Explora la [API externa](/execution/api) para acceso programático a los registros
- Configura [notificaciones por Webhook](/execution/api#webhook-subscriptions) para alertas en tiempo real

View File

@@ -1,193 +0,0 @@
---
title: Primeros pasos
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Card, Cards } from 'fumadocs-ui/components/card'
import { File, Files, Folder } from 'fumadocs-ui/components/files'
import { Step, Steps } from 'fumadocs-ui/components/steps'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import {
AgentIcon,
ApiIcon,
ChartBarIcon,
CodeIcon,
ConditionalIcon,
ConnectIcon,
ExaAIIcon,
FirecrawlIcon,
GmailIcon,
NotionIcon,
PerplexityIcon,
SlackIcon,
} from '@/components/icons'
import { Video } from '@/components/ui/video'
import { Image } from '@/components/ui/image'
Este tutorial te guiará en la creación de tu primer flujo de trabajo de IA en Sim. Crearemos un agente de investigación de personas que puede encontrar información sobre individuos utilizando herramientas de búsqueda LLM de última generación.
<Callout type="info">
Este tutorial dura aproximadamente 10 minutos y cubre los conceptos esenciales para crear flujos de trabajo en Sim.
</Callout>
## Lo que vamos a construir
Un agente de investigación de personas que:
1. Recibe el nombre de una persona a través de la interfaz de chat
2. Utiliza un agente de IA con capacidades avanzadas de búsqueda
3. Busca en la web utilizando herramientas de búsqueda LLM de última generación (Exa y Linkup)
4. Extrae información estructurada utilizando un formato de respuesta
5. Devuelve datos completos sobre la persona
<Image
src="/static/getting-started/started-1.png"
alt="Ejemplo de primeros pasos"
width={800}
height={500}
/>
## Tutorial paso a paso
<Steps>
<Step title="Crear flujo de trabajo y añadir agente de IA">
Abre Sim y haz clic en "Nuevo flujo de trabajo" en el panel de control. Nómbralo "Primeros pasos".
Cuando creas un nuevo flujo de trabajo, automáticamente incluye un **bloque de Inicio** - este es el punto de entrada que recibe la entrada de los usuarios. Para este ejemplo, activaremos el flujo de trabajo a través del chat, así que no necesitamos configurar nada en el bloque de Inicio.
Ahora arrastra un **Bloque de Agente** al lienzo desde el panel de bloques a la izquierda.
Configura el Bloque de Agente:
- **Modelo**: Selecciona "OpenAI GPT-4o"
- **Prompt del sistema**: "Eres un agente de investigación de personas. Cuando te den el nombre de una persona, utiliza tus herramientas de búsqueda disponibles para encontrar información completa sobre ellos, incluyendo su ubicación, profesión, formación académica y otros detalles relevantes".
- **Prompt del usuario**: Arrastra la conexión desde la salida del bloque de Inicio a este campo (esto conecta `<start.input>` al prompt del usuario)
<div className="mx-auto w-full overflow-hidden rounded-lg">
<Video src="getting-started/started-2.mp4" width={700} height={450} />
</div>
</Step>
<Step title="Añadir herramientas al agente">
Vamos a mejorar nuestro agente con herramientas para obtener mejores capacidades. Haz clic en el bloque de Agente para seleccionarlo.
En la sección de **Herramientas**:
- Haz clic en **Añadir herramienta**
- Selecciona **Exa** de las herramientas disponibles
- Selecciona **Linkup** de las herramientas disponibles
- Añade tus claves API para ambas herramientas (esto permite al agente buscar en la web y acceder a información adicional)
<div className="mx-auto w-3/5 overflow-hidden rounded-lg">
<Video src="getting-started/started-3.mp4" width={700} height={450} />
</div>
</Step>
<Step title="Probar el flujo de trabajo básico">
Ahora vamos a probar nuestro flujo de trabajo. Ve al **panel de Chat** en el lado derecho de la pantalla.
En el panel de chat:
- Haz clic en el menú desplegable y selecciona `agent1.content` (esto nos mostrará la salida de nuestro agente)
- Introduce un mensaje de prueba como: "John es un ingeniero de software de San Francisco que estudió Informática en la Universidad de Stanford".
- Haz clic en "Enviar" para ejecutar el flujo de trabajo
Deberías ver la respuesta del agente analizando a la persona descrita en tu texto.
<div className="mx-auto w-full overflow-hidden rounded-lg">
<Video src="getting-started/started-4.mp4" width={700} height={450} />
</div>
</Step>
<Step title="Añadir salida estructurada">
Ahora hagamos que nuestro agente devuelva datos estructurados. Haz clic en el bloque de Agente para seleccionarlo.
En la sección de **Formato de respuesta**:
- Haz clic en el **icono de varita mágica** (✨) junto al campo de esquema
- En el prompt que aparece, escribe: "crear un esquema llamado persona, que contenga ubicación, profesión y educación"
- La IA generará automáticamente un esquema JSON para ti
<div className="mx-auto w-full overflow-hidden rounded-lg">
<Video src="getting-started/started-5.mp4" width={700} height={450} />
</div>
</Step>
<Step title="Probar la salida estructurada">
Vuelve al **panel de Chat**.
Como hemos añadido un formato de respuesta, ahora hay nuevas opciones de salida disponibles:
- Haz clic en el menú desplegable y selecciona la nueva opción de salida estructurada (el esquema que acabamos de crear)
- Introduce un nuevo mensaje de prueba como: "Sarah es una gerente de marketing de Nueva York que tiene un MBA de la Escuela de Negocios de Harvard".
- Haz clic en "Enviar" para ejecutar el flujo de trabajo de nuevo
Ahora deberías ver una salida JSON estructurada con la información de la persona organizada en campos de ubicación, profesión y educación.
<div className="mx-auto w-full overflow-hidden rounded-lg">
<Video src="getting-started/started-6.mp4" width={700} height={450} />
</div>
</Step>
</Steps>
## Lo que acabas de construir
¡Felicidades! Has creado tu primer flujo de trabajo de IA que:
- ✅ Recibe entrada de texto a través de la interfaz de chat
- ✅ Utiliza IA para extraer información de texto no estructurado
- ✅ Integra herramientas externas (Exa y Linkup) para capacidades mejoradas
- ✅ Devuelve datos JSON estructurados utilizando esquemas generados por IA
- ✅ Demuestra pruebas e iteración de flujos de trabajo
- ✅ Muestra el poder de la construcción visual de flujos de trabajo
## Conceptos clave que has aprendido
### Tipos de bloques utilizados
<Files>
<File
name="Bloque de inicio"
icon={<ConnectIcon className="h-4 w-4" />}
annotation="Punto de entrada para la entrada del usuario (incluido automáticamente)"
/>
<File
name="Bloque de agente"
icon={<AgentIcon className="h-4 w-4" />}
annotation="Modelo de IA para procesamiento y análisis de texto"
/>
</Files>
### Conceptos fundamentales del flujo de trabajo
**Flujo de datos**: Las variables fluyen entre bloques arrastrando conexiones
**Interfaz de chat**: Prueba flujos de trabajo en tiempo real usando el panel de chat con diferentes opciones de salida
**Integración de herramientas**: Mejora las capacidades del agente añadiendo herramientas externas como Exa y Linkup
**Referencias de variables**: Accede a las salidas de los bloques usando la sintaxis `<blockName.output>`
**Salida estructurada**: Utiliza esquemas JSON para obtener datos consistentes y estructurados de la IA
**Esquemas generados por IA**: Usa la varita mágica (✨) para generar esquemas con lenguaje natural
**Desarrollo iterativo**: Prueba, modifica y vuelve a probar flujos de trabajo fácilmente
## Próximos pasos
<Cards>
<Card title="Añadir más bloques" href="/blocks">
Aprende sobre bloques de API, Función y Condición
</Card>
<Card title="Usar herramientas" href="/tools">
Integra con servicios externos como Gmail, Slack y Notion
</Card>
<Card title="Añadir lógica personalizada" href="/blocks/function">
Usa bloques de Función para procesamiento personalizado de datos
</Card>
<Card title="Implementar tu flujo de trabajo" href="/execution">
Haz que tu flujo de trabajo sea accesible a través de API REST
</Card>
</Cards>
## ¿Necesitas ayuda?
**¿Atascado en algún paso?** Consulta nuestra [documentación de Bloques](/blocks) para explicaciones detalladas de cada componente.
**¿Quieres ver más ejemplos?** Explora nuestra [documentación de Herramientas](/tools) para ver qué integraciones están disponibles.
**¿Listo para implementar?** Aprende sobre [Ejecución e Implementación](/execution) para activar tus flujos de trabajo.

View File

@@ -1,60 +0,0 @@
---
title: Documentación
---
import { Card, Cards } from 'fumadocs-ui/components/card'
# Documentación de Sim
Bienvenido a Sim, un constructor visual de flujos de trabajo para aplicaciones de IA. Crea potentes agentes de IA, flujos de trabajo de automatización y canales de procesamiento de datos conectando bloques en un lienzo.
## Inicio rápido
<Cards>
<Card title="Introducción" href="/introduction">
Aprende lo que puedes construir con Sim
</Card>
<Card title="Primeros pasos" href="/getting-started">
Crea tu primer flujo de trabajo en 10 minutos
</Card>
<Card title="Bloques de flujo de trabajo" href="/blocks">
Aprende sobre los bloques de construcción
</Card>
<Card title="Herramientas e integraciones" href="/tools">
Explora más de 80 integraciones incorporadas
</Card>
</Cards>
## Conceptos fundamentales
<Cards>
<Card title="Conexiones" href="/connections">
Comprende cómo fluyen los datos entre bloques
</Card>
<Card title="Variables" href="/variables">
Trabaja con variables de flujo de trabajo y de entorno
</Card>
<Card title="Ejecución" href="/execution">
Monitoriza las ejecuciones de flujos de trabajo y gestiona costos
</Card>
<Card title="Disparadores" href="/triggers">
Inicia flujos de trabajo mediante API, webhooks o programaciones
</Card>
</Cards>
## Características avanzadas
<Cards>
<Card title="Gestión de equipos" href="/permissions/roles-and-permissions">
Configura roles y permisos de espacio de trabajo
</Card>
<Card title="Configuración YAML" href="/yaml">
Define flujos de trabajo como código
</Card>
<Card title="Integración MCP" href="/mcp">
Conecta servicios externos con el Protocolo de Contexto de Modelo
</Card>
<Card title="SDKs" href="/sdks">
Integra Sim en tus aplicaciones
</Card>
</Cards>

View File

@@ -1,93 +0,0 @@
---
title: Introducción
---
import { Card, Cards } from 'fumadocs-ui/components/card'
import { Callout } from 'fumadocs-ui/components/callout'
import { Image } from '@/components/ui/image'
Sim es un constructor visual de flujos de trabajo para aplicaciones de IA que te permite crear flujos de trabajo de agentes de IA de forma visual. Crea agentes de IA potentes, flujos de trabajo de automatización y pipelines de procesamiento de datos conectando bloques en un lienzo—sin necesidad de código.
<div className="flex justify-center">
<Image
src="/static/introduction.png"
alt="Lienzo visual de flujos de trabajo de Sim"
width={700}
height={450}
className="my-6"
/>
</div>
## Lo Que Puedes Crear
**Asistentes de IA y Chatbots**
Crea agentes inteligentes que pueden buscar en la web, acceder a tu calendario, enviar correos electrónicos e interactuar con tus herramientas de negocio.
**Automatización de Procesos de Negocio**
Automatiza tareas repetitivas como entrada de datos, generación de informes, respuestas de soporte al cliente y creación de contenido.
**Procesamiento y Análisis de Datos**
Extrae información de documentos, analiza conjuntos de datos, genera informes y sincroniza datos entre sistemas.
**Flujos de Trabajo de Integración de API**
Conecta múltiples servicios en endpoints unificados, orquesta lógica de negocio compleja y maneja automatización basada en eventos.
## Cómo Funciona
**Lienzo Visual**
Arrastra y suelta bloques para crear flujos de trabajo. Conecta modelos de IA, bases de datos, APIs y herramientas de negocio con conexiones simples de apuntar y hacer clic.
**Bloques Inteligentes**
Elige entre bloques de procesamiento (agentes de IA, APIs, funciones), bloques de lógica (condiciones, bucles, enrutadores) y bloques de salida (respuestas, evaluadores).
**Múltiples Disparadores**
Inicia flujos de trabajo a través de interfaz de chat, API REST, webhooks, trabajos programados o eventos externos de servicios como Slack y GitHub.
**Colaboración en Equipo**
Trabaja simultáneamente con miembros del equipo en el mismo flujo de trabajo con edición en tiempo real y gestión de permisos.
## Próximos Pasos
¿Listo para crear tu primer flujo de trabajo de IA?
<Cards>
<Card title="Primeros Pasos" href="/getting-started">
Crea tu primer flujo de trabajo en 10 minutos
</Card>
<Card title="Bloques de Flujo de Trabajo" href="/blocks">
Aprende sobre los bloques de construcción
</Card>
<Card title="Herramientas e Integraciones" href="/tools">
Explora más de 60 integraciones integradas
</Card>
<Card title="Permisos de Equipo" href="/permissions/roles-and-permissions">
Configura roles y permisos del espacio de trabajo
</Card>
</Cards>
¿Necesitas algo personalizado? Usa nuestra [integración MCP](/mcp) para conectar cualquier servicio externo.
## Opciones de implementación
**Alojado en la nube**: Comienza al instante en [sim.ai](https://sim.ai) con infraestructura gestionada, escalado automático y monitorización integrada.
**Autoalojado**: Implementa en tu propia infraestructura usando Docker, con soporte para modelos de IA locales a través de Ollama para una privacidad completa de datos.
## Próximos pasos
¿Listo para construir tu primer flujo de trabajo de IA?
<Cards>
<Card title="Primeros pasos" href="/getting-started">
Crea tu primer flujo de trabajo en 10 minutos
</Card>
<Card title="Bloques de flujo de trabajo" href="/blocks">
Aprende sobre los componentes básicos
</Card>
<Card title="Herramientas e integraciones" href="/tools">
Explora más de 60 integraciones incorporadas
</Card>
<Card title="Permisos de equipo" href="/permissions/roles-and-permissions">
Configura roles y permisos del espacio de trabajo
</Card>
</Cards>

View File

@@ -1,113 +0,0 @@
---
title: Base de conocimientos
---
import { Video } from '@/components/ui/video'
import { Image } from '@/components/ui/image'
La base de conocimientos te permite cargar, procesar y buscar a través de tus documentos con búsqueda vectorial inteligente y fragmentación. Los documentos de varios tipos se procesan, incorporan y hacen buscables automáticamente. Tus documentos se fragmentan de manera inteligente, y puedes verlos, editarlos y buscar a través de ellos utilizando consultas en lenguaje natural.
## Carga y procesamiento
Simplemente carga tus documentos para comenzar. Sim los procesa automáticamente en segundo plano, extrayendo texto, creando incrustaciones y dividiéndolos en fragmentos buscables.
<div className="mx-auto w-full overflow-hidden rounded-lg">
<Video src="knowledgebase-1.mp4" width={700} height={450} />
</div>
El sistema maneja todo el proceso por ti:
1. **Extracción de texto**: El contenido se extrae de tus documentos utilizando analizadores especializados para cada tipo de archivo
2. **Fragmentación inteligente**: Los documentos se dividen en fragmentos significativos con tamaño y superposición configurables
3. **Generación de incrustaciones**: Se crean incrustaciones vectoriales para capacidades de búsqueda semántica
4. **Estado del procesamiento**: Sigue el progreso mientras tus documentos son procesados
## Tipos de archivos compatibles
Sim admite archivos PDF, Word (DOC/DOCX), texto plano (TXT), Markdown (MD), HTML, Excel (XLS/XLSX), PowerPoint (PPT/PPTX) y CSV. Los archivos pueden tener hasta 100MB cada uno, con un rendimiento óptimo para archivos de menos de 50MB. Puedes cargar múltiples documentos simultáneamente, y los archivos PDF incluyen procesamiento OCR para documentos escaneados.
## Visualización y edición de fragmentos
Una vez que tus documentos están procesados, puedes ver y editar los fragmentos individuales. Esto te da control total sobre cómo se organiza y busca tu contenido.
<Image src="/static/knowledgebase/knowledgebase.png" alt="Vista de fragmentos de documentos mostrando contenido procesado" width={800} height={500} />
### Configuración de fragmentos
- **Tamaño predeterminado del fragmento**: 1.024 caracteres
- **Rango configurable**: 100-4.000 caracteres por fragmento
- **Superposición inteligente**: 200 caracteres por defecto para preservar el contexto
- **División jerárquica**: Respeta la estructura del documento (secciones, párrafos, oraciones)
### Capacidades de edición
- **Editar contenido de fragmentos**: Modificar el contenido de texto de fragmentos individuales
- **Ajustar límites de fragmentos**: Fusionar o dividir fragmentos según sea necesario
- **Añadir metadatos**: Mejorar fragmentos con contexto adicional
- **Operaciones masivas**: Gestionar múltiples fragmentos de manera eficiente
## Procesamiento avanzado de PDF
Para documentos PDF, Sim ofrece capacidades de procesamiento mejoradas:
### Soporte OCR
Cuando se configura con Azure o [Mistral OCR](https://docs.mistral.ai/ocr/):
- **Procesamiento de documentos escaneados**: Extraer texto de PDFs basados en imágenes
- **Manejo de contenido mixto**: Procesar PDFs con texto e imágenes
- **Alta precisión**: Modelos avanzados de IA aseguran una extracción precisa del texto
## Uso del bloque de conocimiento en flujos de trabajo
Una vez que tus documentos son procesados, puedes utilizarlos en tus flujos de trabajo de IA a través del bloque de Conocimiento. Esto permite la Generación Aumentada por Recuperación (RAG), permitiendo a tus agentes de IA acceder y razonar sobre el contenido de tus documentos para proporcionar respuestas más precisas y contextuales.
<Image src="/static/knowledgebase/knowledgebase-2.png" alt="Uso del bloque de conocimiento en flujos de trabajo" width={800} height={500} />
### Características del bloque de conocimiento
- **Búsqueda semántica**: Encontrar contenido relevante usando consultas en lenguaje natural
- **Integración de contexto**: Incluir automáticamente fragmentos relevantes en los prompts del agente
- **Recuperación dinámica**: La búsqueda ocurre en tiempo real durante la ejecución del flujo de trabajo
- **Puntuación de relevancia**: Resultados clasificados por similitud semántica
### Opciones de integración
- **Prompts del sistema**: Proporcionar contexto a tus agentes de IA
- **Contexto dinámico**: Buscar e incluir información relevante durante las conversaciones
- **Búsqueda multi-documento**: Consultar a través de toda tu base de conocimiento
- **Búsqueda filtrada**: Combinar con etiquetas para una recuperación precisa de contenido
## Tecnología de búsqueda vectorial
Sim utiliza búsqueda vectorial impulsada por [pgvector](https://github.com/pgvector/pgvector) para entender el significado y contexto de tu contenido:
### Comprensión semántica
- **Búsqueda contextual**: Encuentra contenido relevante incluso cuando las palabras clave exactas no coinciden
- **Recuperación basada en conceptos**: Comprende las relaciones entre ideas
- **Soporte multilingüe**: Funciona en diferentes idiomas
- **Reconocimiento de sinónimos**: Encuentra términos y conceptos relacionados
### Capacidades de búsqueda
- **Consultas en lenguaje natural**: Haz preguntas en español simple
- **Búsqueda por similitud**: Encuentra contenido conceptualmente similar
- **Búsqueda híbrida**: Combina búsqueda vectorial y tradicional por palabras clave
- **Resultados configurables**: Controla el número y umbral de relevancia de los resultados
## Gestión de documentos
### Características de organización
- **Carga masiva**: Sube múltiples archivos a la vez mediante la API asíncrona
- **Estado de procesamiento**: Actualizaciones en tiempo real sobre el procesamiento de documentos
- **Búsqueda y filtrado**: Encuentra documentos rápidamente en grandes colecciones
- **Seguimiento de metadatos**: Captura automática de información de archivos y detalles de procesamiento
### Seguridad y privacidad
- **Almacenamiento seguro**: Documentos almacenados con seguridad de nivel empresarial
- **Control de acceso**: Permisos basados en espacios de trabajo
- **Aislamiento de procesamiento**: Cada espacio de trabajo tiene procesamiento de documentos aislado
- **Retención de datos**: Configura políticas de retención de documentos
## Primeros pasos
1. **Navega a tu base de conocimiento**: Accede desde la barra lateral de tu espacio de trabajo
2. **Sube documentos**: Arrastra y suelta o selecciona archivos para subir
3. **Monitorea el procesamiento**: Observa cómo se procesan y dividen los documentos
4. **Explora fragmentos**: Visualiza y edita el contenido procesado
5. **Añade a flujos de trabajo**: Usa el bloque de Conocimiento para integrarlo con tus agentes de IA
La base de conocimiento transforma tus documentos estáticos en un recurso inteligente y consultable que tus flujos de trabajo de IA pueden aprovechar para obtener respuestas más informadas y contextuales.

View File

@@ -1,108 +0,0 @@
---
title: Etiquetas y filtrado
---
import { Video } from '@/components/ui/video'
Las etiquetas proporcionan una forma poderosa de organizar tus documentos y crear filtros precisos para tus búsquedas vectoriales. Al combinar el filtrado basado en etiquetas con la búsqueda semántica, puedes recuperar exactamente el contenido que necesitas de tu base de conocimientos.
## Añadir etiquetas a documentos
Puedes añadir etiquetas personalizadas a cualquier documento en tu base de conocimientos para organizar y categorizar tu contenido para una recuperación más fácil.
<div className="mx-auto w-full overflow-hidden rounded-lg">
<Video src="knowledgebase-tag.mp4" width={700} height={450} />
</div>
### Gestión de etiquetas
- **Etiquetas personalizadas**: Crea tu propio sistema de etiquetas que se adapte a tu flujo de trabajo
- **Múltiples etiquetas por documento**: Aplica tantas etiquetas como necesites a cada documento, hay 7 espacios para etiquetas disponibles por base de conocimientos que son compartidos por todos los documentos en la base de conocimientos
- **Organización de etiquetas**: Agrupa documentos relacionados con un etiquetado consistente
### Mejores prácticas para etiquetas
- **Nomenclatura consistente**: Usa nombres de etiquetas estandarizados en todos tus documentos
- **Etiquetas descriptivas**: Utiliza nombres de etiquetas claros y significativos
- **Limpieza regular**: Elimina periódicamente las etiquetas no utilizadas u obsoletas
## Uso de etiquetas en bloques de conocimiento
Las etiquetas se vuelven poderosas cuando se combinan con el bloque de Conocimiento en tus flujos de trabajo. Puedes filtrar tus búsquedas a contenido específico etiquetado, asegurando que tus agentes de IA obtengan la información más relevante.
<div className="mx-auto w-full overflow-hidden rounded-lg">
<Video src="knowledgebase-tag2.mp4" width={700} height={450} />
</div>
## Modos de búsqueda
El bloque de Conocimiento admite tres modos diferentes de búsqueda dependiendo de lo que proporciones:
### 1. Búsqueda solo por etiquetas
Cuando **solo proporcionas etiquetas** (sin consulta de búsqueda):
- **Recuperación directa**: Obtiene todos los documentos que tienen las etiquetas especificadas
- **Sin búsqueda vectorial**: Los resultados se basan puramente en la coincidencia de etiquetas
- **Rendimiento rápido**: Recuperación rápida sin procesamiento semántico
- **Coincidencia exacta**: Solo se devuelven documentos con todas las etiquetas especificadas
**Caso de uso**: Cuando necesitas todos los documentos de una categoría o proyecto específico
### 2. Solo búsqueda vectorial
Cuando **solo proporcionas una consulta de búsqueda** (sin etiquetas):
- **Búsqueda semántica**: Encuentra contenido basado en significado y contexto
- **Base de conocimiento completa**: Busca en todos los documentos
- **Clasificación por relevancia**: Resultados ordenados por similitud semántica
- **Lenguaje natural**: Usa preguntas o frases para encontrar contenido relevante
**Caso de uso**: Cuando necesitas el contenido más relevante independientemente de la organización
### 3. Combinación de filtrado por etiquetas + búsqueda vectorial
Cuando **proporcionas tanto etiquetas como una consulta de búsqueda**:
1. **Primero**: Filtra documentos solo a aquellos con las etiquetas especificadas
2. **Luego**: Realiza una búsqueda vectorial dentro de ese subconjunto filtrado
3. **Resultado**: Contenido semánticamente relevante solo de tus documentos etiquetados
**Caso de uso**: Cuando necesitas contenido relevante de una categoría o proyecto específico
### Configuración de búsqueda
#### Filtrado por etiquetas
- **Múltiples etiquetas**: Usa múltiples etiquetas para lógica OR (el documento debe tener una o más de las etiquetas)
- **Combinaciones de etiquetas**: Mezcla diferentes tipos de etiquetas para un filtrado preciso
- **Sensibilidad a mayúsculas**: La coincidencia de etiquetas no distingue entre mayúsculas y minúsculas
- **Coincidencia parcial**: Se requiere coincidencia exacta del nombre de la etiqueta
#### Parámetros de búsqueda vectorial
- **Complejidad de consulta**: Las preguntas en lenguaje natural funcionan mejor
- **Límites de resultados**: Configura cuántos fragmentos recuperar
- **Umbral de relevancia**: Establece puntuaciones mínimas de similitud
- **Ventana de contexto**: Ajusta el tamaño del fragmento para tu caso de uso
## Integración con flujos de trabajo
### Configuración del bloque de conocimiento
1. **Seleccionar base de conocimiento**: Elige qué base de conocimiento buscar
2. **Añadir etiquetas**: Especifica etiquetas de filtrado (opcional)
3. **Introducir consulta**: Añade tu consulta de búsqueda (opcional)
4. **Configurar resultados**: Establece el número de fragmentos a recuperar
5. **Probar búsqueda**: Vista previa de resultados antes de usar en el flujo de trabajo
### Uso dinámico de etiquetas
- **Etiquetas variables**: Usa variables de flujo de trabajo como valores de etiquetas
- **Filtrado condicional**: Aplica diferentes etiquetas según la lógica del flujo de trabajo
- **Búsqueda contextual**: Ajusta las etiquetas según el contexto de la conversación
- **Filtrado en múltiples pasos**: Refina las búsquedas a través de los pasos del flujo de trabajo
### Optimización del rendimiento
- **Filtrado eficiente**: El filtrado por etiquetas ocurre antes de la búsqueda vectorial para un mejor rendimiento
- **Almacenamiento en caché**: Las combinaciones de etiquetas utilizadas con frecuencia se almacenan en caché para mayor velocidad
- **Procesamiento paralelo**: Múltiples búsquedas de etiquetas pueden ejecutarse simultáneamente
- **Gestión de recursos**: Optimización automática de los recursos de búsqueda
## Primeros pasos con etiquetas
1. **Planifica tu estructura de etiquetas**: Decide convenciones de nomenclatura consistentes
2. **Comienza a etiquetar**: Añade etiquetas relevantes a tus documentos existentes
3. **Prueba combinaciones**: Experimenta con combinaciones de etiquetas + consultas de búsqueda
4. **Integra en flujos de trabajo**: Usa el bloque de Conocimiento con tu estrategia de etiquetado
5. **Refina con el tiempo**: Ajusta tu enfoque de etiquetado basándote en los resultados de búsqueda
Las etiquetas transforman tu base de conocimiento de un simple almacén de documentos a un sistema de inteligencia organizado con precisión que tus flujos de trabajo de IA pueden navegar con precisión quirúrgica.

View File

@@ -1,140 +0,0 @@
---
title: MCP (Protocolo de Contexto de Modelo)
---
import { Video } from '@/components/ui/video'
import { Callout } from 'fumadocs-ui/components/callout'
El Protocolo de Contexto de Modelo ([MCP](https://modelcontextprotocol.com/)) te permite conectar herramientas y servicios externos utilizando un protocolo estandarizado, permitiéndote integrar APIs y servicios directamente en tus flujos de trabajo. Con MCP, puedes ampliar las capacidades de Sim añadiendo integraciones personalizadas que funcionan perfectamente con tus agentes y flujos de trabajo.
## ¿Qué es MCP?
MCP es un estándar abierto que permite a los asistentes de IA conectarse de forma segura a fuentes de datos y herramientas externas. Proporciona una forma estandarizada para:
- Conectar a bases de datos, APIs y sistemas de archivos
- Acceder a datos en tiempo real desde servicios externos
- Ejecutar herramientas y scripts personalizados
- Mantener un acceso seguro y controlado a recursos externos
## Añadir servidores MCP
Los servidores MCP proporcionan colecciones de herramientas que tus agentes pueden utilizar. Puedes añadir servidores MCP de dos maneras:
### Desde la configuración del espacio de trabajo
Configura los servidores MCP a nivel de espacio de trabajo para que todos los miembros del equipo puedan utilizarlos:
<div className="mx-auto w-full overflow-hidden rounded-lg">
<Video src="mcp-1.mp4" width={700} height={450} />
</div>
1. Navega a la configuración de tu espacio de trabajo
2. Ve a la sección **Servidores MCP**
3. Haz clic en **Añadir servidor MCP**
4. Introduce los detalles de configuración del servidor
5. Guarda la configuración
<Callout type="info">
Los servidores MCP configurados en la configuración del espacio de trabajo están disponibles para todos los miembros del espacio de trabajo según sus niveles de permisos.
</Callout>
### Desde la configuración del agente
También puedes añadir y configurar servidores MCP directamente desde un bloque de agente:
<div className="mx-auto w-full overflow-hidden rounded-lg">
<Video src="mcp-2.mp4" width={700} height={450} />
</div>
Esto es útil cuando necesitas configurar rápidamente una integración específica para un flujo de trabajo particular.
## Uso de herramientas MCP en agentes
Una vez que los servidores MCP están configurados, sus herramientas quedan disponibles dentro de tus bloques de agente:
<div className="mx-auto w-full overflow-hidden rounded-lg">
<Video src="mcp-3.mp4" width={700} height={450} />
</div>
1. Abre un bloque de **Agente**
2. En la sección de **Herramientas**, verás las herramientas MCP disponibles
3. Selecciona las herramientas que quieres que el agente utilice
4. El agente ahora puede acceder a estas herramientas durante la ejecución
## Bloque de herramienta MCP independiente
Para un control más preciso, puedes usar el bloque dedicado de herramienta MCP para ejecutar herramientas MCP específicas:
<div className="mx-auto w-full overflow-hidden rounded-lg">
<Video src="mcp-4.mp4" width={700} height={450} />
</div>
El bloque de herramienta MCP te permite:
- Ejecutar cualquier herramienta MCP configurada directamente
- Pasar parámetros específicos a la herramienta
- Usar la salida de la herramienta en pasos posteriores del flujo de trabajo
- Encadenar múltiples herramientas MCP
### Cuándo usar herramienta MCP vs agente
**Usa el agente con herramientas MCP cuando:**
- Quieres que la IA decida qué herramientas usar
- Necesitas un razonamiento complejo sobre cuándo y cómo usar las herramientas
- Deseas una interacción en lenguaje natural con las herramientas
**Usa el bloque de herramienta MCP cuando:**
- Necesitas una ejecución determinista de herramientas
- Quieres ejecutar una herramienta específica con parámetros conocidos
- Estás construyendo flujos de trabajo estructurados con pasos predecibles
## Requisitos de permisos
La funcionalidad MCP requiere permisos específicos del espacio de trabajo:
| Acción | Permiso requerido |
|--------|-------------------|
| Configurar servidores MCP en ajustes | **Admin** |
| Usar herramientas MCP en agentes | **Write** o **Admin** |
| Ver herramientas MCP disponibles | **Read**, **Write**, o **Admin** |
| Ejecutar bloques de herramienta MCP | **Write** o **Admin** |
## Casos de uso comunes
### Integración de bases de datos
Conéctate a bases de datos para consultar, insertar o actualizar datos dentro de tus flujos de trabajo.
### Integraciones de API
Accede a APIs externas y servicios web que no tienen integraciones Sim incorporadas.
### Acceso al sistema de archivos
Lee, escribe y manipula archivos en sistemas de archivos locales o remotos.
### Lógica de negocio personalizada
Ejecuta scripts o herramientas personalizadas específicas para las necesidades de tu organización.
### Acceso a datos en tiempo real
Obtén datos en vivo de sistemas externos durante la ejecución del flujo de trabajo.
## Consideraciones de seguridad
- Los servidores MCP se ejecutan con los permisos del usuario que los configuró
- Verifica siempre las fuentes del servidor MCP antes de la instalación
- Utiliza variables de entorno para datos de configuración sensibles
- Revisa las capacidades del servidor MCP antes de conceder acceso a los agentes
## Solución de problemas
### El servidor MCP no aparece
- Verifica que la configuración del servidor sea correcta
- Comprueba que tienes los permisos necesarios
- Asegúrate de que el servidor MCP esté en funcionamiento y sea accesible
### Fallos en la ejecución de herramientas
- Verifica que los parámetros de la herramienta estén correctamente formateados
- Revisa los registros del servidor MCP para ver mensajes de error
- Asegúrate de que la autenticación requerida esté configurada
### Errores de permisos
- Confirma tu nivel de permiso en el espacio de trabajo
- Comprueba si el servidor MCP requiere autenticación adicional
- Verifica que el servidor esté configurado correctamente para tu espacio de trabajo

View File

@@ -1,161 +0,0 @@
---
title: Roles y permisos
---
import { Video } from '@/components/ui/video'
Cuando invitas a miembros del equipo a tu organización o espacio de trabajo, necesitarás elegir qué nivel de acceso otorgarles. Esta guía explica lo que permite hacer cada nivel de permiso, ayudándote a entender los roles del equipo y qué acceso proporciona cada nivel de permiso.
## Cómo invitar a alguien a un espacio de trabajo
<div className="mx-auto w-full overflow-hidden rounded-lg">
<Video src="invitations.mp4" width={700} height={450} />
</div>
## Niveles de permiso del espacio de trabajo
Al invitar a alguien a un espacio de trabajo, puedes asignar uno de tres niveles de permiso:
| Permiso | Lo que pueden hacer |
|------------|------------------|
| **Lectura** | Ver flujos de trabajo, ver resultados de ejecución, pero no pueden realizar ningún cambio |
| **Escritura** | Crear y editar flujos de trabajo, ejecutar flujos de trabajo, gestionar variables de entorno |
| **Administrador** | Todo lo que puede hacer Escritura, además de invitar/eliminar usuarios y gestionar la configuración del espacio de trabajo |
## Lo que puede hacer cada nivel de permiso
Aquí hay un desglose detallado de lo que los usuarios pueden hacer con cada nivel de permiso:
### Permiso de lectura
**Perfecto para:** Interesados, observadores o miembros del equipo que necesitan visibilidad pero no deberían hacer cambios
**Lo que pueden hacer:**
- Ver todos los flujos de trabajo en el espacio de trabajo
- Ver resultados y registros de ejecución de flujos de trabajo
- Explorar configuraciones y ajustes de flujos de trabajo
- Ver variables de entorno (pero no editarlas)
**Lo que no pueden hacer:**
- Crear, editar o eliminar flujos de trabajo
- Ejecutar o implementar flujos de trabajo
- Cambiar cualquier configuración del espacio de trabajo
- Invitar a otros usuarios
### Permiso de escritura
**Perfecto para:** Desarrolladores, creadores de contenido o miembros del equipo que trabajan activamente en automatización
**Lo que pueden hacer:**
- Todo lo que pueden hacer los usuarios de Lectura, además de:
- Crear, editar y eliminar flujos de trabajo
- Ejecutar e implementar flujos de trabajo
- Añadir, editar y eliminar variables de entorno del espacio de trabajo
- Usar todas las herramientas e integraciones disponibles
- Colaborar en tiempo real en la edición de flujos de trabajo
**Lo que no pueden hacer:**
- Invitar o eliminar usuarios del espacio de trabajo
- Cambiar la configuración del espacio de trabajo
- Eliminar el espacio de trabajo
### Permiso de administrador
**Perfecto para:** Líderes de equipo, gerentes de proyecto o líderes técnicos que necesitan gestionar el espacio de trabajo
**Lo que pueden hacer:**
- Todo lo que los usuarios con permiso de escritura pueden hacer, además de:
- Invitar a nuevos usuarios al espacio de trabajo con cualquier nivel de permiso
- Eliminar usuarios del espacio de trabajo
- Gestionar la configuración e integraciones del espacio de trabajo
- Configurar conexiones con herramientas externas
- Eliminar flujos de trabajo creados por otros usuarios
**Lo que no pueden hacer:**
- Eliminar el espacio de trabajo (solo el propietario del espacio de trabajo puede hacer esto)
- Eliminar al propietario del espacio de trabajo
---
## Propietario del espacio de trabajo vs administrador
Cada espacio de trabajo tiene un **Propietario** (la persona que lo creó) además de cualquier número de **Administradores**.
### Propietario del espacio de trabajo
- Tiene todos los permisos de administrador
- Puede eliminar el espacio de trabajo
- No puede ser eliminado del espacio de trabajo
- Puede transferir la propiedad a otro usuario
### Administrador del espacio de trabajo
- Puede hacer todo excepto eliminar el espacio de trabajo o eliminar al propietario
- Puede ser eliminado del espacio de trabajo por el propietario u otros administradores
---
## Escenarios comunes
### Añadir un nuevo desarrollador a tu equipo
1. **Nivel de organización**: Invítalo como **Miembro de la organización**
2. **Nivel de espacio de trabajo**: Dale permiso de **Escritura** para que pueda crear y editar flujos de trabajo
### Añadir un gerente de proyecto
1. **Nivel de organización**: Invítalo como **Miembro de la organización**
2. **Nivel de espacio de trabajo**: Dale permiso de **Administrador** para que pueda gestionar el equipo y ver todo
### Añadir un interesado o cliente
1. **Nivel de organización**: Invítalo como **Miembro de la organización**
2. **Nivel de espacio de trabajo**: Dale permiso de **Lectura** para que pueda ver el progreso pero no hacer cambios
---
## Variables de entorno
Los usuarios pueden crear dos tipos de variables de entorno:
### Variables de entorno personales
- Solo visibles para el usuario individual
- Disponibles en todos los flujos de trabajo que ejecutan
- Gestionadas en la configuración del usuario
### Variables de entorno del espacio de trabajo
- **Permiso de lectura**: Puede ver nombres y valores de variables
- **Permiso de escritura/administración**: Puede añadir, editar y eliminar variables
- Disponibles para todos los miembros del espacio de trabajo
- Si una variable personal tiene el mismo nombre que una variable del espacio de trabajo, la personal tiene prioridad
---
## Mejores prácticas
### Comienza con permisos mínimos
Otorga a los usuarios el nivel de permiso más bajo que necesiten para hacer su trabajo. Siempre puedes aumentar los permisos más tarde.
### Usa la estructura de la organización sabiamente
- Haz que los líderes de equipo de confianza sean **Administradores de la organización**
- La mayoría de los miembros del equipo deberían ser **Miembros de la organización**
- Reserva los permisos de **Administrador** del espacio de trabajo para personas que necesiten gestionar usuarios
### Revisa los permisos regularmente
Revisa periódicamente quién tiene acceso a qué, especialmente cuando los miembros del equipo cambian de roles o dejan la empresa.
### Seguridad de las variables de entorno
- Usa variables de entorno personales para claves API sensibles
- Usa variables de entorno del espacio de trabajo para configuración compartida
- Audita regularmente quién tiene acceso a variables sensibles
---
## Roles de la organización
Al invitar a alguien a tu organización, puedes asignar uno de dos roles:
### Administrador de la organización
**Lo que pueden hacer:**
- Invitar y eliminar miembros del equipo de la organización
- Crear nuevos espacios de trabajo
- Gestionar la facturación y configuración de suscripción
- Acceder a todos los espacios de trabajo dentro de la organización
### Miembro de la organización
**Lo que pueden hacer:**
- Acceder a espacios de trabajo a los que han sido específicamente invitados
- Ver la lista de miembros de la organización
- No pueden invitar a nuevas personas ni gestionar la configuración de la organización

View File

@@ -1,412 +0,0 @@
---
title: Python SDK
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Card, Cards } from 'fumadocs-ui/components/card'
import { Step, Steps } from 'fumadocs-ui/components/steps'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
El SDK oficial de Python para Sim te permite ejecutar flujos de trabajo programáticamente desde tus aplicaciones Python utilizando el SDK oficial de Python.
<Callout type="info">
El SDK de Python es compatible con Python 3.8+ y proporciona ejecución sincrónica de flujos de trabajo. Todas las ejecuciones de flujos de trabajo son actualmente sincrónicas.
</Callout>
## Instalación
Instala el SDK usando pip:
```bash
pip install simstudio-sdk
```
## Inicio rápido
Aquí tienes un ejemplo sencillo para empezar:
```python
from simstudio import SimStudioClient
# Initialize the client
client = SimStudioClient(
api_key="your-api-key-here",
base_url="https://sim.ai" # optional, defaults to https://sim.ai
)
# Execute a workflow
try:
result = client.execute_workflow("workflow-id")
print("Workflow executed successfully:", result)
except Exception as error:
print("Workflow execution failed:", error)
```
## Referencia de la API
### SimStudioClient
#### Constructor
```python
SimStudioClient(api_key: str, base_url: str = "https://sim.ai")
```
**Parámetros:**
- `api_key` (str): Tu clave API de Sim
- `base_url` (str, opcional): URL base para la API de Sim
#### Métodos
##### execute_workflow()
Ejecuta un flujo de trabajo con datos de entrada opcionales.
```python
result = client.execute_workflow(
"workflow-id",
input_data={"message": "Hello, world!"},
timeout=30.0 # 30 seconds
)
```
**Parámetros:**
- `workflow_id` (str): El ID del flujo de trabajo a ejecutar
- `input_data` (dict, opcional): Datos de entrada para pasar al flujo de trabajo
- `timeout` (float, opcional): Tiempo de espera en segundos (predeterminado: 30.0)
**Devuelve:** `WorkflowExecutionResult`
##### get_workflow_status()
Obtiene el estado de un flujo de trabajo (estado de implementación, etc.).
```python
status = client.get_workflow_status("workflow-id")
print("Is deployed:", status.is_deployed)
```
**Parámetros:**
- `workflow_id` (str): El ID del flujo de trabajo
**Devuelve:** `WorkflowStatus`
##### validate_workflow()
Valida que un flujo de trabajo esté listo para su ejecución.
```python
is_ready = client.validate_workflow("workflow-id")
if is_ready:
# Workflow is deployed and ready
pass
```
**Parámetros:**
- `workflow_id` (str): El ID del flujo de trabajo
**Devuelve:** `bool`
##### execute_workflow_sync()
<Callout type="info">
Actualmente, este método es idéntico a `execute_workflow()` ya que todas las ejecuciones son síncronas. Este método se proporciona para compatibilidad futura cuando se añada la ejecución asíncrona.
</Callout>
Ejecuta un flujo de trabajo (actualmente síncrono, igual que `execute_workflow()`).
```python
result = client.execute_workflow_sync(
"workflow-id",
input_data={"data": "some input"},
timeout=60.0
)
```
**Parámetros:**
- `workflow_id` (str): El ID del flujo de trabajo a ejecutar
- `input_data` (dict, opcional): Datos de entrada para pasar al flujo de trabajo
- `timeout` (float): Tiempo de espera para la solicitud inicial en segundos
**Devuelve:** `WorkflowExecutionResult`
##### set_api_key()
Actualiza la clave API.
```python
client.set_api_key("new-api-key")
```
##### set_base_url()
Actualiza la URL base.
```python
client.set_base_url("https://my-custom-domain.com")
```
##### close()
Cierra la sesión HTTP subyacente.
```python
client.close()
```
## Clases de datos
### WorkflowExecutionResult
```python
@dataclass
class WorkflowExecutionResult:
success: bool
output: Optional[Any] = None
error: Optional[str] = None
logs: Optional[List[Any]] = None
metadata: Optional[Dict[str, Any]] = None
trace_spans: Optional[List[Any]] = None
total_duration: Optional[float] = None
```
### WorkflowStatus
```python
@dataclass
class WorkflowStatus:
is_deployed: bool
deployed_at: Optional[str] = None
is_published: bool = False
needs_redeployment: bool = False
```
### SimStudioError
```python
class SimStudioError(Exception):
def __init__(self, message: str, code: Optional[str] = None, status: Optional[int] = None):
super().__init__(message)
self.code = code
self.status = status
```
## Ejemplos
### Ejecución básica de flujo de trabajo
<Steps>
<Step title="Inicializar el cliente">
Configura el SimStudioClient con tu clave API.
</Step>
<Step title="Validar el flujo de trabajo">
Comprueba si el flujo de trabajo está desplegado y listo para su ejecución.
</Step>
<Step title="Ejecutar el flujo de trabajo">
Ejecuta el flujo de trabajo con tus datos de entrada.
</Step>
<Step title="Gestionar el resultado">
Procesa el resultado de la ejecución y maneja cualquier error.
</Step>
</Steps>
```python
import os
from simstudio import SimStudioClient
client = SimStudioClient(api_key=os.getenv("SIMSTUDIO_API_KEY"))
def run_workflow():
try:
# Check if workflow is ready
is_ready = client.validate_workflow("my-workflow-id")
if not is_ready:
raise Exception("Workflow is not deployed or ready")
# Execute the workflow
result = client.execute_workflow(
"my-workflow-id",
input_data={
"message": "Process this data",
"user_id": "12345"
}
)
if result.success:
print("Output:", result.output)
print("Duration:", result.metadata.get("duration") if result.metadata else None)
else:
print("Workflow failed:", result.error)
except Exception as error:
print("Error:", error)
run_workflow()
```
### Manejo de errores
Maneja diferentes tipos de errores que pueden ocurrir durante la ejecución del flujo de trabajo:
```python
from simstudio import SimStudioClient, SimStudioError
import os
client = SimStudioClient(api_key=os.getenv("SIMSTUDIO_API_KEY"))
def execute_with_error_handling():
try:
result = client.execute_workflow("workflow-id")
return result
except SimStudioError as error:
if error.code == "UNAUTHORIZED":
print("Invalid API key")
elif error.code == "TIMEOUT":
print("Workflow execution timed out")
elif error.code == "USAGE_LIMIT_EXCEEDED":
print("Usage limit exceeded")
elif error.code == "INVALID_JSON":
print("Invalid JSON in request body")
else:
print(f"Workflow error: {error}")
raise
except Exception as error:
print(f"Unexpected error: {error}")
raise
```
### Uso del administrador de contexto
Usa el cliente como un administrador de contexto para manejar automáticamente la limpieza de recursos:
```python
from simstudio import SimStudioClient
import os
# Using context manager to automatically close the session
with SimStudioClient(api_key=os.getenv("SIMSTUDIO_API_KEY")) as client:
result = client.execute_workflow("workflow-id")
print("Result:", result)
# Session is automatically closed here
```
### Ejecución por lotes de flujos de trabajo
Ejecuta múltiples flujos de trabajo de manera eficiente:
```python
from simstudio import SimStudioClient
import os
client = SimStudioClient(api_key=os.getenv("SIMSTUDIO_API_KEY"))
def execute_workflows_batch(workflow_data_pairs):
"""Execute multiple workflows with different input data."""
results = []
for workflow_id, input_data in workflow_data_pairs:
try:
# Validate workflow before execution
if not client.validate_workflow(workflow_id):
print(f"Skipping {workflow_id}: not deployed")
continue
result = client.execute_workflow(workflow_id, input_data)
results.append({
"workflow_id": workflow_id,
"success": result.success,
"output": result.output,
"error": result.error
})
except Exception as error:
results.append({
"workflow_id": workflow_id,
"success": False,
"error": str(error)
})
return results
# Example usage
workflows = [
("workflow-1", {"type": "analysis", "data": "sample1"}),
("workflow-2", {"type": "processing", "data": "sample2"}),
]
results = execute_workflows_batch(workflows)
for result in results:
print(f"Workflow {result['workflow_id']}: {'Success' if result['success'] else 'Failed'}")
```
### Configuración del entorno
Configura el cliente usando variables de entorno:
<Tabs items={['Development', 'Production']}>
<Tab value="Development">
```python
import os
from simstudio import SimStudioClient
# Development configuration
client = SimStudioClient(
api_key=os.getenv("SIMSTUDIO_API_KEY"),
base_url=os.getenv("SIMSTUDIO_BASE_URL", "https://sim.ai")
)
```
</Tab>
<Tab value="Production">
```python
import os
from simstudio import SimStudioClient
# Production configuration with error handling
api_key = os.getenv("SIMSTUDIO_API_KEY")
if not api_key:
raise ValueError("SIMSTUDIO_API_KEY environment variable is required")
client = SimStudioClient(
api_key=api_key,
base_url=os.getenv("SIMSTUDIO_BASE_URL", "https://sim.ai")
)
```
</Tab>
</Tabs>
## Obtener tu clave API
<Steps>
<Step title="Inicia sesión en Sim">
Navega a [Sim](https://sim.ai) e inicia sesión en tu cuenta.
</Step>
<Step title="Abre tu flujo de trabajo">
Navega al flujo de trabajo que quieres ejecutar programáticamente.
</Step>
<Step title="Despliega tu flujo de trabajo">
Haz clic en "Deploy" para desplegar tu flujo de trabajo si aún no ha sido desplegado.
</Step>
<Step title="Crea o selecciona una clave API">
Durante el proceso de despliegue, selecciona o crea una clave API.
</Step>
<Step title="Copia la clave API">
Copia la clave API para usarla en tu aplicación Python.
</Step>
</Steps>
<Callout type="warning">
Mantén tu clave API segura y nunca la incluyas en el control de versiones. Utiliza variables de entorno o gestión de configuración segura.
</Callout>
## Requisitos
- Python 3.8+
- requests >= 2.25.0
## Licencia
Apache-2.0

View File

@@ -1,607 +0,0 @@
---
title: TypeScript/JavaScript SDK
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Card, Cards } from 'fumadocs-ui/components/card'
import { Step, Steps } from 'fumadocs-ui/components/steps'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
El SDK oficial de TypeScript/JavaScript para Sim proporciona seguridad de tipos completa y es compatible tanto con entornos Node.js como con navegadores, lo que te permite ejecutar flujos de trabajo de forma programática desde tus aplicaciones Node.js, aplicaciones web y otros entornos JavaScript. Todas las ejecuciones de flujos de trabajo son actualmente síncronas.
<Callout type="info">
El SDK de TypeScript proporciona seguridad de tipos completa y es compatible tanto con entornos Node.js como con navegadores. Todas las ejecuciones de flujos de trabajo son actualmente síncronas.
</Callout>
## Instalación
Instala el SDK usando tu gestor de paquetes preferido:
<Tabs items={['npm', 'yarn', 'bun']}>
<Tab value="npm">
```bash
npm install simstudio-ts-sdk
```
</Tab>
<Tab value="yarn">
```bash
yarn add simstudio-ts-sdk
```
</Tab>
<Tab value="bun">
```bash
bun add simstudio-ts-sdk
```
</Tab>
</Tabs>
## Inicio rápido
Aquí tienes un ejemplo sencillo para empezar:
```typescript
import { SimStudioClient } from 'simstudio-ts-sdk';
// Initialize the client
const client = new SimStudioClient({
apiKey: 'your-api-key-here',
baseUrl: 'https://sim.ai' // optional, defaults to https://sim.ai
});
// Execute a workflow
try {
const result = await client.executeWorkflow('workflow-id');
console.log('Workflow executed successfully:', result);
} catch (error) {
console.error('Workflow execution failed:', error);
}
```
## Referencia de la API
### SimStudioClient
#### Constructor
```typescript
new SimStudioClient(config: SimStudioConfig)
```
**Configuración:**
- `config.apiKey` (string): Tu clave API de Sim
- `config.baseUrl` (string, opcional): URL base para la API de Sim (por defecto es `https://sim.ai`)
#### Métodos
##### executeWorkflow()
Ejecuta un flujo de trabajo con datos de entrada opcionales.
```typescript
const result = await client.executeWorkflow('workflow-id', {
input: { message: 'Hello, world!' },
timeout: 30000 // 30 seconds
});
```
**Parámetros:**
- `workflowId` (string): El ID del flujo de trabajo a ejecutar
- `options` (ExecutionOptions, opcional):
- `input` (any): Datos de entrada para pasar al flujo de trabajo
- `timeout` (number): Tiempo de espera en milisegundos (predeterminado: 30000)
**Devuelve:** `Promise<WorkflowExecutionResult>`
##### getWorkflowStatus()
Obtener el estado de un flujo de trabajo (estado de implementación, etc.).
```typescript
const status = await client.getWorkflowStatus('workflow-id');
console.log('Is deployed:', status.isDeployed);
```
**Parámetros:**
- `workflowId` (string): El ID del flujo de trabajo
**Devuelve:** `Promise<WorkflowStatus>`
##### validateWorkflow()
Validar que un flujo de trabajo está listo para su ejecución.
```typescript
const isReady = await client.validateWorkflow('workflow-id');
if (isReady) {
// Workflow is deployed and ready
}
```
**Parámetros:**
- `workflowId` (string): El ID del flujo de trabajo
**Devuelve:** `Promise<boolean>`
##### executeWorkflowSync()
<Callout type="info">
Actualmente, este método es idéntico a `executeWorkflow()` ya que todas las ejecuciones son síncronas. Este método se proporciona para compatibilidad futura cuando se añada la ejecución asíncrona.
</Callout>
Ejecutar un flujo de trabajo (actualmente síncrono, igual que `executeWorkflow()`).
```typescript
const result = await client.executeWorkflowSync('workflow-id', {
input: { data: 'some input' },
timeout: 60000
});
```
**Parámetros:**
- `workflowId` (string): El ID del flujo de trabajo a ejecutar
- `options` (ExecutionOptions, opcional):
- `input` (any): Datos de entrada para pasar al flujo de trabajo
- `timeout` (number): Tiempo de espera para la solicitud inicial en milisegundos
**Devuelve:** `Promise<WorkflowExecutionResult>`
##### setApiKey()
Actualizar la clave API.
```typescript
client.setApiKey('new-api-key');
```
##### setBaseUrl()
Actualizar la URL base.
```typescript
client.setBaseUrl('https://my-custom-domain.com');
```
## Tipos
### WorkflowExecutionResult
```typescript
interface WorkflowExecutionResult {
success: boolean;
output?: any;
error?: string;
logs?: any[];
metadata?: {
duration?: number;
executionId?: string;
[key: string]: any;
};
traceSpans?: any[];
totalDuration?: number;
}
```
### WorkflowStatus
```typescript
interface WorkflowStatus {
isDeployed: boolean;
deployedAt?: string;
isPublished: boolean;
needsRedeployment: boolean;
}
```
### SimStudioError
```typescript
class SimStudioError extends Error {
code?: string;
status?: number;
}
```
## Ejemplos
### Ejecución básica de flujo de trabajo
<Steps>
<Step title="Inicializar el cliente">
Configura el SimStudioClient con tu clave API.
</Step>
<Step title="Validar el flujo de trabajo">
Comprueba si el flujo de trabajo está implementado y listo para su ejecución.
</Step>
<Step title="Ejecutar el flujo de trabajo">
Ejecuta el flujo de trabajo con tus datos de entrada.
</Step>
<Step title="Gestionar el resultado">
Procesa el resultado de la ejecución y maneja cualquier error.
</Step>
</Steps>
```typescript
import { SimStudioClient } from 'simstudio-ts-sdk';
const client = new SimStudioClient({
apiKey: process.env.SIMSTUDIO_API_KEY!
});
async function runWorkflow() {
try {
// Check if workflow is ready
const isReady = await client.validateWorkflow('my-workflow-id');
if (!isReady) {
throw new Error('Workflow is not deployed or ready');
}
// Execute the workflow
const result = await client.executeWorkflow('my-workflow-id', {
input: {
message: 'Process this data',
userId: '12345'
}
});
if (result.success) {
console.log('Output:', result.output);
console.log('Duration:', result.metadata?.duration);
} else {
console.error('Workflow failed:', result.error);
}
} catch (error) {
console.error('Error:', error);
}
}
runWorkflow();
```
### Manejo de errores
Maneja diferentes tipos de errores que pueden ocurrir durante la ejecución del flujo de trabajo:
```typescript
import { SimStudioClient, SimStudioError } from 'simstudio-ts-sdk';
const client = new SimStudioClient({
apiKey: process.env.SIMSTUDIO_API_KEY!
});
async function executeWithErrorHandling() {
try {
const result = await client.executeWorkflow('workflow-id');
return result;
} catch (error) {
if (error instanceof SimStudioError) {
switch (error.code) {
case 'UNAUTHORIZED':
console.error('Invalid API key');
break;
case 'TIMEOUT':
console.error('Workflow execution timed out');
break;
case 'USAGE_LIMIT_EXCEEDED':
console.error('Usage limit exceeded');
break;
case 'INVALID_JSON':
console.error('Invalid JSON in request body');
break;
default:
console.error('Workflow error:', error.message);
}
} else {
console.error('Unexpected error:', error);
}
throw error;
}
}
```
### Configuración del entorno
Configura el cliente usando variables de entorno:
<Tabs items={['Development', 'Production']}>
<Tab value="Development">
```typescript
import { SimStudioClient } from 'simstudio-ts-sdk';
// Development configuration
const apiKey = process.env.SIMSTUDIO_API_KEY;
if (!apiKey) {
throw new Error('SIMSTUDIO_API_KEY environment variable is required');
}
const client = new SimStudioClient({
apiKey,
baseUrl: process.env.SIMSTUDIO_BASE_URL // optional
});
```
</Tab>
<Tab value="Production">
```typescript
import { SimStudioClient } from 'simstudio-ts-sdk';
// Production configuration with validation
const apiKey = process.env.SIMSTUDIO_API_KEY;
if (!apiKey) {
throw new Error('SIMSTUDIO_API_KEY environment variable is required');
}
const client = new SimStudioClient({
apiKey,
baseUrl: process.env.SIMSTUDIO_BASE_URL || 'https://sim.ai'
});
```
</Tab>
</Tabs>
### Integración con Express de Node.js
Integración con un servidor Express.js:
```typescript
import express from 'express';
import { SimStudioClient } from 'simstudio-ts-sdk';
const app = express();
const client = new SimStudioClient({
apiKey: process.env.SIMSTUDIO_API_KEY!
});
app.use(express.json());
app.post('/execute-workflow', async (req, res) => {
try {
const { workflowId, input } = req.body;
const result = await client.executeWorkflow(workflowId, {
input,
timeout: 60000
});
res.json({
success: true,
data: result
});
} catch (error) {
console.error('Workflow execution error:', error);
res.status(500).json({
success: false,
error: error instanceof Error ? error.message : 'Unknown error'
});
}
});
app.listen(3000, () => {
console.log('Server running on port 3000');
});
```
### Ruta API de Next.js
Uso con rutas API de Next.js:
```typescript
// pages/api/workflow.ts or app/api/workflow/route.ts
import { NextApiRequest, NextApiResponse } from 'next';
import { SimStudioClient } from 'simstudio-ts-sdk';
const client = new SimStudioClient({
apiKey: process.env.SIMSTUDIO_API_KEY!
});
export default async function handler(
req: NextApiRequest,
res: NextApiResponse
) {
if (req.method !== 'POST') {
return res.status(405).json({ error: 'Method not allowed' });
}
try {
const { workflowId, input } = req.body;
const result = await client.executeWorkflow(workflowId, {
input,
timeout: 30000
});
res.status(200).json(result);
} catch (error) {
console.error('Error executing workflow:', error);
res.status(500).json({
error: 'Failed to execute workflow'
});
}
}
```
### Uso del navegador
Uso en el navegador (con la configuración CORS adecuada):
```typescript
import { SimStudioClient } from 'simstudio-ts-sdk';
// Note: In production, use a proxy server to avoid exposing API keys
const client = new SimStudioClient({
apiKey: 'your-public-api-key', // Use with caution in browser
baseUrl: 'https://sim.ai'
});
async function executeClientSideWorkflow() {
try {
const result = await client.executeWorkflow('workflow-id', {
input: {
userInput: 'Hello from browser'
}
});
console.log('Workflow result:', result);
// Update UI with result
document.getElementById('result')!.textContent =
JSON.stringify(result.output, null, 2);
} catch (error) {
console.error('Error:', error);
}
}
// Attach to button click
document.getElementById('executeBtn')?.addEventListener('click', executeClientSideWorkflow);
```
<Callout type="warning">
Cuando uses el SDK en el navegador, ten cuidado de no exponer claves API sensibles. Considera usar un proxy de backend o claves API públicas con permisos limitados.
</Callout>
### Ejemplo de hook de React
Crea un hook personalizado de React para la ejecución del flujo de trabajo:
```typescript
import { useState, useCallback } from 'react';
import { SimStudioClient, WorkflowExecutionResult } from 'simstudio-ts-sdk';
const client = new SimStudioClient({
apiKey: process.env.NEXT_PUBLIC_SIMSTUDIO_API_KEY!
});
interface UseWorkflowResult {
result: WorkflowExecutionResult | null;
loading: boolean;
error: Error | null;
executeWorkflow: (workflowId: string, input?: any) => Promise<void>;
}
export function useWorkflow(): UseWorkflowResult {
const [result, setResult] = useState<WorkflowExecutionResult | null>(null);
const [loading, setLoading] = useState(false);
const [error, setError] = useState<Error | null>(null);
const executeWorkflow = useCallback(async (workflowId: string, input?: any) => {
setLoading(true);
setError(null);
setResult(null);
try {
const workflowResult = await client.executeWorkflow(workflowId, {
input,
timeout: 30000
});
setResult(workflowResult);
} catch (err) {
setError(err instanceof Error ? err : new Error('Unknown error'));
} finally {
setLoading(false);
}
}, []);
return {
result,
loading,
error,
executeWorkflow
};
}
// Usage in component
function WorkflowComponent() {
const { result, loading, error, executeWorkflow } = useWorkflow();
const handleExecute = () => {
executeWorkflow('my-workflow-id', {
message: 'Hello from React!'
});
};
return (
<div>
<button onClick={handleExecute} disabled={loading}>
{loading ? 'Executing...' : 'Execute Workflow'}
</button>
{error && <div>Error: {error.message}</div>}
{result && (
<div>
<h3>Result:</h3>
<pre>{JSON.stringify(result, null, 2)}</pre>
</div>
)}
</div>
);
}
```
## Obtener tu clave API
<Steps>
<Step title="Inicia sesión en Sim">
Navega a [Sim](https://sim.ai) e inicia sesión en tu cuenta.
</Step>
<Step title="Abre tu flujo de trabajo">
Navega al flujo de trabajo que quieres ejecutar programáticamente.
</Step>
<Step title="Despliega tu flujo de trabajo">
Haz clic en "Deploy" para desplegar tu flujo de trabajo si aún no ha sido desplegado.
</Step>
<Step title="Crea o selecciona una clave API">
Durante el proceso de despliegue, selecciona o crea una clave API.
</Step>
<Step title="Copia la clave API">
Copia la clave API para usarla en tu aplicación TypeScript/JavaScript.
</Step>
</Steps>
<Callout type="warning">
Mantén tu clave API segura y nunca la incluyas en el control de versiones. Usa variables de entorno o gestión de configuración segura.
</Callout>
## Requisitos
- Node.js 16+
- TypeScript 5.0+ (para proyectos TypeScript)
## Soporte para TypeScript
El SDK está escrito en TypeScript y proporciona seguridad de tipos completa:
```typescript
import {
SimStudioClient,
WorkflowExecutionResult,
WorkflowStatus,
SimStudioError
} from 'simstudio-ts-sdk';
// Type-safe client initialization
const client: SimStudioClient = new SimStudioClient({
apiKey: process.env.SIMSTUDIO_API_KEY!
});
// Type-safe workflow execution
const result: WorkflowExecutionResult = await client.executeWorkflow('workflow-id', {
input: {
message: 'Hello, TypeScript!'
}
});
// Type-safe status checking
const status: WorkflowStatus = await client.getWorkflowStatus('workflow-id');
```
## Licencia
Apache-2.0

View File

@@ -1,161 +0,0 @@
---
title: Airtable
description: Lee, crea y actualiza Airtable
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="airtable"
color="#E0E0E0"
icon={true}
iconSvg={`<svg className="block-icon"
viewBox='0 -20.5 256 256'
version='1.1'
xmlns='http://www.w3.org/2000/svg'
xmlnsXlink='http://www.w3.org/1999/xlink'
preserveAspectRatio='xMidYMid'
>
<g>
<path
d='M114.25873,2.70101695 L18.8604023,42.1756384 C13.5552723,44.3711638 13.6102328,51.9065311 18.9486282,54.0225085 L114.746142,92.0117514 C123.163769,95.3498757 132.537419,95.3498757 140.9536,92.0117514 L236.75256,54.0225085 C242.08951,51.9065311 242.145916,44.3711638 236.83934,42.1756384 L141.442459,2.70101695 C132.738459,-0.900338983 122.961284,-0.900338983 114.25873,2.70101695'
fill='#FFBF00'
/>
<path
d='M136.349071,112.756863 L136.349071,207.659101 C136.349071,212.173089 140.900664,215.263892 145.096461,213.600615 L251.844122,172.166219 C254.281184,171.200072 255.879376,168.845451 255.879376,166.224705 L255.879376,71.3224678 C255.879376,66.8084791 251.327783,63.7176768 247.131986,65.3809537 L140.384325,106.815349 C137.94871,107.781496 136.349071,110.136118 136.349071,112.756863'
fill='#26B5F8'
/>
<path
d='M111.422771,117.65355 L79.742409,132.949912 L76.5257763,134.504714 L9.65047684,166.548104 C5.4112904,168.593211 0.000578531073,165.503855 0.000578531073,160.794612 L0.000578531073,71.7210757 C0.000578531073,70.0173017 0.874160452,68.5463864 2.04568588,67.4384994 C2.53454463,66.9481944 3.08848814,66.5446689 3.66412655,66.2250305 C5.26231864,65.2661153 7.54173107,65.0101153 9.47981017,65.7766689 L110.890522,105.957098 C116.045234,108.002206 116.450206,115.225166 111.422771,117.65355'
fill='#ED3049'
/>
<path
d='M111.422771,117.65355 L79.742409,132.949912 L2.04568588,67.4384994 C2.53454463,66.9481944 3.08848814,66.5446689 3.66412655,66.2250305 C5.26231864,65.2661153 7.54173107,65.0101153 9.47981017,65.7766689 L110.890522,105.957098 C116.045234,108.002206 116.450206,115.225166 111.422771,117.65355'
fillOpacity='0.25'
fill='#000000'
/>
</g>
</svg>`}
/>
{/* MANUAL-CONTENT-START:intro */}
[Airtable](https://airtable.com/) es una potente plataforma basada en la nube que combina la funcionalidad de una base de datos con la simplicidad de una hoja de cálculo. Permite a los usuarios crear bases de datos flexibles para organizar, almacenar y colaborar con información.
Con Airtable, puedes:
- **Crear bases de datos personalizadas**: Construye soluciones a medida para gestión de proyectos, calendarios de contenido, seguimiento de inventario y más
- **Visualizar datos**: Ve tu información como una cuadrícula, tablero kanban, calendario o galería
- **Automatizar flujos de trabajo**: Configura disparadores y acciones para automatizar tareas repetitivas
- **Integrar con otras herramientas**: Conéctate con cientos de otras aplicaciones a través de integraciones nativas y APIs
En Sim, la integración de Airtable permite a tus agentes interactuar con tus bases de Airtable de forma programática. Esto permite operaciones de datos fluidas como recuperar información, crear nuevos registros y actualizar datos existentes, todo dentro de los flujos de trabajo de tu agente. Utiliza Airtable como una fuente o destino de datos dinámico para tus agentes, permitiéndoles acceder y manipular información estructurada como parte de sus procesos de toma de decisiones y ejecución de tareas.
{/* MANUAL-CONTENT-END */}
## Instrucciones de uso
Integra la funcionalidad de Airtable para gestionar registros de tablas. Listar, obtener, crear,
## Herramientas
### `airtable_list_records`
Leer registros de una tabla de Airtable
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | ----------- | ----------- |
| `baseId` | string | Sí | ID de la base de Airtable |
| `tableId` | string | Sí | ID de la tabla |
| `maxRecords` | number | No | Número máximo de registros a devolver |
| `filterFormula` | string | No | Fórmula para filtrar registros \(p. ej., "\(\{Nombre del campo\} = \'Valor\'\)"\) |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `records` | json | Array de registros de Airtable recuperados |
### `airtable_get_record`
Recuperar un solo registro de una tabla de Airtable por su ID
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | ----------- | ----------- |
| `baseId` | string | Sí | ID de la base de Airtable |
| `tableId` | string | Sí | ID o nombre de la tabla |
| `recordId` | string | Sí | ID del registro a recuperar |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `record` | json | Registro de Airtable recuperado con id, createdTime y campos |
| `metadata` | json | Metadatos de la operación incluyendo el recuento de registros |
### `airtable_create_records`
Escribir nuevos registros en una tabla de Airtable
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `baseId` | string | Sí | ID de la base de Airtable |
| `tableId` | string | Sí | ID o nombre de la tabla |
| `records` | json | Sí | Array de registros para crear, cada uno con un objeto `fields` |
| `fields` | string | No | Sin descripción |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `records` | json | Array de registros de Airtable creados |
### `airtable_update_record`
Actualizar un registro existente en una tabla de Airtable por ID
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `baseId` | string | Sí | ID de la base de Airtable |
| `tableId` | string | Sí | ID o nombre de la tabla |
| `recordId` | string | Sí | ID del registro a actualizar |
| `fields` | json | Sí | Un objeto que contiene los nombres de los campos y sus nuevos valores |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `record` | json | Registro de Airtable actualizado con id, createdTime y campos |
| `metadata` | json | Metadatos de la operación incluyendo el recuento de registros y los nombres de campos actualizados |
### `airtable_update_multiple_records`
Actualizar múltiples registros existentes en una tabla de Airtable
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `baseId` | string | Sí | ID de la base de Airtable |
| `tableId` | string | Sí | ID o nombre de la tabla |
| `records` | json | Sí | Array de registros para actualizar, cada uno con un `id` y un objeto `fields` |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `records` | json | Array de registros de Airtable actualizados |
## Notas
- Categoría: `tools`
- Tipo: `airtable`

View File

@@ -1,109 +0,0 @@
---
title: ArXiv
description: Busca y recupera artículos académicos de ArXiv
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="arxiv"
color="#E0E0E0"
icon={true}
iconSvg={`<svg className="block-icon" id='logomark' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 17.732 24.269'>
<g id='tiny'>
<path
d='M573.549,280.916l2.266,2.738,6.674-7.84c.353-.47.52-.717.353-1.117a1.218,1.218,0,0,0-1.061-.748h0a.953.953,0,0,0-.712.262Z'
transform='translate(-566.984 -271.548)'
fill='#bdb9b4'
/>
<path
d='M579.525,282.225l-10.606-10.174a1.413,1.413,0,0,0-.834-.5,1.09,1.09,0,0,0-1.027.66c-.167.4-.047.681.319,1.206l8.44,10.242h0l-6.282,7.716a1.336,1.336,0,0,0-.323,1.3,1.114,1.114,0,0,0,1.04.69A.992.992,0,0,0,571,293l8.519-7.92A1.924,1.924,0,0,0,579.525,282.225Z'
transform='translate(-566.984 -271.548)'
fill='#b31b1b'
/>
<path
d='M584.32,293.912l-8.525-10.275,0,0L573.53,280.9l-1.389,1.254a2.063,2.063,0,0,0,0,2.965l10.812,10.419a.925.925,0,0,0,.742.282,1.039,1.039,0,0,0,.953-.667A1.261,1.261,0,0,0,584.32,293.912Z'
transform='translate(-566.984 -271.548)'
fill='#bdb9b4'
/>
</g>
</svg>`}
/>
{/* MANUAL-CONTENT-START:intro */}
[ArXiv](https://arxiv.org/) es un repositorio gratuito de acceso abierto de artículos científicos en campos como física, matemáticas, informática, biología cuantitativa, finanzas cuantitativas, estadística, ingeniería eléctrica, ciencias de sistemas y economía. ArXiv proporciona una amplia colección de preprints y artículos publicados, convirtiéndolo en un recurso primario para investigadores y profesionales de todo el mundo.
Con ArXiv, puedes:
- **Buscar artículos académicos**: Encuentra investigaciones por palabras clave, nombres de autores, títulos, categorías y más
- **Recuperar metadatos de artículos**: Accede a resúmenes, listas de autores, fechas de publicación y otra información bibliográfica
- **Descargar PDFs completos**: Obtén el texto completo de la mayoría de los artículos para un estudio en profundidad
- **Explorar contribuciones de autores**: Visualiza todos los artículos de un autor específico
- **Mantenerte actualizado**: Descubre las últimas publicaciones y temas tendencia en tu campo
En Sim, la integración con ArXiv permite a tus agentes buscar, recuperar y analizar artículos científicos de ArXiv de forma programática. Esto te permite automatizar revisiones de literatura, crear asistentes de investigación o incorporar conocimiento científico actualizado en tus flujos de trabajo con agentes. Utiliza ArXiv como una fuente dinámica de datos para investigación, descubrimiento y extracción de conocimiento dentro de tus proyectos de Sim.
{/* MANUAL-CONTENT-END */}
## Instrucciones de uso
Busca artículos académicos, recupera metadatos, descarga artículos y accede a la amplia colección de investigación científica en ArXiv.
## Herramientas
### `arxiv_search`
Busca artículos académicos en ArXiv por palabras clave, autores, títulos u otros campos.
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | ----------- | ----------- |
| `searchQuery` | string | Sí | La consulta de búsqueda a ejecutar |
| `searchField` | string | No | Campo en el que buscar: all (todos), ti (título), au (autor), abs (resumen), co (comentario), jr (revista), cat (categoría), rn (número de informe) |
| `maxResults` | number | No | Número máximo de resultados a devolver (predeterminado: 10, máximo: 2000) |
| `sortBy` | string | No | Ordenar por: relevance (relevancia), lastUpdatedDate (fecha de última actualización), submittedDate (fecha de envío) (predeterminado: relevance) |
| `sortOrder` | string | No | Orden de clasificación: ascending (ascendente), descending (descendente) (predeterminado: descending) |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `papers` | json | Array de artículos que coinciden con la consulta de búsqueda |
### `arxiv_get_paper`
Obtén información detallada sobre un artículo específico de ArXiv mediante su ID.
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | ----------- | ----------- |
| `paperId` | string | Sí | ID del artículo de ArXiv (p. ej., "1706.03762") |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `paper` | json | Información detallada sobre el artículo de ArXiv solicitado |
### `arxiv_get_author_papers`
Busca artículos de un autor específico en ArXiv.
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | ----------- | ----------- |
| `authorName` | string | Sí | Nombre del autor a buscar |
| `maxResults` | number | No | Número máximo de resultados a devolver (predeterminado: 10, máximo: 2000) |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `authorPapers` | json | Array de artículos escritos por el autor especificado |
## Notas
- Categoría: `tools`
- Tipo: `arxiv`

View File

@@ -1,90 +0,0 @@
---
title: Uso del navegador
description: Ejecutar tareas de automatización del navegador
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="browser_use"
color="#E0E0E0"
icon={true}
iconSvg={`<svg className="block-icon"
version='1.0'
xmlns='http://www.w3.org/2000/svg'
viewBox='0 0 150 150'
preserveAspectRatio='xMidYMid meet'
>
<g transform='translate(0,150) scale(0.05,-0.05)' fill='#000000' stroke='none'>
<path
d='M786 2713 c-184 -61 -353 -217 -439 -405 -76 -165 -65 -539 19 -666
l57 -85 -48 -124 c-203 -517 -79 -930 346 -1155 159 -85 441 -71 585 28 l111
77 196 -76 c763 -293 1353 304 1051 1063 -77 191 -77 189 -14 282 163 239 97
660 -140 893 -235 231 -528 256 -975 83 l-96 -37 -121 67 c-144 79 -383 103
-532 55z m459 -235 c88 -23 96 -51 22 -79 -29 -11 -84 -47 -121 -80 -57 -50
-84 -59 -178 -59 -147 0 -190 -44 -238 -241 -102 -424 -230 -440 -230 -29 1
417 289 606 745 488z m1046 -18 c174 -85 266 -309 239 -582 -26 -256 -165
-165 -230 151 -73 356 -469 332 -954 -58 -587 -472 -829 -1251 -388 -1251 108
0 126 -7 214 -80 54 -44 104 -80 113 -80 54 0 -2 -43 -89 -69 -220 -66 -426
-22 -568 120 -599 599 871 2232 1663 1849z m-234 -510 c969 -1036 357 -1962
-787 -1190 -254 171 -348 303 -323 454 21 128 40 123 231 -59 691 -658 1362
-583 1052 117 -106 239 -366 585 -504 671 l-72 44 98 45 c150 68 169 63 305
-82z m-329 -310 c161 -184 163 -160 -30 -338 -188 -173 -180 -173 -386 19
-163 153 -163 157 7 324 218 213 219 213 409 -5z m354 -375 c92 -239 -179
-462 -377 -309 l-46 35 186 163 c211 186 209 185 237 111z'
/>
</g>
</svg>`}
/>
{/* MANUAL-CONTENT-START:intro */}
[BrowserUse](https://browser-use.com/) es una potente plataforma de automatización de navegador que te permite crear y ejecutar tareas de navegador de forma programática. Proporciona una manera de automatizar interacciones web mediante instrucciones en lenguaje natural, permitiéndote navegar por sitios web, completar formularios, extraer datos y realizar secuencias complejas de acciones sin escribir código.
Con BrowserUse, puedes:
- **Automatizar interacciones web**: Navegar a sitios web, hacer clic en botones, completar formularios y realizar otras acciones de navegador
- **Extraer datos**: Obtener contenido de sitios web, incluyendo texto, imágenes y datos estructurados
- **Ejecutar flujos de trabajo complejos**: Encadenar múltiples acciones para completar tareas web sofisticadas
- **Monitorear la ejecución de tareas**: Observar la ejecución de tareas de navegador en tiempo real con retroalimentación visual
- **Procesar resultados programáticamente**: Recibir salidas estructuradas de tareas de automatización web
En Sim, la integración de BrowserUse permite a tus agentes interactuar con la web como si fueran usuarios humanos. Esto posibilita escenarios como investigación, recopilación de datos, envío de formularios y pruebas web, todo a través de simples instrucciones en lenguaje natural. Tus agentes pueden recopilar información de sitios web, interactuar con aplicaciones web y realizar acciones que normalmente requerirían navegación manual, ampliando sus capacidades para incluir toda la web como recurso.
{/* MANUAL-CONTENT-END */}
## Instrucciones de uso
Ejecuta tareas de automatización de navegador con BrowserUse para navegar por la web, extraer datos y realizar acciones como si un usuario real estuviera interactuando con el navegador. La tarea se ejecuta de forma asíncrona y el bloque realizará sondeos hasta completarse antes de devolver los resultados.
## Herramientas
### `browser_use_run_task`
Ejecuta una tarea de automatización de navegador usando BrowserUse
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | ----------- | ----------- |
| `task` | string | Sí | Qué debe hacer el agente de navegador |
| `variables` | json | No | Variables opcionales para usar como secretos \(formato: \{key: value\}\) |
| `format` | string | No | Sin descripción |
| `save_browser_data` | boolean | No | Si se deben guardar los datos del navegador |
| `model` | string | No | Modelo LLM a utilizar \(predeterminado: gpt-4o\) |
| `apiKey` | string | Sí | Clave API para la API de BrowserUse |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `id` | string | Identificador de ejecución de tarea |
| `success` | boolean | Estado de finalización de tarea |
| `output` | json | Datos de salida de la tarea |
| `steps` | json | Pasos de ejecución realizados |
## Notas
- Categoría: `tools`
- Tipo: `browser_use`

Some files were not shown because too many files have changed in this diff Show More