Compare commits

...

83 Commits

Author SHA1 Message Date
Waleed
e24f31cbce v0.5.27: sidebar updates, ssrf patches, gpt-5.2, stagehand fixes 2025-12-11 14:45:25 -08:00
Waleed
3b9cbeaa49 fix(tools): updated browser use and stagehand to use the latest models (#2319)
* fix(stagehand): incl stagehand in the standalone build

* fix(stagehand): updated browser use and stagehand to use the latest models
2025-12-11 14:39:25 -08:00
Waleed
c592e54118 fix(pg): for pg tools, use count isntead of length for number of rows impacted (#2317) 2025-12-11 14:03:00 -08:00
Waleed
d02499a915 fix(ollama): fixed messages array for ollama, added gpt-5.2 (#2315)
* fix(ollama): fixed messages array for ollama, added gpt-5.2

* ack PR comments
2025-12-11 13:51:51 -08:00
Siddharth Ganesan
c0bb85479d fix(parallel): variable resolution in collection (#2314)
* Fix var resolution in parallel

* Fix parallel

* Clean logs

* FIx loop error port
2025-12-11 13:51:22 -08:00
Waleed
b595273c3f fix(vuln): fix dns rebinding/ssrf vulnerability (#2316) 2025-12-11 13:42:28 -08:00
Emir Karabeg
193a15aca4 improvement(sidebar): auto-scroll (#2312)
* fix(sidebar): re-render auto-scroll

* improvement: sidebar-scrolling listener
2025-12-11 12:54:14 -08:00
Vikhyath Mondreti
39d5d797ec fix(workflow-changes): changes detected in autolayout (#2313) 2025-12-11 12:45:48 -08:00
Waleed
3fbd57caf1 v0.5.26: tool fixes, templates and knowledgebase fixes, deployment versions in logs 2025-12-11 00:52:13 -08:00
Waleed
3db8f82449 feat(deployment-version): capture deployment version in log (#2304)
* feat(deployment-version): capture deployment version in log

* improvement: terminal store, logs version, toolbar

---------

Co-authored-by: Emir Karabeg <emirkarabeg@berkeley.edu>
2025-12-11 00:34:08 -08:00
Waleed
207a14970b fix(dbs): remove harness from validation on user-provided db creds (#2308) 2025-12-11 00:25:48 -08:00
Waleed
0997989f36 fix(x): fix x optional tool params (#2307)
* fix(x): fix x optional tool params

* ack pr comments
2025-12-11 00:09:35 -08:00
Waleed
7fd912d8a9 fix(stagehand): upgraded stagehand sdk to remove deps incomptaible with bun runtime (#2305)
* fix(stagehand): upgraded stagehand sdk to remove deps incomptaible with bun runtime

* ack PR comments
2025-12-10 23:42:33 -08:00
Siddharth Ganesan
c550e4591c fix(condition): fix condition block for no outgoing edge (#2306)
* Fix condition block evaluation

* Lint
2025-12-10 23:24:27 -08:00
Emir Karabeg
a881dc1877 feat(sidebar): scroll to workflow/folder (#2302)
* feat(sidebar): scroll to workflow/folder

* improvement: sidebar scrolling optimizations
2025-12-10 22:08:10 -08:00
Waleed
da36c453b5 feat(i18n): update translations (#2303)
Co-authored-by: waleedlatif1 <waleedlatif1@users.noreply.github.com>
2025-12-10 22:07:18 -08:00
Waleed
635823664c fix(tools): fix perplexity & parallel ai tag dropdown inaccuracies (#2300)
* fix(tools): fix perplexity & parallel ai tag dropdown inaccuracies

* fixed stt, tts and added output conditions to conditionally display tag dropdown values based on other subblock values

* updated exa to match latest API
2025-12-10 21:46:31 -08:00
Waleed
14846ab05c feat(i18n): update translations (#2299)
Co-authored-by: waleedlatif1 <waleedlatif1@users.noreply.github.com>
2025-12-10 21:16:32 -08:00
Waleed
6c99c841f4 fix(tools): fixed zendesk tools, kb upload failure for md files, stronger typing (#2297)
* fix(tools): fixed zendesk tools, kb upload failure for md files, stronger typing

* ack PR comments
2025-12-10 20:42:16 -08:00
Waleed
37d7902fcd fix(dashboard): prevent dashboard from getting unmounted when on the logs page (#2298) 2025-12-10 20:41:26 -08:00
Emir Karabeg
1e563b1e0a fix(ui/ux): templates and knowledge pages (#2296) 2025-12-10 19:56:23 -08:00
Vikhyath Mondreti
b5da61377c v0.5.25: minor ui improvements, copilot billing fix 2025-12-10 18:32:27 -08:00
Vikhyath Mondreti
1d62ece915 fix(billing): copilot should directly deduct credit balance (#2294) 2025-12-10 18:25:36 -08:00
Emir Karabeg
bbab2ff732 improvement(ui/ux): small styling improvements (#2293)
* improvement: action-bar duplicate, copilot header name truncating, dashboard table scrolling

* improvement: workflow block handle positioning

* improvement: copilot notification fix message

* improvement: dashboard layout, popover hovering

* fix: filtering table into row, workflow name truncating
2025-12-10 17:20:59 -08:00
Waleed
18b7032494 v0.5.24: agent tool and UX improvements, redis service overhaul (#2291)
* feat(folders): add the ability to create a folder within a folder in popover (#2287)

* fix(agent): filter out empty params to ensure LLM can set tool params at runtime (#2288)

* fix(mcp): added backfill effect to add missing descriptions for mcp tools (#2290)

* fix(redis): cleanup access pattern across callsites (#2289)

* fix(redis): cleanup access pattern across callsites

* swap redis command to be non blocking

* improvement(log-details): polling, trace spans (#2292)

---------

Co-authored-by: Vikhyath Mondreti <vikhyathvikku@gmail.com>
Co-authored-by: Emir Karabeg <78010029+emir-karabeg@users.noreply.github.com>
2025-12-10 13:09:21 -08:00
Emir Karabeg
76bc2fae83 improvement(log-details): polling, trace spans (#2292) 2025-12-10 13:08:24 -08:00
Vikhyath Mondreti
1cfe229056 fix(redis): cleanup access pattern across callsites (#2289)
* fix(redis): cleanup access pattern across callsites

* swap redis command to be non blocking
2025-12-10 12:37:33 -08:00
Waleed
6791d968b8 fix(mcp): added backfill effect to add missing descriptions for mcp tools (#2290) 2025-12-10 11:57:18 -08:00
Waleed
163db5cf50 fix(agent): filter out empty params to ensure LLM can set tool params at runtime (#2288) 2025-12-10 11:38:54 -08:00
Waleed
bbbb13af7e feat(folders): add the ability to create a folder within a folder in popover (#2287) 2025-12-10 11:19:57 -08:00
Waleed
b7bbef8620 v0.5.23: kb, logs, general ui improvements, token bucket rate limits, docs, mcp, autolayout improvements (#2286)
* fix(mcp): prevent redundant MCP server discovery calls at runtime, use cached tool schema instead (#2273)

* fix(mcp): prevent redundant MCP server discovery calls at runtime, use cached tool schema instead

* added backfill, added loading state for tools in settings > mcp

* fix tool inp

* feat(rate-limiter): token bucket algorithm  (#2270)

* fix(ratelimit): make deployed chat rate limited

* improvement(rate-limiter): use token bucket algo

* update docs

* fix

* fix type

* fix db rate limiter

* address greptile comments

* feat(i18n): update translations (#2275)

Co-authored-by: icecrasher321 <icecrasher321@users.noreply.github.com>

* fix(tools): updated kalshi and polymarket tools to accurately reflect outputs (#2274)

* feat(i18n): update translations (#2276)

Co-authored-by: waleedlatif1 <waleedlatif1@users.noreply.github.com>

* fix(autolayout): align by handle (#2277)

* fix(autolayout): align by handle

* use shared constants everywhere

* cleanup

* fix(copilot): fix custom tools (#2278)

* Fix title custom tool

* Checkpoitn (broken)

* Fix custom tool flash

* Edit workflow returns null fix

* Works

* Fix lint

* fix(ime): prevent form submission during IME composition steps (#2279)

* fix(ui): prevent form submission during IME composition steps

* chore(gitignore): add IntelliJ IDE files to .gitignore

---------

Co-authored-by: Vikhyath Mondreti <vikhyathvikku@gmail.com>
Co-authored-by: Waleed <walif6@gmail.com>
Co-authored-by: waleedlatif1 <waleedlatif1@users.noreply.github.com>

* feat(ui): logs, kb, emcn (#2207)

* feat(kb): emcn alignment; sidebar: popover primary; settings-modal: expand

* feat: EMCN breadcrumb; improvement(KB): UI

* fix: hydration error

* improvement(KB): UI

* feat: emcn modal sizing, KB tags; refactor: deleted old sidebar

* feat(logs): UI

* fix: add documents modal name

* feat: logs, emcn, cursorrules; refactor: logs

* feat: dashboard

* feat: notifications; improvement: logs details

* fixed random rectangle on canvas

* fixed the name of the file to align

* fix build

---------

Co-authored-by: waleed <walif6@gmail.com>

* fix(creds): glitch allowing multiple credentials in an integration (#2282)

* improvement: custom tools modal, logs-details (#2283)

* fix(docs): fix copy page button and header hook (#2284)

* improvement(chat): add the ability to download files from the deployed chat (#2280)

* added teams download and chat download file

* Removed comments

* removed comments

* component structure and download all

* removed comments

* cleanup code

* fix empty files case

* small fix

* fix(container): resize heuristic improvement (#2285)

* estimate block height for resize based on subblocks

* fix hydration error

* make more conservative

---------

Co-authored-by: Vikhyath Mondreti <vikhyathvikku@gmail.com>
Co-authored-by: icecrasher321 <icecrasher321@users.noreply.github.com>
Co-authored-by: waleedlatif1 <waleedlatif1@users.noreply.github.com>
Co-authored-by: Siddharth Ganesan <33737564+Sg312@users.noreply.github.com>
Co-authored-by: mosa <mosaxiv@gmail.com>
Co-authored-by: Emir Karabeg <78010029+emir-karabeg@users.noreply.github.com>
Co-authored-by: Adam Gough <77861281+aadamgough@users.noreply.github.com>
2025-12-10 00:57:58 -08:00
Vikhyath Mondreti
6fd4087a79 fix(container): resize heuristic improvement (#2285)
* estimate block height for resize based on subblocks

* fix hydration error

* make more conservative
2025-12-10 00:20:03 -08:00
Adam Gough
cb6e763714 improvement(chat): add the ability to download files from the deployed chat (#2280)
* added teams download and chat download file

* Removed comments

* removed comments

* component structure and download all

* removed comments

* cleanup code

* fix empty files case

* small fix
2025-12-09 22:08:03 -08:00
Waleed
d06b360b1d fix(docs): fix copy page button and header hook (#2284) 2025-12-09 21:58:54 -08:00
Emir Karabeg
0713580862 improvement: custom tools modal, logs-details (#2283) 2025-12-09 21:50:09 -08:00
Vikhyath Mondreti
f421f27d3f fix(creds): glitch allowing multiple credentials in an integration (#2282) 2025-12-09 21:07:14 -08:00
Emir Karabeg
0083c89fa5 feat(ui): logs, kb, emcn (#2207)
* feat(kb): emcn alignment; sidebar: popover primary; settings-modal: expand

* feat: EMCN breadcrumb; improvement(KB): UI

* fix: hydration error

* improvement(KB): UI

* feat: emcn modal sizing, KB tags; refactor: deleted old sidebar

* feat(logs): UI

* fix: add documents modal name

* feat: logs, emcn, cursorrules; refactor: logs

* feat: dashboard

* feat: notifications; improvement: logs details

* fixed random rectangle on canvas

* fixed the name of the file to align

* fix build

---------

Co-authored-by: waleed <walif6@gmail.com>
2025-12-09 20:50:28 -08:00
mosa
3cec449402 fix(ime): prevent form submission during IME composition steps (#2279)
* fix(ui): prevent form submission during IME composition steps

* chore(gitignore): add IntelliJ IDE files to .gitignore

---------

Co-authored-by: Vikhyath Mondreti <vikhyathvikku@gmail.com>
Co-authored-by: Waleed <walif6@gmail.com>
Co-authored-by: waleedlatif1 <waleedlatif1@users.noreply.github.com>
2025-12-09 19:58:33 -08:00
Siddharth Ganesan
c5b3fcb181 fix(copilot): fix custom tools (#2278)
* Fix title custom tool

* Checkpoitn (broken)

* Fix custom tool flash

* Edit workflow returns null fix

* Works

* Fix lint
2025-12-09 17:42:17 -08:00
Vikhyath Mondreti
dd7db6e144 fix(autolayout): align by handle (#2277)
* fix(autolayout): align by handle

* use shared constants everywhere

* cleanup
2025-12-09 16:28:25 -08:00
Waleed
306043eedb feat(i18n): update translations (#2276)
Co-authored-by: waleedlatif1 <waleedlatif1@users.noreply.github.com>
2025-12-09 16:20:43 -08:00
Waleed
569598b39e fix(tools): updated kalshi and polymarket tools to accurately reflect outputs (#2274) 2025-12-09 15:35:36 -08:00
Waleed
cc66aa5a3e feat(i18n): update translations (#2275)
Co-authored-by: icecrasher321 <icecrasher321@users.noreply.github.com>
2025-12-09 15:25:03 -08:00
Vikhyath Mondreti
aea32d423f feat(rate-limiter): token bucket algorithm (#2270)
* fix(ratelimit): make deployed chat rate limited

* improvement(rate-limiter): use token bucket algo

* update docs

* fix

* fix type

* fix db rate limiter

* address greptile comments
2025-12-09 14:57:17 -08:00
Waleed
22abf98835 fix(mcp): prevent redundant MCP server discovery calls at runtime, use cached tool schema instead (#2273)
* fix(mcp): prevent redundant MCP server discovery calls at runtime, use cached tool schema instead

* added backfill, added loading state for tools in settings > mcp

* fix tool inp
2025-12-09 12:44:53 -08:00
Waleed
52edbea659 v0.5.22: rss feed trigger, sftp tool, billing fixes, 413 surfacing, copilot improvements 2025-12-09 10:27:36 -08:00
Waleed
aa1d896b38 feat(i18n): update translations (#2268)
Co-authored-by: waleedlatif1 <waleedlatif1@users.noreply.github.com>
2025-12-09 00:46:09 -08:00
Waleed
2fcd07e82d feat(triggers): added rss feed trigger & poller (#2267) 2025-12-08 23:07:07 -08:00
Vikhyath Mondreti
0db5ba1b27 fix(org-limits): remove fallbacks for enterprise plan (#2255)
* fix(org-limits): remove fallbacks for enterprise plan

* remove comment

* remove comments

* make logger use new helper
2025-12-08 21:43:43 -08:00
Waleed
e390ba0491 feat(dropdowns): added searchbox to the operation dropdown for all blocks (#2266) 2025-12-08 20:54:59 -08:00
Vikhyath Mondreti
2f0509adaf fix(nextjs-size-limit): surface 413s accurately (#2265)
* fix(api-call-size-limit): cannot exceed nextjs size limits

* fix

* Convert to buffer

---------

Co-authored-by: Siddharth Ganesan <siddharthganesan@gmail.com>
2025-12-08 20:54:25 -08:00
Waleed
9f0584a818 feat(redis): added redis option for rate limiter, 10x speed improvement in rate limit checks & reduction of DB load (#2263)
* feat(redis): added redis option for rate limiter, 10x speed improvement in rate limit checks & reduction of DB load

* ack PR comments

* improvements
2025-12-08 20:39:29 -08:00
Siddharth Ganesan
6b4d76298f fix(custom-tools, copilot): custom tools state + copilot fixes (#2264)
* Workspace env vars

* Fix execution animation on copilot run

* Custom tools toolg

* Custom tools

* Fix custom tool

* remove extra fallback

* Fix lint
2025-12-08 20:14:49 -08:00
Vikhyath Mondreti
b7a1e8f5cf fix(pre-proc-checks): deployed checks should precede cost/ratelimit increments" (#2250) 2025-12-08 20:04:21 -08:00
Waleed
3ce2788562 feat(i18n): update translations (#2262)
Co-authored-by: waleedlatif1 <waleedlatif1@users.noreply.github.com>
2025-12-08 19:40:42 -08:00
Waleed
17a084cd61 feat(copilot): updated copilot keys to have names, full parity with API keys page (#2260) 2025-12-08 19:28:40 -08:00
Waleed
dafd2f5ce8 feat(tools): added sftp tool to accompany smtp and ssh tools (#2261) 2025-12-08 19:21:10 -08:00
Waleed
5af67d08ba feat(i18n): update translations (#2259)
* feat(i18n): update translations

* fix chinese page

---------

Co-authored-by: waleedlatif1 <waleedlatif1@users.noreply.github.com>
2025-12-08 17:58:49 -08:00
Waleed
209b0f1906 feat(tools): added duckduckgo (#2258) 2025-12-08 17:34:18 -08:00
Waleed
e067b584ee feat(admin): updated admin routes to consolidate duplicate behavior (#2257)
* feat(admin): updated admin routes to consolidate duplicate behavior

* ack PR comments
2025-12-08 17:29:55 -08:00
Waleed
87084edbe6 fix(timeouts): increased timeouts for function execution & agent (#2256) 2025-12-08 16:25:58 -08:00
Vikhyath Mondreti
99e0b81233 improvement(org): remove dead seats get endpoint (#2247)
* improvement(org): remove dead seats get endpoint

* remove more dead code

* remove fallback limit
2025-12-08 15:38:08 -08:00
Vikhyath Mondreti
d480057fd3 fix(migration): migration got removed by force push (#2253) 2025-12-08 14:08:12 -08:00
Vikhyath Mondreti
c197b04bcc fix(migration): migration got removed by force push (#2253) 2025-12-08 14:07:03 -08:00
Waleed
c27c233da0 v0.5.21: google groups, virtualized code viewer, ui, autolayout, docs improvements 2025-12-08 13:10:50 -08:00
Waleed
4fb039f3e8 feat(i18n): update translations (#2249)
Co-authored-by: waleedlatif1 <waleedlatif1@users.noreply.github.com>
2025-12-08 12:44:37 -08:00
Waleed
feb591867e fix(docs): fix salesforce docs & update styling (#2248) 2025-12-08 12:08:53 -08:00
Waleed
598c3bc684 feat(i18n): update translations (#2246)
Co-authored-by: icecrasher321 <icecrasher321@users.noreply.github.com>
2025-12-08 10:45:48 -08:00
Vikhyath Mondreti
01b2f809d1 feat(cursor): add cursor block and tools (#2245)
* fix(autolayout): reduce horizontal spacing in autolayout

* feat(cursor): add cursor cloud agents tools

* address greptile prompt
2025-12-08 09:49:28 -08:00
Waleed
d200f664e8 feat(i18n): update translations (#2244)
Co-authored-by: waleedlatif1 <waleedlatif1@users.noreply.github.com>
2025-12-08 00:26:39 -08:00
Waleed
e2b077f582 fix(conditional): don't error in condition blocks when no conditions are satisfied (#2243)
* fix(conditional): don't error in condition blocks when no conditions are satisfied

* updated docs
2025-12-08 00:15:51 -08:00
Waleed
d09fd6cf92 fix(import): fixed trigger save on export/import flow (#2239)
* fix(import): fixed trigger save on export/import flow

* optimized test runners

* ack PR comments
2025-12-07 23:00:28 -08:00
Vikhyath Mondreti
434d12956e fix(autolayout): reduce horizontal spacing in autolayout (#2240) 2025-12-07 22:36:10 -08:00
Waleed
b49b8eeb9d feat(i18n): update translations (#2238)
Co-authored-by: waleedlatif1 <waleedlatif1@users.noreply.github.com>
2025-12-07 19:43:12 -08:00
Waleed
5b9f3d3d02 feat(docs): added additional self-hosting documentation (#2237)
* feat(docs): added additional self-hosting documentation

* added more
2025-12-07 19:25:44 -08:00
Vikhyath Mondreti
05022e3468 fix(copilot-autolayout): more subflow cases and deal with resizing (#2236)
* fix sidebar hydration issue accurately

* improve autolayout subflow cases

* fix DOM structure to prevent HMR hydration issues
2025-12-07 19:14:18 -08:00
Vikhyath Mondreti
9f884c151c feat(credits): prepurchase credits (#2174)
* add credit balances

* add migrations

* remove handling for disputes

* fix idempotency key

* prep merge into staging

* code cleanup

* add back migration + prevent enterprise from purchasing credits

* remove circular import

* add dispute blocking

* fix lint

* fix: hydration error

* remove migration before merge staging
'

* moved credits addition to invoice payment success

---------

Co-authored-by: Emir Karabeg <emirkarabeg@berkeley.edu>
2025-12-06 19:11:58 -08:00
Adam Gough
92c03b825b improvement(salesforce): fixed refresh and added endpoints (#2177)
* added salesforce other tools

* modified scope and change salesforce refresh

* fixed refresh

* remove dup code
2025-12-06 19:03:25 -08:00
Vikhyath Mondreti
e9d53042f6 fix(inactivity-notif): add cron to helm (#2235) 2025-12-06 18:54:58 -08:00
Waleed
22c9384f19 improvement(code): removed dedicated code-optimized virtualized viewer, baked it into the code component (#2234)
* improvement(code): removed dedicated code-optimized virtualized viewer, baked it into the code component

* ack PR comments
2025-12-06 18:12:51 -08:00
Waleed
6e02a73259 feat(i18n): update translations (#2233)
Co-authored-by: waleedlatif1 <waleedlatif1@users.noreply.github.com>
2025-12-06 17:57:46 -08:00
Adam Gough
683b4476fa fix(google-drive): added support for shared drive (#2232)
* added param for shared drive

* removed comments

---------

Co-authored-by: aadamgough <adam@sim.ai>
2025-12-06 17:37:02 -08:00
Adam Gough
ae7937280e feat(google-groups): added google groups (#2229)
* added google-groups

* added a few more endpoints

* removed comments

* removed named imports, fixed comments

* fixed google groups tool names

---------

Co-authored-by: aadamgough <adam@sim.ai>
Co-authored-by: waleed <walif6@gmail.com>
2025-12-06 17:32:30 -08:00
920 changed files with 79168 additions and 30098 deletions

View File

@@ -0,0 +1,45 @@
---
description: EMCN component library patterns with CVA
globs: ["apps/sim/components/emcn/**"]
---
# EMCN Component Guidelines
## When to Use CVA vs Direct Styles
**Use CVA (class-variance-authority) when:**
- 2+ visual variants (primary, secondary, outline)
- Multiple sizes or state variations
- Example: Button with variants
**Use direct className when:**
- Single consistent style
- No variations needed
- Example: Label with one style
## Patterns
**With CVA:**
```tsx
const buttonVariants = cva('base-classes', {
variants: {
variant: { default: '...', primary: '...' },
size: { sm: '...', md: '...' }
}
})
export { Button, buttonVariants }
```
**Without CVA:**
```tsx
function Label({ className, ...props }) {
return <Primitive className={cn('single-style-classes', className)} {...props} />
}
```
## Rules
- Use Radix UI primitives for accessibility
- Export component and variants (if using CVA)
- TSDoc with usage examples
- Consistent tokens: `font-medium`, `text-[12px]`, `rounded-[4px]`
- Always use `transition-colors` for hover states

20
.cursor/rules/global.mdc Normal file
View File

@@ -0,0 +1,20 @@
---
description: Global coding standards that apply to all files
alwaysApply: true
---
# Global Standards
You are a professional software engineer. All code must follow best practices: accurate, readable, clean, and efficient.
## Logging
Use `logger.info`, `logger.warn`, `logger.error` instead of `console.log`.
## Comments
Use TSDoc for documentation. No `====` separators. No non-TSDoc comments.
## Styling
Never update global styles. Keep all styling local to components.
## Package Manager
Use `bun` and `bunx`, not `npm` and `npx`.

View File

@@ -0,0 +1,67 @@
---
description: Core architecture principles for the Sim app
globs: ["apps/sim/**"]
---
# Sim App Architecture
## Core Principles
1. **Single Responsibility**: Each component, hook, store has one clear purpose
2. **Composition Over Complexity**: Break down complex logic into smaller pieces
3. **Type Safety First**: TypeScript interfaces for all props, state, return types
4. **Predictable State**: Zustand for global state, useState for UI-only concerns
5. **Performance by Default**: useMemo, useCallback, refs appropriately
## File Organization
```
feature/
├── components/ # Feature components
│ └── sub-feature/ # Sub-feature with own components
├── hooks/ # Custom hooks
└── feature.tsx # Main component
```
## Naming Conventions
- **Components**: PascalCase (`WorkflowList`, `TriggerPanel`)
- **Hooks**: camelCase with `use` prefix (`useWorkflowOperations`)
- **Files**: kebab-case matching export (`workflow-list.tsx`)
- **Stores**: kebab-case in stores/ (`sidebar/store.ts`)
- **Constants**: SCREAMING_SNAKE_CASE
- **Interfaces**: PascalCase with suffix (`WorkflowListProps`)
## State Management
**useState**: UI-only concerns (dropdown open, hover, form inputs)
**Zustand**: Shared state, persistence, global app state
**useRef**: DOM refs, avoiding dependency issues, mutable non-reactive values
## Component Extraction
**Extract to separate file when:**
- Complex (50+ lines)
- Used across 2+ files
- Has own state/logic
**Keep inline when:**
- Simple (< 10 lines)
- Used in only 1 file
- Purely presentational
**Never import utilities from another component file.** Extract shared helpers to `lib/` or `utils/`.
## Utils Files
**Never create a `utils.ts` file for a single consumer.** Inline the logic directly in the consuming component.
**Create `utils.ts` when:**
- 2+ files import the same helper
**Prefer existing sources of truth:**
- Before duplicating logic, check if a centralized helper already exists (e.g., `lib/logs/get-trigger-options.ts`)
- Import from the source of truth rather than creating wrapper functions
**Location hierarchy:**
- `lib/` — App-wide utilities (auth, billing, core)
- `feature/utils.ts` — Feature-scoped utilities (used by 2+ components in the feature)
- Inline — Single-use helpers (define directly in the component)

View File

@@ -0,0 +1,64 @@
---
description: Component patterns and structure for React components
globs: ["apps/sim/**/*.tsx"]
---
# Component Patterns
## Structure Order
```typescript
'use client' // Only if using hooks
// 1. Imports (external → internal → relative)
// 2. Constants at module level
const CONFIG = { SPACING: 8 } as const
// 3. Props interface with TSDoc
interface ComponentProps {
/** Description */
requiredProp: string
optionalProp?: boolean
}
// 4. Component with TSDoc
export function Component({ requiredProp, optionalProp = false }: ComponentProps) {
// a. Refs
// b. External hooks (useParams, useRouter)
// c. Store hooks
// d. Custom hooks
// e. Local state
// f. useMemo computations
// g. useCallback handlers
// h. useEffect
// i. Return JSX
}
```
## Rules
1. Add `'use client'` when using React hooks
2. Always define props interface
3. TSDoc on component: description, @param, @returns
4. Extract constants with `as const`
5. Use Tailwind only, no inline styles
6. Semantic HTML (`aside`, `nav`, `article`)
7. Include ARIA attributes where appropriate
8. Optional chain callbacks: `onAction?.(id)`
## Factory Pattern with Caching
When generating components for a specific signature (e.g., icons):
```typescript
const cache = new Map<string, React.ComponentType<{ className?: string }>>()
function getColorIcon(color: string) {
if (cache.has(color)) return cache.get(color)!
const Icon = ({ className }: { className?: string }) => (
<div className={cn(className, 'rounded-[3px]')} style={{ backgroundColor: color, width: 10, height: 10 }} />
)
Icon.displayName = `ColorIcon(${color})`
cache.set(color, Icon)
return Icon
}
```

View File

@@ -0,0 +1,68 @@
---
description: Custom hook patterns and best practices
globs: ["apps/sim/**/use-*.ts", "apps/sim/**/hooks/**/*.ts"]
---
# Hook Patterns
## Structure
```typescript
import { createLogger } from '@/lib/logs/console/logger'
const logger = createLogger('useFeatureName')
interface UseFeatureProps {
id: string
onSuccess?: (result: Result) => void
}
/**
* Hook description.
* @param props - Configuration
* @returns State and operations
*/
export function useFeature({ id, onSuccess }: UseFeatureProps) {
// 1. Refs for stable dependencies
const idRef = useRef(id)
const onSuccessRef = useRef(onSuccess)
// 2. State
const [data, setData] = useState<Data | null>(null)
const [isLoading, setIsLoading] = useState(false)
const [error, setError] = useState<Error | null>(null)
// 3. Sync refs
useEffect(() => {
idRef.current = id
onSuccessRef.current = onSuccess
}, [id, onSuccess])
// 4. Operations with useCallback
const fetchData = useCallback(async () => {
setIsLoading(true)
try {
const result = await fetch(`/api/${idRef.current}`).then(r => r.json())
setData(result)
onSuccessRef.current?.(result)
} catch (err) {
setError(err as Error)
logger.error('Failed', { error: err })
} finally {
setIsLoading(false)
}
}, []) // Empty deps - using refs
// 5. Return grouped by state/operations
return { data, isLoading, error, fetchData }
}
```
## Rules
1. Single responsibility per hook
2. Props interface required
3. TSDoc required
4. Use logger, not console.log
5. Refs for stable callback dependencies
6. Wrap returned functions in useCallback
7. Always try/catch async operations
8. Track loading/error states

View File

@@ -0,0 +1,37 @@
---
description: Import patterns for the Sim application
globs: ["apps/sim/**/*.ts", "apps/sim/**/*.tsx"]
---
# Import Patterns
## EMCN Components
Import from `@/components/emcn`, never from subpaths like `@/components/emcn/components/modal/modal`.
**Exception**: CSS imports use actual file paths: `import '@/components/emcn/components/code/code.css'`
## Feature Components
Import from central folder indexes, not specific subfolders:
```typescript
// ✅ Correct
import { Dashboard, Sidebar } from '@/app/workspace/[workspaceId]/logs/components'
// ❌ Wrong
import { Dashboard } from '@/app/workspace/[workspaceId]/logs/components/dashboard'
```
## Internal vs External
- **Cross-feature**: Absolute paths through central index
- **Within feature**: Relative paths (`./components/...`, `../utils`)
## Import Order
1. React/core libraries
2. External libraries
3. UI components (`@/components/emcn`, `@/components/ui`)
4. Utilities (`@/lib/...`)
5. Feature imports from indexes
6. Relative imports
7. CSS imports
## Types
Use `type` keyword: `import type { WorkflowLog } from '...'`

View File

@@ -0,0 +1,57 @@
---
description: Zustand store patterns
globs: ["apps/sim/**/store.ts", "apps/sim/**/stores/**/*.ts"]
---
# Zustand Store Patterns
## Structure
```typescript
import { create } from 'zustand'
import { persist } from 'zustand/middleware'
interface FeatureState {
// State
items: Item[]
activeId: string | null
// Actions
setItems: (items: Item[]) => void
addItem: (item: Item) => void
clearState: () => void
}
const createInitialState = () => ({
items: [],
activeId: null,
})
export const useFeatureStore = create<FeatureState>()(
persist(
(set) => ({
...createInitialState(),
setItems: (items) => set({ items }),
addItem: (item) => set((state) => ({
items: [...state.items, item],
})),
clearState: () => set(createInitialState()),
}),
{
name: 'feature-state',
partialize: (state) => ({ items: state.items }),
}
)
)
```
## Rules
1. Interface includes state and actions
2. Extract config to module constants
3. TSDoc on store
4. Only persist what's needed
5. Immutable updates only - never mutate
6. Use `set((state) => ...)` when depending on previous state
7. Provide clear/reset actions

View File

@@ -0,0 +1,47 @@
---
description: Tailwind CSS and styling conventions
globs: ["apps/sim/**/*.tsx", "apps/sim/**/*.css"]
---
# Styling Rules
## Tailwind
1. **No inline styles** - Use Tailwind classes exclusively
2. **No duplicate dark classes** - Don't add `dark:` when value matches light mode
3. **Exact values** - Use design system values (`text-[14px]`, `h-[25px]`)
4. **Prefer px** - Use `px-[4px]` over `px-1`
5. **Transitions** - Add `transition-colors` for interactive states
## Conditional Classes
```typescript
import { cn } from '@/lib/utils'
<div className={cn(
'base-classes',
isActive && 'active-classes',
disabled ? 'opacity-60' : 'hover:bg-accent'
)} />
```
## CSS Variables for Dynamic Styles
```typescript
// In store setter
setSidebarWidth: (width) => {
set({ sidebarWidth: width })
document.documentElement.style.setProperty('--sidebar-width', `${width}px`)
}
// In component
<aside style={{ width: 'var(--sidebar-width)' }} />
```
## Anti-Patterns
```typescript
// ❌ Bad
<div style={{ width: 200 }}>
<div className='text-[var(--text-primary)] dark:text-[var(--text-primary)]'>
// ✅ Good
<div className='w-[200px]'>
<div className='text-[var(--text-primary)]'>
```

View File

@@ -0,0 +1,24 @@
---
description: TypeScript conventions and type safety
globs: ["apps/sim/**/*.ts", "apps/sim/**/*.tsx"]
---
# TypeScript Rules
1. **No `any`** - Use proper types or `unknown` with type guards
2. **Props interface** - Always define, even for simple components
3. **Callback types** - Full signature with params and return type
4. **Generics** - Use for reusable components/hooks
5. **Const assertions** - `as const` for constant objects/arrays
6. **Ref types** - Explicit: `useRef<HTMLDivElement>(null)`
## Anti-Patterns
```typescript
// ❌ Bad
const handleClick = (e: any) => {}
useEffect(() => { doSomething(prop) }, []) // Missing dep
// ✅ Good
const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {}
useEffect(() => { doSomething(prop) }, [prop])
```

View File

@@ -1,19 +0,0 @@
# Role
You are a professional software engineer. All code you write MUST follow best practices, ensuring accuracy, quality, readability, and cleanliness. You MUST make FOCUSED EDITS that are EFFICIENT and ELEGANT.
## Logs
ENSURE that you use the logger.info and logger.warn and logger.error instead of the console.log whenever you want to display logs.
## Comments
You must use TSDOC for comments. Do not use ==== for comments to separate sections. Do not leave any comments that are not TSDOC.
## Globals styles
You should not update the global styles unless it is absolutely necessary. Keep all styling local to components and files.
## Bun
Use bun and bunx not npm and npx

3
.gitignore vendored
View File

@@ -67,6 +67,9 @@ start-collector.sh
# VSCode
.vscode
# IntelliJ
.idea
## Helm Chart Tests
helm/sim/test
i18n.cache

47
CLAUDE.md Normal file
View File

@@ -0,0 +1,47 @@
# Expert Programming Standards
**You are tasked with implementing solutions that follow best practices. You MUST be accurate, elegant, and efficient as an expert programmer.**
---
# Role
You are a professional software engineer. All code you write MUST follow best practices, ensuring accuracy, quality, readability, and cleanliness. You MUST make FOCUSED EDITS that are EFFICIENT and ELEGANT.
## Logs
ENSURE that you use the logger.info and logger.warn and logger.error instead of the console.log whenever you want to display logs.
## Comments
You must use TSDOC for comments. Do not use ==== for comments to separate sections. Do not leave any comments that are not TSDOC.
## Global Styles
You should not update the global styles unless it is absolutely necessary. Keep all styling local to components and files.
## Bun
Use bun and bunx not npm and npx.
## Code Quality
- Write clean, maintainable code that follows the project's existing patterns
- Prefer composition over inheritance
- Keep functions small and focused on a single responsibility
- Use meaningful variable and function names
- Handle errors gracefully and provide useful error messages
- Write type-safe code with proper TypeScript types
## Testing
- Write tests for new functionality when appropriate
- Ensure existing tests pass before completing work
- Follow the project's testing conventions
## Performance
- Consider performance implications of your code
- Avoid unnecessary re-renders in React components
- Use appropriate data structures and algorithms
- Profile and optimize when necessary

View File

@@ -89,6 +89,36 @@ Wait for the model to download, then visit [http://localhost:3000](http://localh
docker compose -f docker-compose.ollama.yml exec ollama ollama pull llama3.1:8b
```
#### Using an External Ollama Instance
If you already have Ollama running on your host machine (outside Docker), you need to configure the `OLLAMA_URL` to use `host.docker.internal` instead of `localhost`:
```bash
# Docker Desktop (macOS/Windows)
OLLAMA_URL=http://host.docker.internal:11434 docker compose -f docker-compose.prod.yml up -d
# Linux (add extra_hosts or use host IP)
docker compose -f docker-compose.prod.yml up -d # Then set OLLAMA_URL to your host's IP
```
**Why?** When running inside Docker, `localhost` refers to the container itself, not your host machine. `host.docker.internal` is a special DNS name that resolves to the host.
For Linux users, you can either:
- Use your host machine's actual IP address (e.g., `http://192.168.1.100:11434`)
- Add `extra_hosts: ["host.docker.internal:host-gateway"]` to the simstudio service in your compose file
#### Using vLLM
Sim also supports [vLLM](https://docs.vllm.ai/) for self-hosted models with OpenAI-compatible API:
```bash
# Set these environment variables
VLLM_BASE_URL=http://your-vllm-server:8000
VLLM_API_KEY=your_optional_api_key # Only if your vLLM instance requires auth
```
When running with Docker, use `host.docker.internal` if vLLM is on your host machine (same as Ollama above).
### Self-hosted: Dev Containers
1. Open VS Code with the [Remote - Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)
@@ -190,6 +220,46 @@ 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
## Environment Variables
Key environment variables for self-hosted deployments (see `apps/sim/.env.example` for full list):
| Variable | Required | Description |
|----------|----------|-------------|
| `DATABASE_URL` | Yes | PostgreSQL connection string with pgvector |
| `BETTER_AUTH_SECRET` | Yes | Auth secret (`openssl rand -hex 32`) |
| `BETTER_AUTH_URL` | Yes | Your app URL (e.g., `http://localhost:3000`) |
| `NEXT_PUBLIC_APP_URL` | Yes | Public app URL (same as above) |
| `ENCRYPTION_KEY` | Yes | Encryption key (`openssl rand -hex 32`) |
| `OLLAMA_URL` | No | Ollama server URL (default: `http://localhost:11434`) |
| `VLLM_BASE_URL` | No | vLLM server URL for self-hosted models |
| `COPILOT_API_KEY` | No | API key from sim.ai for Copilot features |
## Troubleshooting
### Ollama models not showing in dropdown (Docker)
If you're running Ollama on your host machine and Sim in Docker, change `OLLAMA_URL` from `localhost` to `host.docker.internal`:
```bash
OLLAMA_URL=http://host.docker.internal:11434 docker compose -f docker-compose.prod.yml up -d
```
See [Using an External Ollama Instance](#using-an-external-ollama-instance) for details.
### Database connection issues
Ensure PostgreSQL has the pgvector extension installed. When using Docker, wait for the database to be healthy before running migrations.
### Port conflicts
If ports 3000, 3002, or 5432 are in use, configure alternatives:
```bash
# Custom ports
NEXT_PUBLIC_APP_URL=http://localhost:3100 POSTGRES_PORT=5433 docker compose up -d
```
## Tech Stack
- **Framework**: [Next.js](https://nextjs.org/) (App Router)

View File

@@ -6,9 +6,10 @@ import Link from 'next/link'
import { notFound } from 'next/navigation'
import { PageNavigationArrows } from '@/components/docs-layout/page-navigation-arrows'
import { TOCFooter } from '@/components/docs-layout/toc-footer'
import { LLMCopyButton } from '@/components/page-actions'
import { StructuredData } from '@/components/structured-data'
import { CodeBlock } from '@/components/ui/code-block'
import { CopyPageButton } from '@/components/ui/copy-page-button'
import { Heading } from '@/components/ui/heading'
import { source } from '@/lib/source'
export default async function Page(props: { params: Promise<{ slug?: string[]; lang: string }> }) {
@@ -182,7 +183,11 @@ export default async function Page(props: { params: Promise<{ slug?: string[]; l
tableOfContent={{
style: 'clerk',
enabled: true,
header: <div className='mb-2 font-medium text-sm'>On this page</div>,
header: (
<div key='toc-header' className='mb-2 font-medium text-sm'>
On this page
</div>
),
footer: <TOCFooter />,
single: false,
}}
@@ -198,7 +203,7 @@ export default async function Page(props: { params: Promise<{ slug?: string[]; l
<div className='relative mt-6 sm:mt-0'>
<div className='absolute top-1 right-0 flex items-center gap-2'>
<div className='hidden sm:flex'>
<CopyPageButton markdownUrl={`${page.url}.mdx`} />
<LLMCopyButton markdownUrl={`${page.url}.mdx`} />
</div>
<PageNavigationArrows previous={neighbours?.previous} next={neighbours?.next} />
</div>
@@ -210,6 +215,12 @@ export default async function Page(props: { params: Promise<{ slug?: string[]; l
components={{
...defaultMdxComponents,
CodeBlock,
h1: (props) => <Heading as='h1' {...props} />,
h2: (props) => <Heading as='h2' {...props} />,
h3: (props) => <Heading as='h3' {...props} />,
h4: (props) => <Heading as='h4' {...props} />,
h5: (props) => <Heading as='h5' {...props} />,
h6: (props) => <Heading as='h6' {...props} />,
}}
/>
</DocsBody>

View File

@@ -101,9 +101,6 @@ export default async function Layout({ children, params }: LayoutProps) {
<Navbar />
<DocsLayout
tree={source.pageTree[lang]}
themeSwitch={{
enabled: false,
}}
nav={{
title: (
<Image
@@ -128,7 +125,7 @@ export default async function Layout({ children, params }: LayoutProps) {
},
}}
containerProps={{
className: '!pt-10',
className: '!pt-0',
}}
>
{children}

View File

@@ -2,6 +2,12 @@
@import "fumadocs-ui/css/neutral.css";
@import "fumadocs-ui/css/preset.css";
/* Prevent overscroll bounce effect on the page */
html,
body {
overscroll-behavior: none;
}
@theme {
--color-fd-primary: #802fff; /* Purple from control-bar component */
--font-geist-sans: var(--font-geist-sans);
@@ -96,45 +102,48 @@ aside#nd-sidebar {
border-right: none !important;
}
/* Responsive sidebar positioning */
/* Mobile: Fumadocs handles drawer */
@media (min-width: 768px) and (max-width: 1024px) {
aside[data-sidebar],
aside#nd-sidebar {
left: var(--sidebar-offset) !important;
/* Fumadocs v16: Add sidebar placeholder styling for grid area */
[data-sidebar-placeholder] {
background: transparent !important;
}
/* Fumadocs v16: Hide sidebar panel (floating collapse button) */
[data-sidebar-panel] {
display: none !important;
}
/* Mobile only: Reduce gap between navbar and content */
@media (max-width: 1023px) {
#nd-docs-layout {
margin-top: -25px;
}
}
/* Desktop layout alignment */
@media (min-width: 1025px) {
[data-sidebar-container] {
margin-left: var(--sidebar-offset) !important;
}
aside[data-sidebar],
aside#nd-sidebar {
left: var(--sidebar-offset) !important;
}
/* TOC positioning - target all possible selectors */
[data-toc],
aside[data-toc],
div[data-toc],
.fd-toc,
#nd-toc,
nav[data-toc],
aside:has([role="complementary"]) {
right: var(--toc-offset) !important;
/* Desktop only: Apply custom navbar offset, sidebar width and margin offsets */
/* On mobile, let fumadocs handle the layout natively */
@media (min-width: 1024px) {
:root {
--fd-banner-height: 64px !important;
}
/* Alternative TOC container targeting */
[data-docs-page] > aside:last-child,
main ~ aside {
right: var(--toc-offset) !important;
#nd-docs-layout {
--fd-docs-height: calc(100dvh - 64px) !important;
--fd-sidebar-width: 300px !important;
margin-left: var(--sidebar-offset) !important;
margin-right: var(--toc-offset) !important;
}
/* Hide fumadocs nav on desktop - we use custom navbar there */
#nd-docs-layout > header {
display: none !important;
}
}
/* Sidebar spacing - compact like turborepo */
[data-sidebar-viewport] {
padding: 0.5rem 20px 12px;
/* Fumadocs v16: [data-sidebar-viewport] doesn't exist, target #nd-sidebar > div instead */
[data-sidebar-viewport],
#nd-sidebar > div {
padding: 0.5rem 12px 12px;
background: transparent !important;
background-color: transparent !important;
}
@@ -142,8 +151,9 @@ aside#nd-sidebar {
/* Override sidebar item styling to match Raindrop */
/* Target Link and button elements in sidebar - override Fumadocs itemVariants */
/* Exclude the small chevron-only toggle buttons */
#nd-sidebar a,
#nd-sidebar button:not([aria-label*="ollapse"]):not([aria-label*="xpand"]) {
/* Using html prefix for higher specificity over Tailwind v4 utilities */
html #nd-sidebar a,
html #nd-sidebar button:not([aria-label*="ollapse"]):not([aria-label*="xpand"]) {
font-size: 0.9375rem !important; /* 15px to match Raindrop */
line-height: 1.4 !important;
padding: 0.5rem 0.75rem !important; /* More compact like Raindrop */
@@ -154,14 +164,14 @@ aside#nd-sidebar {
}
/* Dark mode sidebar text */
.dark #nd-sidebar a,
.dark #nd-sidebar button:not([aria-label*="ollapse"]):not([aria-label*="xpand"]) {
html.dark #nd-sidebar a,
html.dark #nd-sidebar button:not([aria-label*="ollapse"]):not([aria-label*="xpand"]) {
color: rgba(255, 255, 255, 0.6) !important;
}
/* Light mode sidebar text */
:root:not(.dark) #nd-sidebar a,
:root:not(.dark) #nd-sidebar button:not([aria-label*="ollapse"]):not([aria-label*="xpand"]) {
html:not(.dark) #nd-sidebar a,
html:not(.dark) #nd-sidebar button:not([aria-label*="ollapse"]):not([aria-label*="xpand"]) {
color: rgba(0, 0, 0, 0.6) !important;
}
@@ -194,7 +204,10 @@ aside#nd-sidebar {
}
/* Section headers should be slightly larger */
[data-sidebar-viewport] [data-separator] {
/* Fumadocs v16: Also target #nd-sidebar for compatibility */
[data-sidebar-viewport] [data-separator],
#nd-sidebar [data-separator],
#nd-sidebar p {
font-size: 0.75rem !important;
font-weight: 600 !important;
text-transform: uppercase !important;
@@ -218,61 +231,61 @@ aside#nd-sidebar {
}
/* Dark mode active state */
.dark #nd-sidebar a[data-active="true"],
.dark #nd-sidebar button[data-active="true"],
.dark #nd-sidebar a.bg-fd-primary\/10,
.dark #nd-sidebar a.text-fd-primary,
.dark #nd-sidebar a[class*="bg-fd-primary"],
.dark #nd-sidebar a[class*="text-fd-primary"],
.dark #nd-sidebar a.bg-purple-50\/80,
.dark #nd-sidebar a.text-purple-600,
.dark #nd-sidebar a[class*="bg-purple"],
.dark #nd-sidebar a[class*="text-purple"] {
html.dark #nd-sidebar a[data-active="true"],
html.dark #nd-sidebar button[data-active="true"],
html.dark #nd-sidebar a.bg-fd-primary\/10,
html.dark #nd-sidebar a.text-fd-primary,
html.dark #nd-sidebar a[class*="bg-fd-primary"],
html.dark #nd-sidebar a[class*="text-fd-primary"],
html.dark #nd-sidebar a.bg-purple-50\/80,
html.dark #nd-sidebar a.text-purple-600,
html.dark #nd-sidebar a[class*="bg-purple"],
html.dark #nd-sidebar a[class*="text-purple"] {
background-color: rgba(255, 255, 255, 0.15) !important;
color: rgba(255, 255, 255, 1) !important;
}
/* Light mode active state */
:root:not(.dark) #nd-sidebar a[data-active="true"],
:root:not(.dark) #nd-sidebar button[data-active="true"],
:root:not(.dark) #nd-sidebar a.bg-fd-primary\/10,
:root:not(.dark) #nd-sidebar a.text-fd-primary,
:root:not(.dark) #nd-sidebar a[class*="bg-fd-primary"],
:root:not(.dark) #nd-sidebar a[class*="text-fd-primary"],
:root:not(.dark) #nd-sidebar a.bg-purple-50\/80,
:root:not(.dark) #nd-sidebar a.text-purple-600,
:root:not(.dark) #nd-sidebar a[class*="bg-purple"],
:root:not(.dark) #nd-sidebar a[class*="text-purple"] {
html:not(.dark) #nd-sidebar a[data-active="true"],
html:not(.dark) #nd-sidebar button[data-active="true"],
html:not(.dark) #nd-sidebar a.bg-fd-primary\/10,
html:not(.dark) #nd-sidebar a.text-fd-primary,
html:not(.dark) #nd-sidebar a[class*="bg-fd-primary"],
html:not(.dark) #nd-sidebar a[class*="text-fd-primary"],
html:not(.dark) #nd-sidebar a.bg-purple-50\/80,
html:not(.dark) #nd-sidebar a.text-purple-600,
html:not(.dark) #nd-sidebar a[class*="bg-purple"],
html:not(.dark) #nd-sidebar a[class*="text-purple"] {
background-color: rgba(0, 0, 0, 0.07) !important;
color: rgba(0, 0, 0, 0.9) !important;
}
/* Dark mode hover state */
.dark #nd-sidebar a:hover:not([data-active="true"]),
.dark #nd-sidebar button:hover:not([data-active="true"]) {
html.dark #nd-sidebar a:hover:not([data-active="true"]),
html.dark #nd-sidebar button:hover:not([data-active="true"]) {
background-color: rgba(255, 255, 255, 0.08) !important;
}
/* Light mode hover state */
:root:not(.dark) #nd-sidebar a:hover:not([data-active="true"]),
:root:not(.dark) #nd-sidebar button:hover:not([data-active="true"]) {
html:not(.dark) #nd-sidebar a:hover:not([data-active="true"]),
html:not(.dark) #nd-sidebar button:hover:not([data-active="true"]) {
background-color: rgba(0, 0, 0, 0.03) !important;
}
/* Dark mode - ensure active/selected items don't change on hover */
.dark #nd-sidebar a.bg-purple-50\/80:hover,
.dark #nd-sidebar a[class*="bg-purple"]:hover,
.dark #nd-sidebar a[data-active="true"]:hover,
.dark #nd-sidebar button[data-active="true"]:hover {
html.dark #nd-sidebar a.bg-purple-50\/80:hover,
html.dark #nd-sidebar a[class*="bg-purple"]:hover,
html.dark #nd-sidebar a[data-active="true"]:hover,
html.dark #nd-sidebar button[data-active="true"]:hover {
background-color: rgba(255, 255, 255, 0.15) !important;
color: rgba(255, 255, 255, 1) !important;
}
/* Light mode - ensure active/selected items don't change on hover */
:root:not(.dark) #nd-sidebar a.bg-purple-50\/80:hover,
:root:not(.dark) #nd-sidebar a[class*="bg-purple"]:hover,
:root:not(.dark) #nd-sidebar a[data-active="true"]:hover,
:root:not(.dark) #nd-sidebar button[data-active="true"]:hover {
html:not(.dark) #nd-sidebar a.bg-purple-50\/80:hover,
html:not(.dark) #nd-sidebar a[class*="bg-purple"]:hover,
html:not(.dark) #nd-sidebar a[data-active="true"]:hover,
html:not(.dark) #nd-sidebar button[data-active="true"]:hover {
background-color: rgba(0, 0, 0, 0.07) !important;
color: rgba(0, 0, 0, 0.9) !important;
}
@@ -351,7 +364,16 @@ aside[data-sidebar] > *:not([data-sidebar-viewport]) {
[data-sidebar] [data-title],
#nd-sidebar > a:first-child,
#nd-sidebar > div:first-child > a:first-child,
#nd-sidebar img[alt="Sim"] {
#nd-sidebar img[alt="Sim"],
/* Hide theme toggle at bottom of sidebar on desktop */
#nd-sidebar
> footer,
#nd-sidebar footer,
aside#nd-sidebar > *:last-child:not(div),
#nd-sidebar > button:last-child,
#nd-sidebar button[aria-label*="theme" i],
#nd-sidebar button[aria-label*="Theme"],
#nd-sidebar > div:last-child > button {
display: none !important;
visibility: hidden !important;
height: 0 !important;
@@ -498,13 +520,14 @@ main article,
============================================ */
/* Main content area - center and constrain like turborepo/raindrop */
/* Note: --sidebar-offset and --toc-offset are now applied at #nd-docs-layout level */
main[data-main] {
max-width: var(--spacing-fd-container, 1400px);
margin-left: auto;
margin-right: auto;
padding-top: 1rem;
padding-left: calc(var(--sidebar-offset) + var(--content-gap));
padding-right: calc(var(--toc-offset) + var(--content-gap));
padding-left: var(--content-gap);
padding-right: var(--content-gap);
order: 1 !important;
}

View File

@@ -1,5 +1,6 @@
import { notFound } from 'next/navigation'
import { type NextRequest, NextResponse } from 'next/server'
import { i18n } from '@/lib/i18n'
import { getLLMText } from '@/lib/llms'
import { source } from '@/lib/source'
@@ -7,7 +8,16 @@ export const revalidate = false
export async function GET(_req: NextRequest, { params }: { params: Promise<{ slug?: string[] }> }) {
const { slug } = await params
const page = source.getPage(slug)
let lang: (typeof i18n.languages)[number] = i18n.defaultLanguage
let pageSlug = slug
if (slug && slug.length > 0 && i18n.languages.includes(slug[0] as typeof lang)) {
lang = slug[0] as typeof lang
pageSlug = slug.slice(1)
}
const page = source.getPage(pageSlug, lang)
if (!page) notFound()
return new NextResponse(await getLLMText(page), {

View File

@@ -7,8 +7,23 @@ import Link from 'next/link'
import { usePathname } from 'next/navigation'
import { cn } from '@/lib/utils'
const LANG_PREFIXES = ['/en', '/es', '/fr', '/de', '/ja', '/zh']
function stripLangPrefix(path: string): string {
for (const prefix of LANG_PREFIXES) {
if (path === prefix) return '/'
if (path.startsWith(`${prefix}/`)) return path.slice(prefix.length)
}
return path
}
function isActive(url: string, pathname: string, nested = true): boolean {
return url === pathname || (nested && pathname.startsWith(`${url}/`))
const normalizedPathname = stripLangPrefix(pathname)
const normalizedUrl = stripLangPrefix(url)
return (
normalizedUrl === normalizedPathname ||
(nested && normalizedPathname.startsWith(`${normalizedUrl}/`))
)
}
export function SidebarItem({ item }: { item: Item }) {
@@ -16,97 +31,158 @@ export function SidebarItem({ item }: { item: Item }) {
const active = isActive(item.url, pathname, false)
return (
<li className='mb-[0.0625rem] list-none'>
<Link
href={item.url}
className={cn(
'block rounded-md px-2.5 py-1.5 font-normal text-[13px] leading-tight transition-colors',
'text-gray-600 dark:text-gray-400',
!active && 'hover:bg-gray-100/60 dark:hover:bg-gray-800/40',
active &&
'bg-purple-50/80 font-medium text-purple-600 dark:bg-purple-900/15 dark:text-purple-400'
)}
>
{item.name}
</Link>
</li>
<Link
href={item.url}
data-active={active}
className={cn(
// Mobile styles (default)
'flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm transition-colors',
'text-fd-muted-foreground hover:bg-fd-accent/50 hover:text-fd-accent-foreground',
active && 'bg-fd-primary/10 font-medium text-fd-primary',
// Desktop styles (lg+)
'lg:mb-[0.0625rem] lg:block lg:rounded-md lg:px-2.5 lg:py-1.5 lg:font-normal lg:text-[13px] lg:leading-tight',
'lg:text-gray-600 lg:dark:text-gray-400',
!active && 'lg:hover:bg-gray-100/60 lg:dark:hover:bg-gray-800/40',
active &&
'lg:bg-purple-50/80 lg:font-normal lg:text-purple-600 lg:dark:bg-purple-900/15 lg:dark:text-purple-400'
)}
>
{item.name}
</Link>
)
}
export function SidebarFolder({ item, children }: { item: Folder; children: ReactNode }) {
const pathname = usePathname()
const hasActiveChild = checkHasActiveChild(item, pathname)
const hasChildren = item.children.length > 0
const [open, setOpen] = useState(hasActiveChild)
useEffect(() => {
setOpen(hasActiveChild)
}, [hasActiveChild])
const active = item.index ? isActive(item.index.url, pathname, false) : false
if (item.index && !hasChildren) {
return (
<Link
href={item.index.url}
data-active={active}
className={cn(
// Mobile styles (default)
'flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm transition-colors',
'text-fd-muted-foreground hover:bg-fd-accent/50 hover:text-fd-accent-foreground',
active && 'bg-fd-primary/10 font-medium text-fd-primary',
// Desktop styles (lg+)
'lg:mb-[0.0625rem] lg:block lg:rounded-md lg:px-2.5 lg:py-1.5 lg:font-normal lg:text-[13px] lg:leading-tight',
'lg:text-gray-600 lg:dark:text-gray-400',
!active && 'lg:hover:bg-gray-100/60 lg:dark:hover:bg-gray-800/40',
active &&
'lg:bg-purple-50/80 lg:font-normal lg:text-purple-600 lg:dark:bg-purple-900/15 lg:dark:text-purple-400'
)}
>
{item.name}
</Link>
)
}
return (
<li className='mb-[0.0625rem] list-none'>
{item.index ? (
<div className='flex items-center gap-0.5'>
<div className='flex flex-col lg:mb-[0.0625rem]'>
<div className='flex w-full items-center lg:gap-0.5'>
{item.index ? (
<Link
href={item.index.url}
data-active={active}
className={cn(
'block flex-1 rounded-md px-2.5 py-1.5 font-medium text-[13px] leading-tight transition-colors',
'text-gray-800 dark:text-gray-200',
!isActive(item.index.url, pathname, false) &&
'hover:bg-gray-100/60 dark:hover:bg-gray-800/40',
isActive(item.index.url, pathname, false) &&
'bg-purple-50/80 text-purple-600 dark:bg-purple-900/15 dark:text-purple-400'
// Mobile styles (default)
'flex flex-1 items-center gap-2 rounded-md px-2 py-1.5 text-sm transition-colors',
'text-fd-muted-foreground hover:bg-fd-accent/50 hover:text-fd-accent-foreground',
active && 'bg-fd-primary/10 font-medium text-fd-primary',
// Desktop styles (lg+)
'lg:block lg:flex-1 lg:rounded-md lg:px-2.5 lg:py-1.5 lg:font-medium lg:text-[13px] lg:leading-tight',
'lg:text-gray-800 lg:dark:text-gray-200',
!active && 'lg:hover:bg-gray-100/60 lg:dark:hover:bg-gray-800/40',
active &&
'lg:bg-purple-50/80 lg:text-purple-600 lg:dark:bg-purple-900/15 lg:dark:text-purple-400'
)}
>
{item.name}
</Link>
) : (
<button
onClick={() => setOpen(!open)}
className='cursor-pointer rounded p-1 transition-colors hover:bg-gray-100/60 dark:hover:bg-gray-800/40'
aria-label={open ? 'Collapse' : 'Expand'}
className={cn(
// Mobile styles (default)
'flex flex-1 items-center gap-2 rounded-md px-2 py-1.5 text-sm transition-colors',
'text-fd-muted-foreground hover:bg-fd-accent/50',
// Desktop styles (lg+)
'lg:flex lg:w-full lg:cursor-pointer lg:items-center lg:justify-between lg:rounded-md lg:px-2.5 lg:py-1.5 lg:text-left lg:font-medium lg:text-[13px] lg:leading-tight',
'lg:text-gray-800 lg:hover:bg-gray-100/60 lg:dark:text-gray-200 lg:dark:hover:bg-gray-800/40'
)}
>
<span>{item.name}</span>
{/* Desktop-only chevron for non-index folders */}
<ChevronRight
className={cn(
'h-3 w-3 text-gray-400 transition-transform duration-200 ease-in-out dark:text-gray-500',
'ml-auto hidden h-3 w-3 flex-shrink-0 text-gray-400 transition-transform duration-200 ease-in-out lg:block dark:text-gray-500',
open && 'rotate-90'
)}
/>
</button>
</div>
) : (
<button
onClick={() => setOpen(!open)}
)}
{hasChildren && (
<button
onClick={() => setOpen(!open)}
className={cn(
// Mobile styles
'rounded p-1 hover:bg-fd-accent/50',
// Desktop styles
'lg:cursor-pointer lg:rounded lg:p-1 lg:transition-colors lg:hover:bg-gray-100/60 lg:dark:hover:bg-gray-800/40'
)}
aria-label={open ? 'Collapse' : 'Expand'}
>
<ChevronRight
className={cn(
// Mobile styles
'h-4 w-4 transition-transform',
// Desktop styles
'lg:h-3 lg:w-3 lg:text-gray-400 lg:duration-200 lg:ease-in-out lg:dark:text-gray-500',
open && 'rotate-90'
)}
/>
</button>
)}
</div>
{hasChildren && (
<div
className={cn(
'flex w-full cursor-pointer items-center justify-between rounded-md px-2.5 py-1.5 text-left font-medium text-[13px] leading-tight transition-colors',
'hover:bg-gray-100/60 dark:hover:bg-gray-800/40',
'text-gray-800 dark:text-gray-200'
'overflow-hidden transition-all duration-200 ease-in-out',
open ? 'max-h-[10000px] opacity-100' : 'max-h-0 opacity-0'
)}
>
<span>{item.name}</span>
<ChevronRight
className={cn(
'ml-auto h-3 w-3 flex-shrink-0 text-gray-400 transition-transform duration-200 ease-in-out dark:text-gray-500',
open && 'rotate-90'
)}
/>
</button>
{/* Mobile: simple indent */}
<div className='ml-4 flex flex-col gap-0.5 lg:hidden'>{children}</div>
{/* Desktop: styled with border */}
<ul className='mt-0.5 ml-2 hidden space-y-[0.0625rem] border-gray-200/60 border-l pl-2.5 lg:block dark:border-gray-700/60'>
{children}
</ul>
</div>
)}
<div
className={cn(
'overflow-hidden transition-all duration-200 ease-in-out',
open ? 'max-h-[10000px] opacity-100' : 'max-h-0 opacity-0'
)}
>
<ul className='mt-0.5 ml-2 space-y-[0.0625rem] border-gray-200/60 border-l pl-2.5 dark:border-gray-700/60'>
{children}
</ul>
</div>
</li>
</div>
)
}
export function SidebarSeparator({ item }: { item: Separator }) {
return (
<p className='mt-4 mb-1.5 px-2.5 font-semibold text-[10px] text-gray-500/80 uppercase tracking-wide dark:text-gray-500'>
<p
className={cn(
// Mobile styles
'mt-4 mb-2 px-2 font-medium text-fd-muted-foreground text-xs',
// Desktop styles
'lg:mt-4 lg:mb-1.5 lg:px-2.5 lg:font-semibold lg:text-[10px] lg:text-gray-500/80 lg:uppercase lg:tracking-wide lg:dark:text-gray-500'
)}
>
{item.name}
</p>
)

View File

@@ -3798,6 +3798,23 @@ export function SshIcon(props: SVGProps<SVGSVGElement>) {
)
}
export function SftpIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg
{...props}
xmlns='http://www.w3.org/2000/svg'
viewBox='0 0 32 32'
width='32px'
height='32px'
>
<path
d='M 6 3 L 6 29 L 26 29 L 26 9.59375 L 25.71875 9.28125 L 19.71875 3.28125 L 19.40625 3 Z M 8 5 L 18 5 L 18 11 L 24 11 L 24 27 L 8 27 Z M 20 6.4375 L 22.5625 9 L 20 9 Z'
fill='currentColor'
/>
</svg>
)
}
export function ApifyIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg
@@ -4089,3 +4106,96 @@ export function PolymarketIcon(props: SVGProps<SVGSVGElement>) {
</svg>
)
}
export function GoogleGroupsIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} xmlns='http://www.w3.org/2000/svg' viewBox='0 0 950 950'>
<path
d='M0 0 C0.94278809 0.16097168 1.88557617 0.32194336 2.85693359 0.48779297 C41.39640021 7.38000818 77.6089919 23.60492603 108.359375 47.75439453 C110.82847014 49.62899623 113.39874033 51.31473268 116 53 C116.46293457 52.57372314 116.92586914 52.14744629 117.40283203 51.70825195 C122.59800275 47.03131713 128.0429109 43.0311917 133.875 39.1875 C134.79337646 38.58075439 135.71175293 37.97400879 136.65795898 37.34887695 C193.06543269 0.50131391 260.71306352 -11.46626137 326.5625 2.1875 C345.0682729 6.30166442 362.9846016 12.66357256 380 21 C380.84159668 21.41121094 381.68319336 21.82242187 382.55029297 22.24609375 C394.71831585 28.25763667 406.12081333 34.88025718 417 43 C417.91386475 43.680625 417.91386475 43.680625 418.84619141 44.375 C427.3442083 50.7615534 435.33491318 57.63400459 443 65 C443.89187012 65.85102295 443.89187012 65.85102295 444.80175781 66.71923828 C453.69930679 75.25198316 461.69744094 84.07076231 469 94 C469.42619629 94.57073242 469.85239258 95.14146484 470.29150391 95.72949219 C480.43354301 109.33663206 488.67420729 123.71010258 496 139 C496.44988281 139.91910156 496.89976562 140.83820313 497.36328125 141.78515625 C507.8727502 163.93377648 513.86707037 187.75512603 517 212 C517.17128418 213.27705811 517.34256836 214.55411621 517.51904297 215.86987305 C518.22536878 222.32344617 518.20134476 228.78767265 518.23828125 235.2734375 C518.24439454 236.28303968 518.24439454 236.28303968 518.25063133 237.31303787 C518.27135228 240.8724256 518.28571641 244.43177631 518.29516602 247.99121094 C518.30623374 251.63452388 518.34067753 255.27722681 518.38033772 258.92032433 C518.40666551 261.75333675 518.41487174 264.58620664 518.41844749 267.4193306 C518.42558411 269.40605687 518.45193759 271.39268495 518.47883606 273.37924194 C518.44942207 285.76015309 515.12264488 295.57193005 507 305 C499.87428202 312.02979486 489.28626689 317.89258596 479.05601447 318.02519969 C476.62337781 317.96406397 474.19532718 317.86193279 471.76460171 317.74760151 C470.82658438 317.70850022 469.88856705 317.66939893 468.92212495 317.62911275 C466.85886798 317.54255897 464.79572187 317.45333201 462.73267936 317.36180875 C458.15557952 317.15958497 453.5778828 316.97272504 449.00018999 316.78448407 C445.21423965 316.62851756 441.42837797 316.470502 437.64251518 316.31242561 C398.91465695 314.70443054 360.18475613 313.32679155 321.43299866 312.45133972 C320.24242123 312.42435066 320.24242123 312.42435066 319.02779173 312.39681636 C302.59808087 312.02523843 286.16791507 311.67886855 269.73699983 311.36500082 C260.42194939 311.18705349 251.10704348 311.00250961 241.79223633 310.81225586 C240.94943279 310.79516155 240.10662926 310.77806724 239.23828622 310.76045491 C214.73870723 310.26060136 190.27214589 309.42986365 165.79391344 308.29660819 C125.90250763 306.44979005 86.03732773 305.17982958 46.09943641 305.14658036 C44.50897189 305.14521365 42.91850784 305.14311607 41.32804524 305.14028964 C-37.5133746 305.00531502 -103.97082682 308.91076335 -163.52726094 367.12336398 C-188.38087655 391.97851495 -210.60272126 420.04013588 -229.42095524 449.719724 C-234.44627637 457.53470195 -238.00370356 461.2158497 -247.01953125 463.8984375 C-257.45600695 465.67920678 -265.74521563 464.625344 -274.70703125 458.76953125 C-282.12356812 453.04603687 -286.55153627 446.30121318 -288 437 C-288.0944182 434.21858347 -288.13925894 431.46261367 -288.13371277 428.68151855 C-288.13597833 427.84676797 -288.13824388 427.01201739 -288.14057809 426.15197134 C-288.14690588 423.35585743 -288.14608946 420.55979215 -288.14526367 417.76367188 C-288.14825623 415.75762367 -288.15165898 413.75157604 -288.15544128 411.74552917 C-288.16428321 406.29210673 -288.16661969 400.83869999 -288.16725707 395.38527107 C-288.16796834 391.97072817 -288.17010429 388.55618925 -288.17275429 385.14164734 C-288.18201368 373.20657092 -288.1860891 361.27150567 -288.18530273 349.33642578 C-288.18470423 338.25260833 -288.19520972 327.16883991 -288.2110464 316.08503485 C-288.22418718 306.54413041 -288.22948379 297.00324184 -288.22884732 287.46232843 C-288.22859392 281.77588842 -288.23135606 276.08949183 -288.24202538 270.40306091 C-288.25181491 265.03831145 -288.25171239 259.67364588 -288.24450874 254.3088932 C-288.2434757 252.35683887 -288.24574798 250.40477901 -288.2518692 248.45273399 C-288.30129251 231.57587659 -287.43735147 214.67304784 -284.25 198.0625 C-284.07936035 197.16249268 -283.9087207 196.26248535 -283.73291016 195.33520508 C-277.33281977 162.80659035 -264.83654002 129.80613517 -245 103 C-244.30777344 102.03835938 -243.61554688 101.07671875 -242.90234375 100.0859375 C-231.62223929 84.68769966 -218.86054597 69.06796015 -204 57 C-202.82757852 56.01627594 -201.65576659 55.0318252 -200.484375 54.046875 C-165.05335732 24.48458427 -123.47627349 6.4544733 -78 -1 C-77.21238281 -1.13132324 -76.42476562 -1.26264648 -75.61328125 -1.39794922 C-51.08216194 -5.26757047 -24.38186362 -4.16780456 0 0 Z '
fill='#4185F3'
transform='translate(394,440)'
/>
<path
d='M0 0 C0.84159668 0.41121094 1.68319336 0.82242187 2.55029297 1.24609375 C14.71831585 7.25763667 26.12081333 13.88025718 37 22 C37.91386475 22.680625 37.91386475 22.680625 38.84619141 23.375 C47.3442083 29.7615534 55.33491318 36.63400459 63 44 C63.59458008 44.56734863 64.18916016 45.13469727 64.80175781 45.71923828 C73.69930679 54.25198316 81.69744094 63.07076231 89 73 C89.63929443 73.85609863 89.63929443 73.85609863 90.29150391 74.72949219 C100.43354301 88.33663206 108.67420729 102.71010258 116 118 C116.67482422 119.37865234 116.67482422 119.37865234 117.36328125 120.78515625 C127.8727502 142.93377648 133.86707037 166.75512603 137 191 C137.17128418 192.27705811 137.34256836 193.55411621 137.51904297 194.86987305 C138.22536878 201.32344617 138.20134476 207.78767265 138.23828125 214.2734375 C138.24439454 215.28303968 138.24439454 215.28303968 138.25063133 216.31303787 C138.27135228 219.8724256 138.28571641 223.43177631 138.29516602 226.99121094 C138.30623374 230.63452388 138.34067753 234.27722681 138.38033772 237.92032433 C138.40666551 240.75333675 138.41487174 243.58620664 138.41844749 246.4193306 C138.42558411 248.40605687 138.45193759 250.39268495 138.47883606 252.37924194 C138.44942207 264.76015309 135.12264488 274.57193005 127 284 C118.57776719 292.3088566 107.25707403 297.12771911 95.43405437 297.12304783 C94.31986273 297.12503888 93.20567109 297.12702993 92.05771607 297.12908131 C90.83884967 297.12616847 89.61998327 297.12325563 88.36418152 297.12025452 C86.41604418 297.12153615 86.41604418 297.12153615 84.42855054 297.12284368 C80.82553724 297.1250799 77.22255366 297.12107927 73.61954415 297.11606562 C69.7334335 297.1117488 65.84732453 297.11320842 61.96121216 297.1139679 C55.22888479 297.11449235 48.49656711 297.11135375 41.76424217 297.10573006 C32.03042012 297.09760442 22.29660275 297.09499874 12.56277768 297.09374207 C-3.22955387 297.09155322 -19.02188025 297.08489767 -34.81420898 297.07543945 C-50.15535455 297.06626101 -65.49649872 297.05918229 -80.83764648 297.05493164 C-81.78321047 297.05466892 -82.72877445 297.05440619 -83.70299188 297.05413551 C-88.44658929 297.05283048 -93.1901867 297.05156677 -97.93378413 297.05032361 C-137.28919303 297.03995621 -176.64459618 297.02234244 -216 297 C-216 296.67 -216 296.34 -216 296 C-215.10539063 295.78085937 -214.21078125 295.56171875 -213.2890625 295.3359375 C-199.60744526 291.74779481 -190.30226454 286.44506049 -182.33886719 274.51049805 C-175.8694217 262.19130537 -177.24804735 248.40718553 -177.47143555 234.86889648 C-177.50929034 232.14367461 -177.51761785 229.41872657 -177.52514935 226.69327831 C-177.58592774 206.53538226 -178.58970103 187.22051454 -183.1875 167.5625 C-183.34061646 166.90023407 -183.49373291 166.23796814 -183.65148926 165.55563354 C-193.05991068 125.06154086 -212.75392634 88.11244854 -240.77734375 57.4453125 C-242.91048395 55.09848338 -244.98632073 52.70965414 -247.0625 50.3125 C-250.74767655 46.15843419 -254.73024771 42.54055591 -259 39 C-259.90878906 38.23623047 -259.90878906 38.23623047 -260.8359375 37.45703125 C-262.2186283 36.29829741 -263.60842508 35.14804931 -265 34 C-261.24101804 29.06359373 -257.22764272 25.6831341 -252.125 22.1875 C-251.37541016 21.66760498 -250.62582031 21.14770996 -249.85351562 20.61206055 C-242.75668826 15.74085214 -235.4948349 11.22981506 -228 7 C-227.34596191 6.6277832 -226.69192383 6.25556641 -226.01806641 5.87207031 C-214.74568717 -0.48948891 -203.12149343 -5.48811078 -191 -10 C-189.783125 -10.46148437 -188.56625 -10.92296875 -187.3125 -11.3984375 C-127.13030363 -32.87253938 -57.14586678 -27.9977207 0 0 Z '
fill='#4185F3'
transform='translate(774,461)'
/>
<path
d='M0 0 C2.5086616 2.21585252 4.93546061 4.49626878 7.3515625 6.8125 C8.23457031 7.62074219 9.11757813 8.42898437 10.02734375 9.26171875 C26.83279315 25.16390495 37.10842709 45.7665863 43.3515625 67.8125 C43.69316406 68.99070312 44.03476562 70.16890625 44.38671875 71.3828125 C50.59092755 97.64248697 47.11935597 127.30989764 36.3515625 151.8125 C35.92665527 152.79379883 35.92665527 152.79379883 35.49316406 153.79492188 C25.5268296 176.37059662 8.35413683 195.88783887 -12.6484375 208.8125 C-13.55078125 209.410625 -14.453125 210.00875 -15.3828125 210.625 C-42.35348642 227.69118915 -77.57347657 232.41053788 -108.6484375 226.1875 C-132.14362975 220.89155145 -153.29033371 209.45309871 -170.6484375 192.8125 C-171.53144531 192.00425781 -172.41445313 191.19601562 -173.32421875 190.36328125 C-190.12966815 174.46109505 -200.40530209 153.8584137 -206.6484375 131.8125 C-206.99003906 130.63429688 -207.33164062 129.45609375 -207.68359375 128.2421875 C-213.88780255 101.98251303 -210.41623097 72.31510236 -199.6484375 47.8125 C-199.36516602 47.15830078 -199.08189453 46.50410156 -198.79003906 45.83007812 C-188.8237046 23.25440338 -171.65101183 3.73716113 -150.6484375 -9.1875 C-149.29492188 -10.0846875 -149.29492188 -10.0846875 -147.9140625 -11 C-102.93060045 -39.46411158 -40.49856726 -33.45014405 0 0 Z '
fill='#4285F4'
transform='translate(753.6484375,172.1875)'
/>
<path
d='M0 0 C2.5086616 2.21585252 4.93546061 4.49626878 7.3515625 6.8125 C8.23457031 7.62074219 9.11757813 8.42898437 10.02734375 9.26171875 C26.83279315 25.16390495 37.10842709 45.7665863 43.3515625 67.8125 C43.69316406 68.99070312 44.03476562 70.16890625 44.38671875 71.3828125 C50.59092755 97.64248697 47.11935597 127.30989764 36.3515625 151.8125 C35.92665527 152.79379883 35.92665527 152.79379883 35.49316406 153.79492188 C25.5268296 176.37059662 8.35413683 195.88783887 -12.6484375 208.8125 C-13.55078125 209.410625 -14.453125 210.00875 -15.3828125 210.625 C-42.35348642 227.69118915 -77.57347657 232.41053788 -108.6484375 226.1875 C-132.14362975 220.89155145 -153.29033371 209.45309871 -170.6484375 192.8125 C-171.53144531 192.00425781 -172.41445313 191.19601562 -173.32421875 190.36328125 C-190.12966815 174.46109505 -200.40530209 153.8584137 -206.6484375 131.8125 C-206.99003906 130.63429688 -207.33164063 129.45609375 -207.68359375 128.2421875 C-213.88780255 101.98251303 -210.41623097 72.31510236 -199.6484375 47.8125 C-199.36516602 47.15830078 -199.08189453 46.50410156 -198.79003906 45.83007812 C-188.8237046 23.25440338 -171.65101183 3.73716113 -150.6484375 -9.1875 C-149.29492188 -10.0846875 -149.29492188 -10.0846875 -147.9140625 -11 C-102.93060045 -39.46411158 -40.49856726 -33.45014405 0 0 Z '
fill='#4285F4'
transform='translate(433.6484375,172.1875)'
/>
<path
d='M0 0 C3.81562395 1.29823475 6.07090879 2.74966858 8.8125 5.6875 C11.4212352 8.40859646 14.04942755 10.95293127 16.9375 13.375 C51.99603414 43.73637132 74.26678331 91.46037764 84.375 135.8125 C84.61371826 136.84769775 84.85243652 137.88289551 85.09838867 138.94946289 C89.0693436 157.37670439 89.42863544 175.94083356 89.48046875 194.72631836 C89.48930372 197.45992471 89.51740015 200.19229146 89.5625 202.92553711 C90.0727242 234.5058769 90.0727242 234.5058769 78.75 248.5 C67.10259629 260.32182406 52.90572797 263.38672329 36.8588047 263.52641392 C33.85098681 263.53023974 30.8436979 263.51414279 27.8359375 263.49609375 C25.70992992 263.49624909 23.58392206 263.49774385 21.45791626 263.50050354 C17.02520058 263.50188017 12.59281136 263.48945128 8.16015625 263.46655273 C2.50723581 263.43813586 -3.14514462 263.44092501 -8.79810524 263.45364285 C-13.18043552 263.46062972 -17.56264313 263.45277705 -21.94495773 263.44038582 C-24.02834985 263.43590298 -26.11175527 263.43550647 -28.19514847 263.43945122 C-45.28053358 263.45666805 -61.10730832 262.67785762 -74.25 250.4375 C-84.29292795 239.84189519 -87.30277119 227.81294372 -87.3359375 213.64453125 C-87.34418045 212.55703079 -87.3524234 211.46953033 -87.36091614 210.34907532 C-87.38009551 206.83674954 -87.38011101 203.32487017 -87.375 199.8125 C-87.37545319 198.61937195 -87.37590637 197.4262439 -87.37637329 196.19696045 C-87.35610617 178.09521781 -86.46012832 160.79921916 -83 143 C-82.75469856 141.54891669 -82.51332288 140.0971597 -82.27734375 138.64453125 C-78.04339545 114.58454961 -68.4884574 91.45015164 -57 70 C-56.38769531 68.84628906 -55.77539062 67.69257812 -55.14453125 66.50390625 C-47.06102443 51.82025778 -37.08959704 38.53023956 -26 26 C-25.22914063 25.11828125 -24.45828125 24.2365625 -23.6640625 23.328125 C-16.29692403 15.00455101 -8.575012 7.08370557 0 0 Z '
fill='#1967D2'
transform='translate(508,495)'
/>
</svg>
)
}
export function CursorIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} xmlns='http://www.w3.org/2000/svg' viewBox='0 0 546 546' fill='currentColor'>
<path d='m466.383 137.073-206.469-119.2034c-6.63-3.8287-14.811-3.8287-21.441 0l-206.4586 119.2034c-5.5734 3.218-9.0144 9.169-9.0144 15.615v240.375c0 6.436 3.441 12.397 9.0144 15.615l206.4686 119.203c6.63 3.829 14.811 3.829 21.441 0l206.468-119.203c5.574-3.218 9.015-9.17 9.015-15.615v-240.375c0-6.436-3.441-12.397-9.015-15.615zm-12.969 25.25-199.316 345.223c-1.347 2.326-4.904 1.376-4.904-1.319v-226.048c0-4.517-2.414-8.695-6.33-10.963l-195.7577-113.019c-2.3263-1.347-1.3764-4.905 1.3182-4.905h398.6305c5.661 0 9.199 6.136 6.368 11.041h-.009z' />
</svg>
)
}
export function DuckDuckGoIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} xmlns='http://www.w3.org/2000/svg' viewBox='-108 -108 216 216'>
<circle r='108' fill='#d53' />
<circle r='96' fill='none' stroke='#ffffff' strokeWidth={7} />
<path
d='M-32-55C-62-48-51-6-51-6l19 93 7 3M-39-73h-8l11 4s-11 0-11 7c24-1 35 5 35 5'
fill='#ddd'
/>
<path d='M25 95S1 57 1 32c0-47 31-7 31-44S1-58 1-58c-15-19-44-15-44-15l7 4s-7 2-9 4 19-3 28 5c-37 3-31 33-31 33l21 120' />
<path d='M25-1l38-10c34 5-29 24-33 23C0 7 9 32 45 24s9 20-24 9C-26 20-1-3 25-1' fill='#fc0' />
<path
d='M15 78l2-3c22 8 23 11 22-9s0-20-23-3c0-5-13-3-15 0-21-9-23-12-22 2 2 29 1 24 21 14'
fill='#6b5'
/>
<path d='M-1 67v12c1 2 17 2 17-2s-8 3-13 1-2-13-2-13' fill='#4a4' />
<path
d='M-23-32c-5-6-18-1-15 7 1-4 8-10 15-7m32 0c1-6 11-7 14-1-4-2-10-2-14 1m-33 16a2 2 0 1 1 0 1m-8 3a7 7 0 1 0 0-1m52-6a2 2 0 1 1 0 1m-6 3a6 6 0 1 0 0-1'
fill='#148'
/>
</svg>
)
}
export function RssIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg
{...props}
width='24'
height='24'
viewBox='0 0 24 24'
fill='none'
xmlns='http://www.w3.org/2000/svg'
>
<path
d='M4 11C6.38695 11 8.67613 11.9482 10.364 13.636C12.0518 15.3239 13 17.6131 13 20'
stroke='currentColor'
strokeWidth='2'
strokeLinecap='round'
strokeLinejoin='round'
/>
<path
d='M4 4C8.24346 4 12.3131 5.68571 15.3137 8.68629C18.3143 11.6869 20 15.7565 20 20'
stroke='currentColor'
strokeWidth='2'
strokeLinecap='round'
strokeLinejoin='round'
/>
<circle cx='5' cy='19' r='1' fill='currentColor' />
</svg>
)
}

View File

@@ -20,7 +20,7 @@ export function Navbar() {
<div
className='relative flex w-full items-center justify-between'
style={{
paddingLeft: 'calc(var(--sidebar-offset) + 20px)',
paddingLeft: 'calc(var(--sidebar-offset) + 32px)',
paddingRight: 'calc(var(--toc-offset) + 60px)',
}}
>

View File

@@ -1,55 +1,50 @@
'use client'
import { useState } from 'react'
import { useCopyButton } from 'fumadocs-ui/utils/use-copy-button'
import { Check, Copy } from 'lucide-react'
const cache = new Map<string, string>()
interface CopyPageButtonProps {
export function LLMCopyButton({
markdownUrl,
}: {
/**
* A URL to fetch the raw Markdown/MDX content of page
*/
markdownUrl: string
}
export function CopyPageButton({ markdownUrl }: CopyPageButtonProps) {
const [copied, setCopied] = useState(false)
}) {
const [isLoading, setLoading] = useState(false)
const handleCopy = async () => {
const [checked, onClick] = useCopyButton(async () => {
const cached = cache.get(markdownUrl)
if (cached) {
await navigator.clipboard.writeText(cached)
setCopied(true)
setTimeout(() => setCopied(false), 2000)
return
}
if (cached) return navigator.clipboard.writeText(cached)
setLoading(true)
try {
await navigator.clipboard.write([
new ClipboardItem({
'text/plain': fetch(markdownUrl).then(async (res) => {
const content = await res.text()
cache.set(markdownUrl, content)
return content
}),
}),
])
setCopied(true)
setTimeout(() => setCopied(false), 2000)
} catch (err) {
console.error('Failed to copy:', err)
} finally {
setLoading(false)
}
}
})
return (
<button
disabled={isLoading}
onClick={handleCopy}
onClick={onClick}
className='flex cursor-pointer items-center gap-1.5 rounded-lg border border-border/40 bg-background px-2.5 py-2 text-muted-foreground/60 text-sm leading-none transition-all hover:border-border hover:bg-accent/50 hover:text-muted-foreground'
aria-label={copied ? 'Copied to clipboard' : 'Copy page content'}
aria-label={checked ? 'Copied to clipboard' : 'Copy page content'}
>
{copied ? (
{checked ? (
<>
<Check className='h-3.5 w-3.5' />
<span>Copied</span>

View File

@@ -0,0 +1,58 @@
'use client'
import { type ComponentPropsWithoutRef, useState } from 'react'
import { Check, Link } from 'lucide-react'
import { cn } from '@/lib/utils'
type HeadingTag = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6'
interface HeadingProps extends ComponentPropsWithoutRef<'h1'> {
as?: HeadingTag
}
export function Heading({ as, className, ...props }: HeadingProps) {
const [copied, setCopied] = useState(false)
const As = as ?? 'h1'
if (!props.id) {
return <As className={className} {...props} />
}
const handleClick = async (e: React.MouseEvent) => {
e.preventDefault()
const url = `${window.location.origin}${window.location.pathname}#${props.id}`
try {
await navigator.clipboard.writeText(url)
setCopied(true)
// Update URL hash without scrolling
window.history.pushState(null, '', `#${props.id}`)
setTimeout(() => setCopied(false), 2000)
} catch {
// Fallback: just navigate to the anchor
window.location.hash = props.id as string
}
}
return (
<As className={cn('group flex scroll-m-28 flex-row items-center gap-2', className)} {...props}>
<a data-card='' href={`#${props.id}`} className='peer' onClick={handleClick}>
{props.children}
</a>
{copied ? (
<Check
aria-hidden
className='size-3.5 shrink-0 text-green-500 opacity-100 transition-opacity'
/>
) : (
<Link
aria-hidden
className='size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity group-hover:opacity-100 peer-hover:opacity-100'
/>
)}
</As>
)
}

View File

@@ -15,10 +15,12 @@ import {
CalendlyIcon,
ClayIcon,
ConfluenceIcon,
CursorIcon,
DatadogIcon,
DiscordIcon,
DocumentIcon,
DropboxIcon,
DuckDuckGoIcon,
DynamoDBIcon,
ElasticsearchIcon,
ElevenLabsIcon,
@@ -32,6 +34,7 @@ import {
GoogleDocsIcon,
GoogleDriveIcon,
GoogleFormsIcon,
GoogleGroupsIcon,
GoogleIcon,
GoogleSheetsIcon,
GoogleSlidesIcon,
@@ -83,6 +86,7 @@ import {
SendgridIcon,
SentryIcon,
SerperIcon,
SftpIcon,
ShopifyIcon,
SlackIcon,
SmtpIcon,
@@ -145,6 +149,7 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
slack: SlackIcon,
shopify: ShopifyIcon,
sharepoint: MicrosoftSharepointIcon,
sftp: SftpIcon,
serper: SerperIcon,
sentry: SentryIcon,
sendgrid: SendgridIcon,
@@ -195,6 +200,7 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
google_vault: GoogleVaultIcon,
google_slides: GoogleSlidesIcon,
google_sheets: GoogleSheetsIcon,
google_groups: GoogleGroupsIcon,
google_forms: GoogleFormsIcon,
google_drive: GoogleDriveIcon,
google_docs: GoogleDocsIcon,
@@ -209,9 +215,11 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
elevenlabs: ElevenLabsIcon,
elasticsearch: ElasticsearchIcon,
dynamodb: DynamoDBIcon,
duckduckgo: DuckDuckGoIcon,
dropbox: DropboxIcon,
discord: DiscordIcon,
datadog: DatadogIcon,
cursor: CursorIcon,
confluence: ConfluenceIcon,
clay: ClayIcon,
calendly: CalendlyIcon,

View File

@@ -143,7 +143,7 @@ Function (Process) → Condition (account_type === 'enterprise') → Advanced or
## Bewährte Praktiken
- **Bedingungen korrekt anordnen**: Platzieren Sie spezifischere Bedingungen vor allgemeinen, um sicherzustellen, dass spezifische Logik Vorrang vor Fallbacks hat
- **Eine Standardbedingung einfügen**: Fügen Sie eine Auffangbedingung (`true`) als letzte Bedingung hinzu, um nicht übereinstimmende Fälle zu behandeln und zu verhindern, dass die Workflow-Ausführung stecken bleibt
- **Ausdrücke einfach halten**: Verwenden Sie klare, unkomplizierte boolesche Ausdrücke für bessere Lesbarkeit und einfachere Fehlersuche
- **Verwenden Sie den Else-Zweig bei Bedarf**: Wenn keine Bedingungen übereinstimmen und der Else-Zweig nicht verbunden ist, endet der Workflow-Zweig ordnungsgemäß. Verbinden Sie den Else-Zweig, wenn Sie einen Fallback-Pfad für nicht übereinstimmende Fälle benötigen
- **Halten Sie Ausdrücke einfach**: Verwenden Sie klare, unkomplizierte boolesche Ausdrücke für bessere Lesbarkeit und einfachere Fehlersuche
- **Dokumentieren Sie Ihre Bedingungen**: Fügen Sie Beschreibungen hinzu, um den Zweck jeder Bedingung für bessere Teamzusammenarbeit und Wartung zu erklären
- **Grenzfälle testen**: Überprüfen Sie, ob Bedingungen Grenzwerte korrekt behandeln, indem Sie mit Werten an den Grenzen Ihrer Bedingungsbereiche testen
- **Testen Sie Grenzfälle**: Überprüfen Sie, ob Bedingungen Grenzwerte korrekt behandeln, indem Sie mit Werten an den Grenzen Ihrer Bedingungsbereiche testen

View File

@@ -27,14 +27,16 @@ Alle API-Antworten enthalten Informationen über Ihre Workflow-Ausführungslimit
"limits": {
"workflowExecutionRateLimit": {
"sync": {
"limit": 60, // Max sync workflow executions per minute
"remaining": 58, // Remaining sync workflow executions
"resetAt": "..." // When the window resets
"requestsPerMinute": 60, // Sustained rate limit per minute
"maxBurst": 120, // Maximum burst capacity
"remaining": 118, // Current tokens available (up to maxBurst)
"resetAt": "..." // When tokens next refill
},
"async": {
"limit": 60, // Max async workflow executions per minute
"remaining": 59, // Remaining async workflow executions
"resetAt": "..." // When the window resets
"requestsPerMinute": 200, // Sustained rate limit per minute
"maxBurst": 400, // Maximum burst capacity
"remaining": 398, // Current tokens available
"resetAt": "..." // When tokens next refill
}
},
"usage": {
@@ -46,7 +48,7 @@ Alle API-Antworten enthalten Informationen über Ihre Workflow-Ausführungslimit
}
```
**Hinweis:** Die Ratenbegrenzungen in der Antwort beziehen sich auf Workflow-Ausführungen. Die Ratenbegrenzungen für den Aufruf dieses API-Endpunkts befinden sich in den Antwort-Headern (`X-RateLimit-*`).
**Hinweis:** Ratenbegrenzungen verwenden einen Token-Bucket-Algorithmus. `remaining` kann `requestsPerMinute` bis zu `maxBurst` überschreiten, wenn du dein volles Kontingent in letzter Zeit nicht genutzt hast, was Burst-Traffic ermöglicht. Die Ratenbegrenzungen im Antworttext gelten für Workflow-Ausführungen. Die Ratenbegrenzungen für den Aufruf dieses API-Endpunkts befinden sich in den Antwort-Headern (`X-RateLimit-*`).
### Logs abfragen
@@ -110,13 +112,15 @@ Fragen Sie Workflow-Ausführungsprotokolle mit umfangreichen Filteroptionen ab.
"limits": {
"workflowExecutionRateLimit": {
"sync": {
"limit": 60,
"remaining": 58,
"requestsPerMinute": 60,
"maxBurst": 120,
"remaining": 118,
"resetAt": "2025-01-01T12:35:56.789Z"
},
"async": {
"limit": 60,
"remaining": 59,
"requestsPerMinute": 200,
"maxBurst": 400,
"remaining": 398,
"resetAt": "2025-01-01T12:35:56.789Z"
}
},
@@ -190,13 +194,15 @@ Rufen Sie detaillierte Informationen zu einem bestimmten Logeintrag ab.
"limits": {
"workflowExecutionRateLimit": {
"sync": {
"limit": 60,
"remaining": 58,
"requestsPerMinute": 60,
"maxBurst": 120,
"remaining": 118,
"resetAt": "2025-01-01T12:35:56.789Z"
},
"async": {
"limit": 60,
"remaining": 59,
"requestsPerMinute": 200,
"maxBurst": 400,
"remaining": 398,
"resetAt": "2025-01-01T12:35:56.789Z"
}
},
@@ -482,19 +488,27 @@ Fehlgeschlagene Webhook-Zustellungen werden mit exponentiellem Backoff und Jitte
## Rate-Limiting
Die API implementiert Rate-Limiting, um eine faire Nutzung zu gewährleisten:
Die API verwendet einen **Token-Bucket-Algorithmus** für die Ratenbegrenzung, der eine faire Nutzung ermöglicht und gleichzeitig Burst-Traffic zulässt:
- **Kostenloser Plan**: 10 Anfragen pro Minute
- **Pro-Plan**: 30 Anfragen pro Minute
- **Team-Plan**: 60 Anfragen pro Minute
- **Enterprise-Plan**: Individuelle Limits
| Plan | Anfragen/Minute | Burst-Kapazität |
|------|-----------------|----------------|
| Free | 10 | 20 |
| Pro | 30 | 60 |
| Team | 60 | 120 |
| Enterprise | 120 | 240 |
Rate-Limit-Informationen sind in den Antwort-Headern enthalten:
- `X-RateLimit-Limit`: Maximale Anfragen pro Zeitfenster
- `X-RateLimit-Remaining`: Verbleibende Anfragen im aktuellen Zeitfenster
- `X-RateLimit-Reset`: ISO-Zeitstempel, wann das Zeitfenster zurückgesetzt wird
**Wie es funktioniert:**
- Tokens werden mit der Rate `requestsPerMinute` aufgefüllt
- Du kannst im Leerlauf bis zu `maxBurst` Tokens ansammeln
- Jede Anfrage verbraucht 1 Token
- Die Burst-Kapazität ermöglicht die Bewältigung von Verkehrsspitzen
## Beispiel: Abfragen neuer Logs
Informationen zur Ratenbegrenzung sind in den Antwort-Headern enthalten:
- `X-RateLimit-Limit`: Anfragen pro Minute (Auffüllrate)
- `X-RateLimit-Remaining`: Aktuell verfügbare Tokens
- `X-RateLimit-Reset`: ISO-Zeitstempel, wann Tokens als nächstes aufgefüllt werden
## Beispiel: Abfragen nach neuen Logs
```javascript
let cursor = null;
@@ -541,7 +555,7 @@ async function pollLogs() {
setInterval(pollLogs, 30000);
```
## Beispiel: Verarbeiten von Webhooks
## Beispiel: Verarbeitung von Webhooks
```javascript
import express from 'express';

View File

@@ -147,8 +147,20 @@ curl -X GET -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" htt
{
"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" },
"sync": {
"isLimited": false,
"requestsPerMinute": 25,
"maxBurst": 50,
"remaining": 50,
"resetAt": "2025-09-08T22:51:55.999Z"
},
"async": {
"isLimited": false,
"requestsPerMinute": 200,
"maxBurst": 400,
"remaining": 400,
"resetAt": "2025-09-08T22:51:56.155Z"
},
"authType": "api"
},
"usage": {
@@ -159,49 +171,54 @@ curl -X GET -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" htt
}
```
**Rate-Limit-Felder:**
- `requestsPerMinute`: Dauerhafte Rate-Begrenzung (Tokens werden mit dieser Rate aufgefüllt)
- `maxBurst`: Maximale Tokens, die Sie ansammeln können (Burst-Kapazität)
- `remaining`: Aktuell verfügbare Tokens (können bis zu `maxBurst` sein)
**Antwortfelder:**
- `currentPeriodCost` zeigt die Nutzung im aktuellen Abrechnungszeitraum
- `limit` wird aus individuellen Limits (Free/Pro) oder gebündelten Organisationslimits (Team/Enterprise) abgeleitet
- `currentPeriodCost` spiegelt die Nutzung in der aktuellen Abrechnungsperiode wider
- `limit` wird von individuellen Limits (Free/Pro) oder gepoolten Organisationslimits (Team/Enterprise) abgeleitet
- `plan` ist der aktive Plan mit der höchsten Priorität, der mit Ihrem Benutzer verknüpft ist
## Plan-Limits
Verschiedene Abonnementpläne haben unterschiedliche Nutzungslimits:
| Plan | Monatliches Nutzungslimit | Ratengrenze (pro Minute) |
| Plan | Monatliches Nutzungslimit | Rate-Limits (pro Minute) |
|------|-------------------|-------------------------|
| **Free** | $10 | 5 sync, 10 async |
| **Pro** | $100 | 10 sync, 50 async |
| **Team** | $500 (gebündelt) | 50 sync, 100 async |
| **Team** | $500 (gepoolt) | 50 sync, 100 async |
| **Enterprise** | Individuell | Individuell |
## Abrechnungsmodell
Sim verwendet ein **Basisabonnement + Überschreitung** Abrechnungsmodell:
Sim verwendet ein **Basisabonnement + Mehrverbrauch**-Abrechnungsmodell:
### Wie es funktioniert
**Pro Plan ($20/Monat):**
**Pro-Plan ($20/Monat):**
- Monatliches Abonnement beinhaltet $20 Nutzung
- Nutzung unter $20 → Keine zusätzlichen Kosten
- Nutzung über $20 → Zahlung der Überschreitung am Monatsende
- Beispiel: $35 Nutzung = $20 (Abonnement) + $15 (Überschreitung)
- Nutzung über $20 → Zahlen Sie den Mehrverbrauch am Monatsende
- Beispiel: $35 Nutzung = $20 (Abonnement) + $15 (Mehrverbrauch)
**Team Plan ($40/Benutzer/Monat):**
- Gebündelte Nutzung für alle Teammitglieder
- Überschreitung wird aus der Gesamtnutzung des Teams berechnet
**Team-Plan ($40/Benutzer/Monat):**
- Gepoolte Nutzung für alle Teammitglieder
- Mehrverbrauch wird aus der Gesamtnutzung des Teams berechnet
- Organisationsinhaber erhält eine Rechnung
**Enterprise Pläne:**
- Fester monatlicher Preis, keine Überschreitungen
**Enterprise-Pläne:**
- Fester monatlicher Preis, kein Mehrverbrauch
- Individuelle Nutzungslimits gemäß Vereinbarung
### Schwellenwertabrechnung
### Schwellenwert-Abrechnung
Wenn die nicht abgerechnete Überschreitung $50 erreicht, berechnet Sim automatisch den gesamten nicht abgerechneten Betrag.
Wenn der nicht abgerechnete Mehrverbrauch $50 erreicht, berechnet Sim automatisch den gesamten nicht abgerechneten Betrag.
**Beispiel:**
- Tag 10: $70 Überschreitung → Sofortige Abrechnung von $70
- Tag 10: $70 Mehrverbrauch → Sofortige Abrechnung von $70
- Tag 15: Zusätzliche $35 Nutzung ($105 insgesamt) → Bereits abgerechnet, keine Aktion
- Tag 20: Weitere $50 Nutzung ($155 insgesamt, $85 nicht abgerechnet) → Sofortige Abrechnung von $85

View File

@@ -72,7 +72,7 @@ Für benutzerdefinierte Integrationen nutzen Sie unsere [MCP (Model Context Prot
<Video src="introduction/integrations-sidebar.mp4" width={700} height={450} />
</div>
## KI-gesteuerter Copilot
## Copilot
**Fragen stellen & Anleitung erhalten**
Der Copilot beantwortet Fragen zu Sim, erklärt Ihre Workflows und gibt Verbesserungsvorschläge. Verwenden Sie das `@` Symbol, um auf Workflows, Blöcke, Dokumentation, Wissen und Protokolle für kontextbezogene Unterstützung zu verweisen.

View File

@@ -1,5 +1,7 @@
---
title: Wissensdatenbank
title: Übersicht
description: Laden Sie Ihre Dokumente hoch, verarbeiten und durchsuchen Sie sie
mit intelligenter Vektorsuche und Chunking
---
import { Video } from '@/components/ui/video'

View File

@@ -0,0 +1,155 @@
---
title: Docker
description: Sim Studio mit Docker Compose bereitstellen
---
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { Callout } from 'fumadocs-ui/components/callout'
## Schnellstart
```bash
# Clone and start
git clone https://github.com/simstudioai/sim.git && cd sim
docker compose -f docker-compose.prod.yml up -d
```
Öffnen Sie [http://localhost:3000](http://localhost:3000)
## Produktionseinrichtung
### 1. Umgebung konfigurieren
```bash
# Generate secrets
cat > .env << EOF
DATABASE_URL=postgresql://postgres:postgres@db:5432/simstudio
BETTER_AUTH_SECRET=$(openssl rand -hex 32)
ENCRYPTION_KEY=$(openssl rand -hex 32)
INTERNAL_API_SECRET=$(openssl rand -hex 32)
NEXT_PUBLIC_APP_URL=https://sim.yourdomain.com
BETTER_AUTH_URL=https://sim.yourdomain.com
NEXT_PUBLIC_SOCKET_URL=https://sim.yourdomain.com
EOF
```
### 2. Dienste starten
```bash
docker compose -f docker-compose.prod.yml up -d
```
### 3. SSL einrichten
<Tabs items={['Caddy (Empfohlen)', 'Nginx + Certbot']}>
<Tab value="Caddy (Empfohlen)">
Caddy verwaltet SSL-Zertifikate automatisch.
```bash
# Install Caddy
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update && sudo apt install caddy
```
Erstellen Sie `/etc/caddy/Caddyfile`:
```
sim.yourdomain.com {
reverse_proxy localhost:3000
handle /socket.io/* {
reverse_proxy localhost:3002
}
}
```
```bash
sudo systemctl restart caddy
```
</Tab>
<Tab value="Nginx + Certbot">
```bash
# Install
sudo apt install nginx certbot python3-certbot-nginx -y
# Create /etc/nginx/sites-available/sim
server {
listen 80;
server_name sim.yourdomain.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /socket.io/ {
proxy_pass http://127.0.0.1:3002;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
# Enable and get certificate
sudo ln -s /etc/nginx/sites-available/sim /etc/nginx/sites-enabled/
sudo certbot --nginx -d sim.yourdomain.com
```
</Tab>
</Tabs>
## Ollama
```bash
# With GPU
docker compose -f docker-compose.ollama.yml --profile gpu --profile setup up -d
# CPU only
docker compose -f docker-compose.ollama.yml --profile cpu --profile setup up -d
```
Zusätzliche Modelle herunterladen:
```bash
docker compose -f docker-compose.ollama.yml exec ollama ollama pull llama3.2
```
### Externes Ollama
Wenn Ollama auf Ihrem Host-Rechner läuft (nicht in Docker):
```bash
# macOS/Windows
OLLAMA_URL=http://host.docker.internal:11434 docker compose -f docker-compose.prod.yml up -d
# Linux - use your host IP
OLLAMA_URL=http://192.168.1.100:11434 docker compose -f docker-compose.prod.yml up -d
```
<Callout type="warning">
Innerhalb von Docker bezieht sich `localhost` auf den Container, nicht auf Ihren Host. Verwenden Sie `host.docker.internal` oder die IP-Adresse Ihres Hosts.
</Callout>
## Befehle
```bash
# View logs
docker compose -f docker-compose.prod.yml logs -f simstudio
# Stop
docker compose -f docker-compose.prod.yml down
# Update
docker compose -f docker-compose.prod.yml pull && docker compose -f docker-compose.prod.yml up -d
# Backup database
docker compose -f docker-compose.prod.yml exec db pg_dump -U postgres simstudio > backup.sql
```

View File

@@ -0,0 +1,87 @@
---
title: Umgebungsvariablen
description: Konfigurationsreferenz für Sim Studio
---
import { Callout } from 'fumadocs-ui/components/callout'
## Erforderlich
| Variable | Beschreibung |
|----------|-------------|
| `DATABASE_URL` | PostgreSQL-Verbindungszeichenfolge |
| `BETTER_AUTH_SECRET` | Auth-Secret (32 Hex-Zeichen): `openssl rand -hex 32` |
| `BETTER_AUTH_URL` | Ihre App-URL |
| `ENCRYPTION_KEY` | Verschlüsselungsschlüssel (32 Hex-Zeichen): `openssl rand -hex 32` |
| `INTERNAL_API_SECRET` | Internes API-Secret (32 Hex-Zeichen): `openssl rand -hex 32` |
| `NEXT_PUBLIC_APP_URL` | Öffentliche App-URL |
| `NEXT_PUBLIC_SOCKET_URL` | WebSocket-URL (Standard: `http://localhost:3002`) |
## KI-Anbieter
| Variable | Anbieter |
|----------|----------|
| `OPENAI_API_KEY` | OpenAI |
| `ANTHROPIC_API_KEY_1` | Anthropic Claude |
| `GEMINI_API_KEY_1` | Google Gemini |
| `MISTRAL_API_KEY` | Mistral |
| `OLLAMA_URL` | Ollama (Standard: `http://localhost:11434`) |
<Callout type="info">
Für Lastausgleich fügen Sie mehrere Schlüssel mit den Suffixen `_1`, `_2`, `_3` hinzu (z.B. `OPENAI_API_KEY_1`, `OPENAI_API_KEY_2`). Funktioniert mit OpenAI, Anthropic und Gemini.
</Callout>
<Callout type="info">
In Docker verwenden Sie `OLLAMA_URL=http://host.docker.internal:11434` für Ollama auf dem Host-System.
</Callout>
### Azure OpenAI
| Variable | Beschreibung |
|----------|-------------|
| `AZURE_OPENAI_API_KEY` | Azure OpenAI API-Schlüssel |
| `AZURE_OPENAI_ENDPOINT` | Azure OpenAI Endpoint-URL |
| `AZURE_OPENAI_API_VERSION` | API-Version (z.B. `2024-02-15-preview`) |
### vLLM (Selbst-gehostet)
| Variable | Beschreibung |
|----------|-------------|
| `VLLM_BASE_URL` | vLLM-Server-URL (z.B. `http://localhost:8000/v1`) |
| `VLLM_API_KEY` | Optionaler Bearer-Token für vLLM |
## OAuth-Anbieter
| Variable | Beschreibung |
|----------|-------------|
| `GOOGLE_CLIENT_ID` | Google OAuth Client-ID |
| `GOOGLE_CLIENT_SECRET` | Google OAuth Client-Secret |
| `GITHUB_CLIENT_ID` | GitHub OAuth Client-ID |
| `GITHUB_CLIENT_SECRET` | GitHub OAuth Client-Secret |
## Optional
| Variable | Beschreibung |
|----------|-------------|
| `API_ENCRYPTION_KEY` | Verschlüsselt gespeicherte API-Schlüssel (32 Hex-Zeichen): `openssl rand -hex 32` |
| `COPILOT_API_KEY` | API-Schlüssel für Copilot-Funktionen |
| `ADMIN_API_KEY` | Admin-API-Schlüssel für GitOps-Operationen |
| `RESEND_API_KEY` | E-Mail-Dienst für Benachrichtigungen |
| `ALLOWED_LOGIN_DOMAINS` | Registrierungen auf Domains beschränken (durch Kommas getrennt) |
| `ALLOWED_LOGIN_EMAILS` | Registrierungen auf bestimmte E-Mails beschränken (durch Kommas getrennt) |
| `DISABLE_REGISTRATION` | Auf `true` setzen, um neue Benutzerregistrierungen zu deaktivieren |
## Beispiel .env
```bash
DATABASE_URL=postgresql://postgres:postgres@db:5432/simstudio
BETTER_AUTH_SECRET=<openssl rand -hex 32>
BETTER_AUTH_URL=https://sim.yourdomain.com
ENCRYPTION_KEY=<openssl rand -hex 32>
INTERNAL_API_SECRET=<openssl rand -hex 32>
NEXT_PUBLIC_APP_URL=https://sim.yourdomain.com
NEXT_PUBLIC_SOCKET_URL=https://sim.yourdomain.com
OPENAI_API_KEY=sk-...
```
Siehe `apps/sim/.env.example` für alle Optionen.

View File

@@ -0,0 +1,50 @@
---
title: Self-Hosting
description: Stellen Sie Sim Studio auf Ihrer eigenen Infrastruktur bereit
---
import { Card, Cards } from 'fumadocs-ui/components/card'
import { Callout } from 'fumadocs-ui/components/callout'
Stellen Sie Sim Studio auf Ihrer eigenen Infrastruktur mit Docker oder Kubernetes bereit.
## Anforderungen
| Ressource | Minimum | Empfohlen |
|----------|---------|-------------|
| CPU | 2 Kerne | 4+ Kerne |
| RAM | 12 GB | 16+ GB |
| Speicher | 20 GB SSD | 50+ GB SSD |
| Docker | 20.10+ | Neueste Version |
## Schnellstart
```bash
git clone https://github.com/simstudioai/sim.git && cd sim
docker compose -f docker-compose.prod.yml up -d
```
Öffnen Sie [http://localhost:3000](http://localhost:3000)
## Bereitstellungsoptionen
<Cards>
<Card title="Docker" href="/self-hosting/docker">
Bereitstellung mit Docker Compose auf jedem Server
</Card>
<Card title="Kubernetes" href="/self-hosting/kubernetes">
Bereitstellung mit Helm auf Kubernetes-Clustern
</Card>
<Card title="Cloud-Plattformen" href="/self-hosting/platforms">
Anleitungen für Railway, DigitalOcean, AWS, Azure, GCP
</Card>
</Cards>
## Architektur
| Komponente | Port | Beschreibung |
|-----------|------|-------------|
| simstudio | 3000 | Hauptanwendung |
| realtime | 3002 | WebSocket-Server |
| db | 5432 | PostgreSQL mit pgvector |
| migrations | - | Datenbank-Migrationen (werden einmal ausgeführt) |

View File

@@ -0,0 +1,133 @@
---
title: Kubernetes
description: Sim Studio mit Helm bereitstellen
---
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { Callout } from 'fumadocs-ui/components/callout'
## Voraussetzungen
- Kubernetes 1.19+
- Helm 3.0+
- PV-Provisioner-Unterstützung
## Installation
```bash
# Clone repo
git clone https://github.com/simstudioai/sim.git && cd sim
# Generate secrets
BETTER_AUTH_SECRET=$(openssl rand -hex 32)
ENCRYPTION_KEY=$(openssl rand -hex 32)
INTERNAL_API_SECRET=$(openssl rand -hex 32)
# Install
helm install sim ./helm/sim \
--set app.env.BETTER_AUTH_SECRET="$BETTER_AUTH_SECRET" \
--set app.env.ENCRYPTION_KEY="$ENCRYPTION_KEY" \
--set app.env.INTERNAL_API_SECRET="$INTERNAL_API_SECRET" \
--namespace simstudio --create-namespace
```
## Cloud-spezifische Werte
<Tabs items={['AWS EKS', 'Azure AKS', 'GCP GKE']}>
<Tab value="AWS EKS">
```bash
helm install sim ./helm/sim \
--values ./helm/sim/examples/values-aws.yaml \
--set app.env.BETTER_AUTH_SECRET="$BETTER_AUTH_SECRET" \
--set app.env.ENCRYPTION_KEY="$ENCRYPTION_KEY" \
--set app.env.INTERNAL_API_SECRET="$INTERNAL_API_SECRET" \
--set app.env.NEXT_PUBLIC_APP_URL="https://sim.yourdomain.com" \
--namespace simstudio --create-namespace
```
</Tab>
<Tab value="Azure AKS">
```bash
helm install sim ./helm/sim \
--values ./helm/sim/examples/values-azure.yaml \
--set app.env.BETTER_AUTH_SECRET="$BETTER_AUTH_SECRET" \
--set app.env.ENCRYPTION_KEY="$ENCRYPTION_KEY" \
--set app.env.INTERNAL_API_SECRET="$INTERNAL_API_SECRET" \
--set app.env.NEXT_PUBLIC_APP_URL="https://sim.yourdomain.com" \
--namespace simstudio --create-namespace
```
</Tab>
<Tab value="GCP GKE">
```bash
helm install sim ./helm/sim \
--values ./helm/sim/examples/values-gcp.yaml \
--set app.env.BETTER_AUTH_SECRET="$BETTER_AUTH_SECRET" \
--set app.env.ENCRYPTION_KEY="$ENCRYPTION_KEY" \
--set app.env.INTERNAL_API_SECRET="$INTERNAL_API_SECRET" \
--set app.env.NEXT_PUBLIC_APP_URL="https://sim.yourdomain.com" \
--namespace simstudio --create-namespace
```
</Tab>
</Tabs>
## Schlüsselkonfiguration
```yaml
# Custom values.yaml
app:
replicaCount: 2
env:
NEXT_PUBLIC_APP_URL: "https://sim.yourdomain.com"
OPENAI_API_KEY: "sk-..."
postgresql:
persistence:
size: 50Gi
ingress:
enabled: true
className: nginx
tls:
enabled: true
app:
host: sim.yourdomain.com
```
Siehe `helm/sim/values.yaml` für alle Optionen.
## Externe Datenbank
```yaml
postgresql:
enabled: false
externalDatabase:
enabled: true
host: "your-db-host"
port: 5432
username: "postgres"
password: "your-password"
database: "simstudio"
sslMode: "require"
```
## Befehle
```bash
# Port forward for local access
kubectl port-forward deployment/sim-sim-app 3000:3000 -n simstudio
# View logs
kubectl logs -l app.kubernetes.io/component=app -n simstudio --tail=100
# Upgrade
helm upgrade sim ./helm/sim --namespace simstudio
# Uninstall
helm uninstall sim --namespace simstudio
```

View File

@@ -0,0 +1,124 @@
---
title: Cloud-Plattformen
description: Sim Studio auf Cloud-Plattformen bereitstellen
---
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { Callout } from 'fumadocs-ui/components/callout'
## Railway
Bereitstellung mit einem Klick und automatischer PostgreSQL-Bereitstellung.
[
![Auf Railway bereitstellen](https://railway.app/button.svg)
](https://railway.com/new/template/sim-studio)
Nach der Bereitstellung fügen Sie Umgebungsvariablen im Railway-Dashboard hinzu:
- `BETTER_AUTH_SECRET`, `ENCRYPTION_KEY`, `INTERNAL_API_SECRET` (automatisch generiert)
- `OPENAI_API_KEY` oder andere KI-Anbieter-Schlüssel
- Benutzerdefinierte Domain in Einstellungen → Netzwerk
## VPS-Bereitstellung
Für DigitalOcean, AWS EC2, Azure VMs oder jeden Linux-Server:
<Tabs items={['DigitalOcean', 'AWS EC2', 'Azure VM']}>
<Tab value="DigitalOcean">
**Empfohlen:** 16 GB RAM Droplet, Ubuntu 24.04
```bash
# Create Droplet via console, then SSH in
ssh root@your-droplet-ip
```
</Tab>
<Tab value="AWS EC2">
**Empfohlen:** t3.xlarge (16 GB RAM), Ubuntu 24.04
```bash
ssh -i your-key.pem ubuntu@your-ec2-ip
```
</Tab>
<Tab value="Azure VM">
**Empfohlen:** Standard_D4s_v3 (16 GB RAM), Ubuntu 24.04
```bash
ssh azureuser@your-vm-ip
```
</Tab>
</Tabs>
### Docker installieren
```bash
# Install Docker (official method)
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER
# Logout and reconnect, then verify
docker --version
```
### Sim Studio bereitstellen
```bash
git clone https://github.com/simstudioai/sim.git && cd sim
# Create .env with secrets
cat > .env << EOF
DATABASE_URL=postgresql://postgres:postgres@db:5432/simstudio
BETTER_AUTH_SECRET=$(openssl rand -hex 32)
ENCRYPTION_KEY=$(openssl rand -hex 32)
INTERNAL_API_SECRET=$(openssl rand -hex 32)
NEXT_PUBLIC_APP_URL=https://sim.yourdomain.com
BETTER_AUTH_URL=https://sim.yourdomain.com
NEXT_PUBLIC_SOCKET_URL=https://sim.yourdomain.com
EOF
# Start
docker compose -f docker-compose.prod.yml up -d
```
### SSL mit Caddy
```bash
# Install Caddy
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update && sudo apt install caddy
# Configure (replace domain)
echo 'sim.yourdomain.com {
reverse_proxy localhost:3000
handle /socket.io/* {
reverse_proxy localhost:3002
}
}' | sudo tee /etc/caddy/Caddyfile
sudo systemctl restart caddy
```
Richten Sie den DNS A-Eintrag Ihrer Domain auf die IP-Adresse Ihres Servers.
## Kubernetes (EKS, AKS, GKE)
Siehe den [Kubernetes-Leitfaden](/self-hosting/kubernetes) für Helm-Deployment auf verwaltetem Kubernetes.
## Verwaltete Datenbank (Optional)
Für den Produktivbetrieb sollten Sie einen verwalteten PostgreSQL-Dienst verwenden:
- **AWS RDS** / **Azure Database** / **Cloud SQL** - Aktivieren Sie die pgvector-Erweiterung
- **Supabase** / **Neon** - pgvector enthalten
Setzen Sie `DATABASE_URL` in Ihrer Umgebung:
```bash
DATABASE_URL="postgresql://user:pass@host:5432/db?sslmode=require"
```

View File

@@ -0,0 +1,113 @@
---
title: Fehlerbehebung
description: Häufige Probleme und Lösungen
---
## Datenbankverbindung fehlgeschlagen
```bash
# Check database is running
docker compose ps db
# Test connection
docker compose exec db psql -U postgres -c "SELECT 1"
```
Überprüfen Sie das `DATABASE_URL` Format: `postgresql://user:pass@host:5432/database`
## Ollama-Modelle werden nicht angezeigt
In Docker ist `localhost` = der Container, nicht Ihr Host-Rechner.
```bash
# For host-machine Ollama, use:
OLLAMA_URL=http://host.docker.internal:11434 # macOS/Windows
OLLAMA_URL=http://192.168.1.x:11434 # Linux (use actual IP)
```
## WebSocket/Echtzeit funktioniert nicht
1. Prüfen Sie, ob `NEXT_PUBLIC_SOCKET_URL` mit Ihrer Domain übereinstimmt
2. Überprüfen Sie, ob der Echtzeit-Dienst läuft: `docker compose ps realtime`
3. Stellen Sie sicher, dass der Reverse-Proxy WebSocket-Upgrades weiterleitet (siehe [Docker-Anleitung](/self-hosting/docker))
## 502 Bad Gateway
```bash
# Check app is running
docker compose ps simstudio
docker compose logs simstudio
# Common causes: out of memory, database not ready
```
## Migrationsfehler
```bash
# View migration logs
docker compose logs migrations
# Run manually
docker compose exec simstudio bun run db:migrate
```
## pgvector nicht gefunden
Verwenden Sie das richtige PostgreSQL-Image:
```yaml
image: pgvector/pgvector:pg17 # NOT postgres:17
```
## Zertifikatsfehler (CERT_HAS_EXPIRED)
Wenn Sie SSL-Zertifikatsfehler beim Aufrufen externer APIs sehen:
```bash
# Update CA certificates in container
docker compose exec simstudio apt-get update && apt-get install -y ca-certificates
# Or set in environment (not recommended for production)
NODE_TLS_REJECT_UNAUTHORIZED=0
```
## Leere Seite nach dem Login
1. Überprüfen Sie die Browser-Konsole auf Fehler
2. Stellen Sie sicher, dass `NEXT_PUBLIC_APP_URL` mit Ihrer tatsächlichen Domain übereinstimmt
3. Löschen Sie Browser-Cookies und lokalen Speicher
4. Prüfen Sie, ob alle Dienste laufen: `docker compose ps`
## Windows-spezifische Probleme
**Turbopack-Fehler unter Windows:**
```bash
# Use WSL2 for better compatibility
wsl --install
# Or disable Turbopack in package.json
# Change "next dev --turbopack" to "next dev"
```
**Zeilenende-Probleme:**
```bash
# Configure git to use LF
git config --global core.autocrlf input
```
## Logs anzeigen
```bash
# All services
docker compose logs -f
# Specific service
docker compose logs -f simstudio
```
## Hilfe erhalten
- [GitHub Issues](https://github.com/simstudioai/sim/issues)
- [Discord](https://discord.gg/Hr4UWYEcTT)

View File

@@ -0,0 +1,182 @@
---
title: Cursor
description: Starten und verwalten Sie Cursor Cloud-Agenten zur Arbeit an
GitHub-Repositories
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="cursor"
color="#1E1E1E"
/>
{/* MANUAL-CONTENT-START:intro */}
[Cursor](https://www.cursor.so/) ist eine KI-IDE und cloudbasierte Plattform, mit der Sie leistungsstarke KI-Agenten starten und verwalten können, die direkt mit Ihren GitHub-Repositories arbeiten können. Cursor-Agenten können Entwicklungsaufgaben automatisieren, die Produktivität Ihres Teams steigern und mit Ihnen zusammenarbeiten, indem sie Codeänderungen vornehmen, auf natürlichsprachliche Anweisungen reagieren und einen Gesprächsverlauf über ihre Aktivitäten führen.
Mit Cursor können Sie:
- **Cloud-Agenten für Codebasen starten**: Erstellen Sie sofort neue KI-Agenten, die in der Cloud an Ihren Repositories arbeiten
- **Codierungsaufgaben mit natürlicher Sprache delegieren**: Leiten Sie Agenten mit schriftlichen Anweisungen, Änderungen und Klarstellungen an
- **Fortschritt und Ergebnisse überwachen**: Rufen Sie den Agentenstatus ab, sehen Sie detaillierte Ergebnisse und prüfen Sie aktuelle oder abgeschlossene Aufgaben
- **Zugriff auf den vollständigen Gesprächsverlauf**: Überprüfen Sie alle Eingabeaufforderungen und KI-Antworten für Transparenz und Nachvollziehbarkeit
- **Steuerung und Verwaltung des Agenten-Lebenszyklus**: Listen Sie aktive Agenten auf, beenden Sie Agenten und verwalten Sie API-basierte Agentenstarts und Nachverfolgungen
In Sim ermöglicht die Cursor-Integration Ihren Agenten und Workflows, programmatisch mit Cursor-Cloud-Agenten zu interagieren. Das bedeutet, Sie können Sim verwenden, um:
- Alle Cloud-Agenten auflisten und ihren aktuellen Status durchsuchen (`cursor_list_agents`)
- Aktuellen Status und Ausgaben für jeden Agenten abrufen (`cursor_get_agent`)
- Den vollständigen Gesprächsverlauf für jeden Codierungsagenten anzeigen (`cursor_get_conversation`)
- Nachfolgende Anweisungen oder neue Eingabeaufforderungen zu einem laufenden Agenten hinzufügen
- Agenten nach Bedarf verwalten und beenden
Diese Integration hilft Ihnen, die flexible Intelligenz von Sim-Agenten mit den leistungsstarken Automatisierungsfunktionen von Cursor zu kombinieren, wodurch es möglich wird, KI-gesteuerte Entwicklung über Ihre Projekte hinweg zu skalieren.
{/* MANUAL-CONTENT-END */}
## Gebrauchsanweisung
Interagieren Sie mit der Cursor Cloud Agents API, um KI-Agenten zu starten, die an Ihren GitHub-Repositories arbeiten können. Unterstützt das Starten von Agenten, das Hinzufügen von Folgeanweisungen, die Statusprüfung, die Anzeige von Konversationen und die Verwaltung des Agenten-Lebenszyklus.
## Tools
### `cursor_list_agents`
Listet alle Cloud-Agenten für den authentifizierten Benutzer mit optionaler Paginierung auf.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Cursor API-Schlüssel |
| `limit` | number | Nein | Anzahl der zurückzugebenden Agenten \(Standard: 20, max: 100\) |
| `cursor` | string | Nein | Paginierungscursor aus der vorherigen Antwort |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `content` | string | Menschenlesbare Liste der Agenten |
| `metadata` | object | Metadaten der Agentenliste |
### `cursor_get_agent`
Ruft den aktuellen Status und die Ergebnisse eines Cloud-Agenten ab.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Cursor API-Schlüssel |
| `agentId` | string | Ja | Eindeutige Kennung für den Cloud-Agenten \(z.B. bc_abc123\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `content` | string | Menschenlesbare Agentendetails |
| `metadata` | object | Agenten-Metadaten |
### `cursor_get_conversation`
Ruft den Konversationsverlauf eines Cloud-Agenten ab, einschließlich aller Benutzeraufforderungen und Assistentenantworten.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Cursor API-Schlüssel |
| `agentId` | string | Ja | Eindeutige Kennung für den Cloud-Agenten \(z.B. bc_abc123\) |
#### Output
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `content` | string | Menschenlesbarer Konversationsverlauf |
| `metadata` | object | Konversations-Metadaten |
### `cursor_launch_agent`
Starten Sie einen neuen Cloud-Agenten, um an einem GitHub-Repository mit den angegebenen Anweisungen zu arbeiten.
#### Input
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Cursor API-Schlüssel |
| `repository` | string | Ja | GitHub-Repository-URL \(z.B. https://github.com/your-org/your-repo\) |
| `ref` | string | Nein | Branch, Tag oder Commit, von dem aus gearbeitet werden soll \(standardmäßig der Hauptbranch\) |
| `promptText` | string | Ja | Der Anweisungstext für den Agenten |
| `promptImages` | string | Nein | JSON-Array von Bildobjekten mit Base64-Daten und Abmessungen |
| `model` | string | Nein | Zu verwendendes Modell \(leer lassen für automatische Auswahl\) |
| `branchName` | string | Nein | Benutzerdefinierter Branch-Name für den Agenten |
| `autoCreatePr` | boolean | Nein | Automatisches Erstellen eines PR, wenn der Agent fertig ist |
| `openAsCursorGithubApp` | boolean | Nein | Öffnen des PR als Cursor GitHub App |
| `skipReviewerRequest` | boolean | Nein | Überspringen der Anfrage nach Prüfern für den PR |
#### Output
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `content` | string | Erfolgsmeldung mit Agenten-Details |
| `metadata` | object | Metadaten zum Startergebnis |
### `cursor_add_followup`
Fügen Sie einem bestehenden Cloud-Agenten eine Folgeanweisung hinzu.
#### Input
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Cursor API-Schlüssel |
| `agentId` | string | Ja | Eindeutige Kennung für den Cloud-Agenten \(z.B. bc_abc123\) |
| `followupPromptText` | string | Ja | Der Folgeanweisungstext für den Agenten |
| `promptImages` | string | Nein | JSON-Array von Bildobjekten mit Base64-Daten und Abmessungen \(max. 5\) |
#### Output
| Parameter | Type | Beschreibung |
| --------- | ---- | ----------- |
| `content` | string | Erfolgsmeldung |
| `metadata` | object | Ergebnis-Metadaten |
### `cursor_stop_agent`
Stoppt einen laufenden Cloud-Agenten. Dies pausiert den Agenten, ohne ihn zu löschen.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Cursor API-Schlüssel |
| `agentId` | string | Ja | Eindeutige Kennung für den Cloud-Agenten \(z.B. bc_abc123\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `content` | string | Erfolgsmeldung |
| `metadata` | object | Ergebnis-Metadaten |
### `cursor_delete_agent`
Löscht einen Cloud-Agenten dauerhaft. Diese Aktion kann nicht rückgängig gemacht werden.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Cursor API-Schlüssel |
| `agentId` | string | Ja | Eindeutige Kennung für den Cloud-Agenten \(z.B. bc_abc123\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `content` | string | Erfolgsmeldung |
| `metadata` | object | Ergebnis-Metadaten |
## Hinweise
- Kategorie: `tools`
- Typ: `cursor`

View File

@@ -0,0 +1,63 @@
---
title: DuckDuckGo
description: Suche mit DuckDuckGo
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="duckduckgo"
color="#FFFFFF"
/>
{/* MANUAL-CONTENT-START:intro */}
[DuckDuckGo](https://duckduckgo.com/) ist eine datenschutzorientierte Websuchmaschine, die sofortige Antworten, Zusammenfassungen, verwandte Themen und mehr liefert ohne dich oder deine Suchen zu verfolgen. DuckDuckGo macht es einfach, Informationen ohne Benutzerprofilierung oder zielgerichtete Werbung zu finden.
Mit DuckDuckGo in Sim kannst du:
- **Im Web suchen**: Finde sofort Antworten, Fakten und Übersichten für eine bestimmte Suchanfrage
- **Direkte Antworten erhalten**: Erhalte spezifische Antworten für Berechnungen, Umrechnungen oder Faktenfragen
- **Auf Zusammenfassungen zugreifen**: Erhalte kurze Zusammenfassungen oder Beschreibungen für deine Suchthemen
- **Verwandte Themen abrufen**: Entdecke Links und Referenzen, die für deine Suche relevant sind
- **Ausgabe filtern**: Optional HTML entfernen oder Begriffsklärungen überspringen für sauberere Ergebnisse
Diese Funktionen ermöglichen es deinen Sim-Agenten, den Zugriff auf aktuelles Webwissen zu automatisieren vom Auffinden von Fakten in einem Workflow bis hin zur Anreicherung von Dokumenten und Analysen mit aktuellen Informationen. Da DuckDuckGos Instant Answers API offen ist und keinen API-Schlüssel erfordert, lässt sie sich einfach und datenschutzsicher in deine automatisierten Geschäftsprozesse integrieren.
{/* MANUAL-CONTENT-END */}
## Nutzungsanleitung
Durchsuche das Web mit der DuckDuckGo Instant Answers API. Liefert sofortige Antworten, Zusammenfassungen, verwandte Themen und mehr. Kostenlos nutzbar ohne API-Schlüssel.
## Tools
### `duckduckgo_search`
Durchsuche das Web mit der DuckDuckGo Instant Answers API. Liefert sofortige Antworten, Zusammenfassungen und verwandte Themen für deine Anfrage. Kostenlos nutzbar ohne API-Schlüssel.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `query` | string | Ja | Die auszuführende Suchanfrage |
| `noHtml` | boolean | Nein | HTML aus Text in Ergebnissen entfernen \(Standard: true\) |
| `skipDisambig` | boolean | Nein | Begriffsklärungsergebnisse überspringen \(Standard: false\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `heading` | string | Die Überschrift/der Titel der Sofortantwort |
| `abstract` | string | Eine kurze Zusammenfassung des Themas |
| `abstractText` | string | Einfache Textversion der Zusammenfassung |
| `abstractSource` | string | Die Quelle der Zusammenfassung \(z.B. Wikipedia\) |
| `abstractURL` | string | URL zur Quelle der Zusammenfassung |
| `image` | string | URL zu einem Bild zum Thema |
| `answer` | string | Direkte Antwort, falls verfügbar \(z.B. für Berechnungen\) |
| `answerType` | string | Typ der Antwort \(z.B. calc, ip, usw.\) |
| `type` | string | Antworttyp: A \(Artikel\), D \(Begriffsklärung\), C \(Kategorie\), N \(Name\), E \(Exklusiv\) |
| `relatedTopics` | array | Array verwandter Themen mit URLs und Beschreibungen |
## Hinweise
- Kategorie: `tools`
- Typ: `duckduckgo`

View File

@@ -46,11 +46,11 @@ Durchsuchen Sie das Web mit Exa AI. Liefert relevante Suchergebnisse mit Titeln,
| `type` | string | Nein | Suchtyp: neural, keyword, auto oder fast \(Standard: auto\) |
| `includeDomains` | string | Nein | Kommagetrennte Liste von Domains, die in den Ergebnissen enthalten sein sollen |
| `excludeDomains` | string | Nein | Kommagetrennte Liste von Domains, die aus den Ergebnissen ausgeschlossen werden sollen |
| `category` | string | Nein | Nach Kategorie filtern: company, research_paper, news_article, pdf, github, tweet, movie, song, personal_site |
| `category` | string | Nein | Nach Kategorie filtern: company, research paper, news, pdf, github, tweet, personal site, linkedin profile, financial report |
| `text` | boolean | Nein | Vollständigen Textinhalt in Ergebnissen einschließen \(Standard: false\) |
| `highlights` | boolean | Nein | Hervorgehobene Ausschnitte in Ergebnissen einschließen \(Standard: false\) |
| `summary` | boolean | Nein | KI-generierte Zusammenfassungen in Ergebnissen einschließen \(Standard: false\) |
| `livecrawl` | string | Nein | Live-Crawling-Modus: always, fallback oder never \(Standard: never\) |
| `livecrawl` | string | Nein | Live-Crawling-Modus: never \(Standard\), fallback, always oder preferred \(immer livecrawl versuchen, bei Fehlschlag auf Cache zurückgreifen\) |
| `apiKey` | string | Ja | Exa AI API-Schlüssel |
#### Ausgabe
@@ -69,11 +69,11 @@ Ruft den Inhalt von Webseiten mit Exa AI ab. Gibt den Titel, Textinhalt und opti
| --------- | ---- | -------- | ----------- |
| `urls` | string | Ja | Kommagetrennte Liste von URLs, von denen Inhalte abgerufen werden sollen |
| `text` | boolean | Nein | Wenn true, gibt den vollständigen Seitentext mit Standardeinstellungen zurück. Wenn false, deaktiviert die Textrückgabe. |
| `summaryQuery` | string | Nein | Abfrage zur Steuerung der Zusammenfassungserstellung |
| `subpages` | number | Nein | Anzahl der Unterseiten, die von den angegebenen URLs gecrawlt werden sollen |
| `summaryQuery` | string | Nein | Anfrage zur Steuerung der Zusammenfassungserstellung |
| `subpages` | number | Nein | Anzahl der Unterseiten, die von den bereitgestellten URLs gecrawlt werden sollen |
| `subpageTarget` | string | Nein | Kommagetrennte Schlüsselwörter zur Zielausrichtung auf bestimmte Unterseiten \(z.B. "docs,tutorial,about"\) |
| `highlights` | boolean | Nein | Hervorgehobene Ausschnitte in Ergebnissen einschließen \(Standard: false\) |
| `livecrawl` | string | Nein | Live-Crawling-Modus: always, fallback oder never \(Standard: never\) |
| `livecrawl` | string | Nein | Live-Crawling-Modus: never \(Standard\), fallback, always oder preferred \(immer livecrawl versuchen, bei Fehlschlag auf Cache zurückgreifen\) |
| `apiKey` | string | Ja | Exa AI API-Schlüssel |
#### Ausgabe
@@ -95,11 +95,10 @@ Finde Webseiten, die einer bestimmten URL ähnlich sind, mit Exa AI. Gibt eine L
| `text` | boolean | Nein | Ob der vollständige Text der ähnlichen Seiten eingeschlossen werden soll |
| `includeDomains` | string | Nein | Kommagetrennte Liste von Domains, die in den Ergebnissen enthalten sein sollen |
| `excludeDomains` | string | Nein | Kommagetrennte Liste von Domains, die aus den Ergebnissen ausgeschlossen werden sollen |
| `excludeSourceDomain` | boolean | Nein | Quell-Domain aus Ergebnissen ausschließen \(Standard: false\) |
| `category` | string | Nein | Nach Kategorie filtern: company, research_paper, news_article, pdf, github, tweet, movie, song, personal_site |
| `excludeSourceDomain` | boolean | Nein | Die Quell-Domain aus den Ergebnissen ausschließen \(Standard: false\) |
| `highlights` | boolean | Nein | Hervorgehobene Ausschnitte in Ergebnissen einschließen \(Standard: false\) |
| `summary` | boolean | Nein | KI-generierte Zusammenfassungen in Ergebnissen einschließen \(Standard: false\) |
| `livecrawl` | string | Nein | Live-Crawling-Modus: always, fallback oder never \(Standard: never\) |
| `livecrawl` | string | Nein | Live-Crawling-Modus: never \(Standard\), fallback, always oder preferred \(versucht immer livecrawl, fällt auf Cache zurück, wenn es fehlschlägt\) |
| `apiKey` | string | Ja | Exa AI API-Schlüssel |
#### Ausgabe

View File

@@ -0,0 +1,217 @@
---
title: Google Groups
description: Google Workspace-Gruppen und deren Mitglieder verwalten
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="google_groups"
color="#E8F0FE"
/>
## Gebrauchsanweisung
Verbinden Sie sich mit Google Workspace, um Gruppen und deren Mitglieder mit der Admin SDK Directory API zu erstellen, zu aktualisieren und zu verwalten.
## Tools
### `google_groups_list_groups`
Alle Gruppen in einer Google Workspace-Domain auflisten
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `customer` | string | Nein | Kunden-ID oder "my_customer" für die Domain des authentifizierten Benutzers |
| `domain` | string | Nein | Domainname zum Filtern von Gruppen |
| `maxResults` | number | Nein | Maximale Anzahl der zurückzugebenden Ergebnisse \(1-200\) |
| `pageToken` | string | Nein | Token für Paginierung |
| `query` | string | Nein | Suchabfrage zum Filtern von Gruppen \(z.B. "email:admin*"\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `output` | json | Google Groups API-Antwortdaten |
### `google_groups_get_group`
Details einer bestimmten Google-Gruppe nach E-Mail oder Gruppen-ID abrufen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `groupKey` | string | Ja | E-Mail-Adresse der Gruppe oder eindeutige Gruppen-ID |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `output` | json | Google Groups API-Antwortdaten |
### `google_groups_create_group`
Eine neue Google-Gruppe in der Domain erstellen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `email` | string | Ja | E-Mail-Adresse für die neue Gruppe (z.B. team@yourdomain.com) |
| `name` | string | Ja | Anzeigename für die Gruppe |
| `description` | string | Nein | Beschreibung der Gruppe |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `output` | json | Google Groups API-Antwortdaten |
### `google_groups_update_group`
Eine bestehende Google-Gruppe aktualisieren
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `groupKey` | string | Ja | E-Mail-Adresse der Gruppe oder eindeutige Gruppen-ID |
| `name` | string | Nein | Neuer Anzeigename für die Gruppe |
| `description` | string | Nein | Neue Beschreibung für die Gruppe |
| `email` | string | Nein | Neue E-Mail-Adresse für die Gruppe |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `output` | json | Google Groups API-Antwortdaten |
### `google_groups_delete_group`
Eine Google-Gruppe löschen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `groupKey` | string | Ja | E-Mail-Adresse der Gruppe oder eindeutige Gruppen-ID zum Löschen |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `output` | json | Google Groups API-Antwortdaten |
### `google_groups_list_members`
Alle Mitglieder einer Google-Gruppe auflisten
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `groupKey` | string | Ja | E-Mail-Adresse der Gruppe oder eindeutige Gruppen-ID |
| `maxResults` | number | Nein | Maximale Anzahl der zurückzugebenden Ergebnisse \(1-200\) |
| `pageToken` | string | Nein | Token für Seitenumbruch |
| `roles` | string | Nein | Nach Rollen filtern \(durch Komma getrennt: OWNER, MANAGER, MEMBER\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `output` | json | Google Groups API-Antwortdaten |
### `google_groups_get_member`
Details eines bestimmten Mitglieds in einer Google-Gruppe abrufen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `groupKey` | string | Ja | E-Mail-Adresse der Gruppe oder eindeutige Gruppen-ID |
| `memberKey` | string | Ja | E-Mail-Adresse des Mitglieds oder eindeutige Mitglieds-ID |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `output` | json | Google Groups API-Antwortdaten |
### `google_groups_add_member`
Ein neues Mitglied zu einer Google-Gruppe hinzufügen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `groupKey` | string | Ja | E-Mail-Adresse der Gruppe oder eindeutige Gruppen-ID |
| `email` | string | Ja | E-Mail-Adresse des hinzuzufügenden Mitglieds |
| `role` | string | Nein | Rolle für das Mitglied \(MEMBER, MANAGER oder OWNER\). Standardmäßig MEMBER. |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `output` | json | Google Groups API-Antwortdaten |
### `google_groups_remove_member`
Ein Mitglied aus einer Google-Gruppe entfernen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `groupKey` | string | Ja | E-Mail-Adresse der Gruppe oder eindeutige Gruppen-ID |
| `memberKey` | string | Ja | E-Mail-Adresse oder eindeutige ID des zu entfernenden Mitglieds |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `output` | json | Google Groups API-Antwortdaten |
### `google_groups_update_member`
Ein Mitglied aktualisieren
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `groupKey` | string | Ja | E-Mail-Adresse der Gruppe oder eindeutige Gruppen-ID |
| `memberKey` | string | Ja | E-Mail-Adresse des Mitglieds oder eindeutige Mitglieds-ID |
| `role` | string | Ja | Neue Rolle für das Mitglied \(MEMBER, MANAGER oder OWNER\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `output` | json | Google Groups API-Antwortdaten |
### `google_groups_has_member`
Prüfen, ob ein Benutzer Mitglied einer Google-Gruppe ist
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `groupKey` | string | Ja | E-Mail-Adresse der Gruppe oder eindeutige Gruppen-ID |
| `memberKey` | string | Ja | Zu prüfende E-Mail-Adresse des Mitglieds oder eindeutige Mitglieds-ID |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `output` | json | Google Groups API-Antwortdaten |
## Hinweise
- Kategorie: `tools`
- Typ: `google_groups`

View File

@@ -49,8 +49,8 @@ Rufe eine Liste von Prognosemärkten von Kalshi mit optionaler Filterung ab
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Marktdaten und Metadaten |
| `markets` | array | Array von Markt-Objekten |
| `paging` | object | Paginierungscursor zum Abrufen weiterer Ergebnisse |
### `kalshi_get_market`
@@ -66,8 +66,7 @@ Rufe Details eines bestimmten Prognosemarkts nach Ticker ab
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Marktdaten und Metadaten |
| `market` | object | Markt-Objekt mit Details |
### `kalshi_get_events`
@@ -85,10 +84,10 @@ Rufe eine Liste von Events von Kalshi mit optionaler Filterung ab
#### Output
| Parameter | Type | Beschreibung |
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Ereignisdaten und Metadaten |
| `events` | array | Array von Ereignis-Objekten |
| `paging` | object | Paginierungscursor zum Abrufen weiterer Ergebnisse |
### `kalshi_get_event`
@@ -103,10 +102,9 @@ Details eines bestimmten Ereignisses anhand des Tickers abrufen
#### Output
| Parameter | Type | Beschreibung |
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Ereignisdaten und Metadaten |
| `event` | object | Ereignis-Objekt mit Details |
### `kalshi_get_balance`
@@ -121,10 +119,12 @@ Kontostand und Portfoliowert von Kalshi abrufen
#### Output
| Parameter | Type | Beschreibung |
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Kontostandsdaten und Metadaten |
| `balance` | number | Kontostand in Cent |
| `portfolioValue` | number | Portfoliowert in Cent |
| `balanceDollars` | number | Kontostand in Dollar |
| `portfolioValueDollars` | number | Portfoliowert in Dollar |
### `kalshi_get_positions`
@@ -146,8 +146,8 @@ Offene Positionen von Kalshi abrufen
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Positionsdaten und Metadaten |
| `positions` | array | Array von Positions-Objekten |
| `paging` | object | Paginierungscursor zum Abrufen weiterer Ergebnisse |
### `kalshi_get_orders`
@@ -169,8 +169,8 @@ Rufen Sie Ihre Bestellungen von Kalshi mit optionaler Filterung ab
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Bestelldaten und Metadaten |
| `orders` | array | Array von Auftrags-Objekten |
| `paging` | object | Paginierungscursor zum Abrufen weiterer Ergebnisse |
### `kalshi_get_order`
@@ -188,8 +188,7 @@ Rufen Sie Details zu einem bestimmten Auftrag anhand der ID von Kalshi ab
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Auftragsdaten |
| `order` | object | Auftrags-Objekt mit Details |
### `kalshi_get_orderbook`
@@ -205,8 +204,7 @@ Rufen Sie das Orderbuch (Ja- und Nein-Gebote) für einen bestimmten Markt ab
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Orderbuch-Daten und Metadaten |
| `orderbook` | object | Orderbuch mit Ja/Nein-Geboten und -Anfragen |
### `kalshi_get_trades`
@@ -223,8 +221,8 @@ Rufen Sie aktuelle Trades über alle Märkte hinweg ab
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Handelsdaten und Metadaten |
| `trades` | array | Array von Handelsobjekten |
| `paging` | object | Paginierungscursor zum Abrufen weiterer Ergebnisse |
### `kalshi_get_candlesticks`
@@ -244,8 +242,7 @@ OHLC-Kerzendaten für einen bestimmten Markt abrufen
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Kerzendaten und Metadaten |
| `candlesticks` | array | Array von OHLC-Kerzendaten |
### `kalshi_get_fills`
@@ -268,8 +265,8 @@ Ihr Portfolio abrufen
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Ausführungsdaten und Metadaten |
| `fills` | array | Array von Ausführungs-/Handelsobjekten |
| `paging` | object | Paginierungscursor zum Abrufen weiterer Ergebnisse |
### `kalshi_get_series_by_ticker`
@@ -285,8 +282,7 @@ Details einer bestimmten Marktserie nach Ticker abrufen
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Seriendaten und Metadaten |
| `series` | object | Serienobjekt mit Details |
### `kalshi_get_exchange_status`
@@ -301,8 +297,7 @@ Den aktuellen Status der Kalshi-Börse abrufen (Handel und Börsenaktivität)
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Börsenstatus-Daten und Metadaten |
| `status` | object | Börsenstatus mit trading_active und exchange_active Flags |
### `kalshi_create_order`
@@ -336,8 +331,7 @@ Eine neue Order auf einem Kalshi-Prognosemarkt erstellen
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Erstellte Auftragsdaten |
| `order` | object | Das erstellte Auftragsobjekt |
### `kalshi_cancel_order`
@@ -355,8 +349,8 @@ Einen bestehenden Auftrag auf Kalshi stornieren
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Stornierte Auftragsdaten |
| `order` | object | Das stornierte Auftragsobjekt |
| `reducedBy` | number | Anzahl der stornierten Kontrakte |
### `kalshi_amend_order`
@@ -384,8 +378,7 @@ Preis oder Menge eines bestehenden Auftrags auf Kalshi ändern
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Geänderte Auftragsdaten |
| `order` | object | Das geänderte Auftragsobjekt |
## Hinweise

View File

@@ -91,11 +91,11 @@ Führen Sie umfassende tiefgehende Recherchen im Web mit Parallel AI durch. Synt
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `status` | string | Aufgabenstatus (laufend, abgeschlossen, fehlgeschlagen) |
| `status` | string | Aufgabenstatus (abgeschlossen, fehlgeschlagen) |
| `run_id` | string | Eindeutige ID für diese Rechercheaufgabe |
| `message` | string | Statusmeldung (für laufende Aufgaben) |
| `message` | string | Statusmeldung |
| `content` | object | Rechercheergebnisse (strukturiert basierend auf output_schema) |
| `basis` | array | Zitate und Quellen mit Auszügen und Vertrauensstufen |
| `basis` | array | Zitate und Quellen mit Begründung und Vertrauensstufen |
## Hinweise

View File

@@ -51,8 +51,9 @@ Generieren Sie Vervollständigungen mit Perplexity AI-Chatmodellen
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Status des Operationserfolgs |
| `output` | object | Ergebnisse der Chat-Vervollständigung |
| `content` | string | Generierter Textinhalt |
| `model` | string | Für die Generierung verwendetes Modell |
| `usage` | object | Informationen zur Token-Nutzung |
### `perplexity_search`
@@ -76,8 +77,7 @@ Erhalte bewertete Suchergebnisse von Perplexity
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Status des Operationserfolgs |
| `output` | object | Suchergebnisse |
| `results` | array | Array von Suchergebnissen |
## Hinweise

View File

@@ -44,14 +44,14 @@ Rufen Sie eine Liste von Prognosemärkten von Polymarket mit optionaler Filterun
| `order` | string | Nein | Sortierfeld \(z.B. volumeNum, liquidityNum, startDate, endDate, createdAt\) |
| `ascending` | string | Nein | Sortierrichtung \(true für aufsteigend, false für absteigend\) |
| `tagId` | string | Nein | Nach Tag-ID filtern |
| `limit` | string | Nein | Anzahl der Ergebnisse pro Seite \(empfohlen: 25-50\) |
| `limit` | string | Nein | Anzahl der Ergebnisse pro Seite \(max 50\) |
| `offset` | string | Nein | Paginierungsoffset \(überspringe diese Anzahl an Ergebnissen\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Status des Operationserfolgs |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Marktdaten und Metadaten |
### `polymarket_get_market`
@@ -80,11 +80,11 @@ Ruft eine Liste von Events von Polymarket mit optionaler Filterung ab
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `closed` | string | Nein | Nach geschlossenem Status filtern \(true/false\). Verwenden Sie false für nur aktive Events. |
| `closed` | string | Nein | Nach geschlossenem Status filtern \(true/false\). Verwenden Sie false für nur aktive Ereignisse. |
| `order` | string | Nein | Sortierfeld \(z.B. volume, liquidity, startDate, endDate, createdAt\) |
| `ascending` | string | Nein | Sortierrichtung \(true für aufsteigend, false für absteigend\) |
| `tagId` | string | Nein | Nach Tag-ID filtern |
| `limit` | string | Nein | Anzahl der Ergebnisse pro Seite \(empfohlen: 25-50\) |
| `limit` | string | Nein | Anzahl der Ergebnisse pro Seite \(max 50\) |
| `offset` | string | Nein | Paginierungsoffset \(überspringe diese Anzahl an Ergebnissen\) |
#### Ausgabe
@@ -107,10 +107,10 @@ Ruft Details eines bestimmten Events nach ID oder Slug ab
#### Output
| Parameter | Type | Beschreibung |
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Status des Operationserfolgs |
| `output` | object | Ereignisdaten und Metadaten |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Event-Daten und Metadaten |
### `polymarket_get_tags`
@@ -118,16 +118,16 @@ Verfügbare Tags zum Filtern von Märkten von Polymarket abrufen
#### Input
| Parameter | Type | Erforderlich | Beschreibung |
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `limit` | string | Nein | Anzahl der Ergebnisse pro Seite \(empfohlen: 25-50\) |
| `limit` | string | Nein | Anzahl der Ergebnisse pro Seite \(max 50\) |
| `offset` | string | Nein | Paginierungsoffset \(überspringe diese Anzahl an Ergebnissen\) |
#### Output
| Parameter | Type | Beschreibung |
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Status des Operationserfolgs |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Tag-Daten und Metadaten |
### `polymarket_search`
@@ -136,17 +136,17 @@ Nach Märkten, Ereignissen und Profilen auf Polymarket suchen
#### Input
| Parameter | Type | Erforderlich | Beschreibung |
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `query` | string | Ja | Suchbegriff |
| `limit` | string | Nein | Anzahl der Ergebnisse pro Seite \(empfohlen: 25-50\) |
| `offset` | string | Nein | Paginierungsoffset \(überspringe diese Anzahl an Ergebnissen\) |
| `limit` | string | Nein | Anzahl der Ergebnisse pro Seite \(max 50\) |
| `offset` | string | Nein | Paginierungsoffset |
#### Output
| Parameter | Type | Beschreibung |
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Status des Operationserfolgs |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Suchergebnisse und Metadaten |
### `polymarket_get_series`
@@ -155,17 +155,16 @@ Serien (verwandte Marktgruppen) von Polymarket abrufen
#### Input
| Parameter | Type | Erforderlich | Beschreibung |
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `limit` | string | Nein | Anzahl der Ergebnisse pro Seite \(empfohlen: 25-50\) |
| `limit` | string | Nein | Anzahl der Ergebnisse pro Seite \(max 50\) |
| `offset` | string | Nein | Paginierungsoffset \(überspringe diese Anzahl an Ergebnissen\) |
#### Output
| Parameter | Type | Beschreibung |
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Seriendaten und Metadaten |
| `series` | array | Array von Serien-Objekten |
### `polymarket_get_series_by_id`
@@ -179,10 +178,9 @@ Eine bestimmte Serie (zugehörige Marktgruppe) anhand der ID von Polymarket abru
#### Output
| Parameter | Type | Beschreibung |
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Seriendaten und Metadaten |
| `series` | object | Serien-Objekt mit Details |
### `polymarket_get_orderbook`
@@ -196,10 +194,9 @@ Die Orderbuch-Zusammenfassung für einen bestimmten Token abrufen
#### Output
| Parameter | Type | Beschreibung |
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Orderbuch-Daten und Metadaten |
| `orderbook` | object | Orderbuch mit Geld- und Briefkurs-Arrays |
### `polymarket_get_price`
@@ -216,8 +213,7 @@ Den Marktpreis für einen bestimmten Token und eine bestimmte Seite abrufen
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Preisdaten und Metadaten |
| `price` | string | Marktpreis |
### `polymarket_get_midpoint`
@@ -233,8 +229,7 @@ Abrufen des Mittelpreises für einen bestimmten Token
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Mittelpreisdaten und Metadaten |
| `midpoint` | string | Mittelkurs |
### `polymarket_get_price_history`
@@ -254,8 +249,7 @@ Abrufen historischer Preisdaten für einen bestimmten Markttoken
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Preisverlaufsdaten und Metadaten |
| `history` | array | Array von Preisverlaufseinträgen mit Zeitstempel \(t\) und Preis \(p\) |
### `polymarket_get_last_trade_price`
@@ -271,8 +265,7 @@ Den letzten Handelspreis für einen bestimmten Token abrufen
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Status des Operationserfolgs |
| `output` | object | Letzter Handelspreis und Metadaten |
| `price` | string | Letzter Handelspreis |
### `polymarket_get_spread`
@@ -288,8 +281,7 @@ Die Geld-Brief-Spanne für einen bestimmten Token abrufen
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Status des Operationserfolgs |
| `output` | object | Spread-Daten und Metadaten |
| `spread` | object | Geld-Brief-Spanne mit Geld- und Briefkursen |
### `polymarket_get_tick_size`
@@ -305,8 +297,7 @@ Die minimale Tickgröße für einen bestimmten Token abrufen
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Status des Operationserfolgs |
| `output` | object | Tickgröße und Metadaten |
| `tickSize` | string | Minimale Tick-Größe |
### `polymarket_get_positions`
@@ -323,8 +314,7 @@ Benutzerpositionen von Polymarket abrufen
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Positionsdaten und Metadaten |
| `positions` | array | Array von Positions-Objekten |
### `polymarket_get_trades`
@@ -336,15 +326,14 @@ Handelshistorie von Polymarket abrufen
| --------- | ---- | -------- | ----------- |
| `user` | string | Nein | Wallet-Adresse des Benutzers zum Filtern von Trades |
| `market` | string | Nein | Markt-ID zum Filtern von Trades |
| `limit` | string | Nein | Anzahl der Ergebnisse pro Seite \(empfohlen: 25-50\) |
| `offset` | string | Nein | Paginierungsoffset \(überspringe so viele Ergebnisse\) |
| `limit` | string | Nein | Anzahl der Ergebnisse pro Seite \(max 50\) |
| `offset` | string | Nein | Paginierungsoffset \(überspringe diese Anzahl an Ergebnissen\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Handelsdaten und Metadaten |
| `trades` | array | Array von Handelsobjekten |
## Hinweise

View File

@@ -135,283 +135,684 @@ Löschen eines Kontos aus Salesforce CRM
### `salesforce_get_contacts`
Kontakt(e) aus Salesforce abrufen - einzelner Kontakt, wenn ID angegeben, oder Liste, wenn nicht
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | Nein | Keine Beschreibung |
| `instanceUrl` | string | Nein | Keine Beschreibung |
| `contactId` | string | Nein | Kontakt-ID \(wenn angegeben, wird ein einzelner Kontakt zurückgegeben\) |
| `limit` | string | Nein | Anzahl der Ergebnisse \(Standard: 100, max: 2000\). Nur für Listenabfrage. |
| `fields` | string | Nein | Kommagetrennte Felder \(z.B. "Id,FirstName,LastName,Email,Phone"\) |
| `orderBy` | string | Nein | Sortierfeld \(z.B. "LastName ASC"\). Nur für Listenabfrage. |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Status des Operationserfolgs |
| `output` | json | Ergebnisdaten der Operation |
| `output` | object | Kontaktdaten |
### `salesforce_create_contact`
Einen neuen Kontakt im Salesforce CRM erstellen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | Nein | Keine Beschreibung |
| `instanceUrl` | string | Nein | Keine Beschreibung |
| `lastName` | string | Ja | Nachname \(erforderlich\) |
| `firstName` | string | Nein | Vorname |
| `email` | string | Nein | E-Mail-Adresse |
| `phone` | string | Nein | Telefonnummer |
| `accountId` | string | Nein | Konto-ID, mit der der Kontakt verknüpft werden soll |
| `title` | string | Nein | Keine Beschreibung |
| `department` | string | Nein | Abteilung |
| `mailingStreet` | string | Nein | Postanschrift \(Straße\) |
| `mailingCity` | string | Nein | Postanschrift \(Stadt\) |
| `mailingState` | string | Nein | Postanschrift \(Bundesland\) |
| `mailingPostalCode` | string | Nein | Postanschrift \(Postleitzahl\) |
| `mailingCountry` | string | Nein | Postanschrift \(Land\) |
| `description` | string | Nein | Kontaktbeschreibung |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Status des Operationserfolgs |
| `output` | json | Ergebnisdaten der Operation |
| `output` | object | Daten des erstellten Kontakts |
### `salesforce_update_contact`
Aktualisieren eines bestehenden Kontakts in Salesforce CRM
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | Nein | Keine Beschreibung |
| `instanceUrl` | string | Nein | Keine Beschreibung |
| `contactId` | string | Ja | Zu aktualisierende Kontakt-ID \(erforderlich\) |
| `lastName` | string | Nein | Nachname |
| `firstName` | string | Nein | Vorname |
| `email` | string | Nein | E-Mail-Adresse |
| `phone` | string | Nein | Telefonnummer |
| `accountId` | string | Nein | Zu verknüpfende Konto-ID |
| `title` | string | Nein | Keine Beschreibung |
| `department` | string | Nein | Abteilung |
| `mailingStreet` | string | Nein | Postanschrift (Straße) |
| `mailingCity` | string | Nein | Postanschrift (Stadt) |
| `mailingState` | string | Nein | Postanschrift (Bundesland) |
| `mailingPostalCode` | string | Nein | Postanschrift (Postleitzahl) |
| `mailingCountry` | string | Nein | Postanschrift (Land) |
| `description` | string | Nein | Beschreibung |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Status des Operationserfolgs |
| `output` | json | Ergebnisdaten der Operation |
| `output` | object | Daten des aktualisierten Kontakts |
### `salesforce_delete_contact`
Löschen eines Kontakts aus Salesforce CRM
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | Nein | Keine Beschreibung |
| `instanceUrl` | string | Nein | Keine Beschreibung |
| `contactId` | string | Ja | Zu löschende Kontakt-ID \(erforderlich\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Status des Operationserfolgs |
| `output` | json | Ergebnisdaten der Operation |
| `output` | object | Daten des gelöschten Kontakts |
### `salesforce_get_leads`
Lead(s) aus Salesforce abrufen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | Nein | Keine Beschreibung |
| `instanceUrl` | string | Nein | Keine Beschreibung |
| `leadId` | string | Nein | Lead-ID \(optional\) |
| `limit` | string | Nein | Maximale Ergebnisse \(Standard: 100\) |
| `fields` | string | Nein | Kommagetrennte Felder |
| `orderBy` | string | Nein | Sortierfeld |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Status des Operationserfolgs |
| `output` | json | Ergebnisdaten der Operation |
| `success` | boolean | Erfolgsstatus |
| `output` | object | Lead-Daten |
### `salesforce_create_lead`
Einen neuen Lead erstellen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | Nein | Keine Beschreibung |
| `instanceUrl` | string | Nein | Keine Beschreibung |
| `lastName` | string | Ja | Nachname \(erforderlich\) |
| `company` | string | Ja | Unternehmen \(erforderlich\) |
| `firstName` | string | Nein | Vorname |
| `email` | string | Nein | Keine Beschreibung |
| `phone` | string | Nein | Keine Beschreibung |
| `status` | string | Nein | Lead-Status |
| `leadSource` | string | Nein | Lead-Quelle |
| `title` | string | Nein | Keine Beschreibung |
| `description` | string | Nein | Beschreibung |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Status des Operationserfolgs |
| `output` | json | Ergebnisdaten der Operation |
| `success` | boolean | Erfolg |
| `output` | object | Erstellter Lead |
### `salesforce_update_lead`
Aktualisieren eines vorhandenen Leads
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | Nein | Keine Beschreibung |
| `instanceUrl` | string | Nein | Keine Beschreibung |
| `leadId` | string | Ja | Lead-ID (erforderlich) |
| `lastName` | string | Nein | Nachname |
| `company` | string | Nein | Keine Beschreibung |
| `firstName` | string | Nein | Vorname |
| `email` | string | Nein | Keine Beschreibung |
| `phone` | string | Nein | Keine Beschreibung |
| `status` | string | Nein | Lead-Status |
| `leadSource` | string | Nein | Lead-Quelle |
| `title` | string | Nein | Keine Beschreibung |
| `description` | string | Nein | Beschreibung |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Status des Operationserfolgs |
| `output` | json | Ergebnisdaten der Operation |
| `success` | boolean | Erfolg |
| `output` | object | Aktualisierter Lead |
### `salesforce_delete_lead`
Löschen eines Leads
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | Nein | Keine Beschreibung |
| `instanceUrl` | string | Nein | Keine Beschreibung |
| `leadId` | string | Ja | Lead-ID (erforderlich) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Status des Operationserfolgs |
| `output` | json | Ergebnisdaten der Operation |
| `success` | boolean | Erfolg |
| `output` | object | Gelöschter Lead |
### `salesforce_get_opportunities`
Verkaufschance(n) aus Salesforce abrufen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | Nein | Keine Beschreibung |
| `instanceUrl` | string | Nein | Keine Beschreibung |
| `opportunityId` | string | Nein | Verkaufschancen-ID \(optional\) |
| `limit` | string | Nein | Maximale Ergebnisse \(Standard: 100\) |
| `fields` | string | Nein | Kommagetrennte Felder |
| `orderBy` | string | Nein | Sortierfeld |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Status des Operationserfolgs |
| `output` | json | Ergebnisdaten der Operation |
| `success` | boolean | Erfolg |
| `output` | object | Verkaufschancendaten |
### `salesforce_create_opportunity`
Eine neue Verkaufschance erstellen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | Nein | Keine Beschreibung |
| `instanceUrl` | string | Nein | Keine Beschreibung |
| `name` | string | Ja | Name der Verkaufschance \(erforderlich\) |
| `stageName` | string | Ja | Phasenname \(erforderlich\) |
| `closeDate` | string | Ja | Abschlussdatum JJJJ-MM-TT \(erforderlich\) |
| `accountId` | string | Nein | Konto-ID |
| `amount` | string | Nein | Betrag \(Zahl\) |
| `probability` | string | Nein | Wahrscheinlichkeit \(0-100\) |
| `description` | string | Nein | Beschreibung |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Status des Operationserfolgs |
| `output` | json | Ergebnisdaten der Operation |
| `success` | boolean | Erfolg |
| `output` | object | Erstellte Verkaufschance |
### `salesforce_update_opportunity`
Aktualisieren einer bestehenden Verkaufschance
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | Nein | Keine Beschreibung |
| `instanceUrl` | string | Nein | Keine Beschreibung |
| `opportunityId` | string | Ja | Verkaufschancen-ID (erforderlich) |
| `name` | string | Nein | Name der Verkaufschance |
| `stageName` | string | Nein | Phasenname |
| `closeDate` | string | Nein | Abschlussdatum JJJJ-MM-TT |
| `accountId` | string | Nein | Konto-ID |
| `amount` | string | Nein | Keine Beschreibung |
| `probability` | string | Nein | Wahrscheinlichkeit (0-100) |
| `description` | string | Nein | Beschreibung |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Status des Operationserfolgs |
| `output` | json | Ergebnisdaten der Operation |
| `success` | boolean | Erfolg |
| `output` | object | Aktualisierte Verkaufschance |
### `salesforce_delete_opportunity`
Löschen einer Verkaufschance
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | Nein | Keine Beschreibung |
| `instanceUrl` | string | Nein | Keine Beschreibung |
| `opportunityId` | string | Ja | Verkaufschancen-ID (erforderlich) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Status des Operationserfolgs |
| `output` | json | Ergebnisdaten der Operation |
| `success` | boolean | Erfolg |
| `output` | object | Gelöschte Verkaufschance |
### `salesforce_get_cases`
Fall/Fälle aus Salesforce abrufen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | Nein | Keine Beschreibung |
| `instanceUrl` | string | Nein | Keine Beschreibung |
| `caseId` | string | Nein | Fall-ID \(optional\) |
| `limit` | string | Nein | Maximale Ergebnisse \(Standard: 100\) |
| `fields` | string | Nein | Kommagetrennte Felder |
| `orderBy` | string | Nein | Sortierfeld |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Status des Operationserfolgs |
| `output` | json | Ergebnisdaten der Operation |
| `success` | boolean | Erfolg |
| `output` | object | Falldaten |
### `salesforce_create_case`
Einen neuen Fall erstellen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | Nein | Keine Beschreibung |
| `instanceUrl` | string | Nein | Keine Beschreibung |
| `subject` | string | Ja | Fallbetreff \(erforderlich\) |
| `status` | string | Nein | Status \(z.B. Neu, In Bearbeitung, Eskaliert\) |
| `priority` | string | Nein | Priorität \(z.B. Niedrig, Mittel, Hoch\) |
| `origin` | string | Nein | Ursprung \(z.B. Telefon, E-Mail, Web\) |
| `contactId` | string | Nein | Kontakt-ID |
| `accountId` | string | Nein | Konto-ID |
| `description` | string | Nein | Beschreibung |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Status des Operationserfolgs |
| `output` | json | Ergebnisdaten der Operation |
| `success` | boolean | Erfolg |
| `output` | object | Erstellter Fall |
### `salesforce_update_case`
Aktualisieren eines vorhandenen Falls
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | Nein | Keine Beschreibung |
| `instanceUrl` | string | Nein | Keine Beschreibung |
| `caseId` | string | Ja | Fall-ID \(erforderlich\) |
| `subject` | string | Nein | Fallbetreff |
| `status` | string | Nein | Status |
| `priority` | string | Nein | Priorität |
| `description` | string | Nein | Beschreibung |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Status des Operationserfolgs |
| `output` | json | Ergebnisdaten der Operation |
| `success` | boolean | Erfolg |
| `output` | object | Aktualisierter Fall |
### `salesforce_delete_case`
Löschen eines Falls
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | Nein | Keine Beschreibung |
| `instanceUrl` | string | Nein | Keine Beschreibung |
| `caseId` | string | Ja | Fall-ID \(erforderlich\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Status des Operationserfolgs |
| `output` | json | Ergebnisdaten der Operation |
| `success` | boolean | Erfolg |
| `output` | object | Gelöschter Fall |
### `salesforce_get_tasks`
Aufgabe(n) von Salesforce abrufen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | Nein | Keine Beschreibung |
| `instanceUrl` | string | Nein | Keine Beschreibung |
| `taskId` | string | Nein | Aufgaben-ID \(optional\) |
| `limit` | string | Nein | Maximale Ergebnisse \(Standard: 100\) |
| `fields` | string | Nein | Kommagetrennte Felder |
| `orderBy` | string | Nein | Sortierfeld |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Status des Operationserfolgs |
| `output` | json | Ergebnisdaten der Operation |
| `success` | boolean | Erfolgsstatus |
| `output` | object | Aufgabendaten |
### `salesforce_create_task`
Neue Aufgabe erstellen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | Nein | Keine Beschreibung |
| `instanceUrl` | string | Nein | Keine Beschreibung |
| `subject` | string | Ja | Aufgabenbetreff \(erforderlich\) |
| `status` | string | Nein | Status \(z.B. Nicht begonnen, In Bearbeitung, Abgeschlossen\) |
| `priority` | string | Nein | Priorität \(z.B. Niedrig, Normal, Hoch\) |
| `activityDate` | string | Nein | Fälligkeitsdatum JJJJ-MM-TT |
| `whoId` | string | Nein | Zugehörige Kontakt-/Lead-ID |
| `whatId` | string | Nein | Zugehörige Konto-/Opportunity-ID |
| `description` | string | Nein | Beschreibung |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Status des Operationserfolgs |
| `output` | json | Ergebnisdaten der Operation |
| `success` | boolean | Erfolgsstatus |
| `output` | object | Erstellte Aufgabe |
### `salesforce_update_task`
Bestehende Aufgabe aktualisieren
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | Nein | Keine Beschreibung |
| `instanceUrl` | string | Nein | Keine Beschreibung |
| `taskId` | string | Ja | Aufgaben-ID \(erforderlich\) |
| `subject` | string | Nein | Aufgabenbetreff |
| `status` | string | Nein | Status |
| `priority` | string | Nein | Priorität |
| `activityDate` | string | Nein | Fälligkeitsdatum JJJJ-MM-TT |
| `description` | string | Nein | Beschreibung |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Status des Operationserfolgs |
| `output` | json | Ergebnisdaten der Operation |
| `success` | boolean | Erfolg |
| `output` | object | Aktualisierte Aufgabe |
### `salesforce_delete_task`
Aufgabe löschen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | Nein | Keine Beschreibung |
| `instanceUrl` | string | Nein | Keine Beschreibung |
| `taskId` | string | Ja | Aufgaben-ID \(erforderlich\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Status des Operationserfolgs |
| `output` | json | Ergebnisdaten der Operation |
| `success` | boolean | Erfolg |
| `output` | object | Gelöschte Aufgabe |
### `salesforce_list_reports`
Liste der für den aktuellen Benutzer zugänglichen Berichte abrufen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | Nein | Keine Beschreibung |
| `instanceUrl` | string | Nein | Keine Beschreibung |
| `folderName` | string | Nein | Nach Ordnernamen filtern |
| `searchTerm` | string | Nein | Suchbegriff zum Filtern von Berichten nach Namen |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus |
| `output` | object | Berichtsdaten |
### `salesforce_get_report`
Metadaten und Beschreibungsinformationen für einen bestimmten Bericht abrufen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | Nein | Keine Beschreibung |
| `instanceUrl` | string | Nein | Keine Beschreibung |
| `reportId` | string | Ja | Berichts-ID \(erforderlich\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus |
| `output` | object | Berichtsmetadaten |
### `salesforce_run_report`
Einen Bericht ausführen und die Ergebnisse abrufen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | Nein | Keine Beschreibung |
| `instanceUrl` | string | Nein | Keine Beschreibung |
| `reportId` | string | Ja | Berichts-ID \(erforderlich\) |
| `includeDetails` | string | Nein | Detailzeilen einschließen \(true/false, Standard: true\) |
| `filters` | string | Nein | JSON-String der anzuwendenden Berichtsfilter |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus |
| `output` | object | Berichtsergebnisse |
### `salesforce_list_report_types`
Eine Liste der verfügbaren Berichtstypen abrufen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | Nein | Keine Beschreibung |
| `instanceUrl` | string | Nein | Keine Beschreibung |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus |
| `output` | object | Daten zu Berichtstypen |
### `salesforce_list_dashboards`
Eine Liste der für den aktuellen Benutzer zugänglichen Dashboards abrufen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | Nein | Keine Beschreibung |
| `instanceUrl` | string | Nein | Keine Beschreibung |
| `folderName` | string | Nein | Nach Ordnernamen filtern |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus |
| `output` | object | Dashboard-Daten |
### `salesforce_get_dashboard`
Details und Ergebnisse für ein bestimmtes Dashboard abrufen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | Nein | Keine Beschreibung |
| `instanceUrl` | string | Nein | Keine Beschreibung |
| `dashboardId` | string | Ja | Dashboard-ID \(erforderlich\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus |
| `output` | object | Dashboard-Daten |
### `salesforce_refresh_dashboard`
Ein Dashboard aktualisieren, um die neuesten Daten zu erhalten
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | Nein | Keine Beschreibung |
| `instanceUrl` | string | Nein | Keine Beschreibung |
| `dashboardId` | string | Ja | Dashboard-ID \(erforderlich\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus |
| `output` | object | Aktualisierte Dashboard-Daten |
### `salesforce_query`
Eine benutzerdefinierte SOQL-Abfrage ausführen, um Daten aus Salesforce abzurufen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | Nein | Keine Beschreibung |
| `instanceUrl` | string | Nein | Keine Beschreibung |
| `query` | string | Ja | SOQL-Abfrage zur Ausführung \(z.B. SELECT Id, Name FROM Account LIMIT 10\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus |
| `output` | object | Abfrageergebnisse |
### `salesforce_query_more`
Abrufen zusätzlicher Abfrageergebnisse mit der nextRecordsUrl aus einer vorherigen Abfrage
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | Nein | Keine Beschreibung |
| `instanceUrl` | string | Nein | Keine Beschreibung |
| `nextRecordsUrl` | string | Ja | Die nextRecordsUrl aus einer vorherigen Abfrageantwort |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus |
| `output` | object | Abfrageergebnisse |
### `salesforce_describe_object`
Metadaten und Feldinformationen für ein Salesforce-Objekt abrufen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | Nein | Keine Beschreibung |
| `instanceUrl` | string | Nein | Keine Beschreibung |
| `objectName` | string | Ja | API-Name des Objekts \(z.B. Account, Contact, Lead, Custom_Object__c\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus |
| `output` | object | Objekt-Metadaten |
### `salesforce_list_objects`
Liste aller verfügbaren Salesforce-Objekte abrufen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | Nein | Keine Beschreibung |
| `instanceUrl` | string | Nein | Keine Beschreibung |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus |
| `output` | object | Objektliste |
## Hinweise

View File

@@ -342,19 +342,30 @@ Eine E-Mail-Vorlage von SendGrid löschen
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `messageId` | string | E-Mail-Nachrichten-ID (send_mail) |
| `message` | string | Status- oder Erfolgsmeldung |
| `messageId` | string | E-Mail-Nachrichten-ID \(send_mail\) |
| `to` | string | E-Mail-Adresse des Empfängers \(send_mail\) |
| `subject` | string | E-Mail-Betreff \(send_mail, create_template_version\) |
| `id` | string | Ressourcen-ID |
| `jobId` | string | Job-ID für asynchrone Operationen |
| `email` | string | E-Mail-Adresse |
| `firstName` | string | Vorname |
| `lastName` | string | Nachname |
| `email` | string | E-Mail-Adresse des Kontakts |
| `firstName` | string | Vorname des Kontakts |
| `lastName` | string | Nachname des Kontakts |
| `createdAt` | string | Erstellungszeitstempel |
| `updatedAt` | string | Zeitstempel der letzten Aktualisierung |
| `listIds` | json | Array von Listen-IDs, zu denen der Kontakt gehört |
| `customFields` | json | Benutzerdefinierte Feldwerte |
| `contacts` | json | Array von Kontakten |
| `contactCount` | number | Anzahl der Kontakte |
| `lists` | json | Array von Listen |
| `templates` | json | Array von Vorlagen |
| `message` | string | Status- oder Erfolgsmeldung |
| `name` | string | Ressourcenname |
| `templates` | json | Array von Vorlagen |
| `generation` | string | Vorlagengeneration |
| `versions` | json | Array von Vorlagenversionen |
| `templateId` | string | Vorlagen-ID |
| `active` | boolean | Ob die Vorlagenversion aktiv ist |
| `htmlContent` | string | HTML-Inhalt |
| `plainContent` | string | Nur-Text-Inhalt |
### `sendgrid_create_template_version`

View File

@@ -0,0 +1,183 @@
---
title: SFTP
description: Übertragen Sie Dateien über SFTP (SSH File Transfer Protocol)
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="sftp"
color="#2D3748"
/>
{/* MANUAL-CONTENT-START:intro */}
[SFTP (SSH File Transfer Protocol)](https://en.wikipedia.org/wiki/SSH_File_Transfer_Protocol) ist ein sicheres Netzwerkprotokoll, das es Ihnen ermöglicht, Dateien auf entfernten Servern hochzuladen, herunterzuladen und zu verwalten. SFTP arbeitet über SSH und ist damit ideal für automatisierte, verschlüsselte Dateiübertragungen und die Fernverwaltung von Dateien in modernen Arbeitsabläufen.
Mit den in Sim integrierten SFTP-Tools können Sie die Übertragung von Dateien zwischen Ihren KI-Agenten und externen Systemen oder Servern einfach automatisieren. Dies ermöglicht Ihren Agenten, kritische Datenaustausche, Backups, Dokumentenerstellung und die Orchestrierung entfernter Systeme alles mit robuster Sicherheit zu verwalten.
**Wichtige Funktionen, die über SFTP-Tools verfügbar sind:**
- **Dateien hochladen:** Übertragen Sie nahtlos Dateien jeder Art von Ihrem Workflow auf einen entfernten Server, mit Unterstützung für Passwort- und SSH-Private-Key-Authentifizierung.
- **Dateien herunterladen:** Rufen Sie Dateien von entfernten SFTP-Servern direkt zur Verarbeitung, Archivierung oder weiteren Automatisierung ab.
- **Dateien auflisten & verwalten:** Verzeichnisse auflisten, Dateien und Ordner löschen oder erstellen und Dateisystemberechtigungen ferngesteuert verwalten.
- **Flexible Authentifizierung:** Verbinden Sie sich entweder mit herkömmlichen Passwörtern oder SSH-Schlüsseln, mit Unterstützung für Passphrasen und Berechtigungskontrolle.
- **Unterstützung großer Dateien:** Verwalten Sie programmatisch große Datei-Uploads und -Downloads, mit integrierten Größenbeschränkungen für die Sicherheit.
Durch die Integration von SFTP in Sim können Sie sichere Dateioperationen als Teil jedes Workflows automatisieren, sei es Datenerfassung, Berichterstattung, Wartung entfernter Systeme oder dynamischer Inhaltsaustausch zwischen Plattformen.
Die folgenden Abschnitte beschreiben die wichtigsten verfügbaren SFTP-Tools:
- **sftp_upload:** Laden Sie eine oder mehrere Dateien auf einen entfernten Server hoch.
- **sftp_download:** Laden Sie Dateien von einem entfernten Server in Ihren Workflow herunter.
- **sftp_list:** Listen Sie Verzeichnisinhalte auf einem entfernten SFTP-Server auf.
- **sftp_delete:** Löschen Sie Dateien oder Verzeichnisse von einem entfernten Server.
- **sftp_create:** Erstellen Sie neue Dateien auf einem entfernten SFTP-Server.
- **sftp_mkdir:** Erstellen Sie neue Verzeichnisse aus der Ferne.
Siehe die Werkzeugdokumentation unten für detaillierte Ein- und Ausgabeparameter für jede Operation.
{/* MANUAL-CONTENT-END */}
## Nutzungsanweisungen
Dateien auf Remote-Servern über SFTP hochladen, herunterladen, auflisten und verwalten. Unterstützt sowohl Passwort- als auch Private-Key-Authentifizierung für sichere Dateiübertragungen.
## Werkzeuge
### `sftp_upload`
Dateien auf einen Remote-SFTP-Server hochladen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `host` | string | Ja | SFTP-Server-Hostname oder IP-Adresse |
| `port` | number | Ja | SFTP-Server-Port \(Standard: 22\) |
| `username` | string | Ja | SFTP-Benutzername |
| `password` | string | Nein | Passwort für die Authentifizierung \(wenn kein Private Key verwendet wird\) |
| `privateKey` | string | Nein | Private Key für die Authentifizierung \(OpenSSH-Format\) |
| `passphrase` | string | Nein | Passphrase für verschlüsselten Private Key |
| `remotePath` | string | Ja | Zielverzeichnis auf dem Remote-Server |
| `files` | file[] | Nein | Hochzuladende Dateien |
| `fileContent` | string | Nein | Direkter Dateiinhalt zum Hochladen \(für Textdateien\) |
| `fileName` | string | Nein | Dateiname bei Verwendung von direktem Inhalt |
| `overwrite` | boolean | Nein | Ob bestehende Dateien überschrieben werden sollen \(Standard: true\) |
| `permissions` | string | Nein | Dateiberechtigungen \(z.B. 0644\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Ob der Upload erfolgreich war |
| `uploadedFiles` | json | Array mit Details zu hochgeladenen Dateien \(Name, remotePath, Größe\) |
| `message` | string | Statusmeldung des Vorgangs |
### `sftp_download`
Datei von einem entfernten SFTP-Server herunterladen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `host` | string | Ja | SFTP-Server-Hostname oder IP-Adresse |
| `port` | number | Ja | SFTP-Server-Port \(Standard: 22\) |
| `username` | string | Ja | SFTP-Benutzername |
| `password` | string | Nein | Passwort für die Authentifizierung \(wenn kein privater Schlüssel verwendet wird\) |
| `privateKey` | string | Nein | Privater Schlüssel für die Authentifizierung \(OpenSSH-Format\) |
| `passphrase` | string | Nein | Passphrase für verschlüsselten privaten Schlüssel |
| `remotePath` | string | Ja | Pfad zur Datei auf dem entfernten Server |
| `encoding` | string | Nein | Ausgabe-Kodierung: utf-8 für Text, base64 für Binärdaten \(Standard: utf-8\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Ob der Download erfolgreich war |
| `fileName` | string | Name der heruntergeladenen Datei |
| `content` | string | Dateiinhalt \(Text oder base64-kodiert\) |
| `size` | number | Dateigröße in Bytes |
| `encoding` | string | Inhaltskodierung \(utf-8 oder base64\) |
| `message` | string | Statusmeldung des Vorgangs |
### `sftp_list`
Dateien und Verzeichnisse auf einem entfernten SFTP-Server auflisten
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `host` | string | Ja | SFTP-Server-Hostname oder IP-Adresse |
| `port` | number | Ja | SFTP-Server-Port \(Standard: 22\) |
| `username` | string | Ja | SFTP-Benutzername |
| `password` | string | Nein | Passwort für die Authentifizierung \(wenn kein privater Schlüssel verwendet wird\) |
| `privateKey` | string | Nein | Privater Schlüssel für die Authentifizierung \(OpenSSH-Format\) |
| `passphrase` | string | Nein | Passphrase für verschlüsselten privaten Schlüssel |
| `remotePath` | string | Ja | Verzeichnispfad auf dem entfernten Server |
| `detailed` | boolean | Nein | Detaillierte Dateiinformationen einschließen \(Größe, Berechtigungen, Änderungsdatum\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Ob der Vorgang erfolgreich war |
| `path` | string | Verzeichnispfad, der aufgelistet wurde |
| `entries` | json | Array von Verzeichniseinträgen mit Name, Typ, Größe, Berechtigungen, modifiedAt |
| `count` | number | Anzahl der Einträge im Verzeichnis |
| `message` | string | Statusmeldung des Vorgangs |
### `sftp_delete`
Löschen einer Datei oder eines Verzeichnisses auf einem entfernten SFTP-Server
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `host` | string | Ja | SFTP-Server-Hostname oder IP-Adresse |
| `port` | number | Ja | SFTP-Server-Port \(Standard: 22\) |
| `username` | string | Ja | SFTP-Benutzername |
| `password` | string | Nein | Passwort für die Authentifizierung \(wenn kein privater Schlüssel verwendet wird\) |
| `privateKey` | string | Nein | Privater Schlüssel für die Authentifizierung \(OpenSSH-Format\) |
| `passphrase` | string | Nein | Passphrase für verschlüsselten privaten Schlüssel |
| `remotePath` | string | Ja | Pfad zur Datei oder zum Verzeichnis, das gelöscht werden soll |
| `recursive` | boolean | Nein | Verzeichnisse rekursiv löschen |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Ob das Löschen erfolgreich war |
| `deletedPath` | string | Pfad, der gelöscht wurde |
| `message` | string | Statusmeldung des Vorgangs |
### `sftp_mkdir`
Ein Verzeichnis auf einem entfernten SFTP-Server erstellen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `host` | string | Ja | SFTP-Server-Hostname oder IP-Adresse |
| `port` | number | Ja | SFTP-Server-Port \(Standard: 22\) |
| `username` | string | Ja | SFTP-Benutzername |
| `password` | string | Nein | Passwort für die Authentifizierung \(wenn kein privater Schlüssel verwendet wird\) |
| `privateKey` | string | Nein | Privater Schlüssel für die Authentifizierung \(OpenSSH-Format\) |
| `passphrase` | string | Nein | Passphrase für verschlüsselten privaten Schlüssel |
| `remotePath` | string | Ja | Pfad für das neue Verzeichnis |
| `recursive` | boolean | Nein | Übergeordnete Verzeichnisse erstellen, falls sie nicht existieren |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Ob das Verzeichnis erfolgreich erstellt wurde |
| `createdPath` | string | Pfad des erstellten Verzeichnisses |
| `message` | string | Statusmeldung des Vorgangs |
## Hinweise
- Kategorie: `tools`
- Typ: `sftp`

View File

@@ -7,7 +7,7 @@ import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="smtp"
color="#4A5568"
color="#2D3748"
/>
{/* MANUAL-CONTENT-START:intro */}

View File

@@ -37,7 +37,7 @@ Verarbeitet einen bereitgestellten Gedanken/eine Anweisung und macht ihn für na
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `thought` | string | Ja | Der vom Benutzer im Thinking Step-Block bereitgestellte Denkprozess oder die Anweisung. |
| `thought` | string | Ja | Ihre interne Argumentation, Analyse oder Denkprozess. Nutzen Sie dies, um das Problem Schritt für Schritt zu durchdenken, bevor Sie antworten. |
#### Output

View File

@@ -31,39 +31,32 @@ Integrieren Sie Übersetzen in den Workflow. Kann Text in jede Sprache übersetz
## Tools
### `openai_chat`
### `llm_chat`
Senden Sie eine Chat-Completion-Anfrage an jeden unterstützten LLM-Anbieter
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `model` | string | Ja | Das zu verwendende Modell (z.B. gpt-4o, claude-sonnet-4-5, gemini-2.0-flash) |
| `systemPrompt` | string | Nein | System-Prompt zur Festlegung des Assistentenverhaltens |
| `context` | string | Ja | Die Benutzernachricht oder der Kontext, der an das Modell gesendet wird |
| `apiKey` | string | Nein | API-Schlüssel für den Anbieter (verwendet den Plattformschlüssel, wenn für gehostete Modelle nicht angegeben) |
| `temperature` | number | Nein | Temperatur für die Antwortgenerierung (0-2) |
| `maxTokens` | number | Nein | Maximale Tokens in der Antwort |
| `azureEndpoint` | string | Nein | Azure OpenAI-Endpunkt-URL |
| `azureApiVersion` | string | Nein | Azure OpenAI API-Version |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `content` | string | Übersetzter Text |
| `model` | string | Verwendetes Modell |
| `tokens` | json | Token-Nutzung |
| `content` | string | Der generierte Antwortinhalt |
| `model` | string | Das für die Generierung verwendete Modell |
| `tokens` | object | Informationen zur Token-Nutzung |
### `anthropic_chat`
### `google_chat`
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `content` | string | Übersetzter Text |
| `model` | string | Verwendetes Modell |
| `tokens` | json | Token-Nutzung |
## Notizen
## Hinweise
- Kategorie: `tools`
- Typ: `translate`

View File

@@ -250,9 +250,9 @@ Eine Mediendatei (Bild, Video, Dokument) zu WordPress.com hochladen
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `siteId` | string | Ja | WordPress.com-Website-ID oder Domain \(z.B. 12345678 oder meinwebsite.wordpress.com\) |
| `file` | string | Ja | Base64-kodierte Dateidaten oder URL, von der die Datei abgerufen werden soll |
| `filename` | string | Ja | Dateiname mit Erweiterung \(z.B. bild.jpg\) |
| `siteId` | string | Ja | WordPress.com-Site-ID oder Domain \(z.B. 12345678 oder mysite.wordpress.com\) |
| `file` | file | Nein | Hochzuladende Datei \(UserFile-Objekt\) |
| `filename` | string | Nein | Optionale Überschreibung des Dateinamens \(z.B. bild.jpg\) |
| `title` | string | Nein | Medientitel |
| `caption` | string | Nein | Medienunterschrift |
| `altText` | string | Nein | Alternativer Text für Barrierefreiheit |

View File

@@ -170,28 +170,9 @@ Videos aus einer YouTube-Playlist abrufen.
| --------- | ---- | ----------- |
| `items` | array | Array von Videos in der Playlist |
### `youtube_related_videos`
Finde Videos, die mit einem bestimmten YouTube-Video verwandt sind.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `videoId` | string | Ja | YouTube-Video-ID, für die verwandte Videos gefunden werden sollen |
| `maxResults` | number | Nein | Maximale Anzahl der zurückzugebenden verwandten Videos \(1-50\) |
| `pageToken` | string | Nein | Page-Token für Paginierung |
| `apiKey` | string | Ja | YouTube API-Schlüssel |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `items` | array | Array von verwandten Videos |
### `youtube_comments`
Rufe Kommentare von einem YouTube-Video ab.
Kommentare von einem YouTube-Video abrufen.
#### Eingabe
@@ -200,7 +181,7 @@ Rufe Kommentare von einem YouTube-Video ab.
| `videoId` | string | Ja | YouTube-Video-ID |
| `maxResults` | number | Nein | Maximale Anzahl der zurückzugebenden Kommentare |
| `order` | string | Nein | Reihenfolge der Kommentare: time oder relevance |
| `pageToken` | string | Nein | Page-Token für Paginierung |
| `pageToken` | string | Nein | Seitentoken für Paginierung |
| `apiKey` | string | Ja | YouTube API-Schlüssel |
#### Ausgabe

View File

@@ -73,8 +73,9 @@ Eine Liste von Tickets aus Zendesk mit optionaler Filterung abrufen
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Ticket-Daten und Metadaten |
| `tickets` | array | Array von Ticket-Objekten |
| `paging` | object | Paginierungsinformationen |
| `metadata` | object | Operationsmetadaten |
### `zendesk_get_ticket`
@@ -93,8 +94,8 @@ Ein einzelnes Ticket anhand der ID von Zendesk abrufen
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Ticket-Daten |
| `ticket` | object | Ticket-Objekt |
| `metadata` | object | Operationsmetadaten |
### `zendesk_create_ticket`
@@ -120,10 +121,10 @@ Ein neues Ticket in Zendesk erstellen mit Unterstützung für benutzerdefinierte
#### Output
| Parameter | Type | Description |
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Erstellte Ticket-Daten |
| `ticket` | object | Erstelltes Ticket-Objekt |
| `metadata` | object | Operationsmetadaten |
### `zendesk_create_tickets_bulk`
@@ -140,10 +141,10 @@ Erstellen Sie mehrere Tickets in Zendesk auf einmal (maximal 100)
#### Output
| Parameter | Type | Description |
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Status des Massenerstell-Jobs |
| `jobStatus` | object | Job-Status-Objekt |
| `metadata` | object | Operationsmetadaten |
### `zendesk_update_ticket`
@@ -171,8 +172,8 @@ Aktualisieren Sie ein bestehendes Ticket in Zendesk mit Unterstützung für benu
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Status des Operationserfolgs |
| `output` | object | Aktualisierte Ticket-Daten |
| `ticket` | object | Aktualisiertes Ticket-Objekt |
| `metadata` | object | Operationsmetadaten |
### `zendesk_update_tickets_bulk`
@@ -196,8 +197,8 @@ Mehrere Tickets in Zendesk auf einmal aktualisieren (max. 100)
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Status des Operationserfolgs |
| `output` | object | Status des Massenaktualisierungsauftrags |
| `jobStatus` | object | Job-Status-Objekt |
| `metadata` | object | Operationsmetadaten |
### `zendesk_delete_ticket`
@@ -216,8 +217,8 @@ Ein Ticket aus Zendesk löschen
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Status des Operationserfolgs |
| `output` | object | Löschbestätigung |
| `deleted` | boolean | Löschvorgang erfolgreich |
| `metadata` | object | Operationsmetadaten |
### `zendesk_merge_tickets`
@@ -238,8 +239,8 @@ Mehrere Tickets in ein Zielticket zusammenführen
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Status des Operationserfolgs |
| `output` | object | Status des Zusammenführungsauftrags |
| `jobStatus` | object | Job-Status-Objekt |
| `metadata` | object | Operationsmetadaten |
### `zendesk_get_users`
@@ -261,8 +262,9 @@ Eine Liste von Benutzern aus Zendesk mit optionaler Filterung abrufen
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Status des Operationserfolgs |
| `output` | object | Benutzerdaten und Metadaten |
| `users` | array | Array von Benutzerobjekten |
| `paging` | object | Paginierungsinformationen |
| `metadata` | object | Operationsmetadaten |
### `zendesk_get_user`
@@ -281,8 +283,8 @@ Einen einzelnen Benutzer anhand der ID von Zendesk abrufen
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Status des Operationserfolgs |
| `output` | object | Benutzerdaten |
| `user` | object | Benutzerobjekt |
| `metadata` | object | Operationsmetadaten |
### `zendesk_get_current_user`
@@ -300,8 +302,8 @@ Den aktuell authentifizierten Benutzer von Zendesk abrufen
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Status des Operationserfolgs |
| `output` | object | Daten des aktuellen Benutzers |
| `user` | object | Aktuelles Benutzerobjekt |
| `metadata` | object | Operationsmetadaten |
### `zendesk_search_users`
@@ -323,8 +325,9 @@ Nach Benutzern in Zendesk mit einer Abfragezeichenfolge suchen
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Status des Operationserfolgs |
| `output` | object | Suchergebnisse für Benutzer |
| `users` | array | Array von Benutzerobjekten |
| `paging` | object | Paginierungsinformationen |
| `metadata` | object | Operationsmetadaten |
### `zendesk_create_user`
@@ -348,10 +351,10 @@ Einen neuen Benutzer in Zendesk erstellen
#### Output
| Parameter | Type | Beschreibung |
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Status des Operationserfolgs |
| `output` | object | Erstellte Benutzerdaten |
| `user` | object | Erstelltes Benutzerobjekt |
| `metadata` | object | Operationsmetadaten |
### `zendesk_create_users_bulk`
@@ -368,10 +371,10 @@ Erstellen mehrerer Benutzer in Zendesk mittels Massenimport
#### Output
| Parameter | Type | Beschreibung |
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Status des Operationserfolgs |
| `output` | object | Status des Massenimport-Jobs |
| `jobStatus` | object | Job-Statusobjekt |
| `metadata` | object | Operationsmetadaten |
### `zendesk_update_user`
@@ -398,8 +401,8 @@ Aktualisieren eines vorhandenen Benutzers in Zendesk
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Aktualisierte Benutzerdaten |
| `user` | object | Aktualisiertes Benutzerobjekt |
| `metadata` | object | Operationsmetadaten |
### `zendesk_update_users_bulk`
@@ -418,8 +421,8 @@ Mehrere Benutzer in Zendesk über Massenaktualisierung aktualisieren
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Status des Massenaktualisierungsauftrags |
| `jobStatus` | object | Job-Statusobjekt |
| `metadata` | object | Operationsmetadaten |
### `zendesk_delete_user`
@@ -438,8 +441,8 @@ Einen Benutzer aus Zendesk löschen
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Daten des gelöschten Benutzers |
| `deleted` | boolean | Löscherfolg |
| `metadata` | object | Operationsmetadaten |
### `zendesk_get_organizations`
@@ -459,8 +462,9 @@ Eine Liste von Organisationen von Zendesk abrufen
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Organisationsdaten und Metadaten |
| `organizations` | array | Array von Organisationsobjekten |
| `paging` | object | Paginierungsinformationen |
| `metadata` | object | Operationsmetadaten |
### `zendesk_get_organization`
@@ -479,8 +483,8 @@ Eine einzelne Organisation anhand der ID von Zendesk abrufen
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Organisationsdaten |
| `organization` | object | Organisationsobjekt |
| `metadata` | object | Operationsmetadaten |
### `zendesk_autocomplete_organizations`
@@ -499,10 +503,11 @@ Autovervollständigung von Organisationen in Zendesk nach Namenspräfix (für Na
#### Output
| Parameter | Type | Beschreibung |
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Suchergebnisse für Organisationen |
| `organizations` | array | Array von Organisationsobjekten |
| `paging` | object | Paginierungsinformationen |
| `metadata` | object | Operationsmetadaten |
### `zendesk_create_organization`
@@ -524,10 +529,10 @@ Eine neue Organisation in Zendesk erstellen
#### Output
| Parameter | Type | Beschreibung |
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Daten der erstellten Organisation |
| `organization` | object | Erstelltes Organisationsobjekt |
| `metadata` | object | Operationsmetadaten |
### `zendesk_create_organizations_bulk`
@@ -546,8 +551,8 @@ Mehrere Organisationen in Zendesk über Massenimport erstellen
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Status des Operationserfolgs |
| `output` | object | Status des Massenerfassungsauftrags |
| `jobStatus` | object | Job-Statusobjekt |
| `metadata` | object | Operationsmetadaten |
### `zendesk_update_organization`
@@ -572,8 +577,8 @@ Eine bestehende Organisation in Zendesk aktualisieren
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Status des Operationserfolgs |
| `output` | object | Aktualisierte Organisationsdaten |
| `organization` | object | Aktualisiertes Organisationsobjekt |
| `metadata` | object | Operationsmetadaten |
### `zendesk_delete_organization`
@@ -592,8 +597,8 @@ Eine Organisation aus Zendesk löschen
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Status des Operationserfolgs |
| `output` | object | Gelöschte Organisationsdaten |
| `deleted` | boolean | Löscherfolg |
| `metadata` | object | Operationsmetadaten |
### `zendesk_search`
@@ -616,8 +621,9 @@ Einheitliche Suche über Tickets, Benutzer und Organisationen in Zendesk
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Status des Operationserfolgs |
| `output` | object | Suchergebnisse |
| `results` | array | Array von Ergebnisobjekten |
| `paging` | object | Paginierungsinformationen |
| `metadata` | object | Operationsmetadaten |
### `zendesk_search_count`
@@ -636,8 +642,8 @@ Zählen der Anzahl von Suchergebnissen, die einer Abfrage in Zendesk entsprechen
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Suchergebnis-Anzahl |
| `count` | number | Anzahl der übereinstimmenden Ergebnisse |
| `metadata` | object | Operationsmetadaten |
## Hinweise

View File

@@ -30,15 +30,19 @@ Verwende den Start-Block für alles, was aus dem Editor, deploy-to-API oder depl
<Card title="Schedule" href="/triggers/schedule">
Cron- oder intervallbasierte Ausführung
</Card>
<Card title="RSS Feed" href="/triggers/rss">
RSS- und Atom-Feeds auf neue Inhalte überwachen
</Card>
</Cards>
## Schneller Vergleich
| Trigger | Startbedingung |
|---------|-----------------|
| **Start** | Editor-Ausführungen, deploy-to-API Anfragen oder Chat-Nachrichten |
| **Start** | Editor-Ausführungen, Deploy-to-API-Anfragen oder Chat-Nachrichten |
| **Schedule** | Timer, der im Schedule-Block verwaltet wird |
| **Webhook** | Bei eingehender HTTP-Anfrage |
| **RSS Feed** | Neues Element im Feed veröffentlicht |
> Der Start-Block stellt immer `input`, `conversationId` und `files` Felder bereit. Füge benutzerdefinierte Felder zum Eingabeformat für zusätzliche strukturierte Daten hinzu.

View File

@@ -0,0 +1,49 @@
---
title: RSS-Feed
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Image } from '@/components/ui/image'
Der RSS-Feed-Block überwacht RSS- und Atom-Feeds wenn neue Einträge veröffentlicht werden, wird Ihr Workflow automatisch ausgelöst.
<div className="flex justify-center">
<Image
src="/static/blocks/rss.png"
alt="RSS-Feed-Block"
width={500}
height={400}
className="my-6"
/>
</div>
## Konfiguration
1. **RSS-Feed-Block hinzufügen** - Ziehen Sie den RSS-Feed-Block, um Ihren Workflow zu starten
2. **Feed-URL eingeben** - Fügen Sie die URL eines beliebigen RSS- oder Atom-Feeds ein
3. **Bereitstellen** - Stellen Sie Ihren Workflow bereit, um das Polling zu aktivieren
Nach der Bereitstellung wird der Feed jede Minute auf neue Einträge überprüft.
## Ausgabefelder
| Feld | Typ | Beschreibung |
|-------|------|-------------|
| `title` | string | Titel des Eintrags |
| `link` | string | Link des Eintrags |
| `pubDate` | string | Veröffentlichungsdatum |
| `item` | object | Rohdaten des Eintrags mit allen Feldern |
| `feed` | object | Rohdaten der Feed-Metadaten |
Greifen Sie direkt auf zugeordnete Felder zu (`<rss.title>`) oder verwenden Sie die Rohobjekte für beliebige Felder (`<rss.item.author>`, `<rss.feed.language>`).
## Anwendungsfälle
- **Inhaltsüberwachung** - Verfolgen Sie Blogs, Nachrichtenseiten oder Updates von Wettbewerbern
- **Podcast-Automatisierung** - Lösen Sie Workflows aus, wenn neue Episoden erscheinen
- **Release-Tracking** - Überwachen Sie GitHub-Releases, Changelogs oder Produkt-Updates
- **Social-Media-Aggregation** - Sammeln Sie Inhalte von Plattformen, die RSS-Feeds anbieten
<Callout>
RSS-Trigger werden nur für Einträge ausgelöst, die nach dem Speichern des Triggers veröffentlicht wurden. Bestehende Feed-Einträge werden nicht verarbeitet.
</Callout>

View File

@@ -135,7 +135,7 @@ Function (Process) → Condition (account_type === 'enterprise') → Advanced or
## Best Practices
- **Order conditions correctly**: Place more specific conditions before general ones to ensure specific logic takes precedence over fallbacks
- **Include a default condition**: Add a catch-all condition (`true`) as the last condition to handle unmatched cases and prevent workflow execution from getting stuck
- **Use the else branch when needed**: If no conditions match and the else branch is not connected, the workflow branch will end gracefully. Connect the else branch if you need a fallback path for unmatched cases
- **Keep expressions simple**: Use clear, straightforward boolean expressions for better readability and easier debugging
- **Document your conditions**: Add descriptions to explain the purpose of each condition for better team collaboration and maintenance
- **Test edge cases**: Verify conditions handle boundary values correctly by testing with values at the edges of your condition ranges

View File

@@ -27,14 +27,16 @@ All API responses include information about your workflow execution limits and u
"limits": {
"workflowExecutionRateLimit": {
"sync": {
"limit": 60, // Max sync workflow executions per minute
"remaining": 58, // Remaining sync workflow executions
"resetAt": "..." // When the window resets
"requestsPerMinute": 60, // Sustained rate limit per minute
"maxBurst": 120, // Maximum burst capacity
"remaining": 118, // Current tokens available (up to maxBurst)
"resetAt": "..." // When tokens next refill
},
"async": {
"limit": 60, // Max async workflow executions per minute
"remaining": 59, // Remaining async workflow executions
"resetAt": "..." // When the window resets
"requestsPerMinute": 200, // Sustained rate limit per minute
"maxBurst": 400, // Maximum burst capacity
"remaining": 398, // Current tokens available
"resetAt": "..." // When tokens next refill
}
},
"usage": {
@@ -46,7 +48,7 @@ All API responses include information about your workflow execution limits and u
}
```
**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-*`).
**Note:** Rate limits use a token bucket algorithm. `remaining` can exceed `requestsPerMinute` up to `maxBurst` when you haven't used your full allowance recently, allowing for burst traffic. 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
@@ -108,13 +110,15 @@ Query workflow execution logs with extensive filtering options.
"limits": {
"workflowExecutionRateLimit": {
"sync": {
"limit": 60,
"remaining": 58,
"requestsPerMinute": 60,
"maxBurst": 120,
"remaining": 118,
"resetAt": "2025-01-01T12:35:56.789Z"
},
"async": {
"limit": 60,
"remaining": 59,
"requestsPerMinute": 200,
"maxBurst": 400,
"remaining": 398,
"resetAt": "2025-01-01T12:35:56.789Z"
}
},
@@ -184,13 +188,15 @@ Retrieve detailed information about a specific log entry.
"limits": {
"workflowExecutionRateLimit": {
"sync": {
"limit": 60,
"remaining": 58,
"requestsPerMinute": 60,
"maxBurst": 120,
"remaining": 118,
"resetAt": "2025-01-01T12:35:56.789Z"
},
"async": {
"limit": 60,
"remaining": 59,
"requestsPerMinute": 200,
"maxBurst": 400,
"remaining": 398,
"resetAt": "2025-01-01T12:35:56.789Z"
}
},
@@ -467,17 +473,25 @@ Failed webhook deliveries are retried with exponential backoff and jitter:
## Rate Limiting
The API implements rate limiting to ensure fair usage:
The API uses a **token bucket algorithm** for rate limiting, providing fair usage while allowing burst traffic:
- **Free plan**: 10 requests per minute
- **Pro plan**: 30 requests per minute
- **Team plan**: 60 requests per minute
- **Enterprise plan**: Custom limits
| Plan | Requests/Minute | Burst Capacity |
|------|-----------------|----------------|
| Free | 10 | 20 |
| Pro | 30 | 60 |
| Team | 60 | 120 |
| Enterprise | 120 | 240 |
**How it works:**
- Tokens refill at `requestsPerMinute` rate
- You can accumulate up to `maxBurst` tokens when idle
- Each request consumes 1 token
- Burst capacity allows handling traffic spikes
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
- `X-RateLimit-Limit`: Requests per minute (refill rate)
- `X-RateLimit-Remaining`: Current tokens available
- `X-RateLimit-Reset`: ISO timestamp when tokens next refill
## Example: Polling for New Logs

View File

@@ -143,8 +143,20 @@ curl -X GET -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" htt
{
"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" },
"sync": {
"isLimited": false,
"requestsPerMinute": 25,
"maxBurst": 50,
"remaining": 50,
"resetAt": "2025-09-08T22:51:55.999Z"
},
"async": {
"isLimited": false,
"requestsPerMinute": 200,
"maxBurst": 400,
"remaining": 400,
"resetAt": "2025-09-08T22:51:56.155Z"
},
"authType": "api"
},
"usage": {
@@ -155,6 +167,11 @@ curl -X GET -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" htt
}
```
**Rate Limit Fields:**
- `requestsPerMinute`: Sustained rate limit (tokens refill at this rate)
- `maxBurst`: Maximum tokens you can accumulate (burst capacity)
- `remaining`: Current tokens available (can be up to `maxBurst`)
**Response Fields:**
- `currentPeriodCost` reflects usage in the current billing period
- `limit` is derived from individual limits (Free/Pro) or pooled organization limits (Team/Enterprise)

View File

@@ -72,7 +72,7 @@ For custom integrations, leverage our [MCP (Model Context Protocol) support](/mc
<Video src="introduction/integrations-sidebar.mp4" width={700} height={450} />
</div>
## AI-Powered Copilot
## Copilot
**Ask Questions & Get Guidance**
Copilot answers questions about Sim, explains your workflows, and provides suggestions for improvements. Use the `@` symbol to reference workflows, blocks, documentation, knowledge, and logs for contextual assistance.

View File

@@ -1,5 +1,6 @@
---
title: Knowledgebase
title: Overview
description: Upload, process, and search through your documents with intelligent vector search and chunking
---
import { Video } from '@/components/ui/video'

View File

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

View File

@@ -13,7 +13,8 @@
"variables",
"execution",
"permissions",
"sdks"
"sdks",
"self-hosting"
],
"defaultOpen": false
}

View File

@@ -0,0 +1,150 @@
---
title: Docker
description: Deploy Sim Studio with Docker Compose
---
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { Callout } from 'fumadocs-ui/components/callout'
## Quick Start
```bash
# Clone and start
git clone https://github.com/simstudioai/sim.git && cd sim
docker compose -f docker-compose.prod.yml up -d
```
Open [http://localhost:3000](http://localhost:3000)
## Production Setup
### 1. Configure Environment
```bash
# Generate secrets
cat > .env << EOF
DATABASE_URL=postgresql://postgres:postgres@db:5432/simstudio
BETTER_AUTH_SECRET=$(openssl rand -hex 32)
ENCRYPTION_KEY=$(openssl rand -hex 32)
INTERNAL_API_SECRET=$(openssl rand -hex 32)
NEXT_PUBLIC_APP_URL=https://sim.yourdomain.com
BETTER_AUTH_URL=https://sim.yourdomain.com
NEXT_PUBLIC_SOCKET_URL=https://sim.yourdomain.com
EOF
```
### 2. Start Services
```bash
docker compose -f docker-compose.prod.yml up -d
```
### 3. Set Up SSL
<Tabs items={['Caddy (Recommended)', 'Nginx + Certbot']}>
<Tab value="Caddy (Recommended)">
Caddy automatically handles SSL certificates.
```bash
# Install Caddy
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update && sudo apt install caddy
```
Create `/etc/caddy/Caddyfile`:
```
sim.yourdomain.com {
reverse_proxy localhost:3000
handle /socket.io/* {
reverse_proxy localhost:3002
}
}
```
```bash
sudo systemctl restart caddy
```
</Tab>
<Tab value="Nginx + Certbot">
```bash
# Install
sudo apt install nginx certbot python3-certbot-nginx -y
# Create /etc/nginx/sites-available/sim
server {
listen 80;
server_name sim.yourdomain.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /socket.io/ {
proxy_pass http://127.0.0.1:3002;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
# Enable and get certificate
sudo ln -s /etc/nginx/sites-available/sim /etc/nginx/sites-enabled/
sudo certbot --nginx -d sim.yourdomain.com
```
</Tab>
</Tabs>
## Ollama
```bash
# With GPU
docker compose -f docker-compose.ollama.yml --profile gpu --profile setup up -d
# CPU only
docker compose -f docker-compose.ollama.yml --profile cpu --profile setup up -d
```
Pull additional models:
```bash
docker compose -f docker-compose.ollama.yml exec ollama ollama pull llama3.2
```
### External Ollama
If Ollama runs on your host machine (not in Docker):
```bash
# macOS/Windows
OLLAMA_URL=http://host.docker.internal:11434 docker compose -f docker-compose.prod.yml up -d
# Linux - use your host IP
OLLAMA_URL=http://192.168.1.100:11434 docker compose -f docker-compose.prod.yml up -d
```
<Callout type="warning">
Inside Docker, `localhost` refers to the container, not your host. Use `host.docker.internal` or your host's IP.
</Callout>
## Commands
```bash
# View logs
docker compose -f docker-compose.prod.yml logs -f simstudio
# Stop
docker compose -f docker-compose.prod.yml down
# Update
docker compose -f docker-compose.prod.yml pull && docker compose -f docker-compose.prod.yml up -d
# Backup database
docker compose -f docker-compose.prod.yml exec db pg_dump -U postgres simstudio > backup.sql
```

View File

@@ -0,0 +1,87 @@
---
title: Environment Variables
description: Configuration reference for Sim Studio
---
import { Callout } from 'fumadocs-ui/components/callout'
## Required
| Variable | Description |
|----------|-------------|
| `DATABASE_URL` | PostgreSQL connection string |
| `BETTER_AUTH_SECRET` | Auth secret (32 hex chars): `openssl rand -hex 32` |
| `BETTER_AUTH_URL` | Your app URL |
| `ENCRYPTION_KEY` | Encryption key (32 hex chars): `openssl rand -hex 32` |
| `INTERNAL_API_SECRET` | Internal API secret (32 hex chars): `openssl rand -hex 32` |
| `NEXT_PUBLIC_APP_URL` | Public app URL |
| `NEXT_PUBLIC_SOCKET_URL` | WebSocket URL (default: `http://localhost:3002`) |
## AI Providers
| Variable | Provider |
|----------|----------|
| `OPENAI_API_KEY` | OpenAI |
| `ANTHROPIC_API_KEY_1` | Anthropic Claude |
| `GEMINI_API_KEY_1` | Google Gemini |
| `MISTRAL_API_KEY` | Mistral |
| `OLLAMA_URL` | Ollama (default: `http://localhost:11434`) |
<Callout type="info">
For load balancing, add multiple keys with `_1`, `_2`, `_3` suffixes (e.g., `OPENAI_API_KEY_1`, `OPENAI_API_KEY_2`). Works with OpenAI, Anthropic, and Gemini.
</Callout>
<Callout type="info">
In Docker, use `OLLAMA_URL=http://host.docker.internal:11434` for host-machine Ollama.
</Callout>
### Azure OpenAI
| Variable | Description |
|----------|-------------|
| `AZURE_OPENAI_API_KEY` | Azure OpenAI API key |
| `AZURE_OPENAI_ENDPOINT` | Azure OpenAI endpoint URL |
| `AZURE_OPENAI_API_VERSION` | API version (e.g., `2024-02-15-preview`) |
### vLLM (Self-Hosted)
| Variable | Description |
|----------|-------------|
| `VLLM_BASE_URL` | vLLM server URL (e.g., `http://localhost:8000/v1`) |
| `VLLM_API_KEY` | Optional bearer token for vLLM |
## OAuth Providers
| Variable | Description |
|----------|-------------|
| `GOOGLE_CLIENT_ID` | Google OAuth client ID |
| `GOOGLE_CLIENT_SECRET` | Google OAuth client secret |
| `GITHUB_CLIENT_ID` | GitHub OAuth client ID |
| `GITHUB_CLIENT_SECRET` | GitHub OAuth client secret |
## Optional
| Variable | Description |
|----------|-------------|
| `API_ENCRYPTION_KEY` | Encrypts stored API keys (32 hex chars): `openssl rand -hex 32` |
| `COPILOT_API_KEY` | API key for copilot features |
| `ADMIN_API_KEY` | Admin API key for GitOps operations |
| `RESEND_API_KEY` | Email service for notifications |
| `ALLOWED_LOGIN_DOMAINS` | Restrict signups to domains (comma-separated) |
| `ALLOWED_LOGIN_EMAILS` | Restrict signups to specific emails (comma-separated) |
| `DISABLE_REGISTRATION` | Set to `true` to disable new user signups |
## Example .env
```bash
DATABASE_URL=postgresql://postgres:postgres@db:5432/simstudio
BETTER_AUTH_SECRET=<openssl rand -hex 32>
BETTER_AUTH_URL=https://sim.yourdomain.com
ENCRYPTION_KEY=<openssl rand -hex 32>
INTERNAL_API_SECRET=<openssl rand -hex 32>
NEXT_PUBLIC_APP_URL=https://sim.yourdomain.com
NEXT_PUBLIC_SOCKET_URL=https://sim.yourdomain.com
OPENAI_API_KEY=sk-...
```
See `apps/sim/.env.example` for all options.

View File

@@ -0,0 +1,50 @@
---
title: Self-Hosting
description: Deploy Sim Studio on your own infrastructure
---
import { Card, Cards } from 'fumadocs-ui/components/card'
import { Callout } from 'fumadocs-ui/components/callout'
Deploy Sim Studio on your own infrastructure with Docker or Kubernetes.
## Requirements
| Resource | Minimum | Recommended |
|----------|---------|-------------|
| CPU | 2 cores | 4+ cores |
| RAM | 12 GB | 16+ GB |
| Storage | 20 GB SSD | 50+ GB SSD |
| Docker | 20.10+ | Latest |
## Quick Start
```bash
git clone https://github.com/simstudioai/sim.git && cd sim
docker compose -f docker-compose.prod.yml up -d
```
Open [http://localhost:3000](http://localhost:3000)
## Deployment Options
<Cards>
<Card title="Docker" href="/self-hosting/docker">
Deploy with Docker Compose on any server
</Card>
<Card title="Kubernetes" href="/self-hosting/kubernetes">
Deploy with Helm on Kubernetes clusters
</Card>
<Card title="Cloud Platforms" href="/self-hosting/platforms">
Railway, DigitalOcean, AWS, Azure, GCP guides
</Card>
</Cards>
## Architecture
| Component | Port | Description |
|-----------|------|-------------|
| simstudio | 3000 | Main application |
| realtime | 3002 | WebSocket server |
| db | 5432 | PostgreSQL with pgvector |
| migrations | - | Database migrations (runs once) |

View File

@@ -0,0 +1,127 @@
---
title: Kubernetes
description: Deploy Sim Studio with Helm
---
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { Callout } from 'fumadocs-ui/components/callout'
## Prerequisites
- Kubernetes 1.19+
- Helm 3.0+
- PV provisioner support
## Installation
```bash
# Clone repo
git clone https://github.com/simstudioai/sim.git && cd sim
# Generate secrets
BETTER_AUTH_SECRET=$(openssl rand -hex 32)
ENCRYPTION_KEY=$(openssl rand -hex 32)
INTERNAL_API_SECRET=$(openssl rand -hex 32)
# Install
helm install sim ./helm/sim \
--set app.env.BETTER_AUTH_SECRET="$BETTER_AUTH_SECRET" \
--set app.env.ENCRYPTION_KEY="$ENCRYPTION_KEY" \
--set app.env.INTERNAL_API_SECRET="$INTERNAL_API_SECRET" \
--namespace simstudio --create-namespace
```
## Cloud-Specific Values
<Tabs items={['AWS EKS', 'Azure AKS', 'GCP GKE']}>
<Tab value="AWS EKS">
```bash
helm install sim ./helm/sim \
--values ./helm/sim/examples/values-aws.yaml \
--set app.env.BETTER_AUTH_SECRET="$BETTER_AUTH_SECRET" \
--set app.env.ENCRYPTION_KEY="$ENCRYPTION_KEY" \
--set app.env.INTERNAL_API_SECRET="$INTERNAL_API_SECRET" \
--set app.env.NEXT_PUBLIC_APP_URL="https://sim.yourdomain.com" \
--namespace simstudio --create-namespace
```
</Tab>
<Tab value="Azure AKS">
```bash
helm install sim ./helm/sim \
--values ./helm/sim/examples/values-azure.yaml \
--set app.env.BETTER_AUTH_SECRET="$BETTER_AUTH_SECRET" \
--set app.env.ENCRYPTION_KEY="$ENCRYPTION_KEY" \
--set app.env.INTERNAL_API_SECRET="$INTERNAL_API_SECRET" \
--set app.env.NEXT_PUBLIC_APP_URL="https://sim.yourdomain.com" \
--namespace simstudio --create-namespace
```
</Tab>
<Tab value="GCP GKE">
```bash
helm install sim ./helm/sim \
--values ./helm/sim/examples/values-gcp.yaml \
--set app.env.BETTER_AUTH_SECRET="$BETTER_AUTH_SECRET" \
--set app.env.ENCRYPTION_KEY="$ENCRYPTION_KEY" \
--set app.env.INTERNAL_API_SECRET="$INTERNAL_API_SECRET" \
--set app.env.NEXT_PUBLIC_APP_URL="https://sim.yourdomain.com" \
--namespace simstudio --create-namespace
```
</Tab>
</Tabs>
## Key Configuration
```yaml
# Custom values.yaml
app:
replicaCount: 2
env:
NEXT_PUBLIC_APP_URL: "https://sim.yourdomain.com"
OPENAI_API_KEY: "sk-..."
postgresql:
persistence:
size: 50Gi
ingress:
enabled: true
className: nginx
tls:
enabled: true
app:
host: sim.yourdomain.com
```
See `helm/sim/values.yaml` for all options.
## External Database
```yaml
postgresql:
enabled: false
externalDatabase:
enabled: true
host: "your-db-host"
port: 5432
username: "postgres"
password: "your-password"
database: "simstudio"
sslMode: "require"
```
## Commands
```bash
# Port forward for local access
kubectl port-forward deployment/sim-sim-app 3000:3000 -n simstudio
# View logs
kubectl logs -l app.kubernetes.io/component=app -n simstudio --tail=100
# Upgrade
helm upgrade sim ./helm/sim --namespace simstudio
# Uninstall
helm uninstall sim --namespace simstudio
```

View File

@@ -0,0 +1,12 @@
{
"title": "Self-Hosting",
"pages": [
"index",
"docker",
"kubernetes",
"platforms",
"environment-variables",
"troubleshooting"
],
"defaultOpen": false
}

View File

@@ -0,0 +1,116 @@
---
title: Cloud Platforms
description: Deploy Sim Studio on cloud platforms
---
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { Callout } from 'fumadocs-ui/components/callout'
## Railway
One-click deployment with automatic PostgreSQL provisioning.
[![Deploy on Railway](https://railway.app/button.svg)](https://railway.com/new/template/sim-studio)
After deployment, add environment variables in Railway dashboard:
- `BETTER_AUTH_SECRET`, `ENCRYPTION_KEY`, `INTERNAL_API_SECRET` (auto-generated)
- `OPENAI_API_KEY` or other AI provider keys
- Custom domain in Settings → Networking
## VPS Deployment
For DigitalOcean, AWS EC2, Azure VMs, or any Linux server:
<Tabs items={['DigitalOcean', 'AWS EC2', 'Azure VM']}>
<Tab value="DigitalOcean">
**Recommended:** 16 GB RAM Droplet, Ubuntu 24.04
```bash
# Create Droplet via console, then SSH in
ssh root@your-droplet-ip
```
</Tab>
<Tab value="AWS EC2">
**Recommended:** t3.xlarge (16 GB RAM), Ubuntu 24.04
```bash
ssh -i your-key.pem ubuntu@your-ec2-ip
```
</Tab>
<Tab value="Azure VM">
**Recommended:** Standard_D4s_v3 (16 GB RAM), Ubuntu 24.04
```bash
ssh azureuser@your-vm-ip
```
</Tab>
</Tabs>
### Install Docker
```bash
# Install Docker (official method)
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER
# Logout and reconnect, then verify
docker --version
```
### Deploy Sim Studio
```bash
git clone https://github.com/simstudioai/sim.git && cd sim
# Create .env with secrets
cat > .env << EOF
DATABASE_URL=postgresql://postgres:postgres@db:5432/simstudio
BETTER_AUTH_SECRET=$(openssl rand -hex 32)
ENCRYPTION_KEY=$(openssl rand -hex 32)
INTERNAL_API_SECRET=$(openssl rand -hex 32)
NEXT_PUBLIC_APP_URL=https://sim.yourdomain.com
BETTER_AUTH_URL=https://sim.yourdomain.com
NEXT_PUBLIC_SOCKET_URL=https://sim.yourdomain.com
EOF
# Start
docker compose -f docker-compose.prod.yml up -d
```
### SSL with Caddy
```bash
# Install Caddy
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update && sudo apt install caddy
# Configure (replace domain)
echo 'sim.yourdomain.com {
reverse_proxy localhost:3000
handle /socket.io/* {
reverse_proxy localhost:3002
}
}' | sudo tee /etc/caddy/Caddyfile
sudo systemctl restart caddy
```
Point your domain's DNS A record to your server IP.
## Kubernetes (EKS, AKS, GKE)
See the [Kubernetes guide](/self-hosting/kubernetes) for Helm deployment on managed Kubernetes.
## Managed Database (Optional)
For production, use a managed PostgreSQL service:
- **AWS RDS** / **Azure Database** / **Cloud SQL** - Enable pgvector extension
- **Supabase** / **Neon** - pgvector included
Set `DATABASE_URL` in your environment:
```bash
DATABASE_URL="postgresql://user:pass@host:5432/db?sslmode=require"
```

View File

@@ -0,0 +1,110 @@
---
title: Troubleshooting
description: Common issues and solutions
---
## Database Connection Failed
```bash
# Check database is running
docker compose ps db
# Test connection
docker compose exec db psql -U postgres -c "SELECT 1"
```
Verify `DATABASE_URL` format: `postgresql://user:pass@host:5432/database`
## Ollama Models Not Showing
Inside Docker, `localhost` = the container, not your host machine.
```bash
# For host-machine Ollama, use:
OLLAMA_URL=http://host.docker.internal:11434 # macOS/Windows
OLLAMA_URL=http://192.168.1.x:11434 # Linux (use actual IP)
```
## WebSocket/Realtime Not Working
1. Check `NEXT_PUBLIC_SOCKET_URL` matches your domain
2. Verify realtime service is running: `docker compose ps realtime`
3. Ensure reverse proxy passes WebSocket upgrades (see [Docker guide](/self-hosting/docker))
## 502 Bad Gateway
```bash
# Check app is running
docker compose ps simstudio
docker compose logs simstudio
# Common causes: out of memory, database not ready
```
## Migration Errors
```bash
# View migration logs
docker compose logs migrations
# Run manually
docker compose exec simstudio bun run db:migrate
```
## pgvector Not Found
Use the correct PostgreSQL image:
```yaml
image: pgvector/pgvector:pg17 # NOT postgres:17
```
## Certificate Errors (CERT_HAS_EXPIRED)
If you see SSL certificate errors when calling external APIs:
```bash
# Update CA certificates in container
docker compose exec simstudio apt-get update && apt-get install -y ca-certificates
# Or set in environment (not recommended for production)
NODE_TLS_REJECT_UNAUTHORIZED=0
```
## Blank Page After Login
1. Check browser console for errors
2. Verify `NEXT_PUBLIC_APP_URL` matches your actual domain
3. Clear browser cookies and local storage
4. Check that all services are running: `docker compose ps`
## Windows-Specific Issues
**Turbopack errors on Windows:**
```bash
# Use WSL2 for better compatibility
wsl --install
# Or disable Turbopack in package.json
# Change "next dev --turbopack" to "next dev"
```
**Line ending issues:**
```bash
# Configure git to use LF
git config --global core.autocrlf input
```
## View Logs
```bash
# All services
docker compose logs -f
# Specific service
docker compose logs -f simstudio
```
## Getting Help
- [GitHub Issues](https://github.com/simstudioai/sim/issues)
- [Discord](https://discord.gg/Hr4UWYEcTT)

View File

@@ -0,0 +1,186 @@
---
title: Cursor
description: Launch and manage Cursor cloud agents to work on GitHub repositories
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="cursor"
color="#1E1E1E"
/>
{/* MANUAL-CONTENT-START:intro */}
[Cursor](https://www.cursor.so/) is an AI IDE and cloud-based platform that lets you launch and manage powerful AI agents able to work directly on your GitHub repositories. Cursor agents can automate development tasks, enhance your team's productivity, and collaborate with you by making code changes, responding to natural language instructions, and maintaining conversation history about their activities.
With Cursor, you can:
- **Launch cloud agents for codebases**: Instantly create new AI agents that work on your repositories in the cloud
- **Delegate coding tasks using natural language**: Guide agents with written instructions, amendments, and clarifications
- **Monitor progress and outputs**: Retrieve agent status, view detailed results, and inspect current or completed tasks
- **Access full conversation history**: Review all prompts and AI responses for transparency and auditability
- **Control and manage agent lifecycle**: List active agents, terminate agents, and manage API-based agent launches and follow-ups
In Sim, the Cursor integration enables your agents and workflows to interact programmatically with Cursor cloud agents. This means you can use Sim to:
- List all cloud agents and browse their current state (`cursor_list_agents`)
- Retrieve up-to-date status and outputs for any agent (`cursor_get_agent`)
- View the full conversation history for any coding agent (`cursor_get_conversation`)
- Add follow-up instructions or new prompts to a running agent
- Manage and terminate agents as needed
This integration helps you combine the flexible intelligence of Sim agents with the powerful development automation capabilities of Cursor, making it possible to scale AI-driven development across your projects.
{/* MANUAL-CONTENT-END */}
## Usage Instructions
Interact with Cursor Cloud Agents API to launch AI agents that can work on your GitHub repositories. Supports launching agents, adding follow-up instructions, checking status, viewing conversations, and managing agent lifecycle.
## Tools
### `cursor_list_agents`
List all cloud agents for the authenticated user with optional pagination.
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Yes | Cursor API key |
| `limit` | number | No | Number of agents to return \(default: 20, max: 100\) |
| `cursor` | string | No | Pagination cursor from previous response |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `content` | string | Human-readable list of agents |
| `metadata` | object | Agent list metadata |
### `cursor_get_agent`
Retrieve the current status and results of a cloud agent.
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Yes | Cursor API key |
| `agentId` | string | Yes | Unique identifier for the cloud agent \(e.g., bc_abc123\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `content` | string | Human-readable agent details |
| `metadata` | object | Agent metadata |
### `cursor_get_conversation`
Retrieve the conversation history of a cloud agent, including all user prompts and assistant responses.
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Yes | Cursor API key |
| `agentId` | string | Yes | Unique identifier for the cloud agent \(e.g., bc_abc123\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `content` | string | Human-readable conversation history |
| `metadata` | object | Conversation metadata |
### `cursor_launch_agent`
Start a new cloud agent to work on a GitHub repository with the given instructions.
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Yes | Cursor API key |
| `repository` | string | Yes | GitHub repository URL \(e.g., https://github.com/your-org/your-repo\) |
| `ref` | string | No | Branch, tag, or commit to work from \(defaults to default branch\) |
| `promptText` | string | Yes | The instruction text for the agent |
| `promptImages` | string | No | JSON array of image objects with base64 data and dimensions |
| `model` | string | No | Model to use \(leave empty for auto-selection\) |
| `branchName` | string | No | Custom branch name for the agent to use |
| `autoCreatePr` | boolean | No | Automatically create a PR when the agent finishes |
| `openAsCursorGithubApp` | boolean | No | Open the PR as the Cursor GitHub App |
| `skipReviewerRequest` | boolean | No | Skip requesting reviewers on the PR |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `content` | string | Success message with agent details |
| `metadata` | object | Launch result metadata |
### `cursor_add_followup`
Add a follow-up instruction to an existing cloud agent.
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Yes | Cursor API key |
| `agentId` | string | Yes | Unique identifier for the cloud agent \(e.g., bc_abc123\) |
| `followupPromptText` | string | Yes | The follow-up instruction text for the agent |
| `promptImages` | string | No | JSON array of image objects with base64 data and dimensions \(max 5\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `content` | string | Success message |
| `metadata` | object | Result metadata |
### `cursor_stop_agent`
Stop a running cloud agent. This pauses the agent without deleting it.
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Yes | Cursor API key |
| `agentId` | string | Yes | Unique identifier for the cloud agent \(e.g., bc_abc123\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `content` | string | Success message |
| `metadata` | object | Result metadata |
### `cursor_delete_agent`
Permanently delete a cloud agent. This action cannot be undone.
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Yes | Cursor API key |
| `agentId` | string | Yes | Unique identifier for the cloud agent \(e.g., bc_abc123\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `content` | string | Success message |
| `metadata` | object | Result metadata |
## Notes
- Category: `tools`
- Type: `cursor`

View File

@@ -0,0 +1,68 @@
---
title: DuckDuckGo
description: Search with DuckDuckGo
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="duckduckgo"
color="#FFFFFF"
/>
{/* MANUAL-CONTENT-START:intro */}
[DuckDuckGo](https://duckduckgo.com/) is a privacy-focused web search engine that delivers instant answers, abstracts, related topics, and more — without tracking you or your searches. DuckDuckGo makes it easy to find information without any user profiling or targeted ads.
With DuckDuckGo in Sim, you can:
- **Search the web**: Instantly find answers, facts, and overviews for a given search query
- **Get direct answers**: Retrieve specific responses for calculations, conversions, or factual queries
- **Access abstracts**: Receive short summaries or descriptions for your search topics
- **Fetch related topics**: Discover links and references relevant to your search
- **Filter output**: Optionally remove HTML or skip disambiguation for cleaner results
These features enable your Sim agents to automate access to fresh web knowledge — from surfacing facts in a workflow, to enriching documents and analysis with up-to-date information. Because DuckDuckGos Instant Answers API is open and does not require an API key, its simple and privacy-safe to integrate into your automated business processes.
{/* MANUAL-CONTENT-END */}
## Usage Instructions
Search the web using DuckDuckGo Instant Answers API. Returns instant answers, abstracts, related topics, and more. Free to use without an API key.
## Tools
### `duckduckgo_search`
Search the web using DuckDuckGo Instant Answers API. Returns instant answers, abstracts, and related topics for your query. Free to use without an API key.
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `query` | string | Yes | The search query to execute |
| `noHtml` | boolean | No | Remove HTML from text in results \(default: true\) |
| `skipDisambig` | boolean | No | Skip disambiguation results \(default: false\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `heading` | string | The heading/title of the instant answer |
| `abstract` | string | A short abstract summary of the topic |
| `abstractText` | string | Plain text version of the abstract |
| `abstractSource` | string | The source of the abstract \(e.g., Wikipedia\) |
| `abstractURL` | string | URL to the source of the abstract |
| `image` | string | URL to an image related to the topic |
| `answer` | string | Direct answer if available \(e.g., for calculations\) |
| `answerType` | string | Type of the answer \(e.g., calc, ip, etc.\) |
| `type` | string | Response type: A \(article\), D \(disambiguation\), C \(category\), N \(name\), E \(exclusive\) |
| `relatedTopics` | array | Array of related topics with URLs and descriptions |
## Notes
- Category: `tools`
- Type: `duckduckgo`

View File

@@ -49,11 +49,11 @@ Search the web using Exa AI. Returns relevant search results with titles, URLs,
| `type` | string | No | Search type: neural, keyword, auto or fast \(default: auto\) |
| `includeDomains` | string | No | Comma-separated list of domains to include in results |
| `excludeDomains` | string | No | Comma-separated list of domains to exclude from results |
| `category` | string | No | Filter by category: company, research_paper, news_article, pdf, github, tweet, movie, song, personal_site |
| `category` | string | No | Filter by category: company, research paper, news, pdf, github, tweet, personal site, linkedin profile, financial report |
| `text` | boolean | No | Include full text content in results \(default: false\) |
| `highlights` | boolean | No | Include highlighted snippets in results \(default: false\) |
| `summary` | boolean | No | Include AI-generated summaries in results \(default: false\) |
| `livecrawl` | string | No | Live crawling mode: always, fallback, or never \(default: never\) |
| `livecrawl` | string | No | Live crawling mode: never \(default\), fallback, always, or preferred \(always try livecrawl, fall back to cache if fails\) |
| `apiKey` | string | Yes | Exa AI API Key |
#### Output
@@ -76,7 +76,7 @@ Retrieve the contents of webpages using Exa AI. Returns the title, text content,
| `subpages` | number | No | Number of subpages to crawl from the provided URLs |
| `subpageTarget` | string | No | Comma-separated keywords to target specific subpages \(e.g., "docs,tutorial,about"\) |
| `highlights` | boolean | No | Include highlighted snippets in results \(default: false\) |
| `livecrawl` | string | No | Live crawling mode: always, fallback, or never \(default: never\) |
| `livecrawl` | string | No | Live crawling mode: never \(default\), fallback, always, or preferred \(always try livecrawl, fall back to cache if fails\) |
| `apiKey` | string | Yes | Exa AI API Key |
#### Output
@@ -99,10 +99,9 @@ Find webpages similar to a given URL using Exa AI. Returns a list of similar lin
| `includeDomains` | string | No | Comma-separated list of domains to include in results |
| `excludeDomains` | string | No | Comma-separated list of domains to exclude from results |
| `excludeSourceDomain` | boolean | No | Exclude the source domain from results \(default: false\) |
| `category` | string | No | Filter by category: company, research_paper, news_article, pdf, github, tweet, movie, song, personal_site |
| `highlights` | boolean | No | Include highlighted snippets in results \(default: false\) |
| `summary` | boolean | No | Include AI-generated summaries in results \(default: false\) |
| `livecrawl` | string | No | Live crawling mode: always, fallback, or never \(default: never\) |
| `livecrawl` | string | No | Live crawling mode: never \(default\), fallback, always, or preferred \(always try livecrawl, fall back to cache if fails\) |
| `apiKey` | string | Yes | Exa AI API Key |
#### Output

View File

@@ -0,0 +1,221 @@
---
title: Google Groups
description: Manage Google Workspace Groups and their members
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="google_groups"
color="#E8F0FE"
/>
## Usage Instructions
Connect to Google Workspace to create, update, and manage groups and their members using the Admin SDK Directory API.
## Tools
### `google_groups_list_groups`
List all groups in a Google Workspace domain
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `customer` | string | No | Customer ID or "my_customer" for the authenticated user\'s domain |
| `domain` | string | No | Domain name to filter groups by |
| `maxResults` | number | No | Maximum number of results to return \(1-200\) |
| `pageToken` | string | No | Token for pagination |
| `query` | string | No | Search query to filter groups \(e.g., "email:admin*"\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `output` | json | Google Groups API response data |
### `google_groups_get_group`
Get details of a specific Google Group by email or group ID
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `groupKey` | string | Yes | Group email address or unique group ID |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `output` | json | Google Groups API response data |
### `google_groups_create_group`
Create a new Google Group in the domain
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `email` | string | Yes | Email address for the new group \(e.g., team@yourdomain.com\) |
| `name` | string | Yes | Display name for the group |
| `description` | string | No | Description of the group |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `output` | json | Google Groups API response data |
### `google_groups_update_group`
Update an existing Google Group
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `groupKey` | string | Yes | Group email address or unique group ID |
| `name` | string | No | New display name for the group |
| `description` | string | No | New description for the group |
| `email` | string | No | New email address for the group |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `output` | json | Google Groups API response data |
### `google_groups_delete_group`
Delete a Google Group
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `groupKey` | string | Yes | Group email address or unique group ID to delete |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `output` | json | Google Groups API response data |
### `google_groups_list_members`
List all members of a Google Group
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `groupKey` | string | Yes | Group email address or unique group ID |
| `maxResults` | number | No | Maximum number of results to return \(1-200\) |
| `pageToken` | string | No | Token for pagination |
| `roles` | string | No | Filter by roles \(comma-separated: OWNER, MANAGER, MEMBER\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `output` | json | Google Groups API response data |
### `google_groups_get_member`
Get details of a specific member in a Google Group
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `groupKey` | string | Yes | Group email address or unique group ID |
| `memberKey` | string | Yes | Member email address or unique member ID |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `output` | json | Google Groups API response data |
### `google_groups_add_member`
Add a new member to a Google Group
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `groupKey` | string | Yes | Group email address or unique group ID |
| `email` | string | Yes | Email address of the member to add |
| `role` | string | No | Role for the member \(MEMBER, MANAGER, or OWNER\). Defaults to MEMBER. |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `output` | json | Google Groups API response data |
### `google_groups_remove_member`
Remove a member from a Google Group
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `groupKey` | string | Yes | Group email address or unique group ID |
| `memberKey` | string | Yes | Email address or unique ID of the member to remove |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `output` | json | Google Groups API response data |
### `google_groups_update_member`
Update a member
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `groupKey` | string | Yes | Group email address or unique group ID |
| `memberKey` | string | Yes | Member email address or unique member ID |
| `role` | string | Yes | New role for the member \(MEMBER, MANAGER, or OWNER\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `output` | json | Google Groups API response data |
### `google_groups_has_member`
Check if a user is a member of a Google Group
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `groupKey` | string | Yes | Group email address or unique group ID |
| `memberKey` | string | Yes | Member email address or unique member ID to check |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `output` | json | Google Groups API response data |
## Notes
- Category: `tools`
- Type: `google_groups`

View File

@@ -52,8 +52,8 @@ Retrieve a list of prediction markets from Kalshi with optional filtering
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Markets data and metadata |
| `markets` | array | Array of market objects |
| `paging` | object | Pagination cursor for fetching more results |
### `kalshi_get_market`
@@ -69,8 +69,7 @@ Retrieve details of a specific prediction market by ticker
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Market data and metadata |
| `market` | object | Market object with details |
### `kalshi_get_events`
@@ -90,8 +89,8 @@ Retrieve a list of events from Kalshi with optional filtering
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Events data and metadata |
| `events` | array | Array of event objects |
| `paging` | object | Pagination cursor for fetching more results |
### `kalshi_get_event`
@@ -108,8 +107,7 @@ Retrieve details of a specific event by ticker
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Event data and metadata |
| `event` | object | Event object with details |
### `kalshi_get_balance`
@@ -126,8 +124,10 @@ Retrieve your account balance and portfolio value from Kalshi
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Balance data and metadata |
| `balance` | number | Account balance in cents |
| `portfolioValue` | number | Portfolio value in cents |
| `balanceDollars` | number | Account balance in dollars |
| `portfolioValueDollars` | number | Portfolio value in dollars |
### `kalshi_get_positions`
@@ -149,8 +149,8 @@ Retrieve your open positions from Kalshi
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Positions data and metadata |
| `positions` | array | Array of position objects |
| `paging` | object | Pagination cursor for fetching more results |
### `kalshi_get_orders`
@@ -172,8 +172,8 @@ Retrieve your orders from Kalshi with optional filtering
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Orders data and metadata |
| `orders` | array | Array of order objects |
| `paging` | object | Pagination cursor for fetching more results |
### `kalshi_get_order`
@@ -191,8 +191,7 @@ Retrieve details of a specific order by ID from Kalshi
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Order data |
| `order` | object | Order object with details |
### `kalshi_get_orderbook`
@@ -208,8 +207,7 @@ Retrieve the orderbook (yes and no bids) for a specific market
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Orderbook data and metadata |
| `orderbook` | object | Orderbook with yes/no bids and asks |
### `kalshi_get_trades`
@@ -226,8 +224,8 @@ Retrieve recent trades across all markets
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Trades data and metadata |
| `trades` | array | Array of trade objects |
| `paging` | object | Pagination cursor for fetching more results |
### `kalshi_get_candlesticks`
@@ -247,8 +245,7 @@ Retrieve OHLC candlestick data for a specific market
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Candlestick data and metadata |
| `candlesticks` | array | Array of OHLC candlestick data |
### `kalshi_get_fills`
@@ -271,8 +268,8 @@ Retrieve your portfolio
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Fills data and metadata |
| `fills` | array | Array of fill/trade objects |
| `paging` | object | Pagination cursor for fetching more results |
### `kalshi_get_series_by_ticker`
@@ -288,8 +285,7 @@ Retrieve details of a specific market series by ticker
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Series data and metadata |
| `series` | object | Series object with details |
### `kalshi_get_exchange_status`
@@ -304,8 +300,7 @@ Retrieve the current status of the Kalshi exchange (trading and exchange activit
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Exchange status data and metadata |
| `status` | object | Exchange status with trading_active and exchange_active flags |
### `kalshi_create_order`
@@ -339,8 +334,7 @@ Create a new order on a Kalshi prediction market
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Created order data |
| `order` | object | The created order object |
### `kalshi_cancel_order`
@@ -358,8 +352,8 @@ Cancel an existing order on Kalshi
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Canceled order data |
| `order` | object | The canceled order object |
| `reducedBy` | number | Number of contracts canceled |
### `kalshi_amend_order`
@@ -387,8 +381,7 @@ Modify the price or quantity of an existing order on Kalshi
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Amended order data |
| `order` | object | The amended order object |

View File

@@ -11,9 +11,11 @@
"calendly",
"clay",
"confluence",
"cursor",
"datadog",
"discord",
"dropbox",
"duckduckgo",
"dynamodb",
"elasticsearch",
"elevenlabs",
@@ -27,6 +29,7 @@
"google_docs",
"google_drive",
"google_forms",
"google_groups",
"google_search",
"google_sheets",
"google_slides",
@@ -78,6 +81,7 @@
"sendgrid",
"sentry",
"serper",
"sftp",
"sharepoint",
"shopify",
"slack",

View File

@@ -94,11 +94,11 @@ Conduct comprehensive deep research across the web using Parallel AI. Synthesize
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `status` | string | Task status \(running, completed, failed\) |
| `status` | string | Task status \(completed, failed\) |
| `run_id` | string | Unique ID for this research task |
| `message` | string | Status message \(for running tasks\) |
| `message` | string | Status message |
| `content` | object | Research results \(structured based on output_schema\) |
| `basis` | array | Citations and sources with excerpts and confidence levels |
| `basis` | array | Citations and sources with reasoning and confidence levels |

View File

@@ -54,8 +54,9 @@ Generate completions using Perplexity AI chat models
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Chat completion results |
| `content` | string | Generated text content |
| `model` | string | Model used for generation |
| `usage` | object | Token usage information |
### `perplexity_search`
@@ -79,8 +80,7 @@ Get ranked search results from Perplexity
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Search results |
| `results` | array | Array of search results |

View File

@@ -47,15 +47,14 @@ Retrieve a list of prediction markets from Polymarket with optional filtering
| `order` | string | No | Sort field \(e.g., volumeNum, liquidityNum, startDate, endDate, createdAt\) |
| `ascending` | string | No | Sort direction \(true for ascending, false for descending\) |
| `tagId` | string | No | Filter by tag ID |
| `limit` | string | No | Number of results per page \(recommended: 25-50\) |
| `limit` | string | No | Number of results per page \(max 50\) |
| `offset` | string | No | Pagination offset \(skip this many results\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Markets data and metadata |
| `markets` | array | Array of market objects |
### `polymarket_get_market`
@@ -72,8 +71,7 @@ Retrieve details of a specific prediction market by ID or slug
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Market data and metadata |
| `market` | object | Market object with details |
### `polymarket_get_events`
@@ -87,15 +85,14 @@ Retrieve a list of events from Polymarket with optional filtering
| `order` | string | No | Sort field \(e.g., volume, liquidity, startDate, endDate, createdAt\) |
| `ascending` | string | No | Sort direction \(true for ascending, false for descending\) |
| `tagId` | string | No | Filter by tag ID |
| `limit` | string | No | Number of results per page \(recommended: 25-50\) |
| `limit` | string | No | Number of results per page \(max 50\) |
| `offset` | string | No | Pagination offset \(skip this many results\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Events data and metadata |
| `events` | array | Array of event objects |
### `polymarket_get_event`
@@ -112,8 +109,7 @@ Retrieve details of a specific event by ID or slug
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Event data and metadata |
| `event` | object | Event object with details |
### `polymarket_get_tags`
@@ -123,15 +119,14 @@ Retrieve available tags for filtering markets from Polymarket
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `limit` | string | No | Number of results per page \(recommended: 25-50\) |
| `limit` | string | No | Number of results per page \(max 50\) |
| `offset` | string | No | Pagination offset \(skip this many results\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Tags data and metadata |
| `tags` | array | Array of tag objects with id, label, and slug |
### `polymarket_search`
@@ -142,15 +137,14 @@ Search for markets, events, and profiles on Polymarket
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `query` | string | Yes | Search query term |
| `limit` | string | No | Number of results per page \(recommended: 25-50\) |
| `offset` | string | No | Pagination offset \(skip this many results\) |
| `limit` | string | No | Number of results per page \(max 50\) |
| `offset` | string | No | Pagination offset |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Search results and metadata |
| `results` | object | Search results containing markets, events, and profiles arrays |
### `polymarket_get_series`
@@ -160,15 +154,14 @@ Retrieve series (related market groups) from Polymarket
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `limit` | string | No | Number of results per page \(recommended: 25-50\) |
| `limit` | string | No | Number of results per page \(max 50\) |
| `offset` | string | No | Pagination offset \(skip this many results\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Series data and metadata |
| `series` | array | Array of series objects |
### `polymarket_get_series_by_id`
@@ -184,8 +177,7 @@ Retrieve a specific series (related market group) by ID from Polymarket
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Series data and metadata |
| `series` | object | Series object with details |
### `polymarket_get_orderbook`
@@ -201,8 +193,7 @@ Retrieve the order book summary for a specific token
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Orderbook data and metadata |
| `orderbook` | object | Order book with bids and asks arrays |
### `polymarket_get_price`
@@ -219,8 +210,7 @@ Retrieve the market price for a specific token and side
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Price data and metadata |
| `price` | string | Market price |
### `polymarket_get_midpoint`
@@ -236,8 +226,7 @@ Retrieve the midpoint price for a specific token
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Midpoint price data and metadata |
| `midpoint` | string | Midpoint price |
### `polymarket_get_price_history`
@@ -257,8 +246,7 @@ Retrieve historical price data for a specific market token
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Price history data and metadata |
| `history` | array | Array of price history entries with timestamp \(t\) and price \(p\) |
### `polymarket_get_last_trade_price`
@@ -274,8 +262,7 @@ Retrieve the last trade price for a specific token
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Last trade price and metadata |
| `price` | string | Last trade price |
### `polymarket_get_spread`
@@ -291,8 +278,7 @@ Retrieve the bid-ask spread for a specific token
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Spread data and metadata |
| `spread` | object | Bid-ask spread with bid and ask prices |
### `polymarket_get_tick_size`
@@ -308,8 +294,7 @@ Retrieve the minimum tick size for a specific token
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Tick size and metadata |
| `tickSize` | string | Minimum tick size |
### `polymarket_get_positions`
@@ -326,8 +311,7 @@ Retrieve user positions from Polymarket
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Positions data and metadata |
| `positions` | array | Array of position objects |
### `polymarket_get_trades`
@@ -339,15 +323,14 @@ Retrieve trade history from Polymarket
| --------- | ---- | -------- | ----------- |
| `user` | string | No | User wallet address to filter trades |
| `market` | string | No | Market ID to filter trades |
| `limit` | string | No | Number of results per page \(recommended: 25-50\) |
| `limit` | string | No | Number of results per page \(max 50\) |
| `offset` | string | No | Pagination offset \(skip this many results\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Trades data and metadata |
| `trades` | array | Array of trade objects |

View File

@@ -138,283 +138,684 @@ Delete an account from Salesforce CRM
### `salesforce_get_contacts`
Get contact(s) from Salesforce - single contact if ID provided, or list if not
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | No | No description |
| `instanceUrl` | string | No | No description |
| `contactId` | string | No | Contact ID \(if provided, returns single contact\) |
| `limit` | string | No | Number of results \(default: 100, max: 2000\). Only for list query. |
| `fields` | string | No | Comma-separated fields \(e.g., "Id,FirstName,LastName,Email,Phone"\) |
| `orderBy` | string | No | Order by field \(e.g., "LastName ASC"\). Only for list query. |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | json | Operation result data |
| `output` | object | Contact\(s\) data |
### `salesforce_create_contact`
Create a new contact in Salesforce CRM
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | No | No description |
| `instanceUrl` | string | No | No description |
| `lastName` | string | Yes | Last name \(required\) |
| `firstName` | string | No | First name |
| `email` | string | No | Email address |
| `phone` | string | No | Phone number |
| `accountId` | string | No | Account ID to associate contact with |
| `title` | string | No | No description |
| `department` | string | No | Department |
| `mailingStreet` | string | No | Mailing street |
| `mailingCity` | string | No | Mailing city |
| `mailingState` | string | No | Mailing state |
| `mailingPostalCode` | string | No | Mailing postal code |
| `mailingCountry` | string | No | Mailing country |
| `description` | string | No | Contact description |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | json | Operation result data |
| `output` | object | Created contact data |
### `salesforce_update_contact`
Update an existing contact in Salesforce CRM
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | No | No description |
| `instanceUrl` | string | No | No description |
| `contactId` | string | Yes | Contact ID to update \(required\) |
| `lastName` | string | No | Last name |
| `firstName` | string | No | First name |
| `email` | string | No | Email address |
| `phone` | string | No | Phone number |
| `accountId` | string | No | Account ID to associate with |
| `title` | string | No | No description |
| `department` | string | No | Department |
| `mailingStreet` | string | No | Mailing street |
| `mailingCity` | string | No | Mailing city |
| `mailingState` | string | No | Mailing state |
| `mailingPostalCode` | string | No | Mailing postal code |
| `mailingCountry` | string | No | Mailing country |
| `description` | string | No | Description |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | json | Operation result data |
| `output` | object | Updated contact data |
### `salesforce_delete_contact`
Delete a contact from Salesforce CRM
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | No | No description |
| `instanceUrl` | string | No | No description |
| `contactId` | string | Yes | Contact ID to delete \(required\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | json | Operation result data |
| `output` | object | Deleted contact data |
### `salesforce_get_leads`
Get lead(s) from Salesforce
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | No | No description |
| `instanceUrl` | string | No | No description |
| `leadId` | string | No | Lead ID \(optional\) |
| `limit` | string | No | Max results \(default: 100\) |
| `fields` | string | No | Comma-separated fields |
| `orderBy` | string | No | Order by field |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | json | Operation result data |
| `success` | boolean | Success status |
| `output` | object | Lead data |
### `salesforce_create_lead`
Create a new lead
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | No | No description |
| `instanceUrl` | string | No | No description |
| `lastName` | string | Yes | Last name \(required\) |
| `company` | string | Yes | Company \(required\) |
| `firstName` | string | No | First name |
| `email` | string | No | No description |
| `phone` | string | No | No description |
| `status` | string | No | Lead status |
| `leadSource` | string | No | Lead source |
| `title` | string | No | No description |
| `description` | string | No | Description |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | json | Operation result data |
| `success` | boolean | Success |
| `output` | object | Created lead |
### `salesforce_update_lead`
Update an existing lead
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | No | No description |
| `instanceUrl` | string | No | No description |
| `leadId` | string | Yes | Lead ID \(required\) |
| `lastName` | string | No | Last name |
| `company` | string | No | No description |
| `firstName` | string | No | First name |
| `email` | string | No | No description |
| `phone` | string | No | No description |
| `status` | string | No | Lead status |
| `leadSource` | string | No | Lead source |
| `title` | string | No | No description |
| `description` | string | No | Description |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | json | Operation result data |
| `success` | boolean | Success |
| `output` | object | Updated lead |
### `salesforce_delete_lead`
Delete a lead
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | No | No description |
| `instanceUrl` | string | No | No description |
| `leadId` | string | Yes | Lead ID \(required\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | json | Operation result data |
| `success` | boolean | Success |
| `output` | object | Deleted lead |
### `salesforce_get_opportunities`
Get opportunity(ies) from Salesforce
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | No | No description |
| `instanceUrl` | string | No | No description |
| `opportunityId` | string | No | Opportunity ID \(optional\) |
| `limit` | string | No | Max results \(default: 100\) |
| `fields` | string | No | Comma-separated fields |
| `orderBy` | string | No | Order by field |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | json | Operation result data |
| `success` | boolean | Success |
| `output` | object | Opportunity data |
### `salesforce_create_opportunity`
Create a new opportunity
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | No | No description |
| `instanceUrl` | string | No | No description |
| `name` | string | Yes | Opportunity name \(required\) |
| `stageName` | string | Yes | Stage name \(required\) |
| `closeDate` | string | Yes | Close date YYYY-MM-DD \(required\) |
| `accountId` | string | No | Account ID |
| `amount` | string | No | Amount \(number\) |
| `probability` | string | No | Probability \(0-100\) |
| `description` | string | No | Description |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | json | Operation result data |
| `success` | boolean | Success |
| `output` | object | Created opportunity |
### `salesforce_update_opportunity`
Update an existing opportunity
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | No | No description |
| `instanceUrl` | string | No | No description |
| `opportunityId` | string | Yes | Opportunity ID \(required\) |
| `name` | string | No | Opportunity name |
| `stageName` | string | No | Stage name |
| `closeDate` | string | No | Close date YYYY-MM-DD |
| `accountId` | string | No | Account ID |
| `amount` | string | No | No description |
| `probability` | string | No | Probability \(0-100\) |
| `description` | string | No | Description |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | json | Operation result data |
| `success` | boolean | Success |
| `output` | object | Updated opportunity |
### `salesforce_delete_opportunity`
Delete an opportunity
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | No | No description |
| `instanceUrl` | string | No | No description |
| `opportunityId` | string | Yes | Opportunity ID \(required\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | json | Operation result data |
| `success` | boolean | Success |
| `output` | object | Deleted opportunity |
### `salesforce_get_cases`
Get case(s) from Salesforce
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | No | No description |
| `instanceUrl` | string | No | No description |
| `caseId` | string | No | Case ID \(optional\) |
| `limit` | string | No | Max results \(default: 100\) |
| `fields` | string | No | Comma-separated fields |
| `orderBy` | string | No | Order by field |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | json | Operation result data |
| `success` | boolean | Success |
| `output` | object | Case data |
### `salesforce_create_case`
Create a new case
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | No | No description |
| `instanceUrl` | string | No | No description |
| `subject` | string | Yes | Case subject \(required\) |
| `status` | string | No | Status \(e.g., New, Working, Escalated\) |
| `priority` | string | No | Priority \(e.g., Low, Medium, High\) |
| `origin` | string | No | Origin \(e.g., Phone, Email, Web\) |
| `contactId` | string | No | Contact ID |
| `accountId` | string | No | Account ID |
| `description` | string | No | Description |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | json | Operation result data |
| `success` | boolean | Success |
| `output` | object | Created case |
### `salesforce_update_case`
Update an existing case
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | No | No description |
| `instanceUrl` | string | No | No description |
| `caseId` | string | Yes | Case ID \(required\) |
| `subject` | string | No | Case subject |
| `status` | string | No | Status |
| `priority` | string | No | Priority |
| `description` | string | No | Description |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | json | Operation result data |
| `success` | boolean | Success |
| `output` | object | Updated case |
### `salesforce_delete_case`
Delete a case
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | No | No description |
| `instanceUrl` | string | No | No description |
| `caseId` | string | Yes | Case ID \(required\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | json | Operation result data |
| `success` | boolean | Success |
| `output` | object | Deleted case |
### `salesforce_get_tasks`
Get task(s) from Salesforce
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | No | No description |
| `instanceUrl` | string | No | No description |
| `taskId` | string | No | Task ID \(optional\) |
| `limit` | string | No | Max results \(default: 100\) |
| `fields` | string | No | Comma-separated fields |
| `orderBy` | string | No | Order by field |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | json | Operation result data |
| `success` | boolean | Success |
| `output` | object | Task data |
### `salesforce_create_task`
Create a new task
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | No | No description |
| `instanceUrl` | string | No | No description |
| `subject` | string | Yes | Task subject \(required\) |
| `status` | string | No | Status \(e.g., Not Started, In Progress, Completed\) |
| `priority` | string | No | Priority \(e.g., Low, Normal, High\) |
| `activityDate` | string | No | Due date YYYY-MM-DD |
| `whoId` | string | No | Related Contact/Lead ID |
| `whatId` | string | No | Related Account/Opportunity ID |
| `description` | string | No | Description |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | json | Operation result data |
| `success` | boolean | Success |
| `output` | object | Created task |
### `salesforce_update_task`
Update an existing task
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | No | No description |
| `instanceUrl` | string | No | No description |
| `taskId` | string | Yes | Task ID \(required\) |
| `subject` | string | No | Task subject |
| `status` | string | No | Status |
| `priority` | string | No | Priority |
| `activityDate` | string | No | Due date YYYY-MM-DD |
| `description` | string | No | Description |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | json | Operation result data |
| `success` | boolean | Success |
| `output` | object | Updated task |
### `salesforce_delete_task`
Delete a task
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | No | No description |
| `instanceUrl` | string | No | No description |
| `taskId` | string | Yes | Task ID \(required\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | json | Operation result data |
| `success` | boolean | Success |
| `output` | object | Deleted task |
### `salesforce_list_reports`
Get a list of reports accessible by the current user
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | No | No description |
| `instanceUrl` | string | No | No description |
| `folderName` | string | No | Filter by folder name |
| `searchTerm` | string | No | Search term to filter reports by name |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Success status |
| `output` | object | Reports data |
### `salesforce_get_report`
Get metadata and describe information for a specific report
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | No | No description |
| `instanceUrl` | string | No | No description |
| `reportId` | string | Yes | Report ID \(required\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Success status |
| `output` | object | Report metadata |
### `salesforce_run_report`
Execute a report and retrieve the results
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | No | No description |
| `instanceUrl` | string | No | No description |
| `reportId` | string | Yes | Report ID \(required\) |
| `includeDetails` | string | No | Include detail rows \(true/false, default: true\) |
| `filters` | string | No | JSON string of report filters to apply |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Success status |
| `output` | object | Report results |
### `salesforce_list_report_types`
Get a list of available report types
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | No | No description |
| `instanceUrl` | string | No | No description |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Success status |
| `output` | object | Report types data |
### `salesforce_list_dashboards`
Get a list of dashboards accessible by the current user
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | No | No description |
| `instanceUrl` | string | No | No description |
| `folderName` | string | No | Filter by folder name |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Success status |
| `output` | object | Dashboards data |
### `salesforce_get_dashboard`
Get details and results for a specific dashboard
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | No | No description |
| `instanceUrl` | string | No | No description |
| `dashboardId` | string | Yes | Dashboard ID \(required\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Success status |
| `output` | object | Dashboard data |
### `salesforce_refresh_dashboard`
Refresh a dashboard to get the latest data
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | No | No description |
| `instanceUrl` | string | No | No description |
| `dashboardId` | string | Yes | Dashboard ID \(required\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Success status |
| `output` | object | Refreshed dashboard data |
### `salesforce_query`
Execute a custom SOQL query to retrieve data from Salesforce
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | No | No description |
| `instanceUrl` | string | No | No description |
| `query` | string | Yes | SOQL query to execute \(e.g., SELECT Id, Name FROM Account LIMIT 10\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Success status |
| `output` | object | Query results |
### `salesforce_query_more`
Retrieve additional query results using the nextRecordsUrl from a previous query
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | No | No description |
| `instanceUrl` | string | No | No description |
| `nextRecordsUrl` | string | Yes | The nextRecordsUrl from a previous query response |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Success status |
| `output` | object | Query results |
### `salesforce_describe_object`
Get metadata and field information for a Salesforce object
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | No | No description |
| `instanceUrl` | string | No | No description |
| `objectName` | string | Yes | API name of the object \(e.g., Account, Contact, Lead, Custom_Object__c\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Success status |
| `output` | object | Object metadata |
### `salesforce_list_objects`
Get a list of all available Salesforce objects
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `idToken` | string | No | No description |
| `instanceUrl` | string | No | No description |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Success status |
| `output` | object | Objects list |

View File

@@ -345,19 +345,30 @@ Delete an email template from SendGrid
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `message` | string | Status or success message |
| `messageId` | string | Email message ID \(send_mail\) |
| `to` | string | Recipient email address \(send_mail\) |
| `subject` | string | Email subject \(send_mail, create_template_version\) |
| `id` | string | Resource ID |
| `jobId` | string | Job ID for async operations |
| `email` | string | Email address |
| `firstName` | string | First name |
| `lastName` | string | Last name |
| `email` | string | Contact email address |
| `firstName` | string | Contact first name |
| `lastName` | string | Contact last name |
| `createdAt` | string | Creation timestamp |
| `updatedAt` | string | Last update timestamp |
| `listIds` | json | Array of list IDs the contact belongs to |
| `customFields` | json | Custom field values |
| `contacts` | json | Array of contacts |
| `contactCount` | number | Number of contacts |
| `lists` | json | Array of lists |
| `templates` | json | Array of templates |
| `message` | string | Status or success message |
| `name` | string | Resource name |
| `templates` | json | Array of templates |
| `generation` | string | Template generation |
| `versions` | json | Array of template versions |
| `templateId` | string | Template ID |
| `active` | boolean | Whether template version is active |
| `htmlContent` | string | HTML content |
| `plainContent` | string | Plain text content |
### `sendgrid_create_template_version`

View File

@@ -0,0 +1,188 @@
---
title: SFTP
description: Transfer files via SFTP (SSH File Transfer Protocol)
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="sftp"
color="#2D3748"
/>
{/* MANUAL-CONTENT-START:intro */}
[SFTP (SSH File Transfer Protocol)](https://en.wikipedia.org/wiki/SSH_File_Transfer_Protocol) is a secure network protocol that enables you to upload, download, and manage files on remote servers. SFTP operates over SSH, making it ideal for automated, encrypted file transfers and remote file management within modern workflows.
With SFTP tools integrated into Sim, you can easily automate the movement of files between your AI agents and external systems or servers. This empowers your agents to manage critical data exchanges, backups, document generation, and remote system orchestration—all with robust security.
**Key functionality available via SFTP tools:**
- **Upload Files:** Seamlessly transfer files of any type from your workflow to a remote server, with support for both password and SSH private key authentication.
- **Download Files:** Retrieve files from remote SFTP servers directly for processing, archiving, or further automation.
- **List & Manage Files:** Enumerate directories, delete or create files and folders, and manage file system permissions remotely.
- **Flexible Authentication:** Connect using either traditional passwords or SSH keys, with support for passphrases and permissions control.
- **Large File Support:** Programmatically manage large file uploads and downloads, with built-in size limits for safety.
By integrating SFTP into Sim, you can automate secure file operations as part of any workflow, whether its data collection, reporting, remote system maintenance, or dynamic content exchange between platforms.
The sections below describe the key SFTP tools available:
- **sftp_upload:** Upload one or more files to a remote server.
- **sftp_download:** Download files from a remote server to your workflow.
- **sftp_list:** List directory contents on a remote SFTP server.
- **sftp_delete:** Delete files or directories from a remote server.
- **sftp_create:** Create new files on a remote SFTP server.
- **sftp_mkdir:** Create new directories remotely.
See the tool documentation below for detailed input and output parameters for each operation.
{/* MANUAL-CONTENT-END */}
## Usage Instructions
Upload, download, list, and manage files on remote servers via SFTP. Supports both password and private key authentication for secure file transfers.
## Tools
### `sftp_upload`
Upload files to a remote SFTP server
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `host` | string | Yes | SFTP server hostname or IP address |
| `port` | number | Yes | SFTP server port \(default: 22\) |
| `username` | string | Yes | SFTP username |
| `password` | string | No | Password for authentication \(if not using private key\) |
| `privateKey` | string | No | Private key for authentication \(OpenSSH format\) |
| `passphrase` | string | No | Passphrase for encrypted private key |
| `remotePath` | string | Yes | Destination directory on the remote server |
| `files` | file[] | No | Files to upload |
| `fileContent` | string | No | Direct file content to upload \(for text files\) |
| `fileName` | string | No | File name when using direct content |
| `overwrite` | boolean | No | Whether to overwrite existing files \(default: true\) |
| `permissions` | string | No | File permissions \(e.g., 0644\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Whether the upload was successful |
| `uploadedFiles` | json | Array of uploaded file details \(name, remotePath, size\) |
| `message` | string | Operation status message |
### `sftp_download`
Download a file from a remote SFTP server
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `host` | string | Yes | SFTP server hostname or IP address |
| `port` | number | Yes | SFTP server port \(default: 22\) |
| `username` | string | Yes | SFTP username |
| `password` | string | No | Password for authentication \(if not using private key\) |
| `privateKey` | string | No | Private key for authentication \(OpenSSH format\) |
| `passphrase` | string | No | Passphrase for encrypted private key |
| `remotePath` | string | Yes | Path to the file on the remote server |
| `encoding` | string | No | Output encoding: utf-8 for text, base64 for binary \(default: utf-8\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Whether the download was successful |
| `fileName` | string | Name of the downloaded file |
| `content` | string | File content \(text or base64 encoded\) |
| `size` | number | File size in bytes |
| `encoding` | string | Content encoding \(utf-8 or base64\) |
| `message` | string | Operation status message |
### `sftp_list`
List files and directories on a remote SFTP server
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `host` | string | Yes | SFTP server hostname or IP address |
| `port` | number | Yes | SFTP server port \(default: 22\) |
| `username` | string | Yes | SFTP username |
| `password` | string | No | Password for authentication \(if not using private key\) |
| `privateKey` | string | No | Private key for authentication \(OpenSSH format\) |
| `passphrase` | string | No | Passphrase for encrypted private key |
| `remotePath` | string | Yes | Directory path on the remote server |
| `detailed` | boolean | No | Include detailed file information \(size, permissions, modified date\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Whether the operation was successful |
| `path` | string | Directory path that was listed |
| `entries` | json | Array of directory entries with name, type, size, permissions, modifiedAt |
| `count` | number | Number of entries in the directory |
| `message` | string | Operation status message |
### `sftp_delete`
Delete a file or directory on a remote SFTP server
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `host` | string | Yes | SFTP server hostname or IP address |
| `port` | number | Yes | SFTP server port \(default: 22\) |
| `username` | string | Yes | SFTP username |
| `password` | string | No | Password for authentication \(if not using private key\) |
| `privateKey` | string | No | Private key for authentication \(OpenSSH format\) |
| `passphrase` | string | No | Passphrase for encrypted private key |
| `remotePath` | string | Yes | Path to the file or directory to delete |
| `recursive` | boolean | No | Delete directories recursively |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Whether the deletion was successful |
| `deletedPath` | string | Path that was deleted |
| `message` | string | Operation status message |
### `sftp_mkdir`
Create a directory on a remote SFTP server
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `host` | string | Yes | SFTP server hostname or IP address |
| `port` | number | Yes | SFTP server port \(default: 22\) |
| `username` | string | Yes | SFTP username |
| `password` | string | No | Password for authentication \(if not using private key\) |
| `privateKey` | string | No | Private key for authentication \(OpenSSH format\) |
| `passphrase` | string | No | Passphrase for encrypted private key |
| `remotePath` | string | Yes | Path for the new directory |
| `recursive` | boolean | No | Create parent directories if they do not exist |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Whether the directory was created successfully |
| `createdPath` | string | Path of the created directory |
| `message` | string | Operation status message |
## Notes
- Category: `tools`
- Type: `sftp`

View File

@@ -7,7 +7,7 @@ import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="smtp"
color="#4A5568"
color="#2D3748"
/>
{/* MANUAL-CONTENT-START:intro */}

View File

@@ -40,7 +40,7 @@ Processes a provided thought/instruction, making it available for subsequent ste
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `thought` | string | Yes | The thought process or instruction provided by the user in the Thinking Step block. |
| `thought` | string | Yes | Your internal reasoning, analysis, or thought process. Use this to think through the problem step by step before responding. |
#### Output

View File

@@ -34,38 +34,30 @@ Integrate Translate into the workflow. Can translate text to any language.
## Tools
### `openai_chat`
### `llm_chat`
Send a chat completion request to any supported LLM provider
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `model` | string | Yes | The model to use \(e.g., gpt-4o, claude-sonnet-4-5, gemini-2.0-flash\) |
| `systemPrompt` | string | No | System prompt to set the behavior of the assistant |
| `context` | string | Yes | The user message or context to send to the model |
| `apiKey` | string | No | API key for the provider \(uses platform key if not provided for hosted models\) |
| `temperature` | number | No | Temperature for response generation \(0-2\) |
| `maxTokens` | number | No | Maximum tokens in the response |
| `azureEndpoint` | string | No | Azure OpenAI endpoint URL |
| `azureApiVersion` | string | No | Azure OpenAI API version |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `content` | string | Translated text |
| `model` | string | Model used |
| `tokens` | json | Token usage |
### `anthropic_chat`
### `google_chat`
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `content` | string | Translated text |
| `model` | string | Model used |
| `tokens` | json | Token usage |
| `content` | string | The generated response content |
| `model` | string | The model used for generation |
| `tokens` | object | Token usage information |

View File

@@ -254,8 +254,8 @@ Upload a media file (image, video, document) to WordPress.com
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `siteId` | string | Yes | WordPress.com site ID or domain \(e.g., 12345678 or mysite.wordpress.com\) |
| `file` | string | Yes | Base64 encoded file data or URL to fetch file from |
| `filename` | string | Yes | Filename with extension \(e.g., image.jpg\) |
| `file` | file | No | File to upload \(UserFile object\) |
| `filename` | string | No | Optional filename override \(e.g., image.jpg\) |
| `title` | string | No | Media title |
| `caption` | string | No | Media caption |
| `altText` | string | No | Alternative text for accessibility |

View File

@@ -173,25 +173,6 @@ Get videos from a YouTube playlist.
| --------- | ---- | ----------- |
| `items` | array | Array of videos in the playlist |
### `youtube_related_videos`
Find videos related to a specific YouTube video.
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `videoId` | string | Yes | YouTube video ID to find related videos for |
| `maxResults` | number | No | Maximum number of related videos to return \(1-50\) |
| `pageToken` | string | No | Page token for pagination |
| `apiKey` | string | Yes | YouTube API Key |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `items` | array | Array of related videos |
### `youtube_comments`
Get comments from a YouTube video.

View File

@@ -76,8 +76,9 @@ Retrieve a list of tickets from Zendesk with optional filtering
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Tickets data and metadata |
| `tickets` | array | Array of ticket objects |
| `paging` | object | Pagination information |
| `metadata` | object | Operation metadata |
### `zendesk_get_ticket`
@@ -96,8 +97,8 @@ Get a single ticket by ID from Zendesk
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Ticket data |
| `ticket` | object | Ticket object |
| `metadata` | object | Operation metadata |
### `zendesk_create_ticket`
@@ -125,8 +126,8 @@ Create a new ticket in Zendesk with support for custom fields
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Created ticket data |
| `ticket` | object | Created ticket object |
| `metadata` | object | Operation metadata |
### `zendesk_create_tickets_bulk`
@@ -145,8 +146,8 @@ Create multiple tickets in Zendesk at once (max 100)
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Bulk create job status |
| `jobStatus` | object | Job status object |
| `metadata` | object | Operation metadata |
### `zendesk_update_ticket`
@@ -174,8 +175,8 @@ Update an existing ticket in Zendesk with support for custom fields
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Updated ticket data |
| `ticket` | object | Updated ticket object |
| `metadata` | object | Operation metadata |
### `zendesk_update_tickets_bulk`
@@ -199,8 +200,8 @@ Update multiple tickets in Zendesk at once (max 100)
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Bulk update job status |
| `jobStatus` | object | Job status object |
| `metadata` | object | Operation metadata |
### `zendesk_delete_ticket`
@@ -219,8 +220,8 @@ Delete a ticket from Zendesk
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Delete confirmation |
| `deleted` | boolean | Deletion success |
| `metadata` | object | Operation metadata |
### `zendesk_merge_tickets`
@@ -241,8 +242,8 @@ Merge multiple tickets into a target ticket
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Merge job status |
| `jobStatus` | object | Job status object |
| `metadata` | object | Operation metadata |
### `zendesk_get_users`
@@ -264,8 +265,9 @@ Retrieve a list of users from Zendesk with optional filtering
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Users data and metadata |
| `users` | array | Array of user objects |
| `paging` | object | Pagination information |
| `metadata` | object | Operation metadata |
### `zendesk_get_user`
@@ -284,8 +286,8 @@ Get a single user by ID from Zendesk
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | User data |
| `user` | object | User object |
| `metadata` | object | Operation metadata |
### `zendesk_get_current_user`
@@ -303,8 +305,8 @@ Get the currently authenticated user from Zendesk
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Current user data |
| `user` | object | Current user object |
| `metadata` | object | Operation metadata |
### `zendesk_search_users`
@@ -326,8 +328,9 @@ Search for users in Zendesk using a query string
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Users search results |
| `users` | array | Array of user objects |
| `paging` | object | Pagination information |
| `metadata` | object | Operation metadata |
### `zendesk_create_user`
@@ -353,8 +356,8 @@ Create a new user in Zendesk
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Created user data |
| `user` | object | Created user object |
| `metadata` | object | Operation metadata |
### `zendesk_create_users_bulk`
@@ -373,8 +376,8 @@ Create multiple users in Zendesk using bulk import
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Bulk creation job status |
| `jobStatus` | object | Job status object |
| `metadata` | object | Operation metadata |
### `zendesk_update_user`
@@ -401,8 +404,8 @@ Update an existing user in Zendesk
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Updated user data |
| `user` | object | Updated user object |
| `metadata` | object | Operation metadata |
### `zendesk_update_users_bulk`
@@ -421,8 +424,8 @@ Update multiple users in Zendesk using bulk update
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Bulk update job status |
| `jobStatus` | object | Job status object |
| `metadata` | object | Operation metadata |
### `zendesk_delete_user`
@@ -441,8 +444,8 @@ Delete a user from Zendesk
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Deleted user data |
| `deleted` | boolean | Deletion success |
| `metadata` | object | Operation metadata |
### `zendesk_get_organizations`
@@ -462,8 +465,9 @@ Retrieve a list of organizations from Zendesk
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Organizations data and metadata |
| `organizations` | array | Array of organization objects |
| `paging` | object | Pagination information |
| `metadata` | object | Operation metadata |
### `zendesk_get_organization`
@@ -482,8 +486,8 @@ Get a single organization by ID from Zendesk
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Organization data |
| `organization` | object | Organization object |
| `metadata` | object | Operation metadata |
### `zendesk_autocomplete_organizations`
@@ -504,8 +508,9 @@ Autocomplete organizations in Zendesk by name prefix (for name matching/autocomp
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Organizations search results |
| `organizations` | array | Array of organization objects |
| `paging` | object | Pagination information |
| `metadata` | object | Operation metadata |
### `zendesk_create_organization`
@@ -529,8 +534,8 @@ Create a new organization in Zendesk
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Created organization data |
| `organization` | object | Created organization object |
| `metadata` | object | Operation metadata |
### `zendesk_create_organizations_bulk`
@@ -549,8 +554,8 @@ Create multiple organizations in Zendesk using bulk import
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Bulk creation job status |
| `jobStatus` | object | Job status object |
| `metadata` | object | Operation metadata |
### `zendesk_update_organization`
@@ -575,8 +580,8 @@ Update an existing organization in Zendesk
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Updated organization data |
| `organization` | object | Updated organization object |
| `metadata` | object | Operation metadata |
### `zendesk_delete_organization`
@@ -595,8 +600,8 @@ Delete an organization from Zendesk
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Deleted organization data |
| `deleted` | boolean | Deletion success |
| `metadata` | object | Operation metadata |
### `zendesk_search`
@@ -619,8 +624,9 @@ Unified search across tickets, users, and organizations in Zendesk
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Search results |
| `results` | array | Array of result objects |
| `paging` | object | Pagination information |
| `metadata` | object | Operation metadata |
### `zendesk_search_count`
@@ -639,8 +645,8 @@ Count the number of search results matching a query in Zendesk
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Search count result |
| `count` | number | Number of matching results |
| `metadata` | object | Operation metadata |

View File

@@ -30,6 +30,9 @@ Use the Start block for everything originating from the editor, deploy-to-API, o
<Card title="Schedule" href="/triggers/schedule">
Cron or interval based execution
</Card>
<Card title="RSS Feed" href="/triggers/rss">
Monitor RSS and Atom feeds for new content
</Card>
</Cards>
## Quick Comparison
@@ -39,6 +42,7 @@ Use the Start block for everything originating from the editor, deploy-to-API, o
| **Start** | Editor runs, deploy-to-API requests, or chat messages |
| **Schedule** | Timer managed in schedule block |
| **Webhook** | On inbound HTTP request |
| **RSS Feed** | New item published to feed |
> The Start block always exposes `input`, `conversationId`, and `files` fields. Add custom fields to the input format for additional structured data.

View File

@@ -1,3 +1,3 @@
{
"pages": ["index", "start", "schedule", "webhook"]
"pages": ["index", "start", "schedule", "webhook", "rss"]
}

View File

@@ -0,0 +1,49 @@
---
title: RSS Feed
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Image } from '@/components/ui/image'
The RSS Feed block monitors RSS and Atom feeds when new items are published, your workflow triggers automatically.
<div className="flex justify-center">
<Image
src="/static/blocks/rss.png"
alt="RSS Feed Block"
width={500}
height={400}
className="my-6"
/>
</div>
## Configuration
1. **Add RSS Feed Block** - Drag the RSS Feed block to start your workflow
2. **Enter Feed URL** - Paste the URL of any RSS or Atom feed
3. **Deploy** - Deploy your workflow to activate polling
Once deployed, the feed is checked every minute for new items.
## Output Fields
| Field | Type | Description |
|-------|------|-------------|
| `title` | string | Item title |
| `link` | string | Item link |
| `pubDate` | string | Publication date |
| `item` | object | Raw item with all fields |
| `feed` | object | Raw feed metadata |
Access mapped fields directly (`<rss.title>`) or use the raw objects for any field (`<rss.item.author>`, `<rss.feed.language>`).
## Use Cases
- **Content monitoring** - Track blogs, news sites, or competitor updates
- **Podcast automation** - Trigger workflows when new episodes drop
- **Release tracking** - Monitor GitHub releases, changelogs, or product updates
- **Social aggregation** - Collect content from platforms that expose RSS feeds
<Callout>
RSS triggers only fire for items published after you save the trigger. Existing feed items are not processed.
</Callout>

View File

@@ -142,8 +142,8 @@ Function (Process) → Condition (account_type === 'enterprise') → Advanced or
## 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 detenga
- **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 tus rangos de condición
- **Ordena 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
- **Usa la rama else cuando sea necesario**: Si ninguna condición coincide y la rama else no está conectada, la rama del flujo de trabajo terminará correctamente. Conecta la rama else si necesitas una ruta alternativa para casos no coincidentes
- **Mantén las expresiones simples**: Usa expresiones booleanas claras y directas para mejorar la legibilidad y facilitar la depuración
- **Documenta tus condiciones**: Añade descripciones para explicar el propósito de cada condición para una mejor colaboración en equipo y mantenimiento
- **Prueba 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

@@ -27,14 +27,16 @@ Todas las respuestas de la API incluyen información sobre tus límites de ejecu
"limits": {
"workflowExecutionRateLimit": {
"sync": {
"limit": 60, // Max sync workflow executions per minute
"remaining": 58, // Remaining sync workflow executions
"resetAt": "..." // When the window resets
"requestsPerMinute": 60, // Sustained rate limit per minute
"maxBurst": 120, // Maximum burst capacity
"remaining": 118, // Current tokens available (up to maxBurst)
"resetAt": "..." // When tokens next refill
},
"async": {
"limit": 60, // Max async workflow executions per minute
"remaining": 59, // Remaining async workflow executions
"resetAt": "..." // When the window resets
"requestsPerMinute": 200, // Sustained rate limit per minute
"maxBurst": 400, // Maximum burst capacity
"remaining": 398, // Current tokens available
"resetAt": "..." // When tokens next refill
}
},
"usage": {
@@ -46,7 +48,7 @@ Todas las respuestas de la API incluyen información sobre tus límites de ejecu
}
```
**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-*`).
**Nota:** Los límites de tasa utilizan un algoritmo de cubo de tokens. `remaining` puede exceder `requestsPerMinute` hasta `maxBurst` cuando no has usado tu asignación completa recientemente, permitiendo tráfico en ráfagas. Los límites de tasa en el cuerpo de la respuesta son para ejecuciones de flujo de trabajo. Los límites de tasa para llamar a este punto final de la API están en los encabezados de respuesta (`X-RateLimit-*`).
### Consultar registros
@@ -110,13 +112,15 @@ Consulta los registros de ejecución de flujos de trabajo con amplias opciones d
"limits": {
"workflowExecutionRateLimit": {
"sync": {
"limit": 60,
"remaining": 58,
"requestsPerMinute": 60,
"maxBurst": 120,
"remaining": 118,
"resetAt": "2025-01-01T12:35:56.789Z"
},
"async": {
"limit": 60,
"remaining": 59,
"requestsPerMinute": 200,
"maxBurst": 400,
"remaining": 398,
"resetAt": "2025-01-01T12:35:56.789Z"
}
},
@@ -190,13 +194,15 @@ Recupera información detallada sobre una entrada de registro específica.
"limits": {
"workflowExecutionRateLimit": {
"sync": {
"limit": 60,
"remaining": 58,
"requestsPerMinute": 60,
"maxBurst": 120,
"remaining": 118,
"resetAt": "2025-01-01T12:35:56.789Z"
},
"async": {
"limit": 60,
"remaining": 59,
"requestsPerMinute": 200,
"maxBurst": 400,
"remaining": 398,
"resetAt": "2025-01-01T12:35:56.789Z"
}
},
@@ -482,19 +488,27 @@ Las entregas de webhook fallidas se reintentan con retroceso exponencial y fluct
## Limitación de tasa
La API implementa limitación de tasa para asegurar un uso justo:
La API utiliza un **algoritmo de cubo de tokens** para limitar la tasa, proporcionando un uso justo mientras permite tráfico en ráfagas:
- **Plan gratuito**: 10 solicitudes por minuto
- **Plan Pro**: 30 solicitudes por minuto
- **Plan Team**: 60 solicitudes por minuto
- **Plan Enterprise**: Límites personalizados
| Plan | Solicitudes/Minuto | Capacidad de ráfaga |
|------|-----------------|----------------|
| Free | 10 | 20 |
| Pro | 30 | 60 |
| Team | 60 | 120 |
| Enterprise | 120 | 240 |
La información de límite de tasa se incluye en las cabeceras de respuesta:
- `X-RateLimit-Limit`: Solicitudes máximas por ventana
- `X-RateLimit-Remaining`: Solicitudes restantes en la ventana actual
- `X-RateLimit-Reset`: Marca de tiempo ISO cuando la ventana se reinicia
**Cómo funciona:**
- Los tokens se recargan a una tasa de `requestsPerMinute`
- Puedes acumular hasta `maxBurst` tokens cuando estás inactivo
- Cada solicitud consume 1 token
- La capacidad de ráfaga permite manejar picos de tráfico
## Ejemplo: Sondeo de nuevos registros
La información del límite de tasa se incluye en los encabezados de respuesta:
- `X-RateLimit-Limit`: Solicitudes por minuto (tasa de recarga)
- `X-RateLimit-Remaining`: Tokens disponibles actualmente
- `X-RateLimit-Reset`: Marca de tiempo ISO cuando los tokens se recargan nuevamente
## Ejemplo: Sondeo para nuevos registros
```javascript
let cursor = null;

View File

@@ -147,8 +147,20 @@ curl -X GET -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" htt
{
"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" },
"sync": {
"isLimited": false,
"requestsPerMinute": 25,
"maxBurst": 50,
"remaining": 50,
"resetAt": "2025-09-08T22:51:55.999Z"
},
"async": {
"isLimited": false,
"requestsPerMinute": 200,
"maxBurst": 400,
"remaining": 400,
"resetAt": "2025-09-08T22:51:56.155Z"
},
"authType": "api"
},
"usage": {
@@ -159,6 +171,11 @@ curl -X GET -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" htt
}
```
**Campos de límite de tasa:**
- `requestsPerMinute`: Límite de tasa sostenida (los tokens se recargan a esta velocidad)
- `maxBurst`: Máximo de tokens que puedes acumular (capacidad de ráfaga)
- `remaining`: Tokens disponibles actualmente (puede ser hasta `maxBurst`)
**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 agrupados de la organización (Equipo/Empresa)
@@ -170,38 +187,38 @@ 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 sinc, 10 asinc |
| **Pro** | $100 | 10 sinc, 50 asinc |
| **Equipo** | $500 (agrupado) | 50 sinc, 100 asinc |
| **Gratuito** | $10 | 5 sincrónico, 10 asincrónico |
| **Pro** | $100 | 10 sincrónico, 50 asincrónico |
| **Equipo** | $500 (agrupado) | 50 sincrónico, 100 asincrónico |
| **Empresa** | Personalizado | Personalizado |
## Modelo de facturación
Sim utiliza un modelo de facturación de **suscripción base + exceso**:
Sim utiliza un modelo de facturación de **suscripción base + excedente**:
### Cómo funciona
**Plan Pro ($20/mes):**
- La suscripción mensual incluye $20 de uso
- Uso por debajo de $20 → Sin cargos adicionales
- Uso por encima de $20 → Pagas el exceso al final del mes
- Ejemplo: $35 de uso = $20 (suscripción) + $15 (exceso)
- Uso por encima de $20 → Pagas el excedente al final del mes
- Ejemplo: $35 de uso = $20 (suscripción) + $15 (excedente)
**Plan de equipo ($40/usuario/mes):**
**Plan de Equipo ($40/usuario/mes):**
- Uso agrupado entre todos los miembros del equipo
- Exceso calculado del uso total del equipo
- Excedente calculado del uso total del equipo
- El propietario de la organización recibe una sola factura
**Planes empresariales:**
- Precio mensual fijo, sin excesos
**Planes Empresariales:**
- Precio mensual fijo, sin excedentes
- Límites de uso personalizados según el acuerdo
### Facturación por umbral
Cuando el exceso no facturado alcanza los $50, Sim factura automáticamente el monto total no facturado.
Cuando el excedente no facturado alcanza los $50, Sim factura automáticamente el monto total no facturado.
**Ejemplo:**
- Día 10: $70 de exceso → Factura inmediata de $70
- Día 10: $70 de excedente → Factura inmediata de $70
- Día 15: $35 adicionales de uso ($105 en total) → Ya facturado, sin acción
- Día 20: Otros $50 de uso ($155 en total, $85 no facturados) → Factura inmediata de $85
@@ -209,8 +226,8 @@ Esto distribuye los cargos por exceso a lo largo del mes en lugar de una gran fa
## Mejores prácticas para la gestión de costos
1. **Monitorear regularmente**: Revisa tu panel de uso frecuentemente para evitar sorpresas
2. **Establecer presupuestos**: Usa los límites del plan como guías para tu gasto
1. **Monitorear regularmente**: Revisa tu panel de uso con frecuencia 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

View File

@@ -72,7 +72,7 @@ Para integraciones personalizadas, aprovecha nuestro [soporte MCP (Protocolo de
<Video src="introduction/integrations-sidebar.mp4" width={700} height={450} />
</div>
## Copiloto potenciado por IA
## Copilot
**Haz preguntas y recibe orientación**
Copiloto responde preguntas sobre Sim, explica tus flujos de trabajo y proporciona sugerencias para mejorarlos. Usa el símbolo `@` para hacer referencia a flujos de trabajo, bloques, documentación, conocimiento y registros para obtener asistencia contextual.

View File

@@ -1,5 +1,7 @@
---
title: Base de conocimientos
title: Descripción general
description: Sube, procesa y busca a través de tus documentos con búsqueda
vectorial inteligente y fragmentación
---
import { Video } from '@/components/ui/video'

View File

@@ -0,0 +1,155 @@
---
title: Docker
description: Despliega Sim Studio con Docker Compose
---
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { Callout } from 'fumadocs-ui/components/callout'
## Inicio rápido
```bash
# Clone and start
git clone https://github.com/simstudioai/sim.git && cd sim
docker compose -f docker-compose.prod.yml up -d
```
Abre [http://localhost:3000](http://localhost:3000)
## Configuración de producción
### 1. Configurar entorno
```bash
# Generate secrets
cat > .env << EOF
DATABASE_URL=postgresql://postgres:postgres@db:5432/simstudio
BETTER_AUTH_SECRET=$(openssl rand -hex 32)
ENCRYPTION_KEY=$(openssl rand -hex 32)
INTERNAL_API_SECRET=$(openssl rand -hex 32)
NEXT_PUBLIC_APP_URL=https://sim.yourdomain.com
BETTER_AUTH_URL=https://sim.yourdomain.com
NEXT_PUBLIC_SOCKET_URL=https://sim.yourdomain.com
EOF
```
### 2. Iniciar servicios
```bash
docker compose -f docker-compose.prod.yml up -d
```
### 3. Configurar SSL
<Tabs items={['Caddy (Recomendado)', 'Nginx + Certbot']}>
<Tab value="Caddy (Recomendado)">
Caddy gestiona automáticamente los certificados SSL.
```bash
# Install Caddy
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update && sudo apt install caddy
```
Crea `/etc/caddy/Caddyfile`:
```
sim.yourdomain.com {
reverse_proxy localhost:3000
handle /socket.io/* {
reverse_proxy localhost:3002
}
}
```
```bash
sudo systemctl restart caddy
```
</Tab>
<Tab value="Nginx + Certbot">
```bash
# Install
sudo apt install nginx certbot python3-certbot-nginx -y
# Create /etc/nginx/sites-available/sim
server {
listen 80;
server_name sim.yourdomain.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /socket.io/ {
proxy_pass http://127.0.0.1:3002;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
# Enable and get certificate
sudo ln -s /etc/nginx/sites-available/sim /etc/nginx/sites-enabled/
sudo certbot --nginx -d sim.yourdomain.com
```
</Tab>
</Tabs>
## Ollama
```bash
# With GPU
docker compose -f docker-compose.ollama.yml --profile gpu --profile setup up -d
# CPU only
docker compose -f docker-compose.ollama.yml --profile cpu --profile setup up -d
```
Descarga modelos adicionales:
```bash
docker compose -f docker-compose.ollama.yml exec ollama ollama pull llama3.2
```
### Ollama externo
Si Ollama se ejecuta en tu máquina host (no en Docker):
```bash
# macOS/Windows
OLLAMA_URL=http://host.docker.internal:11434 docker compose -f docker-compose.prod.yml up -d
# Linux - use your host IP
OLLAMA_URL=http://192.168.1.100:11434 docker compose -f docker-compose.prod.yml up -d
```
<Callout type="warning">
Dentro de Docker, `localhost` se refiere al contenedor, no a tu host. Usa `host.docker.internal` o la IP de tu host.
</Callout>
## Comandos
```bash
# View logs
docker compose -f docker-compose.prod.yml logs -f simstudio
# Stop
docker compose -f docker-compose.prod.yml down
# Update
docker compose -f docker-compose.prod.yml pull && docker compose -f docker-compose.prod.yml up -d
# Backup database
docker compose -f docker-compose.prod.yml exec db pg_dump -U postgres simstudio > backup.sql
```

View File

@@ -0,0 +1,87 @@
---
title: Variables de entorno
description: Referencia de configuración para Sim Studio
---
import { Callout } from 'fumadocs-ui/components/callout'
## Requeridas
| Variable | Descripción |
|----------|-------------|
| `DATABASE_URL` | Cadena de conexión PostgreSQL |
| `BETTER_AUTH_SECRET` | Secreto de autenticación (32 caracteres hex): `openssl rand -hex 32` |
| `BETTER_AUTH_URL` | URL de tu aplicación |
| `ENCRYPTION_KEY` | Clave de cifrado (32 caracteres hex): `openssl rand -hex 32` |
| `INTERNAL_API_SECRET` | Secreto de API interna (32 caracteres hex): `openssl rand -hex 32` |
| `NEXT_PUBLIC_APP_URL` | URL pública de la aplicación |
| `NEXT_PUBLIC_SOCKET_URL` | URL de WebSocket (predeterminado: `http://localhost:3002`) |
## Proveedores de IA
| Variable | Proveedor |
|----------|----------|
| `OPENAI_API_KEY` | OpenAI |
| `ANTHROPIC_API_KEY_1` | Anthropic Claude |
| `GEMINI_API_KEY_1` | Google Gemini |
| `MISTRAL_API_KEY` | Mistral |
| `OLLAMA_URL` | Ollama (predeterminado: `http://localhost:11434`) |
<Callout type="info">
Para balanceo de carga, añade múltiples claves con sufijos `_1`, `_2`, `_3` (p. ej., `OPENAI_API_KEY_1`, `OPENAI_API_KEY_2`). Funciona con OpenAI, Anthropic y Gemini.
</Callout>
<Callout type="info">
En Docker, usa `OLLAMA_URL=http://host.docker.internal:11434` para Ollama en la máquina host.
</Callout>
### Azure OpenAI
| Variable | Descripción |
|----------|-------------|
| `AZURE_OPENAI_API_KEY` | Clave de API de Azure OpenAI |
| `AZURE_OPENAI_ENDPOINT` | URL del endpoint de Azure OpenAI |
| `AZURE_OPENAI_API_VERSION` | Versión de API (p. ej., `2024-02-15-preview`) |
### vLLM (autoalojado)
| Variable | Descripción |
|----------|-------------|
| `VLLM_BASE_URL` | URL del servidor vLLM (p. ej., `http://localhost:8000/v1`) |
| `VLLM_API_KEY` | Token bearer opcional para vLLM |
## Proveedores OAuth
| Variable | Descripción |
|----------|-------------|
| `GOOGLE_CLIENT_ID` | ID de cliente OAuth de Google |
| `GOOGLE_CLIENT_SECRET` | Secreto de cliente OAuth de Google |
| `GITHUB_CLIENT_ID` | ID de cliente OAuth de GitHub |
| `GITHUB_CLIENT_SECRET` | Secreto de cliente OAuth de GitHub |
## Opcional
| Variable | Descripción |
|----------|-------------|
| `API_ENCRYPTION_KEY` | Encripta las claves API almacenadas (32 caracteres hexadecimales): `openssl rand -hex 32` |
| `COPILOT_API_KEY` | Clave API para funciones de copilot |
| `ADMIN_API_KEY` | Clave API de administrador para operaciones GitOps |
| `RESEND_API_KEY` | Servicio de correo electrónico para notificaciones |
| `ALLOWED_LOGIN_DOMAINS` | Restringir registros a dominios (separados por comas) |
| `ALLOWED_LOGIN_EMAILS` | Restringir registros a correos electrónicos específicos (separados por comas) |
| `DISABLE_REGISTRATION` | Establecer como `true` para deshabilitar nuevos registros de usuarios |
## Ejemplo de archivo .env
```bash
DATABASE_URL=postgresql://postgres:postgres@db:5432/simstudio
BETTER_AUTH_SECRET=<openssl rand -hex 32>
BETTER_AUTH_URL=https://sim.yourdomain.com
ENCRYPTION_KEY=<openssl rand -hex 32>
INTERNAL_API_SECRET=<openssl rand -hex 32>
NEXT_PUBLIC_APP_URL=https://sim.yourdomain.com
NEXT_PUBLIC_SOCKET_URL=https://sim.yourdomain.com
OPENAI_API_KEY=sk-...
```
Consulta `apps/sim/.env.example` para todas las opciones.

View File

@@ -0,0 +1,50 @@
---
title: Autoalojamiento
description: Despliega Sim Studio en tu propia infraestructura
---
import { Card, Cards } from 'fumadocs-ui/components/card'
import { Callout } from 'fumadocs-ui/components/callout'
Despliega Sim Studio en tu propia infraestructura con Docker o Kubernetes.
## Requisitos
| Recurso | Mínimo | Recomendado |
|----------|---------|-------------|
| CPU | 2 núcleos | 4+ núcleos |
| RAM | 12 GB | 16+ GB |
| Almacenamiento | 20 GB SSD | 50+ GB SSD |
| Docker | 20.10+ | Última versión |
## Inicio rápido
```bash
git clone https://github.com/simstudioai/sim.git && cd sim
docker compose -f docker-compose.prod.yml up -d
```
Abre [http://localhost:3000](http://localhost:3000)
## Opciones de despliegue
<Cards>
<Card title="Docker" href="/self-hosting/docker">
Despliega con Docker Compose en cualquier servidor
</Card>
<Card title="Kubernetes" href="/self-hosting/kubernetes">
Despliega con Helm en clústeres de Kubernetes
</Card>
<Card title="Plataformas en la nube" href="/self-hosting/platforms">
Guías para Railway, DigitalOcean, AWS, Azure, GCP
</Card>
</Cards>
## Arquitectura
| Componente | Puerto | Descripción |
|-----------|------|-------------|
| simstudio | 3000 | Aplicación principal |
| realtime | 3002 | Servidor WebSocket |
| db | 5432 | PostgreSQL con pgvector |
| migrations | - | Migraciones de base de datos (se ejecuta una vez) |

View File

@@ -0,0 +1,133 @@
---
title: Kubernetes
description: Desplegar Sim Studio con Helm
---
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { Callout } from 'fumadocs-ui/components/callout'
## Requisitos previos
- Kubernetes 1.19+
- Helm 3.0+
- Soporte de aprovisionador PV
## Instalación
```bash
# Clone repo
git clone https://github.com/simstudioai/sim.git && cd sim
# Generate secrets
BETTER_AUTH_SECRET=$(openssl rand -hex 32)
ENCRYPTION_KEY=$(openssl rand -hex 32)
INTERNAL_API_SECRET=$(openssl rand -hex 32)
# Install
helm install sim ./helm/sim \
--set app.env.BETTER_AUTH_SECRET="$BETTER_AUTH_SECRET" \
--set app.env.ENCRYPTION_KEY="$ENCRYPTION_KEY" \
--set app.env.INTERNAL_API_SECRET="$INTERNAL_API_SECRET" \
--namespace simstudio --create-namespace
```
## Valores específicos para la nube
<Tabs items={['AWS EKS', 'Azure AKS', 'GCP GKE']}>
<Tab value="AWS EKS">
```bash
helm install sim ./helm/sim \
--values ./helm/sim/examples/values-aws.yaml \
--set app.env.BETTER_AUTH_SECRET="$BETTER_AUTH_SECRET" \
--set app.env.ENCRYPTION_KEY="$ENCRYPTION_KEY" \
--set app.env.INTERNAL_API_SECRET="$INTERNAL_API_SECRET" \
--set app.env.NEXT_PUBLIC_APP_URL="https://sim.yourdomain.com" \
--namespace simstudio --create-namespace
```
</Tab>
<Tab value="Azure AKS">
```bash
helm install sim ./helm/sim \
--values ./helm/sim/examples/values-azure.yaml \
--set app.env.BETTER_AUTH_SECRET="$BETTER_AUTH_SECRET" \
--set app.env.ENCRYPTION_KEY="$ENCRYPTION_KEY" \
--set app.env.INTERNAL_API_SECRET="$INTERNAL_API_SECRET" \
--set app.env.NEXT_PUBLIC_APP_URL="https://sim.yourdomain.com" \
--namespace simstudio --create-namespace
```
</Tab>
<Tab value="GCP GKE">
```bash
helm install sim ./helm/sim \
--values ./helm/sim/examples/values-gcp.yaml \
--set app.env.BETTER_AUTH_SECRET="$BETTER_AUTH_SECRET" \
--set app.env.ENCRYPTION_KEY="$ENCRYPTION_KEY" \
--set app.env.INTERNAL_API_SECRET="$INTERNAL_API_SECRET" \
--set app.env.NEXT_PUBLIC_APP_URL="https://sim.yourdomain.com" \
--namespace simstudio --create-namespace
```
</Tab>
</Tabs>
## Configuración clave
```yaml
# Custom values.yaml
app:
replicaCount: 2
env:
NEXT_PUBLIC_APP_URL: "https://sim.yourdomain.com"
OPENAI_API_KEY: "sk-..."
postgresql:
persistence:
size: 50Gi
ingress:
enabled: true
className: nginx
tls:
enabled: true
app:
host: sim.yourdomain.com
```
Consulta `helm/sim/values.yaml` para todas las opciones.
## Base de datos externa
```yaml
postgresql:
enabled: false
externalDatabase:
enabled: true
host: "your-db-host"
port: 5432
username: "postgres"
password: "your-password"
database: "simstudio"
sslMode: "require"
```
## Comandos
```bash
# Port forward for local access
kubectl port-forward deployment/sim-sim-app 3000:3000 -n simstudio
# View logs
kubectl logs -l app.kubernetes.io/component=app -n simstudio --tail=100
# Upgrade
helm upgrade sim ./helm/sim --namespace simstudio
# Uninstall
helm uninstall sim --namespace simstudio
```

View File

@@ -0,0 +1,124 @@
---
title: Plataformas en la nube
description: Despliega Sim Studio en plataformas en la nube
---
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { Callout } from 'fumadocs-ui/components/callout'
## Railway
Despliegue con un solo clic con aprovisionamiento automático de PostgreSQL.
[
![Desplegar en Railway](https://railway.app/button.svg)
](https://railway.com/new/template/sim-studio)
Después del despliegue, añade variables de entorno en el panel de Railway:
- `BETTER_AUTH_SECRET`, `ENCRYPTION_KEY`, `INTERNAL_API_SECRET` (generadas automáticamente)
- `OPENAI_API_KEY` u otras claves de proveedores de IA
- Dominio personalizado en Configuración → Redes
## Despliegue en VPS
Para DigitalOcean, AWS EC2, Azure VMs o cualquier servidor Linux:
<Tabs items={['DigitalOcean', 'AWS EC2', 'Azure VM']}>
<Tab value="DigitalOcean">
**Recomendado:** Droplet de 16 GB RAM, Ubuntu 24.04
```bash
# Create Droplet via console, then SSH in
ssh root@your-droplet-ip
```
</Tab>
<Tab value="AWS EC2">
**Recomendado:** t3.xlarge (16 GB RAM), Ubuntu 24.04
```bash
ssh -i your-key.pem ubuntu@your-ec2-ip
```
</Tab>
<Tab value="Azure VM">
**Recomendado:** Standard_D4s_v3 (16 GB RAM), Ubuntu 24.04
```bash
ssh azureuser@your-vm-ip
```
</Tab>
</Tabs>
### Instalar Docker
```bash
# Install Docker (official method)
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER
# Logout and reconnect, then verify
docker --version
```
### Desplegar Sim Studio
```bash
git clone https://github.com/simstudioai/sim.git && cd sim
# Create .env with secrets
cat > .env << EOF
DATABASE_URL=postgresql://postgres:postgres@db:5432/simstudio
BETTER_AUTH_SECRET=$(openssl rand -hex 32)
ENCRYPTION_KEY=$(openssl rand -hex 32)
INTERNAL_API_SECRET=$(openssl rand -hex 32)
NEXT_PUBLIC_APP_URL=https://sim.yourdomain.com
BETTER_AUTH_URL=https://sim.yourdomain.com
NEXT_PUBLIC_SOCKET_URL=https://sim.yourdomain.com
EOF
# Start
docker compose -f docker-compose.prod.yml up -d
```
### SSL con Caddy
```bash
# Install Caddy
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update && sudo apt install caddy
# Configure (replace domain)
echo 'sim.yourdomain.com {
reverse_proxy localhost:3000
handle /socket.io/* {
reverse_proxy localhost:3002
}
}' | sudo tee /etc/caddy/Caddyfile
sudo systemctl restart caddy
```
Apunta el registro DNS A de tu dominio a la IP de tu servidor.
## Kubernetes (EKS, AKS, GKE)
Consulta la [guía de Kubernetes](/self-hosting/kubernetes) para la implementación con Helm en Kubernetes gestionado.
## Base de datos gestionada (Opcional)
Para producción, utiliza un servicio de PostgreSQL gestionado:
- **AWS RDS** / **Azure Database** / **Cloud SQL** - Habilita la extensión pgvector
- **Supabase** / **Neon** - pgvector incluido
Establece `DATABASE_URL` en tu entorno:
```bash
DATABASE_URL="postgresql://user:pass@host:5432/db?sslmode=require"
```

View File

@@ -0,0 +1,113 @@
---
title: Solución de problemas
description: Problemas comunes y soluciones
---
## Falló la conexión a la base de datos
```bash
# Check database is running
docker compose ps db
# Test connection
docker compose exec db psql -U postgres -c "SELECT 1"
```
Verifica el formato de `DATABASE_URL`: `postgresql://user:pass@host:5432/database`
## Los modelos de Ollama no se muestran
Dentro de Docker, `localhost` = el contenedor, no tu máquina host.
```bash
# For host-machine Ollama, use:
OLLAMA_URL=http://host.docker.internal:11434 # macOS/Windows
OLLAMA_URL=http://192.168.1.x:11434 # Linux (use actual IP)
```
## WebSocket/Tiempo real no funciona
1. Comprueba que `NEXT_PUBLIC_SOCKET_URL` coincida con tu dominio
2. Verifica que el servicio en tiempo real esté funcionando: `docker compose ps realtime`
3. Asegúrate de que el proxy inverso pase las actualizaciones de WebSocket (consulta la [guía de Docker](/self-hosting/docker))
## Error 502 Bad Gateway
```bash
# Check app is running
docker compose ps simstudio
docker compose logs simstudio
# Common causes: out of memory, database not ready
```
## Errores de migración
```bash
# View migration logs
docker compose logs migrations
# Run manually
docker compose exec simstudio bun run db:migrate
```
## pgvector no encontrado
Usa la imagen correcta de PostgreSQL:
```yaml
image: pgvector/pgvector:pg17 # NOT postgres:17
```
## Errores de certificado (CERT_HAS_EXPIRED)
Si ves errores de certificado SSL al llamar a APIs externas:
```bash
# Update CA certificates in container
docker compose exec simstudio apt-get update && apt-get install -y ca-certificates
# Or set in environment (not recommended for production)
NODE_TLS_REJECT_UNAUTHORIZED=0
```
## Página en blanco después del inicio de sesión
1. Revisa la consola del navegador para ver errores
2. Verifica que `NEXT_PUBLIC_APP_URL` coincida con tu dominio actual
3. Borra las cookies del navegador y el almacenamiento local
4. Comprueba que todos los servicios estén funcionando: `docker compose ps`
## Problemas específicos de Windows
**Errores de Turbopack en Windows:**
```bash
# Use WSL2 for better compatibility
wsl --install
# Or disable Turbopack in package.json
# Change "next dev --turbopack" to "next dev"
```
**Problemas de fin de línea:**
```bash
# Configure git to use LF
git config --global core.autocrlf input
```
## Ver registros
```bash
# All services
docker compose logs -f
# Specific service
docker compose logs -f simstudio
```
## Obtener ayuda
- [GitHub Issues](https://github.com/simstudioai/sim/issues)
- [Discord](https://discord.gg/Hr4UWYEcTT)

View File

@@ -0,0 +1,182 @@
---
title: Cursor
description: Lanza y gestiona agentes en la nube de Cursor para trabajar en
repositorios de GitHub
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="cursor"
color="#1E1E1E"
/>
{/* MANUAL-CONTENT-START:intro */}
[Cursor](https://www.cursor.so/) es un IDE con IA y una plataforma basada en la nube que te permite lanzar y gestionar potentes agentes de IA capaces de trabajar directamente en tus repositorios de GitHub. Los agentes de Cursor pueden automatizar tareas de desarrollo, mejorar la productividad de tu equipo y colaborar contigo realizando cambios en el código, respondiendo a instrucciones en lenguaje natural y manteniendo un historial de conversaciones sobre sus actividades.
Con Cursor, puedes:
- **Lanzar agentes en la nube para bases de código**: Crear instantáneamente nuevos agentes de IA que trabajen en tus repositorios en la nube
- **Delegar tareas de programación usando lenguaje natural**: Guiar a los agentes con instrucciones escritas, modificaciones y aclaraciones
- **Monitorizar el progreso y los resultados**: Obtener el estado del agente, ver resultados detallados e inspeccionar tareas actuales o completadas
- **Acceder al historial completo de conversaciones**: Revisar todos los prompts y respuestas de IA para mayor transparencia y capacidad de auditoría
- **Controlar y gestionar el ciclo de vida del agente**: Listar agentes activos, terminar agentes y gestionar lanzamientos de agentes basados en API y seguimientos
En Sim, la integración con Cursor permite que tus agentes y flujos de trabajo interactúen programáticamente con los agentes en la nube de Cursor. Esto significa que puedes usar Sim para:
- Listar todos los agentes en la nube y explorar su estado actual (`cursor_list_agents`)
- Recuperar el estado actualizado y los resultados de cualquier agente (`cursor_get_agent`)
- Ver el historial completo de conversaciones de cualquier agente de programación (`cursor_get_conversation`)
- Añadir instrucciones de seguimiento o nuevos prompts a un agente en ejecución
- Gestionar y terminar agentes según sea necesario
Esta integración te ayuda a combinar la inteligencia flexible de los agentes de Sim con las potentes capacidades de automatización de desarrollo de Cursor, haciendo posible escalar el desarrollo impulsado por IA en todos tus proyectos.
{/* MANUAL-CONTENT-END */}
## Instrucciones de uso
Interactúa con la API de Agentes en la Nube de Cursor para lanzar agentes de IA que pueden trabajar en tus repositorios de GitHub. Permite lanzar agentes, añadir instrucciones de seguimiento, verificar el estado, ver conversaciones y gestionar el ciclo de vida de los agentes.
## Herramientas
### `cursor_list_agents`
Lista todos los agentes en la nube para el usuario autenticado con paginación opcional.
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Sí | Clave API de Cursor |
| `limit` | number | No | Número de agentes a devolver \(predeterminado: 20, máximo: 100\) |
| `cursor` | string | No | Cursor de paginación de la respuesta anterior |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `content` | string | Lista legible de agentes |
| `metadata` | object | Metadatos de la lista de agentes |
### `cursor_get_agent`
Recupera el estado actual y los resultados de un agente en la nube.
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Sí | Clave API de Cursor |
| `agentId` | string | Sí | Identificador único para el agente en la nube \(p. ej., bc_abc123\) |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `content` | string | Detalles del agente en formato legible |
| `metadata` | object | Metadatos del agente |
### `cursor_get_conversation`
Recupera el historial de conversación de un agente en la nube, incluyendo todas las instrucciones del usuario y las respuestas del asistente.
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Sí | Clave API de Cursor |
| `agentId` | string | Sí | Identificador único para el agente en la nube \(p. ej., bc_abc123\) |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `content` | string | Historial de conversación en formato legible |
| `metadata` | object | Metadatos de la conversación |
### `cursor_launch_agent`
Inicia un nuevo agente en la nube para trabajar en un repositorio de GitHub con las instrucciones proporcionadas.
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Sí | Clave API de Cursor |
| `repository` | string | Sí | URL del repositorio de GitHub \(p. ej., https://github.com/your-org/your-repo\) |
| `ref` | string | No | Rama, etiqueta o commit desde donde trabajar \(por defecto usa la rama principal\) |
| `promptText` | string | Sí | El texto de instrucciones para el agente |
| `promptImages` | string | No | Array JSON de objetos de imagen con datos en base64 y dimensiones |
| `model` | string | No | Modelo a utilizar \(dejar vacío para selección automática\) |
| `branchName` | string | No | Nombre de rama personalizado para que el agente utilice |
| `autoCreatePr` | boolean | No | Crear automáticamente un PR cuando el agente termine |
| `openAsCursorGithubApp` | boolean | No | Abrir el PR como la aplicación de GitHub de Cursor |
| `skipReviewerRequest` | boolean | No | Omitir la solicitud de revisores en el PR |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `content` | string | Mensaje de éxito con detalles del agente |
| `metadata` | object | Metadatos del resultado de lanzamiento |
### `cursor_add_followup`
Añade una instrucción de seguimiento a un agente en la nube existente.
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Sí | Clave API de Cursor |
| `agentId` | string | Sí | Identificador único para el agente en la nube \(p. ej., bc_abc123\) |
| `followupPromptText` | string | Sí | El texto de instrucción de seguimiento para el agente |
| `promptImages` | string | No | Array JSON de objetos de imagen con datos en base64 y dimensiones \(máximo 5\) |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `content` | string | Mensaje de éxito |
| `metadata` | object | Metadatos del resultado |
### `cursor_stop_agent`
Detener un agente en la nube en ejecución. Esto pausa el agente sin eliminarlo.
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Sí | Clave API de Cursor |
| `agentId` | string | Sí | Identificador único para el agente en la nube \(p. ej., bc_abc123\) |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `content` | string | Mensaje de éxito |
| `metadata` | object | Metadatos del resultado |
### `cursor_delete_agent`
Eliminar permanentemente un agente en la nube. Esta acción no se puede deshacer.
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Sí | Clave API de Cursor |
| `agentId` | string | Sí | Identificador único para el agente en la nube \(p. ej., bc_abc123\) |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `content` | string | Mensaje de éxito |
| `metadata` | object | Metadatos del resultado |
## Notas
- Categoría: `tools`
- Tipo: `cursor`

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