Compare commits

...

300 Commits

Author SHA1 Message Date
Waleed Latif
3c3c5b5b1c fix(connectors): audit fixes for sync engine, connectors, and knowledge tools
- Extract shared computeContentHash to connectors/utils.ts (dedup across 7 connectors)
- Include error'd connectors in cron auto-retry query
- Add syncContext caching for Confluence (cloudId, spaceId)
- Batch Confluence label fetches with concurrency limit of 10
- Enforce maxPages in Confluence v2 path
- Clean up stale storage files on document update
- Retry stuck documents (pending/failed) after sync completes
- Soft-delete documents and reclaim tag slots on connector deletion
- Add incremental sync support to ConnectorConfig interface
- Fix offset:0 falsy check in list_documents tool

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 13:56:01 -08:00
Waleed Latif
ea6692517b feat(db): add knowledge connector migration after merge
Generated migration 0162 for knowledge_connector and
knowledge_connector_sync_log tables after resolving merge
conflicts with feat/mothership-copilot.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 13:26:56 -08:00
Waleed Latif
9e0c41df8c Merge remote-tracking branch 'origin/feat/mothership-copilot' into waleedlatif1/resolve-kb-conflicts
# Conflicts:
#	apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/credential-selector/components/oauth-required-modal.tsx
#	apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/credential-selector/credential-selector.tsx
#	apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/components/tools/credential-selector.tsx
#	apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/integrations/integrations.tsx
#	apps/sim/blocks/blocks/airtable.ts
#	apps/sim/blocks/blocks/knowledge.ts
#	apps/sim/tools/airtable/list_bases.ts
#	apps/sim/tools/registry.ts
#	packages/db/migrations/meta/0155_snapshot.json
#	packages/db/migrations/meta/_journal.json
#	packages/db/schema.ts
2026-03-05 13:25:24 -08:00
Waleed
a368827f1e feat(api): add tables and files v1 REST API with OpenAPI docs (#3422)
* feat(api): add tables and files v1 REST API with OpenAPI docs

* fix(api): address review feedback for tables/files REST API

* fix(api): reject empty filters, consolidate PUT/DELETE into service helpers

* fix(api): upsert unique constraints, POST response fields, uploadedAt timestamp

* fix(api): stop leaking internal fields in list tables, fix deleteTable requestId

* fix(api): atomic table-count limit in createTable, stop leaking internal fields

* fix(api): error classification in PATCH, z.coerce→preprocess, requestId in logs

* fix(api): audit logging, PATCH service consolidation, Content-Disposition encoding

- Add TABLE_CREATED/TABLE_DELETED audit events to v1 table routes
- Consolidate PATCH handlers to use updateRow service function
- Fix Content-Disposition header with RFC 5987 dual-parameter form
- Normalize schema in POST /tables response with normalizeColumn

* lint

* fix(api): upsert unique constraint 400, guard request.json() parse errors

- Add 'Unique constraint violation' to upsert error classification
- Wrap PUT/DELETE request.json() in try/catch to return 400 on malformed body
- Apply fixes to both v1 and internal routes

* fix(api): guard PATCH request.json(), accurate deleteRowsByIds count

- Wrap PATCH request.json() in try/catch for both v1 and internal routes
- Rewrite deleteRowsByIds to use .returning() for accurate deletedCount
  under concurrent requests (eliminates SELECT-then-DELETE race)

* fix(api): guard all remaining request.json() calls in table routes

- Wrap POST handler request.json() in try/catch across all table routes
- Also fix internal DELETE single-row handler
- Every request.json() in table routes now returns 400 on malformed body

* fix(api): safe type check on formData workspaceId in file upload

- Replace unsafe `as string | null` cast with typeof check
- Prevents File object from bypassing workspaceId validation

* fix(api): safe File cast in upload, validate column name before sql.raw()

- Use instanceof File check instead of unsafe `as File | null` cast
- Add regex validation on column name before sql.raw() interpolation

* fix(api): comprehensive hardening pass across all table/file routes

- Guard request.formData() with try/catch in file upload
- Guard all .toISOString() calls with instanceof Date checks
- Replace verifyTableWorkspace double-fetch with direct comparison
- Fix relative imports to absolute (@/app/api/table/utils)
- Fix internal list tables leaking fields via ...t spread
- Normalize schema in internal POST create table response
- Remove redundant pre-check in internal create (service handles atomically)
- Make 'maximum table limit' return 403 consistently (was 400 in internal)
- Add 'Row not found' → 404 classification in PATCH handlers
- Add NAME_PATTERN validation before sql.raw() in validation.ts

* chore: lint fixes
2026-03-05 13:16:13 -08:00
Siddharth Ganesan
337154054e Oauth link 2026-03-04 17:35:32 -08:00
Siddharth Ganesan
c6ac0b4445 Agent subdir 2026-03-04 16:50:24 -08:00
Waleed
b07925fcc0 feat(settings): migrate settings from modal to route-based pages (#3413) 2026-03-04 15:20:52 -08:00
Siddharth Ganesan
08fb8c1651 Tool perms 2026-03-04 13:44:46 -08:00
Siddharth Ganesan
37337aece5 Scope perms 2026-03-04 12:44:04 -08:00
Siddharth Ganesan
da349176ab Fix merge conflicts 2026-03-04 11:17:01 -08:00
Siddharth Ganesan
6f3559ce8f Fix merge conflicts 2026-03-04 11:15:43 -08:00
Siddharth Ganesan
9a7b5ffe64 Fix merge conflicts 2026-03-04 11:13:42 -08:00
Siddharth Ganesan
4ede071ecb Fix merge conflicts 2026-03-04 11:12:51 -08:00
Siddharth Ganesan
161fb37244 Remove migrations 2026-03-04 10:48:12 -08:00
Emir Karabeg
d1575927a2 improvement(theme): system default 2026-03-04 01:29:47 -08:00
Waleed
efc1aeed70 fix(subflows): fix pointer events for nested subflow interaction (#3409)
* fix(subflows): fix pointer events for nested subflow interaction

* fix(subflows): use Tailwind class for pointer-events-none
2026-03-03 23:28:51 -08:00
Emir Karabeg
a3b19fb32a improvement(user-input): ui, files 2026-03-03 22:56:07 -08:00
Waleed
46065983f6 fix(editor): restore cursor position after tag/env-var completion in code editors (#3406)
* fix(editor): restore cursor position after tag/env-var completion in code editors

* lint

* refactor(editor): extract restoreCursorAfterInsertion helper, fix weak fallbacks

* updated

* fix(editor): replace useEffect with direct ref assignment for editorValueRef

* fix(editor): guard cursor restoration behind preview/readOnly check

Move restoreCursorAfterInsertion inside the !isPreview && !readOnly guard
so cursor position isn't computed against newValue when the textarea still
holds liveValue. Add comment documenting the cross-string index invariant
in the shared helper.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(editor): escape blockId in CSS selector with CSS.escape()

Prevents potential SyntaxError if blockId ever contains CSS special
characters when querying the textarea for cursor restoration.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* perf(editor): use ref for cursor fallback to stabilize useCallback

Replace cursorPosition state in handleSubflowTagSelect's dependency
array with a cursorPositionRef. This avoids recreating the callback
on every keystroke since cursorPosition is only used as a fallback
when textareaRef.current is null.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* refactor(editor): pass cursor position explicitly from dropdowns

Instead of inferring cursor position by searching for delimiters in the
output string (which could match unrelated < or {{ in code), compute
the exact cursor position in TagDropdown and EnvVarDropdown where the
insertion range is definitively known, and pass it through onSelect.

This follows the same pattern used by CodeMirror, Monaco, and
ProseMirror: the insertion source always knows the range, so cursor
position is computed at the source rather than inferred by the consumer.

- TagDropdown/EnvVarDropdown: compute newCursorPosition, pass as 2nd arg
- restoreCursorAfterInsertion: simplified to just (textarea, position)
- code.tsx, condition-input.tsx, use-subflow-editor.ts: accept position
- Removed editorValueRef and cursorPositionRef from use-subflow-editor
  (no longer needed since dropdown computes position)
- Other consumers (native inputs) unaffected due to TS callback compat

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* docs(editor): fix JSDoc terminology — macrotask not microtask

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 22:10:00 -08:00
Waleed
2c79d0249f improvement(executor): support nested loops/parallels (#3398)
* feat(executor): support nested loop DAG construction and edge wiring

Wire inner loop sentinel nodes into outer loop sentinel chains so that
nested loops execute correctly. Resolves boundary-node detection to use
effective sentinel IDs for nested loops, handles loop-exit edges from
inner sentinel-end to outer sentinel-end, and recursively clears
execution state for all nested loop scopes between iterations.

NOTE: loop-in-loop nesting only; parallel nesting is not yet supported.
Made-with: Cursor

* feat(executor): add nested loop iteration context and named loop variable resolution

Introduce ParentIteration to track ancestor loop state, build a
loopParentMap during DAG construction, and propagate parent iterations
through block execution and child workflow contexts.

Extend LoopResolver to support named loop references (e.g. <loop1.index>)
and add output property resolution (<loop1.result>). Named references
use the block's display name normalized to a tag-safe identifier,
enabling blocks inside nested loops to reference any ancestor loop's
iteration state.

NOTE: loop-in-loop nesting only; parallel nesting is not yet supported.
Made-with: Cursor

* feat(terminal): propagate parent iteration context through SSE events and terminal display

Thread parentIterations through SSE block-started, block-completed, and
block-error events so the terminal can reconstruct nested loop
hierarchies. Update the entry tree builder to recursively nest inner
loop subflow nodes inside their parent iteration rows, using
parentIterations depth-stripping to support arbitrary nesting depth.

Display the block's store name for subflow container rows instead of
the generic "Loop" / "Parallel" label.

Made-with: Cursor

* feat(canvas): allow nesting subflow containers and prevent cycles

Remove the restriction that prevented subflow nodes from being dragged
into other subflow containers, enabling loop-in-loop nesting on the
canvas. Add cycle detection (isDescendantOf) to prevent a container
from being placed inside one of its own descendants.

Resize all ancestor containers when a nested child moves, collect
descendant blocks when removing from a subflow so boundary edges are
attributed correctly, and surface all ancestor loop tags in the tag
dropdown for blocks inside nested loops.

Made-with: Cursor

* feat(agent): add MCP server discovery mode for agent tool input (#3353)

* feat(agent): add MCP server discovery mode for agent tool input

* fix(tool-input): use type variant for MCP server tool count badge

* fix(mcp-dynamic-args): align label styling with standard subblock labels

* standardized inp format UI

* feat(tool-input): replace MCP server inline expand with drill-down navigation

* feat(tool-input): add chevron affordance and keyboard nav for MCP server drill-down

* fix(tool-input): handle mcp-server type in refresh, validation, badges, and usage control

* refactor(tool-validation): extract getMcpServerIssue, remove fake tool hack

* lint

* reorder dropdown

* perf(agent): parallelize MCP server tool creation with Promise.all

* fix(combobox): preserve cursor movement in search input, reset query on drilldown

* fix(combobox): route ArrowRight through handleSelect, remove redundant type guards

* fix(agent): rename mcpServers to mcpServerSelections to avoid shadowing DB import, route ArrowRight through handleSelect

* docs: update google integration docs

* fix(tool-input): reset drilldown state on tool selection to prevent stale view

* perf(agent): parallelize MCP server discovery across multiple servers

* improvement(tests): speed up unit tests by eliminating vi.resetModules anti-pattern (#3357)

* improvement(tests): speed up unit tests by eliminating vi.resetModules anti-pattern

- convert 51 test files from vi.resetModules/vi.doMock/dynamic import to vi.hoisted/vi.mock/static import
- add global @sim/db mock to vitest.setup.ts
- switch 4 test files from jsdom to node environment
- remove all vi.importActual calls that loaded heavy modules (200+ block files)
- remove slow mockConsoleLogger/mockAuth/setupCommonApiMocks helpers
- reduce real setTimeout delays in engine tests
- mock heavy transitive deps in diff-engine test

test execution time: 34s -> 9s (3.9x faster)
environment time: 2.5s -> 0.6s (4x faster)

* docs(testing): update testing best practices with performance rules

- document vi.hoisted + vi.mock + static import as the standard pattern
- explicitly ban vi.resetModules, vi.doMock, vi.importActual, mockAuth, setupCommonApiMocks
- document global mocks from vitest.setup.ts
- add mock pattern reference for auth, hybrid auth, and database chains
- add performance rules section covering heavy deps, jsdom vs node, real timers

* fix(tests): fix 4 failing test files with missing mocks

- socket/middleware/permissions: add vi.mock for @/lib/auth to prevent transitive getBaseUrl() call
- workflow-handler: add vi.mock for @/executor/utils/http matching executor mock pattern
- evaluator-handler: add db.query.account mock structure before vi.spyOn
- router-handler: same db.query.account fix as evaluator

* fix(tests): replace banned Function type with explicit callback signature

* feat(databricks): add Databricks integration with 8 tools (#3361)

* feat(databricks): add Databricks integration with 8 tools

Add complete Databricks integration supporting SQL execution, job management,
run monitoring, and cluster listing via Personal Access Token authentication.

Tools: execute_sql, list_jobs, run_job, get_run, list_runs, cancel_run,
get_run_output, list_clusters

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(databricks): throw on invalid JSON params, fix boolean coercion, add expandTasks field

- Throw errors on invalid JSON in jobParameters/notebookParams instead of silently defaulting to {}
- Always set boolean params explicitly to prevent string 'false' being truthy
- Add missing expandTasks dropdown UI field for list_jobs operation

* fix(databricks): align tool inputs/outputs with official API spec

- execute_sql: fix wait_timeout default description (50s, not 10s)
- get_run: add queueDuration field, update lifecycle/result state enums
- get_run_output: fix notebook output size (5 MB not 1 MB), add logsTruncated field
- list_runs: add userCancelledOrTimedout to state, fix limit range (1-24), update state enums
- list_jobs: fix name filter description to "exact case-insensitive"
- list_clusters: add PIPELINE_MAINTENANCE to ClusterSource enum

* fix(databricks): regenerate docs to reflect API spec fixes

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* feat(luma): add Luma integration for event and guest management (#3364)

* feat(luma): add Luma integration for event and guest management

Add complete Luma (lu.ma) integration with 6 tools: get event, create event,
update event, list calendar events, get guests, and add guests. Includes block
configuration with wandConfig for timestamps/timezones/durations, advanced mode
for optional fields, and generated documentation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(luma): address PR review feedback

- Remove hosts field from list_events transformResponse (not in LumaEventEntry type)
- Fix truncated add_guests description by removing quotes that broke docs generator

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(luma): fix update_event field name and add_guests response parsing

- Use 'id' instead of 'event_id' in update_event request body per API spec
- Fix add_guests to parse entries[].guest response structure instead of flat guests array

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* feat(gamma): add gamma integration for AI-powered content generation (#3358)

* feat(gamma): add gamma integration for AI-powered content generation

* fix(gamma): address PR review comments

- Make credits/error conditionally included in check_status response to avoid always-truthy objects
- Replace full wordmark SVG with square "G" letterform for proper rendering in icon slots

* fix(gamma): remove imageSource from generate_from_template endpoint

The from-template API only accepts imageOptions.model and imageOptions.style,
not imageOptions.source (image source is inherited from the template).

* fix(gamma): use typed output in check_status transformResponse

* regen docs

* feat(greenhouse): add greenhouse integration for managing candidates, jobs, and applications (#3363)

* feat(ashby): add ashby integration for candidate, job, and application management (#3362)

* feat(ashby): add ashby integration for candidate, job, and application management

* fix(ashby): auto-fix lint formatting in docs files

* improvement(oauth): reordered oauth modal (#3368)

* feat(loops): add Loops email platform integration (#3359)

* feat(loops): add Loops email platform integration

Add complete Loops integration with 10 tools covering all API endpoints:
- Contact management: create, update, find, delete
- Email: send transactional emails with attachments
- Events: trigger automated email sequences
- Lists: list mailing lists and transactional email templates
- Properties: create and list contact properties

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* ran litn

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* feat(resend): expand integration with contacts, domains, and enhanced email ops (#3366)

* improvement(blocks): update luma styling and linkup field modes (#3370)

* improvement(blocks): update luma styling and linkup field modes

* improvement(fireflies): move optional fields to advanced mode

* improvement(blocks): move optional fields to advanced mode for 10 integrations

* improvement(blocks): move optional fields to advanced mode for 6 more integrations

* feat(x): add 28 new X API v2 tool integrations and expand OAuth scopes (#3365)

* feat(x): add 28 new X API v2 tool integrations and expand OAuth scopes

* fix(x): add missing nextToken param to search tweets and fix XCreateTweetParams type

* fix(x): correct API spec issues in retweeted_by, quote_tweets, personalized_trends, and usage tools

* fix(x): add missing newestId and oldestId to error meta in get_liked_tweets and get_quote_tweets

* fix(x): add missing newestId/oldestId to get_liked_tweets success branch and includes to XTweetListResponse

* fix(x): add error handling to create_tweet and delete_tweet transformResponse

* fix(x): add error handling and logger to all X tools

* fix(x): revert block requiredScopes to match current operations

* feat(x): update block to support all 28 new X API v2 tools

* fix(x): add missing text output and fix hiddenResult output key mismatch

* docs(x): regenerate docs for all 28 new X API v2 tools

* improvement(docs): audit and standardize tool description sections, update developer count to 70k (#3371)

* improvement(x): align OAuth scopes, add scope descriptions, and set optional fields to advanced mode (#3372)

* improvement(x): align OAuth scopes, add scope descriptions, and set optional fields to advanced mode

* improvement(skills): add typed JSON outputs guidance to add-tools, add-block, and add-integration skills

* improvement(skills): add final validation steps to add-tools, add-block, and add-integration skills

* fix(skills): correct misleading JSON array comment in wandConfig example

* feat(skills): add validate-integration skill for auditing tools, blocks, and registry against API docs

* improvement(skills): expand validate-integration with full block-tool alignment, OAuth scopes, pagination, and error handling checks

* improvement(ci): add sticky disk caches and bump runner for faster builds (#3373)

* improvement(selectors): make selectorKeys declarative (#3374)

* fix(webflow): resolution for selectors

* remove unecessary fallback'

* fix teams selector resolution

* make selector keys declarative

* selectors fixes

* improvement(selectors): consolidate selector input logic (#3375)

* feat(google-contacts): add google contacts integration (#3340)

* feat(google-contacts): add google contacts integration

* fix(google-contacts): throw error when no update fields provided

* lint

* update icon

* improvement(google-contacts): add advanced mode, error handling, and input trimming

- Set mode: 'advanced' on optional fields (emailType, phoneType, notes, pageSize, pageToken, sortOrder)
- Add createLogger and response.ok error handling to all 6 tools
- Add .trim() on resourceName in get, update, delete URL builders

* improvement(mcp): add all MCP server tools individually instead of as single server entry (#3376)

* improvement(mcp): add all MCP server tools individually instead of as single server entry

* fix(mcp): prevent remove popover from opening inadvertently

* fix(sse): fix memory leaks in SSE stream cleanup and add memory telemetry (#3378)

* fix(sse): fix memory leaks in SSE stream cleanup and add memory telemetry

* improvement(monitoring): add SSE metering to wand, execution-stream, and a2a-message endpoints

* fix(workflow-execute): remove abort from cancel() to preserve run-on-leave behavior

* improvement(monitoring): use stable process.getActiveResourcesInfo() API

* refactor(a2a): hoist resubscribe cleanup to eliminate duplication between start() and cancel()

* style(a2a): format import line

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(wand): set guard flag on early-return decrement for consistency

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* improvement(ashby): validate ashby integration and update skill files (#3381)

* improvement(luma): expand host response fields and harden event ID inputs (#3383)

* improvement(resend): add error handling, authMode, and naming consistency (#3382)

* fix(chat-deploy): fix launch chat popup and auth persistence, clean up React anti-patterns (#3380)

* fix(chat-deploy): fix launch chat popup and auth persistence, clean up React anti-patterns

* lint

* fix(greenhouse): fix email_address query param, add .trim() to ID paths, revert onValidationChange to useEffect

* fix(chat-deploy): fix stale AuthSelector state, stabilize refetch ref, clean up copy timeout

* fix(chat-deploy): reset chatSuccess on modal open to prevent stuck state

* improvement(loops): validate loops integration and update skill files (#3384)

* improvement(loops): validate loops integration and update skill files

* loops icon color

* update databricks icon

* fix(monitoring): set MemoryTelemetry logger to INFO level for production visibility (#3386)

Production defaults to ERROR-only logging. Without this override,
memory snapshots would be silently suppressed.

* feat(integrations): add amplitude, google pagespeed insights, and pagerduty integrations (#3385)

* feat(integrations): add amplitude and google pagespeed insights integrations

* verified and regen docs

* fix icons

* fix(integrations): add pagerduty to tool and block registries

Re-add registry entries that were reverted after initial commit.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* more updates

* ack comemnts

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* feat(docs): add API reference with OpenAPI spec and auto-generated endpoint pages (#3388)

* feat(docs): add API reference with OpenAPI spec and auto-generated endpoint pages

* multiline curl

* random improvements

* cleanup

* update docs copy

* fix build

* cast

* fix builg

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Lakee Sivaraya <71339072+lakeesiv@users.noreply.github.com>
Co-authored-by: Vikhyath Mondreti <vikhyath@simstudio.ai>
Co-authored-by: Vikhyath Mondreti <vikhyathvikku@gmail.com>

* fix(icons): fix pagerduty icon (#3392)

* improvement(executor): audit and harden nested loop/parallel implementation

* improvement(executor): audit and harden nested loop/parallel implementation

- Replace unsafe _childWorkflowInstanceId cast with typeof type guard
- Reuse WorkflowNodeMetadata interface instead of inline type duplication
- Rename _executeCore to executeCore (private, no underscore needed)
- Add log warning when SSE callbacks are dropped beyond MAX_SSE_CHILD_DEPTH
- Remove unnecessary onStream type assertion, use StreamingExecution type
- Convert OUTPUT_PROPERTIES/KNOWN_PROPERTIES from arrays to Sets for O(1) lookup
- Add type guard in loop resolver resolveOutput before casting
- Add TSDoc to edgeCrossesLoopBoundary explaining original-ID usage
- Add TSDoc to MAX_SSE_CHILD_DEPTH constant
- Update ParentIteration TSDoc to reflect parallel nesting support
- Type usageControl as union 'auto'|'force'|'none' in buildMcpTool
- Replace (t: any) casts with typed objects in agent-handler tests
- Add type guard in builder-data convertArrayItem
- Make ctx required in clearLoopExecutionState (only caller always passes it)
- Replace Math.random() with deterministic counter in terminal tests
- Fix isWorkflowBlockType mock to actually check block types
- Add loop-in-loop and workflow block tree tests

* improvement(executor): audit fixes for nested subflow implementation

- Fix findInnermostLoopForBlock/ParallelForBlock to return deepest nested
  container instead of first Object.keys() match
- Fix isBlockInLoopOrDescendant returning false when directLoopId equals
  target (should return true)
- Add isBlockInParallelOrDescendant with recursive nested parallel checking
  to match loop resolver behavior
- Extract duplicated ~20-line iteration context building from loop/parallel
  orchestrators into shared buildContainerIterationContext utility
- Remove inline import() type references in orchestrators
- Remove dead executionOrder field from WorkflowNodeMetadata
- Remove redundant double-normalization in findParallelBoundaryNodes
- Consolidate 3 identical tree-walk helpers into generic hasMatchInTree
- Add empty-array guards for Math.min/Math.max in terminal utils
- Make KNOWN_PROPERTIES a Set in parallel resolver for consistency
- Remove no-op handleDragEnd callback from toolbar
- Remove dead result/results entries from KNOWN_PROPERTIES in loop resolver
- Add tests for buildContainerIterationContext

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* finished

* improvement(airtable): added more tools (#3396)

* fix(layout): polyfill crypto.randomUUID for non-secure HTTP contexts (#3397)

* feat(integrations): add dub.co integration (#3400)

* feat(integrations): add dub.co integration

* improvement(dub): add manual docs description and lint formatting fixes

* lint

* fix(dub): remove unsupported optional property from block outputs

* fix(memory): fix O(n²) string concatenation and unconsumed fetch response leaks (#3399)

* fix(monitoring): set MemoryTelemetry logger to INFO level for production visibility

Production defaults to ERROR-only logging. Without this override,
memory snapshots would be silently suppressed.

* fix(memory): fix O(n²) string concatenation and unconsumed fetch response leaks

* fix(tests): add text() mock to workflow-handler test fetch responses

* fix(memory): remove unused O(n²) join in onStreamChunk callback

* chore(careers): remove careers page, redirect to Ashby jobs portal (#3401)

* chore(careers): remove careers page, redirect to Ashby jobs portal

* lint

* feat(integrations): add google meet integration (#3403)

* feat(integrations): add google meet integration

* lint

* ack comments

* ack comments

* fix(terminal): deduplicate nested container entries in buildEntryTree

Filter out container-typed block rows when matching nested subflow
nodes exist, preventing nested loops/parallels from appearing twice
(once as a flat block and once as an expandable subflow).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* improvement(executor): clean up nested subflow implementation

- Fix wireSentinelEdges to use LOOP_EXIT handle for nested loop terminals
- Extract buildExecutionPipeline to deduplicate orchestrator wiring
- Replace two-phase init with constructor injection for Loop/ParallelOrchestrator
- Remove dead code: shouldExecuteLoopNode, resolveForEachItems, isLoopNode, isParallelNode, isSubflowBlockType
- Deduplicate currentItem resolution in ParallelResolver via resolveCurrentItem
- Type getDistributionItems param as SerializedParallel instead of any
- Demote verbose per-reference logger.info to logger.debug in evaluateWhileCondition
- Add loop-in-parallel wiring test in edges.test.ts

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(test): update parallel resolver test to use distribution instead of distributionItems

The distributionItems fallback was never part of SerializedParallel — it
only worked through any typing. Updated the test to use the real
distribution property.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(executor): skip loop back-edges in parallel boundary detection and update test

findParallelBoundaryNodes now skips LOOP_CONTINUE back-edges when
detecting terminal nodes, matching findLoopBoundaryNodes behavior.
Without this, a nested loop's back-edge was incorrectly counted as a
forward edge within the parallel, preventing terminal detection.

Also updated parallel resolver test to use the real distribution
property instead of the non-existent distributionItems fallback.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(executor): clean up cloned loop scopes in deleteParallelScopeAndClones

When a parallel contains a nested loop, cloned loop scopes (__obranch-N)
created by expandParallel were not being deleted, causing stale scopes to
persist across outer loop iterations.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(executor): remove dead fallbacks, fix nested loop boundary detection, restore executionOrder

- Remove unreachable `?? candidateIds[0]` fallbacks in loop/parallel resolvers
- Remove arbitrary first-match fallback scan in findEffectiveContainerId
- Fix edgeCrossesLoopBoundary to use innermost loop detection for nested loops
- Add warning log for missing branch outputs in parallel aggregation
- Restore executionOrder on WorkflowNodeMetadata and pipe through child workflow notification
- Remove dead sim-drag-subflow classList.remove call
- Clean up cloned loop subflowParentMap entries in deleteParallelScopeAndClones

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* leftover

* upgrade turborepo

* update stagehand icon

* fix(tag-dropdown): show contextual loop/parallel tags for deeply nested blocks

findAncestorLoops only checked direct loop membership, missing blocks nested
inside parallels within loops (and vice versa). Refactored to walk through
both loop and parallel containers recursively, so a block inside a parallel
inside a loop correctly sees the loop's contextual tags (index, currentItem)
instead of the loop's output tags (results).

Also fixed parallel ancestor detection to handle nested parallel-in-loop and
loop-in-parallel scenarios, collecting all ancestor parallels instead of just
the immediate containing one.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* testing

* fixed dedicated logs

* fix

* fix(subflows): enable nested subflow interaction and execution highlighting

Remove !important z-index overrides that prevented nested subflows from
being grabbed/dragged independently. Z-index is now managed by ReactFlow's
elevateNodesOnSelect and per-node zIndex: depth props. Also adds execution
status highlighting for nested subflows in both canvas and snapshot preview.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(preview): add cycle guard to recursive subflow status derivation

Prevents infinite recursion if subflowChildrenMap contains circular
references by tracking visited nodes during traversal.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Lakee Sivaraya <71339072+lakeesiv@users.noreply.github.com>
Co-authored-by: Vikhyath Mondreti <vikhyath@simstudio.ai>
Co-authored-by: Vikhyath Mondreti <vikhyathvikku@gmail.com>
Co-authored-by: Vasyl Abramovych <vasyl.abramovych@gmail.com>
2026-03-03 19:21:52 -08:00
Waleed
1cf7fdfc8c fix(logs): add status field to log detail API for polling (#3405) 2026-03-03 18:00:21 -08:00
Emir Karabeg
21404d17e8 fix: message stream pickup and task ordering 2026-03-03 17:29:36 -08:00
Siddharth Ganesan
df7e731c9c Add payload 2026-03-03 16:15:01 -08:00
Emir Karabeg
4f4191fe1b fix: task ordering 2026-03-03 15:45:15 -08:00
Emir Karabeg
b57636e5b1 finalized task navigation 2026-03-03 15:24:31 -08:00
Emir Karabeg
38c9ecd259 resolved merge conflicts 2026-03-03 14:49:56 -08:00
Emir Karabeg
fadda6aaef improvement: task routing optimizations 2026-03-03 14:48:43 -08:00
Emir Karabeg
82f541e9de improvement: ui 2026-03-03 14:46:09 -08:00
Siddharth Ganesan
1339915957 Task vfs 2026-03-03 13:12:13 -08:00
Waleed
37bdffeda0 fix(socket): persist outbound edges from locked blocks (#3404)
* fix(socket): persist outbound edges from locked blocks

* fix(socket): align edge remove protection check with client-side behavior

* fix(socket): align batch edge protection checks with target-only model

* fix(socket): update stale comments for edge protection checks
2026-03-03 12:54:07 -08:00
Siddharth Ganesan
7fafc00a07 Task management 2026-03-03 12:00:03 -08:00
Emir Karabeg
fe5ab8aee8 improved streaming 2026-03-03 11:40:42 -08:00
Siddharth Ganesan
b3a639a693 Logs 2026-03-03 11:38:06 -08:00
Siddharth Ganesan
0249ca1480 Fix files 2026-03-03 10:49:59 -08:00
Siddharth Ganesan
553c376289 Fix routes 2026-03-03 10:23:11 -08:00
Waleed
6fa4b9b410 feat(integrations): add brandfetch integration (#3402)
* feat(integrations): add brandfetch integration

* lint

* ack comments
2026-03-02 22:10:38 -08:00
Waleed
f0ee492ada feat(integrations): add google meet integration (#3403)
* feat(integrations): add google meet integration

* lint

* ack comments
2026-03-02 21:59:09 -08:00
Emir Karabeg
4622966643 improvement(home): interactions 2026-03-02 17:25:32 -08:00
Siddharth Ganesan
e9550c624d Wand 2026-03-02 15:12:59 -08:00
Siddharth Ganesan
1d48289c53 Mothership block pudate 2026-03-02 15:05:56 -08:00
Siddharth Ganesan
fce10241a5 Mothership block 2026-03-02 14:55:04 -08:00
Waleed
a8e0203a92 chore(careers): remove careers page, redirect to Ashby jobs portal (#3401)
* chore(careers): remove careers page, redirect to Ashby jobs portal

* lint
2026-03-02 14:12:03 -08:00
Waleed
ebb9a2bdd3 fix(memory): fix O(n²) string concatenation and unconsumed fetch response leaks (#3399)
* fix(monitoring): set MemoryTelemetry logger to INFO level for production visibility

Production defaults to ERROR-only logging. Without this override,
memory snapshots would be silently suppressed.

* fix(memory): fix O(n²) string concatenation and unconsumed fetch response leaks

* fix(tests): add text() mock to workflow-handler test fetch responses

* fix(memory): remove unused O(n²) join in onStreamChunk callback
2026-03-02 13:58:03 -08:00
Waleed
61a447aba5 feat(integrations): add dub.co integration (#3400)
* feat(integrations): add dub.co integration

* improvement(dub): add manual docs description and lint formatting fixes

* lint

* fix(dub): remove unsupported optional property from block outputs
2026-03-02 13:45:09 -08:00
Emir Karabeg
ae080f125c Merge branch 'feat/landing' into feat/mothership-copilot 2026-03-02 13:44:12 -08:00
Emir Karabeg
0fb840c8fd Cleaned up home 2026-03-02 13:39:34 -08:00
Emir Karabeg
2c20519bbd improvement: ui/ux 2026-03-02 12:36:32 -08:00
Waleed
e91ab6260a fix(layout): polyfill crypto.randomUUID for non-secure HTTP contexts (#3397) 2026-03-02 11:57:31 -08:00
Siddharth Ganesan
f3474b0c90 Tool call loop 2026-03-02 11:15:17 -08:00
Waleed
afaa361801 improvement(airtable): added more tools (#3396) 2026-03-02 10:58:21 -08:00
Waleed
cd88706ea4 fix(icons): fix pagerduty icon (#3392) 2026-03-01 23:43:09 -08:00
Waleed
79bb4e5ad8 feat(docs): add API reference with OpenAPI spec and auto-generated endpoint pages (#3388)
* feat(docs): add API reference with OpenAPI spec and auto-generated endpoint pages

* multiline curl

* random improvements

* cleanup

* update docs copy

* fix build

* cast

* fix builg

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Lakee Sivaraya <71339072+lakeesiv@users.noreply.github.com>
Co-authored-by: Vikhyath Mondreti <vikhyath@simstudio.ai>
Co-authored-by: Vikhyath Mondreti <vikhyathvikku@gmail.com>
2026-03-01 22:53:18 -08:00
Waleed
ee20e119de feat(integrations): add amplitude, google pagespeed insights, and pagerduty integrations (#3385)
* feat(integrations): add amplitude and google pagespeed insights integrations

* verified and regen docs

* fix icons

* fix(integrations): add pagerduty to tool and block registries

Re-add registry entries that were reverted after initial commit.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* more updates

* ack comemnts

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 18:56:34 -08:00
Siddharth Ganesan
b2cc5b6738 Billing 2026-02-28 17:51:26 -08:00
Waleed
3788660366 fix(monitoring): set MemoryTelemetry logger to INFO level for production visibility (#3386)
Production defaults to ERROR-only logging. Without this override,
memory snapshots would be silently suppressed.
2026-02-28 13:58:21 -08:00
Waleed
9be75e3633 improvement(loops): validate loops integration and update skill files (#3384)
* improvement(loops): validate loops integration and update skill files

* loops icon color

* update databricks icon
2026-02-28 12:37:01 -08:00
Waleed
40bab7731a fix(chat-deploy): fix launch chat popup and auth persistence, clean up React anti-patterns (#3380)
* fix(chat-deploy): fix launch chat popup and auth persistence, clean up React anti-patterns

* lint

* fix(greenhouse): fix email_address query param, add .trim() to ID paths, revert onValidationChange to useEffect

* fix(chat-deploy): fix stale AuthSelector state, stabilize refetch ref, clean up copy timeout

* fix(chat-deploy): reset chatSuccess on modal open to prevent stuck state
2026-02-28 12:01:42 -08:00
Waleed
96096e0ad1 improvement(resend): add error handling, authMode, and naming consistency (#3382) 2026-02-28 11:19:42 -08:00
Waleed
647a3eb05b improvement(luma): expand host response fields and harden event ID inputs (#3383) 2026-02-28 11:19:24 -08:00
Waleed
0195a4cd18 improvement(ashby): validate ashby integration and update skill files (#3381) 2026-02-28 11:16:40 -08:00
Waleed
b42f80e8ab fix(sse): fix memory leaks in SSE stream cleanup and add memory telemetry (#3378)
* fix(sse): fix memory leaks in SSE stream cleanup and add memory telemetry

* improvement(monitoring): add SSE metering to wand, execution-stream, and a2a-message endpoints

* fix(workflow-execute): remove abort from cancel() to preserve run-on-leave behavior

* improvement(monitoring): use stable process.getActiveResourcesInfo() API

* refactor(a2a): hoist resubscribe cleanup to eliminate duplication between start() and cancel()

* style(a2a): format import line

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(wand): set guard flag on early-return decrement for consistency

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 10:37:07 -08:00
Siddharth Ganesan
d49a2c1c25 Fixes 2026-02-27 15:56:04 -08:00
Waleed
38ac86c4fd improvement(mcp): add all MCP server tools individually instead of as single server entry (#3376)
* improvement(mcp): add all MCP server tools individually instead of as single server entry

* fix(mcp): prevent remove popover from opening inadvertently
2026-02-27 14:02:11 -08:00
Siddharth Ganesan
8fa4745893 MCP commented out 2026-02-27 11:18:38 -08:00
Waleed
4cfe8be75a feat(google-contacts): add google contacts integration (#3340)
* feat(google-contacts): add google contacts integration

* fix(google-contacts): throw error when no update fields provided

* lint

* update icon

* improvement(google-contacts): add advanced mode, error handling, and input trimming

- Set mode: 'advanced' on optional fields (emailType, phoneType, notes, pageSize, pageToken, sortOrder)
- Add createLogger and response.ok error handling to all 6 tools
- Add .trim() on resourceName in get, update, delete URL builders
2026-02-27 10:55:51 -08:00
Vikhyath Mondreti
49db3ca50b improvement(selectors): consolidate selector input logic (#3375) 2026-02-27 10:18:25 -08:00
Vikhyath Mondreti
e3ff595a84 improvement(selectors): make selectorKeys declarative (#3374)
* fix(webflow): resolution for selectors

* remove unecessary fallback'

* fix teams selector resolution

* make selector keys declarative

* selectors fixes
2026-02-27 07:56:35 -08:00
Waleed
b3424e2047 improvement(ci): add sticky disk caches and bump runner for faster builds (#3373) 2026-02-27 00:12:36 -08:00
Waleed
71ecf6c82e improvement(x): align OAuth scopes, add scope descriptions, and set optional fields to advanced mode (#3372)
* improvement(x): align OAuth scopes, add scope descriptions, and set optional fields to advanced mode

* improvement(skills): add typed JSON outputs guidance to add-tools, add-block, and add-integration skills

* improvement(skills): add final validation steps to add-tools, add-block, and add-integration skills

* fix(skills): correct misleading JSON array comment in wandConfig example

* feat(skills): add validate-integration skill for auditing tools, blocks, and registry against API docs

* improvement(skills): expand validate-integration with full block-tool alignment, OAuth scopes, pagination, and error handling checks
2026-02-26 23:30:24 -08:00
Waleed
e9e5ba2c5b improvement(docs): audit and standardize tool description sections, update developer count to 70k (#3371) 2026-02-26 23:02:58 -08:00
Waleed
9233d4ebc9 feat(x): add 28 new X API v2 tool integrations and expand OAuth scopes (#3365)
* feat(x): add 28 new X API v2 tool integrations and expand OAuth scopes

* fix(x): add missing nextToken param to search tweets and fix XCreateTweetParams type

* fix(x): correct API spec issues in retweeted_by, quote_tweets, personalized_trends, and usage tools

* fix(x): add missing newestId and oldestId to error meta in get_liked_tweets and get_quote_tweets

* fix(x): add missing newestId/oldestId to get_liked_tweets success branch and includes to XTweetListResponse

* fix(x): add error handling to create_tweet and delete_tweet transformResponse

* fix(x): add error handling and logger to all X tools

* fix(x): revert block requiredScopes to match current operations

* feat(x): update block to support all 28 new X API v2 tools

* fix(x): add missing text output and fix hiddenResult output key mismatch

* docs(x): regenerate docs for all 28 new X API v2 tools
2026-02-26 22:40:57 -08:00
Waleed
78901ef517 improvement(blocks): update luma styling and linkup field modes (#3370)
* improvement(blocks): update luma styling and linkup field modes

* improvement(fireflies): move optional fields to advanced mode

* improvement(blocks): move optional fields to advanced mode for 10 integrations

* improvement(blocks): move optional fields to advanced mode for 6 more integrations
2026-02-26 22:27:58 -08:00
Waleed
47fef540cc feat(resend): expand integration with contacts, domains, and enhanced email ops (#3366) 2026-02-26 22:12:48 -08:00
Waleed
f193e9ebbc feat(loops): add Loops email platform integration (#3359)
* feat(loops): add Loops email platform integration

Add complete Loops integration with 10 tools covering all API endpoints:
- Contact management: create, update, find, delete
- Email: send transactional emails with attachments
- Events: trigger automated email sequences
- Lists: list mailing lists and transactional email templates
- Properties: create and list contact properties

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* ran litn

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 22:09:02 -08:00
Waleed
c0f22d7722 improvement(oauth): reordered oauth modal (#3368) 2026-02-26 19:43:59 -08:00
Waleed
bf0e25c9d0 feat(ashby): add ashby integration for candidate, job, and application management (#3362)
* feat(ashby): add ashby integration for candidate, job, and application management

* fix(ashby): auto-fix lint formatting in docs files
2026-02-26 19:10:06 -08:00
Waleed
d4f8ac8107 feat(greenhouse): add greenhouse integration for managing candidates, jobs, and applications (#3363) 2026-02-26 19:09:03 -08:00
Waleed
63fa938dd7 feat(gamma): add gamma integration for AI-powered content generation (#3358)
* feat(gamma): add gamma integration for AI-powered content generation

* fix(gamma): address PR review comments

- Make credits/error conditionally included in check_status response to avoid always-truthy objects
- Replace full wordmark SVG with square "G" letterform for proper rendering in icon slots

* fix(gamma): remove imageSource from generate_from_template endpoint

The from-template API only accepts imageOptions.model and imageOptions.style,
not imageOptions.source (image source is inherited from the template).

* fix(gamma): use typed output in check_status transformResponse

* regen docs
2026-02-26 19:08:46 -08:00
Waleed
50b882a3ad feat(luma): add Luma integration for event and guest management (#3364)
* feat(luma): add Luma integration for event and guest management

Add complete Luma (lu.ma) integration with 6 tools: get event, create event,
update event, list calendar events, get guests, and add guests. Includes block
configuration with wandConfig for timestamps/timezones/durations, advanced mode
for optional fields, and generated documentation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(luma): address PR review feedback

- Remove hosts field from list_events transformResponse (not in LumaEventEntry type)
- Fix truncated add_guests description by removing quotes that broke docs generator

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(luma): fix update_event field name and add_guests response parsing

- Use 'id' instead of 'event_id' in update_event request body per API spec
- Fix add_guests to parse entries[].guest response structure instead of flat guests array

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 19:08:20 -08:00
Waleed
c8a0b62a9c feat(databricks): add Databricks integration with 8 tools (#3361)
* feat(databricks): add Databricks integration with 8 tools

Add complete Databricks integration supporting SQL execution, job management,
run monitoring, and cluster listing via Personal Access Token authentication.

Tools: execute_sql, list_jobs, run_job, get_run, list_runs, cancel_run,
get_run_output, list_clusters

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(databricks): throw on invalid JSON params, fix boolean coercion, add expandTasks field

- Throw errors on invalid JSON in jobParameters/notebookParams instead of silently defaulting to {}
- Always set boolean params explicitly to prevent string 'false' being truthy
- Add missing expandTasks dropdown UI field for list_jobs operation

* fix(databricks): align tool inputs/outputs with official API spec

- execute_sql: fix wait_timeout default description (50s, not 10s)
- get_run: add queueDuration field, update lifecycle/result state enums
- get_run_output: fix notebook output size (5 MB not 1 MB), add logsTruncated field
- list_runs: add userCancelledOrTimedout to state, fix limit range (1-24), update state enums
- list_jobs: fix name filter description to "exact case-insensitive"
- list_clusters: add PIPELINE_MAINTENANCE to ClusterSource enum

* fix(databricks): regenerate docs to reflect API spec fixes

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 19:05:47 -08:00
Siddharth Ganesan
c168e36a05 Fix 2026-02-26 17:48:53 -08:00
Siddharth Ganesan
9cc46ffa43 Edit subagents 2026-02-26 15:53:58 -08:00
Waleed
4ccb57371b improvement(tests): speed up unit tests by eliminating vi.resetModules anti-pattern (#3357)
* improvement(tests): speed up unit tests by eliminating vi.resetModules anti-pattern

- convert 51 test files from vi.resetModules/vi.doMock/dynamic import to vi.hoisted/vi.mock/static import
- add global @sim/db mock to vitest.setup.ts
- switch 4 test files from jsdom to node environment
- remove all vi.importActual calls that loaded heavy modules (200+ block files)
- remove slow mockConsoleLogger/mockAuth/setupCommonApiMocks helpers
- reduce real setTimeout delays in engine tests
- mock heavy transitive deps in diff-engine test

test execution time: 34s -> 9s (3.9x faster)
environment time: 2.5s -> 0.6s (4x faster)

* docs(testing): update testing best practices with performance rules

- document vi.hoisted + vi.mock + static import as the standard pattern
- explicitly ban vi.resetModules, vi.doMock, vi.importActual, mockAuth, setupCommonApiMocks
- document global mocks from vitest.setup.ts
- add mock pattern reference for auth, hybrid auth, and database chains
- add performance rules section covering heavy deps, jsdom vs node, real timers

* fix(tests): fix 4 failing test files with missing mocks

- socket/middleware/permissions: add vi.mock for @/lib/auth to prevent transitive getBaseUrl() call
- workflow-handler: add vi.mock for @/executor/utils/http matching executor mock pattern
- evaluator-handler: add db.query.account mock structure before vi.spyOn
- router-handler: same db.query.account fix as evaluator

* fix(tests): replace banned Function type with explicit callback signature
2026-02-26 15:46:49 -08:00
Waleed
c6e147e56a feat(agent): add MCP server discovery mode for agent tool input (#3353)
* feat(agent): add MCP server discovery mode for agent tool input

* fix(tool-input): use type variant for MCP server tool count badge

* fix(mcp-dynamic-args): align label styling with standard subblock labels

* standardized inp format UI

* feat(tool-input): replace MCP server inline expand with drill-down navigation

* feat(tool-input): add chevron affordance and keyboard nav for MCP server drill-down

* fix(tool-input): handle mcp-server type in refresh, validation, badges, and usage control

* refactor(tool-validation): extract getMcpServerIssue, remove fake tool hack

* lint

* reorder dropdown

* perf(agent): parallelize MCP server tool creation with Promise.all

* fix(combobox): preserve cursor movement in search input, reset query on drilldown

* fix(combobox): route ArrowRight through handleSelect, remove redundant type guards

* fix(agent): rename mcpServers to mcpServerSelections to avoid shadowing DB import, route ArrowRight through handleSelect

* docs: update google integration docs

* fix(tool-input): reset drilldown state on tool selection to prevent stale view

* perf(agent): parallelize MCP server discovery across multiple servers
2026-02-26 15:17:23 -08:00
Siddharth Ganesan
cc5e592c46 Kb checkpoint 2026-02-26 14:59:56 -08:00
Waleed
345a95f48d fix(confluence): prevent content erasure on page/blogpost update and fix space update (#3356)
- Add body-format=storage to GET-before-PUT for page and blogpost updates
  (without this, Confluence v2 API does not return body content, causing
  the fallback to erase content when only updating the title)
- Fetch current space name when updating only description (Confluence API
  requires name on PUT, so we preserve the existing name automatically)
2026-02-26 14:52:57 -08:00
Waleed
e07963f88c chore(db): drop 8 redundant indexes and add partial index for stale execution cleanup (#3354) 2026-02-26 13:17:39 -08:00
Siddharth Ganesan
7276136398 Piping 2026-02-26 12:32:09 -08:00
Waleed
25c59e3e2e feat(devin): add devin integration for autonomous coding sessions (#3352)
* feat(devin): add devin integration for autonomous coding sessions

* lint

* improvement(devin): update tool names and add manual docs description

* improvement(devin): rename tool files to snake_case and regenerate docs

* regen docs

* fix(devin): remove redundant Number() conversions in tool request bodies
2026-02-26 11:57:50 -08:00
Waleed
dde098e8e5 fix: prevent raw workflowInput from overwriting coerced start block values (#3347)
buildUnifiedStartOutput and buildIntegrationTriggerOutput first populate
output with schema-coerced structuredInput values (via coerceValue), then
iterate workflowInput and unconditionally overwrite those keys with raw
strings. This causes typed values (arrays, objects, numbers, booleans)
passed to child workflows to arrive as stringified versions.

Add a structuredKeys guard so the workflowInput loop skips keys already
set by the coerced structuredInput, letting coerceValue's type-aware
parsing (JSON.parse for objects/arrays, Number() for numbers, etc.)
take effect.

Fixes #3105

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 07:13:19 -08:00
Waleed
5ae0115444 feat(sidebar): add lock/unlock to workflow registry context menu (#3350)
* feat(sidebar): add lock/unlock to workflow registry context menu

* docs(tools): add manual descriptions to google_books and table

* docs(tools): add manual descriptions to google_bigquery and google_tasks

* fix(sidebar): avoid unnecessary store subscriptions and fix mixed lock state toggle

* fix(sidebar): use getWorkflowLockToggleIds utility for lock toggle

Replaces manual pivot-sorting logic with the existing utility function,
which handles block ordering and no-op guards consistently.

* lint
2026-02-25 23:40:30 -08:00
Waleed
fbafe204e5 fix(confluence): add input validation for SSRF-flagged parameters (#3351) 2026-02-25 23:35:45 -08:00
Waleed
ba7d6ff298 fix(credential-selector): remove reserved icon space when no credential selected (#3348) 2026-02-25 22:29:35 -08:00
Waleed
40016e79a1 feat(google-tasks): add Google Tasks integration (#3342)
* feat(google-tasks): add Google Tasks integration

* fix(google-tasks): return actual taskId in delete response

* fix(google-tasks): use absolute imports and fix registry order

* fix(google-tasks): rename list-task-lists to list_task_lists for doc generator

* improvement(google-tasks): destructure task and taskList outputs with typed schemas

* ran lint

* improvement(google-tasks): add wandConfig for due date timestamp generation
2026-02-25 21:52:34 -08:00
Waleed
e4fb8b2fdd feat(bigquery): add Google BigQuery integration (#3341)
* feat(bigquery): add Google BigQuery integration

* fix(bigquery): add auth provider, fix docsLink and insertedRows count

* fix(bigquery): set pageToken visibility to user-or-llm for pagination

* fix(bigquery): use prefixed export names to avoid aliased imports

* lint

* improvement(bigquery): destructure tool outputs with structured array/object types

* lint
2026-02-25 19:31:06 -08:00
Siddharth Ganesan
3ad7af4b97 File creation 2026-02-25 19:23:24 -08:00
Waleed
d98545d554 fix(terminal): thread executionOrder through child workflow SSE events for loop support (#3346)
* fix(terminal): thread executionOrder through child workflow SSE events for loop support

* ran lint

* fix(terminal): render iteration children through EntryNodeRow for workflow block expansion

IterationNodeRow was rendering all children as flat BlockRow components,
ignoring nodeType. Workflow blocks inside loop iterations were never
rendered as WorkflowNodeRow, so they had no expand chevron or child tree.

* fix(terminal): add childWorkflowBlockId to matchesEntryForUpdate

Sub-executors reset executionOrderCounter, so child blocks across loop
iterations share the same blockId + executionOrder. Without checking
childWorkflowBlockId, updateConsole for iteration N overwrites entries
from iterations 0..N-1, causing all child blocks to be grouped under
the last iteration's workflow instance.
2026-02-25 19:02:44 -08:00
Siddharth Ganesan
3cb1768a44 Move files to separate resource 2026-02-25 18:33:07 -08:00
Siddharth Ganesan
11e6387a7d Fix run workflow 2026-02-25 18:12:13 -08:00
Siddharth Ganesan
57a91027de Fix condition edges 2026-02-25 17:48:33 -08:00
Waleed
fadbad4085 feat(confluence): add get user by account ID tool (#3345)
* feat(confluence): add get user by account ID tool

* feat(confluence): add missing tools for tasks, blog posts, spaces, descendants, permissions, and properties

Add 16 new Confluence operations: list/get/update tasks, update/delete blog posts,
create/update/delete spaces, get page descendants, list space permissions,
list/create/delete space properties. Includes API routes, tool definitions,
block config wiring, OAuth scopes, and generated docs.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(confluence): add missing OAuth scopes to auth.ts provider config

The OAuth authorization flow uses scopes from auth.ts, not oauth.ts.
The 9 new scopes were only added to oauth.ts and the block config but
not to the actual provider config in auth.ts, causing re-auth to still
return tokens without the new scopes.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* lint

* fix(confluence): fix truncated get_user tool description in docs

Remove apostrophe from description that caused MDX generation to
truncate at the escape character.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(confluence): address PR review feedback

- Move get_user from GET to POST to avoid exposing access token in URL
- Add 400 validation for missing params in space-properties create/delete
- Add null check for blog post version before update to prevent TypeError

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat(confluence): add missing response fields for descendants and tasks

- Add type and depth fields to page descendants (from Confluence API)
- Add body field (storage format) to task list/get/update responses

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* lint

* fix(confluence): use validatePathSegment for Atlassian account IDs

validateAlphanumericId rejects valid Atlassian account IDs that contain
colons (e.g. 557058:6b9c9931-4693-49c1-8b3a-931f1af98134). Use
validatePathSegment with a custom pattern allowing colons instead.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* ran lint

* update mock

* upgrade turborepo

* fix(confluence): reject empty update body for space PUT

Return 400 when neither name nor description is provided for space
update, instead of sending an empty body to the Confluence API.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(confluence): remove spaceId requirement for create_space and fix list_tasks pagination

- Remove create_space from spaceId condition array since creating a space
  doesn't require a space ID input
- Remove list_tasks from generic supportsCursor array so it uses its
  dedicated handler that correctly passes assignedTo and status filters
  during pagination

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* ran lint

* fixed type errors

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 17:16:53 -08:00
Emir Karabeg
49c29d5f7d feat: pricing, collaboration improvement, features skeleton 2026-02-25 16:28:56 -08:00
Emir Karabeg
843af915bc feat: integrations skeleton, realtime complete 2026-02-25 16:28:56 -08:00
Emir Karabeg
bb3e899f74 feat(landing): template, generic workflow 2026-02-25 16:28:56 -08:00
Emir Karabeg
e47dcdcc43 feat(landing): navbar, metadata, hero, templates header 2026-02-25 16:28:55 -08:00
Emir Karabeg
3e6cf24762 feat(landing): structure 2026-02-25 16:28:55 -08:00
Waleed
244e1ee495 feat(workflow): lock/unlock workflow from context menu and panel (#3336)
* feat(workflow): lock/unlock workflow from context menu and panel

* lint

* fix(workflow): prevent duplicate lock notifications, no-op guard, fix orphaned JSDoc

* improvement(workflow): memoize hasLockedBlocks to avoid inline recomputation

* feat(google-translate): add Google Translate integration (#3337)

* feat(google-translate): add Google Translate integration

* fix(google-translate): api key as query param, fix docsLink, rename tool file

* feat(google): add missing tools for Gmail, Drive, Sheets, and Calendar (#3338)

* feat(google): add missing tools for Gmail, Drive, Sheets, and Calendar

* fix(google-drive): remove dead transformResponse from move tool

* feat(confluence): return page content in get page version tool (#3344)

* feat(confluence): return page content in get page version tool

* lint

* feat(api): audit log read endpoints for admin and enterprise (#3343)

* feat(api): audit log read endpoints for admin and enterprise

* fix(api): address PR review — boolean coercion, cursor validation, detail scope

* ran lint

* unified list of languages for google translate

* fix(workflow): respect snapshot view for panel lock toggle, remove unused disableAdmin prop

* improvement(canvas-menu): remove lock icon from workflow lock toggle

* feat(audit): record audit log for workflow lock/unlock
2026-02-25 15:23:30 -08:00
Waleed
1f3dc52d15 feat(api): audit log read endpoints for admin and enterprise (#3343)
* feat(api): audit log read endpoints for admin and enterprise

* fix(api): address PR review — boolean coercion, cursor validation, detail scope

* ran lint
2026-02-25 13:46:37 -08:00
Waleed
f625482bcb feat(confluence): return page content in get page version tool (#3344)
* feat(confluence): return page content in get page version tool

* lint
2026-02-25 13:45:19 -08:00
Waleed
16f337f6fd feat(google): add missing tools for Gmail, Drive, Sheets, and Calendar (#3338)
* feat(google): add missing tools for Gmail, Drive, Sheets, and Calendar

* fix(google-drive): remove dead transformResponse from move tool
2026-02-25 13:38:35 -08:00
Waleed
063ec87ced feat(google-translate): add Google Translate integration (#3337)
* feat(google-translate): add Google Translate integration

* fix(google-translate): api key as query param, fix docsLink, rename tool file
2026-02-25 13:24:22 -08:00
Siddharth Ganesan
90a12546b2 Fix lint 2026-02-25 12:56:58 -08:00
Siddharth Ganesan
b6f8439267 Remove dead code 2026-02-25 12:55:50 -08:00
Siddharth Ganesan
4f74a8b845 Checkpopint 2026-02-25 12:45:55 -08:00
Siddharth Ganesan
f12d8f631f Split 2026-02-25 12:37:23 -08:00
Siddharth Ganesan
41f0957ccc Separation of route 2026-02-25 12:19:26 -08:00
Waleed
870d4b55c6 fix(templates): show description tagline on template cards (#3335) 2026-02-25 12:10:22 -08:00
Waleed
95304b2941 feat(google-sheets): add filter support to read operation (#3333)
* feat(google-sheets): add filter support to read operation

* ran lint
2026-02-25 11:34:12 -08:00
Waleed
8b0c47b06c chore(executor): extract shared utils and remove dead code from handlers (#3334) 2026-02-25 11:28:16 -08:00
Siddharth Ganesan
7b813be1dd Fix truncation 2026-02-25 11:09:04 -08:00
Siddharth Ganesan
704fa16bb4 run workflow checkpoint 2026-02-25 11:08:44 -08:00
Vikhyath Mondreti
774771fddd fix(call-chain): x-sim-via propagation for API blocks and MCP tools (#3332)
* fix(call-chain): x-sim-via propagation for API blocks and MCP tools

* addres bugbot comment
2026-02-25 08:41:54 -08:00
Waleed
43c0f5b199 feat(api): retry configuration for api block (#3329)
* fix(api): add configurable request retries

The API block docs described automatic retries, but the block didn't expose any retry controls and requests were executed only once.

This adds tool-level retry support with exponential backoff (including Retry-After support) for timeouts, 429s, and 5xx responses, exposes retry settings in the API block and http_request tool, and updates the docs to match.

Fixes #3225

* remove unnecessary helpers, cleanup

* update desc

* ack comments

* ack comment

* ack

* handle timeouts

---------

Co-authored-by: Jay Prajapati <79649559+jayy-77@users.noreply.github.com>
2026-02-25 00:13:47 -08:00
Waleed
ff01825b20 docs(credentials): replace environment variables page with credentials docs (#3331) 2026-02-25 00:02:16 -08:00
Vikhyath Mondreti
58d0fda173 fix(serializer): default canonical modes construction (#3330)
* fix(serializer): default canonical modes construction

* defaults for copilot

* address bugbot comments
2026-02-24 22:05:17 -08:00
Waleed
ecdb133d1b improvement(creds): bulk paste functionality, save notification, error notif (#3328)
* improvement(creds): bulk paste functionality, save notification, error notif

* use effect anti patterns

* fix add to cursor button

* fix(attio): wrap webhook body in data object and include required filter field

* fixed and tested attio webhook lifecycle
2026-02-24 19:12:10 -08:00
Waleed
d06459f489 fix(attio): automatic webhook lifecycle management and tool fixes (#3327)
* fix(attio): use code subblock type for JSON input fields

* fix(attio): correct people name attribute format in wand prompt example

* fix(attio): improve wand prompt with correct attribute formats for all field types

* fix(attio): use array format with full_name for personal-name attribute in wand prompt

* fix(attio): use loose null checks to prevent sending null params to API

* fix(attio): add offset param and make pagination fields advanced mode

* fix(attio): remove redundant (optional) from placeholders

* fix(attio): always send required workspace_access and workspace_member_access in create list

* fix(attio): always send api_slug in create list, auto-generate from name if not provided

* fix(attio): update api slug placeholder text

* fix(tools): manage lifecycle for attio tools

* updated docs

* fix(attio): remove incorrect save button reference from setup instructions

* fix(attio): log debug message when signature verification is skipped
2026-02-24 17:30:52 -08:00
Siddharth Ganesan
eccad2a8ce Remove dup code from tool calls 2026-02-24 16:59:40 -08:00
Waleed
0574427d45 fix(providers): propagate abort signal to all LLM SDK calls (#3325)
* fix(providers): propagate abort signal to all LLM SDK calls

* fix(providers): propagate abort signal to deep research interactions API

* fix(providers): clean up abort listener when sleep timer resolves
2026-02-24 14:59:02 -08:00
Siddharth Ganesan
87f5c464d9 Consolidation 2026-02-24 14:55:35 -08:00
Emir Karabeg
8f9b859a53 improvement(credentials): ui (#3322)
* improvement(credentials): ui

* fix: credentials logic

* improvement(credentials): ui

* improvement(credentials): members UI

* improvement(secrets): ui

* fix(credentials): show error when OAuth deletion fails due to missing fields

- Add deleteError state to track and display deletion errors
- Keep confirmation dialog open when deletion fails
- Show user-friendly error message when accountId or providerId is missing
- Add loading state to delete button during deletion
- Display error message in confirmation dialog with proper styling

Co-authored-by: Emir Karabeg <emir-karabeg@users.noreply.github.com>

* ran lint

* removed worktree file

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Emir Karabeg <emir-karabeg@users.noreply.github.com>
Co-authored-by: Waleed Latif <walif6@gmail.com>
2026-02-24 14:48:13 -08:00
Siddharth Ganesan
724aaa1432 table tools 2026-02-24 14:32:55 -08:00
Siddharth Ganesan
3de3ef4786 Readd migration 2026-02-24 14:03:30 -08:00
Siddharth Ganesan
743f048442 Merge with origin staging 2026-02-24 14:02:59 -08:00
Siddharth Ganesan
bbcf346df0 Nuke migration 2026-02-24 13:57:31 -08:00
Waleed
60f9eb21bf feat(attio): add Attio CRM integration with 40 tools and 18 webhook triggers (#3324)
* feat(attio): add Attio CRM integration with 40 tools and 18 webhook triggers

* update docs

* fix(attio): use timestamp generationType for date wandConfig fields
2026-02-24 13:56:42 -08:00
Siddharth Ganesan
b9c3c2f78f Checkpoint interface consolidation 2026-02-24 13:55:50 -08:00
Siddharth Ganesan
d333307a17 Checkpoint 2026-02-24 13:47:29 -08:00
Siddharth Ganesan
134c4c4f2a Checkpoint 2026-02-24 12:22:19 -08:00
Waleed
9a31c7d8ad improvement(processing): reduce redundant DB queries in execution preprocessing (#3320)
* improvement(processing): reduce redundant DB queries in execution preprocessing

* improvement(processing): add defensive ID check for prefetched workflow record

* improvement(processing): fix type safety in execution error logging

Replace `as any` cast in non-SSE error path with proper `buildTraceSpans()`
transformation, matching the SSE error path. Remove redundant `as any` cast
in preprocessing.ts where the types already align.

* improvement(processing): replace `as any` casts with proper types in logging

- logger.ts: cast JSONB cost column to `WorkflowExecutionLog['cost']` instead
  of `any` in both `completeWorkflowExecution` and `getWorkflowExecution`
- logger.ts: replace `(orgUsageBefore as any)?.toString?.()` with `String()`
  since COALESCE guarantees a non-null SQL aggregate value
- logging-session.ts: cast JSONB cost to `AccumulatedCost` (the local
  interface) instead of `any` in `loadExistingCost`

* improvement(processing): use exported HighestPrioritySubscription type in usage.ts

Replace inline `Awaited<ReturnType<typeof getHighestPrioritySubscription>>`
with the already-exported `HighestPrioritySubscription` type alias.

* improvement(processing): replace remaining `as any` casts with proper types

- preprocessing.ts: use exported `HighestPrioritySubscription` type instead
  of redeclaring via `Awaited<ReturnType<...>>`
- deploy/route.ts, status/route.ts: cast `hasWorkflowChanged` args to
  `WorkflowState` instead of `any` (JSONB + object literal narrowing)
- state/route.ts: type block sanitization and save with `BlockState` and
  `WorkflowState` instead of `any`
- search-suggestions.ts: remove 8 unnecessary `as any` casts on `'date'`
  literal that already satisfies the `Suggestion['category']` union

* fix(processing): prevent double-billing race in LoggingSession completion

When executeWorkflowCore throws, its catch block fire-and-forgets
safeCompleteWithError, then re-throws. The caller's catch block also
fire-and-forgets safeCompleteWithError on the same LoggingSession. Both
check this.completed (still false) before either's async DB write resolves,
so both proceed to completeWorkflowExecution which uses additive SQL for
billing — doubling the charged cost on every failed execution.

Fix: add a synchronous `completing` flag set immediately before the async
work begins. This blocks concurrent callers at the guard check. On failure,
the flag is reset so the safe* fallback path (completeWithCostOnlyLog) can
still attempt recovery.

* fix(processing): unblock error responses and isolate run-count failures

Remove unnecessary `await waitForCompletion()` from non-SSE and SSE error
paths where no `markAsFailed()` follows — these were blocking error responses
on log persistence for no reason. Wrap `updateWorkflowRunCounts` in its own
try/catch so a run-count DB failure cannot prevent session completion, billing,
and trace span persistence.

* improvement(processing): remove dead setupExecutor method

The method body was just a debug log with an `any` parameter — logging
now works entirely through trace spans with no executor integration.

* remove logger.debug

* fix(processing): guard completionPromise as write-once (singleton promise)

Prevent concurrent safeComplete* calls from overwriting completionPromise
with a no-op. The guard now lives at the assignment site — if a completion
is already in-flight, return its promise instead of starting a new one.
This ensures waitForCompletion() always awaits the real work.

* improvement(processing): remove empty else/catch blocks left by debug log cleanup

* fix(processing): enforce waitForCompletion inside markAsFailed to prevent completion races

Move waitForCompletion() into markAsFailed() so every call site is
automatically safe against in-flight fire-and-forget completions.
Remove the now-redundant external waitForCompletion() calls in route.ts.

* fix(processing): reset completing flag on fallback failure, clean up empty catch

- completeWithCostOnlyLog now resets this.completing = false when
  the fallback itself fails, preventing a permanently stuck session
- Use _disconnectError in MCP test-connection to signal intentional ignore

* fix(processing): restore disconnect error logging in MCP test-connection

Revert unrelated debug log removal — this file isn't part of the
processing improvements and the log aids connection leak detection.

* fix(processing): address audit findings across branch

- preprocessing.ts: use undefined (not null) for failed subscription
  fetch so getUserUsageLimit does a fresh lookup instead of silently
  falling back to free-tier limits
- deployed/route.ts: log warning on loadDeployedWorkflowState failure
  instead of silently swallowing the error
- schedule-execution.ts: remove dead successLog parameter and all
  call-site arguments left over from logger.debug cleanup
- mcp/middleware.ts: drop unused error binding in empty catch
- audit/log.ts, wand.ts: promote logger.debug to logger.warn in catch
  blocks where these are the only failure signal

* revert: undo unnecessary subscription null→undefined change

getHighestPrioritySubscription never throws (it catches internally
and returns null), so the catch block in preprocessExecution is dead
code. The null vs undefined distinction doesn't matter and the
coercions added unnecessary complexity.

* improvement(processing): remove dead try/catch around getHighestPrioritySubscription

getHighestPrioritySubscription catches internally and returns null
on error, so the wrapping try/catch was unreachable dead code.

* improvement(processing): remove dead getSnapshotByHash method

No longer called after createSnapshotWithDeduplication was refactored
to use a single upsert instead of select-then-insert.

---------
2026-02-24 11:55:59 -08:00
Jay Prajapati
9e817bc5b0 fix(auth): make DISABLE_AUTH work in web app (#3297)
Return an anonymous session using the same response envelope as Better Auth's get-session endpoint, and make the session provider tolerant to both wrapped and raw session payloads.

Fixes #2524
2026-02-24 09:52:44 -08:00
Waleed
d824ce5b07 feat(confluence): add webhook triggers for Confluence events (#3318)
* feat(confluence): add webhook triggers for Confluence events

Adds 16 Confluence triggers: page CRUD, comments, blogs, attachments,
spaces, and labels — plus a generic webhook trigger.

* feat(confluence): wire triggers into block and webhook processor

Add trigger subBlocks and triggers config to ConfluenceV2Block so
triggers appear in the UI. Add Confluence signature verification and
event filtering to the webhook processor.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(confluence): align trigger outputs with actual webhook payloads

- Rewrite output builders to match real Confluence webhook payload
  structure (flat spaceKey, numeric version, actual API fields)
- Remove fabricated fields (nested space/version objects, comment.body)
- Add missing fields (creatorAccountId, lastModifierAccountId, self,
  creationDate, modificationDate, accountType)
- Add extractor functions (extractPageData, extractCommentData, etc.)
  following the same pattern as Jira
- Add formatWebhookInput handler for Confluence in utils.server.ts
  so payloads are properly destructured before reaching workflows
- Make event field matching resilient (check both event and webhookEvent)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(confluence): handle generic webhook in formatWebhookInput

The generic webhook (confluence_webhook) was falling through to
extractPageData, which only returns the page field. For a catch-all
trigger that accepts all event types, preserve all entity fields
(page, comment, blog, attachment, space, label, content).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(confluence): use payload-based filtering instead of nonexistent event field

Confluence Cloud webhooks don't include an event/webhookEvent field in the
body (unlike Jira). Replaced broken event string matching with structural
payload filtering that checks which entity key is present.

* lint

* fix(confluence): read webhookSecret instead of secret in signature verification

* fix(webhooks): read webhookSecret for jira, linear, and github signature verification

These providers define their secret subBlock with id: 'webhookSecret' but the
processor was reading providerConfig.secret which is always undefined, silently
skipping signature verification even when a secret is configured.

* fix(confluence): use event field for exact matching with entity-category fallback

Admin REST API webhooks (Settings > Webhooks) include an event field for
action-level filtering (page_created vs page_updated). Connect app webhooks
omit it, so we fall back to entity-category matching.

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 23:36:43 -08:00
Waleed
9bd357f184 improvement(audit): enrich metadata across 23 audit log call sites (#3319)
* improvement(audit): enrich metadata across 23 audit log call sites

* improvement(audit): enrich metadata across 23 audit log call sites
2026-02-23 23:35:57 -08:00
Waleed
d4a014f423 feat(public-api): add env var and permission group controls to disable public API access (#3317)
Add DISABLE_PUBLIC_API / NEXT_PUBLIC_DISABLE_PUBLIC_API environment variables
and disablePublicApi permission group config option to allow self-hosted
deployments and enterprise admins to globally disable the public API toggle.

When disabled: the Access toggle is hidden in the Edit API Info modal,
the execute route blocks unauthenticated public access (401), and the
public-api PATCH route rejects enabling public API (403).

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 23:03:03 -08:00
Waleed
fe34d23a98 feat(gong): add Gong integration with 18 API tools (#3316)
* feat(gong): add Gong integration with 18 API tools

* fix(gong): make toDateTime optional for list_calls, add list_trackers to workspaceId condition

* chore(gong): regenerate docs

* fix(hex): update icon color and block bgColor
2026-02-23 17:57:10 -08:00
Waleed
b8dfb4dd20 fix(copy): preserve block names when pasting into workflows without conflicts (#3315) 2026-02-23 15:42:24 -08:00
Waleed
91666491cd fix(execution): scope X-Sim-Via header to internal routes and enforce depth limit (#3313)
* feat(execution): workflow cycle detection via X-Sim-Via header

* fix(execution): scope X-Sim-Via header to internal routes and add child workflow depth validation

- Move call chain header injection from HTTP tool layer (request.ts/utils.ts)
  to tool execution layer (tools/index.ts) gated on isInternalRoute, preventing
  internal workflow IDs from leaking to external third-party APIs
- Remove cycle detection from validateCallChain — depth limit alone prevents
  infinite loops while allowing legitimate self-recursion (pagination, tree
  processing, batch splitting)
- Add validateCallChain check in workflow-handler.ts before spawning child
  executor, closing the gap where in-process child workflows skipped validation
- Remove unsafe `(params as any)._context` type bypass in request.ts

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(execution): validate child call chain instead of parent chain

Validate childCallChain (after appending current workflow ID) rather
than ctx.callChain (parent). Prevents an off-by-one where a chain at
depth 10 could still spawn an 11th workflow.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 15:19:31 -08:00
Waleed
eafbb9fef4 fix(tag-dropdown): exclude downstream blocks in loops and parallel siblings (#3312)
* fix(tag-dropdown): exclude downstream blocks in loops and parallel siblings from reference picker

* chore(serializer): remove unused computeAccessibleBlockIds method

* chore(block-path-calculator): remove unused calculateAccessibleBlocksForWorkflow method

* chore(tag-dropdown): remove no-op loop node filter

* fix(tag-dropdown): remove parallel container from accessible references in parallel branches

* chore(tag-dropdown): remove no-op starter block filter

* fix(tag-dropdown): restore parallel container in accessible references for blocks inside parallel

* fix(copilot): exclude downstream loop nodes and parallel siblings from accessible references
2026-02-23 14:21:40 -08:00
Waleed
132fef06a1 fix(redis): tighten stale TCP connection detection and add fast lease deadline (#3311)
* fix(redis): tighten stale TCP connection detection and add fast lease deadline

* revert(redis): restore original retryStrategy logging

* fix(redis): clear deadline timer after Promise.race to prevent memory leak

* fix(redis): downgrade lease fallback log to warn — unavailable is expected fallback
2026-02-23 13:22:29 -08:00
Vikhyath Mondreti
2ae814549a improvement(migration): move credential selector automigration logic to server side (#3310)
* improvement(credentials): move client side automigration to server side

* fix migration func

* fix tests

* address bugbot
2026-02-23 06:33:54 -08:00
Vikhyath Mondreti
e55d41f2ef fix(credentials): credential dependent endpoints (#3309)
* fix(dependent): credential dependent endpoints

* fix tests

* fix route to not block ws creds"

* remove faulty auth checks:

* prevent unintended cascade by depends on during migration

* address bugbot comments
2026-02-23 04:38:03 -08:00
Vikhyath Mondreti
364bb196ea feat(credentials): multiple credentials per provider (#3211)
* feat(mult-credentials): progress

* checkpoint

* make it autoselect personal secret when create secret is clicked

* improve collaborative UX

* remove add member ui for workspace secrets

* bulk entry of .env

* promote to workspace secret

* more ux improvmeent

* share with workspace for oauth

* remove new badge

* share button

* copilot + oauth name comflict

* reconnect option to connect diff account

* remove credential no access marker

* canonical credential id entry

* remove migration to prep stagin migration

* migration readded

* backfill improvements

* run lint

* fix tests

* remove unused code

* autoselect provider when connecting from block

* address bugbot comments

* remove some dead code

* more permissions stuff

* remove more unused code

* address bugbot

* add filter

* remove migration to prep migration

* fix migration

* fix migration issues

* remove migration prep merge

* readd migration

* include user tables triggers

* extract shared code

* fix

* fix tx issue

* remove migration to prep merge

* readd migration

* fix agent tool input

* agent with tool input deletion case

* fix credential subblock saving

* remove dead code

* fix tests

* address bugbot comments
2026-02-23 02:26:16 -08:00
Waleed
69ec70af13 feat(terminal): expandable child workflow blocks in console (#3306)
* feat(terminal): expandable child workflow blocks in console

* fix(terminal): cycle guard in collectWorkflowDescendants, workflow node running/canceled state

* fix(terminal): expand workflow blocks nested inside loop/parallel iterations

* fix(terminal): prevent child block mixing across loop iterations for workflow blocks

* ack PR comments, remove extranoeus logs

* feat(terminal): real-time child workflow block propagation in console

* fix(terminal): align parallel guard in WorkflowBlockHandler.getIterationContext with BlockExecutor

* fix(terminal): fire onChildWorkflowInstanceReady regardless of nodeMetadata presence

* fix(terminal): use shared isWorkflowBlockType from executor/constants
2026-02-23 00:17:44 -08:00
Waleed
687c12528b fix(parallel): correct active state pulsing and duration display for parallel subflow blocks (#3305)
* fix(executor): resolve block ID for parallel subflow active state

* fix timing for parallel block

* refactor(parallel): extract shared updateActiveBlockRefCount helper

* fix(parallel): error-sticky block run status to prevent branch success masking failure

* Revert "fix(parallel): error-sticky block run status to prevent branch success masking failure"

This reverts commit 9c087cd466.
2026-02-22 15:03:33 -08:00
Waleed
996dc96d6e fix(security): allow HTTP for localhost and loopback addresses (#3304)
* fix(security): allow localhost HTTP without weakening SSRF protections

* fix(security): remove extraneous comments and fix failing SSRF test

* fix(security): derive isLocalhost from hostname not resolved IP in validateUrlWithDNS

* fix(security): verify resolved IP is loopback when hostname is localhost in validateUrlWithDNS

---------

Co-authored-by: aayush598 <aayushgid598@gmail.com>
2026-02-22 14:58:11 -08:00
Waleed
04286fc16b fix(hex): scope param renames to their respective operations (#3295) 2026-02-21 17:53:04 -08:00
Waleed
c52f78c840 fix(models): remove retired claude-3-7-sonnet and update default models (#3292) 2026-02-21 16:44:54 -08:00
Waleed
e318bf2e65 feat(tools): added hex (#3293)
* feat(tools): added hex

* update tool names
2026-02-21 16:44:39 -08:00
Waleed
4913799a27 feat(oauth): add CIMD support for client metadata discovery (#3285)
* feat(oauth): add CIMD support for client metadata discovery

* fix(oauth): add response size limit, redirect_uri and logo_uri validation to CIMD

- Add maxResponseBytes (256KB) to prevent oversized responses
- Validate redirect_uri schemes (https/http only) and reject commas
- Validate logo_uri requires HTTPS, silently drop invalid logos

* fix(oauth): add explicit userId null for CIMD client insert

* fix(oauth): fix redirect_uri error handling, skip upsert on cache hit

- Move scheme check outside try/catch so specific error isn't swallowed
- Return fromCache flag from resolveClientMetadata to skip redundant DB writes

* fix(oauth): evict CIMD cache on upsert failure to allow retry
2026-02-21 14:38:05 -08:00
Waleed
ccb4f5956d fix(redis): prevent false rate limits and code execution failures during Redis outages (#3289) 2026-02-21 12:20:19 -08:00
Vikhyath Mondreti
2a6d4fcb96 fix(deploy): reuse subblock merge helper in use change detection hook (#3287)
* fix(workflow-changes): change detection logic divergence

* use shared helper
2026-02-21 07:57:11 -08:00
Waleed
42020c3ae2 fix(mcp): use getBaseUrl for OAuth discovery metadata URLs (#3283)
* fix(mcp): use getBaseUrl for OAuth discovery metadata URLs

* fix(mcp): remove unused request params from discovery route handlers
2026-02-21 01:57:07 -08:00
Waleed
a98463a486 fix(copilot): handle negated operation conditions in block config extraction (#3282)
* fix(copilot): handle negated operation conditions in block config extraction

* fix(copilot): simplify condition evaluation to single matchesOperation call
2026-02-20 18:08:55 -08:00
Waleed
765a481864 fix(trigger): handle Slack reaction_added/reaction_removed event payloads (#3280)
* fix(trigger): handle Slack reaction_added/reaction_removed event payloads

* fix(trigger): use oldest param for conversations.history consistency

* fix oldest param

* fix(trigger): use reactions.get API to fetch message text for thread replies
2026-02-20 17:23:06 -08:00
Waleed
a1400caea0 fix(logs): replace initialData with placeholderData to fix stale log details (#3279) 2026-02-20 17:01:52 -08:00
Waleed
2fc2e12cb2 feat(slack): added ephemeral message send tool, updated ci, updated docs (#3278)
* feat(slack): added ephemeral message send tool, updated ci, updated docs

* added block kit support

* upgrade turborepo

* added wandConfig for slack block kit

* fix generation type
2026-02-20 16:53:10 -08:00
Waleed
3fa4bb4c12 feat(auth): add OAuth 2.1 provider for MCP connector support (#3274)
* feat(auth): add OAuth 2.1 provider for MCP connector support

* fix(auth): rename redirect_u_r_ls column to redirect_urls

* chore(db): regenerate oauth migration with correct column naming

* fix(auth): reorder CORS headers and handle missing redirectURI

* fix(auth): redirect to login without stale callbackUrl on account switch

* chore: run lint

* fix(auth): override credentials header on OAuth CORS entries

* fix(auth): preserve OAuth flow when switching accounts on consent page

* fix(auth): add session and user-id checks to authorize-params endpoint

* fix(auth): add expiry check, credentials, MCP CORS, and scope in WWW-Authenticate

* feat(mcp): add tool annotations for Connectors Directory compliance
2026-02-20 15:56:15 -08:00
Waleed
1b8d666c93 fix(build): fix corrupted sticky disk cache on blacksmith (#3273) 2026-02-20 13:03:23 -08:00
Waleed
71942cb53c fix(trigger): update node version to align with main app (#3272) 2026-02-20 12:32:14 -08:00
Waleed
12534163c1 fix(tables): hide tables from sidebar and block registry (#3270)
* fix(tables): hide tables from sidebar and block registry

* fix(trigger): add isolated-vm support to trigger.dev container builds (#3269)

Scheduled workflow executions running in trigger.dev containers were
failing to spawn isolated-vm workers because the native module wasn't
available in the container. This caused loop condition evaluation to
silently fail and exit after one iteration.

- Add isolated-vm to build.external and additionalPackages in trigger config
- Include isolated-vm-worker.cjs via additionalFiles for child process spawning
- Add fallback path resolution for worker file in trigger.dev environment

* lint
2026-02-20 11:58:02 -08:00
Waleed
55920e9b03 fix(trigger): add isolated-vm support to trigger.dev container builds (#3269)
Scheduled workflow executions running in trigger.dev containers were
failing to spawn isolated-vm workers because the native module wasn't
available in the container. This caused loop condition evaluation to
silently fail and exit after one iteration.

- Add isolated-vm to build.external and additionalPackages in trigger config
- Include isolated-vm-worker.cjs via additionalFiles for child process spawning
- Add fallback path resolution for worker file in trigger.dev environment
2026-02-20 11:41:28 -08:00
Waleed
958dd64740 fix(blocks): add required constraint for serviceDeskId in JSM block (#3268)
* fix(blocks): add required constraint for serviceDeskId in JSM block

* fix(blocks): rename custom field values to request field values in JSM create request
2026-02-20 11:33:52 -08:00
Vikhyath Mondreti
68f44b8df4 improvement(resolver): resovled empty sentinel to not pass through unexecuted valid refs to text inputs (#3266) 2026-02-20 01:56:33 -08:00
Waleed
9920882dc5 fix(blocks): move type coercions from tools.config.tool to tools.config.params (#3264)
* fix(blocks): move type coercions from tools.config.tool to tools.config.params

Number() coercions in tools.config.tool ran at serialization time before
variable resolution, destroying dynamic references like <block.result.count>
by converting them to NaN/null. Moved all coercions to tools.config.params
which runs at execution time after variables are resolved.

Fixed in 15 blocks: exa, arxiv, sentry, incidentio, wikipedia, ahrefs,
posthog, elasticsearch, dropbox, hunter, lemlist, spotify, youtube, grafana,
parallel. Also added mode: 'advanced' to optional exa fields.

Closes #3258

* fix(blocks): address PR review — move remaining param mutations from tool() to params()

- Moved field mappings from tool() to params() in grafana, posthog,
  lemlist, spotify, dropbox (same dynamic reference bug)
- Fixed parallel.ts excerpts/full_content boolean logic
- Fixed parallel.ts search_queries empty case (must set undefined)
- Fixed elasticsearch.ts timeout not included when already ends with 's'
- Restored dropbox.ts tool() switch for proper default fallback

* fix(blocks): restore field renames to tool() for serialization-time validation

Field renames (e.g. personalApiKey→apiKey) must be in tool() because
validateRequiredFieldsBeforeExecution calls selectToolId()→tool() then
checks renamed field names on params. Only type coercions (Number(),
boolean) stay in params() to avoid destroying dynamic variable references.
2026-02-19 21:54:16 -08:00
Waleed
9ca5254c2b fix(audit-log): lazily resolve actor name/email when missing (#3262) 2026-02-19 16:48:43 -08:00
Waleed
d7fddb2909 feat(models): add gemini-3.1-pro-preview and update gemini-3-pro thinking levels (#3263) 2026-02-19 16:20:20 -08:00
Waleed
61c7afc19e feat(tools): added redis, upstash, algolia, and revenuecat (#3261)
* feat(tools): added redis, upstash, algolia, and revenuecat

* ack comment
2026-02-19 16:13:06 -08:00
Siddharth Ganesan
03908edcbb Checkpoint 2026-02-19 14:47:57 -08:00
Waleed
3c470ab0f8 fix(workflows): disallow duplicate workflow names at the same folder level (#3260) 2026-02-19 14:12:43 -08:00
Waleed
2b5e436a2a fix(snapshot): changed insert to upsert when concurrent identical child workflows are running (#3259)
* fix(snapshot): changed insert to upsert when concurrent identical child workflows are running

* fixed ci tests failing
2026-02-19 13:58:35 -08:00
Lakee Sivaraya
e24c824c9a feat(tables): added tables (#2867)
* updates

* required

* trashy table viewer

* updates

* updates

* filtering ui

* updates

* updates

* updates

* one input mode

* format

* fix lints

* improved errors

* updates

* updates

* chages

* doc strings

* breaking down file

* update comments with ai

* updates

* comments

* changes

* revert

* updates

* dedupe

* updates

* updates

* updates

* refactoring

* renames & refactors

* refactoring

* updates

* undo

* update db

* wand

* updates

* fix comments

* fixes

* simplify comments

* u[dates

* renames

* better comments

* validation

* updates

* updates

* updates

* fix sorting

* fix appearnce

* updating prompt to make it user sort

* rm

* updates

* rename

* comments

* clean comments

* simplicifcaiton

* updates

* updates

* refactor

* reduced type confusion

* undo

* rename

* undo changes

* undo

* simplify

* updates

* updates

* revert

* updates

* db updates

* type fix

* fix

* fix error handling

* updates

* docs

* docs

* updates

* rename

* dedupe

* revert

* uncook

* updates

* fix

* fix

* fix

* fix

* prepare merge

* readd migrations

* add back missed code

* migrate enrichment logic to general abstraction

* address bugbot concerns

* adhere to size limits for tables

* remove conflicting migration

* add back migrations

* fix tables auth

* fix permissive auth

* fix lint

* reran migrations

* migrate to use tanstack query for all server state

* update table-selector

* update names

* added tables to permission groups, updated subblock types

---------

Co-authored-by: Vikhyath Mondreti <vikhyath@simstudio.ai>
Co-authored-by: waleed <walif6@gmail.com>
2026-02-19 13:11:35 -08:00
Siddharth Ganesan
3112485c31 Checkpoint 2026-02-19 11:08:32 -08:00
Siddharth Ganesan
459c2930ae Checkpoint 2026-02-19 10:14:24 -08:00
Waleed
dcf81372af feat(tools): advanced fields for youtube, vercel; added cloudflare and dataverse tools (#3257)
* refactor(vercel): mark optional fields as advanced mode

Move optional/power-user fields behind the advanced toggle:
- List Deployments: project filter, target, state
- Create Deployment: project ID override, redeploy from, target
- List Projects: search
- Create/Update Project: framework, build/output/install commands
- Env Vars: variable type
- Webhooks: project IDs filter
- Checks: path, details URL
- Team Members: role filter
- All operations: team ID scope

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* style(youtube): mark optional params as advanced mode

Hide pagination, sort order, and filter fields behind the advanced
toggle for a cleaner default UX across all YouTube operations.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* added advanced fields for vercel and youtube, added cloudflare and dataverse block

* addded desc for dataverse

* add more tools

* ack comment

* more

* ops

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-18 23:40:45 -08:00
Siddharth Ganesan
3338b25c30 Checkpoint 2026-02-18 18:55:10 -08:00
Siddharth Ganesan
4c3002f97d Checkpoint 2026-02-18 18:38:37 -08:00
Waleed
ab48787422 chore(deps): upgrade next.js from 16.1.0-canary.21 to 16.1.6 (#3254) 2026-02-18 16:25:28 -08:00
Waleed
91aa1f9a52 feat(tools): added vercel block & tools (#3252)
* feat(vercel): add complete Vercel integration with 42 API tools

Add Vercel platform management integration covering deployments, projects,
environment variables, domains, DNS records, aliases, edge configs, and
team/user management. All tools use API key authentication with Bearer tokens.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat(vercel): add webhook and deployment check tools

Add 8 new Vercel API tools:
- Webhooks: list, create, delete
- Deployment Checks: create, get, list, update, rerequest

Brings total Vercel tools to 50.

* fix(vercel): expand all object and array output definitions

Expand unexpanded output types:
- get_deployment: meta and gitSource objects now have properties
- list_deployment_files: children array now has items definition
- get_team: teamRoles and teamPermissions arrays now have items

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* update icon size, update docs

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-18 15:54:49 -08:00
Siddharth Ganesan
632e0e0762 Checkpoitn 2026-02-18 15:29:58 -08:00
Waleed
2979269ac3 fix(sidebar): unify workflow and folder insertion ordering (#3250)
* fix(sidebar): unify workflow and folder insertion ordering

* ack comments

* ack comments

* ack

* ack comment

* upgrade turbo

* fix build
2026-02-18 14:41:55 -08:00
Waleed
cf28822a1c fix(shortlink): remove isHosted guard from redirects, not available at build time on ECS (#3251)
* fix(shortlink): remove isHosted guard from redirects, not available at build time on ECS

* fix(shortlink): use rewrite instead of redirect for Beluga tracking
2026-02-18 14:00:25 -08:00
Waleed
86ca984926 fix(normalization): update allowed integrations checks to be fully lowercase (#3248) 2026-02-18 12:08:03 -08:00
Emir Karabeg
e3964624ac feat(sub): hide usage limits and seats info from enterprise members (non-admin) (#3243)
- Add isEnterpriseMember and canViewUsageInfo flags to subscription permissions
- Hide UsageHeader, CreditBalance, billing date, and usage notifications from enterprise members
- Show only plan name in subscription tab for enterprise members (non-admin)
- Hide usage indicator details (amount, progress pills) from enterprise members
- Team tab already hidden via requiresTeam check in settings modal

Closes #6882

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Emir Karabeg <emir-karabeg@users.noreply.github.com>
2026-02-18 12:01:47 -08:00
Waleed
7c7c0fd955 feat(audit-log): add audit events for templates, billing, credentials, env, deployments, passwords (#3246)
* feat(audit-log): add audit events for templates, billing, credentials, env, deployments, passwords

* improvement(audit-log): add actorName/actorEmail to all recordAudit calls

* fix(audit-log): resolve user for password reset, add CREDENTIAL_SET_INVITATION_RESENT action

* fix(audit-log): add workspaceId to deployment activation audit

* improvement(audit-log): use better-auth callback for password reset audit, remove cast

- Move password reset audit to onPasswordReset callback in auth config
  instead of coupling to better-auth's verification table internals
- Remove ugly double-cast on workflowData.workspaceId in deployment activation

* fix(audit-log): add missing actorName/actorEmail to workflow duplicate

* improvement(audit-log): add resourceName to credential set invitation accept
2026-02-18 11:53:08 -08:00
Waleed
e37b4a926d feat(audit-log): add persistent audit log system with comprehensive route instrumentation (#3242)
* feat(audit-log): add persistent audit log system with comprehensive route instrumentation

* fix(audit-log): address PR review — nullable workspaceId, enum usage, remove redundant queries

- Make audit_log.workspace_id nullable with ON DELETE SET NULL (logs survive workspace/user deletion)
- Make audit_log.actor_id nullable with ON DELETE SET NULL
- Replace all 53 routes' string literal action/resourceType with AuditAction.X and AuditResourceType.X enums
- Fix empty workspaceId ('') → null for OAuth, form, and org routes to avoid FK violations
- Remove redundant DB queries in chat manage route (use checkChatAccess return data)
- Fix organization routes to pass workspaceId: null instead of organizationId

* fix(audit-log): replace remaining workspaceId '' fallbacks with null

* fix(audit-log): credential-set org IDs, workspace deletion FK, actorId fallback, string literal action

* reran migrations

* fix(mcp,audit): tighten env var domain bypass, add post-resolution check, form workspaceId

- Only bypass MCP domain check when env var is in hostname/authority, not path/query
- Add post-resolution validateMcpDomain call in test-connection endpoint
- Match client-side isDomainAllowed to same hostname-only bypass logic
- Return workspaceId from checkFormAccess, use in form audit logs
- Add 49 comprehensive domain-check tests covering all edge cases

* fix(mcp): stateful regex lastIndex bug, RFC 3986 authority parsing

- Remove /g flag from module-level ENV_VAR_PATTERN to avoid lastIndex state
- Create fresh regex instances per call in server-side hasEnvVarInHostname
- Fix authority extraction to terminate at /, ?, or # per RFC 3986
- Prevents bypass via https://evil.com?token={{SECRET}} (no path)
- Add test cases for query-only and fragment-only env var URLs (53 total)

* fix(audit-log): try/catch for never-throw contract, accept null actorName/Email, fix misleading action

- Wrap recordAudit body in try/catch so nanoid() or header extraction can't throw
- Accept string | null for actorName and actorEmail (session.user.name can be null)
- Normalize null -> undefined before insert to match DB column types
- Fix org members route: ORG_MEMBER_ADDED -> ORG_INVITATION_CREATED (sends invite, not adds member)

* improvement(audit-log): add resource names and specific invitation actions

* fix(audit-log): use validated chat record, add mock sync tests
2026-02-18 00:54:52 -08:00
Waleed
11f3a14c02 fix(lock): prevent socket crash when locking agent blocks (#3245) 2026-02-18 00:32:09 -08:00
Siddharth Ganesan
7599774974 Checkpoint 2026-02-17 18:54:15 -08:00
Emir Karabeg
eab01e0272 fix(copilot): copilot shortcut conflict (#3219)
* fix: prevent copilot keyboard shortcuts from triggering when panel is inactive

The OptionsSelector component was capturing keyboard events (1-9 number keys and Enter)
globally on the document, causing accidental option selections when users were
interacting with other parts of the application.

This fix adds a check to only handle keyboard shortcuts when the copilot panel
is the active tab, preventing the shortcuts from interfering with other workflows.

Co-authored-by: Emir Karabeg <emir-karabeg@users.noreply.github.com>

* lint

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Emir Karabeg <emir-karabeg@users.noreply.github.com>
Co-authored-by: Waleed Latif <walif6@gmail.com>
2026-02-17 18:47:07 -08:00
Waleed
bbcef7ce5c feat(access-control): add ALLOWED_INTEGRATIONS env var for self-hosted block restrictions (#3238)
* feat(access-control): add ALLOWED_INTEGRATIONS env var for self-hosted block restrictions

* fix(tests): add getAllowedIntegrationsFromEnv mock to agent-handler tests

* fix(access-control): add auth to allowlist endpoint, fix loading state race, use accurate error message

* fix(access-control): remove auth from allowed-integrations endpoint to match models endpoint pattern

* fix(access-control): normalize blockType to lowercase before env allowlist check

* fix(access-control): expose merged allowedIntegrations on config to prevent bypass via direct access

* consolidate merging of allowed blocks so all callers have it by default

* normalize to lower case

* added tests

* added tests, normalize to lower case

* added safety incase userId is missing

* fix failing tests
2026-02-17 18:46:24 -08:00
Emir Karabeg
0ee52df5a7 feat(canvas): allow locked block outbound connections (#3229)
* Allow outbound connections from locked blocks to be modified

- Modified isEdgeProtected to only check target block protection
- Outbound connections (from locked blocks) can now be added/removed
- Inbound connections (to locked blocks) remain protected
- Updated notification messages and comments to reflect the change

Co-authored-by: Emir Karabeg <emir-karabeg@users.noreply.github.com>

* update notif msg

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Emir Karabeg <emir-karabeg@users.noreply.github.com>
Co-authored-by: waleed <walif6@gmail.com>
2026-02-17 18:16:17 -08:00
Waleed
6421b1a0ca feat(mcp): add ALLOWED_MCP_DOMAINS env var for domain allowlist (#3240)
* feat(mcp): add ALLOWED_MCP_DOMAINS env var for domain allowlist

* ack PR comments

* cleanup
2026-02-17 18:01:52 -08:00
Siddharth Ganesan
471e58a2d0 Checkpoint 2026-02-17 17:04:34 -08:00
Waleed
61a5c98717 fix(shortlink): use redirect instead of rewrite for Beluga tracking (#3239) 2026-02-17 16:27:20 -08:00
Siddharth Ganesan
231ddc59a0 V0 2026-02-17 16:07:55 -08:00
Siddharth Ganesan
b197f68828 v0 2026-02-17 15:28:23 -08:00
Waleed
a0afb5d03e feat(pipedrive): added sort order to endpoints that support it, upgraded turborepo (#3237)
* feat(pipedrive): added sort order to endpoints that support it

* upgraded turborepo

* fix
2026-02-17 14:58:54 -08:00
Waleed
cdacb796a8 improvement(providers): replace @ts-ignore with typed ProviderError class (#3235) 2026-02-17 14:20:31 -08:00
Waleed
3ce54147e6 fix(pagination): add missing next_page to response interfaces and operator comments (#3236) 2026-02-17 14:13:45 -08:00
Waleed
08690b2906 feat(pagination): update pagination for remaining integrations that support it (#3233)
* feat(pagination): update pagination for remaining integrations that support it

* fixed remaining

* ack comments
2026-02-17 13:34:46 -08:00
waleed
4453edbaa8 ack comments 2026-02-17 11:45:38 -08:00
Waleed
299cc26694 improvement(lint): fix react-doctor errors and warnings (#3232)
* improvement(lint): fix react-doctor errors and warnings

* remove separators
2026-02-17 11:40:47 -08:00
waleed
f0c3392e3f ack comments 2026-02-17 11:28:40 -08:00
waleed
74db11c0fe added tests 2026-02-17 10:51:06 -08:00
Emir Karabeg
48715ff013 improvement(copilot): scrolling stickiness (#3218)
- Changed default stickinessThreshold from 100 to 30 in use-scroll-management.ts
- Removed explicit stickinessThreshold override (40) from copilot.tsx
- Both copilot and chat now use the same default value of 30
- This makes scrolling less sticky across all copilot message interactions

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Emir Karabeg <emir-karabeg@users.noreply.github.com>
2026-02-17 10:33:10 -08:00
Waleed
ad0d0ed1f1 feat(shortlink): add Beluga short link rewrite for hosted campaigns (#3231) 2026-02-17 10:32:32 -08:00
waleed
e207ad2502 ack PR comment 2026-02-17 09:51:13 -08:00
waleed
f5640b2919 regen migrations, ack PR comments 2026-02-16 23:51:33 -08:00
waleed
b0d9f4e8b5 remove module level cache, use syncContext between paginated calls to avoid redundant schema fetches 2026-02-16 23:33:14 -08:00
waleed
e7c143bdcc ack PR comments 2026-02-16 23:30:38 -08:00
waleed
6fcc820914 removed redundant util 2026-02-16 23:05:01 -08:00
waleed
82b874c027 improvements 2026-02-16 22:43:12 -08:00
waleed
3eaf5babf4 feat(knowledge): connectors, user exclusions, expanded tools & airtable integration 2026-02-16 22:12:10 -08:00
waleed
8ebe753bd8 Merge remote-tracking branch 'origin/main' into staging
# Conflicts:
#	apps/docs/content/docs/fr/tools/onepassword.mdx
#	apps/docs/content/docs/ja/tools/enrich.mdx
#	apps/docs/content/docs/ja/tools/google_maps.mdx
#	apps/docs/content/docs/ja/tools/onepassword.mdx
#	apps/docs/content/docs/zh/tools/enrich.mdx
#	apps/docs/content/docs/zh/tools/google_forms.mdx
#	apps/docs/content/docs/zh/tools/google_maps.mdx
#	apps/docs/content/docs/zh/tools/notion.mdx
#	apps/docs/content/docs/zh/tools/onepassword.mdx
#	apps/docs/content/docs/zh/tools/tinybird.mdx
2026-02-16 00:25:04 -08:00
Waleed
40a3962c1e fix(docs): update docs and disable i18n action, upgrade turborepo (#3227)
* feat(i18n): change lockfile (#3216)

* fix: update i18n.lock

* feat(docs): enhance documentation with new sections on file handling, form deployment, quick reference, agent skills, and A2A integration

* fix(docs): update docs and disable i18n action

* fix build

---------

Co-authored-by: cherkanov_art <45258907+cherkanovart@users.noreply.github.com>
2026-02-16 00:20:25 -08:00
cherkanov_art
d1d43b27bd feat(i18n): change lockfile (#3216)
* fix: update i18n.lock

* feat(docs): enhance documentation with new sections on file handling, form deployment, quick reference, agent skills, and A2A integration
2026-02-16 00:00:12 -08:00
Waleed
e204628a12 v0.5.90: workflow duplication improvements, model allowlist, logs performance, i18n 2026-02-15 23:42:42 -08:00
cherkanov_art
6f595f6a2c feat(i18n): change lockfile (#3216)
* fix: update i18n.lock

* feat(docs): enhance documentation with new sections on file handling, form deployment, quick reference, agent skills, and A2A integration
2026-02-15 23:41:56 -08:00
Waleed
92b4f77228 fix(logs): stabilize callbacks and memo-wrap components to eliminate re-render cascade (#3222) 2026-02-14 18:04:32 -08:00
Vikhyath Mondreti
c44211a936 fix(workflow-vars): duplicate, export/import copies (#3224) 2026-02-14 16:02:25 -08:00
Waleed
5b0532d473 refactor(tool-input): replace bidirectional effects with zustand subscription (#3215)
* refactor(tool-input): replace bidirectional effects with zustand subscription

* added wand for custom cron, fixed slack inconsistency

* fix slack
2026-02-14 11:19:51 -08:00
Waleed
3ef6b05035 fix(model): validate default model against available options 2026-02-13 15:16:20 -08:00
Waleed
b45f3962fc v0.5.89: resume execution on refresh, google books, tool input subblock improvements 2026-02-13 00:36:54 -08:00
Waleed
7fbbc7ba7a fix(tool-input): sync cleared subblock values to tool params (#3214) 2026-02-13 00:18:25 -08:00
Waleed
a337aa7dfe feat(internal): added internal api base url for internal calls (#3212)
* feat(internal): added internal api base url for internal calls

* make validation on http more lax
2026-02-12 23:56:35 -08:00
Waleed
022e84c4b1 feat(creators): added referrers, code redemption, campaign tracking, etc (#3198)
* feat(creators): added referrers, code redemption, campaign tracking, etc

* more

* added zod

* remove default

* remove duplicate index

* update admin routes

* reran migrations

* lint

* move userstats record creation inside tx

* added reason for already attributed case

* cleanup referral attributes
2026-02-12 20:07:40 -08:00
Waleed
602e371a7a refactor(tool-input): subblock-first rendering, component extraction, bug fixes (#3207)
* refactor(tool-input): eliminate SyncWrappers, add canonical toggle and dependsOn gating

Replace 17+ individual SyncWrapper components with a single centralized
ToolSubBlockRenderer that bridges the subblock store with StoredTool.params
via synthetic store keys. This reduces ~1000 lines of duplicated wrapper
code and ensures tool-input renders subblock components identically to
the standalone SubBlock path.

- Add ToolSubBlockRenderer with bidirectional store sync
- Add basic/advanced mode toggle (ArrowLeftRight) using collaborative functions
- Add dependsOn gating via useDependsOnGate (fields disable instead of hiding)
- Add paramVisibility field to SubBlockConfig for tool-input visibility control
- Pass canonicalModeOverrides through getSubBlocksForToolInput
- Show (optional) label for non-user-only fields (LLM can inject at runtime)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(tool-input): restore optional indicator, fix folder selector and canonical toggle, extract components

- Attach resolved paramVisibility to subblocks from getSubBlocksForToolInput
- Add labelSuffix prop to SubBlock for "(optional)" badge on user-or-llm params
- Fix folder selector missing for tools with canonicalParamId (e.g. Google Drive)
- Fix canonical toggle not clickable by letting SubBlock handle dependsOn internally
- Extract ParameterWithLabel, ToolSubBlockRenderer, ToolCredentialSelector to components/tools/
- Extract StoredTool interface to types.ts, selection helpers to utils.ts
- Remove dead code (mcpError, refreshTools, oldParamIds, initialParams)
- Strengthen typing: replace any with proper types on icon components and evaluateParameterCondition

* add sibling values to subblock context since subblock store isn't relevant in tool input, and removed unused param

* cleanup

* fix(tool-input): render uncovered tool params alongside subblocks

The SubBlock-first rendering path was hard-returning after rendering
subblocks, so tool params without matching subblocks (like inputMapping
for workflow tools) were never rendered. Now renders subblocks first,
then any remaining displayParams not covered by subblocks via the legacy
ParameterWithLabel fallback.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(tool-input): auto-refresh workflow inputs after redeploy

After redeploying a child workflow via the stale badge, the workflow
state cache was not invalidated, so WorkflowInputMapperInput kept
showing stale input fields until page refresh. Now invalidates
workflowKeys.state on deploy success.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(tool-input): correct workflow selector visibility and tighten (optional) spacing

- Set workflowId param to user-only in workflow_executor tool config
  so "Select Workflow" no longer shows "(optional)" indicator
- Tighten (optional) label spacing with -ml-[3px] to counteract
  parent Label's gap-[6px], making it feel inline with the label text

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(tool-input): align (optional) text to baseline instead of center

Use items-baseline instead of items-center on Label flex containers
so the smaller (optional) text aligns with the label text baseline
rather than sitting slightly below it.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(tool-input): increase top padding of expanded tool body

Bump the expanded tool body container's top padding from 8px to 12px
for more breathing room between the header bar and the first parameter.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(tool-input): apply extra top padding only to SubBlock-first path

Revert container padding to py-[8px] (MCP tools were correct).
Wrap SubBlock-first output in a div with pt-[4px] so only registry
tools get extra breathing room from the container top.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(tool-input): increase gap between SubBlock params for visual clarity

SubBlock's internal gap (10px between label and input) matched the
between-parameter gap (10px), making them indistinguishable. Increase
the between-parameter gap to 14px so consecutive parameters are
visually distinct, matching the separation seen in ParameterWithLabel.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix spacing and optional tag

* update styling + move predeploy checks earlier for first time deploys

* update change detection to account for synthetic tool ids

* fix remaining blocks who had files visibility set to hidden

* cleanup

* add catch

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 19:01:04 -08:00
Theodore Li
9a06cae591 Merge pull request #3210 from simstudioai/feat/google-books
feat(google books): Add google books integration
2026-02-12 16:18:42 -08:00
Theodore Li
dce47a101c Migrate last response to types 2026-02-12 15:45:00 -08:00
Theodore Li
1130f8ddb2 Remove redundant error handling, move volume item to types file 2026-02-12 15:31:12 -08:00
Waleed
ebc2ffa1c5 fix(agent): always fetch latest custom tool from DB when customToolId is present (#3208)
* fix(agent): always fetch latest custom tool from DB when customToolId is present

* test(agent): use generic test data for customToolId resolution tests

* fix(agent): mock buildAuthHeaders in tests for CI compatibility

* remove inline mocks in favor of sim/testing ones
2026-02-12 15:31:11 -08:00
Theodore Li
fc97ce007d Correct error handling, specify auth mode as api key 2026-02-12 15:26:13 -08:00
Theodore Li
6c006cdfec feat(google books): Add google books integration 2026-02-12 15:01:33 -08:00
Siddharth Ganesan
c380e59cb3 fix(copilot): make default model opus 4.5 (#3209)
* Fix default model

* Fix
2026-02-12 13:17:45 -08:00
Waleed
2944579d21 fix(s3): support get-object region override and robust S3 URL parsing (#3206)
* fix(s3): support get-object region override and robust S3 URL parsing

* ack pr comments
2026-02-12 10:59:22 -08:00
Waleed
81dfeb0bb0 fix(terminal): reconnect to running executions after page refresh (#3200)
* fix(terminal): reconnect to running executions after page refresh

* fix(terminal): use ExecutionEvent type instead of any in reconnection stream

* fix(execution): type event buffer with ExecutionEvent instead of Record<string, unknown>

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(execution): validate fromEventId query param in reconnection endpoint

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Fix some bugs

* fix(variables): fix tag dropdown and cursor alignment in variables block (#3199)

* feat(confluence): added list space labels, delete label, delete page prop (#3201)

* updated route

* ack comments

* fix(execution): reset execution state in reconnection cleanup to unblock re-entry

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(execution): restore running entries when reconnection is interrupted by navigation

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* done

* remove cast in ioredis types

* ack PR comments

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Siddharth Ganesan <siddharthganesan@gmail.com>
2026-02-11 19:31:29 -08:00
Waleed
01577a18b4 fix(change-detection): resolve false positive trigger block change detection (#3204) 2026-02-11 17:24:17 -08:00
Waleed
07d50f8fe1 v0.5.88: interactions api for gemini, trigger machine size increase, confluence ops 2026-02-11 15:36:55 -08:00
Vikhyath Mondreti
27973953f6 v0.5.87: workflow block auth fix 2026-02-10 22:33:55 -08:00
Waleed
50585273ce v0.5.86: server side copilot, copilot mcp, error notifications, jira outputs destructuring, slack trigger improvements 2026-02-10 21:49:58 -08:00
Vikhyath Mondreti
654cb2b407 v0.5.85: deployment improvements 2026-02-09 10:49:33 -08:00
Waleed
6c66521d64 v0.5.84: model request sanitization 2026-02-07 19:06:53 -08:00
Vikhyath Mondreti
479cd347ad v0.5.83: agent skills, concurrent workers for v8s, airweave integration 2026-02-07 12:27:11 -08:00
Waleed
a3a99eda19 v0.5.82: slack trigger files, pagination for linear, executor fixes 2026-02-06 00:41:52 -08:00
Waleed
1a66d48add v0.5.81: traces fix, additional confluence tools, azure anthropic support, opus 4.6 2026-02-05 11:28:54 -08:00
Waleed
46822e91f3 v0.5.80: lock feature, enterprise modules, time formatting consolidation, files, UX and UI improvements, longer timeouts 2026-02-04 18:27:05 -08:00
Waleed
2bb68335ee v0.5.79: longer MCP tools timeout, optimize loop/parallel regeneration, enrich.so integration 2026-01-31 21:57:56 -08:00
Waleed
8528fbe2d2 v0.5.78: billing fixes, mcp timeout increase, reactquery migrations, updated tool param visibilities, DSPy and Google Maps integrations 2026-01-31 13:48:22 -08:00
Waleed
31fdd2be13 v0.5.77: room manager redis migration, tool outputs, ui fixes 2026-01-30 14:57:17 -08:00
Waleed
028bc652c2 v0.5.76: posthog improvements, readme updates 2026-01-29 00:13:19 -08:00
Waleed
c6bf5cd58c v0.5.75: search modal overhaul, helm chart updates, run from block, terminal and visual debugging improvements 2026-01-28 22:54:13 -08:00
Vikhyath Mondreti
11dc18a80d v0.5.74: autolayout improvements, clerk integration, auth enforcements 2026-01-27 20:37:39 -08:00
Waleed
ab4e9dc72f v0.5.73: ci, helm updates, kb, ui fixes, note block enhancements 2026-01-26 22:04:35 -08:00
Vikhyath Mondreti
1c58c35bd8 v0.5.72: azure connection string, supabase improvement, multitrigger resolution, docs quick reference 2026-01-25 23:42:27 -08:00
Waleed
d63a5cb504 v0.5.71: ux, ci improvements, docs updates 2026-01-25 03:08:08 -08:00
Waleed
8bd5d41723 v0.5.70: router fix, anthropic agent response format adherence 2026-01-24 20:57:02 -08:00
Waleed
c12931bc50 v0.5.69: kb upgrades, blog, copilot improvements, auth consolidation (#2973)
* fix(subflows): tag dropdown + resolution logic (#2949)

* fix(subflows): tag dropdown + resolution logic

* fixes;

* revert parallel change

* chore(deps): bump posthog-js to 1.334.1 (#2948)

* fix(idempotency): add conflict target to atomicallyClaimDb query + remove redundant db namespace tracking (#2950)

* fix(idempotency): add conflict target to atomicallyClaimDb query

* delete needs to account for namespace

* simplify namespace filtering logic

* fix cleanup

* consistent target

* improvement(kb): add document filtering, select all, and React Query migration (#2951)

* improvement(kb): add document filtering, select all, and React Query migration

* test(kb): update tests for enabledFilter and removed userId params

* fix(kb): remove non-null assertion, add explicit guard

* improvement(logs): trace span, details (#2952)

* improvement(action-bar): ordering

* improvement(logs): details, trace span

* feat(blog): v0.5 release post (#2953)

* feat(blog): v0.5 post

* improvement(blog): simplify title and remove code block header

- Simplified blog title from Introducing Sim Studio v0.5 to Introducing Sim v0.5
- Removed language label header and copy button from code blocks for cleaner appearance

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* ack PR comments

* small styling improvements

* created system to create post-specific components

* updated componnet

* cache invalidation

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>

* feat(admin): add credits endpoint to issue credits to users (#2954)

* feat(admin): add credits endpoint to issue credits to users

* fix(admin): use existing credit functions and handle enterprise seats

* fix(admin): reject NaN and Infinity in amount validation

* styling

* fix(admin): validate userId and email are strings

* improvement(copilot): fast mode, subagent tool responses and allow preferences (#2955)

* Improvements

* Fix actions mapping

* Remove console logs

* fix(billing): handle missing userStats and prevent crashes (#2956)

* fix(billing): handle missing userStats and prevent crashes

* fix(billing): correct import path for getFilledPillColor

* fix(billing): add Number.isFinite check to lastPeriodCost

* fix(logs): refresh logic to refresh logs details (#2958)

* fix(security): add authentication and input validation to API routes (#2959)

* fix(security): add authentication and input validation to API routes

* moved utils

* remove extraneous commetns

* removed unused dep

* improvement(helm): add internal ingress support and same-host path consolidation (#2960)

* improvement(helm): add internal ingress support and same-host path consolidation

* improvement(helm): clean up ingress template comments

Simplify verbose inline Helm comments and section dividers to match the
minimal style used in services.yaml.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix(helm): add missing copilot path consolidation for realtime host

When copilot.host equals realtime.host but differs from app.host,
copilot paths were not being routed. Added logic to consolidate
copilot paths into the realtime rule for this scenario.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* improvement(helm): follow ingress best practices

- Remove orphan comments that appeared when services were disabled
- Add documentation about path ordering requirements
- Paths rendered in order: realtime, copilot, app (specific before catch-all)
- Clean template output matching industry Helm chart standards

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>

* feat(blog): enterprise post (#2961)

* feat(blog): enterprise post

* added more images, styling

* more content

* updated v0-5 post

* remove unused transition

---------

Co-authored-by: Vikhyath Mondreti <vikhyath@simstudio.ai>

* fix(envvars): resolution standardized (#2957)

* fix(envvars): resolution standardized

* remove comments

* address bugbot

* fix highlighting for env vars

* remove comments

* address greptile

* address bugbot

* fix(copilot): mask credentials fix (#2963)

* Fix copilot masking

* Clean up

* Lint

* improvement(webhooks): remove dead code (#2965)

* fix(webhooks): subscription recreation path

* improvement(webhooks): remove dead code

* fix tests

* address bugbot comments

* fix restoration edge case

* fix more edge cases

* address bugbot comments

* fix gmail polling

* add warnings for UI indication for credential sets

* fix(preview): subblock values (#2969)

* fix(child-workflow): nested spans handoff (#2966)

* fix(child-workflow): nested spans handoff

* remove overly defensive programming

* update type check

* type more code

* remove more dead code

* address bugbot comments

* fix(security): restrict API key access on internal-only routes (#2964)

* fix(security): restrict API key access on internal-only routes

* test(security): update function execute tests for checkInternalAuth

* updated agent handler

* move session check higher in checkSessionOrInternalAuth

* extracted duplicate code into helper for resolving user from jwt

* fix(copilot): update copilot chat title (#2968)

* fix(hitl): fix condition blocks after hitl (#2967)

* fix(notes): ghost edges (#2970)

* fix(notes): ghost edges

* fix deployed state fallback

* fallback

* remove UI level checks

* annotation missing from autoconnect source check

* improvement(docs): loop and parallel var reference syntax (#2975)

* fix(blog): slash actions description (#2976)

* improvement(docs): loop and parallel var reference syntax

* fix(blog): slash actions description

* fix(auth): copilot routes (#2977)

* Fix copilot auth

* Fix

* Fix

* Fix

* fix(copilot): fix edit summary for loops/parallels (#2978)

* fix(integrations): hide from tool bar (#2544)

* fix(landing): ui (#2979)

* fix(edge-validation): race condition on collaborative add (#2980)

* fix(variables): boolean type support and input improvements (#2981)

* fix(variables): boolean type support and input improvements

* fix formatting

---------

Co-authored-by: Vikhyath Mondreti <vikhyathvikku@gmail.com>
Co-authored-by: Emir Karabeg <78010029+emir-karabeg@users.noreply.github.com>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Siddharth Ganesan <33737564+Sg312@users.noreply.github.com>
Co-authored-by: Vikhyath Mondreti <vikhyath@simstudio.ai>
2026-01-24 14:29:53 -08:00
Waleed
e9c4251c1c v0.5.68: router block reasoning, executor improvements, variable resolution consolidation, helm updates (#2946)
* improvement(workflow-item): stabilize avatar layout and fix name truncation (#2939)

* improvement(workflow-item): stabilize avatar layout and fix name truncation

* fix(avatars): revert overflow bg to hardcoded color for contrast

* fix(executor): stop parallel execution when block errors (#2940)

* improvement(helm): add per-deployment extraVolumes support (#2942)

* fix(gmail): expose messageId field in read email block (#2943)

* fix(resolver): consolidate reference resolution  (#2941)

* fix(resolver): consolidate code to resolve references

* fix edge cases

* use already formatted error

* fix multi index

* fix backwards compat reachability

* handle backwards compatibility accurately

* use shared constant correctly

* feat(router): expose reasoning output in router v2 block (#2945)

* fix(copilot): always allow, credential masking (#2947)

* Fix always allow, credential validation

* Credential masking

* Autoload

* fix(executor): handle condition dead-end branches in loops (#2944)

---------

Co-authored-by: Vikhyath Mondreti <vikhyathvikku@gmail.com>
Co-authored-by: Siddharth Ganesan <33737564+Sg312@users.noreply.github.com>
2026-01-22 13:48:15 -08:00
Waleed
cc2be33d6b v0.5.67: loading, password reset, ui improvements, helm updates (#2928)
* fix(zustand): updated to useShallow from deprecated createWithEqualityFn (#2919)

* fix(logger): use direct env access for webpack inlining (#2920)

* fix(notifications): text overflow with line-clamp (#2921)

* chore(helm): add env vars for Vertex AI, orgs, and telemetry (#2922)

* fix(auth): improve reset password flow and consolidate brand detection (#2924)

* fix(auth): improve reset password flow and consolidate brand detection

* fix(auth): set errorHandled for EMAIL_NOT_VERIFIED to prevent duplicate error

* fix(auth): clear success message on login errors

* chore(auth): fix import order per lint

* fix(action-bar): duplicate subflows with children (#2923)

* fix(action-bar): duplicate subflows with children

* fix(action-bar): add validateTriggerPaste for subflow duplicate

* fix(resolver): agent response format, input formats, root level (#2925)

* fix(resolvers): agent response format, input formats, root level

* fix response block initial seeding

* fix tests

* fix(messages-input): fix cursor alignment and auto-resize with overlay (#2926)

* fix(messages-input): fix cursor alignment and auto-resize with overlay

* fixed remaining zustand warnings

* fix(stores): remove dead code causing log spam on startup (#2927)

* fix(stores): remove dead code causing log spam on startup

* fix(stores): replace custom tools zustand store with react query cache

* improvement(ui): use BrandedButton and BrandedLink components (#2930)

- Refactor auth forms to use BrandedButton component
- Add BrandedLink component for changelog page
- Reduce code duplication in login, signup, reset-password forms
- Update star count default value

* fix(custom-tools): remove unsafe title fallback in getCustomTool (#2929)

* fix(custom-tools): remove unsafe title fallback in getCustomTool

* fix(custom-tools): restore title fallback in getCustomTool lookup

Custom tools are referenced by title (custom_${title}), not database ID.
The title fallback is required for client-side tool resolution to work.

* fix(null-bodies): empty bodies handling (#2931)

* fix(null-statuses): empty bodies handling

* address bugbot comment

* fix(token-refresh): microsoft, notion, x, linear (#2933)

* fix(microsoft): proactive refresh needed

* fix(x): missing token refresh flag

* notion and linear missing flag too

* address bugbot comment

* fix(auth): handle EMAIL_NOT_VERIFIED in onError callback (#2932)

* fix(auth): handle EMAIL_NOT_VERIFIED in onError callback

* refactor(auth): extract redirectToVerify helper to reduce duplication

* fix(workflow-selector): use dedicated selector for workflow dropdown (#2934)

* feat(workflow-block): preview (#2935)

* improvement(copilot): tool configs to show nested props (#2936)

* fix(auth): add genericOAuth providers to trustedProviders (#2937)

---------

Co-authored-by: Vikhyath Mondreti <vikhyathvikku@gmail.com>
Co-authored-by: Emir Karabeg <78010029+emir-karabeg@users.noreply.github.com>
2026-01-21 22:53:25 -08:00
Vikhyath Mondreti
45371e521e v0.5.66: external http requests fix, ring highlighting 2026-01-21 02:55:39 -08:00
Waleed
0ce0f98aa5 v0.5.65: gemini updates, textract integration, ui updates (#2909)
* fix(google): wrap primitive tool responses for Gemini API compatibility (#2900)

* fix(canonical): copilot path + update parent (#2901)

* fix(rss): add top-level title, link, pubDate fields to RSS trigger output (#2902)

* fix(rss): add top-level title, link, pubDate fields to RSS trigger output

* fix(imap): add top-level fields to IMAP trigger output

* improvement(browseruse): add profile id param (#2903)

* improvement(browseruse): add profile id param

* make request a stub since we have directExec

* improvement(executor): upgraded abort controller to handle aborts for loops and parallels (#2880)

* improvement(executor): upgraded abort controller to handle aborts for loops and parallels

* comments

* improvement(files): update execution for passing base64 strings (#2906)

* progress

* improvement(execution): update execution for passing base64 strings

* fix types

* cleanup comments

* path security vuln

* reject promise correctly

* fix redirect case

* remove proxy routes

* fix tests

* use ipaddr

* feat(tools): added textract, added v2 for mistral, updated tag dropdown (#2904)

* feat(tools): added textract

* cleanup

* ack pr comments

* reorder

* removed upload for textract async version

* fix additional fields dropdown in editor, update parser to leave validation to be done on the server

* added mistral v2, files v2, and finalized textract

* updated the rest of the old file patterns, updated mistral outputs for v2

* updated tag dropdown to parse non-operation fields as well

* updated extension finder

* cleanup

* added description for inputs to workflow

* use helper for internal route check

* fix tag dropdown merge conflict change

* remove duplicate code

---------

Co-authored-by: Vikhyath Mondreti <vikhyath@simstudio.ai>

* fix(ui): change add inputs button to match output selector (#2907)

* fix(canvas): removed invite to workspace from canvas popover (#2908)

* fix(canvas): removed invite to workspace

* removed unused props

* fix(copilot): legacy tool display names (#2911)

* fix(a2a): canonical merge  (#2912)

* fix canonical merge

* fix empty array case

* fix(change-detection): copilot diffs have extra field (#2913)

* improvement(logs): improved logs ui bugs, added subflow disable UI (#2910)

* improvement(logs): improved logs ui bugs, added subflow disable UI

* added duplicate to action bar for subflows

* feat(broadcast): email v0.5 (#2905)

---------

Co-authored-by: Vikhyath Mondreti <vikhyathvikku@gmail.com>
Co-authored-by: Vikhyath Mondreti <vikhyath@simstudio.ai>
Co-authored-by: Emir Karabeg <78010029+emir-karabeg@users.noreply.github.com>
2026-01-20 23:54:55 -08:00
Waleed
dff1c9d083 v0.5.64: unsubscribe, search improvements, metrics, additional SSO configuration 2026-01-20 00:34:11 -08:00
Vikhyath Mondreti
b09f683072 v0.5.63: ui and performance improvements, more google tools 2026-01-18 15:22:42 -08:00
Vikhyath Mondreti
a8bb0db660 v0.5.62: webhook bug fixes, seeding default subblock values, block selection fixes 2026-01-16 20:27:06 -08:00
Waleed
af82820a28 v0.5.61: webhook improvements, workflow controls, react query for deployment status, chat fixes, reducto and pulse OCR, linear fixes 2026-01-16 18:06:23 -08:00
Waleed
4372841797 v0.5.60: invitation flow improvements, chat fixes, a2a improvements, additional copilot actions 2026-01-15 00:02:18 -08:00
Waleed
5e8c843241 v0.5.59: a2a support, documentation 2026-01-13 13:21:21 -08:00
Waleed
7bf3d73ee6 v0.5.58: export folders, new tools, permissions groups enhancements 2026-01-13 00:56:59 -08:00
Vikhyath Mondreti
7ffc11a738 v0.5.57: subagents, context menu improvements, bug fixes 2026-01-11 11:38:40 -08:00
Waleed
be578e2ed7 v0.5.56: batch operations, access control and permission groups, billing fixes 2026-01-10 00:31:34 -08:00
Waleed
f415e5edc4 v0.5.55: polling groups, bedrock provider, devcontainer fixes, workflow preview enhancements 2026-01-08 23:36:56 -08:00
Waleed
13a6e6c3fa v0.5.54: seo, model blacklist, helm chart updates, fireflies integration, autoconnect improvements, billing fixes 2026-01-07 16:09:45 -08:00
Waleed
f5ab7f21ae v0.5.53: hotkey improvements, added redis fallback, fixes for workflow tool 2026-01-06 23:34:52 -08:00
Waleed
bfb6fffe38 v0.5.52: new port-based router block, combobox expression and variable support 2026-01-06 16:14:10 -08:00
Waleed
4fbec0a43f v0.5.51: triggers, kb, condition block improvements, supabase and grain integration updates 2026-01-06 14:26:46 -08:00
Waleed
585f5e365b v0.5.50: import improvements, ui upgrades, kb styling and performance improvements 2026-01-05 00:35:55 -08:00
Waleed
3792bdd252 v0.5.49: hitl improvements, new email styles, imap trigger, logs context menu (#2672)
* feat(logs-context-menu): consolidated logs utils and types, added logs record context menu (#2659)

* feat(email): welcome email; improvement(emails): ui/ux (#2658)

* feat(email): welcome email; improvement(emails): ui/ux

* improvement(emails): links, accounts, preview

* refactor(emails): file structure and wrapper components

* added envvar for personal emails sent, added isHosted gate

* fixed failing tests, added env mock

* fix: removed comment

---------

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

* fix(logging): hitl + trigger dev crash protection (#2664)

* hitl gaps

* deal with trigger worker crashes

* cleanup import strcuture

* feat(imap): added support for imap trigger (#2663)

* feat(tools): added support for imap trigger

* feat(imap): added parity, tested

* ack PR comments

* final cleanup

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

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

* fix(grain): updated grain trigger to auto-establish trigger (#2666)

Co-authored-by: aadamgough <adam@sim.ai>

* feat(admin): routes to manage deployments (#2667)

* feat(admin): routes to manage deployments

* fix naming fo deployed by

* feat(time-picker): added timepicker emcn component, added to playground, added searchable prop for dropdown, added more timezones for schedule, updated license and notice date (#2668)

* feat(time-picker): added timepicker emcn component, added to playground, added searchable prop for dropdown, added more timezones for schedule, updated license and notice date

* removed unused params, cleaned up redundant utils

* improvement(invite): aligned styling (#2669)

* improvement(invite): aligned with rest of app

* fix(invite): error handling

* fix: addressed comments

---------

Co-authored-by: Emir Karabeg <78010029+emir-karabeg@users.noreply.github.com>
Co-authored-by: Vikhyath Mondreti <vikhyathvikku@gmail.com>
Co-authored-by: waleedlatif1 <waleedlatif1@users.noreply.github.com>
Co-authored-by: Adam Gough <77861281+aadamgough@users.noreply.github.com>
Co-authored-by: aadamgough <adam@sim.ai>
2026-01-03 13:19:18 -08:00
Waleed
eb5d1f3e5b v0.5.48: copy-paste workflow blocks, docs updates, mcp tool fixes 2025-12-31 18:00:04 -08:00
Waleed
54ab82c8dd v0.5.47: deploy workflow as mcp, kb chunks tokenizer, UI improvements, jira service management tools 2025-12-30 23:18:58 -08:00
Waleed
f895bf469b v0.5.46: build improvements, greptile, light mode improvements 2025-12-29 02:17:52 -08:00
Waleed
dd3209af06 v0.5.45: light mode fixes, realtime usage indicator, docker build improvements 2025-12-27 19:57:42 -08:00
Waleed
b6ba3b50a7 v0.5.44: keyboard shortcuts, autolayout, light mode, byok, testing improvements 2025-12-26 21:25:19 -08:00
Waleed
b304233062 v0.5.43: export logs, circleback, grain, vertex, code hygiene, schedule improvements 2025-12-23 19:19:18 -08:00
Vikhyath Mondreti
57e4b49bd6 v0.5.42: fix memory migration 2025-12-23 01:24:54 -08:00
Vikhyath Mondreti
e12dd204ed v0.5.41: memory fixes, copilot improvements, knowledgebase improvements, LLM providers standardization 2025-12-23 00:15:18 -08:00
Vikhyath Mondreti
3d9d9cbc54 v0.5.40: supabase ops to allow non-public schemas, jira uuid 2025-12-21 22:28:05 -08:00
Waleed
0f4ec962ad v0.5.39: notion, workflow variables fixes 2025-12-20 20:44:00 -08:00
Waleed
4827866f9a v0.5.38: snap to grid, copilot ux improvements, billing line items 2025-12-20 17:24:38 -08:00
Waleed
3e697d9ed9 v0.5.37: redaction utils consolidation, logs updates, autoconnect improvements, additional kb tag types 2025-12-19 22:31:55 -08:00
Martin Yankov
4431a1a484 fix(helm): add custom egress rules to realtime network policy (#2481)
The realtime service network policy was missing the custom egress rules section
that allows configuration of additional egress rules via values.yaml. This caused
the realtime pods to be unable to connect to external databases (e.g., PostgreSQL
on port 5432) when using external database configurations.

The app network policy already had this section, but the realtime network policy
was missing it, creating an inconsistency and preventing the realtime service
from accessing external databases configured via networkPolicy.egress values.

This fix adds the same custom egress rules template section to the realtime
network policy, matching the app network policy behavior and allowing users to
configure database connectivity via values.yaml.
2025-12-19 18:59:08 -08:00
Waleed
4d1a9a3f22 v0.5.36: hitl improvements, opengraph, slack fixes, one-click unsubscribe, auth checks, new db indexes 2025-12-19 01:27:49 -08:00
Vikhyath Mondreti
eb07a080fb v0.5.35: helm updates, copilot improvements, 404 for docs, salesforce fixes, subflow resize clamping 2025-12-18 16:23:19 -08:00
2590 changed files with 344273 additions and 32325 deletions

View File

@@ -454,6 +454,8 @@ Enables AI-assisted field generation.
## Tools Configuration
**Important:** `tools.config.tool` runs during serialization before variable resolution. Put `Number()` and other type coercions in `tools.config.params` instead, which runs at execution time after variables are resolved.
**Preferred:** Use tool names directly as dropdown option IDs to avoid switch cases:
```typescript
// Dropdown options use tool IDs directly
@@ -530,6 +532,41 @@ outputs: {
}
```
### Typed JSON Outputs
When using `type: 'json'` and you know the object shape in advance, **describe the inner fields in the description** so downstream blocks know what properties are available. For well-known, stable objects, use nested output definitions instead:
```typescript
outputs: {
// BAD: Opaque json with no info about what's inside
plan: { type: 'json', description: 'Zone plan information' },
// GOOD: Describe the known fields in the description
plan: {
type: 'json',
description: 'Zone plan information (id, name, price, currency, frequency, is_subscribed)',
},
// BEST: Use nested output definition when the shape is stable and well-known
plan: {
id: { type: 'string', description: 'Plan identifier' },
name: { type: 'string', description: 'Plan name' },
price: { type: 'number', description: 'Plan price' },
currency: { type: 'string', description: 'Price currency' },
},
}
```
Use the nested pattern when:
- The object has a small, stable set of fields (< 10)
- Downstream blocks will commonly access specific properties
- The API response shape is well-documented and unlikely to change
Use `type: 'json'` with a descriptive string when:
- The object has many fields or a dynamic shape
- It represents a list/array of items
- The shape varies by operation
## V2 Block Pattern
When creating V2 blocks (alongside legacy V1):
@@ -693,6 +730,62 @@ Please provide the SVG and I'll convert it to a React component.
You can usually find this in the service's brand/press kit page, or copy it from their website.
```
## Advanced Mode for Optional Fields
Optional fields that are rarely used should be set to `mode: 'advanced'` so they don't clutter the basic UI. This includes:
- Pagination tokens
- Time range filters (start/end time)
- Sort order options
- Reply settings
- Rarely used IDs (e.g., reply-to tweet ID, quote tweet ID)
- Max results / limits
```typescript
{
id: 'startTime',
title: 'Start Time',
type: 'short-input',
placeholder: 'ISO 8601 timestamp',
condition: { field: 'operation', value: ['search', 'list'] },
mode: 'advanced', // Rarely used, hide from basic view
}
```
## WandConfig for Complex Inputs
Use `wandConfig` for fields that are hard to fill out manually, such as timestamps, comma-separated lists, and complex query strings. This gives users an AI-assisted input experience.
```typescript
// Timestamps - use generationType: 'timestamp' to inject current date context
{
id: 'startTime',
title: 'Start Time',
type: 'short-input',
mode: 'advanced',
wandConfig: {
enabled: true,
prompt: 'Generate an ISO 8601 timestamp based on the user description. Return ONLY the timestamp string.',
generationType: 'timestamp',
},
}
// Comma-separated lists - simple prompt without generationType
{
id: 'mediaIds',
title: 'Media IDs',
type: 'short-input',
mode: 'advanced',
wandConfig: {
enabled: true,
prompt: 'Generate a comma-separated list of media IDs. Return ONLY the comma-separated values.',
},
}
```
## Naming Convention
All tool IDs referenced in `tools.access` and returned by `tools.config.tool` MUST use `snake_case` (e.g., `x_create_tweet`, `slack_send_message`). Never use camelCase or PascalCase.
## Checklist Before Finishing
- [ ] All subBlocks have `id`, `title` (except switch), and `type`
@@ -700,9 +793,24 @@ You can usually find this in the service's brand/press kit page, or copy it from
- [ ] DependsOn set for fields that need other values
- [ ] Required fields marked correctly (boolean or condition)
- [ ] OAuth inputs have correct `serviceId`
- [ ] Tools.access lists all tool IDs
- [ ] Tools.config.tool returns correct tool ID
- [ ] Tools.access lists all tool IDs (snake_case)
- [ ] Tools.config.tool returns correct tool ID (snake_case)
- [ ] Outputs match tool outputs
- [ ] Block registered in registry.ts
- [ ] If icon missing: asked user to provide SVG
- [ ] If triggers exist: `triggers` config set, trigger subBlocks spread
- [ ] Optional/rarely-used fields set to `mode: 'advanced'`
- [ ] Timestamps and complex inputs have `wandConfig` enabled
## Final Validation (Required)
After creating the block, you MUST validate it against every tool it references:
1. **Read every tool definition** that appears in `tools.access` — do not skip any
2. **For each tool, verify the block has correct:**
- SubBlock inputs that cover all required tool params (with correct `condition` to show for that operation)
- SubBlock input types that match the tool param types (e.g., dropdown for enums, short-input for strings)
- `tools.config.params` correctly maps subBlock IDs to tool param names (if they differ)
- Type coercions in `tools.config.params` for any params that need conversion (Number(), Boolean(), JSON.parse())
3. **Verify block outputs** cover the key fields returned by all tools
4. **Verify conditions** — each subBlock should only show for the operations that actually use it

View File

@@ -0,0 +1,261 @@
---
description: Add a knowledge base connector for syncing documents from an external source
argument-hint: <service-name> [api-docs-url]
---
# Add Connector Skill
You are an expert at adding knowledge base connectors to Sim. A connector syncs documents from an external source (Confluence, Google Drive, Notion, etc.) into a knowledge base.
## Your Task
When the user asks you to create a connector:
1. Use Context7 or WebFetch to read the service's API documentation
2. Create the connector directory and config
3. Register it in the connector registry
## Directory Structure
Create files in `apps/sim/connectors/{service}/`:
```
connectors/{service}/
├── index.ts # Barrel export
└── {service}.ts # ConnectorConfig definition
```
## ConnectorConfig Structure
```typescript
import { createLogger } from '@sim/logger'
import { {Service}Icon } from '@/components/icons'
import { fetchWithRetry } from '@/lib/knowledge/documents/utils'
import type { ConnectorConfig, ExternalDocument, ExternalDocumentList } from '@/connectors/types'
const logger = createLogger('{Service}Connector')
export const {service}Connector: ConnectorConfig = {
id: '{service}',
name: '{Service}',
description: 'Sync documents from {Service} into your knowledge base',
version: '1.0.0',
icon: {Service}Icon,
oauth: {
required: true,
provider: '{service}', // Must match OAuthService in lib/oauth/types.ts
requiredScopes: ['read:...'],
},
configFields: [
// Rendered dynamically by the add-connector modal UI
// Supports 'short-input' and 'dropdown' types
],
listDocuments: async (accessToken, sourceConfig, cursor) => {
// Paginate via cursor, extract text, compute SHA-256 hash
// Return { documents: ExternalDocument[], nextCursor?, hasMore }
},
getDocument: async (accessToken, sourceConfig, externalId) => {
// Return ExternalDocument or null
},
validateConfig: async (accessToken, sourceConfig) => {
// Return { valid: true } or { valid: false, error: 'message' }
},
// Optional: map source metadata to semantic tag keys (translated to slots by sync engine)
mapTags: (metadata) => {
// Return Record<string, unknown> with keys matching tagDefinitions[].id
},
}
```
## ConfigField Types
The add-connector modal renders these automatically — no custom UI needed.
```typescript
// Text input
{
id: 'domain',
title: 'Domain',
type: 'short-input',
placeholder: 'yoursite.example.com',
required: true,
}
// Dropdown (static options)
{
id: 'contentType',
title: 'Content Type',
type: 'dropdown',
required: false,
options: [
{ label: 'Pages only', id: 'page' },
{ label: 'Blog posts only', id: 'blogpost' },
{ label: 'All content', id: 'all' },
],
}
```
## ExternalDocument Shape
Every document returned from `listDocuments`/`getDocument` must include:
```typescript
{
externalId: string // Source-specific unique ID
title: string // Document title
content: string // Extracted plain text
mimeType: 'text/plain' // Always text/plain (content is extracted)
contentHash: string // SHA-256 of content (change detection)
sourceUrl?: string // Link back to original (stored on document record)
metadata?: Record<string, unknown> // Source-specific data (fed to mapTags)
}
```
## Content Hashing (Required)
The sync engine uses content hashes for change detection:
```typescript
async function computeContentHash(content: string): Promise<string> {
const data = new TextEncoder().encode(content)
const hashBuffer = await crypto.subtle.digest('SHA-256', data)
return Array.from(new Uint8Array(hashBuffer)).map(b => b.toString(16).padStart(2, '0')).join('')
}
```
## tagDefinitions — Declared Tag Definitions
Declare which tags the connector populates using semantic IDs. Shown in the add-connector modal as opt-out checkboxes.
On connector creation, slots are **dynamically assigned** via `getNextAvailableSlot` — connectors never hardcode slot names.
```typescript
tagDefinitions: [
{ id: 'labels', displayName: 'Labels', fieldType: 'text' },
{ id: 'version', displayName: 'Version', fieldType: 'number' },
{ id: 'lastModified', displayName: 'Last Modified', fieldType: 'date' },
],
```
Each entry has:
- `id`: Semantic key matching a key returned by `mapTags` (e.g. `'labels'`, `'version'`)
- `displayName`: Human-readable name shown in the UI (e.g. "Labels", "Last Modified")
- `fieldType`: `'text'` | `'number'` | `'date'` | `'boolean'` — determines which slot pool to draw from
Users can opt out of specific tags in the modal. Disabled IDs are stored in `sourceConfig.disabledTagIds`.
The assigned mapping (`semantic id → slot`) is stored in `sourceConfig.tagSlotMapping`.
## mapTags — Metadata to Semantic Keys
Maps source metadata to semantic tag keys. Required if `tagDefinitions` is set.
The sync engine calls this automatically and translates semantic keys to actual DB slots
using the `tagSlotMapping` stored on the connector.
Return keys must match the `id` values declared in `tagDefinitions`.
```typescript
mapTags: (metadata: Record<string, unknown>): Record<string, unknown> => {
const result: Record<string, unknown> = {}
// Validate arrays before casting — metadata may be malformed
const labels = Array.isArray(metadata.labels) ? (metadata.labels as string[]) : []
if (labels.length > 0) result.labels = labels.join(', ')
// Validate numbers — guard against NaN
if (metadata.version != null) {
const num = Number(metadata.version)
if (!Number.isNaN(num)) result.version = num
}
// Validate dates — guard against Invalid Date
if (typeof metadata.lastModified === 'string') {
const date = new Date(metadata.lastModified)
if (!Number.isNaN(date.getTime())) result.lastModified = date
}
return result
}
```
## External API Calls — Use `fetchWithRetry`
All external API calls must use `fetchWithRetry` from `@/lib/knowledge/documents/utils` instead of raw `fetch()`. This provides exponential backoff with retries on 429/502/503/504 errors. It returns a standard `Response` — all `.ok`, `.json()`, `.text()` checks work unchanged.
For `validateConfig` (user-facing, called on save), pass `VALIDATE_RETRY_OPTIONS` to cap wait time at ~7s. Background operations (`listDocuments`, `getDocument`) use the built-in defaults (5 retries, ~31s max).
```typescript
import { VALIDATE_RETRY_OPTIONS, fetchWithRetry } from '@/lib/knowledge/documents/utils'
// Background sync — use defaults
const response = await fetchWithRetry(url, {
method: 'GET',
headers: { Authorization: `Bearer ${accessToken}` },
})
// validateConfig — tighter retry budget
const response = await fetchWithRetry(url, { ... }, VALIDATE_RETRY_OPTIONS)
```
## sourceUrl
If `ExternalDocument.sourceUrl` is set, the sync engine stores it on the document record. Always construct the full URL (not a relative path).
## Sync Engine Behavior (Do Not Modify)
The sync engine (`lib/knowledge/connectors/sync-engine.ts`) is connector-agnostic. It:
1. Calls `listDocuments` with pagination until `hasMore` is false
2. Compares `contentHash` to detect new/changed/unchanged documents
3. Stores `sourceUrl` and calls `mapTags` on insert/update automatically
4. Handles soft-delete of removed documents
You never need to modify the sync engine when adding a connector.
## OAuth Credential Reuse
Connectors reuse the existing OAuth infrastructure. The `oauth.provider` must match an `OAuthService` from `apps/sim/lib/oauth/types.ts`. Check existing providers before adding a new one.
## Icon
The `icon` field on `ConnectorConfig` is used throughout the UI — in the connector list, the add-connector modal, and as the document icon in the knowledge base table (replacing the generic file type icon for connector-sourced documents). The icon is read from `CONNECTOR_REGISTRY[connectorType].icon` at runtime — no separate icon map to maintain.
If the service already has an icon in `apps/sim/components/icons.tsx` (from a tool integration), reuse it. Otherwise, ask the user to provide the SVG.
## Registering
Add one line to `apps/sim/connectors/registry.ts`:
```typescript
import { {service}Connector } from '@/connectors/{service}'
export const CONNECTOR_REGISTRY: ConnectorRegistry = {
// ... existing connectors ...
{service}: {service}Connector,
}
```
## Reference Implementation
See `apps/sim/connectors/confluence/confluence.ts` for a complete example with:
- Multiple config field types (text + dropdown)
- Label fetching and CQL search filtering
- Blogpost + page content types
- `mapTags` mapping labels, version, and dates to semantic keys
## Checklist
- [ ] Created `connectors/{service}/{service}.ts` with full ConnectorConfig
- [ ] Created `connectors/{service}/index.ts` barrel export
- [ ] `oauth.provider` matches an existing OAuthService in `lib/oauth/types.ts`
- [ ] `listDocuments` handles pagination and computes content hashes
- [ ] `sourceUrl` set on each ExternalDocument (full URL, not relative)
- [ ] `metadata` includes source-specific data for tag mapping
- [ ] `tagDefinitions` declared for each semantic key returned by `mapTags`
- [ ] `mapTags` implemented if source has useful metadata (labels, dates, versions)
- [ ] `validateConfig` verifies the source is accessible
- [ ] All external API calls use `fetchWithRetry` (not raw `fetch`)
- [ ] All optional config fields validated in `validateConfig`
- [ ] Icon exists in `components/icons.tsx` (or asked user to provide SVG)
- [ ] Registered in `connectors/registry.ts`

View File

@@ -102,6 +102,7 @@ export const {service}{Action}Tool: ToolConfig<Params, Response> = {
- Always use `?? []` for optional array fields
- Set `optional: true` for outputs that may not exist
- Never output raw JSON dumps - extract meaningful fields
- When using `type: 'json'` and you know the object shape, define `properties` with the inner fields so downstream consumers know the structure. Only use bare `type: 'json'` when the shape is truly dynamic
## Step 3: Create Block
@@ -436,6 +437,12 @@ If creating V2 versions (API-aligned outputs):
- [ ] Ran `bun run scripts/generate-docs.ts`
- [ ] Verified docs file created
### Final Validation (Required)
- [ ] Read every tool file and cross-referenced inputs/outputs against the API docs
- [ ] Verified block subBlocks cover all required tool params with correct conditions
- [ ] Verified block outputs match what the tools actually return
- [ ] Verified `tools.config.params` correctly maps and coerces all param types
## Example Command
When the user asks to add an integration:
@@ -685,13 +692,40 @@ return NextResponse.json({
| `isUserFile` | `@/lib/core/utils/user-file` | Type guard for UserFile objects |
| `FileInputSchema` | `@/lib/uploads/utils/file-schemas` | Zod schema for file validation |
### Advanced Mode for Optional Fields
Optional fields that are rarely used should be set to `mode: 'advanced'` so they don't clutter the basic UI. Examples: pagination tokens, time range filters, sort order, max results, reply settings.
### WandConfig for Complex Inputs
Use `wandConfig` for fields that are hard to fill out manually:
- **Timestamps**: Use `generationType: 'timestamp'` to inject current date context into the AI prompt
- **JSON arrays**: Use `generationType: 'json-object'` for structured data
- **Complex queries**: Use a descriptive prompt explaining the expected format
```typescript
{
id: 'startTime',
title: 'Start Time',
type: 'short-input',
mode: 'advanced',
wandConfig: {
enabled: true,
prompt: 'Generate an ISO 8601 timestamp. Return ONLY the timestamp string.',
generationType: 'timestamp',
},
}
```
### Common Gotchas
1. **OAuth serviceId must match** - The `serviceId` in oauth-input must match the OAuth provider configuration
2. **Tool IDs are snake_case** - `stripe_create_payment`, not `stripeCreatePayment`
2. **All tool IDs MUST be snake_case** - `stripe_create_payment`, not `stripeCreatePayment`. This applies to tool `id` fields, registry keys, `tools.access` arrays, and `tools.config.tool` return values
3. **Block type is snake_case** - `type: 'stripe'`, not `type: 'Stripe'`
4. **Alphabetical ordering** - Keep imports and registry entries alphabetically sorted
5. **Required can be conditional** - Use `required: { field: 'op', value: 'create' }` instead of always true
6. **DependsOn clears options** - When a dependency changes, selector options are refetched
7. **Never pass Buffer directly to fetch** - Convert to `new Uint8Array(buffer)` for TypeScript compatibility
8. **Always handle legacy file params** - Keep hidden `fileContent` params for backwards compatibility
9. **Optional fields use advanced mode** - Set `mode: 'advanced'` on rarely-used optional fields
10. **Complex inputs need wandConfig** - Timestamps, JSON arrays, and other hard-to-type values should have `wandConfig` enabled

View File

@@ -147,9 +147,18 @@ closedAt: {
},
```
### Nested Properties
For complex outputs, define nested structure:
### Typed JSON Outputs
When using `type: 'json'` and you know the object shape in advance, **always define the inner structure** using `properties` so downstream consumers know what fields are available:
```typescript
// BAD: Opaque json with no info about what's inside
metadata: {
type: 'json',
description: 'Response metadata',
},
// GOOD: Define the known properties
metadata: {
type: 'json',
description: 'Response metadata',
@@ -159,7 +168,10 @@ metadata: {
count: { type: 'number', description: 'Total count' },
},
},
```
For arrays of objects, define the item structure:
```typescript
items: {
type: 'array',
description: 'List of items',
@@ -173,6 +185,8 @@ items: {
},
```
Only use bare `type: 'json'` without `properties` when the shape is truly dynamic or unknown.
## Critical Rules for transformResponse
### Handle Nullable Fields
@@ -272,8 +286,13 @@ If creating V2 tools (API-aligned outputs), use `_v2` suffix:
- Version: `'2.0.0'`
- Outputs: Flat, API-aligned (no content/metadata wrapper)
## Naming Convention
All tool IDs MUST use `snake_case`: `{service}_{action}` (e.g., `x_create_tweet`, `slack_send_message`). Never use camelCase or PascalCase for tool IDs.
## Checklist Before Finishing
- [ ] All tool IDs use snake_case
- [ ] All params have explicit `required: true` or `required: false`
- [ ] All params have appropriate `visibility`
- [ ] All nullable response fields use `?? null`
@@ -281,4 +300,22 @@ If creating V2 tools (API-aligned outputs), use `_v2` suffix:
- [ ] No raw JSON dumps in outputs
- [ ] Types file has all interfaces
- [ ] Index.ts exports all tools
- [ ] Tool IDs use snake_case
## Final Validation (Required)
After creating all tools, you MUST validate every tool before finishing:
1. **Read every tool file** you created — do not skip any
2. **Cross-reference with the API docs** to verify:
- All required params are marked `required: true`
- All optional params are marked `required: false`
- Param types match the API (string, number, boolean, json)
- Request URL, method, headers, and body match the API spec
- `transformResponse` extracts the correct fields from the API response
- All output fields match what the API actually returns
- No fields are missing from outputs that the API provides
- No extra fields are defined in outputs that the API doesn't return
3. **Verify consistency** across tools:
- Shared types in `types.ts` match all tools that use them
- Tool IDs in the barrel export match the tool file definitions
- Error handling is consistent (error checks, meaningful messages)

View File

@@ -0,0 +1,283 @@
---
description: Validate an existing Sim integration (tools, block, registry) against the service's API docs
argument-hint: <service-name> [api-docs-url]
---
# Validate Integration Skill
You are an expert auditor for Sim integrations. Your job is to thoroughly validate that an existing integration is correct, complete, and follows all conventions.
## Your Task
When the user asks you to validate an integration:
1. Read the service's API documentation (via WebFetch or Context7)
2. Read every tool, the block, and registry entries
3. Cross-reference everything against the API docs and Sim conventions
4. Report all issues found, grouped by severity (critical, warning, suggestion)
5. Fix all issues after reporting them
## Step 1: Gather All Files
Read **every** file for the integration — do not skip any:
```
apps/sim/tools/{service}/ # All tool files, types.ts, index.ts
apps/sim/blocks/blocks/{service}.ts # Block definition
apps/sim/tools/registry.ts # Tool registry entries for this service
apps/sim/blocks/registry.ts # Block registry entry for this service
apps/sim/components/icons.tsx # Icon definition
apps/sim/lib/auth/auth.ts # OAuth scopes (if OAuth service)
apps/sim/lib/oauth/oauth.ts # OAuth provider config (if OAuth service)
```
## Step 2: Pull API Documentation
Fetch the official API docs for the service. This is the **source of truth** for:
- Endpoint URLs, HTTP methods, and auth headers
- Required vs optional parameters
- Parameter types and allowed values
- Response shapes and field names
- Pagination patterns (which param name, which response field)
- Rate limits and error formats
## Step 3: Validate Tools
For **every** tool file, check:
### Tool ID and Naming
- [ ] Tool ID uses `snake_case`: `{service}_{action}` (e.g., `x_create_tweet`, `slack_send_message`)
- [ ] Tool `name` is human-readable (e.g., `'X Create Tweet'`)
- [ ] Tool `description` is a concise one-liner describing what it does
- [ ] Tool `version` is set (`'1.0.0'` or `'2.0.0'` for V2)
### Params
- [ ] All required API params are marked `required: true`
- [ ] All optional API params are marked `required: false`
- [ ] Every param has explicit `required: true` or `required: false` — never omitted
- [ ] Param types match the API (`'string'`, `'number'`, `'boolean'`, `'json'`)
- [ ] Visibility is correct:
- `'hidden'` — ONLY for OAuth access tokens and system-injected params
- `'user-only'` — for API keys, credentials, and account-specific IDs the user must provide
- `'user-or-llm'` — for everything else (search queries, content, filters, IDs that could come from other blocks)
- [ ] Every param has a `description` that explains what it does
### Request
- [ ] URL matches the API endpoint exactly (correct base URL, path segments, path params)
- [ ] HTTP method matches the API spec (GET, POST, PUT, PATCH, DELETE)
- [ ] Headers include correct auth pattern:
- OAuth: `Authorization: Bearer ${params.accessToken}`
- API Key: correct header name and format per the service's docs
- [ ] `Content-Type` header is set for POST/PUT/PATCH requests
- [ ] Body sends all required fields and only includes optional fields when provided
- [ ] For GET requests with query params: URL is constructed correctly with query string
- [ ] ID fields in URL paths are `.trim()`-ed to prevent copy-paste whitespace errors
- [ ] Path params use template literals correctly: `` `https://api.service.com/v1/${params.id.trim()}` ``
### Response / transformResponse
- [ ] Correctly parses the API response (`await response.json()`)
- [ ] Extracts the right fields from the response structure (e.g., `data.data` vs `data` vs `data.results`)
- [ ] All nullable fields use `?? null`
- [ ] All optional arrays use `?? []`
- [ ] Error cases are handled: checks for missing/empty data and returns meaningful error
- [ ] Does NOT do raw JSON dumps — extracts meaningful, individual fields
### Outputs
- [ ] All output fields match what the API actually returns
- [ ] No fields are missing that the API provides and users would commonly need
- [ ] No phantom fields defined that the API doesn't return
- [ ] `optional: true` is set on fields that may not exist in all responses
- [ ] When using `type: 'json'` and the shape is known, `properties` defines the inner fields
- [ ] When using `type: 'array'`, `items` defines the item structure with `properties`
- [ ] Field descriptions are accurate and helpful
### Types (types.ts)
- [ ] Has param interfaces for every tool (e.g., `XCreateTweetParams`)
- [ ] Has response interfaces for every tool (extending `ToolResponse`)
- [ ] Optional params use `?` in the interface (e.g., `replyTo?: string`)
- [ ] Field names in types match actual API field names
- [ ] Shared response types are properly reused (e.g., `XTweetResponse` shared across tweet tools)
### Barrel Export (index.ts)
- [ ] Every tool is exported
- [ ] All types are re-exported (`export * from './types'`)
- [ ] No orphaned exports (tools that don't exist)
### Tool Registry (tools/registry.ts)
- [ ] Every tool is imported and registered
- [ ] Registry keys use snake_case and match tool IDs exactly
- [ ] Entries are in alphabetical order within the file
## Step 4: Validate Block
### Block ↔ Tool Alignment (CRITICAL)
This is the most important validation — the block must be perfectly aligned with every tool it references.
For **each tool** in `tools.access`:
- [ ] The operation dropdown has an option whose ID matches the tool ID (or the `tools.config.tool` function correctly maps to it)
- [ ] Every **required** tool param (except `accessToken`) has a corresponding subBlock input that is:
- Shown when that operation is selected (correct `condition`)
- Marked as `required: true` (or conditionally required)
- [ ] Every **optional** tool param has a corresponding subBlock input (or is intentionally omitted if truly never needed)
- [ ] SubBlock `id` values are unique across the entire block — no duplicates even across different conditions
- [ ] The `tools.config.tool` function returns the correct tool ID for every possible operation value
- [ ] The `tools.config.params` function correctly maps subBlock IDs to tool param names when they differ
### SubBlocks
- [ ] Operation dropdown lists ALL tool operations available in `tools.access`
- [ ] Dropdown option labels are human-readable and descriptive
- [ ] Conditions use correct syntax:
- Single value: `{ field: 'operation', value: 'x_create_tweet' }`
- Multiple values (OR): `{ field: 'operation', value: ['x_create_tweet', 'x_delete_tweet'] }`
- Negation: `{ field: 'operation', value: 'delete', not: true }`
- Compound: `{ field: 'op', value: 'send', and: { field: 'type', value: 'dm' } }`
- [ ] Condition arrays include ALL operations that use that field — none missing
- [ ] `dependsOn` is set for fields that need other values (selectors depending on credential, cascading dropdowns)
- [ ] SubBlock types match tool param types:
- Enum/fixed options → `dropdown`
- Free text → `short-input`
- Long text/content → `long-input`
- True/false → `dropdown` with Yes/No options (not `switch` unless purely UI toggle)
- Credentials → `oauth-input` with correct `serviceId`
- [ ] Dropdown `value: () => 'default'` is set for dropdowns with a sensible default
### Advanced Mode
- [ ] Optional, rarely-used fields are set to `mode: 'advanced'`:
- Pagination tokens / next tokens
- Time range filters (start/end time)
- Sort order / direction options
- Max results / per page limits
- Reply settings / threading options
- Rarely used IDs (reply-to, quote-tweet, etc.)
- Exclude filters
- [ ] **Required** fields are NEVER set to `mode: 'advanced'`
- [ ] Fields that users fill in most of the time are NOT set to `mode: 'advanced'`
### WandConfig
- [ ] Timestamp fields have `wandConfig` with `generationType: 'timestamp'`
- [ ] Comma-separated list fields have `wandConfig` with a descriptive prompt
- [ ] Complex filter/query fields have `wandConfig` with format examples in the prompt
- [ ] All `wandConfig` prompts end with "Return ONLY the [format] - no explanations, no extra text."
- [ ] `wandConfig.placeholder` describes what to type in natural language
### Tools Config
- [ ] `tools.access` lists **every** tool ID the block can use — none missing
- [ ] `tools.config.tool` returns the correct tool ID for each operation
- [ ] Type coercions are in `tools.config.params` (runs at execution time), NOT in `tools.config.tool` (runs at serialization time before variable resolution)
- [ ] `tools.config.params` handles:
- `Number()` conversion for numeric params that come as strings from inputs
- `Boolean` / string-to-boolean conversion for toggle params
- Empty string → `undefined` conversion for optional dropdown values
- Any subBlock ID → tool param name remapping
- [ ] No `Number()`, `JSON.parse()`, or other coercions in `tools.config.tool` — these would destroy dynamic references like `<Block.output>`
### Block Outputs
- [ ] Outputs cover the key fields returned by ALL tools (not just one operation)
- [ ] Output types are correct (`'string'`, `'number'`, `'boolean'`, `'json'`)
- [ ] `type: 'json'` outputs either:
- Describe inner fields in the description string (GOOD): `'User profile (id, name, username, bio)'`
- Use nested output definitions (BEST): `{ id: { type: 'string' }, name: { type: 'string' } }`
- [ ] No opaque `type: 'json'` with vague descriptions like `'Response data'`
- [ ] Outputs that only appear for certain operations use `condition` if supported, or document which operations return them
### Block Metadata
- [ ] `type` is snake_case (e.g., `'x'`, `'cloudflare'`)
- [ ] `name` is human-readable (e.g., `'X'`, `'Cloudflare'`)
- [ ] `description` is a concise one-liner
- [ ] `longDescription` provides detail for docs
- [ ] `docsLink` points to `'https://docs.sim.ai/tools/{service}'`
- [ ] `category` is `'tools'`
- [ ] `bgColor` uses the service's brand color hex
- [ ] `icon` references the correct icon component from `@/components/icons`
- [ ] `authMode` is set correctly (`AuthMode.OAuth` or `AuthMode.ApiKey`)
- [ ] Block is registered in `blocks/registry.ts` alphabetically
### Block Inputs
- [ ] `inputs` section lists all subBlock params that the block accepts
- [ ] Input types match the subBlock types
- [ ] When using `canonicalParamId`, inputs list the canonical ID (not the raw subBlock IDs)
## Step 5: Validate OAuth Scopes (if OAuth service)
- [ ] `auth.ts` scopes include ALL scopes needed by ALL tools in the integration
- [ ] `oauth.ts` provider config scopes match `auth.ts` scopes
- [ ] Block `requiredScopes` (if defined) matches `auth.ts` scopes
- [ ] No excess scopes that aren't needed by any tool
- [ ] Each scope has a human-readable description in `oauth-required-modal.tsx`'s `SCOPE_DESCRIPTIONS`
## Step 6: Validate Pagination Consistency
If any tools support pagination:
- [ ] Pagination param names match the API docs (e.g., `pagination_token` vs `next_token` vs `cursor`)
- [ ] Different API endpoints that use different pagination param names have separate subBlocks in the block
- [ ] Pagination response fields (`nextToken`, `cursor`, etc.) are included in tool outputs
- [ ] Pagination subBlocks are set to `mode: 'advanced'`
## Step 7: Validate Error Handling
- [ ] `transformResponse` checks for error conditions before accessing data
- [ ] Error responses include meaningful messages (not just generic "failed")
- [ ] HTTP error status codes are handled (check `response.ok` or status codes)
## Step 8: Report and Fix
### Report Format
Group findings by severity:
**Critical** (will cause runtime errors or incorrect behavior):
- Wrong endpoint URL or HTTP method
- Missing required params or wrong `required` flag
- Incorrect response field mapping (accessing wrong path in response)
- Missing error handling that would cause crashes
- Tool ID mismatch between tool file, registry, and block `tools.access`
- OAuth scopes missing in `auth.ts` that tools need
- `tools.config.tool` returning wrong tool ID for an operation
- Type coercions in `tools.config.tool` instead of `tools.config.params`
**Warning** (follows conventions incorrectly or has usability issues):
- Optional field not set to `mode: 'advanced'`
- Missing `wandConfig` on timestamp/complex fields
- Wrong `visibility` on params (e.g., `'hidden'` instead of `'user-or-llm'`)
- Missing `optional: true` on nullable outputs
- Opaque `type: 'json'` without property descriptions
- Missing `.trim()` on ID fields in request URLs
- Missing `?? null` on nullable response fields
- Block condition array missing an operation that uses that field
- Missing scope description in `oauth-required-modal.tsx`
**Suggestion** (minor improvements):
- Better description text
- Inconsistent naming across tools
- Missing `longDescription` or `docsLink`
- Pagination fields that could benefit from `wandConfig`
### Fix All Issues
After reporting, fix every **critical** and **warning** issue. Apply **suggestions** where they don't add unnecessary complexity.
### Validation Output
After fixing, confirm:
1. `bun run lint` passes with no fixes needed
2. TypeScript compiles clean (no type errors)
3. Re-read all modified files to verify fixes are correct
## Checklist Summary
- [ ] Read ALL tool files, block, types, index, and registries
- [ ] Pulled and read official API documentation
- [ ] Validated every tool's ID, params, request, response, outputs, and types against API docs
- [ ] Validated block ↔ tool alignment (every tool param has a subBlock, every condition is correct)
- [ ] Validated advanced mode on optional/rarely-used fields
- [ ] Validated wandConfig on timestamps and complex inputs
- [ ] Validated tools.config mapping, tool selector, and type coercions
- [ ] Validated block outputs match what tools return, with typed JSON where possible
- [ ] Validated OAuth scopes alignment across auth.ts, oauth.ts, block, and modal (if OAuth)
- [ ] Validated pagination consistency across tools and block
- [ ] Validated error handling (error checks, meaningful messages)
- [ ] Validated registry entries (tools and block, alphabetical, correct imports)
- [ ] Reported all issues grouped by severity
- [ ] Fixed all critical and warning issues
- [ ] Ran `bun run lint` after fixes
- [ ] Verified TypeScript compiles clean

View File

@@ -8,51 +8,210 @@ paths:
Use Vitest. Test files: `feature.ts``feature.test.ts`
## Global Mocks (vitest.setup.ts)
These modules are mocked globally — do NOT re-mock them in test files unless you need to override behavior:
- `@sim/db``databaseMock`
- `drizzle-orm``drizzleOrmMock`
- `@sim/logger``loggerMock`
- `@/stores/console/store`, `@/stores/terminal`, `@/stores/execution/store`
- `@/blocks/registry`
- `@trigger.dev/sdk`
## Structure
```typescript
/**
* @vitest-environment node
*/
import { databaseMock, loggerMock } from '@sim/testing'
import { describe, expect, it, vi } from 'vitest'
import { createMockRequest } from '@sim/testing'
import { beforeEach, describe, expect, it, vi } from 'vitest'
vi.mock('@sim/db', () => databaseMock)
vi.mock('@sim/logger', () => loggerMock)
const { mockGetSession } = vi.hoisted(() => ({
mockGetSession: vi.fn(),
}))
import { myFunction } from '@/lib/feature'
vi.mock('@/lib/auth', () => ({
auth: { api: { getSession: vi.fn() } },
getSession: mockGetSession,
}))
describe('myFunction', () => {
beforeEach(() => vi.clearAllMocks())
it.concurrent('isolated tests run in parallel', () => { ... })
import { GET, POST } from '@/app/api/my-route/route'
describe('my route', () => {
beforeEach(() => {
vi.clearAllMocks()
mockGetSession.mockResolvedValue({ user: { id: 'user-1' } })
})
it('returns data', async () => {
const req = createMockRequest('GET')
const res = await GET(req)
expect(res.status).toBe(200)
})
})
```
## Performance Rules (Critical)
### NEVER use `vi.resetModules()` + `vi.doMock()` + `await import()`
This is the #1 cause of slow tests. It forces complete module re-evaluation per test.
```typescript
// BAD — forces module re-evaluation every test (~50-100ms each)
beforeEach(() => {
vi.resetModules()
vi.doMock('@/lib/auth', () => ({ getSession: vi.fn() }))
})
it('test', async () => {
const { GET } = await import('./route') // slow dynamic import
})
// GOOD — module loaded once, mocks reconfigured per test (~1ms each)
const { mockGetSession } = vi.hoisted(() => ({
mockGetSession: vi.fn(),
}))
vi.mock('@/lib/auth', () => ({ getSession: mockGetSession }))
import { GET } from '@/app/api/my-route/route'
beforeEach(() => { vi.clearAllMocks() })
it('test', () => {
mockGetSession.mockResolvedValue({ user: { id: '1' } })
})
```
**Only exception:** Singleton modules that cache state at module scope (e.g., Redis clients, connection pools). These genuinely need `vi.resetModules()` + dynamic import to get a fresh instance per test.
### NEVER use `vi.importActual()`
This defeats the purpose of mocking by loading the real module and all its dependencies.
```typescript
// BAD — loads real module + all transitive deps
vi.mock('@/lib/workspaces/utils', async () => {
const actual = await vi.importActual('@/lib/workspaces/utils')
return { ...actual, myFn: vi.fn() }
})
// GOOD — mock everything, only implement what tests need
vi.mock('@/lib/workspaces/utils', () => ({
myFn: vi.fn(),
otherFn: vi.fn(),
}))
```
### NEVER use `mockAuth()`, `mockConsoleLogger()`, or `setupCommonApiMocks()` from `@sim/testing`
These helpers internally use `vi.doMock()` which is slow. Use direct `vi.hoisted()` + `vi.mock()` instead.
### Mock heavy transitive dependencies
If a module under test imports `@/blocks` (200+ files), `@/tools/registry`, or other heavy modules, mock them:
```typescript
vi.mock('@/blocks', () => ({
getBlock: () => null,
getAllBlocks: () => ({}),
getAllBlockTypes: () => [],
registry: {},
}))
```
### Use `@vitest-environment node` unless DOM is needed
Only use `@vitest-environment jsdom` if the test uses `window`, `document`, `FormData`, or other browser APIs. Node environment is significantly faster.
### Avoid real timers in tests
```typescript
// BAD
await new Promise(r => setTimeout(r, 500))
// GOOD — use minimal delays or fake timers
await new Promise(r => setTimeout(r, 1))
// or
vi.useFakeTimers()
```
## Mock Pattern Reference
### Auth mocking (API routes)
```typescript
const { mockGetSession } = vi.hoisted(() => ({
mockGetSession: vi.fn(),
}))
vi.mock('@/lib/auth', () => ({
auth: { api: { getSession: vi.fn() } },
getSession: mockGetSession,
}))
// In tests:
mockGetSession.mockResolvedValue({ user: { id: 'user-1', email: 'test@example.com' } })
mockGetSession.mockResolvedValue(null) // unauthenticated
```
### Hybrid auth mocking
```typescript
const { mockCheckSessionOrInternalAuth } = vi.hoisted(() => ({
mockCheckSessionOrInternalAuth: vi.fn(),
}))
vi.mock('@/lib/auth/hybrid', () => ({
checkSessionOrInternalAuth: mockCheckSessionOrInternalAuth,
}))
// In tests:
mockCheckSessionOrInternalAuth.mockResolvedValue({
success: true, userId: 'user-1', authType: 'session',
})
```
### Database chain mocking
```typescript
const { mockSelect, mockFrom, mockWhere } = vi.hoisted(() => ({
mockSelect: vi.fn(),
mockFrom: vi.fn(),
mockWhere: vi.fn(),
}))
vi.mock('@sim/db', () => ({
db: { select: mockSelect },
}))
beforeEach(() => {
mockSelect.mockReturnValue({ from: mockFrom })
mockFrom.mockReturnValue({ where: mockWhere })
mockWhere.mockResolvedValue([{ id: '1', name: 'test' }])
})
```
## @sim/testing Package
Always prefer over local mocks.
Always prefer over local test data.
| Category | Utilities |
|----------|-----------|
| **Mocks** | `loggerMock`, `databaseMock`, `setupGlobalFetchMock()` |
| **Factories** | `createSession()`, `createWorkflowRecord()`, `createBlock()`, `createExecutorContext()` |
| **Mocks** | `loggerMock`, `databaseMock`, `drizzleOrmMock`, `setupGlobalFetchMock()` |
| **Factories** | `createSession()`, `createWorkflowRecord()`, `createBlock()`, `createExecutionContext()` |
| **Builders** | `WorkflowBuilder`, `ExecutionContextBuilder` |
| **Assertions** | `expectWorkflowAccessGranted()`, `expectBlockExecuted()` |
| **Requests** | `createMockRequest()`, `createEnvMock()` |
## Rules
## Rules Summary
1. `@vitest-environment node` directive at file top
2. `vi.mock()` calls before importing mocked modules
3. `@sim/testing` utilities over local mocks
4. `it.concurrent` for isolated tests (no shared mutable state)
5. `beforeEach(() => vi.clearAllMocks())` to reset state
## Hoisted Mocks
For mutable mock references:
```typescript
const mockFn = vi.hoisted(() => vi.fn())
vi.mock('@/lib/module', () => ({ myFunction: mockFn }))
mockFn.mockResolvedValue({ data: 'test' })
```
1. `@vitest-environment node` unless DOM is required
2. `vi.hoisted()` + `vi.mock()` + static imports — never `vi.resetModules()` + `vi.doMock()` + dynamic imports
3. `vi.mock()` calls before importing mocked modules
4. `@sim/testing` utilities over local mocks
5. `beforeEach(() => vi.clearAllMocks())` to reset state — no redundant `afterEach`
6. No `vi.importActual()` — mock everything explicitly
7. No `mockAuth()`, `mockConsoleLogger()`, `setupCommonApiMocks()` — use direct mocks
8. Mock heavy deps (`@/blocks`, `@/tools/registry`, `@/triggers`) in tests that don't need them
9. Use absolute imports in test files
10. Avoid real timers — use 1ms delays or `vi.useFakeTimers()`

View File

@@ -0,0 +1,26 @@
---
description: SEO and GEO guidelines for the landing page
globs: ["apps/sim/app/(home)/**/*.tsx"]
---
# Landing Page — SEO / GEO
## SEO
- One `<h1>` per page, in Hero only — never add another.
- Strict heading hierarchy: H1 (Hero) → H2 (section titles) → H3 (feature names).
- Every section: `<section id="…" aria-labelledby="…-heading">`.
- Decorative/animated elements: `aria-hidden="true"`.
- All internal routes use Next.js `<Link>` (crawlable). External links get `rel="noopener noreferrer"`.
- Navbar is a Server Component (no `'use client'`) for immediate crawlability. Logo `<Image>` has `priority` (LCP element).
- Navbar `<nav>` carries `SiteNavigationElement` schema.org markup.
- Feature lists must stay in sync with `WebApplication.featureList` in `structured-data.tsx`.
## GEO (Generative Engine Optimisation)
- **Answer-first pattern**: each section's H2 + subtitle should directly answer a user question (e.g. "What is Sim?", "How fast can I deploy?").
- **Atomic answer blocks**: each feature / template card should be independently extractable by an AI summariser.
- **Entity consistency**: always write "Sim" by name — never "the platform" or "our tool".
- **Keyword density**: first 150 visible chars of Hero must name "Sim", "AI agents", "agentic workflows".
- **sr-only summaries**: Hero and Templates each have a `<p className="sr-only">` (~50 words) as an atomic product/catalog summary for AI citation.
- **Specific numbers**: prefer concrete figures ("1,000+ integrations", "15+ AI providers") over vague claims.

View File

@@ -7,51 +7,210 @@ globs: ["apps/sim/**/*.test.ts", "apps/sim/**/*.test.tsx"]
Use Vitest. Test files: `feature.ts` → `feature.test.ts`
## Global Mocks (vitest.setup.ts)
These modules are mocked globally — do NOT re-mock them in test files unless you need to override behavior:
- `@sim/db` → `databaseMock`
- `drizzle-orm` → `drizzleOrmMock`
- `@sim/logger` → `loggerMock`
- `@/stores/console/store`, `@/stores/terminal`, `@/stores/execution/store`
- `@/blocks/registry`
- `@trigger.dev/sdk`
## Structure
```typescript
/**
* @vitest-environment node
*/
import { databaseMock, loggerMock } from '@sim/testing'
import { describe, expect, it, vi } from 'vitest'
import { createMockRequest } from '@sim/testing'
import { beforeEach, describe, expect, it, vi } from 'vitest'
vi.mock('@sim/db', () => databaseMock)
vi.mock('@sim/logger', () => loggerMock)
const { mockGetSession } = vi.hoisted(() => ({
mockGetSession: vi.fn(),
}))
import { myFunction } from '@/lib/feature'
vi.mock('@/lib/auth', () => ({
auth: { api: { getSession: vi.fn() } },
getSession: mockGetSession,
}))
describe('myFunction', () => {
beforeEach(() => vi.clearAllMocks())
it.concurrent('isolated tests run in parallel', () => { ... })
import { GET, POST } from '@/app/api/my-route/route'
describe('my route', () => {
beforeEach(() => {
vi.clearAllMocks()
mockGetSession.mockResolvedValue({ user: { id: 'user-1' } })
})
it('returns data', async () => {
const req = createMockRequest('GET')
const res = await GET(req)
expect(res.status).toBe(200)
})
})
```
## Performance Rules (Critical)
### NEVER use `vi.resetModules()` + `vi.doMock()` + `await import()`
This is the #1 cause of slow tests. It forces complete module re-evaluation per test.
```typescript
// BAD — forces module re-evaluation every test (~50-100ms each)
beforeEach(() => {
vi.resetModules()
vi.doMock('@/lib/auth', () => ({ getSession: vi.fn() }))
})
it('test', async () => {
const { GET } = await import('./route') // slow dynamic import
})
// GOOD — module loaded once, mocks reconfigured per test (~1ms each)
const { mockGetSession } = vi.hoisted(() => ({
mockGetSession: vi.fn(),
}))
vi.mock('@/lib/auth', () => ({ getSession: mockGetSession }))
import { GET } from '@/app/api/my-route/route'
beforeEach(() => { vi.clearAllMocks() })
it('test', () => {
mockGetSession.mockResolvedValue({ user: { id: '1' } })
})
```
**Only exception:** Singleton modules that cache state at module scope (e.g., Redis clients, connection pools). These genuinely need `vi.resetModules()` + dynamic import to get a fresh instance per test.
### NEVER use `vi.importActual()`
This defeats the purpose of mocking by loading the real module and all its dependencies.
```typescript
// BAD — loads real module + all transitive deps
vi.mock('@/lib/workspaces/utils', async () => {
const actual = await vi.importActual('@/lib/workspaces/utils')
return { ...actual, myFn: vi.fn() }
})
// GOOD — mock everything, only implement what tests need
vi.mock('@/lib/workspaces/utils', () => ({
myFn: vi.fn(),
otherFn: vi.fn(),
}))
```
### NEVER use `mockAuth()`, `mockConsoleLogger()`, or `setupCommonApiMocks()` from `@sim/testing`
These helpers internally use `vi.doMock()` which is slow. Use direct `vi.hoisted()` + `vi.mock()` instead.
### Mock heavy transitive dependencies
If a module under test imports `@/blocks` (200+ files), `@/tools/registry`, or other heavy modules, mock them:
```typescript
vi.mock('@/blocks', () => ({
getBlock: () => null,
getAllBlocks: () => ({}),
getAllBlockTypes: () => [],
registry: {},
}))
```
### Use `@vitest-environment node` unless DOM is needed
Only use `@vitest-environment jsdom` if the test uses `window`, `document`, `FormData`, or other browser APIs. Node environment is significantly faster.
### Avoid real timers in tests
```typescript
// BAD
await new Promise(r => setTimeout(r, 500))
// GOOD — use minimal delays or fake timers
await new Promise(r => setTimeout(r, 1))
// or
vi.useFakeTimers()
```
## Mock Pattern Reference
### Auth mocking (API routes)
```typescript
const { mockGetSession } = vi.hoisted(() => ({
mockGetSession: vi.fn(),
}))
vi.mock('@/lib/auth', () => ({
auth: { api: { getSession: vi.fn() } },
getSession: mockGetSession,
}))
// In tests:
mockGetSession.mockResolvedValue({ user: { id: 'user-1', email: 'test@example.com' } })
mockGetSession.mockResolvedValue(null) // unauthenticated
```
### Hybrid auth mocking
```typescript
const { mockCheckSessionOrInternalAuth } = vi.hoisted(() => ({
mockCheckSessionOrInternalAuth: vi.fn(),
}))
vi.mock('@/lib/auth/hybrid', () => ({
checkSessionOrInternalAuth: mockCheckSessionOrInternalAuth,
}))
// In tests:
mockCheckSessionOrInternalAuth.mockResolvedValue({
success: true, userId: 'user-1', authType: 'session',
})
```
### Database chain mocking
```typescript
const { mockSelect, mockFrom, mockWhere } = vi.hoisted(() => ({
mockSelect: vi.fn(),
mockFrom: vi.fn(),
mockWhere: vi.fn(),
}))
vi.mock('@sim/db', () => ({
db: { select: mockSelect },
}))
beforeEach(() => {
mockSelect.mockReturnValue({ from: mockFrom })
mockFrom.mockReturnValue({ where: mockWhere })
mockWhere.mockResolvedValue([{ id: '1', name: 'test' }])
})
```
## @sim/testing Package
Always prefer over local mocks.
Always prefer over local test data.
| Category | Utilities |
|----------|-----------|
| **Mocks** | `loggerMock`, `databaseMock`, `setupGlobalFetchMock()` |
| **Factories** | `createSession()`, `createWorkflowRecord()`, `createBlock()`, `createExecutorContext()` |
| **Mocks** | `loggerMock`, `databaseMock`, `drizzleOrmMock`, `setupGlobalFetchMock()` |
| **Factories** | `createSession()`, `createWorkflowRecord()`, `createBlock()`, `createExecutionContext()` |
| **Builders** | `WorkflowBuilder`, `ExecutionContextBuilder` |
| **Assertions** | `expectWorkflowAccessGranted()`, `expectBlockExecuted()` |
| **Requests** | `createMockRequest()`, `createEnvMock()` |
## Rules
## Rules Summary
1. `@vitest-environment node` directive at file top
2. `vi.mock()` calls before importing mocked modules
3. `@sim/testing` utilities over local mocks
4. `it.concurrent` for isolated tests (no shared mutable state)
5. `beforeEach(() => vi.clearAllMocks())` to reset state
## Hoisted Mocks
For mutable mock references:
```typescript
const mockFn = vi.hoisted(() => vi.fn())
vi.mock('@/lib/module', () => ({ myFunction: mockFn }))
mockFn.mockResolvedValue({ data: 'test' })
```
1. `@vitest-environment node` unless DOM is required
2. `vi.hoisted()` + `vi.mock()` + static imports — never `vi.resetModules()` + `vi.doMock()` + dynamic imports
3. `vi.mock()` calls before importing mocked modules
4. `@sim/testing` utilities over local mocks
5. `beforeEach(() => vi.clearAllMocks())` to reset state — no redundant `afterEach`
6. No `vi.importActual()` — mock everything explicitly
7. No `mockAuth()`, `mockConsoleLogger()`, `setupCommonApiMocks()` — use direct mocks
8. Mock heavy deps (`@/blocks`, `@/tools/registry`, `@/triggers`) in tests that don't need them
9. Use absolute imports in test files
10. Avoid real timers — use 1ms delays or `vi.useFakeTimers()`

View File

@@ -8,7 +8,7 @@ on:
concurrency:
group: ci-${{ github.ref }}
cancel-in-progress: false
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
permissions:
contents: read

View File

@@ -1,10 +1,7 @@
name: 'Auto-translate Documentation'
on:
schedule:
# Run every Sunday at midnight UTC
- cron: '0 0 * * 0'
workflow_dispatch: # Allow manual triggers
workflow_dispatch: # Manual trigger only (scheduled runs disabled)
permissions:
contents: write

View File

@@ -146,7 +146,7 @@ jobs:
create-ghcr-manifests:
name: Create GHCR Manifests
runs-on: blacksmith-8vcpu-ubuntu-2404
runs-on: blacksmith-2vcpu-ubuntu-2404
needs: [build-amd64, build-ghcr-arm64]
if: github.ref == 'refs/heads/main'
strategy:

View File

@@ -10,7 +10,7 @@ permissions:
jobs:
test-build:
name: Test and Build
runs-on: blacksmith-4vcpu-ubuntu-2404
runs-on: blacksmith-8vcpu-ubuntu-2404
steps:
- name: Checkout code
@@ -38,6 +38,20 @@ jobs:
key: ${{ github.repository }}-node-modules
path: ./node_modules
- name: Mount Turbo cache (Sticky Disk)
uses: useblacksmith/stickydisk@v1
with:
key: ${{ github.repository }}-turbo-cache
path: ./.turbo
- name: Restore Next.js build cache
uses: actions/cache@v4
with:
path: ./apps/sim/.next/cache
key: ${{ runner.os }}-nextjs-${{ hashFiles('bun.lock') }}
restore-keys: |
${{ runner.os }}-nextjs-
- name: Install dependencies
run: bun install --frozen-lockfile
@@ -85,6 +99,7 @@ jobs:
NEXT_PUBLIC_APP_URL: 'https://www.sim.ai'
DATABASE_URL: 'postgresql://postgres:postgres@localhost:5432/simstudio'
ENCRYPTION_KEY: '7cf672e460e430c1fba707575c2b0e2ad5a99dddf9b7b7e3b5646e630861db1c' # dummy key for CI only
TURBO_CACHE_DIR: .turbo
run: bun run test
- name: Check schema and migrations are in sync
@@ -110,7 +125,8 @@ jobs:
RESEND_API_KEY: 'dummy_key_for_ci_only'
AWS_REGION: 'us-west-2'
ENCRYPTION_KEY: '7cf672e460e430c1fba707575c2b0e2ad5a99dddf9b7b7e3b5646e630861db1c' # dummy key for CI only
run: bun run build
TURBO_CACHE_DIR: .turbo
run: bunx turbo run build --filter=sim
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v5

7
.gitignore vendored
View File

@@ -26,6 +26,9 @@ bun-debug.log*
**/standalone/
sim-standalone.tar.gz
# redis
dump.rdb
# misc
.DS_Store
*.pem
@@ -73,3 +76,7 @@ start-collector.sh
## Helm Chart Tests
helm/sim/test
i18n.cache
## Claude Code
.claude/launch.json
.claude/worktrees/

View File

@@ -167,27 +167,51 @@ Import from `@/components/emcn`, never from subpaths (except CSS files). Use CVA
## Testing
Use Vitest. Test files: `feature.ts``feature.test.ts`
Use Vitest. Test files: `feature.ts``feature.test.ts`. See `.cursor/rules/sim-testing.mdc` for full details.
### Global Mocks (vitest.setup.ts)
`@sim/db`, `drizzle-orm`, `@sim/logger`, `@/blocks/registry`, `@trigger.dev/sdk`, and store mocks are provided globally. Do NOT re-mock them unless overriding behavior.
### Standard Test Pattern
```typescript
/**
* @vitest-environment node
*/
import { databaseMock, loggerMock } from '@sim/testing'
import { describe, expect, it, vi } from 'vitest'
import { createMockRequest } from '@sim/testing'
import { beforeEach, describe, expect, it, vi } from 'vitest'
vi.mock('@sim/db', () => databaseMock)
vi.mock('@sim/logger', () => loggerMock)
const { mockGetSession } = vi.hoisted(() => ({
mockGetSession: vi.fn(),
}))
import { myFunction } from '@/lib/feature'
vi.mock('@/lib/auth', () => ({
auth: { api: { getSession: vi.fn() } },
getSession: mockGetSession,
}))
describe('feature', () => {
beforeEach(() => vi.clearAllMocks())
it.concurrent('runs in parallel', () => { ... })
import { GET } from '@/app/api/my-route/route'
describe('my route', () => {
beforeEach(() => {
vi.clearAllMocks()
mockGetSession.mockResolvedValue({ user: { id: 'user-1' } })
})
it('returns data', async () => { ... })
})
```
Use `@sim/testing` mocks/factories over local test data. See `.cursor/rules/sim-testing.mdc` for details.
### Performance Rules
- **NEVER** use `vi.resetModules()` + `vi.doMock()` + `await import()` — use `vi.hoisted()` + `vi.mock()` + static imports
- **NEVER** use `vi.importActual()` — mock everything explicitly
- **NEVER** use `mockAuth()`, `mockConsoleLogger()`, `setupCommonApiMocks()` from `@sim/testing` — they use `vi.doMock()` internally
- **Mock heavy deps** (`@/blocks`, `@/tools/registry`, `@/triggers`) in tests that don't need them
- **Use `@vitest-environment node`** unless DOM APIs are needed (`window`, `document`, `FormData`)
- **Avoid real timers** — use 1ms delays or `vi.useFakeTimers()`
Use `@sim/testing` mocks/factories over local test data.
## Utils Rules
@@ -238,7 +262,7 @@ export const ServiceBlock: BlockConfig = {
bgColor: '#hexcolor',
icon: ServiceIcon,
subBlocks: [ /* see SubBlock Properties */ ],
tools: { access: ['service_action'], config: { tool: (p) => `service_${p.operation}` } },
tools: { access: ['service_action'], config: { tool: (p) => `service_${p.operation}`, params: (p) => ({ /* type coercions here */ }) } },
inputs: { /* ... */ },
outputs: { /* ... */ },
}
@@ -246,6 +270,8 @@ export const ServiceBlock: BlockConfig = {
Register in `blocks/registry.ts` (alphabetically).
**Important:** `tools.config.tool` runs during serialization (before variable resolution). Never do `Number()` or other type coercions there — dynamic references like `<Block.output>` will be destroyed. Use `tools.config.params` for type coercions (it runs during execution, after variables are resolved).
**SubBlock Properties:**
```typescript
{

View File

@@ -4,7 +4,7 @@
</a>
</p>
<p align="center">Build and deploy AI agent workflows in minutes.</p>
<p align="center">The open-source platform to build AI agents and run your agentic workforce. Connect 1,000+ integrations and LLMs to orchestrate agentic workflows.</p>
<p align="center">
<a href="https://sim.ai" target="_blank" rel="noopener noreferrer"><img src="https://img.shields.io/badge/sim.ai-6F3DFA" alt="Sim.ai"></a>

View File

@@ -1,5 +1,8 @@
import type React from 'react'
import type { Root } from 'fumadocs-core/page-tree'
import { findNeighbour } from 'fumadocs-core/page-tree'
import type { ApiPageProps } from 'fumadocs-openapi/ui'
import { createAPIPage } from 'fumadocs-openapi/ui'
import { Pre } from 'fumadocs-ui/components/codeblock'
import defaultMdxComponents from 'fumadocs-ui/mdx'
import { DocsBody, DocsDescription, DocsPage, DocsTitle } from 'fumadocs-ui/page'
@@ -12,28 +15,75 @@ import { LLMCopyButton } from '@/components/page-actions'
import { StructuredData } from '@/components/structured-data'
import { CodeBlock } from '@/components/ui/code-block'
import { Heading } from '@/components/ui/heading'
import { ResponseSection } from '@/components/ui/response-section'
import { i18n } from '@/lib/i18n'
import { getApiSpecContent, openapi } from '@/lib/openapi'
import { type PageData, source } from '@/lib/source'
const SUPPORTED_LANGUAGES: Set<string> = new Set(i18n.languages)
const BASE_URL = 'https://docs.sim.ai'
function resolveLangAndSlug(params: { slug?: string[]; lang: string }) {
const isValidLang = SUPPORTED_LANGUAGES.has(params.lang)
const lang = isValidLang ? params.lang : 'en'
const slug = isValidLang ? params.slug : [params.lang, ...(params.slug ?? [])]
return { lang, slug }
}
const APIPage = createAPIPage(openapi, {
playground: { enabled: false },
content: {
renderOperationLayout: async (slots) => {
return (
<div className='flex @4xl:flex-row flex-col @4xl:items-start gap-x-6 gap-y-4'>
<div className='min-w-0 flex-1'>
{slots.header}
{slots.apiPlayground}
{slots.authSchemes && <div className='api-section-divider'>{slots.authSchemes}</div>}
{slots.paremeters}
{slots.body && <div className='api-section-divider'>{slots.body}</div>}
<ResponseSection>{slots.responses}</ResponseSection>
{slots.callbacks}
</div>
<div className='@4xl:sticky @4xl:top-[calc(var(--fd-docs-row-1,2rem)+1rem)] @4xl:w-[400px]'>
{slots.apiExample}
</div>
</div>
)
},
},
})
export default async function Page(props: { params: Promise<{ slug?: string[]; lang: string }> }) {
const params = await props.params
const page = source.getPage(params.slug, params.lang)
const { lang, slug } = resolveLangAndSlug(params)
const page = source.getPage(slug, lang)
if (!page) notFound()
const data = page.data as PageData
const MDX = data.body
const baseUrl = 'https://docs.sim.ai'
const markdownContent = await data.getText('processed')
const data = page.data as unknown as PageData & {
_openapi?: { method?: string }
getAPIPageProps?: () => ApiPageProps
}
const isOpenAPI = '_openapi' in data && data._openapi != null
const isApiReference = slug?.some((s) => s === 'api-reference') ?? false
const pageTreeRecord = source.pageTree as Record<string, any>
const pageTree =
pageTreeRecord[params.lang] ?? pageTreeRecord.en ?? Object.values(pageTreeRecord)[0]
const neighbours = pageTree ? findNeighbour(pageTree, page.url) : null
const pageTreeRecord = source.pageTree as Record<string, Root>
const pageTree = pageTreeRecord[lang] ?? pageTreeRecord.en ?? Object.values(pageTreeRecord)[0]
const rawNeighbours = pageTree ? findNeighbour(pageTree, page.url) : null
const neighbours = isApiReference
? {
previous: rawNeighbours?.previous?.url.includes('/api-reference/')
? rawNeighbours.previous
: undefined,
next: rawNeighbours?.next?.url.includes('/api-reference/') ? rawNeighbours.next : undefined,
}
: rawNeighbours
const generateBreadcrumbs = () => {
const breadcrumbs: Array<{ name: string; url: string }> = [
{
name: 'Home',
url: baseUrl,
url: BASE_URL,
},
]
@@ -41,7 +91,7 @@ export default async function Page(props: { params: Promise<{ slug?: string[]; l
let currentPath = ''
urlParts.forEach((part, index) => {
if (index === 0 && ['en', 'es', 'fr', 'de', 'ja', 'zh'].includes(part)) {
if (index === 0 && SUPPORTED_LANGUAGES.has(part)) {
currentPath = `/${part}`
return
}
@@ -56,12 +106,12 @@ export default async function Page(props: { params: Promise<{ slug?: string[]; l
if (index === urlParts.length - 1) {
breadcrumbs.push({
name: data.title,
url: `${baseUrl}${page.url}`,
url: `${BASE_URL}${page.url}`,
})
} else {
breadcrumbs.push({
name: name,
url: `${baseUrl}${currentPath}`,
url: `${BASE_URL}${currentPath}`,
})
}
})
@@ -73,7 +123,6 @@ export default async function Page(props: { params: Promise<{ slug?: string[]; l
const CustomFooter = () => (
<div className='mt-12'>
{/* Navigation links */}
<div className='flex items-center justify-between py-8'>
{neighbours?.previous ? (
<Link
@@ -100,10 +149,8 @@ export default async function Page(props: { params: Promise<{ slug?: string[]; l
)}
</div>
{/* Divider line */}
<div className='border-border border-t' />
{/* Social icons */}
<div className='flex items-center gap-4 py-6'>
<Link
href='https://x.com/simdotai'
@@ -169,13 +216,69 @@ export default async function Page(props: { params: Promise<{ slug?: string[]; l
</div>
)
if (isOpenAPI && data.getAPIPageProps) {
const apiProps = data.getAPIPageProps()
const apiPageContent = getApiSpecContent(
data.title,
data.description,
apiProps.operations ?? []
)
return (
<>
<StructuredData
title={data.title}
description={data.description || ''}
url={`${BASE_URL}${page.url}`}
lang={lang}
breadcrumb={breadcrumbs}
/>
<DocsPage
toc={data.toc}
breadcrumb={{
enabled: false,
}}
tableOfContent={{
style: 'clerk',
enabled: false,
}}
tableOfContentPopover={{
style: 'clerk',
enabled: false,
}}
footer={{
enabled: true,
component: <CustomFooter />,
}}
>
<div className='api-page-header relative mt-6 sm:mt-0'>
<div className='absolute top-1 right-0 flex items-center gap-2'>
<div className='hidden sm:flex'>
<LLMCopyButton content={apiPageContent} />
</div>
<PageNavigationArrows previous={neighbours?.previous} next={neighbours?.next} />
</div>
<DocsTitle>{data.title}</DocsTitle>
<DocsDescription>{data.description}</DocsDescription>
</div>
<DocsBody>
<APIPage {...apiProps} />
</DocsBody>
</DocsPage>
</>
)
}
const MDX = data.body
const markdownContent = await data.getText('processed')
return (
<>
<StructuredData
title={data.title}
description={data.description || ''}
url={`${baseUrl}${page.url}`}
lang={params.lang}
url={`${BASE_URL}${page.url}`}
lang={lang}
breadcrumb={breadcrumbs}
/>
<DocsPage
@@ -252,27 +355,29 @@ export async function generateMetadata(props: {
params: Promise<{ slug?: string[]; lang: string }>
}) {
const params = await props.params
const page = source.getPage(params.slug, params.lang)
const { lang, slug } = resolveLangAndSlug(params)
const page = source.getPage(slug, lang)
if (!page) notFound()
const data = page.data as PageData
const baseUrl = 'https://docs.sim.ai'
const fullUrl = `${baseUrl}${page.url}`
const data = page.data as unknown as PageData
const fullUrl = `${BASE_URL}${page.url}`
const ogImageUrl = `${baseUrl}/api/og?title=${encodeURIComponent(data.title)}`
const ogImageUrl = `${BASE_URL}/api/og?title=${encodeURIComponent(data.title)}`
return {
title: data.title,
description:
data.description || 'Sim visual workflow builder for AI applications documentation',
data.description ||
'Documentation for Sim — the open-source platform to build AI agents and run your agentic workforce.',
keywords: [
'AI workflow builder',
'visual workflow editor',
'AI automation',
'workflow automation',
'AI agents',
'no-code AI',
'drag and drop workflows',
'agentic workforce',
'AI agent platform',
'agentic workflows',
'LLM orchestration',
'AI automation',
'knowledge base',
'AI integrations',
data.title?.toLowerCase().split(' '),
]
.flat()
@@ -282,14 +387,15 @@ export async function generateMetadata(props: {
openGraph: {
title: data.title,
description:
data.description || 'Sim visual workflow builder for AI applications documentation',
data.description ||
'Documentation for Sim — the open-source platform to build AI agents and run your agentic workforce.',
url: fullUrl,
siteName: 'Sim Documentation',
type: 'article',
locale: params.lang === 'en' ? 'en_US' : `${params.lang}_${params.lang.toUpperCase()}`,
locale: lang === 'en' ? 'en_US' : `${lang}_${lang.toUpperCase()}`,
alternateLocale: ['en', 'es', 'fr', 'de', 'ja', 'zh']
.filter((lang) => lang !== params.lang)
.map((lang) => (lang === 'en' ? 'en_US' : `${lang}_${lang.toUpperCase()}`)),
.filter((l) => l !== lang)
.map((l) => (l === 'en' ? 'en_US' : `${l}_${l.toUpperCase()}`)),
images: [
{
url: ogImageUrl,
@@ -303,7 +409,8 @@ export async function generateMetadata(props: {
card: 'summary_large_image',
title: data.title,
description:
data.description || 'Sim visual workflow builder for AI applications documentation',
data.description ||
'Documentation for Sim — the open-source platform to build AI agents and run your agentic workforce.',
images: [ogImageUrl],
creator: '@simdotai',
site: '@simdotai',
@@ -323,13 +430,13 @@ export async function generateMetadata(props: {
alternates: {
canonical: fullUrl,
languages: {
'x-default': `${baseUrl}${page.url.replace(`/${params.lang}`, '')}`,
en: `${baseUrl}${page.url.replace(`/${params.lang}`, '')}`,
es: `${baseUrl}/es${page.url.replace(`/${params.lang}`, '')}`,
fr: `${baseUrl}/fr${page.url.replace(`/${params.lang}`, '')}`,
de: `${baseUrl}/de${page.url.replace(`/${params.lang}`, '')}`,
ja: `${baseUrl}/ja${page.url.replace(`/${params.lang}`, '')}`,
zh: `${baseUrl}/zh${page.url.replace(`/${params.lang}`, '')}`,
'x-default': `${BASE_URL}${page.url.replace(`/${lang}`, '')}`,
en: `${BASE_URL}${page.url.replace(`/${lang}`, '')}`,
es: `${BASE_URL}/es${page.url.replace(`/${lang}`, '')}`,
fr: `${BASE_URL}/fr${page.url.replace(`/${lang}`, '')}`,
de: `${BASE_URL}/de${page.url.replace(`/${lang}`, '')}`,
ja: `${BASE_URL}/ja${page.url.replace(`/${lang}`, '')}`,
zh: `${BASE_URL}/zh${page.url.replace(`/${lang}`, '')}`,
},
},
}

View File

@@ -55,15 +55,18 @@ type LayoutProps = {
params: Promise<{ lang: string }>
}
const SUPPORTED_LANGUAGES: Set<string> = new Set(i18n.languages)
export default async function Layout({ children, params }: LayoutProps) {
const { lang } = await params
const { lang: rawLang } = await params
const lang = SUPPORTED_LANGUAGES.has(rawLang) ? rawLang : 'en'
const structuredData = {
'@context': 'https://schema.org',
'@type': 'WebSite',
name: 'Sim Documentation',
description:
'Comprehensive documentation for Sim - the visual workflow builder for AI Agent Workflows.',
'Documentation for Sim the open-source platform to build AI agents and run your agentic workforce. Connect 1,000+ integrations and LLMs to deploy and orchestrate agentic workflows.',
url: 'https://docs.sim.ai',
publisher: {
'@type': 'Organization',
@@ -107,6 +110,7 @@ export default async function Layout({ children, params }: LayoutProps) {
title: <SimLogoFull className='h-7 w-auto' />,
}}
sidebar={{
tabs: false,
defaultOpenLevel: 0,
collapsible: false,
footer: null,

View File

@@ -1,6 +1,7 @@
@import "tailwindcss";
@import "fumadocs-ui/css/neutral.css";
@import "fumadocs-ui/css/preset.css";
@import "fumadocs-openapi/css/preset.css";
/* Prevent overscroll bounce effect on the page */
html,
@@ -8,18 +9,12 @@ body {
overscroll-behavior: none;
}
/* Reserve scrollbar space to prevent layout jitter between pages */
html {
scrollbar-gutter: stable;
}
@theme {
--color-fd-primary: #33c482; /* Green from Sim logo */
--font-geist-sans: var(--font-geist-sans);
--font-geist-mono: var(--font-geist-mono);
}
/* Ensure primary color is set in both light and dark modes */
:root {
--color-fd-primary: #33c482;
}
.dark {
--color-fd-primary: #33c482;
}
@@ -34,12 +29,6 @@ body {
"Liberation Mono", "Courier New", monospace;
}
/* Target any potential border classes */
* {
--fd-border-sidebar: transparent !important;
}
/* Override any CSS custom properties for borders */
:root {
--fd-border: transparent !important;
--fd-border-sidebar: transparent !important;
@@ -59,12 +48,6 @@ body {
--content-gap: 1.75rem;
}
/* Remove custom layout variable overrides to fallback to fumadocs defaults */
/* ============================================
Navbar Light Mode Styling
============================================ */
/* Light mode navbar and search styling */
:root:not(.dark) nav {
background-color: hsla(0, 0%, 96%, 0.85) !important;
@@ -88,15 +71,10 @@ body {
-webkit-backdrop-filter: blur(25px) saturate(180%) brightness(0.6) !important;
}
/* ============================================
Custom Sidebar Styling (Turborepo-inspired)
============================================ */
/* Floating sidebar appearance - remove background */
[data-sidebar-container],
#nd-sidebar {
background: transparent !important;
background-color: transparent !important;
border: none !important;
--color-fd-muted: transparent !important;
--color-fd-card: transparent !important;
@@ -106,9 +84,7 @@ body {
aside[data-sidebar],
aside#nd-sidebar {
background: transparent !important;
background-color: transparent !important;
border: none !important;
border-right: none !important;
}
/* Fumadocs v16: Add sidebar placeholder styling for grid area */
@@ -167,7 +143,6 @@ aside#nd-sidebar {
#nd-sidebar > div {
padding: 0.5rem 12px 12px;
background: transparent !important;
background-color: transparent !important;
}
/* Override sidebar item styling to match Raindrop */
@@ -444,10 +419,6 @@ aside[data-sidebar],
#nd-sidebar,
#nd-sidebar * {
border: none !important;
border-right: none !important;
border-left: none !important;
border-top: none !important;
border-bottom: none !important;
}
/* Override fumadocs background colors for sidebar */
@@ -457,7 +428,6 @@ aside[data-sidebar],
--color-fd-muted: transparent !important;
--color-fd-secondary: transparent !important;
background: transparent !important;
background-color: transparent !important;
}
/* Force normal text flow in sidebar */
@@ -468,10 +438,6 @@ aside[data-sidebar],
writing-mode: horizontal-tb !important;
}
/* ============================================
Code Block Styling (Improved)
============================================ */
/* Apply Geist Mono to code elements */
code,
pre,
@@ -532,10 +498,6 @@ pre code .line {
color: var(--color-fd-primary);
}
/* ============================================
TOC (Table of Contents) Styling
============================================ */
/* Remove the thin border-left on nested TOC items (keeps main indicator only) */
#nd-toc a[style*="padding-inline-start"] {
border-left: none !important;
@@ -554,10 +516,6 @@ main article,
padding-bottom: 4rem;
}
/* ============================================
Center and Constrain Main Content Width
============================================ */
/* 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] {
@@ -586,16 +544,682 @@ main[data-main] {
padding-top: 1.5rem !important;
}
/* Override Fumadocs default content padding */
article[data-content],
div[data-content] {
padding-top: 1.5rem !important;
}
/* Remove any unwanted borders/outlines from video elements */
/* Remove any unwanted outlines from video elements */
video {
outline: none !important;
border-style: solid !important;
}
/* API Reference Pages — Mintlify-style overrides */
/* OpenAPI pages: span main + TOC grid columns for wide two-column layout.
The grid has columns: spacer | sidebar | main | toc | spacer.
By spanning columns 3-4, the article fills both main and toc areas,
while the grid structure stays identical to non-OpenAPI pages (no jitter). */
#nd-page:has(.api-page-header) {
grid-column: 3 / span 2 !important;
max-width: 1400px !important;
}
/* Hide the empty TOC aside on OpenAPI pages so it doesn't overlay content */
#nd-docs-layout:has(#nd-page .api-page-header) #nd-toc {
display: none;
}
/* Hide the default "Response Body" heading rendered by fumadocs-openapi */
.response-section-wrapper > .response-section-content > h2,
.response-section-wrapper > .response-section-content > h3 {
display: none !important;
}
/* Hide default accordion triggers (status code rows) — we show our own dropdown */
.response-section-wrapper [data-orientation="vertical"] > [data-state] > h3 {
display: none !important;
}
/* Ensure API reference pages use the same font as the rest of the docs */
#nd-page:has(.api-page-header),
#nd-page:has(.api-page-header) h2,
#nd-page:has(.api-page-header) h3,
#nd-page:has(.api-page-header) h4,
#nd-page:has(.api-page-header) p,
#nd-page:has(.api-page-header) span,
#nd-page:has(.api-page-header) div,
#nd-page:has(.api-page-header) label,
#nd-page:has(.api-page-header) button {
font-family: var(--font-geist-sans), ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont,
"Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
}
/* Method badge pills in page content — colored background pills */
#nd-page span.font-mono.font-medium[class*="text-green"] {
background-color: rgb(220 252 231 / 0.6);
padding: 0.125rem 0.5rem;
border-radius: 0.375rem;
font-size: 0.75rem;
}
html.dark #nd-page span.font-mono.font-medium[class*="text-green"] {
background-color: rgb(34 197 94 / 0.15);
}
#nd-page span.font-mono.font-medium[class*="text-blue"] {
background-color: rgb(219 234 254 / 0.6);
padding: 0.125rem 0.5rem;
border-radius: 0.375rem;
font-size: 0.75rem;
}
html.dark #nd-page span.font-mono.font-medium[class*="text-blue"] {
background-color: rgb(59 130 246 / 0.15);
}
#nd-page span.font-mono.font-medium[class*="text-orange"] {
background-color: rgb(255 237 213 / 0.6);
padding: 0.125rem 0.5rem;
border-radius: 0.375rem;
font-size: 0.75rem;
}
html.dark #nd-page span.font-mono.font-medium[class*="text-orange"] {
background-color: rgb(249 115 22 / 0.15);
}
#nd-page span.font-mono.font-medium[class*="text-red"] {
background-color: rgb(254 226 226 / 0.6);
padding: 0.125rem 0.5rem;
border-radius: 0.375rem;
font-size: 0.75rem;
}
html.dark #nd-page span.font-mono.font-medium[class*="text-red"] {
background-color: rgb(239 68 68 / 0.15);
}
/* Sidebar links with method badges — flex for vertical centering */
#nd-sidebar a:has(span.font-mono.font-medium) {
display: flex !important;
align-items: center !important;
gap: 6px;
}
/* Sidebar method badges — ensure proper inline flex display */
#nd-sidebar a span.font-mono.font-medium {
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 2.25rem;
font-size: 10px !important;
line-height: 1 !important;
padding: 2.5px 4px;
border-radius: 3px;
flex-shrink: 0;
}
/* Sidebar GET badges */
#nd-sidebar a span.font-mono.font-medium[class*="text-green"] {
background-color: rgb(220 252 231 / 0.6);
}
html.dark #nd-sidebar a span.font-mono.font-medium[class*="text-green"] {
background-color: rgb(34 197 94 / 0.15);
}
/* Sidebar POST badges */
#nd-sidebar a span.font-mono.font-medium[class*="text-blue"] {
background-color: rgb(219 234 254 / 0.6);
}
html.dark #nd-sidebar a span.font-mono.font-medium[class*="text-blue"] {
background-color: rgb(59 130 246 / 0.15);
}
/* Sidebar PUT badges */
#nd-sidebar a span.font-mono.font-medium[class*="text-orange"] {
background-color: rgb(255 237 213 / 0.6);
}
html.dark #nd-sidebar a span.font-mono.font-medium[class*="text-orange"] {
background-color: rgb(249 115 22 / 0.15);
}
/* Sidebar DELETE badges */
#nd-sidebar a span.font-mono.font-medium[class*="text-red"] {
background-color: rgb(254 226 226 / 0.6);
}
html.dark #nd-sidebar a span.font-mono.font-medium[class*="text-red"] {
background-color: rgb(239 68 68 / 0.15);
}
/* Code block containers — match regular docs styling */
#nd-page:has(.api-page-header) figure.shiki {
border-radius: 0.75rem !important;
background-color: var(--color-fd-card) !important;
}
/* Hide "Filter Properties" search bar everywhere — main page and popovers */
input[placeholder="Filter Properties"] {
display: none !important;
}
div:has(> input[placeholder="Filter Properties"]) {
display: none !important;
}
/* Remove top border on first visible property after hidden Filter Properties */
div:has(> input[placeholder="Filter Properties"]) + .text-sm.border-t {
border-top: none !important;
}
/* Hide "TypeScript Definitions" copy panel on API pages */
#nd-page:has(.api-page-header) div.not-prose.rounded-xl.border.p-3.mb-4 {
display: none !important;
}
#nd-page:has(.api-page-header) div.not-prose.rounded-xl.border.p-3:has(> div > p.font-medium) {
display: none !important;
}
/* Hide info tags (Format, Default, etc.) everywhere — main page and popovers */
div.flex.flex-row.gap-2.flex-wrap.not-prose:has(> div.bg-fd-secondary) {
display: none !important;
}
div.flex.flex-row.items-start.bg-fd-secondary.border.rounded-lg.text-xs {
display: none !important;
}
/* Method+path bar — cleaner, lighter styling like Gumloop.
Override bg-fd-card CSS variable directly for reliability. */
#nd-page:has(.api-page-header) div.flex.flex-row.items-center.rounded-xl.border.not-prose {
--color-fd-card: rgb(249 250 251) !important;
background-color: rgb(249 250 251) !important;
border-color: rgb(229 231 235) !important;
}
html.dark
#nd-page:has(.api-page-header)
div.flex.flex-row.items-center.rounded-xl.border.not-prose {
--color-fd-card: rgb(24 24 27) !important;
background-color: rgb(24 24 27) !important;
border-color: rgb(63 63 70) !important;
}
/* Method badge inside path bar — cleaner sans-serif, softer colors */
#nd-page:has(.api-page-header)
div.flex.flex-row.items-center.rounded-xl.border.not-prose
span.font-mono.font-medium {
font-family: var(--font-geist-sans), ui-sans-serif, system-ui, sans-serif !important;
font-weight: 600 !important;
font-size: 0.6875rem !important;
letter-spacing: 0.025em;
text-transform: uppercase;
}
/* POST — softer blue */
#nd-page:has(.api-page-header)
div.flex.flex-row.items-center.rounded-xl.border.not-prose
span.font-mono.font-medium[class*="text-blue"] {
color: rgb(37 99 235) !important;
background-color: rgb(219 234 254 / 0.7) !important;
}
html.dark
#nd-page:has(.api-page-header)
div.flex.flex-row.items-center.rounded-xl.border.not-prose
span.font-mono.font-medium[class*="text-blue"] {
color: rgb(96 165 250) !important;
background-color: rgb(59 130 246 / 0.15) !important;
}
/* GET — softer green */
#nd-page:has(.api-page-header)
div.flex.flex-row.items-center.rounded-xl.border.not-prose
span.font-mono.font-medium[class*="text-green"] {
color: rgb(22 163 74) !important;
background-color: rgb(220 252 231 / 0.7) !important;
}
html.dark
#nd-page:has(.api-page-header)
div.flex.flex-row.items-center.rounded-xl.border.not-prose
span.font-mono.font-medium[class*="text-green"] {
color: rgb(74 222 128) !important;
background-color: rgb(34 197 94 / 0.15) !important;
}
/* Path text inside method+path bar — monospace, bright like Gumloop */
#nd-page:has(.api-page-header) div.flex.flex-row.items-center.rounded-xl.border.not-prose code {
color: rgb(55 65 81) !important;
background: none !important;
border: none !important;
padding: 0 !important;
font-size: 0.8125rem !important;
}
html.dark
#nd-page:has(.api-page-header)
div.flex.flex-row.items-center.rounded-xl.border.not-prose
code {
color: rgb(229 231 235) !important;
}
/* Inline code in API pages — neutral color instead of red.
Exclude code inside the method+path bar (handled above). */
#nd-page:has(.api-page-header) .prose :not(pre) > code {
color: rgb(79 70 229) !important;
}
html.dark #nd-page:has(.api-page-header) .prose :not(pre) > code {
color: rgb(165 180 252) !important;
}
/* Response Section — custom dropdown-based rendering (Mintlify style) */
/* Hide divider lines between accordion items */
.response-section-wrapper [data-orientation="vertical"].divide-y > * {
border-top-width: 0 !important;
border-bottom-width: 0 !important;
}
.response-section-wrapper [data-orientation="vertical"].divide-y {
border-top: none !important;
}
/* Remove content type labels inside accordion items (we show one in the header) */
.response-section-wrapper [data-orientation="vertical"] p.not-prose:has(code.text-xs) {
display: none !important;
}
/* Hide the top-level response description (e.g. "Execution was successfully cancelled.")
but NOT field descriptions inside Schema which also use prose-no-margin.
The response description is a direct child of AccordionContent (role=region) with mb-2. */
.response-section-wrapper [data-orientation="vertical"] [role="region"] > .prose-no-margin.mb-2,
.response-section-wrapper
[data-orientation="vertical"]
[role="region"]
> div
> .prose-no-margin.mb-2 {
display: none !important;
}
/* Remove left padding on accordion content so it aligns with Path Parameters */
.response-section-wrapper [data-orientation="vertical"] [role="region"] {
padding-inline-start: 0 !important;
}
/* Response section header */
.response-section-header {
display: flex;
align-items: center;
gap: 1rem;
margin-top: 1.75rem;
margin-bottom: 0.5rem;
}
.response-section-title {
font-size: 1.5rem;
font-weight: 600;
margin: 0;
color: var(--color-fd-foreground);
font-family: var(--font-geist-sans), ui-sans-serif, system-ui, -apple-system, sans-serif;
}
.response-section-meta {
display: flex;
align-items: center;
gap: 0.75rem;
margin-left: auto;
}
/* Status code dropdown */
.response-section-dropdown-wrapper {
position: relative;
}
.response-section-dropdown-trigger {
display: flex;
align-items: center;
gap: 0.25rem;
padding: 0.125rem 0.25rem;
font-size: 0.875rem;
font-weight: 500;
color: var(--color-fd-muted-foreground);
background: none;
border: none;
cursor: pointer;
border-radius: 0.25rem;
transition: color 0.15s;
font-family: var(--font-geist-sans), ui-sans-serif, system-ui, sans-serif;
}
.response-section-dropdown-trigger:hover {
color: var(--color-fd-foreground);
}
.response-section-chevron {
width: 0.75rem;
height: 0.75rem;
transition: transform 0.15s;
}
.response-section-chevron-open {
transform: rotate(180deg);
}
.response-section-dropdown-menu {
position: absolute;
top: calc(100% + 0.25rem);
left: 0;
z-index: 50;
min-width: 5rem;
background-color: white;
border: 1px solid rgb(229 231 235);
border-radius: 0.5rem;
box-shadow:
0 4px 6px -1px rgb(0 0 0 / 0.1),
0 2px 4px -2px rgb(0 0 0 / 0.1);
padding: 0.25rem;
overflow: hidden;
}
html.dark .response-section-dropdown-menu {
background-color: rgb(24 24 27);
border-color: rgb(63 63 70);
box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.3);
}
.response-section-dropdown-item {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
padding: 0.375rem 0.5rem;
font-size: 0.875rem;
color: var(--color-fd-muted-foreground);
background: none;
border: none;
cursor: pointer;
border-radius: 0.25rem;
transition:
background-color 0.1s,
color 0.1s;
font-family: var(--font-geist-sans), ui-sans-serif, system-ui, sans-serif;
}
.response-section-dropdown-item:hover {
background-color: rgb(243 244 246);
color: var(--color-fd-foreground);
}
html.dark .response-section-dropdown-item:hover {
background-color: rgb(39 39 42);
}
.response-section-dropdown-item-selected {
color: var(--color-fd-foreground);
}
.response-section-check {
width: 0.875rem;
height: 0.875rem;
}
.response-section-content-type {
font-size: 0.875rem;
color: var(--color-fd-muted-foreground);
font-family: var(--font-geist-sans), ui-sans-serif, system-ui, sans-serif;
}
/* Response schema container — remove border to match Path Parameters style */
.response-section-wrapper [data-orientation="vertical"] .border.px-3.py-2.rounded-lg {
border: none !important;
padding: 0 !important;
border-radius: 0 !important;
background-color: transparent;
}
/* Property row — reorder: name (1) → type badge (2) → required badge (3) */
#nd-page:has(.api-page-header) .flex.flex-wrap.items-center.gap-3.not-prose {
display: flex;
flex-wrap: wrap;
align-items: center;
}
/* Name span — order 1 */
#nd-page:has(.api-page-header)
.flex.flex-wrap.items-center.gap-3.not-prose
> span.font-medium.font-mono.text-fd-primary {
order: 1;
}
/* Type badge — order 2, grey pill like Mintlify */
#nd-page:has(.api-page-header)
.flex.flex-wrap.items-center.gap-3.not-prose
> span.text-sm.font-mono.text-fd-muted-foreground {
order: 2;
background-color: rgb(240 240 243);
color: rgb(100 100 110);
padding: 0.125rem 0.5rem;
border-radius: 0.375rem;
font-size: 0.6875rem;
line-height: 1.25rem;
font-weight: 500;
font-family: var(--font-geist-sans), ui-sans-serif, system-ui, sans-serif;
}
html.dark
#nd-page:has(.api-page-header)
.flex.flex-wrap.items-center.gap-3.not-prose
> span.text-sm.font-mono.text-fd-muted-foreground {
background-color: rgb(39 39 42);
color: rgb(212 212 216);
}
/* Hide the "*" inside the name span — we'll add "required" as a ::after on the flex row */
#nd-page:has(.api-page-header) span.font-medium.font-mono.text-fd-primary > span.text-red-400 {
display: none;
}
/* Required badge — order 3, light red pill */
#nd-page:has(.api-page-header)
.flex.flex-wrap.items-center.gap-3.not-prose:has(span.text-red-400)::after {
content: "required";
order: 3;
display: inline-flex;
align-items: center;
background-color: rgb(254 235 235);
color: rgb(220 38 38);
padding: 0.125rem 0.5rem;
border-radius: 0.375rem;
font-size: 0.6875rem;
line-height: 1.25rem;
font-weight: 500;
font-family: var(--font-geist-sans), ui-sans-serif, system-ui, sans-serif;
}
html.dark
#nd-page:has(.api-page-header)
.flex.flex-wrap.items-center.gap-3.not-prose:has(span.text-red-400)::after {
background-color: rgb(127 29 29 / 0.2);
color: rgb(252 165 165);
}
/* Optional "?" indicator — hide it */
#nd-page:has(.api-page-header)
span.font-medium.font-mono.text-fd-primary
> span.text-fd-muted-foreground {
display: none;
}
/* Hide the auth scheme type label (e.g. "apiKey") next to Authorization heading */
#nd-page:has(.api-page-header) .flex.items-start.justify-between.gap-2 > div.not-prose {
display: none !important;
}
/* Auth property — replace "<token>" with "string" badge, add "header" and "required" badges.
Auth properties use my-4 (vs py-4 for regular properties). */
/* Auth property flex row — name: order 1, type: order 2, ::before "header": order 3, ::after "required": order 4 */
#nd-page:has(.api-page-header)
div.my-4
> .flex.flex-wrap.items-center.gap-3.not-prose
> span.font-medium.font-mono.text-fd-primary {
order: 1;
}
#nd-page:has(.api-page-header)
div.my-4
> .flex.flex-wrap.items-center.gap-3.not-prose
> span.text-sm.font-mono.text-fd-muted-foreground {
order: 2;
font-size: 0;
padding: 0 !important;
background: none !important;
line-height: 0;
}
#nd-page:has(.api-page-header)
div.my-4
> .flex.flex-wrap.items-center.gap-3.not-prose
> span.text-sm.font-mono.text-fd-muted-foreground::after {
content: "string";
font-size: 0.6875rem;
line-height: 1.25rem;
font-weight: 500;
font-family: var(--font-geist-sans), ui-sans-serif, system-ui, sans-serif;
background-color: rgb(240 240 243);
color: rgb(100 100 110);
padding: 0.125rem 0.5rem;
border-radius: 0.375rem;
display: inline-flex;
align-items: center;
}
html.dark
#nd-page:has(.api-page-header)
div.my-4
> .flex.flex-wrap.items-center.gap-3.not-prose
> span.text-sm.font-mono.text-fd-muted-foreground::after {
background-color: rgb(39 39 42);
color: rgb(212 212 216);
}
/* "header" badge via ::before on the auth flex row */
#nd-page:has(.api-page-header) div.my-4 > .flex.flex-wrap.items-center.gap-3.not-prose::before {
content: "header";
order: 3;
display: inline-flex;
align-items: center;
background-color: rgb(240 240 243);
color: rgb(100 100 110);
padding: 0.125rem 0.5rem;
border-radius: 0.375rem;
font-size: 0.6875rem;
line-height: 1.25rem;
font-weight: 500;
font-family: var(--font-geist-sans), ui-sans-serif, system-ui, sans-serif;
}
html.dark
#nd-page:has(.api-page-header)
div.my-4
> .flex.flex-wrap.items-center.gap-3.not-prose::before {
background-color: rgb(39 39 42);
color: rgb(212 212 216);
}
/* "required" badge via ::after on the auth flex row — light red pill */
#nd-page:has(.api-page-header) div.my-4 > .flex.flex-wrap.items-center.gap-3.not-prose::after {
content: "required";
order: 4;
display: inline-flex;
align-items: center;
background-color: rgb(254 235 235);
color: rgb(220 38 38);
padding: 0.125rem 0.5rem;
border-radius: 0.375rem;
font-size: 0.6875rem;
line-height: 1.25rem;
font-weight: 500;
font-family: var(--font-geist-sans), ui-sans-serif, system-ui, sans-serif;
}
html.dark
#nd-page:has(.api-page-header)
div.my-4
> .flex.flex-wrap.items-center.gap-3.not-prose::after {
background-color: rgb(127 29 29 / 0.2);
color: rgb(252 165 165);
}
/* Hide "In: header" text below auth property — redundant with the header badge */
#nd-page:has(.api-page-header) div.my-4 .prose-no-margin p:has(> code) {
display: none !important;
}
/* Section dividers — bottom border after Authorization and Body sections. */
.api-section-divider {
padding-bottom: 0.5rem;
border-bottom: 1px solid rgb(229 231 235 / 0.6);
}
html.dark .api-section-divider {
border-bottom-color: rgb(255 255 255 / 0.07);
}
/* Property rows — breathing room like Mintlify.
Regular properties use border-t py-4; auth properties use border-t my-4. */
#nd-page:has(.api-page-header) .text-sm.border-t.py-4 {
padding-top: 1.25rem !important;
padding-bottom: 1.25rem !important;
}
#nd-page:has(.api-page-header) .text-sm.border-t.my-4 {
margin-top: 1.25rem !important;
margin-bottom: 1.25rem !important;
padding-top: 1.25rem;
}
/* Divider lines between fields — very subtle like Mintlify */
#nd-page:has(.api-page-header) .text-sm.border-t {
border-color: rgb(229 231 235 / 0.6);
}
html.dark #nd-page:has(.api-page-header) .text-sm.border-t {
border-color: rgb(255 255 255 / 0.07);
}
/* Body/Callback section "application/json" label — remove inline code styling */
#nd-page:has(.api-page-header) .flex.gap-2.items-center.justify-between p.not-prose code.text-xs,
#nd-page:has(.api-page-header) .flex.justify-between.gap-2.items-end p.not-prose code.text-xs {
background: none !important;
border: none !important;
padding: 0 !important;
color: var(--color-fd-muted-foreground) !important;
font-size: 0.875rem !important;
font-family: var(--font-geist-sans), ui-sans-serif, system-ui, sans-serif !important;
}
/* Object/array type triggers in property rows — order 2 + badge chip styling */
#nd-page:has(.api-page-header) .flex.flex-wrap.items-center.gap-3.not-prose > button,
#nd-page:has(.api-page-header) .flex.flex-wrap.items-center.gap-3.not-prose > span:has(> button) {
order: 2;
background-color: rgb(240 240 243);
color: rgb(100 100 110);
padding: 0.125rem 0.5rem;
border-radius: 0.375rem;
font-size: 0.6875rem;
line-height: 1.25rem;
font-weight: 500;
font-family: var(--font-geist-sans), ui-sans-serif, system-ui, sans-serif;
}
html.dark #nd-page:has(.api-page-header) .flex.flex-wrap.items-center.gap-3.not-prose > button,
html.dark
#nd-page:has(.api-page-header)
.flex.flex-wrap.items-center.gap-3.not-prose
> span:has(> button) {
background-color: rgb(39 39 42);
color: rgb(212 212 216);
}
/* Section headings (Authorization, Path Parameters, etc.) — consistent top spacing */
#nd-page:has(.api-page-header) .min-w-0.flex-1 h2 {
margin-top: 1.75rem !important;
margin-bottom: 0.25rem !important;
}
/* Code examples in right column — wrap long lines instead of horizontal scroll */
#nd-page:has(.api-page-header) pre {
white-space: pre-wrap !important;
word-break: break-all !important;
}
#nd-page:has(.api-page-header) pre code {
width: 100% !important;
word-break: break-all !important;
overflow-wrap: break-word !important;
}
/* API page header — constrain title/copy-page to left content column, not full width.
Only applies on OpenAPI pages (which have the two-column layout). */
@media (min-width: 1280px) {
.api-page-header {
max-width: calc(100% - 400px - 1.5rem);
}
}
/* Footer navigation — constrain to left content column on OpenAPI pages only.
Target pages that contain the two-column layout via :has() selector. */
#nd-page:has(.api-page-header) > div:last-child {
max-width: calc(100% - 400px - 1.5rem);
}
@media (max-width: 1024px) {
#nd-page:has(.api-page-header) > div:last-child {
max-width: 100%;
}
}
/* Tailwind v4 content sources */

View File

@@ -1,21 +0,0 @@
import type { BaseLayoutProps } from 'fumadocs-ui/layouts/shared'
/**
* Shared layout configurations
*
* you can customise layouts individually from:
* Home Layout: app/(home)/layout.tsx
* Docs Layout: app/docs/layout.tsx
*/
export const baseOptions: BaseLayoutProps = {
nav: {
title: (
<>
<svg width='24' height='24' xmlns='http://www.w3.org/2000/svg' aria-label='Logo'>
<circle cx={12} cy={12} r={12} fill='currentColor' />
</svg>
My App
</>
),
},
}

View File

@@ -7,26 +7,27 @@ export default function RootLayout({ children }: { children: ReactNode }) {
export const metadata = {
metadataBase: new URL('https://docs.sim.ai'),
title: {
default: 'Sim Documentation - Visual Workflow Builder for AI Applications',
default: 'Sim Documentation — Build AI Agents & Run Your Agentic Workforce',
template: '%s',
},
description:
'Comprehensive documentation for Sim - the visual workflow builder for AI applications. Create powerful AI agents, automation workflows, and data processing pipelines by connecting blocks on a canvas—no coding required.',
'Documentation for Sim the open-source platform to build AI agents and run your agentic workforce. Connect 1,000+ integrations and LLMs to deploy and orchestrate agentic workflows.',
keywords: [
'AI workflow builder',
'visual workflow editor',
'AI automation',
'workflow automation',
'AI agents',
'no-code AI',
'drag and drop workflows',
'agentic workforce',
'AI agent platform',
'open-source AI agents',
'agentic workflows',
'LLM orchestration',
'AI integrations',
'workflow canvas',
'AI Agent Workflow Builder',
'workflow orchestration',
'agent builder',
'AI workflow automation',
'visual programming',
'knowledge base',
'AI automation',
'workflow builder',
'AI workflow orchestration',
'enterprise AI',
'AI agent deployment',
'intelligent automation',
'AI tools',
],
authors: [{ name: 'Sim Team', url: 'https://sim.ai' }],
creator: 'Sim',
@@ -53,9 +54,9 @@ export const metadata = {
alternateLocale: ['es_ES', 'fr_FR', 'de_DE', 'ja_JP', 'zh_CN'],
url: 'https://docs.sim.ai',
siteName: 'Sim Documentation',
title: 'Sim Documentation - Visual Workflow Builder for AI Applications',
title: 'Sim Documentation — Build AI Agents & Run Your Agentic Workforce',
description:
'Comprehensive documentation for Sim - the visual workflow builder for AI applications. Create powerful AI agents, automation workflows, and data processing pipelines.',
'Documentation for Sim the open-source platform to build AI agents and run your agentic workforce. Connect 1,000+ integrations and LLMs to deploy and orchestrate agentic workflows.',
images: [
{
url: 'https://docs.sim.ai/api/og?title=Sim%20Documentation',
@@ -67,9 +68,9 @@ export const metadata = {
},
twitter: {
card: 'summary_large_image',
title: 'Sim Documentation - Visual Workflow Builder for AI Applications',
title: 'Sim Documentation — Build AI Agents & Run Your Agentic Workforce',
description:
'Comprehensive documentation for Sim - the visual workflow builder for AI applications.',
'Documentation for Sim the open-source platform to build AI agents and run your agentic workforce. Connect 1,000+ integrations and LLMs to deploy and orchestrate agentic workflows.',
creator: '@simdotai',
site: '@simdotai',
images: ['https://docs.sim.ai/api/og?title=Sim%20Documentation'],

View File

@@ -37,9 +37,9 @@ export async function GET() {
const manifest = `# Sim Documentation
> Visual Workflow Builder for AI Applications
> The open-source platform to build AI agents and run your agentic workforce.
Sim is a visual workflow builder for AI applications that lets you build AI agent workflows visually. Create powerful AI agents, automation workflows, and data processing pipelines by connecting blocks on a canvas—no coding required.
Sim is the open-source platform to build AI agents and run your agentic workforce. Connect 1,000+ integrations and LLMs to deploy and orchestrate agentic workflows. Create agents, workflows, knowledge bases, tables, and docs. Trusted by over 100,000 builders.
## Documentation Overview

View File

@@ -52,15 +52,26 @@ export function SidebarItem({ item }: { item: Item }) {
)
}
function isApiReferenceFolder(node: Folder): boolean {
if (node.index?.url.includes('/api-reference/')) return true
for (const child of node.children) {
if (child.type === 'page' && child.url.includes('/api-reference/')) return true
if (child.type === 'folder' && isApiReferenceFolder(child)) return true
}
return false
}
export function SidebarFolder({ item, children }: { item: Folder; children: ReactNode }) {
const pathname = usePathname()
const hasActiveChild = checkHasActiveChild(item, pathname)
const isApiRef = isApiReferenceFolder(item)
const isOnApiRefPage = stripLangPrefix(pathname).startsWith('/api-reference')
const hasChildren = item.children.length > 0
const [open, setOpen] = useState(hasActiveChild)
const [open, setOpen] = useState(hasActiveChild || (isApiRef && isOnApiRefPage))
useEffect(() => {
setOpen(hasActiveChild)
}, [hasActiveChild])
setOpen(hasActiveChild || (isApiRef && isOnApiRefPage))
}, [hasActiveChild, isApiRef, isOnApiRefPage])
const active = item.index ? isActive(item.index.url, pathname, false) : false
@@ -157,16 +168,18 @@ export function SidebarFolder({ item, children }: { item: Folder; children: Reac
{hasChildren && (
<div
className={cn(
'overflow-hidden transition-all duration-200 ease-in-out',
open ? 'max-h-[10000px] opacity-100' : 'max-h-0 opacity-0'
'grid transition-[grid-template-rows,opacity] duration-200 ease-in-out',
open ? 'grid-rows-[1fr] opacity-100' : 'grid-rows-[0fr] opacity-0'
)}
>
{/* 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 className='overflow-hidden'>
{/* 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>
)}
</div>

View File

@@ -1,38 +1,36 @@
'use client'
import { useState } from 'react'
import { ArrowRight, ChevronRight } from 'lucide-react'
import Link from 'next/link'
export function TOCFooter() {
const [isHovered, setIsHovered] = useState(false)
return (
<div className='sticky bottom-0 mt-6'>
<div className='flex flex-col gap-2 rounded-lg border border-border bg-secondary p-6 text-sm'>
<div className='text-balance font-semibold text-base leading-tight'>
Start building today
</div>
<div className='text-muted-foreground'>Trusted by over 60,000 builders.</div>
<div className='text-muted-foreground'>Trusted by over 100,000 builders.</div>
<div className='text-muted-foreground'>
Build Agentic workflows visually on a drag-and-drop canvas or with natural language.
The open-source platform to build AI agents and run your agentic workforce.
</div>
<Link
href='https://sim.ai/signup'
target='_blank'
rel='noopener noreferrer'
onMouseEnter={() => setIsHovered(true)}
onMouseLeave={() => setIsHovered(false)}
className='group mt-2 inline-flex h-8 w-fit items-center justify-center gap-1 whitespace-nowrap rounded-[10px] border border-[#2AAD6C] bg-gradient-to-b from-[#3ED990] to-[#2AAD6C] px-3 pr-[10px] pl-[12px] font-medium text-sm text-white shadow-[inset_0_2px_4px_0_#5EE8A8] outline-none transition-all hover:shadow-lg focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50'
aria-label='Get started with Sim - Sign up for free'
>
<span>Get started</span>
<span className='inline-flex transition-transform duration-200 group-hover:translate-x-0.5'>
{isHovered ? (
<ArrowRight className='h-4 w-4' aria-hidden='true' />
) : (
<ChevronRight className='h-4 w-4' aria-hidden='true' />
)}
<span className='relative inline-flex h-4 w-4 transition-transform duration-200 group-hover:translate-x-0.5'>
<ChevronRight
className='absolute inset-0 h-4 w-4 transition-opacity duration-200 group-hover:opacity-0'
aria-hidden='true'
/>
<ArrowRight
className='absolute inset-0 h-4 w-4 opacity-0 transition-opacity duration-200 group-hover:opacity-100'
aria-hidden='true'
/>
</span>
</Link>
</div>

View File

@@ -526,6 +526,17 @@ export function SlackMonoIcon(props: SVGProps<SVGSVGElement>) {
)
}
export function GammaIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} viewBox='-14 0 192 192' fill='none' xmlns='http://www.w3.org/2000/svg'>
<path
fill='currentColor'
d='M47.2,14.4c-14.4,8.2-26,19.6-34.4,33.6C4.3,62.1,0,77.7,0,94.3s4.3,32.2,12.7,46.3c8.5,14.1,20,25.4,34.4,33.6,14.4,8.2,30.4,12.4,47.7,12.4h69.8v-112.5h-81v39.1h38.2v31.8h-25.6c-9.1,0-17.6-2.3-25.2-6.9-7.6-4.6-13.8-10.8-18.3-18.4-4.5-7.7-6.7-16.2-6.7-25.3s2.3-17.7,6.7-25.3c4.5-7.7,10.6-13.9,18.3-18.4,7.6-4.6,16.1-6.9,25.2-6.9h68.5V2h-69.8c-17.3,0-33.3,4.2-47.7,12.4h0Z'
/>
</svg>
)
}
export function GithubIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} width='26' height='26' viewBox='0 0 26 26' xmlns='http://www.w3.org/2000/svg'>
@@ -710,6 +721,17 @@ export function NotionIcon(props: SVGProps<SVGSVGElement>) {
)
}
export function GongIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} viewBox='0 0 55.4 60' fill='none' xmlns='http://www.w3.org/2000/svg'>
<path
fill='currentColor'
d='M54.1,25.7H37.8c-0.9,0-1.6,1-1.3,1.8l3.9,10.1c0.2,0.4-0.2,0.9-0.7,0.9l-5-0.3c-0.2,0-0.4,0.1-0.6,0.3L30.3,44c-0.2,0.3-0.6,0.4-1,0.2l-5.8-3.9c-0.2-0.2-0.5-0.2-0.8,0l-8,5.4c-0.5,0.4-1.2-0.1-1-0.7L16,37c0.1-0.3-0.1-0.7-0.4-0.8l-4.2-1.7c-0.4-0.2-0.6-0.7-0.3-1l3.7-4.6c0.2-0.2,0.2-0.6,0-0.8l-3.1-4.5c-0.3-0.4,0-1,0.5-1l4.9-0.4c0.4,0,0.6-0.3,0.6-0.7l-0.4-6.8c0-0.5,0.5-0.8,0.9-0.7l6,2.5c0.3,0.1,0.6,0,0.8-0.2l4.2-4.6c0.3-0.4,0.9-0.3,1.1,0.2l2.5,6.4c0.3,0.8,1.3,1.1,2,0.6l9.8-7.3c1.1-0.8,0.4-2.6-1-2.4L37.3,10c-0.3,0-0.6-0.1-0.7-0.4l-3.4-8.7c-0.4-0.9-1.5-1.1-2.2-0.4l-7.4,8c-0.2,0.2-0.5,0.3-0.8,0.2l-9.7-4.1c-0.9-0.4-1.8,0.2-1.9,1.2l-0.4,10c0,0.4-0.3,0.6-0.6,0.6l-8.9,0.6c-1,0.1-1.6,1.2-1,2.1l5.9,8.7c0.2,0.2,0.2,0.6,0,0.8l-6,6.9C-0.3,36,0,37.1,0.8,37.4l6.9,3c0.3,0.1,0.5,0.5,0.4,0.8L3.7,58.3c-0.3,1.2,1.1,2.1,2.1,1.4l16.5-11.8c0.2-0.2,0.5-0.2,0.8,0l7.5,5.3c0.6,0.4,1.5,0.3,1.9-0.4l4.7-7.2c0.1-0.2,0.4-0.3,0.6-0.3l11.2,1.4c0.9,0.1,1.8-0.6,1.5-1.5l-4.7-12.1c-0.1-0.3,0-0.7,0.4-0.9l8.5-4C55.9,27.6,55.5,25.7,54.1,25.7z'
/>
</svg>
)
}
export function GmailIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg
@@ -928,6 +950,25 @@ export function GoogleIcon(props: SVGProps<SVGSVGElement>) {
)
}
export function DevinIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} viewBox='0 0 500 500' fill='none' xmlns='http://www.w3.org/2000/svg'>
<path
d='M59.29,209.39l48.87,28.21c1.75,1.01,3.71,1.51,5.67,1.51c1.95,0,3.92-0.52,5.67-1.51l48.87-28.21c0,0,0.14-0.11,0.2-0.16c0.74-0.45,1.44-0.99,2.07-1.6c0.09-0.09,0.18-0.2,0.27-0.29c0.54-0.58,1.03-1.21,1.44-1.89c0.06-0.11,0.16-0.2,0.2-0.32c0.43-0.74,0.74-1.53,0.99-2.37c0.05-0.18,0.09-0.36,0.14-0.54c0.2-0.86,0.36-1.74,0.36-2.66v-28.21c0-10.89,5.87-21.03,15.3-26.48c9.42-5.45,21.15-5.44,30.59,0l24.43,14.11c0.79,0.45,1.62,0.77,2.47,1.01c0.18,0.05,0.37,0.11,0.54,0.16c0.83,0.2,1.69,0.32,2.54,0.34c0.05,0,0.09,0,0.11,0c0.09,0,0.18-0.05,0.26-0.05c0.79,0,1.58-0.11,2.34-0.32c0.14-0.03,0.27-0.05,0.4-0.09c0.83-0.23,1.64-0.57,2.41-0.99c0.06-0.05,0.16-0.05,0.23-0.09l48.87-28.21c3.51-2.03,5.67-5.76,5.67-9.81V64.52c0-4.05-2.16-7.78-5.67-9.81l-48.91-28.19c-3.51-2.03-7.81-2.03-11.32,0l-48.87,28.21c0,0-0.14,0.11-0.2,0.16c-0.74,0.45-1.44,0.99-2.07,1.6c-0.09,0.09-0.18,0.2-0.27,0.29c-0.54,0.58-1.03,1.21-1.44,1.89c-0.06,0.11-0.16,0.2-0.2,0.31c-0.43,0.74-0.74,1.53-0.99,2.37c-0.05,0.18-0.09,0.36-0.14,0.54c-0.2,0.86-0.36,1.74-0.36,2.66v28.21c0,10.89-5.87,21.03-15.3,26.5c-9.42,5.44-21.15,5.44-30.59,0l-24.42-14.1c-0.79-0.45-1.63-0.77-2.47-1.01c-0.18-0.05-0.36-0.11-0.54-0.16c-0.84-0.2-1.69-0.31-2.55-0.34c-0.14,0-0.25,0-0.38,0c-0.81,0-1.6,0.11-2.37,0.31c-0.14,0.02-0.25,0.05-0.38,0.09c-0.82,0.23-1.63,0.57-2.4,1c-0.06,0.05-0.16,0.05-0.23,0.09l-48.84,28.24c-3.51,2.03-5.67,5.76-5.67,9.81v56.42c0,4.05,2.16,7.78,5.67,9.81C59.29,209.41,59.29,209.39,59.29,209.39z'
fill='#2A6DCE'
/>
<path
d='M325.46,223.49c9.42-5.44,21.15-5.44,30.59,0l24.43,14.11c0.79,0.45,1.62,0.77,2.47,1.01c0.18,0.05,0.36,0.11,0.54,0.16c0.83,0.2,1.69,0.31,2.54,0.34c0.05,0,0.09,0,0.11,0c0.09,0,0.18-0.03,0.26-0.05c0.79,0,1.58-0.11,2.34-0.31c0.14-0.03,0.27-0.05,0.4-0.09c0.83-0.23,1.62-0.57,2.41-0.99c0.06-0.05,0.16-0.05,0.25-0.09l48.87-28.21c3.51-2.03,5.67-5.76,5.67-9.81v-56.43c0-4.05-2.16-7.78-5.67-9.81l-48.84-28.22c-3.51-2.03-7.81-2.03-11.32,0l-48.87,28.21c0,0-0.14,0.11-0.2,0.16c-0.74,0.45-1.44,0.99-2.07,1.6c-0.09,0.09-0.18,0.2-0.26,0.29c-0.54,0.58-1.03,1.21-1.44,1.89c-0.06,0.11-0.16,0.2-0.2,0.32c-0.43,0.74-0.74,1.53-0.99,2.37c-0.05,0.18-0.09,0.36-0.14,0.54c-0.2,0.86-0.36,1.74-0.36,2.66v28.21c0,10.89-5.87,21.03-15.3,26.5c-9.42,5.44-21.15,5.44-30.59,0l-24.43-14.11c-0.79-0.45-1.62-0.77-2.47-1.01c-0.18-0.05-0.36-0.11-0.54-0.16c-0.83-0.2-1.69-0.32-2.54-0.34c-0.14,0-0.25,0-0.38,0c-0.81,0-1.6,0.11-2.37,0.32c-0.14,0.03-0.25,0.05-0.38,0.09c-0.83,0.23-1.64,0.57-2.41,0.99c-0.06,0.05-0.16,0.05-0.23,0.09l-48.87,28.21c-3.51,2.03-5.67,5.76-5.67,9.81v56.43c0,4.05,2.16,7.78,5.67,9.81l48.87,28.21c0,0,0.16,0.05,0.23,0.09c0.77,0.43,1.58,0.77,2.41,0.99c0.14,0.05,0.27,0.05,0.4,0.09c0.77,0.18,1.55,0.29,2.34,0.32c0.09,0,0.18,0.05,0.27,0.05c0.05,0,0.09,0,0.11,0c0.86,0,1.69-0.14,2.54-0.34c0.18-0.05,0.36-0.09,0.54-0.16c0.86-0.25,1.69-0.57,2.47-1.01l24.43-14.11c9.42-5.44,21.15-5.44,30.59,0c9.42,5.44,15.3,15.59,15.3,26.48v28.21c0,0.92,0.14,1.8,0.36,2.66c0.05,0.18,0.09,0.36,0.14,0.54c0.25,0.83,0.56,1.62,0.99,2.37c0.06,0.11,0.14,0.2,0.2,0.31c0.4,0.68,0.9,1.31,1.44,1.89c0.09,0.09,0.18,0.2,0.26,0.29c0.61,0.6,1.31,1.12,2.07,1.6c0.06,0.05,0.11,0.11,0.2,0.16l48.87,28.21c1.75,1.01,3.72,1.51,5.67,1.51s3.92-0.52,5.67-1.51l48.87-28.21c3.51-2.03,5.67-5.76,5.67-9.81v-56.43c0-4.05-2.16-7.78-5.67-9.81l-48.87-28.21c0,0-0.16-0.05-0.23-0.09c-0.77-0.43-1.58-0.77-2.41-0.99c-0.14-0.05-0.25-0.05-0.38-0.09c-0.79-0.18-1.57-0.29-2.38-0.32c-0.11,0-0.25,0-0.36,0c-0.86,0-1.71,0.14-2.54,0.34c-0.18,0.05-0.34,0.09-0.52,0.16c-0.86,0.25-1.69,0.57-2.47,1.01l-24.43,14.11c-9.42,5.44-21.15,5.44-30.58,0c-9.42-5.44-15.3-15.59-15.3-26.5c0-10.91,5.87-21.03,15.3-26.48C325.55,223.49,325.46,223.49,325.46,223.49z'
fill='#1DC19C'
/>
<path
d='M304.5,369.22l-48.87-28.21c0,0-0.16-0.05-0.23-0.09c-0.77-0.43-1.57-0.77-2.41-0.99c-0.14-0.05-0.27-0.05-0.4-0.09c-0.79-0.18-1.57-0.29-2.37-0.32c-0.14,0-0.25,0-0.38,0c-0.86,0-1.71,0.14-2.54,0.34c-0.18,0.05-0.34,0.09-0.52,0.16c-0.86,0.25-1.69,0.57-2.47,1.01l-24.43,14.11c-9.42,5.44-21.15,5.44-30.58,0c-9.42-5.44-15.3-15.59-15.3-26.5v-28.22c0-0.92-0.14-1.8-0.36-2.66c-0.05-0.18-0.09-0.36-0.14-0.54c-0.25-0.83-0.57-1.62-0.99-2.37c-0.06-0.11-0.14-0.2-0.2-0.32c-0.4-0.68-0.9-1.31-1.44-1.89c-0.09-0.09-0.18-0.2-0.27-0.29c-0.6-0.6-1.31-1.12-2.07-1.6c-0.06-0.05-0.11-0.11-0.2-0.16l-48.87-28.21c-3.51-2.03-7.81-2.03-11.32,0L59.28,290.6c-3.51,2.03-5.67,5.76-5.67,9.81v56.43c0,4.05,2.16,7.78,5.67,9.81l48.87,28.21c0,0,0.16,0.06,0.23,0.09c0.77,0.43,1.55,0.77,2.38,0.99c0.14,0.05,0.27,0.06,0.4,0.09c0.77,0.18,1.55,0.29,2.34,0.32c0.09,0,0.18,0.05,0.29,0.05c0.05,0,0.09,0,0.14,0c0.86,0,1.69-0.14,2.52-0.34c0.18-0.05,0.36-0.09,0.54-0.16c0.86-0.25,1.69-0.57,2.47-1.01l24.43-14.11c9.42-5.44,21.15-5.44,30.59,0c9.42,5.44,15.3,15.59,15.3,26.48v28.21c0,0.92,0.14,1.8,0.36,2.66c0.05,0.18,0.09,0.36,0.14,0.54c0.25,0.83,0.57,1.62,0.99,2.37c0.06,0.11,0.14,0.2,0.2,0.32c0.4,0.68,0.9,1.31,1.44,1.89c0.09,0.09,0.18,0.2,0.27,0.29c0.61,0.61,1.31,1.12,2.07,1.6c0.06,0.05,0.11,0.11,0.2,0.16l48.87,28.21c1.75,1.01,3.71,1.51,5.67,1.51c1.96,0,3.92-0.52,5.67-1.51l48.87-28.21c3.51-2.03,5.67-5.76,5.67-9.81v-56.43c0-4.05-2.16-7.78-5.67-9.81L304.5,369.22z'
fill='#1796E2'
/>
</svg>
)
}
export function DiscordIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg
@@ -1157,6 +1198,43 @@ export function AirweaveIcon(props: SVGProps<SVGSVGElement>) {
)
}
export function AlgoliaIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} xmlns='http://www.w3.org/2000/svg' viewBox='0 0 50 50'>
<path
fill='#FFFFFF'
d='M25,0C11.3,0,0.2,11,0,24.6C-0.2,38.4,11,49.9,24.8,50c4.3,0,8.4-1,12-3c0.4-0.2,0.4-0.7,0.1-1l-2.3-2.1 c-0.5-0.4-1.2-0.5-1.7-0.3c-2.5,1.1-5.3,1.6-8.2,1.6c-11.2-0.1-20.2-9.4-20-20.6C4.9,13.6,13.9,4.7,25,4.7h20.3v36L33.7,30.5 c-0.4-0.3-0.9-0.3-1.2,0.1c-1.8,2.4-4.9,4-8.2,3.7c-4.6-0.3-8.4-4-8.7-8.7c-0.4-5.5,4-10.2,9.4-10.2c4.9,0,9,3.8,9.4,8.6 c0,0.4,0.2,0.8,0.6,1.1l3,2.7c0.3,0.3,0.9,0.1,1-0.3c0.2-1.2,0.3-2.4,0.2-3.6c-0.5-7-6.2-12.7-13.2-13.1c-8.1-0.5-14.8,5.8-15,13.7 c-0.2,7.7,6.1,14.4,13.8,14.5c3.2,0.1,6.2-0.9,8.6-2.7l15,13.3c0.6,0.6,1.7,0.1,1.7-0.7v-48C50,0.4,49.5,0,49,0L25,0 C25,0,25,0,25,0z'
/>
</svg>
)
}
export function AmplitudeIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} xmlns='http://www.w3.org/2000/svg' viewBox='0 0 49 49'>
<path
fill='#FFFFFF'
d='M23.4,15.3c0.6,1.8,1.2,4.1,1.9,6.7c-2.6,0-5.3-0.1-7.8-0.1h-1.3c1.5-5.7,3.2-10.1,4.6-11.1 c0.1-0.1,0.2-0.1,0.4-0.1c0.2,0,0.3,0.1,0.5,0.3C21.9,11.5,22.5,12.7,23.4,15.3z M49,24.5C49,38,38,49,24.5,49S0,38,0,24.5 S11,0,24.5,0S49,11,49,24.5z M42.7,23.9c0-0.6-0.4-1.2-1-1.3l0,0l0,0l0,0c-0.1,0-0.1,0-0.2,0h-0.2c-4.1-0.3-8.4-0.4-12.4-0.5l0,0 C27,14.8,24.5,7.4,21.3,7.4c-3,0-5.8,4.9-8.2,14.5c-1.7,0-3.2,0-4.6-0.1c-0.1,0-0.2,0-0.2,0c-0.3,0-0.5,0-0.5,0 c-0.8,0.1-1.4,0.9-1.4,1.7c0,0.8,0.6,1.6,1.5,1.7l0,0h4.6c-0.4,1.9-0.8,3.8-1.1,5.6l-0.1,0.8l0,0c0,0.6,0.5,1.1,1.1,1.1 c0.4,0,0.8-0.2,1-0.5l0,0l2.2-7.1h10.7c0.8,3.1,1.7,6.3,2.8,9.3c0.6,1.6,2,5.4,4.4,5.4l0,0c3.6,0,5-5.8,5.9-9.6 c0.2-0.8,0.4-1.5,0.5-2.1l0.1-0.2l0,0c0-0.1,0-0.2,0-0.3c-0.1-0.2-0.2-0.3-0.4-0.4c-0.3-0.1-0.5,0.1-0.6,0.4l0,0l-0.1,0.2 c-0.3,0.8-0.6,1.6-0.8,2.3v0.1c-1.6,4.4-2.3,6.4-3.7,6.4l0,0l0,0l0,0c-1.8,0-3.5-7.3-4.1-10.1c-0.1-0.5-0.2-0.9-0.3-1.3h11.7 c0.2,0,0.4-0.1,0.6-0.1l0,0c0,0,0,0,0.1,0c0,0,0,0,0.1,0l0,0c0,0,0.1,0,0.1-0.1l0,0C42.5,24.6,42.7,24.3,42.7,23.9z'
/>
</svg>
)
}
export function GoogleBooksIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} xmlns='http://www.w3.org/2000/svg' viewBox='0 0 478.633 540.068'>
<path
fill='#1C51A4'
d='M449.059,218.231L245.519,99.538l-0.061,193.23c0.031,1.504-0.368,2.977-1.166,4.204c-0.798,1.258-1.565,1.995-2.915,2.547c-1.35,0.552-2.792,0.706-4.204,0.399c-1.412-0.307-2.7-1.043-3.713-2.117l-69.166-70.609l-69.381,70.179c-1.013,0.982-2.301,1.657-3.652,1.903c-1.381,0.246-2.792,0.092-4.081-0.491c-1.289-0.583-1.626-0.522-2.394-1.749c-0.767-1.197-1.197-2.608-1.197-4.081L85.031,6.007l-2.915-1.289C43.973-11.638,0,16.409,0,59.891v420.306c0,46.029,49.312,74.782,88.775,51.767l360.285-210.138C488.491,298.782,488.491,241.246,449.059,218.231z'
/>
<path
fill='#80D7FB'
d='M88.805,8.124c-2.179-1.289-4.419-2.363-6.659-3.345l0.123,288.663c0,1.442,0.43,2.854,1.197,4.081c0.767,1.197,1.872,2.148,3.161,2.731c1.289,0.583,2.7,0.736,4.081,0.491c1.381-0.246,2.639-0.921,3.652-1.903l69.749-69.688l69.811,69.749c1.013,1.074,2.301,1.81,3.713,2.117c1.412,0.307,2.884,0.153,4.204-0.399c1.319-0.552,2.455-1.565,3.253-2.792c0.798-1.258,1.197-2.731,1.166-4.204V99.998L88.805,8.124z'
/>
</svg>
)
}
export function GoogleDocsIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg
@@ -1198,6 +1276,20 @@ export function GoogleSlidesIcon(props: SVGProps<SVGSVGElement>) {
)
}
export function GoogleContactsIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} xmlns='http://www.w3.org/2000/svg' viewBox='0 0 500 500'>
<path fill='#86a9ff' d='M199 244c-89 0-161 71-161 160v67c0 16 13 29 29 29h77l77-256z' />
<path fill='#578cff' d='M462 349c0-58-48-105-106-105h-77v256h77c58 0 106-47 106-106' />
<path
fill='#0057cc'
d='M115 349c0-58 48-105 106-105h58c58 0 106 47 106 105v45c0 59-48 106-106 106H144c-16 0-29-13-29-29z'
/>
<circle cx='250' cy='99.4' r='99.4' fill='#0057cc' />
</svg>
)
}
export function GoogleCalendarIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg
@@ -1265,6 +1357,21 @@ export function GoogleCalendarIcon(props: SVGProps<SVGSVGElement>) {
)
}
export function GoogleTasksIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} viewBox='0 0 527.1 500' xmlns='http://www.w3.org/2000/svg'>
<polygon
fill='#0066DA'
points='410.4,58.3 368.8,81.2 348.2,120.6 368.8,168.8 407.8,211 450,187.5 475.9,142.8 450,87.5'
/>
<path
fill='#2684FC'
d='M249.3,219.4l98.9-98.9c29.1,22.1,50.5,53.8,59.6,90.4L272.1,346.7c-12.2,12.2-32,12.2-44.2,0l-91.5-91.5 c-9.8-9.8-9.8-25.6,0-35.3l39-39c9.8-9.8,25.6-9.8,35.3,0L249.3,219.4z M519.8,63.6l-39.7-39.7c-9.7-9.7-25.6-9.7-35.3,0 l-34.4,34.4c27.5,23,49.9,51.8,65.5,84.5l43.9-43.9C529.6,89.2,529.6,73.3,519.8,63.6z M412.5,250c0,89.8-72.8,162.5-162.5,162.5 S87.5,339.8,87.5,250S160.2,87.5,250,87.5c36.9,0,70.9,12.3,98.2,33.1l62.2-62.2C367,21.9,311.1,0,250,0C111.9,0,0,111.9,0,250 s111.9,250,250,250s250-111.9,250-250c0-38.3-8.7-74.7-24.1-107.2L407.8,211C410.8,223.5,412.5,236.6,412.5,250z'
/>
</svg>
)
}
export function SupabaseIcon(props: SVGProps<SVGSVGElement>) {
const id = useId()
const gradient0 = `supabase_paint0_${id}`
@@ -1604,167 +1711,42 @@ export function StagehandIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg
{...props}
width='108'
height='159'
viewBox='0 0 108 159'
fill='none'
xmlns='http://www.w3.org/2000/svg'
width='256'
height='352'
viewBox='0 0 256 352'
fill='none'
>
<path
d='M15 26C22.8234 31.822 23.619 41.405 25.3125 50.3867C25.8461 53.1914 26.4211 55.9689 27.0625 58.75C27.7987 61.9868 28.4177 65.2319 29 68.5C29.332 70.3336 29.6653 72.1669 30 74C30.1418 74.7863 30.2836 75.5727 30.4297 76.3828C31.8011 83.2882 33.3851 90.5397 39.4375 94.75C40.3405 95.3069 40.3405 95.3069 41.2617 95.875C43.8517 97.5512 45.826 99.826 48 102C50.6705 102.89 52.3407 103.143 55.0898 103.211C55.8742 103.239 56.6586 103.268 57.4668 103.297C59.1098 103.349 60.7531 103.393 62.3965 103.43C65.8896 103.567 68.4123 103.705 71.5664 105.289C73 107 73 107 73 111C73.66 111 74.32 111 75 111C74.0759 106.912 74.0759 106.912 71.4766 103.828C67.0509 102.348 62.3634 102.64 57.7305 102.609C52.3632 102.449 49.2783 101.537 45 98C41.8212 94.0795 41.5303 90.9791 42 86C44.9846 83.0154 48.2994 83.6556 52.3047 83.6289C53.139 83.6199 53.9734 83.6108 54.833 83.6015C56.6067 83.587 58.3805 83.5782 60.1543 83.5745C62.8304 83.5627 65.5041 83.5137 68.1797 83.4629C81.1788 83.34 91.8042 85.3227 102 94C106.37 100.042 105.483 106.273 104.754 113.406C103.821 119.026 101.968 124.375 100.125 129.75C99.8806 130.471 99.6361 131.193 99.3843 131.936C97.7783 136.447 95.9466 140.206 93 144C92.34 144 91.68 144 91 144C91 144.66 91 145.32 91 146C79.0816 156.115 63.9798 156.979 49 156C36.6394 154.226 26.7567 148.879 19 139C11.0548 125.712 11.6846 105.465 11.3782 90.4719C11.0579 77.4745 8.03411 64.8142 5.4536 52.1135C5.04373 50.0912 4.64233 48.0673 4.24218 46.043C4.00354 44.8573 3.7649 43.6716 3.51903 42.45C2.14425 33.3121 2.14425 33.3121 4.87499 29.125C8.18297 25.817 10.3605 25.4542 15 26Z'
fill='#FDFDFD'
d='M 242.29,45.79 C 242.29,28.88 226.69,13.76 206.61,13.76 C 188.59,13.76 174.82,28.66 174.82,45.85 V 101.97 C 168.89,98.09 163.18,96.76 157.14,96.76 C 145.94,96.76 137.02,101.49 128.83,110.17 C 121.81,101.01 112.07,95.73 100.72,95.73 C 93.97,95.73 87.82,98.09 82.11,100.9 V 80.05 C 82.11,64.08 66.14,47.28 48.74,47.28 C 31.12,47.28 14.54,62.71 14.54,78.79 V 219.4 C 14.54,273.71 56.99,337.89 125.23,337.89 C 197.41,337.89 242.29,289.05 242.29,186.01 V 78.9 L 242.29,45.79 Z'
fill='black'
/>
<path
d='M91 0.999996C94.8466 2.96604 96.2332 5.08365 97.6091 9.03564C99.203 14.0664 99.4412 18.7459 99.4414 23.9922C99.4538 24.9285 99.4663 25.8647 99.4791 26.8294C99.5049 28.8198 99.5247 30.8103 99.539 32.8008C99.5785 37.9693 99.6682 43.1369 99.7578 48.3047C99.7747 49.3188 99.7917 50.3328 99.8091 51.3776C99.9603 59.6066 100.323 67.7921 100.937 76C101.012 77.0582 101.087 78.1163 101.164 79.2065C101.646 85.1097 102.203 90.3442 105.602 95.3672C107.492 98.9262 107.45 102.194 107.375 106.125C107.366 106.881 107.356 107.638 107.346 108.417C107.18 114.639 106.185 120.152 104 126C103.636 126.996 103.273 127.993 102.898 129.02C98.2182 141.022 92.6784 149.349 80.7891 155.062C67.479 160.366 49.4234 159.559 36 155C32.4272 153.286 29.2162 151.308 26 149C25.0719 148.361 24.1437 147.721 23.1875 147.062C8.32968 133.054 9.60387 109.231 8.73413 90.3208C8.32766 81.776 7.51814 73.4295 5.99999 65C5.82831 64.0338 5.65662 63.0675 5.47973 62.072C4.98196 59.3363 4.46395 56.6053 3.93749 53.875C3.76412 52.9572 3.59074 52.0394 3.4121 51.0938C2.75101 47.6388 2.11387 44.3416 0.999995 41C0.505898 36.899 0.0476353 32.7768 2.04687 29.0469C4.91881 25.5668 6.78357 24.117 11.25 23.6875C15.8364 24.0697 17.5999 24.9021 21 28C24.7763 34.3881 26.047 41.2626 27.1875 48.5C27.5111 50.4693 27.8377 52.4381 28.168 54.4062C28.3733 55.695 28.3733 55.695 28.5828 57.0098C28.8087 58.991 28.8087 58.991 30 60C30.3171 59.4947 30.6342 58.9894 30.9609 58.4688C33.1122 55.4736 34.7097 53.3284 38.3789 52.3945C44.352 52.203 48.1389 53.6183 53 57C53.0928 56.1338 53.0928 56.1338 53.1875 55.25C54.4089 51.8676 55.9015 50.8075 59 49C63.8651 48.104 66.9348 48.3122 71.1487 51.0332C72.0896 51.6822 73.0305 52.3313 74 53C73.9686 51.2986 73.9686 51.2986 73.9365 49.5627C73.8636 45.3192 73.818 41.0758 73.7803 36.8318C73.7603 35.0016 73.733 33.1715 73.6982 31.3415C73.6492 28.6976 73.6269 26.0545 73.6094 23.4102C73.5887 22.6035 73.5681 21.7969 73.5468 20.9658C73.5441 13.8444 75.5121 7.83341 80.25 2.4375C83.9645 0.495841 86.8954 0.209055 91 0.999996ZM3.99999 30C1.56925 34.8615 3.215 40.9393 4.24218 46.043C4.37061 46.6927 4.49905 47.3424 4.63137 48.0118C5.03968 50.0717 5.45687 52.1296 5.87499 54.1875C11.1768 80.6177 11.1768 80.6177 11.4375 93.375C11.7542 120.78 11.7542 120.78 23.5625 144.375C28.5565 149.002 33.5798 151.815 40 154C40.6922 154.244 41.3844 154.487 42.0977 154.738C55.6463 158.576 72.4909 156.79 84.8086 150.316C87.0103 148.994 89.0458 147.669 91 146C91 145.34 91 144.68 91 144C91.66 144 92.32 144 93 144C97.1202 138.98 99.3206 133.053 101.25 126.937C101.505 126.174 101.76 125.41 102.023 124.623C104.94 115.65 107.293 104.629 103.625 95.625C96.3369 88.3369 86.5231 83.6919 76.1988 83.6088C74.9905 83.6226 74.9905 83.6226 73.7578 83.6367C72.9082 83.6362 72.0586 83.6357 71.1833 83.6352C69.4034 83.6375 67.6235 83.6472 65.8437 83.6638C63.1117 83.6876 60.3806 83.6843 57.6484 83.6777C55.9141 83.6833 54.1797 83.6904 52.4453 83.6992C51.6277 83.6983 50.81 83.6974 49.9676 83.6964C45.5122 83.571 45.5122 83.571 42 86C41.517 90.1855 41.733 92.4858 43.6875 96.25C46.4096 99.4871 48.6807 101.674 53.0105 102.282C55.3425 102.411 57.6645 102.473 60 102.5C69.8847 102.612 69.8847 102.612 74 106C74.8125 108.687 74.8125 108.688 75 111C74.34 111 73.68 111 73 111C72.8969 110.216 72.7937 109.432 72.6875 108.625C72.224 105.67 72.224 105.67 69 104C65.2788 103.745 61.5953 103.634 57.8672 103.609C51.1596 103.409 46.859 101.691 41.875 97C41.2562 96.34 40.6375 95.68 40 95C39.175 94.4637 38.35 93.9275 37.5 93.375C30.9449 87.1477 30.3616 77.9789 29.4922 69.418C29.1557 66.1103 29.1557 66.1103 28.0352 63.625C26.5234 59.7915 26.1286 55.8785 25.5625 51.8125C23.9233 38.3 23.9233 38.3 17 27C11.7018 24.3509 7.9915 26.1225 3.99999 30Z'
fill='#1F1F1F'
d='M 224.94,46.23 C 224.94,36.76 215.91,28.66 205.91,28.66 C 196.75,28.66 189.9,36.11 189.9,45.14 V 152.72 C 202.88,153.38 214.08,155.96 224.94,166.19 V 78.79 L 224.94,46.23 Z'
fill='white'
/>
<path
d='M89.0976 2.53906C91 3 91 3 93.4375 5.3125C96.1586 9.99276 96.178 14.1126 96.2461 19.3828C96.2778 21.1137 96.3098 22.8446 96.342 24.5754C96.3574 25.4822 96.3728 26.3889 96.3887 27.3232C96.6322 41.3036 96.9728 55.2117 98.3396 69.1353C98.9824 75.7746 99.0977 82.3308 99 89C96.5041 88.0049 94.0126 87.0053 91.5351 85.9648C90.3112 85.4563 90.3112 85.4563 89.0625 84.9375C87.8424 84.4251 87.8424 84.4251 86.5976 83.9023C83.7463 82.9119 80.9774 82.4654 78 82C76.7702 65.9379 75.7895 49.8907 75.7004 33.7775C75.6919 32.3138 75.6783 30.8501 75.6594 29.3865C75.5553 20.4082 75.6056 12.1544 80.6875 4.4375C83.6031 2.62508 85.7 2.37456 89.0976 2.53906Z'
fill='#FBFBFB'
d='M 157.21,113.21 C 146.12,113.21 137.93,122.02 137.93,131.76 V 154.62 C 142.24,153.05 145.95,152.61 149.83,152.61 H 174.71 V 131.76 C 174.71,122.35 166.73,113.21 157.21,113.21 Z'
fill='white'
/>
<path
d='M97 13C97.99 13.495 97.99 13.495 99 14C99.0297 15.8781 99.0297 15.8781 99.0601 17.7942C99.4473 46.9184 99.4473 46.9184 100.937 76C101.012 77.0574 101.087 78.1149 101.164 79.2043C101.646 85.1082 102.203 90.3434 105.602 95.3672C107.492 98.9262 107.45 102.194 107.375 106.125C107.366 106.881 107.356 107.638 107.346 108.417C107.18 114.639 106.185 120.152 104 126C103.636 126.996 103.273 127.993 102.898 129.02C98.2182 141.022 92.6784 149.349 80.7891 155.062C67.479 160.366 49.4234 159.559 36 155C32.4272 153.286 29.2162 151.308 26 149C24.6078 148.041 24.6078 148.041 23.1875 147.062C13.5484 137.974 10.832 124.805 9.99999 112C9.91815 101.992 10.4358 91.9898 11 82C11.33 82 11.66 82 12 82C12.0146 82.6118 12.0292 83.2236 12.0442 83.854C11.5946 115.845 11.5946 115.845 24.0625 143.875C28.854 148.273 33.89 150.868 40 153C40.6935 153.245 41.387 153.49 42.1016 153.742C56.9033 157.914 73.8284 155.325 87 148C88.3301 147.327 89.6624 146.658 91 146C91 145.34 91 144.68 91 144C91.66 144 92.32 144 93 144C100.044 130.286 105.786 114.602 104 99C102.157 94.9722 100.121 93.0631 96.3125 90.875C95.5042 90.398 94.696 89.9211 93.8633 89.4297C85.199 85.1035 78.1558 84.4842 68.5 84.3125C67.2006 84.2783 65.9012 84.2442 64.5625 84.209C61.3751 84.127 58.1879 84.0577 55 84C55 83.67 55 83.34 55 83C58.9087 82.7294 62.8179 82.4974 66.7309 82.2981C68.7007 82.1902 70.6688 82.0535 72.6367 81.916C82.854 81.4233 90.4653 83.3102 99 89C98.8637 87.6094 98.8637 87.6094 98.7246 86.1907C96.96 67.8915 95.697 49.7051 95.75 31.3125C95.751 30.5016 95.7521 29.6908 95.7532 28.8554C95.7901 15.4198 95.7901 15.4198 97 13Z'
fill='#262114'
d='M 100.06,111.75 C 89.19,111.75 81.85,121.06 81.85,130.31 V 157.86 C 81.85,167.71 89.72,175.38 99.24,175.38 C 109.71,175.38 118.39,166.91 118.39,157.39 V 130.31 C 118.39,120.79 110.03,111.75 100.06,111.75 Z'
fill='white'
/>
<path
d='M68 51C72.86 54.06 74.644 56.5072 76 62C76.249 65.2763 76.2347 68.5285 76.1875 71.8125C76.1868 72.6833 76.1862 73.554 76.1855 74.4512C76.1406 80.8594 76.1406 80.8594 75 82C73.5113 82.0867 72.0185 82.107 70.5273 82.0976C69.6282 82.0944 68.7291 82.0912 67.8027 82.0879C66.8572 82.0795 65.9117 82.0711 64.9375 82.0625C63.9881 82.058 63.0387 82.0535 62.0605 82.0488C59.707 82.037 57.3535 82.0205 55 82C53.6352 77.2188 53.738 72.5029 53.6875 67.5625C53.6585 66.6208 53.6295 65.6792 53.5996 64.709C53.5591 60.2932 53.5488 57.7378 55.8945 53.9023C59.5767 50.5754 63.1766 50.211 68 51Z'
fill='#F8F8F8'
d='M 192.04,168.87 H 150.16 C 140.19,168.87 133.34,175.39 133.34,183.86 C 133.34,192.9 140.19,199.75 148.66,199.75 H 182.52 C 188.01,199.75 189.63,204.81 189.63,207.49 C 189.63,211.91 186.37,214.64 181.09,215.51 C 162.96,218.66 137.71,229.13 137.71,259.68 C 137.71,265.07 133.67,267.42 130.29,267.42 C 126.09,267.42 122.38,264.74 122.38,260.12 C 122.38,241.15 129.02,228.17 143.26,214.81 C 131.01,212.02 119.21,202.99 117.75,186.43 C 111.93,189.81 107.2,191.15 100.18,191.15 C 82.11,191.15 66.68,176.58 66.68,158.29 V 80.71 C 66.68,71.24 57.16,63.5 49.18,63.5 C 38.71,63.5 29.89,72.42 29.89,80.27 V 217.19 C 29.89,266.48 68.71,322.19 124.88,322.19 C 185.91,322.19 223.91,282.15 223.91,207.16 C 223.91,187.19 214.28,168.87 192.04,168.87 Z'
fill='white'
/>
</svg>
)
}
export function BrandfetchIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} viewBox='0 0 29 31' fill='none' xmlns='http://www.w3.org/2000/svg'>
<path
d='M46 55C48.7557 57.1816 50.4359 58.8718 52 62C52.0837 63.5215 52.1073 65.0466 52.0977 66.5703C52.0944 67.4662 52.0912 68.3621 52.0879 69.2852C52.0795 70.2223 52.0711 71.1595 52.0625 72.125C52.058 73.0699 52.0535 74.0148 52.0488 74.9883C52.037 77.3256 52.0206 79.6628 52 82C50.9346 82.1992 50.9346 82.1992 49.8477 82.4023C48.9286 82.5789 48.0094 82.7555 47.0625 82.9375C46.146 83.1115 45.2294 83.2855 44.2852 83.4648C42.0471 83.7771 42.0471 83.7771 41 85C40.7692 86.3475 40.5885 87.7038 40.4375 89.0625C40.2931 90.3619 40.1487 91.6613 40 93C37 92 37 92 35.8672 90.1094C35.5398 89.3308 35.2123 88.5522 34.875 87.75C34.5424 86.9817 34.2098 86.2134 33.8672 85.4219C31.9715 80.1277 31.7884 75.065 31.75 69.5C31.7294 68.7536 31.7087 68.0073 31.6875 67.2383C31.6551 62.6607 32.0474 59.7266 35 56C38.4726 54.2637 42.2119 54.3981 46 55Z'
fill='#FAFAFA'
/>
<path
d='M97 13C97.66 13.33 98.32 13.66 99 14C99.0297 15.8781 99.0297 15.8781 99.0601 17.7942C99.4473 46.9184 99.4473 46.9184 100.937 76C101.012 77.0574 101.087 78.1149 101.164 79.2043C101.566 84.1265 102.275 88.3364 104 93C103.625 95.375 103.625 95.375 103 97C102.361 96.2781 101.721 95.5563 101.062 94.8125C94.4402 88.1902 85.5236 84.8401 76.2891 84.5859C75.0451 84.5473 73.8012 84.5086 72.5195 84.4688C71.2343 84.4378 69.9491 84.4069 68.625 84.375C66.6624 84.317 66.6624 84.317 64.6601 84.2578C61.4402 84.1638 58.2203 84.0781 55 84C55 83.67 55 83.34 55 83C58.9087 82.7294 62.8179 82.4974 66.7309 82.2981C68.7007 82.1902 70.6688 82.0535 72.6367 81.916C82.854 81.4233 90.4653 83.3102 99 89C98.9091 88.0729 98.8182 87.1458 98.7246 86.1907C96.96 67.8915 95.697 49.7051 95.75 31.3125C95.751 30.5016 95.7521 29.6908 95.7532 28.8554C95.7901 15.4198 95.7901 15.4198 97 13Z'
fill='#423B28'
/>
<path
d='M91 0.999996C94.3999 3.06951 96.8587 5.11957 98 9C97.625 12.25 97.625 12.25 97 15C95.804 12.6081 94.6146 10.2139 93.4375 7.8125C92.265 5.16236 92.265 5.16236 91 4C88.074 3.7122 85.8483 3.51695 83 4C79.1128 7.37574 78.178 11.0991 77 16C76.8329 18.5621 76.7615 21.1317 76.7695 23.6992C76.77 24.4155 76.7704 25.1318 76.7709 25.8698C76.7739 27.3783 76.7817 28.8868 76.7942 30.3953C76.8123 32.664 76.8147 34.9324 76.8144 37.2012C76.8329 44.6001 77.0765 51.888 77.7795 59.259C78.1413 63.7564 78.1068 68.2413 78.0625 72.75C78.058 73.6498 78.0535 74.5495 78.0488 75.4766C78.0373 77.6511 78.0193 79.8255 78 82C78.99 82.495 78.99 82.495 80 83C68.78 83.33 57.56 83.66 46 84C46.495 83.01 46.495 83.01 47 82C52.9349 80.7196 58.8909 80.8838 64.9375 80.9375C65.9075 80.942 66.8775 80.9465 67.8769 80.9512C70.2514 80.9629 72.6256 80.9793 75 81C75.0544 77.9997 75.0939 75.0005 75.125 72C75.1418 71.1608 75.1585 70.3216 75.1758 69.457C75.2185 63.9475 74.555 59.2895 73 54C73.66 54 74.32 54 75 54C74.9314 53.2211 74.8629 52.4422 74.7922 51.6396C74.1158 43.5036 73.7568 35.4131 73.6875 27.25C73.644 25.5194 73.644 25.5194 73.5996 23.7539C73.5376 15.3866 74.6189 8.85069 80.25 2.4375C83.9433 0.506911 86.9162 0.173322 91 0.999996Z'
fill='#131311'
/>
<path
d='M15 24C20.2332 26.3601 22.1726 29.3732 24.1875 34.5195C26.8667 42.6988 27.2651 50.4282 27 59C26.67 59 26.34 59 26 59C25.8945 58.436 25.7891 57.8721 25.6804 57.291C25.1901 54.6926 24.6889 52.0963 24.1875 49.5C24.0218 48.6131 23.8562 47.7262 23.6855 46.8125C21.7568 35.5689 21.7568 35.5689 15 27C12.0431 26.2498 12.0431 26.2498 8.99999 27C5.97965 28.9369 5.97965 28.9369 3.99999 32C3.67226 36.9682 4.31774 41.4911 5.27733 46.3594C5.40814 47.0304 5.53894 47.7015 5.67371 48.3929C5.94892 49.7985 6.22723 51.2035 6.50854 52.6079C6.93887 54.7569 7.35989 56.9075 7.77929 59.0586C9.09359 66.104 9.09359 66.104 11 73C11.0836 75.2109 11.1073 77.4243 11.0976 79.6367C11.0944 80.9354 11.0912 82.2342 11.0879 83.5723C11.0795 84.944 11.0711 86.3158 11.0625 87.6875C11.0575 89.071 11.0529 90.4544 11.0488 91.8379C11.037 95.2253 11.0206 98.6126 11 102C8.54975 99.5498 8.73228 98.8194 8.65624 95.4492C8.62812 94.53 8.60001 93.6108 8.57104 92.6638C8.54759 91.6816 8.52415 90.6994 8.49999 89.6875C8.20265 81.3063 7.58164 73.2485 5.99999 65C5.67135 63.2175 5.34327 61.435 5.01562 59.6523C4.31985 55.9098 3.62013 52.1681 2.90233 48.4297C2.75272 47.6484 2.60311 46.867 2.44897 46.062C1.99909 43.8187 1.99909 43.8187 0.999995 41C0.505898 36.899 0.0476353 32.7768 2.04687 29.0469C6.06003 24.1839 8.81126 23.4843 15 24Z'
fill='#2A2311'
/>
<path
d='M11 82C11.33 82 11.66 82 12 82C12.0146 82.6118 12.0292 83.2236 12.0442 83.854C11.5946 115.845 11.5946 115.845 24.0625 143.875C30.0569 149.404 36.9894 152.617 45 154C42 156 42 156 39.4375 156C29.964 153.244 20.8381 146.677 16 138C8.26993 120.062 9.92611 101.014 11 82Z'
fill='#272214'
/>
<path
d='M68 49C70.3478 50.1116 71.9703 51.3346 74 53C73.34 53.66 72.68 54.32 72 55C71.505 54.505 71.01 54.01 70.5 53.5C67.6718 51.8031 65.3662 51.5622 62.0976 51.4062C58.4026 52.4521 57.1992 53.8264 55 57C54.3826 61.2861 54.5302 65.4938 54.6875 69.8125C54.7101 70.9823 54.7326 72.1521 54.7559 73.3574C54.8147 76.2396 54.8968 79.1191 55 82C54.01 82 53.02 82 52 82C51.9854 81.4203 51.9708 80.8407 51.9558 80.2434C51.881 77.5991 51.7845 74.9561 51.6875 72.3125C51.6649 71.4005 51.6424 70.4885 51.6191 69.5488C51.4223 64.6292 51.2621 60.9548 48 57C45.6603 55.8302 44.1661 55.8339 41.5625 55.8125C40.78 55.7983 39.9976 55.7841 39.1914 55.7695C36.7079 55.8591 36.7079 55.8591 34 58C32.7955 60.5518 32.7955 60.5518 32 63C31.34 63 30.68 63 30 63C30.2839 59.6879 31.0332 57.9518 32.9375 55.1875C36.7018 52.4987 38.9555 52.3484 43.4844 52.5586C47.3251 53.2325 49.8148 54.7842 53 57C53.0928 56.1338 53.0928 56.1338 53.1875 55.25C55.6091 48.544 61.7788 47.8649 68 49Z'
fill='#1F1A0F'
/>
<path
d='M99 60C99.33 60 99.66 60 100 60C100.05 60.7865 100.1 61.573 100.152 62.3833C100.385 65.9645 100.63 69.5447 100.875 73.125C100.954 74.3625 101.032 75.6 101.113 76.875C101.197 78.0738 101.281 79.2727 101.367 80.5078C101.44 81.6075 101.514 82.7073 101.589 83.8403C102.013 87.1 102.94 89.8988 104 93C103.625 95.375 103.625 95.375 103 97C102.361 96.2781 101.721 95.5563 101.062 94.8125C94.4402 88.1902 85.5236 84.8401 76.2891 84.5859C74.4231 84.5279 74.4231 84.5279 72.5195 84.4688C71.2343 84.4378 69.9491 84.4069 68.625 84.375C67.3166 84.3363 66.0082 84.2977 64.6601 84.2578C61.4402 84.1638 58.2203 84.0781 55 84C55 83.67 55 83.34 55 83C58.9087 82.7294 62.8179 82.4974 66.7309 82.2981C68.7007 82.1902 70.6688 82.0535 72.6367 81.916C82.854 81.4233 90.4653 83.3102 99 89C98.9162 87.912 98.8324 86.8241 98.7461 85.7031C98.1266 77.012 97.9127 68.6814 99 60Z'
fill='#332E22'
/>
<path
d='M15 24C20.2332 26.3601 22.1726 29.3732 24.1875 34.5195C26.8667 42.6988 27.2651 50.4282 27 59C26.67 59 26.34 59 26 59C25.8945 58.436 25.7891 57.8721 25.6804 57.291C25.1901 54.6926 24.6889 52.0963 24.1875 49.5C24.0218 48.6131 23.8562 47.7262 23.6855 46.8125C21.7568 35.5689 21.7568 35.5689 15 27C12.0431 26.2498 12.0431 26.2498 8.99999 27C5.2818 29.7267 4.15499 31.2727 3.18749 35.8125C3.12562 36.8644 3.06374 37.9163 2.99999 39C2.33999 39 1.67999 39 0.999992 39C0.330349 31.2321 0.330349 31.2321 3.37499 27.5625C7.31431 23.717 9.51597 23.543 15 24Z'
fill='#1D180A'
/>
<path
d='M91 0.999996C94.3999 3.06951 96.8587 5.11957 98 9C97.625 12.25 97.625 12.25 97 15C95.804 12.6081 94.6146 10.2139 93.4375 7.8125C92.265 5.16236 92.265 5.16236 91 4C85.4345 3.33492 85.4345 3.33491 80.6875 5.75C78.5543 9.85841 77.6475 13.9354 76.7109 18.4531C76.4763 19.2936 76.2417 20.1341 76 21C75.34 21.33 74.68 21.66 74 22C73.5207 15.4102 74.5846 10.6998 78 5C81.755 0.723465 85.5463 -0.103998 91 0.999996Z'
fill='#16130D'
/>
<path
d='M42 93C42.5569 93.7631 43.1137 94.5263 43.6875 95.3125C46.4238 98.4926 48.7165 100.679 53.0105 101.282C55.3425 101.411 57.6646 101.473 60 101.5C70.6207 101.621 70.6207 101.621 75 106C75.0406 107.666 75.0427 109.334 75 111C74.34 111 73.68 111 73 111C72.7112 110.196 72.4225 109.391 72.125 108.562C71.2674 105.867 71.2674 105.867 69 105C65.3044 104.833 61.615 104.703 57.916 104.658C52.1631 104.454 48.7484 103.292 44 100C41.5625 97.25 41.5625 97.25 40 95C40.66 95 41.32 95 42 95C42 94.34 42 93.68 42 93Z'
fill='#2B2B2B'
/>
<path
d='M11 82C11.33 82 11.66 82 12 82C12.1682 86.6079 12.3287 91.216 12.4822 95.8245C12.5354 97.3909 12.5907 98.9574 12.6482 100.524C12.7306 102.78 12.8055 105.036 12.8789 107.293C12.9059 107.989 12.933 108.685 12.9608 109.402C13.0731 113.092 12.9015 116.415 12 120C11.67 120 11.34 120 11 120C9.63778 112.17 10.1119 104.4 10.4375 96.5C10.4908 95.0912 10.5436 93.6823 10.5957 92.2734C10.7247 88.8487 10.8596 85.4243 11 82Z'
fill='#4D483B'
/>
<path
d='M43.4844 52.5586C47.3251 53.2325 49.8148 54.7842 53 57C52 59 52 59 50 60C49.5256 59.34 49.0512 58.68 48.5625 58C45.2656 55.4268 43.184 55.5955 39.1211 55.6641C36.7043 55.8955 36.7043 55.8955 34 58C32.7955 60.5518 32.7955 60.5518 32 63C31.34 63 30.68 63 30 63C30.2839 59.6879 31.0332 57.9518 32.9375 55.1875C36.7018 52.4987 38.9555 52.3484 43.4844 52.5586Z'
fill='#221F16'
/>
<path
d='M76 73C76.33 73 76.66 73 77 73C77 75.97 77 78.94 77 82C78.485 82.495 78.485 82.495 80 83C68.78 83.33 57.56 83.66 46 84C46.33 83.34 46.66 82.68 47 82C52.9349 80.7196 58.8909 80.8838 64.9375 80.9375C65.9075 80.942 66.8775 80.9465 67.8769 80.9512C70.2514 80.9629 72.6256 80.9793 75 81C75.33 78.36 75.66 75.72 76 73Z'
fill='#040404'
/>
<path
d='M27 54C27.33 54 27.66 54 28 54C28.33 56.97 28.66 59.94 29 63C29.99 63 30.98 63 32 63C32 66.96 32 70.92 32 75C31.01 74.67 30.02 74.34 29 74C28.8672 73.2523 28.7344 72.5047 28.5977 71.7344C28.421 70.7495 28.2444 69.7647 28.0625 68.75C27.8885 67.7755 27.7144 66.8009 27.5352 65.7969C27.0533 63.087 27.0533 63.087 26.4062 60.8125C25.8547 58.3515 26.3956 56.4176 27 54Z'
fill='#434039'
/>
<path
d='M78 5C78.99 5.33 79.98 5.66 81 6C80.3194 6.92812 80.3194 6.92812 79.625 7.875C77.7233 11.532 77.1555 14.8461 76.5273 18.8906C76.3533 19.5867 76.1793 20.2828 76 21C75.34 21.33 74.68 21.66 74 22C73.5126 15.2987 74.9229 10.9344 78 5Z'
fill='#2A2313'
/>
<path
d='M12 115C12.99 115.495 12.99 115.495 14 116C14.5334 118.483 14.9326 120.864 15.25 123.375C15.3531 124.061 15.4562 124.747 15.5625 125.453C16.0763 129.337 16.2441 130.634 14 134C12.6761 127.57 11.752 121.571 12 115Z'
fill='#2F2C22'
/>
<path
d='M104 95C107 98 107 98 107.363 101.031C107.347 102.176 107.33 103.321 107.312 104.5C107.309 105.645 107.305 106.789 107.301 107.969C107 111 107 111 105 114C104.67 107.73 104.34 101.46 104 95Z'
fill='#120F05'
/>
<path
d='M56 103C58.6048 102.919 61.2071 102.86 63.8125 102.812C64.5505 102.787 65.2885 102.762 66.0488 102.736C71.4975 102.662 71.4975 102.662 74 104.344C75.374 106.619 75.2112 108.396 75 111C74.34 111 73.68 111 73 111C72.7112 110.196 72.4225 109.391 72.125 108.562C71.2674 105.867 71.2674 105.867 69 105C66.7956 104.77 64.5861 104.589 62.375 104.438C61.1865 104.354 59.998 104.27 58.7734 104.184C57.4006 104.093 57.4006 104.093 56 104C56 103.67 56 103.34 56 103Z'
fill='#101010'
/>
<path
d='M23 40C23.66 40 24.32 40 25 40C27.3084 46.3482 27.1982 52.2948 27 59C26.67 59 26.34 59 26 59C25.01 52.73 24.02 46.46 23 40Z'
fill='#191409'
/>
<path
d='M47 83C46.3606 83.3094 45.7212 83.6187 45.0625 83.9375C41.9023 87.0977 42.181 90.6833 42 95C41.01 94.67 40.02 94.34 39 94C39.3463 85.7409 39.3463 85.7409 41.875 82.875C44 82 44 82 47 83Z'
fill='#171717'
/>
<path
d='M53 61C53.33 61 53.66 61 54 61C54.33 67.93 54.66 74.86 55 82C54.01 82 53.02 82 52 82C52.33 75.07 52.66 68.14 53 61Z'
fill='#444444'
/>
<path
d='M81 154C78.6696 156.33 77.8129 156.39 74.625 156.75C73.4687 156.897 73.4687 156.897 72.2891 157.047C69.6838 156.994 68.2195 156.317 66 155C67.7478 154.635 69.4984 154.284 71.25 153.938C72.7118 153.642 72.7118 153.642 74.2031 153.34C76.8681 153.016 78.4887 153.145 81 154Z'
fill='#332F23'
/>
<path
d='M19 28C19.66 28 20.32 28 21 28C21.6735 29.4343 22.3386 30.8726 23 32.3125C23.5569 33.5133 23.5569 33.5133 24.125 34.7383C25 37 25 37 25 40C22 39 22 39 21.0508 37.2578C20.8071 36.554 20.5635 35.8502 20.3125 35.125C20.0611 34.4263 19.8098 33.7277 19.5508 33.0078C19 31 19 31 19 28Z'
fill='#282213'
/>
<path
d='M102 87C104.429 93.2857 104.429 93.2857 103 97C100.437 94.75 100.437 94.75 98 92C98.0625 89.75 98.0625 89.75 99 88C101 87 101 87 102 87Z'
fill='#37301F'
/>
<path
d='M53 56C53.33 56 53.66 56 54 56C53.67 62.27 53.34 68.54 53 75C52.67 75 52.34 75 52 75C51.7788 72.2088 51.5726 69.4179 51.375 66.625C51.3105 65.8309 51.2461 65.0369 51.1797 64.2188C51.0394 62.1497 51.0124 60.0737 51 58C51.66 57.34 52.32 56.68 53 56Z'
fill='#030303'
/>
<path
d='M100 129C100.33 129 100.66 129 101 129C100.532 133.776 99.7567 137.045 97 141C96.34 140.67 95.68 140.34 95 140C96.65 136.37 98.3 132.74 100 129Z'
fill='#1E1A12'
/>
<path
d='M15 131C17.7061 132.353 17.9618 133.81 19.125 136.562C19.4782 137.389 19.8314 138.215 20.1953 139.066C20.4609 139.704 20.7264 140.343 21 141C20.01 141 19.02 141 18 141C15.9656 137.27 15 135.331 15 131Z'
fill='#1C1912'
/>
<path
d='M63 49C69.4 49.4923 69.4 49.4923 72.4375 52.0625C73.2109 53.0216 73.2109 53.0216 74 54C70.8039 54 69.5828 53.4533 66.8125 52C66.0971 51.6288 65.3816 51.2575 64.6445 50.875C64.1018 50.5863 63.5591 50.2975 63 50C63 49.67 63 49.34 63 49Z'
fill='#13110C'
/>
<path
d='M0.999992 39C1.98999 39 2.97999 39 3.99999 39C5.24999 46.625 5.24999 46.625 2.99999 50C2.33999 46.37 1.67999 42.74 0.999992 39Z'
fill='#312C1E'
/>
<path
d='M94 5C94.66 5 95.32 5 96 5C97.8041 7.75924 98.0127 8.88972 97.625 12.25C97.4187 13.1575 97.2125 14.065 97 15C95.1161 11.7345 94.5071 8.71888 94 5Z'
fill='#292417'
/>
<path
d='M20 141C23.3672 142.393 24.9859 143.979 27 147C24.625 146.812 24.625 146.812 22 146C20.6875 143.438 20.6875 143.438 20 141Z'
fill='#373328'
/>
<path
d='M86 83C86.33 83.99 86.66 84.98 87 86C83.37 85.34 79.74 84.68 76 84C80.3553 81.8223 81.4663 81.9696 86 83Z'
fill='#2F2F2F'
/>
<path
d='M42 93C46 97.625 46 97.625 46 101C44.02 99.35 42.04 97.7 40 96C40.66 95.67 41.32 95.34 42 95C42 94.34 42 93.68 42 93Z'
fill='#232323'
/>
<path
d='M34 55C34.66 55.33 35.32 55.66 36 56C35.5256 56.7838 35.0512 57.5675 34.5625 58.375C33.661 59.8895 32.7882 61.4236 32 63C31.34 63 30.68 63 30 63C30.4983 59.3125 31.1007 57.3951 34 55Z'
fill='#110F0A'
d='M29 7.54605C29 9.47222 28.316 11.1378 26.9481 12.5428C25.5802 13.9251 23.5852 14.9222 20.9634 15.534C22.377 15.9192 23.4484 16.5537 24.1781 17.4375C24.9077 18.2987 25.2724 19.2956 25.2724 20.4287C25.2724 22.2189 24.7025 23.7713 23.5625 25.0855C22.4454 26.3998 20.8039 27.4195 18.638 28.1447C16.4721 28.8472 13.8616 29.1985 10.8066 29.1985C9.66666 29.1985 8.75472 29.1645 8.07075 29.0965C8.04796 29.7309 7.77438 30.2068 7.25 30.5241C6.72562 30.8414 6.05307 31 5.23231 31C4.41156 31 3.84159 30.8187 3.52241 30.4561C3.22603 30.0936 3.10062 29.561 3.14623 28.8586C3.35141 25.686 3.75039 22.3662 4.34316 18.8991C4.93593 15.4094 5.68829 12.0442 6.60024 8.80373C6.75982 8.23721 7.07901 7.84064 7.55778 7.61404C8.03656 7.38743 8.66353 7.27412 9.43868 7.27412C10.8294 7.27412 11.5248 7.65936 11.5248 8.42983C11.5248 8.74708 11.4564 9.10965 11.3196 9.51754C10.7268 11.2851 10.134 13.6871 9.54127 16.7237C8.9485 19.7375 8.52674 22.6156 8.27594 25.3575C9.37028 25.448 10.2594 25.4934 10.9434 25.4934C14.1352 25.4934 16.4721 25.0401 17.954 24.1338C19.4587 23.2046 20.2111 22.0263 20.2111 20.5987C20.2111 19.6016 19.778 18.7632 18.9116 18.0833C18.0681 17.4035 16.6431 17.0296 14.6368 16.9616C14.1808 16.939 13.8616 16.8257 13.6792 16.6217C13.4968 16.4178 13.4057 16.0892 13.4057 15.636C13.4057 14.9788 13.5425 14.4463 13.816 14.0384C14.0896 13.6305 14.5912 13.4152 15.3208 13.3925C16.9395 13.3472 18.3986 13.1093 19.6981 12.6787C21.0204 12.2482 22.0578 11.6477 22.8101 10.8772C23.5625 10.0841 23.9387 9.1663 23.9387 8.1239C23.9387 6.80958 23.2889 5.77851 21.9894 5.0307C20.6899 4.26024 18.6949 3.875 16.0047 3.875C13.5652 3.875 11.2056 4.19226 8.92571 4.82676C6.64584 5.4386 4.70793 6.2204 3.11203 7.17215C2.38246 7.6027 1.7669 7.81798 1.26533 7.81798C0.854953 7.81798 0.53577 7.68202 0.307783 7.41009C0.102594 7.1155 0 6.75292 0 6.32237C0 5.75585 0.113994 5.26864 0.341981 4.86075C0.592768 4.45285 1.17414 3.98831 2.08608 3.46711C4.00118 2.37939 6.24685 1.52961 8.82311 0.917763C11.3994 0.305921 14.0326 0 16.7229 0C20.8494 0 23.9272 0.691156 25.9564 2.07347C27.9855 3.45577 29 5.27998 29 7.54605Z'
fill='currentColor'
/>
</svg>
)
@@ -1842,13 +1824,11 @@ export function ElevenLabsIcon(props: SVGProps<SVGSVGElement>) {
export function LinkupIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'>
<g transform='translate(12, 12) scale(1.3) translate(-12, -12)'>
<path
d='M20.2 14.1c-.4-.3-1.6-.4-2.9-.2.5-1.4 1.3-3.9.1-5-.6-.5-1.5-.7-2.6-.5-.3 0-.6.1-1 .2-1.1-1.6-2.4-2.5-3.8-2.5-1.6 0-3.1 1-4.1 2.9-1.2 2.1-1.9 5.1-1.9 8.8v.03l.4.3c3-.9 7.5-2.3 10.7-2.9 0 .9.1 1.9.1 2.8v.03l.4.3c.1 0 5.4-1.7 5.3-3.3 0-.2-.1-.5-.3-.7zM19.9 14.7c.03.4-1.7 1.4-4 2.3.5-.7 1-1.6 1.3-2.5 1.4-.1 2.4-.1 2.7.2zM16.4 14.6c-.3.7-.7 1.4-1.2 2-.02-.6-.1-1.2-.2-1.8.4-.1.9-.1 1.4-.2zM16.5 9.4c.8.7.9 2.4.1 5.1-.5.1-1 .1-1.5.2-.3-2-.9-3.8-1.7-5.3.3-.1.6-.2.8-.2.9-.1 1.7.05 2.3.2zM9.5 6.8c1.2 0 2.3.7 3.2 2.1-2.8 1.1-5.9 3.4-8.4 7.8.2-5.1 1.9-9.9 5.2-9.9zM4.7 17c3.4-4.9 6.4-6.8 8.4-7.8.7 1.3 1.2 2.9 1.5 4.8-3.2.6-7.3 1.8-9.9 3z'
fill='#000000'
/>
</g>
<svg {...props} xmlns='http://www.w3.org/2000/svg' viewBox='0 0 154 107' fill='none'>
<path
d='M150.677 72.7113C146.612 70.2493 137.909 69.542 124.794 70.6076C128.992 57.6776 133.757 35.3911 121.323 25.1527C115.886 20.6743 107.471 19.0437 97.6162 20.5594C94.6758 21.0142 91.5752 21.7445 88.3878 22.732C78.8667 8.28165 66.2954 0 53.8613 0C39.4288 0 26.1304 9.3381 16.4081 26.2872C5.67515 45.014 0 71.9626 0 104.23V104.533L3.60356 106.94L3.88251 106.825C30.5754 95.5628 67.5759 85.0718 100.593 79.4037C101.604 87.644 102.116 95.9945 102.116 104.235V104.52L105.491 107L105.761 106.913C106.255 106.752 155.159 90.8822 153.979 77.5894C153.856 76.2022 153.183 74.2271 150.677 72.7113ZM148.409 78.09C148.715 81.5442 133.236 91.0568 111.838 98.8883C115.968 92.0995 119.818 84.1715 122.777 76.3584C135.659 75.1411 144.531 75.5545 147.792 77.5296C148.377 77.8833 148.409 78.09 148.409 78.09ZM116.668 77.0106C114.084 83.3769 110.951 89.6329 107.54 95.2458C107.334 89.5135 106.913 83.8821 106.296 78.4621C109.922 77.8971 113.407 77.4102 116.668 77.0106ZM117.774 29.4979C125.379 35.7585 125.782 51.3205 118.867 71.1772C114.747 71.6319 110.284 72.2382 105.596 72.9777C103.049 55.1742 98.2839 39.966 91.4243 27.7525C94.566 26.8155 96.9669 26.3469 98.4622 26.1127C106.721 24.8404 113.581 26.0438 117.774 29.4979ZM53.8567 5.62215C65.0561 5.62215 74.8882 12.0022 83.0922 24.5923C57.7027 34.5413 30.3193 59.4092 5.78032 94.8003C7.43119 51.4813 23.0299 5.62215 53.8613 5.62215M10.1933 98.2406C40.7504 53.9341 68.2024 36.4429 86.0739 29.5852C92.4487 41.2383 97.2046 56.5522 99.8433 73.9331C70.5209 79.0316 35.6377 88.4983 10.1933 98.2406Z'
fill='#000000'
/>
</svg>
)
}
@@ -2357,6 +2337,17 @@ export function OutlookIcon(props: SVGProps<SVGSVGElement>) {
)
}
export function PagerDutyIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64' fill='none'>
<path
d='M6.704 59.217H0v-33.65c0-3.455 1.418-5.544 2.604-6.704 2.63-2.58 6.2-2.656 6.782-2.656h10.546c3.765 0 5.93 1.52 7.117 2.8 2.346 2.553 2.372 5.853 2.32 6.73v12.687c0 3.662-1.496 5.828-2.733 6.988-2.553 2.398-5.93 2.45-6.73 2.424H6.704zm13.46-18.102c.36 0 1.367-.103 1.908-.62.413-.387.62-1.083.62-2.1v-13.02c0-.36-.077-1.315-.593-1.857-.5-.516-1.444-.62-2.166-.62h-10.6c-2.63 0-2.63 1.985-2.63 2.656v15.55zM57.296 4.783H64V38.46c0 3.455-1.418 5.544-2.604 6.704-2.63 2.58-6.2 2.656-6.782 2.656H44.068c-3.765 0-5.93-1.52-7.117-2.8-2.346-2.553-2.372-5.853-2.32-6.73V25.62c0-3.662 1.496-5.828 2.733-6.988 2.553-2.398 5.93-2.45 6.73-2.424h13.202zM43.836 22.9c-.36 0-1.367.103-1.908.62-.413.387-.62 1.083-.62 2.1v13.02c0 .36.077 1.315.593 1.857.5.516 1.444.62 2.166.62h10.598c2.656-.026 2.656-2 2.656-2.682V22.9z'
fill='#FFFFFF'
/>
</svg>
)
}
export function MicrosoftExcelIcon(props: SVGProps<SVGSVGElement>) {
const id = useId()
const gradientId = `excel_gradient_${id}`
@@ -2891,6 +2882,19 @@ export function QdrantIcon(props: SVGProps<SVGSVGElement>) {
)
}
export function AshbyIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} viewBox='0 0 254 260' fill='none' xmlns='http://www.w3.org/2000/svg'>
<path
fillRule='evenodd'
clipRule='evenodd'
d='M76.07 250.537v9.16H.343v-9.16c19.618 0 27.465-4.381 34.527-23.498l73.764-209.09h34.92l81.219 209.09c7.847 19.515 11.77 23.498 28.642 23.498v9.16H134.363v-9.16c28.242 0 30.625-2.582 22.14-23.498l-21.58-57.35H69.399l-19.226 56.155c-5.614 18.997-4.387 24.693 25.896 24.693zm24.326-171.653l-26.681 78.459h56.5l-29.819-78.459z'
fill='currentColor'
/>
</svg>
)
}
export function ArxivIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} id='logomark' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 17.732 24.269'>
@@ -3393,6 +3397,23 @@ export const ResendIcon = (props: SVGProps<SVGSVGElement>) => (
</svg>
)
export const GoogleBigQueryIcon = (props: SVGProps<SVGSVGElement>) => (
<svg {...props} xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'>
<path
d='M14.48 58.196L.558 34.082c-.744-1.288-.744-2.876 0-4.164L14.48 5.805c.743-1.287 2.115-2.08 3.6-2.082h27.857c1.48.007 2.845.8 3.585 2.082l13.92 24.113c.744 1.288.744 2.876 0 4.164L49.52 58.196c-.743 1.287-2.115 2.08-3.6 2.082H18.07c-1.483-.005-2.85-.798-3.593-2.082z'
fill='#4386fa'
/>
<path
d='M40.697 24.235s3.87 9.283-1.406 14.545-14.883 1.894-14.883 1.894L43.95 60.27h1.984c1.486-.002 2.858-.796 3.6-2.082L58.75 42.23z'
opacity='.1'
/>
<path
d='M45.267 43.23L41 38.953a.67.67 0 0 0-.158-.12 11.63 11.63 0 1 0-2.032 2.037.67.67 0 0 0 .113.15l4.277 4.277a.67.67 0 0 0 .947 0l1.12-1.12a.67.67 0 0 0 0-.947zM31.64 40.464a8.75 8.75 0 1 1 8.749-8.749 8.75 8.75 0 0 1-8.749 8.749zm-5.593-9.216v3.616c.557.983 1.363 1.803 2.338 2.375v-6.013zm4.375-2.998v9.772a6.45 6.45 0 0 0 2.338 0V28.25zm6.764 6.606v-2.142H34.85v4.5a6.43 6.43 0 0 0 2.338-2.368z'
fill='#fff'
/>
</svg>
)
export const GoogleVaultIcon = (props: SVGProps<SVGSVGElement>) => (
<svg {...props} xmlns='http://www.w3.org/2000/svg' viewBox='0 0 82 82'>
<path
@@ -3515,6 +3536,15 @@ export function TrelloIcon(props: SVGProps<SVGSVGElement>) {
)
}
export function AttioIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} xmlns='http://www.w3.org/2000/svg' viewBox='0 0 60.9 50' fill='currentColor'>
<path d='M60.3,34.8l-5.1-8.1c0,0,0,0,0,0L54.7,26c-0.8-1.2-2.1-1.9-3.5-1.9L43,24L42.5,25l-9.8,15.7l-0.5,0.9l4.1,6.6c0.8,1.2,2.1,1.9,3.5,1.9h11.5c1.4,0,2.8-0.7,3.5-1.9l0.4-0.6c0,0,0,0,0,0l5.1-8.2C61.1,37.9,61.1,36.2,60.3,34.8L60.3,34.8z M58.7,38.3l-5.1,8.2c0,0,0,0.1-0.1,0.1c-0.2,0.2-0.4,0.2-0.5,0.2c-0.1,0-0.4,0-0.6-0.3l-5.1-8.2c-0.1-0.1-0.1-0.2-0.2-0.3c0-0.1-0.1-0.2-0.1-0.3c-0.1-0.4-0.1-0.8,0-1.3c0.1-0.2,0.1-0.4,0.3-0.6l5.1-8.1c0,0,0,0,0,0c0.1-0.2,0.3-0.3,0.4-0.3c0.1,0,0.1,0,0.1,0c0,0,0,0,0.1,0c0.1,0,0.4,0,0.6,0.3l5.1,8.1C59.2,36.6,59.2,37.5,58.7,38.3L58.7,38.3z' />
<path d='M45.2,15.1c0.8-1.3,0.8-3.1,0-4.4l-5.1-8.1l-0.4-0.7C38.9,0.7,37.6,0,36.2,0H24.7c-1.4,0-2.7,0.7-3.5,1.9L0.6,34.9C0.2,35.5,0,36.3,0,37c0,0.8,0.2,1.5,0.6,2.2l5.5,8.8C6.9,49.3,8.2,50,9.7,50h11.5c1.4,0,2.8-0.7,3.5-1.9l0.4-0.7c0,0,0,0,0,0c0,0,0,0,0,0l4.1-6.6l12.1-19.4L45.2,15.1L45.2,15.1z M44,13c0,0.4-0.1,0.8-0.4,1.2L23.5,46.4c-0.2,0.3-0.5,0.3-0.6,0.3c-0.1,0-0.4,0-0.6-0.3l-5.1-8.2c-0.5-0.7-0.5-1.7,0-2.4L37.4,3.6c0.2-0.3,0.5-0.3,0.6-0.3c0.1,0,0.4,0,0.6,0.3l5.1,8.1C43.9,12.1,44,12.5,44,13z' />
</svg>
)
}
export function AsanaIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none'>
@@ -3859,6 +3889,28 @@ export function IntercomIcon(props: SVGProps<SVGSVGElement>) {
)
}
export function LoopsIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} viewBox='0 0 214 186' fill='none' xmlns='http://www.w3.org/2000/svg'>
<path
d='M122.19,0 H90.27 C40.51,0 0,39.88 0,92.95 C0,141.07 38.93,183.77 90.27,183.77 H122.19 C172.61,183.77 213.31,142.82 213.31,92.95 C213.31,43.29 173.09,0 122.19,0 Z M10.82,92.54 C10.82,50.19 45.91,11.49 91.96,11.49 C138.73,11.49 172.69,50.33 172.69,92.13 C172.69,117.76 154.06,139.09 129.02,143.31 C145.16,131.15 155.48,112.73 155.48,92.4 C155.48,59.09 127.44,28.82 92.37,28.82 C57.23,28.82 28.51,57.23 28.51,92.91 C28.51,122.63 43.61,151.08 69.99,168.21 L71.74,169.33 C35.99,161.39 10.82,130.11 10.82,92.54 Z M106.33,42.76 C128.88,50.19 143.91,68.92 143.91,92.26 C143.91,114.23 128.68,134.63 106.12,141.71 C105.44,141.96 105.17,141.96 105.17,141.96 C83.91,135.76 69.29,116.38 69.29,92.71 C69.29,69.91 83.71,50.33 106.33,42.76 Z M120.91,172.13 C76.11,172.13 40.09,137.21 40.09,93.32 C40.09,67.03 57.17,46.11 83.98,41.33 C67.04,53.83 57.3,71.71 57.3,92.71 C57.3,125.75 82.94,155.33 120.77,155.33 C155.01,155.33 184.31,125.2 184.31,92.47 C184.31,62.34 169.96,34.06 141.92,14.55 L141.65,14.34 C175.81,23.68 202.26,54.11 202.26,92.81 C202.26,135.69 166.38,172.13 120.91,172.13 Z'
fill='#FB5001'
/>
</svg>
)
}
export function LumaIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} fill='none' viewBox='0 0 133 134' xmlns='http://www.w3.org/2000/svg'>
<path
d='M133 67C96.282 67 66.5 36.994 66.5 0c0 36.994-29.782 67-66.5 67 36.718 0 66.5 30.006 66.5 67 0-36.994 29.782-67 66.5-67'
fill='#000000'
/>
</svg>
)
}
export function MailchimpIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg
@@ -4380,6 +4432,17 @@ export function SSHIcon(props: SVGProps<SVGSVGElement>) {
)
}
export function DatabricksIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} viewBox='0 0 241 266' fill='none' xmlns='http://www.w3.org/2000/svg'>
<path
d='M228.085 109.654L120.615 171.674L5.53493 105.41L0 108.475V156.582L120.615 225.911L228.085 164.128V189.596L120.615 251.615L5.53493 185.351L0 188.417V196.67L120.615 266L241 196.67V148.564L235.465 145.498L120.615 211.527L12.9148 149.743V124.275L120.615 186.059L241 116.729V69.3298L235.004 65.7925L120.615 131.585L18.4498 73.1028L120.615 14.3848L204.562 62.7269L211.942 58.4823V52.5869L120.615 0L0 69.3298V76.8759L120.615 146.206L228.085 84.1862V109.654Z'
fill='#FF3621'
/>
</svg>
)
}
export function DatadogIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'>
@@ -4392,6 +4455,161 @@ export function DatadogIcon(props: SVGProps<SVGSVGElement>) {
)
}
export function MicrosoftDataverseIcon(props: SVGProps<SVGSVGElement>) {
const id = useId()
const clip0 = `dataverse_clip0_${id}`
const clip1 = `dataverse_clip1_${id}`
const clip2 = `dataverse_clip2_${id}`
const paint0 = `dataverse_paint0_${id}`
const paint1 = `dataverse_paint1_${id}`
const paint2 = `dataverse_paint2_${id}`
const paint3 = `dataverse_paint3_${id}`
const paint4 = `dataverse_paint4_${id}`
const paint5 = `dataverse_paint5_${id}`
const paint6 = `dataverse_paint6_${id}`
return (
<svg
{...props}
width='96'
height='96'
viewBox='0 0 96 96'
fill='none'
xmlns='http://www.w3.org/2000/svg'
>
<g clipPath={`url(#${clip0})`}>
<g clipPath={`url(#${clip1})`}>
<g clipPath={`url(#${clip2})`}>
<path
d='M13.8776 21.8242C29.1033 8.13791 49.7501 8.1861 62.955 18.9134C74.9816 28.6836 77.4697 44.3159 70.851 55.7801C64.2321 67.2443 52.5277 70.1455 39.5011 62.6247L31.7286 76.087L31.7234 76.0862C27.4181 83.5324 17.8937 86.0828 10.4437 81.7817C7.45394 80.0556 5.25322 77.4879 3.96665 74.551L3.96096 74.5511C-4.07832 55.7804 0.200745 34.1184 13.8776 21.8242Z'
fill={`url(#${paint0})`}
/>
<path
d='M13.8776 21.8242C29.1033 8.13791 49.7501 8.1861 62.955 18.9134C74.9816 28.6836 77.4697 44.3159 70.851 55.7801C64.2321 67.2443 52.5277 70.1455 39.5011 62.6247L31.7286 76.087L31.7234 76.0862C27.4181 83.5324 17.8937 86.0828 10.4437 81.7817C7.45394 80.0556 5.25322 77.4879 3.96665 74.551L3.96096 74.5511C-4.07832 55.7804 0.200745 34.1184 13.8776 21.8242Z'
fill={`url(#${paint1})`}
fillOpacity='0.8'
/>
<path
d='M85.4327 14.2231C88.4528 15.9668 90.6686 18.569 91.9494 21.5433L91.9533 21.5444C99.9406 40.2943 95.6533 61.9068 81.9983 74.1814C66.7726 87.8677 46.1257 87.8196 32.9209 77.0923C20.8945 67.3221 18.4062 51.6897 25.0249 40.2256C31.6438 28.7614 43.3482 25.8601 56.3748 33.381L64.1434 19.9255L64.1482 19.9249C68.4516 12.4736 77.9805 9.92084 85.4327 14.2231Z'
fill={`url(#${paint2})`}
/>
<path
d='M85.4327 14.2231C88.4528 15.9668 90.6686 18.569 91.9494 21.5433L91.9533 21.5444C99.9406 40.2943 95.6533 61.9068 81.9983 74.1814C66.7726 87.8677 46.1257 87.8196 32.9209 77.0923C20.8945 67.3221 18.4062 51.6897 25.0249 40.2256C31.6438 28.7614 43.3482 25.8601 56.3748 33.381L64.1434 19.9255L64.1482 19.9249C68.4516 12.4736 77.9805 9.92084 85.4327 14.2231Z'
fill={`url(#${paint3})`}
fillOpacity='0.9'
/>
<path
d='M39.5041 62.6261C52.5307 70.1469 64.2352 67.2456 70.8541 55.7814C77.2488 44.7055 75.1426 29.7389 64.147 19.9271L56.3791 33.3814L39.5041 62.6261Z'
fill={`url(#${paint4})`}
/>
<path
d='M56.3794 33.3815C43.3528 25.8607 31.6482 28.762 25.0294 40.2262C18.6347 51.3021 20.7409 66.2687 31.7364 76.0806L39.5043 62.6262L56.3794 33.3815Z'
fill={`url(#${paint5})`}
/>
<path
d='M33.3215 56.4453C37.9837 64.5204 48.3094 67.2872 56.3846 62.625C64.4598 57.9628 67.2266 47.6371 62.5643 39.5619C57.9021 31.4867 47.5764 28.72 39.5013 33.3822C31.4261 38.0444 28.6593 48.3701 33.3215 56.4453Z'
fill={`url(#${paint6})`}
/>
</g>
</g>
</g>
<defs>
<radialGradient
id={paint0}
cx='0'
cy='0'
r='1'
gradientUnits='userSpaceOnUse'
gradientTransform='translate(46.0001 49.4996) rotate(-148.717) scale(46.2195 47.5359)'
>
<stop offset='0.465088' stopColor='#09442A' />
<stop offset='0.70088' stopColor='#136C6C' />
<stop offset='1' stopColor='#22918B' />
</radialGradient>
<radialGradient
id={paint1}
cx='0'
cy='0'
r='1'
gradientUnits='userSpaceOnUse'
gradientTransform='translate(50.0001 32.4996) rotate(123.57) scale(66.0095 46.5498)'
>
<stop offset='0.718705' stopColor='#1A7F7C' stopOpacity='0' />
<stop offset='1' stopColor='#16BBDA' />
</radialGradient>
<radialGradient
id={paint2}
cx='0'
cy='0'
r='1'
gradientUnits='userSpaceOnUse'
gradientTransform='translate(50.4999 44.5001) rotate(30.75) scale(45.9618 44.5095)'
>
<stop offset='0.358097' stopColor='#136C6C' />
<stop offset='0.789474' stopColor='#42B870' />
<stop offset='1' stopColor='#76D45E' />
</radialGradient>
<radialGradient
id={paint3}
cx='0'
cy='0'
r='1'
gradientTransform='matrix(42.5 -36.0002 31.1824 36.8127 49.4998 55.5001)'
gradientUnits='userSpaceOnUse'
>
<stop offset='0.583166' stopColor='#76D45E' stopOpacity='0' />
<stop offset='1' stopColor='#C8F5B7' />
</radialGradient>
<radialGradient
id={paint4}
cx='0'
cy='0'
r='1'
gradientUnits='userSpaceOnUse'
gradientTransform='translate(47.5 48) rotate(-58.9042) scale(32.6898)'
>
<stop offset='0.486266' stopColor='#22918B' />
<stop offset='0.729599' stopColor='#42B870' />
<stop offset='1' stopColor='#43E5CA' />
</radialGradient>
<radialGradient
id={paint5}
cx='0'
cy='0'
r='1'
gradientUnits='userSpaceOnUse'
gradientTransform='translate(47.3833 49.0077) rotate(119.859) scale(31.1328 29.4032)'
>
<stop offset='0.459553' stopColor='#08494E' />
<stop offset='0.742242' stopColor='#1A7F7C' />
<stop offset='1' stopColor='#309C61' />
</radialGradient>
<radialGradient
id={paint6}
cx='0'
cy='0'
r='1'
gradientUnits='userSpaceOnUse'
gradientTransform='translate(52.5 40) rotate(120.784) scale(27.3542)'
>
<stop stopColor='#C8F5B7' />
<stop offset='0.24583' stopColor='#98F0B0' />
<stop offset='0.643961' stopColor='#52D17C' />
<stop offset='1' stopColor='#119FC5' />
</radialGradient>
<clipPath id={clip0}>
<rect width='96' height='96' fill='white' />
</clipPath>
<clipPath id={clip1}>
<rect width='96' height='96' fill='white' />
</clipPath>
<clipPath id={clip2}>
<rect width='95.9998' height='96' fill='white' />
</clipPath>
</defs>
</svg>
)
}
export function KalshiIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} viewBox='0 0 78 20' fill='currentColor' xmlns='http://www.w3.org/2000/svg'>
@@ -4453,6 +4671,22 @@ export function GoogleGroupsIcon(props: SVGProps<SVGSVGElement>) {
)
}
export function GoogleMeetIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 87.5 72'>
<path fill='#00832d' d='M49.5 36l8.53 9.75 11.47 7.33 2-17.02-2-16.64-11.69 6.44z' />
<path fill='#0066da' d='M0 51.5V66c0 3.315 2.685 6 6 6h14.5l3-10.96-3-9.54-9.95-3z' />
<path fill='#e94235' d='M20.5 0L0 20.5l10.55 3 9.95-3 2.95-9.41z' />
<path fill='#2684fc' d='M20.5 20.5H0v31h20.5z' />
<path
fill='#00ac47'
d='M82.6 8.68L69.5 19.42v33.66l13.16 10.79c1.97 1.54 4.85.135 4.85-2.37V11c0-2.535-2.945-3.925-4.91-2.32zM49.5 36v15.5h-29V72h43c3.315 0 6-2.685 6-6V53.08z'
/>
<path fill='#ffba00' d='M63.5 0h-43v20.5h29V36l20-16.57V6c0-3.315-2.685-6-6-6z' />
</svg>
)
}
export function CursorIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} xmlns='http://www.w3.org/2000/svg' viewBox='0 0 546 546' fill='currentColor'>
@@ -4461,6 +4695,19 @@ export function CursorIcon(props: SVGProps<SVGSVGElement>) {
)
}
export function DubIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} viewBox='0 0 64 64' fill='none' xmlns='http://www.w3.org/2000/svg'>
<path
fillRule='evenodd'
clipRule='evenodd'
d='M32 64c17.673 0 32-14.327 32-32 0-11.844-6.435-22.186-16-27.719V48h-8v-2.14A15.9 15.9 0 0 1 32 48c-8.837 0-16-7.163-16-16s7.163-16 16-16c2.914 0 5.647.78 8 2.14V1.008A32 32 0 0 0 32 0C14.327 0 0 14.327 0 32s14.327 32 32 32'
fill='currentColor'
/>
</svg>
)
}
export function DuckDuckGoIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} xmlns='http://www.w3.org/2000/svg' viewBox='-108 -108 216 216'>
@@ -4573,6 +4820,17 @@ export function CirclebackIcon(props: SVGProps<SVGSVGElement>) {
)
}
export function GreenhouseIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} viewBox='0 0 51.4 107.7' xmlns='http://www.w3.org/2000/svg'>
<path
d='M44.9,32c0,5.2-2.2,9.8-5.8,13.4c-4,4-9.8,5-9.8,8.4c0,4.6,7.4,3.2,14.5,10.3c4.7,4.7,7.6,10.9,7.6,18.1c0,14.2-11.4,25.5-25.7,25.5S0,96.4,0,82.2C0,75,2.9,68.8,7.6,64.1c7.1-7.1,14.5-5.7,14.5-10.3c0-3.4-5.8-4.4-9.8-8.4c-3.6-3.6-5.8-8.2-5.8-13.6C6.5,21.4,15,13,25.4,13c2,0,3.8,0.3,5.3,0.3c2.7,0,4.1-1.2,4.1-3.1c0-1.1-0.5-2.5-0.5-4c0-3.4,2.9-6.2,6.4-6.2S47,2.9,47,6.4c0,3.7-2.9,5.4-5.1,6.2c-1.8,0.6-3.2,1.4-3.2,3.2C38.7,19.2,44.9,22.5,44.9,32z M42.9,82.2c0-9.9-7.3-17.9-17.2-17.9s-17.2,8-17.2,17.9c0,9.8,7.3,17.9,17.2,17.9S42.9,92,42.9,82.2z M37,31.8c0-6.3-5.1-11.5-11.3-11.5s-11.3,5.2-11.3,11.5s5.1,11.5,11.3,11.5S37,38.1,37,31.8z'
fill='currentColor'
/>
</svg>
)
}
export function GreptileIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'>
@@ -4794,6 +5052,26 @@ export function BedrockIcon(props: SVGProps<SVGSVGElement>) {
)
}
export function TableIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg
xmlns='http://www.w3.org/2000/svg'
viewBox='0 0 24 24'
fill='none'
stroke='currentColor'
strokeWidth={2}
strokeLinecap='round'
strokeLinejoin='round'
{...props}
>
<rect width='18' height='18' x='3' y='3' rx='2' />
<path d='M3 9h18' />
<path d='M3 15h18' />
<path d='M9 3v18' />
<path d='M15 3v18' />
</svg>
)
}
export function ReductoIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg
@@ -5224,6 +5502,63 @@ export function GoogleMapsIcon(props: SVGProps<SVGSVGElement>) {
)
}
export function GooglePagespeedIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} viewBox='-1.74 -1.81 285.55 266.85' xmlns='http://www.w3.org/2000/svg'>
<path
d='M272.73 37.23v179.68a18.58 18.58 0 0 1-18.57 18.59H18.65A18.58 18.58 0 0 1 .06 216.94V37.23z'
fill='#e1e1e1'
/>
<path
d='M18.65 0h235.5a18.58 18.58 0 0 1 18.58 18.56v18.67H.07V18.59A18.58 18.58 0 0 1 18.64 0z'
fill='#c2c2c2'
/>
<path
d='M136.3 92.96a99 99 0 0 0-99 99v.13c0 2.08-.12 4.64 0 6.2h43.25a54.87 54.87 0 0 1 0-6.2 55.81 55.81 0 0 1 85.06-47.45l31.12-31.12a98.76 98.76 0 0 0-60.44-20.57z'
fill='#4285f4'
/>
<path
d='M196.73 113.46l-31.14 31.14a55.74 55.74 0 0 1 26.56 47.45 54.87 54.87 0 0 1 0 6.2h43.39c.12-1.48 0-4.12 0-6.2a99 99 0 0 0-38.81-78.59z'
fill='#f44336'
/>
<circle cx='24.85' cy='18.59' fill='#eee' r='6.2' />
<circle cx='49.65' cy='18.59' fill='#eee' r='6.2' />
<path
d='M197.01 117.23a3.05 3.05 0 0 0 .59-1.81 3.11 3.11 0 0 0-3.1-3.1 3 3 0 0 0-1.91.68l-67.56 52a18.58 18.58 0 1 0 27.24 24.33l44.73-72.1z'
fill='#9e9e9e'
/>
</svg>
)
}
export function GoogleTranslateIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} xmlns='http://www.w3.org/2000/svg' viewBox='0 0 998.1 998.3'>
<path
fill='#DBDBDB'
d='M931.7 998.3c36.5 0 66.4-29.4 66.4-65.4V265.8c0-36-29.9-65.4-66.4-65.4H283.6l260.1 797.9h388z'
/>
<path
fill='#DCDCDC'
d='M931.7 230.4c9.7 0 18.9 3.8 25.8 10.6 6.8 6.7 10.6 15.5 10.6 24.8v667.1c0 9.3-3.7 18.1-10.6 24.8-6.9 6.8-16.1 10.6-25.8 10.6H565.5L324.9 230.4h606.8m0-30H283.6l260.1 797.9h388c36.5 0 66.4-29.4 66.4-65.4V265.8c0-36-29.9-65.4-66.4-65.4z'
/>
<polygon fill='#4352B8' points='482.3,809.8 543.7,998.3 714.4,809.8' />
<path
fill='#607988'
d='M936.1 476.1V437H747.6v-63.2h-61.2V437H566.1v39.1h239.4c-12.8 45.1-41.1 87.7-68.7 120.8-48.9-57.9-49.1-76.7-49.1-76.7h-50.8s2.1 28.2 70.7 108.6c-22.3 22.8-39.2 36.3-39.2 36.3l15.6 48.8s23.6-20.3 53.1-51.6c29.6 32.1 67.8 70.7 117.2 116.7l32.1-32.1c-52.9-48-91.7-86.1-120.2-116.7 38.2-45.2 77-102.1 85.2-154.2H936v.1z'
/>
<path
fill='#4285F4'
d='M66.4 0C29.9 0 0 29.9 0 66.5v677c0 36.5 29.9 66.4 66.4 66.4h648.1L454.4 0h-388z'
/>
<path
fill='#EEEEEE'
d='M371.4 430.6c-2.5 30.3-28.4 75.2-91.1 75.2-54.3 0-98.3-44.9-98.3-100.2s44-100.2 98.3-100.2c30.9 0 51.5 13.4 63.3 24.3l41.2-39.6c-27.1-25-62.4-40.6-104.5-40.6-86.1 0-156 69.9-156 156s69.9 156 156 156c90.2 0 149.8-63.3 149.8-152.6 0-12.8-1.6-22.2-3.7-31.8h-146v53.4l91 .1z'
/>
</svg>
)
}
export function DsPyIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} xmlns='http://www.w3.org/2000/svg' viewBox='30 28 185 175' fill='none'>
@@ -5517,3 +5852,116 @@ export function OnePasswordIcon(props: SVGProps<SVGSVGElement>) {
</svg>
)
}
export function VercelIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg
{...props}
viewBox='0 0 256 222'
xmlns='http://www.w3.org/2000/svg'
preserveAspectRatio='xMidYMid'
>
<g transform='translate(19.2 16.63) scale(0.85)'>
<polygon fill='#fafafa' points='128 0 256 221.705007 0 221.705007' />
</g>
</svg>
)
}
export function CloudflareIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'>
<path
fill='#f38020'
d='M331 326c11-26-4-38-19-38l-148-2c-4 0-4-6 1-7l150-2c17-1 37-15 43-33 0 0 10-21 9-24a97 97 0 0 0-187-11c-38-25-78 9-69 46-48 3-65 46-60 72 0 1 1 2 3 2h274c1 0 3-1 3-3z'
/>
<path
fill='#faae40'
d='M381 224c-4 0-6-1-7 1l-5 21c-5 16 3 30 20 31l32 2c4 0 4 6-1 7l-33 1c-36 4-46 39-46 39 0 2 0 3 2 3h113l3-2a81 81 0 0 0-78-103'
/>
</svg>
)
}
export function UpstashIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} xmlns='http://www.w3.org/2000/svg' viewBox='0 0 256 341' width='24' height='24'>
<path
fill='#00C98D'
d='M0 298.417c56.554 56.553 148.247 56.553 204.801 0c56.554-56.554 56.554-148.247 0-204.801l-25.6 25.6c42.415 42.416 42.415 111.185 0 153.6c-42.416 42.416-111.185 42.416-153.601 0z'
/>
<path
fill='#00C98D'
d='M51.2 247.216c28.277 28.277 74.123 28.277 102.4 0c28.277-28.276 28.277-74.123 0-102.4l-25.6 25.6c14.14 14.138 14.14 37.061 0 51.2c-14.138 14.139-37.061 14.139-51.2 0zM256 42.415c-56.554-56.553-148.247-56.553-204.8 0c-56.555 56.555-56.555 148.247 0 204.801l25.599-25.6c-42.415-42.415-42.415-111.185 0-153.6c42.416-42.416 111.185-42.416 153.6 0z'
/>
<path
fill='#00C98D'
d='M204.8 93.616c-28.276-28.277-74.124-28.277-102.4 0c-28.278 28.277-28.278 74.123 0 102.4l25.6-25.6c-14.14-14.138-14.14-37.061 0-51.2c14.138-14.139 37.06-14.139 51.2 0z'
/>
<path
fill='#FFF'
fillOpacity='.4'
d='M256 42.415c-56.554-56.553-148.247-56.553-204.8 0c-56.555 56.555-56.555 148.247 0 204.801l25.599-25.6c-42.415-42.415-42.415-111.185 0-153.6c42.416-42.416 111.185-42.416 153.6 0z'
/>
<path
fill='#FFF'
fillOpacity='.4'
d='M204.8 93.616c-28.276-28.277-74.124-28.277-102.4 0c-28.278 28.277-28.278 74.123 0 102.4l25.6-25.6c-14.14-14.138-14.14-37.061 0-51.2c14.138-14.139 37.06-14.139 51.2 0z'
/>
</svg>
)
}
export function RevenueCatIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg
{...props}
width='512'
height='512'
viewBox='0 0 512 512'
fill='none'
xmlns='http://www.w3.org/2000/svg'
>
<path
d='M95 109.774C110.152 106.108 133.612 104 154.795 104C212.046 104 246.32 123.928 246.32 174.646C246.32 205.746 233.737 226.264 214.005 237.437L261.765 318.946C258.05 321.632 250.035 323.176 238.864 323.176C226.282 323.176 217.987 321.672 211.982 318.946L172.225 248.3H167.645C157.789 248.305 147.945 247.601 138.18 246.192V319.255C134.172 321.672 127.022 323.176 116.73 323.176C106.73 323.176 99.2874 321.659 95 319.255V109.774ZM137.643 207.848C145.772 209.263 153.997 209.968 162.235 209.956C187.12 209.956 202.285 200.556 202.285 177.057C202.285 152.886 186.268 142.949 157.668 142.949C150.956 142.918 144.255 143.515 137.643 144.735V207.848Z'
fill='#FFFFFF'
/>
<path
d='M428.529 329.244C428.529 365.526 410.145 375.494 396.306 382.195C360.972 399.32 304.368 379.4 244.206 373.338C189.732 366.214 135.706 361.522 127.309 373.738C124.152 376.832 123.481 386.798 127.309 390.862C138.604 402.85 168.061 394.493 188.919 390.714C195.391 389.694 201.933 392.099 206.079 397.021C210.226 401.944 211.349 408.637 209.024 414.58C206.699 420.522 201.28 424.811 194.809 425.831C185.379 427.264 175.85 427.989 166.306 428C145.988 428 120.442 424.495 105.943 409.072C98.7232 401.4 91.3266 387.78 97.0271 366.465C107.875 326.074 172.807 336.052 248.033 343.633C300.41 348.907 357.23 366.465 379.934 350.343C385.721 346.234 396.517 337.022 390.698 329.244C384.879 321.467 375.353 325.684 362.838 325.684C300.152 325.684 263.238 285.302 263.238 217.916C263.247 167.292 284.176 131.892 318.287 115.09C333.109 107.789 350.421 104 369.587 104C386.292 104 403.269 106.931 414.11 113.366C420.847 123.032 423.778 140.305 422.306 153.201C408.247 146.466 395.36 142.949 378.669 142.949C337.365 142.949 308.947 164.039 308.947 214.985C308.947 265.932 337.065 286.149 376.611 286.149C387.869 286.035 403.1 284.67 422.306 282.053C426.455 297.498 428.529 313.228 428.529 329.244Z'
fill='#FFFFFF'
/>
</svg>
)
}
export function RedisIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg
{...props}
viewBox='0 0 512 512'
xmlns='http://www.w3.org/2000/svg'
fillRule='evenodd'
clipRule='evenodd'
strokeLinejoin='round'
strokeMiterlimit='2'
>
<path
d='M479.14 279.864c-34.584 43.578-71.94 93.385-146.645 93.385-66.73 0-91.59-58.858-93.337-106.672 14.62 30.915 43.203 55.949 87.804 54.792C412.737 318.6 471.53 241.127 471.53 170.57c0-84.388-62.947-145.262-172.24-145.262-78.165 0-175.004 29.743-238.646 76.782-.689 48.42 26.286 111.369 35.972 104.452 55.17-39.67 98.918-65.203 141.35-78.01C175.153 198.58 24.451 361.219 6 389.85c2.076 26.286 34.588 96.842 50.496 96.842 4.841 0 8.993-2.768 13.835-7.61 45.433-51.046 82.472-96.816 115.412-140.933 4.627 64.658 36.42 143.702 125.307 143.702 79.55 0 158.408-57.414 194.377-186.767 4.149-15.911-15.22-28.362-26.286-15.22zm-90.616-104.449c0 40.81-40.118 60.87-76.782 60.87-19.596 0-34.648-5.145-46.554-11.832 21.906-33.168 43.59-67.182 66.887-103.593 41.08 6.953 56.449 29.788 56.449 54.555z'
fill='#FFFFFF'
fillRule='nonzero'
/>
</svg>
)
}
export function HexIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1450.3 600'>
<path
fill='#EDB9B8'
fillRule='evenodd'
d='m250.11,0v199.49h-50V0H0v600h200.11v-300.69h50v300.69h200.18V0h-200.18Zm249.9,0v600h450.29v-250.23h-200.2v149h-50v-199.46h250.2V0h-450.29Zm200.09,199.49v-99.49h50v99.49h-50Zm550.02,0V0h200.18v150l-100,100.09,100,100.09v249.82h-200.18v-300.69h-50v300.69h-200.11v-249.82l100.11-100.09-100.11-100.09V0h200.11v199.49h50Z'
/>
</svg>
)
}

View File

@@ -1,12 +1,17 @@
'use client'
import Link from 'next/link'
import { usePathname } from 'next/navigation'
import { LanguageDropdown } from '@/components/ui/language-dropdown'
import { SearchTrigger } from '@/components/ui/search-trigger'
import { SimLogoFull } from '@/components/ui/sim-logo'
import { ThemeToggle } from '@/components/ui/theme-toggle'
import { cn } from '@/lib/utils'
export function Navbar() {
const pathname = usePathname()
const isApiReference = pathname.includes('/api-reference')
return (
<nav className='sticky top-0 z-50 border-border/50 border-b bg-background/80 backdrop-blur-md backdrop-saturate-150'>
{/* Desktop: Single row layout */}
@@ -31,16 +36,30 @@ export function Navbar() {
</div>
{/* Right cluster aligns with TOC edge */}
<div className='flex items-center gap-4'>
<div className='flex items-center gap-1'>
<Link
href='/introduction'
className={cn(
'rounded-xl px-3 py-2 font-normal text-[0.9375rem] leading-[1.4] transition-colors hover:bg-foreground/8 hover:text-foreground',
!isApiReference ? 'text-foreground' : 'text-foreground/60'
)}
>
Documentation
</Link>
<Link
href='/api-reference/getting-started'
className={cn(
'rounded-xl px-3 py-2 font-normal text-[0.9375rem] leading-[1.4] transition-colors hover:bg-foreground/8 hover:text-foreground',
isApiReference ? 'text-foreground' : 'text-foreground/60'
)}
>
API
</Link>
<Link
href='https://sim.ai'
target='_blank'
rel='noopener noreferrer'
className='rounded-xl px-3 py-2 font-normal text-[0.9375rem] text-foreground/60 leading-[1.4] transition-colors hover:bg-foreground/8 hover:text-foreground'
style={{
fontFamily:
'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif',
}}
>
Platform
</Link>

View File

@@ -25,8 +25,8 @@ export function StructuredData({
headline: title,
description: description,
url: url,
datePublished: dateModified || new Date().toISOString(),
dateModified: dateModified || new Date().toISOString(),
...(dateModified && { datePublished: dateModified }),
...(dateModified && { dateModified }),
author: {
'@type': 'Organization',
name: 'Sim Team',
@@ -74,7 +74,7 @@ export function StructuredData({
name: 'Sim Documentation',
url: baseUrl,
description:
'Comprehensive documentation for Sim visual workflow builder for AI applications. Create powerful AI agents, automation workflows, and data processing pipelines.',
'Documentation for Sim — the open-source platform to build AI agents and run your agentic workforce. Connect 1,000+ integrations and LLMs to deploy and orchestrate agentic workflows.',
publisher: {
'@type': 'Organization',
name: 'Sim',
@@ -91,12 +91,6 @@ export function StructuredData({
inLanguage: ['en', 'es', 'fr', 'de', 'ja', 'zh'],
}
const faqStructuredData = title.toLowerCase().includes('faq') && {
'@context': 'https://schema.org',
'@type': 'FAQPage',
mainEntity: [],
}
const softwareStructuredData = {
'@context': 'https://schema.org',
'@type': 'SoftwareApplication',
@@ -104,7 +98,7 @@ export function StructuredData({
applicationCategory: 'DeveloperApplication',
operatingSystem: 'Any',
description:
'Visual workflow builder for AI applications. Create powerful AI agents, automation workflows, and data processing pipelines by connecting blocks on a canvas—no coding required.',
'Sim is the open-source platform to build AI agents and run your agentic workforce. Connect 1,000+ integrations and LLMs to deploy and orchestrate agentic workflows. Create agents, workflows, knowledge bases, tables, and docs.',
url: baseUrl,
author: {
'@type': 'Organization',
@@ -115,12 +109,13 @@ export function StructuredData({
category: 'Developer Tools',
},
featureList: [
'Visual workflow builder with drag-and-drop interface',
'AI agent creation and automation',
'80+ built-in integrations',
'Real-time team collaboration',
'Multiple deployment options',
'Custom integrations via MCP protocol',
'AI agent creation',
'Agentic workflow orchestration',
'1,000+ integrations',
'LLM orchestration (OpenAI, Anthropic, Google, xAI, Mistral, Perplexity)',
'Knowledge base creation',
'Table creation',
'Document creation',
],
}
@@ -151,15 +146,6 @@ export function StructuredData({
}}
/>
)}
{faqStructuredData && (
<Script
id='faq-structured-data'
type='application/ld+json'
dangerouslySetInnerHTML={{
__html: JSON.stringify(faqStructuredData),
}}
/>
)}
{url === baseUrl && (
<Script
id='software-structured-data'

View File

@@ -8,24 +8,33 @@ import {
AhrefsIcon,
AirtableIcon,
AirweaveIcon,
AlgoliaIcon,
AmplitudeIcon,
ApifyIcon,
ApolloIcon,
ArxivIcon,
AsanaIcon,
AshbyIcon,
AttioIcon,
BrainIcon,
BrandfetchIcon,
BrowserUseIcon,
CalComIcon,
CalendlyIcon,
CirclebackIcon,
ClayIcon,
ClerkIcon,
CloudflareIcon,
ConfluenceIcon,
CursorIcon,
DatabricksIcon,
DatadogIcon,
DevinIcon,
DiscordIcon,
DocumentIcon,
DropboxIcon,
DsPyIcon,
DubIcon,
DuckDuckGoIcon,
DynamoDBIcon,
ElasticsearchIcon,
@@ -35,22 +44,33 @@ import {
EyeIcon,
FirecrawlIcon,
FirefliesIcon,
GammaIcon,
GithubIcon,
GitLabIcon,
GmailIcon,
GongIcon,
GoogleBigQueryIcon,
GoogleBooksIcon,
GoogleCalendarIcon,
GoogleContactsIcon,
GoogleDocsIcon,
GoogleDriveIcon,
GoogleFormsIcon,
GoogleGroupsIcon,
GoogleIcon,
GoogleMapsIcon,
GoogleMeetIcon,
GooglePagespeedIcon,
GoogleSheetsIcon,
GoogleSlidesIcon,
GoogleTasksIcon,
GoogleTranslateIcon,
GoogleVaultIcon,
GrafanaIcon,
GrainIcon,
GreenhouseIcon,
GreptileIcon,
HexIcon,
HubspotIcon,
HuggingFaceIcon,
HunterIOIcon,
@@ -66,10 +86,13 @@ import {
LinearIcon,
LinkedInIcon,
LinkupIcon,
LoopsIcon,
LumaIcon,
MailchimpIcon,
MailgunIcon,
MailServerIcon,
Mem0Icon,
MicrosoftDataverseIcon,
MicrosoftExcelIcon,
MicrosoftOneDriveIcon,
MicrosoftPlannerIcon,
@@ -84,6 +107,7 @@ import {
OpenAIIcon,
OutlookIcon,
PackageSearchIcon,
PagerDutyIcon,
ParallelIcon,
PerplexityIcon,
PineconeIcon,
@@ -95,8 +119,10 @@ import {
QdrantIcon,
RDSIcon,
RedditIcon,
RedisIcon,
ReductoIcon,
ResendIcon,
RevenueCatIcon,
S3Icon,
SalesforceIcon,
SearchIcon,
@@ -124,6 +150,8 @@ import {
TTSIcon,
TwilioIcon,
TypeformIcon,
UpstashIcon,
VercelIcon,
VideoIcon,
WealthboxIcon,
WebflowIcon,
@@ -144,22 +172,31 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
ahrefs: AhrefsIcon,
airtable: AirtableIcon,
airweave: AirweaveIcon,
algolia: AlgoliaIcon,
amplitude: AmplitudeIcon,
apify: ApifyIcon,
apollo: ApolloIcon,
arxiv: ArxivIcon,
asana: AsanaIcon,
ashby: AshbyIcon,
attio: AttioIcon,
brandfetch: BrandfetchIcon,
browser_use: BrowserUseIcon,
calcom: CalComIcon,
calendly: CalendlyIcon,
circleback: CirclebackIcon,
clay: ClayIcon,
clerk: ClerkIcon,
cloudflare: CloudflareIcon,
confluence_v2: ConfluenceIcon,
cursor_v2: CursorIcon,
databricks: DatabricksIcon,
datadog: DatadogIcon,
devin: DevinIcon,
discord: DiscordIcon,
dropbox: DropboxIcon,
dspy: DsPyIcon,
dub: DubIcon,
duckduckgo: DuckDuckGoIcon,
dynamodb: DynamoDBIcon,
elasticsearch: ElasticsearchIcon,
@@ -169,22 +206,33 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
file_v3: DocumentIcon,
firecrawl: FirecrawlIcon,
fireflies_v2: FirefliesIcon,
gamma: GammaIcon,
github_v2: GithubIcon,
gitlab: GitLabIcon,
gmail_v2: GmailIcon,
gong: GongIcon,
google_bigquery: GoogleBigQueryIcon,
google_books: GoogleBooksIcon,
google_calendar_v2: GoogleCalendarIcon,
google_contacts: GoogleContactsIcon,
google_docs: GoogleDocsIcon,
google_drive: GoogleDriveIcon,
google_forms: GoogleFormsIcon,
google_groups: GoogleGroupsIcon,
google_maps: GoogleMapsIcon,
google_meet: GoogleMeetIcon,
google_pagespeed: GooglePagespeedIcon,
google_search: GoogleIcon,
google_sheets_v2: GoogleSheetsIcon,
google_slides_v2: GoogleSlidesIcon,
google_tasks: GoogleTasksIcon,
google_translate: GoogleTranslateIcon,
google_vault: GoogleVaultIcon,
grafana: GrafanaIcon,
grain: GrainIcon,
greenhouse: GreenhouseIcon,
greptile: GreptileIcon,
hex: HexIcon,
hubspot: HubspotIcon,
huggingface: HuggingFaceIcon,
hunter: HunterIOIcon,
@@ -202,10 +250,13 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
linear: LinearIcon,
linkedin: LinkedInIcon,
linkup: LinkupIcon,
loops: LoopsIcon,
luma: LumaIcon,
mailchimp: MailchimpIcon,
mailgun: MailgunIcon,
mem0: Mem0Icon,
memory: BrainIcon,
microsoft_dataverse: MicrosoftDataverseIcon,
microsoft_excel_v2: MicrosoftExcelIcon,
microsoft_planner: MicrosoftPlannerIcon,
microsoft_teams: MicrosoftTeamsIcon,
@@ -218,6 +269,7 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
onepassword: OnePasswordIcon,
openai: OpenAIIcon,
outlook: OutlookIcon,
pagerduty: PagerDutyIcon,
parallel_ai: ParallelIcon,
perplexity: PerplexityIcon,
pinecone: PineconeIcon,
@@ -229,8 +281,10 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
qdrant: QdrantIcon,
rds: RDSIcon,
reddit: RedditIcon,
redis: RedisIcon,
reducto_v2: ReductoIcon,
resend: ResendIcon,
revenuecat: RevenueCatIcon,
s3: S3Icon,
salesforce: SalesforceIcon,
search: SearchIcon,
@@ -260,6 +314,8 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
twilio_sms: TwilioIcon,
twilio_voice: TwilioIcon,
typeform: TypeformIcon,
upstash: UpstashIcon,
vercel: VercelIcon,
video_generator_v2: VideoIcon,
vision_v2: EyeIcon,
wealthbox: WealthboxIcon,

View File

@@ -0,0 +1,169 @@
'use client'
import { useEffect, useRef, useState } from 'react'
import { ChevronDown } from 'lucide-react'
import { cn } from '@/lib/utils'
interface ResponseSectionProps {
children: React.ReactNode
}
export function ResponseSection({ children }: ResponseSectionProps) {
const containerRef = useRef<HTMLDivElement>(null)
const [statusCodes, setStatusCodes] = useState<string[]>([])
const [selectedCode, setSelectedCode] = useState<string>('')
const [isOpen, setIsOpen] = useState(false)
const dropdownRef = useRef<HTMLDivElement>(null)
function getAccordionItems() {
const root = containerRef.current?.querySelector('[data-orientation="vertical"]')
if (!root) return []
return Array.from(root.children).filter(
(el) => el.getAttribute('data-state') !== null
) as HTMLElement[]
}
function showStatusCode(code: string) {
const items = getAccordionItems()
for (const item of items) {
const triggerBtn = item.querySelector('h3 button') as HTMLButtonElement | null
const text = triggerBtn?.textContent?.trim() ?? ''
const itemCode = text.match(/^\d{3}/)?.[0]
if (itemCode === code) {
item.style.display = ''
if (item.getAttribute('data-state') === 'closed' && triggerBtn) {
triggerBtn.click()
}
} else {
item.style.display = 'none'
if (item.getAttribute('data-state') === 'open' && triggerBtn) {
triggerBtn.click()
}
}
}
}
/**
* Detect when the fumadocs accordion children mount via MutationObserver,
* then extract status codes and show the first one.
* Replaces the previous approach that used `children` as a dependency
* (which triggered on every render since children is a new object each time).
*/
useEffect(() => {
const container = containerRef.current
if (!container) return
const initialize = () => {
const items = getAccordionItems()
if (items.length === 0) return false
const codes: string[] = []
const seen = new Set<string>()
for (const item of items) {
const triggerBtn = item.querySelector('h3 button')
if (triggerBtn) {
const text = triggerBtn.textContent?.trim() ?? ''
const code = text.match(/^\d{3}/)?.[0]
if (code && !seen.has(code)) {
seen.add(code)
codes.push(code)
}
}
}
if (codes.length > 0) {
setStatusCodes(codes)
setSelectedCode(codes[0])
showStatusCode(codes[0])
return true
}
return false
}
if (initialize()) return
const observer = new MutationObserver(() => {
if (initialize()) {
observer.disconnect()
}
})
observer.observe(container, { childList: true, subtree: true })
return () => observer.disconnect()
}, []) // eslint-disable-line react-hooks/exhaustive-deps
function handleSelectCode(code: string) {
setSelectedCode(code)
setIsOpen(false)
showStatusCode(code)
}
useEffect(() => {
function handleClickOutside(event: MouseEvent) {
if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {
setIsOpen(false)
}
}
document.addEventListener('mousedown', handleClickOutside)
return () => document.removeEventListener('mousedown', handleClickOutside)
}, [])
return (
<div ref={containerRef} className='response-section-wrapper'>
{statusCodes.length > 0 && (
<div className='response-section-header'>
<h2 className='response-section-title'>Response</h2>
<div className='response-section-meta'>
<div ref={dropdownRef} className='response-section-dropdown-wrapper'>
<button
type='button'
className='response-section-dropdown-trigger'
onClick={() => setIsOpen(!isOpen)}
>
<span>{selectedCode}</span>
<ChevronDown
className={cn(
'response-section-chevron',
isOpen && 'response-section-chevron-open'
)}
/>
</button>
{isOpen && (
<div className='response-section-dropdown-menu'>
{statusCodes.map((code) => (
<button
key={code}
type='button'
className={cn(
'response-section-dropdown-item',
code === selectedCode && 'response-section-dropdown-item-selected'
)}
onClick={() => handleSelectCode(code)}
>
<span>{code}</span>
{code === selectedCode && (
<svg
className='response-section-check'
viewBox='0 0 24 24'
fill='none'
stroke='currentColor'
strokeWidth='2'
>
<polyline points='20 6 9 17 4 12' />
</svg>
)}
</button>
))}
</div>
)}
</div>
<span className='response-section-content-type'>application/json</span>
</div>
</div>
)}
<div className='response-section-content'>{children}</div>
</div>
)
}

View File

@@ -0,0 +1,94 @@
---
title: Authentication
description: API key types, generation, and how to authenticate requests
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
To access the Sim API, you need an API key. Sim supports two types of API keys — **personal keys** and **workspace keys** — each with different billing and access behaviors.
## Key Types
| | **Personal Keys** | **Workspace Keys** |
| --- | --- | --- |
| **Billed to** | Your individual account | Workspace owner |
| **Scope** | Across workspaces you have access to | Shared across the workspace |
| **Managed by** | Each user individually | Workspace admins |
| **Permissions** | Must be enabled at workspace level | Require admin permissions |
<Callout type="info">
Workspace admins can disable personal API key usage for their workspace. If disabled, only workspace keys can be used.
</Callout>
## Generating API Keys
To generate a key, open the Sim dashboard and navigate to **Settings**, then go to **Sim Keys** and click **Create**.
<Callout type="warn">
API keys are only shown once when generated. Store your key securely — you will not be able to view it again.
</Callout>
## Using API Keys
Pass your API key in the `X-API-Key` header with every request:
<Tabs items={['curl', 'TypeScript', 'Python']}>
<Tab value="curl">
```bash
curl -X POST https://www.sim.ai/api/workflows/{workflowId}/execute \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_API_KEY" \
-d '{"inputs": {}}'
```
</Tab>
<Tab value="TypeScript">
```typescript
const response = await fetch(
'https://www.sim.ai/api/workflows/{workflowId}/execute',
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-Key': process.env.SIM_API_KEY!,
},
body: JSON.stringify({ inputs: {} }),
}
)
```
</Tab>
<Tab value="Python">
```python
import requests
response = requests.post(
"https://www.sim.ai/api/workflows/{workflowId}/execute",
headers={
"Content-Type": "application/json",
"X-API-Key": os.environ["SIM_API_KEY"],
},
json={"inputs": {}},
)
```
</Tab>
</Tabs>
## Where Keys Are Used
API keys authenticate access to:
- **Workflow execution** — run deployed workflows via the API
- **Logs API** — query workflow execution logs and metrics
- **MCP servers** — authenticate connections to deployed MCP servers
- **SDKs** — the [Python](/api-reference/python) and [TypeScript](/api-reference/typescript) SDKs use API keys for all operations
## Security
- Keys use the `sk-sim-` prefix and are encrypted at rest
- Keys can be revoked at any time from the dashboard
- Use environment variables to store keys — never hardcode them in source code
- For browser-based applications, use a backend proxy to avoid exposing keys to the client
<Callout type="warn">
Never expose your API key in client-side code. Use a server-side proxy to make authenticated requests on behalf of your frontend.
</Callout>

View File

@@ -0,0 +1,210 @@
---
title: Getting Started
description: Base URL, first API call, response format, error handling, and pagination
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { Step, Steps } from 'fumadocs-ui/components/steps'
## Base URL
All API requests are made to:
```
https://www.sim.ai
```
## Quick Start
<Steps>
<Step>
### Get your API key
Go to the Sim dashboard and navigate to **Settings → Sim Keys**, then click **Create**. See [Authentication](/api-reference/authentication) for details on key types.
</Step>
<Step>
### Find your workflow ID
Open a workflow in the Sim editor. The workflow ID is in the URL:
```
https://www.sim.ai/workspace/{workspaceId}/w/{workflowId}
```
You can also use the [List Workflows](/api-reference/workflows/listWorkflows) endpoint to get all workflow IDs in a workspace.
</Step>
<Step>
### Deploy your workflow
A workflow must be deployed before it can be executed via the API. Click the **Deploy** button in the editor toolbar.
</Step>
<Step>
### Make your first request
<Tabs items={['curl', 'TypeScript', 'Python']}>
<Tab value="curl">
```bash
curl -X POST https://www.sim.ai/api/workflows/{workflowId}/execute \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_API_KEY" \
-d '{"inputs": {}}'
```
</Tab>
<Tab value="TypeScript">
```typescript
const response = await fetch(
`https://www.sim.ai/api/workflows/${workflowId}/execute`,
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-Key': process.env.SIM_API_KEY!,
},
body: JSON.stringify({ inputs: {} }),
}
)
const data = await response.json()
console.log(data.output)
```
</Tab>
<Tab value="Python">
```python
import requests
import os
response = requests.post(
f"https://www.sim.ai/api/workflows/{workflow_id}/execute",
headers={
"Content-Type": "application/json",
"X-API-Key": os.environ["SIM_API_KEY"],
},
json={"inputs": {}},
)
data = response.json()
print(data["output"])
```
</Tab>
</Tabs>
</Step>
</Steps>
## Sync vs Async Execution
By default, workflow executions are **synchronous** — the API blocks until the workflow completes and returns the result directly.
For long-running workflows, use **asynchronous execution** by passing `async: true`:
```bash
curl -X POST https://www.sim.ai/api/workflows/{workflowId}/execute \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_API_KEY" \
-d '{"inputs": {}, "async": true}'
```
This returns immediately with a `taskId`:
```json
{
"success": true,
"taskId": "job_abc123",
"status": "queued"
}
```
Poll the [Get Job Status](/api-reference/workflows/getJobStatus) endpoint until the status is `completed` or `failed`:
```bash
curl https://www.sim.ai/api/jobs/{taskId} \
-H "X-API-Key: YOUR_API_KEY"
```
<Callout type="info">
Job status transitions follow: `queued` → `processing` → `completed` or `failed`. The `output` field is only present when status is `completed`.
</Callout>
## Response Format
Successful responses include an `output` object with your workflow results and a `limits` object with your current rate limit and usage status:
```json
{
"success": true,
"output": {
"result": "Hello, world!"
},
"limits": {
"workflowExecutionRateLimit": {
"sync": {
"requestsPerMinute": 60,
"maxBurst": 10,
"remaining": 59,
"resetAt": "2025-01-01T00:01:00Z"
},
"async": {
"requestsPerMinute": 30,
"maxBurst": 5,
"remaining": 30,
"resetAt": "2025-01-01T00:01:00Z"
}
},
"usage": {
"currentPeriodCost": 1.25,
"limit": 50.00,
"plan": "pro",
"isExceeded": false
}
}
}
```
## Error Handling
The API uses standard HTTP status codes. Error responses include a human-readable `error` message:
```json
{
"error": "Workflow not found"
}
```
| Status | Meaning | What to do |
| --- | --- | --- |
| `400` | Invalid request parameters | Check the `details` array for specific field errors |
| `401` | Missing or invalid API key | Verify your `X-API-Key` header |
| `403` | Access denied | Check you have permission for this resource |
| `404` | Resource not found | Verify the ID exists and belongs to your workspace |
| `429` | Rate limit exceeded | Wait for the duration in the `Retry-After` header |
<Callout type="info">
Use the [Get Usage Limits](/api-reference/usage/getUsageLimits) endpoint to check your current rate limit status and billing usage at any time.
</Callout>
## Rate Limits
Rate limits depend on your subscription plan and apply separately to synchronous and asynchronous executions. Every execution response includes a `limits` object showing your current rate limit status.
When rate limited, the API returns a `429` response with a `Retry-After` header indicating how many seconds to wait before retrying.
## Pagination
List endpoints (workflows, logs, audit logs) use **cursor-based pagination**:
```bash
# First page
curl "https://www.sim.ai/api/v1/logs?limit=20" \
-H "X-API-Key: YOUR_API_KEY"
# Next page — use the nextCursor from the previous response
curl "https://www.sim.ai/api/v1/logs?limit=20&cursor=abc123" \
-H "X-API-Key: YOUR_API_KEY"
```
The response includes a `nextCursor` field. When `nextCursor` is absent or `null`, you have reached the last page.

View File

@@ -0,0 +1,18 @@
{
"title": "API Reference",
"root": true,
"pages": [
"getting-started",
"authentication",
"---SDKs---",
"python",
"typescript",
"---Endpoints---",
"(generated)/workflows",
"(generated)/logs",
"(generated)/usage",
"(generated)/audit-logs",
"(generated)/tables",
"(generated)/files"
]
}

View File

@@ -0,0 +1,766 @@
---
title: Python
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Card, Cards } from 'fumadocs-ui/components/card'
import { Step, Steps } from 'fumadocs-ui/components/steps'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
Das offizielle Python SDK für Sim ermöglicht es Ihnen, Workflows programmatisch aus Ihren Python-Anwendungen heraus mit dem offiziellen Python SDK auszuführen.
<Callout type="info">
Das Python SDK unterstützt Python 3.8+ mit Unterstützung für asynchrone Ausführung, automatischer Ratenbegrenzung mit exponentiellem Backoff und Nutzungsverfolgung.
</Callout>
## Installation
Installieren Sie das SDK mit pip:
```bash
pip install simstudio-sdk
```
## Schnellstart
Hier ist ein einfaches Beispiel für den Einstieg:
```python
from simstudio import SimStudioClient
# Initialize the client
client = SimStudioClient(
api_key="your-api-key-here",
base_url="https://sim.ai" # optional, defaults to https://sim.ai
)
# Execute a workflow
try:
result = client.execute_workflow("workflow-id")
print("Workflow executed successfully:", result)
except Exception as error:
print("Workflow execution failed:", error)
```
## API-Referenz
### SimStudioClient
#### Konstruktor
```python
SimStudioClient(api_key: str, base_url: str = "https://sim.ai")
```
**Parameter:**
- `api_key` (str): Ihr Sim API-Schlüssel
- `base_url` (str, optional): Basis-URL für die Sim API
#### Methoden
##### execute_workflow()
Führt einen Workflow mit optionalen Eingabedaten aus.
```python
result = client.execute_workflow(
"workflow-id",
input_data={"message": "Hello, world!"},
timeout=30.0 # 30 seconds
)
```
**Parameter:**
- `workflow_id` (str): Die ID des auszuführenden Workflows
- `input_data` (dict, optional): Eingabedaten, die an den Workflow übergeben werden
- `timeout` (float, optional): Timeout in Sekunden (Standard: 30.0)
- `stream` (bool, optional): Streaming-Antworten aktivieren (Standard: False)
- `selected_outputs` (list[str], optional): Block-Ausgaben zum Streamen im Format `blockName.attribute` (z. B. `["agent1.content"]`)
- `async_execution` (bool, optional): Asynchron ausführen (Standard: False)
**Rückgabewert:** `WorkflowExecutionResult | AsyncExecutionResult`
Wenn `async_execution=True`, wird sofort mit einer Task-ID zum Polling zurückgegeben. Andernfalls wird auf die Fertigstellung gewartet.
##### get_workflow_status()
Ruft den Status eines Workflows ab (Deployment-Status usw.).
```python
status = client.get_workflow_status("workflow-id")
print("Is deployed:", status.is_deployed)
```
**Parameter:**
- `workflow_id` (str): Die ID des Workflows
**Rückgabe:** `WorkflowStatus`
##### validate_workflow()
Überprüft, ob ein Workflow zur Ausführung bereit ist.
```python
is_ready = client.validate_workflow("workflow-id")
if is_ready:
# Workflow is deployed and ready
pass
```
**Parameter:**
- `workflow_id` (str): Die ID des Workflows
**Rückgabe:** `bool`
##### get_job_status()
Ruft den Status einer asynchronen Job-Ausführung ab.
```python
status = client.get_job_status("task-id-from-async-execution")
print("Status:", status["status"]) # 'queued', 'processing', 'completed', 'failed'
if status["status"] == "completed":
print("Output:", status["output"])
```
**Parameter:**
- `task_id` (str): Die Task-ID, die von der asynchronen Ausführung zurückgegeben wurde
**Rückgabe:** `Dict[str, Any]`
**Antwortfelder:**
- `success` (bool): Ob die Anfrage erfolgreich war
- `taskId` (str): Die Task-ID
- `status` (str): Einer von `'queued'`, `'processing'`, `'completed'`, `'failed'`, `'cancelled'`
- `metadata` (dict): Enthält `startedAt`, `completedAt` und `duration`
- `output` (any, optional): Die Workflow-Ausgabe (wenn abgeschlossen)
- `error` (any, optional): Fehlerdetails (wenn fehlgeschlagen)
- `estimatedDuration` (int, optional): Geschätzte Dauer in Millisekunden (wenn in Bearbeitung/in Warteschlange)
##### execute_with_retry()
Führt einen Workflow mit automatischer Wiederholung bei Rate-Limit-Fehlern unter Verwendung von exponentiellem Backoff aus.
```python
result = client.execute_with_retry(
"workflow-id",
input_data={"message": "Hello"},
timeout=30.0,
max_retries=3, # Maximum number of retries
initial_delay=1.0, # Initial delay in seconds
max_delay=30.0, # Maximum delay in seconds
backoff_multiplier=2.0 # Exponential backoff multiplier
)
```
**Parameter:**
- `workflow_id` (str): Die ID des auszuführenden Workflows
- `input_data` (dict, optional): Eingabedaten, die an den Workflow übergeben werden
- `timeout` (float, optional): Timeout in Sekunden
- `stream` (bool, optional): Streaming-Antworten aktivieren
- `selected_outputs` (list, optional): Block-Ausgaben zum Streamen
- `async_execution` (bool, optional): Asynchron ausführen
- `max_retries` (int, optional): Maximale Anzahl von Wiederholungen (Standard: 3)
- `initial_delay` (float, optional): Anfangsverzögerung in Sekunden (Standard: 1.0)
- `max_delay` (float, optional): Maximale Verzögerung in Sekunden (Standard: 30.0)
- `backoff_multiplier` (float, optional): Backoff-Multiplikator (Standard: 2.0)
**Rückgabe:** `WorkflowExecutionResult | AsyncExecutionResult`
Die Wiederholungslogik verwendet exponentielles Backoff (1s → 2s → 4s → 8s...) mit ±25% Jitter, um Thundering Herd zu verhindern. Wenn die API einen `retry-after`-Header bereitstellt, wird dieser stattdessen verwendet.
##### get_rate_limit_info()
Ruft die aktuellen Rate-Limit-Informationen aus der letzten API-Antwort ab.
```python
rate_limit_info = client.get_rate_limit_info()
if rate_limit_info:
print("Limit:", rate_limit_info.limit)
print("Remaining:", rate_limit_info.remaining)
print("Reset:", datetime.fromtimestamp(rate_limit_info.reset))
```
**Rückgabewert:** `RateLimitInfo | None`
##### get_usage_limits()
Ruft aktuelle Nutzungslimits und Kontingentinformationen für Ihr Konto ab.
```python
limits = client.get_usage_limits()
print("Sync requests remaining:", limits.rate_limit["sync"]["remaining"])
print("Async requests remaining:", limits.rate_limit["async"]["remaining"])
print("Current period cost:", limits.usage["currentPeriodCost"])
print("Plan:", limits.usage["plan"])
```
**Rückgabewert:** `UsageLimits`
**Antwortstruktur:**
```python
{
"success": bool,
"rateLimit": {
"sync": {
"isLimited": bool,
"limit": int,
"remaining": int,
"resetAt": str
},
"async": {
"isLimited": bool,
"limit": int,
"remaining": int,
"resetAt": str
},
"authType": str # 'api' or 'manual'
},
"usage": {
"currentPeriodCost": float,
"limit": float,
"plan": str # e.g., 'free', 'pro'
}
}
```
##### set_api_key()
Aktualisiert den API-Schlüssel.
```python
client.set_api_key("new-api-key")
```
##### set_base_url()
Aktualisiert die Basis-URL.
```python
client.set_base_url("https://my-custom-domain.com")
```
##### close()
Schließt die zugrunde liegende HTTP-Sitzung.
```python
client.close()
```
## Datenklassen
### WorkflowExecutionResult
```python
@dataclass
class WorkflowExecutionResult:
success: bool
output: Optional[Any] = None
error: Optional[str] = None
logs: Optional[List[Any]] = None
metadata: Optional[Dict[str, Any]] = None
trace_spans: Optional[List[Any]] = None
total_duration: Optional[float] = None
```
### AsyncExecutionResult
```python
@dataclass
class AsyncExecutionResult:
success: bool
task_id: str
status: str # 'queued'
created_at: str
links: Dict[str, str] # e.g., {"status": "/api/jobs/{taskId}"}
```
### WorkflowStatus
```python
@dataclass
class WorkflowStatus:
is_deployed: bool
deployed_at: Optional[str] = None
needs_redeployment: bool = False
```
### RateLimitInfo
```python
@dataclass
class RateLimitInfo:
limit: int
remaining: int
reset: int
retry_after: Optional[int] = None
```
### UsageLimits
```python
@dataclass
class UsageLimits:
success: bool
rate_limit: Dict[str, Any]
usage: Dict[str, Any]
```
### SimStudioError
```python
class SimStudioError(Exception):
def __init__(self, message: str, code: Optional[str] = None, status: Optional[int] = None):
super().__init__(message)
self.code = code
self.status = status
```
**Häufige Fehlercodes:**
- `UNAUTHORIZED`: Ungültiger API-Schlüssel
- `TIMEOUT`: Zeitüberschreitung der Anfrage
- `RATE_LIMIT_EXCEEDED`: Ratenlimit überschritten
- `USAGE_LIMIT_EXCEEDED`: Nutzungslimit überschritten
- `EXECUTION_ERROR`: Workflow-Ausführung fehlgeschlagen
## Beispiele
### Grundlegende Workflow-Ausführung
<Steps>
<Step title="Client initialisieren">
Richten Sie den SimStudioClient mit Ihrem API-Schlüssel ein.
</Step>
<Step title="Workflow validieren">
Prüfen Sie, ob der Workflow bereitgestellt und zur Ausführung bereit ist.
</Step>
<Step title="Workflow ausführen">
Führen Sie den Workflow mit Ihren Eingabedaten aus.
</Step>
<Step title="Ergebnis verarbeiten">
Verarbeiten Sie das Ausführungsergebnis und behandeln Sie eventuelle Fehler.
</Step>
</Steps>
```python
import os
from simstudio import SimStudioClient
client = SimStudioClient(api_key=os.getenv("SIM_API_KEY"))
def run_workflow():
try:
# Check if workflow is ready
is_ready = client.validate_workflow("my-workflow-id")
if not is_ready:
raise Exception("Workflow is not deployed or ready")
# Execute the workflow
result = client.execute_workflow(
"my-workflow-id",
input_data={
"message": "Process this data",
"user_id": "12345"
}
)
if result.success:
print("Output:", result.output)
print("Duration:", result.metadata.get("duration") if result.metadata else None)
else:
print("Workflow failed:", result.error)
except Exception as error:
print("Error:", error)
run_workflow()
```
### Fehlerbehandlung
Behandeln Sie verschiedene Fehlertypen, die während der Workflow-Ausführung auftreten können:
```python
from simstudio import SimStudioClient, SimStudioError
import os
client = SimStudioClient(api_key=os.getenv("SIM_API_KEY"))
def execute_with_error_handling():
try:
result = client.execute_workflow("workflow-id")
return result
except SimStudioError as error:
if error.code == "UNAUTHORIZED":
print("Invalid API key")
elif error.code == "TIMEOUT":
print("Workflow execution timed out")
elif error.code == "USAGE_LIMIT_EXCEEDED":
print("Usage limit exceeded")
elif error.code == "INVALID_JSON":
print("Invalid JSON in request body")
else:
print(f"Workflow error: {error}")
raise
except Exception as error:
print(f"Unexpected error: {error}")
raise
```
### Verwendung des Context-Managers
Verwenden Sie den Client als Context-Manager, um die Ressourcenbereinigung automatisch zu handhaben:
```python
from simstudio import SimStudioClient
import os
# Using context manager to automatically close the session
with SimStudioClient(api_key=os.getenv("SIM_API_KEY")) as client:
result = client.execute_workflow("workflow-id")
print("Result:", result)
# Session is automatically closed here
```
### Batch-Workflow-Ausführung
Führen Sie mehrere Workflows effizient aus:
```python
from simstudio import SimStudioClient
import os
client = SimStudioClient(api_key=os.getenv("SIM_API_KEY"))
def execute_workflows_batch(workflow_data_pairs):
"""Execute multiple workflows with different input data."""
results = []
for workflow_id, input_data in workflow_data_pairs:
try:
# Validate workflow before execution
if not client.validate_workflow(workflow_id):
print(f"Skipping {workflow_id}: not deployed")
continue
result = client.execute_workflow(workflow_id, input_data)
results.append({
"workflow_id": workflow_id,
"success": result.success,
"output": result.output,
"error": result.error
})
except Exception as error:
results.append({
"workflow_id": workflow_id,
"success": False,
"error": str(error)
})
return results
# Example usage
workflows = [
("workflow-1", {"type": "analysis", "data": "sample1"}),
("workflow-2", {"type": "processing", "data": "sample2"}),
]
results = execute_workflows_batch(workflows)
for result in results:
print(f"Workflow {result['workflow_id']}: {'Success' if result['success'] else 'Failed'}")
```
### Asynchrone Workflow-Ausführung
Führen Sie Workflows asynchron für langwierige Aufgaben aus:
```python
import os
import time
from simstudio import SimStudioClient
client = SimStudioClient(api_key=os.getenv("SIM_API_KEY"))
def execute_async():
try:
# Start async execution
result = client.execute_workflow(
"workflow-id",
input_data={"data": "large dataset"},
async_execution=True # Execute asynchronously
)
# Check if result is an async execution
if hasattr(result, 'task_id'):
print(f"Task ID: {result.task_id}")
print(f"Status endpoint: {result.links['status']}")
# Poll for completion
status = client.get_job_status(result.task_id)
while status["status"] in ["queued", "processing"]:
print(f"Current status: {status['status']}")
time.sleep(2) # Wait 2 seconds
status = client.get_job_status(result.task_id)
if status["status"] == "completed":
print("Workflow completed!")
print(f"Output: {status['output']}")
print(f"Duration: {status['metadata']['duration']}")
else:
print(f"Workflow failed: {status['error']}")
except Exception as error:
print(f"Error: {error}")
execute_async()
```
### Ratenlimitierung und Wiederholung
Behandeln Sie Ratenbegrenzungen automatisch mit exponentiellem Backoff:
```python
import os
from simstudio import SimStudioClient, SimStudioError
client = SimStudioClient(api_key=os.getenv("SIM_API_KEY"))
def execute_with_retry_handling():
try:
# Automatically retries on rate limit
result = client.execute_with_retry(
"workflow-id",
input_data={"message": "Process this"},
max_retries=5,
initial_delay=1.0,
max_delay=60.0,
backoff_multiplier=2.0
)
print(f"Success: {result}")
except SimStudioError as error:
if error.code == "RATE_LIMIT_EXCEEDED":
print("Rate limit exceeded after all retries")
# Check rate limit info
rate_limit_info = client.get_rate_limit_info()
if rate_limit_info:
from datetime import datetime
reset_time = datetime.fromtimestamp(rate_limit_info.reset)
print(f"Rate limit resets at: {reset_time}")
execute_with_retry_handling()
```
### Nutzungsüberwachung
Überwachen Sie die Nutzung und Limits Ihres Kontos:
```python
import os
from simstudio import SimStudioClient
client = SimStudioClient(api_key=os.getenv("SIM_API_KEY"))
def check_usage():
try:
limits = client.get_usage_limits()
print("=== Rate Limits ===")
print("Sync requests:")
print(f" Limit: {limits.rate_limit['sync']['limit']}")
print(f" Remaining: {limits.rate_limit['sync']['remaining']}")
print(f" Resets at: {limits.rate_limit['sync']['resetAt']}")
print(f" Is limited: {limits.rate_limit['sync']['isLimited']}")
print("\nAsync requests:")
print(f" Limit: {limits.rate_limit['async']['limit']}")
print(f" Remaining: {limits.rate_limit['async']['remaining']}")
print(f" Resets at: {limits.rate_limit['async']['resetAt']}")
print(f" Is limited: {limits.rate_limit['async']['isLimited']}")
print("\n=== Usage ===")
print(f"Current period cost: ${limits.usage['currentPeriodCost']:.2f}")
print(f"Limit: ${limits.usage['limit']:.2f}")
print(f"Plan: {limits.usage['plan']}")
percent_used = (limits.usage['currentPeriodCost'] / limits.usage['limit']) * 100
print(f"Usage: {percent_used:.1f}%")
if percent_used > 80:
print("⚠️ Warning: You are approaching your usage limit!")
except Exception as error:
print(f"Error checking usage: {error}")
check_usage()
```
### Streaming-Workflow-Ausführung
Führen Sie Workflows mit Echtzeit-Streaming-Antworten aus:
```python
from simstudio import SimStudioClient
import os
client = SimStudioClient(api_key=os.getenv("SIM_API_KEY"))
def execute_with_streaming():
"""Execute workflow with streaming enabled."""
try:
# Enable streaming for specific block outputs
result = client.execute_workflow(
"workflow-id",
input_data={"message": "Count to five"},
stream=True,
selected_outputs=["agent1.content"] # Use blockName.attribute format
)
print("Workflow result:", result)
except Exception as error:
print("Error:", error)
execute_with_streaming()
```
Die Streaming-Antwort folgt dem Server-Sent-Events- (SSE-) Format:
```
data: {"blockId":"7b7735b9-19e5-4bd6-818b-46aae2596e9f","chunk":"One"}
data: {"blockId":"7b7735b9-19e5-4bd6-818b-46aae2596e9f","chunk":", two"}
data: {"event":"done","success":true,"output":{},"metadata":{"duration":610}}
data: [DONE]
```
**Flask-Streaming-Beispiel:**
```python
from flask import Flask, Response, stream_with_context
import requests
import json
import os
app = Flask(__name__)
@app.route('/stream-workflow')
def stream_workflow():
"""Stream workflow execution to the client."""
def generate():
response = requests.post(
'https://sim.ai/api/workflows/WORKFLOW_ID/execute',
headers={
'Content-Type': 'application/json',
'X-API-Key': os.getenv('SIM_API_KEY')
},
json={
'message': 'Generate a story',
'stream': True,
'selectedOutputs': ['agent1.content']
},
stream=True
)
for line in response.iter_lines():
if line:
decoded_line = line.decode('utf-8')
if decoded_line.startswith('data: '):
data = decoded_line[6:] # Remove 'data: ' prefix
if data == '[DONE]':
break
try:
parsed = json.loads(data)
if 'chunk' in parsed:
yield f"data: {json.dumps(parsed)}\n\n"
elif parsed.get('event') == 'done':
yield f"data: {json.dumps(parsed)}\n\n"
print("Execution complete:", parsed.get('metadata'))
except json.JSONDecodeError:
pass
return Response(
stream_with_context(generate()),
mimetype='text/event-stream'
)
if __name__ == '__main__':
app.run(debug=True)
```
### Umgebungs­konfiguration
Konfigurieren Sie den Client mit Umgebungsvariablen:
<Tabs items={['Development', 'Production']}>
<Tab value="Development">
```python
import os
from simstudio import SimStudioClient
# Development configuration
client = SimStudioClient(
api_key=os.getenv("SIM_API_KEY")
base_url=os.getenv("SIM_BASE_URL", "https://sim.ai")
)
```
</Tab>
<Tab value="Production">
```python
import os
from simstudio import SimStudioClient
# Production configuration with error handling
api_key = os.getenv("SIM_API_KEY")
if not api_key:
raise ValueError("SIM_API_KEY environment variable is required")
client = SimStudioClient(
api_key=api_key,
base_url=os.getenv("SIM_BASE_URL", "https://sim.ai")
)
```
</Tab>
</Tabs>
## Ihren API-Schlüssel erhalten
<Steps>
<Step title="Bei Sim anmelden">
Navigieren Sie zu [Sim](https://sim.ai) und melden Sie sich in Ihrem Konto an.
</Step>
<Step title="Workflow öffnen">
Navigieren Sie zu dem Workflow, den Sie programmatisch ausführen möchten.
</Step>
<Step title="Workflow bereitstellen">
Klicken Sie auf "Bereitstellen", um Ihren Workflow bereitzustellen, falls dies noch nicht geschehen ist.
</Step>
<Step title="API-Schlüssel erstellen oder auswählen">
Wählen oder erstellen Sie während des Bereitstellungsprozesses einen API-Schlüssel.
</Step>
<Step title="API-Schlüssel kopieren">
Kopieren Sie den API-Schlüssel, um ihn in Ihrer Python-Anwendung zu verwenden.
</Step>
</Steps>
## Voraussetzungen
- Python 3.8+
- requests >= 2.25.0
## Lizenz
Apache-2.0

File diff suppressed because it is too large Load Diff

View File

@@ -152,3 +152,9 @@ Input → Agent (Google Search, Notion) → Function (Compile Report)
- **Sei spezifisch in System-Prompts**: Definiere die Rolle, den Ton und die Einschränkungen des Agenten klar. Je spezifischer deine Anweisungen sind, desto besser kann der Agent seinen vorgesehenen Zweck erfüllen.
- **Wähle die richtige Temperatureinstellung**: Verwende niedrigere Temperatureinstellungen (0-0,3), wenn Genauigkeit wichtig ist, oder erhöhe die Temperatur (0,7-2,0) für kreativere oder vielfältigere Antworten
- **Nutze Tools effektiv**: Integriere Tools, die den Zweck des Agenten ergänzen und seine Fähigkeiten erweitern. Sei selektiv bei der Auswahl der Tools, um den Agenten nicht zu überfordern. Für Aufgaben mit wenig Überschneidung verwende einen anderen Agent-Block für die besten Ergebnisse.
## Best Practices
- **Seien Sie spezifisch in System-Prompts**: Definieren Sie die Rolle, den Ton und die Grenzen des Agenten klar. Je spezifischer Ihre Anweisungen sind, desto besser kann der Agent seinen beabsichtigten Zweck erfüllen.
- **Wählen Sie die richtige Temperatureinstellung**: Verwenden Sie niedrigere Temperatureinstellungen (00,3), wenn Genauigkeit wichtig ist, oder erhöhen Sie die Temperatur (0,72,0) für kreativere oder vielfältigere Antworten
- **Nutzen Sie Tools effektiv**: Integrieren Sie Tools, die den Zweck des Agenten ergänzen und seine Fähigkeiten erweitern. Seien Sie selektiv bei der Auswahl der Tools, um den Agenten nicht zu überfordern. Verwenden Sie für Aufgaben mit geringer Überschneidung einen weiteren Agent-Block für die besten Ergebnisse.

View File

@@ -255,3 +255,57 @@ console.log(`${processedItems} gültige Elemente verarbeitet`);
- **Setzen Sie vernünftige Grenzen**: Halten Sie die Anzahl der Iterationen in einem vernünftigen Rahmen, um lange Ausführungszeiten zu vermeiden
- **Verwenden Sie ForEach für Sammlungen**: Verwenden Sie beim Verarbeiten von Arrays oder Objekten ForEach anstelle von For-Schleifen
- **Behandeln Sie Fehler elegant**: Erwägen Sie, Fehlerbehandlung innerhalb von Schleifen hinzuzufügen, um robuste Workflows zu gewährleisten
## Eingaben und Ausgaben
<Tabs items={['Configuration', 'Variables', 'Results']}>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>Schleifentyp</strong>: Wählen Sie zwischen 'for', 'forEach', 'while' oder 'doWhile'
</li>
<li>
<strong>Iterationen</strong>: Anzahl der Ausführungen (für for-Schleifen)
</li>
<li>
<strong>Sammlung</strong>: Array oder Objekt zum Durchlaufen (für forEach-Schleifen)
</li>
<li>
<strong>Bedingung</strong>: Boolescher Ausdruck zur Auswertung (für while/do-while-Schleifen)
</li>
</ul>
</Tab>
<Tab>
Verfügbar **innerhalb** der Schleife:
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>{"<loop.index>"}</strong>: Aktuelle Iterationsnummer (0-basiert)
</li>
<li>
<strong>{"<loop.currentItem>"}</strong>: Aktuell verarbeitetes Element (nur forEach)
</li>
<li>
<strong>{"<loop.items>"}</strong>: Vollständige Sammlung (nur forEach)
</li>
</ul>
</Tab>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>{"<blockname.results>"}</strong>: Array aller Iterationsergebnisse (Zugriff über Blocknamen)
</li>
<li>
<strong>Struktur</strong>: Ergebnisse behalten die Iterationsreihenfolge bei
</li>
<li>
<strong>Zugriff</strong>: Verfügbar in Blöcken nach Abschluss der Schleife
</li>
</ul>
</Tab>
</Tabs>
## Best Practices
- **Setzen Sie vernünftige Grenzen**: Halten Sie die Iterationsanzahl angemessen, um lange Ausführungszeiten zu vermeiden
- **Verwenden Sie ForEach für Sammlungen**: Verwenden Sie beim Verarbeiten von Arrays oder Objekten ForEach anstelle von For-Schleifen
- **Behandeln Sie Fehler elegant**: Erwägen Sie, Fehlerbehandlung innerhalb von Schleifen hinzuzufügen, um robuste Workflows zu gewährleisten

View File

@@ -214,3 +214,51 @@ Wann Sie welche Methode verwenden sollten:
- **Nur unabhängige Operationen**: Stellen Sie sicher, dass Operationen nicht voneinander abhängen
- **Ratenbegrenzungen berücksichtigen**: Fügen Sie Verzögerungen oder Drosselungen für API-intensive Workflows hinzu
- **Fehlerbehandlung**: Jede Instanz sollte ihre eigenen Fehler angemessen behandeln
## Eingaben und Ausgaben
<Tabs items={['Konfiguration', 'Variablen', 'Ergebnisse']}>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>Parallel-Typ</strong>: Wählen Sie zwischen „count" oder „collection"
</li>
<li>
<strong>Anzahl</strong>: Anzahl der auszuführenden Instanzen (anzahlbasiert)
</li>
<li>
<strong>Collection</strong>: Array oder Objekt zur Verteilung (sammlungsbasiert)
</li>
</ul>
</Tab>
<Tab>
Verfügbar **innerhalb** der Parallelverarbeitung:
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>{"<parallel.index>"}</strong>: Instanznummer (0-basiert)
</li>
<li>
<strong>{"<parallel.currentItem>"}</strong>: Element für diese Instanz (nur sammlungsbasiert)
</li>
<li>
<strong>{"<parallel.items>"}</strong>: Vollständige Sammlung (nur sammlungsbasiert)
</li>
</ul>
</Tab>
<Tab>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>{"<blockname.results>"}</strong>: Array aller Instanzergebnisse (Zugriff über Blockname)
</li>
<li>
<strong>Zugriff</strong>: Verfügbar in Blöcken nach Abschluss der Parallelverarbeitung
</li>
</ul>
</Tab>
</Tabs>
## Best Practices
- **Nur unabhängige Operationen**: Stellen Sie sicher, dass Operationen nicht voneinander abhängen
- **Rate Limits beachten**: Fügen Sie Verzögerungen oder Drosselung für API-intensive Workflows hinzu
- **Fehlerbehandlung**: Jede Instanz sollte ihre eigenen Fehler ordnungsgemäß behandeln

View File

@@ -100,3 +100,18 @@ Input (Lead) → Router → Agent (Enterprise Sales) or Workflow (Self-serve)
- **Mit verschiedenen Eingaben testen**: Stellen Sie sicher, dass der Router verschiedene Eingabetypen, Grenzfälle und unerwartete Inhalte verarbeiten kann
- **Routing-Leistung überwachen**: Überprüfen Sie Routing-Entscheidungen regelmäßig und verfeinern Sie Kriterien basierend auf tatsächlichen Nutzungsmustern
- **Geeignete Modelle auswählen**: Verwenden Sie Modelle mit starken Argumentationsfähigkeiten für komplexe Routing-Entscheidungen
Wenn der Router keine geeignete Route für den gegebenen Kontext ermitteln kann, leitet er stattdessen zum **Fehlerpfad** weiter, anstatt willkürlich eine Route auszuwählen. Dies geschieht, wenn:
- Der Kontext keiner der definierten Routenbeschreibungen eindeutig entspricht
- Die KI feststellt, dass keine der verfügbaren Routen geeignet ist
## Best Practices
- **Klare Routenbeschreibungen verfassen**: Jede Routenbeschreibung sollte klar erklären, wann diese Route ausgewählt werden sollte. Seien Sie spezifisch bezüglich der Kriterien.
- **Routen gegenseitig ausschließend gestalten**: Stellen Sie nach Möglichkeit sicher, dass sich Routenbeschreibungen nicht überschneiden, um mehrdeutige Routing-Entscheidungen zu vermeiden.
- **Einen Fehlerpfad verbinden**: Behandeln Sie Fälle, in denen keine Route passt, indem Sie einen Fehlerbehandler für ein elegantes Fallback-Verhalten verbinden.
- **Aussagekräftige Routentitel verwenden**: Routentitel erscheinen im Workflow-Canvas, machen Sie sie daher für bessere Lesbarkeit aussagekräftig.
- **Mit verschiedenen Eingaben testen**: Stellen Sie sicher, dass der Router verschiedene Eingabetypen, Grenzfälle und unerwartete Inhalte verarbeitet.
- **Routing-Performance überwachen**: Überprüfen Sie Routing-Entscheidungen regelmäßig und verfeinern Sie Routenbeschreibungen basierend auf tatsächlichen Nutzungsmustern.
- **Geeignete Modelle wählen**: Verwenden Sie Modelle mit starken Reasoning-Fähigkeiten für komplexe Routing-Entscheidungen.

View File

@@ -169,3 +169,175 @@ copilotCost = (inputTokens × inputPrice + outputTokens × (outputPrice × 1.5))
<Callout type="info">
Modellpreise werden pro Million Tokens angegeben. Die Berechnung teilt durch 1.000.000, um die tatsächlichen Kosten zu ermitteln. Siehe <a href="/execution/costs">die Seite zur Kostenberechnung</a> für Hintergründe und Beispiele.
</Callout>
Fahre mit der Maus über eine deiner Nachrichten und klicke auf **Bearbeiten**, um sie zu ändern und erneut zu senden. Dies ist nützlich, um deine Eingaben zu verfeinern.
### Nachrichtenwarteschlange
Wenn du eine Nachricht sendest, während Copilot noch antwortet, wird sie in die Warteschlange gestellt. Du kannst:
- Warteschlangennachrichten im erweiterbaren Warteschlangenpanel anzeigen
- Eine Nachricht aus der Warteschlange sofort senden (bricht die aktuelle Antwort ab)
- Nachrichten aus der Warteschlange entfernen
## Dateianhänge
Klicke auf das Anhang-Symbol, um Dateien mit deiner Nachricht hochzuladen. Unterstützte Dateitypen umfassen:
- Bilder (Vorschau-Thumbnails werden angezeigt)
- PDFs
- Textdateien, JSON, XML
- Andere Dokumentformate
Dateien werden als anklickbare Thumbnails angezeigt, die in einem neuen Tab geöffnet werden.
## Checkpoints & Änderungen
Wenn Copilot Änderungen an deinem Workflow vornimmt, speichert es Checkpoints, damit du bei Bedarf zurückkehren kannst.
### Checkpoints anzeigen
Fahre mit der Maus über eine Copilot-Nachricht und klicke auf das Checkpoints-Symbol, um gespeicherte Workflow-Zustände für diese Nachricht anzuzeigen.
### Änderungen rückgängig machen
Klicke bei jedem Checkpoint auf **Rückgängig machen**, um deinen Workflow auf diesen Zustand zurückzusetzen. Ein Bestätigungsdialog warnt dich, dass diese Aktion nicht rückgängig gemacht werden kann.
### Änderungen akzeptieren
Wenn Copilot Änderungen vorschlägt, kannst du:
- **Akzeptieren**: Die vorgeschlagenen Änderungen anwenden (`Mod+Shift+Enter`)
- **Ablehnen**: Die Änderungen verwerfen und deinen aktuellen Workflow beibehalten
## Denkblöcke
Bei komplexen Anfragen kann Copilot seinen Denkprozess in erweiterbaren Denkblöcken anzeigen:
- Blöcke werden automatisch erweitert, während Copilot denkt
- Klicken zum manuellen Erweitern/Reduzieren
- Zeigt die Dauer des Denkprozesses an
- Hilft dir zu verstehen, wie Copilot zu seiner Lösung gekommen ist
## Optionsauswahl
Wenn Copilot mehrere Optionen präsentiert, kannst du auswählen mit:
| Steuerung | Aktion |
|---------|--------|
| **1-9** | Option nach Nummer auswählen |
| **Pfeiltaste auf/ab** | Zwischen Optionen navigieren |
| **Eingabetaste** | Hervorgehobene Option auswählen |
Ausgewählte Optionen sind hervorgehoben; nicht ausgewählte Optionen erscheinen durchgestrichen.
## Tastenkombinationen
| Tastenkombination | Aktion |
|----------|--------|
| `@` | Kontextmenü öffnen |
| `/` | Slash-Befehle öffnen |
| `Arrow Up/Down` | Menüelemente navigieren |
| `Enter` | Menüelement auswählen |
| `Esc` | Menüs schließen |
| `Mod+Shift+Enter` | Copilot-Änderungen akzeptieren |
## Nutzungslimits
Die Copilot-Nutzung wird pro Token des zugrunde liegenden LLM abgerechnet. Wenn Sie Ihr Nutzungslimit erreichen, fordert Copilot Sie auf, Ihr Limit zu erhöhen. Sie können die Nutzung in Schritten (50 $, 100 $) von Ihrer aktuellen Basis aus hinzufügen.
<Callout type="info">
Siehe die [Seite zur Kostenberechnung](/execution/costs) für Abrechnungsdetails.
</Callout>
## Copilot MCP
Sie können Copilot als MCP-Server in Ihrem bevorzugten Editor oder AI-Client verwenden. Damit können Sie Sim-Workflows direkt aus Tools wie Cursor, Claude Code, Claude Desktop und VS Code erstellen, testen, bereitstellen und verwalten.
### Generieren eines Copilot-API-Schlüssels
Um sich mit dem Copilot-MCP-Server zu verbinden, benötigen Sie einen **Copilot-API-Schlüssel**:
1. Gehen Sie zu [sim.ai](https://sim.ai) und melden Sie sich an
2. Navigieren Sie zu **Einstellungen** → **Copilot**
3. Klicken Sie auf **API-Schlüssel generieren**
4. Kopieren Sie den Schlüssel er wird nur einmal angezeigt
Der Schlüssel sieht aus wie `sk-sim-copilot-...`. Sie werden ihn in der folgenden Konfiguration verwenden.
### Cursor
Fügen Sie Folgendes zu Ihrer `.cursor/mcp.json` (Projektebene) oder den globalen Cursor-MCP-Einstellungen hinzu:
```json
{
"mcpServers": {
"sim-copilot": {
"url": "https://www.sim.ai/api/mcp/copilot",
"headers": {
"X-API-Key": "YOUR_COPILOT_API_KEY"
}
}
}
}
```
Ersetzen Sie `YOUR_COPILOT_API_KEY` durch den oben generierten Schlüssel.
### Claude Code
Führen Sie den folgenden Befehl aus, um den Copilot MCP-Server hinzuzufügen:
```bash
claude mcp add sim-copilot \
--transport http \
https://www.sim.ai/api/mcp/copilot \
--header "X-API-Key: YOUR_COPILOT_API_KEY"
```
Ersetzen Sie `YOUR_COPILOT_API_KEY` durch Ihren Schlüssel.
### Claude Desktop
Claude Desktop benötigt [`mcp-remote`](https://www.npmjs.com/package/mcp-remote), um sich mit HTTP-basierten MCP-Servern zu verbinden. Fügen Sie Folgendes zu Ihrer Claude Desktop-Konfigurationsdatei hinzu (`~/Library/Application Support/Claude/claude_desktop_config.json` unter macOS):
```json
{
"mcpServers": {
"sim-copilot": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://www.sim.ai/api/mcp/copilot",
"--header",
"X-API-Key: YOUR_COPILOT_API_KEY"
]
}
}
}
```
Ersetzen Sie `YOUR_COPILOT_API_KEY` durch Ihren Schlüssel.
### VS Code
Fügen Sie Folgendes zu Ihrer VS Code `settings.json` oder Workspace `.vscode/settings.json` hinzu:
```json
{
"mcp": {
"servers": {
"sim-copilot": {
"type": "http",
"url": "https://www.sim.ai/api/mcp/copilot",
"headers": {
"X-API-Key": "YOUR_COPILOT_API_KEY"
}
}
}
}
}
```
Ersetzen Sie `YOUR_COPILOT_API_KEY` durch Ihren Schlüssel.
<Callout type="info">
Für selbst gehostete Deployments ersetzen Sie `https://www.sim.ai` durch Ihre selbst gehostete Sim-URL.
</Callout>

View File

@@ -75,3 +75,40 @@ Für selbst gehostete Bereitstellungen können Enterprise-Funktionen über Umgeb
<Callout type="warn">
BYOK ist nur im gehosteten Sim verfügbar. Selbst gehostete Deployments konfigurieren AI-Provider-Schlüssel direkt über Umgebungsvariablen.
</Callout>
Wenn die Abrechnung deaktiviert ist, verwenden Sie die Admin-API zur Verwaltung von Organisationen:
```bash
# Create an organization
curl -X POST https://your-instance/api/v1/admin/organizations \
-H "x-admin-key: YOUR_ADMIN_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "My Organization", "ownerId": "user-id-here"}'
# Add a member
curl -X POST https://your-instance/api/v1/admin/organizations/{orgId}/members \
-H "x-admin-key: YOUR_ADMIN_API_KEY" \
-H "Content-Type: application/json" \
-d '{"userId": "user-id-here", "role": "admin"}'
```
### Workspace-Mitglieder
Wenn Einladungen deaktiviert sind, verwenden Sie die Admin-API zur direkten Verwaltung von Workspace-Mitgliedschaften:
```bash
# Add a user to a workspace
curl -X POST https://your-instance/api/v1/admin/workspaces/{workspaceId}/members \
-H "x-admin-key: YOUR_ADMIN_API_KEY" \
-H "Content-Type: application/json" \
-d '{"userId": "user-id-here", "permissions": "write"}'
# Remove a user from a workspace
curl -X DELETE "https://your-instance/api/v1/admin/workspaces/{workspaceId}/members?userId=user-id-here" \
-H "x-admin-key: YOUR_ADMIN_API_KEY"
```
### Hinweise
- Die Aktivierung von `ACCESS_CONTROL_ENABLED` aktiviert automatisch Organisationen, da die Zugriffskontrolle eine Organisationsmitgliedschaft erfordert.
- Wenn `DISABLE_INVITATIONS` gesetzt ist, können Benutzer keine Einladungen versenden. Verwenden Sie stattdessen die Admin-API zur Verwaltung von Workspace- und Organisationsmitgliedschaften.

View File

@@ -241,4 +241,45 @@ Dies verteilt große Mehrverbrauchsgebühren über den Monat, anstatt einer gro
- Überprüfen Sie Ihre aktuelle Nutzung unter [Einstellungen → Abonnement](https://sim.ai/settings/subscription)
- Erfahren Sie mehr über [Protokollierung](/execution/logging), um Ausführungsdetails zu verfolgen
- Entdecken Sie die [externe API](/execution/api) für programmatische Kostenüberwachung
- Sehen Sie sich [Workflow-Optimierungstechniken](/blocks) an, um Kosten zu reduzieren
- Sehen Sie sich [Workflow-Optimierungstechniken](/blocks) an, um Kosten zu reduzieren
**Pro-Tarif (20 $/Monat):**
- Monatliches Abonnement beinhaltet 20 $ Nutzung
- Nutzung unter 20 $ → Keine zusätzlichen Gebühren
- Nutzung über 20 $ → Mehrverbrauch wird am Monatsende abgerechnet
- Beispiel: 35 $ Nutzung = 20 $ (Abonnement) + 15 $ (Mehrverbrauch)
**Team-Tarif (40 $/Platz/Monat):**
- Gemeinsame Nutzung über alle Teammitglieder hinweg
- Mehrverbrauch wird aus der gesamten Teamnutzung berechnet
- Der Organisationsinhaber erhält eine Rechnung
**Enterprise-Tarife:**
- Fester Monatspreis, keine Mehrverbräuche
- Individuelle Nutzungslimits gemäß Vereinbarung
### Schwellenwertabrechnung
Wenn der nicht abgerechnete Mehrverbrauch 50 $ erreicht, rechnet Sim automatisch den gesamten nicht abgerechneten Betrag ab.
**Beispiel:**
- Tag 10: 70 $ Mehrverbrauch → 70 $ sofort abrechnen
- Tag 15: Weitere 35 $ Nutzung (105 $ gesamt) → Bereits abgerechnet, keine Aktion
- Tag 20: Weitere 50 $ Nutzung (155 $ gesamt, 85 $ nicht abgerechnet) → 85 $ sofort abrechnen
Dies verteilt hohe Mehrverbrauchsgebühren über den Monat hinweg, anstatt einer großen Rechnung am Periodenende.
## Best Practices für das Kostenmanagement
1. **Regelmäßig überwachen**: Überprüfen Sie Ihr Nutzungs-Dashboard häufig, um Überraschungen zu vermeiden
2. **Budgets festlegen**: Nutzen Sie Tariflimits als Leitplanken für Ihre Ausgaben
3. **Workflows optimieren**: Überprüfen Sie kostenintensive Ausführungen und optimieren Sie Prompts oder Modellauswahl
4. **Passende Modelle verwenden**: Stimmen Sie die Modellkomplexität auf die Aufgabenanforderungen ab
5. **Ähnliche Aufgaben bündeln**: Kombinieren Sie mehrere Anfragen, wenn möglich, um den Overhead zu reduzieren
## Nächste Schritte
- Überprüfen Sie Ihre aktuelle Nutzung unter [Einstellungen → Abonnement](https://sim.ai/settings/subscription)
- Erfahren Sie mehr über [Protokollierung](/execution/logging), um Ausführungsdetails zu verfolgen
- Erkunden Sie die [externe API](/execution/api) für programmatische Kostenüberwachung
- Informieren Sie sich über [Workflow-Optimierungstechniken](/blocks), um Kosten zu reduzieren

View File

@@ -0,0 +1,172 @@
---
title: Dateien übergeben
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
Sim macht es einfach, mit Dateien in Ihren Workflows zu arbeiten. Blöcke können Dateien empfangen, verarbeiten und nahtlos an andere Blöcke weitergeben.
## Dateiobjekte
Wenn Blöcke Dateien ausgeben (wie Gmail-Anhänge, generierte Bilder oder geparste Dokumente), geben sie ein standardisiertes Dateiobjekt zurück:
```json
{
"name": "report.pdf",
"url": "https://...",
"base64": "JVBERi0xLjQK...",
"type": "application/pdf",
"size": 245678
}
```
Sie können auf alle diese Eigenschaften zugreifen, wenn Sie auf Dateien aus vorherigen Blöcken verweisen.
## Der Datei-Block
Der **Datei-Block** ist der universelle Einstiegspunkt für Dateien in Ihren Workflows. Er akzeptiert Dateien aus jeder Quelle und gibt standardisierte Dateiobjekte aus, die mit allen Integrationen funktionieren.
**Eingaben:**
- **Hochgeladene Dateien** - Dateien direkt per Drag & Drop oder Auswahl hinzufügen
- **Externe URLs** - Jede öffentlich zugängliche Datei-URL
- **Dateien von anderen Blöcken** - Dateien von Gmail-Anhängen, Slack-Downloads usw. übergeben
**Ausgaben:**
- Eine Liste von `UserFile`-Objekten mit konsistenter Struktur (`name`, `url`, `base64`, `type`, `size`)
- `combinedContent` - Extrahierter Textinhalt aus allen Dateien (für Dokumente)
**Beispielverwendung:**
```
// Get all files from the File block
<file.files>
// Get the first file
<file.files[0]>
// Get combined text content from parsed documents
<file.combinedContent>
```
Der Datei-Block führt automatisch folgende Aktionen aus:
- Erkennt Dateitypen aus URLs und Erweiterungen
- Extrahiert Text aus PDFs, CSVs und Dokumenten
- Generiert Base64-Kodierung für Binärdateien
- Erstellt vorsignierte URLs für sicheren Zugriff
Verwenden Sie den Datei-Block, wenn Sie Dateien aus verschiedenen Quellen normalisieren müssen, bevor Sie sie an andere Blöcke wie Vision, STT oder E-Mail-Integrationen übergeben.
## Dateien zwischen Blöcken übergeben
Verweisen Sie auf Dateien aus vorherigen Blöcken über das Tag-Dropdown. Klicken Sie in ein beliebiges Dateieingabefeld und geben Sie `<` ein, um verfügbare Ausgaben anzuzeigen.
**Häufige Muster:**
```
// Single file from a block
<gmail.attachments[0]>
// Pass the whole file object
<file_parser.files[0]>
// Access specific properties
<gmail.attachments[0].name>
<gmail.attachments[0].base64>
```
Die meisten Blöcke akzeptieren das vollständige Dateiobjekt und extrahieren automatisch, was sie benötigen. Sie müssen `base64` oder `url` in den meisten Fällen nicht manuell extrahieren.
## Workflows mit Dateien auslösen
Wenn Sie einen Workflow über die API aufrufen, der Dateieingaben erwartet, fügen Sie Dateien in Ihre Anfrage ein:
<Tabs items={['Base64', 'URL']}>
<Tab value="Base64">
```bash
curl -X POST "https://sim.ai/api/workflows/YOUR_WORKFLOW_ID/execute" \
-H "Content-Type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{
"document": {
"name": "report.pdf",
"base64": "JVBERi0xLjQK...",
"type": "application/pdf"
}
}'
```
</Tab>
<Tab value="URL">
```bash
curl -X POST "https://sim.ai/api/workflows/YOUR_WORKFLOW_ID/execute" \
-H "Content-Type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{
"document": {
"name": "report.pdf",
"url": "https://example.com/report.pdf",
"type": "application/pdf"
}
}'
```
</Tab>
</Tabs>
Der Start-Block des Workflows sollte ein Eingabefeld haben, das für den Empfang des Dateiparameters konfiguriert ist.
## Dateien in API-Antworten empfangen
Wenn ein Workflow Dateien ausgibt, sind diese in der Antwort enthalten:
```json
{
"success": true,
"output": {
"generatedFile": {
"name": "output.png",
"url": "https://...",
"base64": "iVBORw0KGgo...",
"type": "image/png",
"size": 34567
}
}
}
```
Verwenden Sie `url` für direkte Downloads oder `base64` für Inline-Verarbeitung.
## Blöcke, die mit Dateien arbeiten
**Dateieingaben:**
- **File** - Dokumente, Bilder und Textdateien parsen
- **Vision** - Bilder mit KI-Modellen analysieren
- **Mistral Parser** - Text aus PDFs extrahieren
**Dateiausgaben:**
- **Gmail** - E-Mail-Anhänge
- **Slack** - Heruntergeladene Dateien
- **TTS** - Generierte Audiodateien
- **Video Generator** - Generierte Videos
- **Image Generator** - Generierte Bilder
**Dateispeicherung:**
- **Supabase** - Upload/Download aus dem Speicher
- **S3** - AWS S3-Operationen
- **Google Drive** - Drive-Dateioperationen
- **Dropbox** - Dropbox-Dateioperationen
<Callout type="info">
Dateien sind automatisch für nachgelagerte Blöcke verfügbar. Die Ausführungs-Engine übernimmt die gesamte Dateiübertragung und Formatkonvertierung.
</Callout>
## Best Practices
1. **Dateiobjekte direkt verwenden** - Übergeben Sie das vollständige Dateiobjekt, anstatt einzelne Eigenschaften zu extrahieren. Blöcke übernehmen die Konvertierung automatisch.
2. **Dateitypen prüfen** - Stellen Sie sicher, dass der Dateityp mit dem übereinstimmt, was der empfangende Block erwartet. Der Vision-Block benötigt Bilder, der File-Block verarbeitet Dokumente.
3. **Dateigröße beachten** Große Dateien erhöhen die Ausführungszeit. Bei sehr großen Dateien sollten Sie Storage-Blöcke (S3, Supabase) für die Zwischenspeicherung verwenden.

View File

@@ -0,0 +1,142 @@
---
title: Formular-Bereitstellung
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
Stellen Sie Ihren Workflow als einbettbares Formular bereit, das Benutzer auf Ihrer Website ausfüllen oder per Link teilen können. Formularübermittlungen lösen Ihren Workflow mit dem `form` Trigger-Typ aus.
## Übersicht
Die Formular-Bereitstellung verwandelt das Eingabeformat Ihres Workflows in ein responsives Formular, das:
- Per Direktlink geteilt werden kann (z. B. `https://sim.ai/form/my-survey`)
- Mit einem iframe in jede Website eingebettet werden kann
Wenn ein Benutzer das Formular absendet, wird Ihr Workflow mit den Formulardaten ausgelöst.
<Callout type="info">
Formulare leiten ihre Felder vom Eingabeformat des Start-Blocks Ihres Workflows ab. Jedes Feld wird zu einer Formulareingabe mit dem entsprechenden Typ.
</Callout>
## Erstellen eines Formulars
1. Öffnen Sie Ihren Workflow und klicken Sie auf **Bereitstellen**
2. Wählen Sie den Tab **Formular**
3. Konfigurieren Sie:
- **URL**: Eindeutige Kennung (z. B. `contact-form` → `sim.ai/form/contact-form`)
- **Titel**: Formularüberschrift
- **Beschreibung**: Optionaler Untertitel
- **Formularfelder**: Passen Sie Beschriftungen und Beschreibungen für jedes Feld an
- **Authentifizierung**: Öffentlich, passwortgeschützt oder E-Mail-Whitelist
- **Dankesnachricht**: Wird nach der Übermittlung angezeigt
4. Klicken Sie auf **Starten**
## Feldzuordnung
| Eingabeformat-Typ | Formularfeld |
|------------------|------------|
| `string` | Texteingabe |
| `number` | Zahleneingabe |
| `boolean` | Umschalter |
| `object` | JSON-Editor |
| `array` | JSON-Array-Editor |
| `files` | Datei-Upload |
## Zugriffskontrolle
| Modus | Beschreibung |
|------|-------------|
| **Öffentlich** | Jeder mit dem Link kann absenden |
| **Passwort** | Benutzer müssen ein Passwort eingeben |
| **E-Mail-Whitelist** | Nur angegebene E-Mails/Domains können absenden |
Für E-Mail-Whitelist:
- Exakt: `user@example.com`
- Domain: `@example.com` (alle E-Mails von der Domain)
## Einbettung
### Direkter Link
```
https://sim.ai/form/your-identifier
```
### Iframe
```html
<iframe
src="https://sim.ai/form/your-identifier"
width="100%"
height="600"
frameborder="0"
title="Form"
></iframe>
```
## API-Übermittlung
Formulare programmatisch übermitteln:
<Tabs items={['cURL', 'TypeScript']}>
<Tab value="cURL">
```bash
curl -X POST https://sim.ai/api/form/your-identifier \
-H "Content-Type: application/json" \
-d '{
"formData": {
"name": "John Doe",
"email": "john@example.com"
}
}'
```
</Tab>
<Tab value="TypeScript">
```typescript
const response = await fetch('https://sim.ai/api/form/your-identifier', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
formData: {
name: 'John Doe',
email: 'john@example.com'
}
})
});
const result = await response.json();
// { success: true, data: { executionId: '...' } }
```
</Tab>
</Tabs>
### Geschützte Formulare
Für passwortgeschützte Formulare:
```bash
curl -X POST https://sim.ai/api/form/your-identifier \
-H "Content-Type: application/json" \
-d '{ "password": "secret", "formData": { "name": "John" } }'
```
Für E-Mail-geschützte Formulare:
```bash
curl -X POST https://sim.ai/api/form/your-identifier \
-H "Content-Type: application/json" \
-d '{ "email": "allowed@example.com", "formData": { "name": "John" } }'
```
## Fehlerbehebung
**"Keine Eingabefelder konfiguriert"** - Fügen Sie Eingabeformat-Felder zu Ihrem Start-Block hinzu.
**Formular lädt nicht im Iframe** - Überprüfen Sie, ob die CSP Ihrer Website Iframes von `sim.ai` erlaubt.
**Übermittlungen schlagen fehl** - Überprüfen Sie, ob die Kennung korrekt ist und erforderliche Felder ausgefüllt sind.

View File

@@ -0,0 +1,24 @@
{
"title": "Sim Documentation",
"pages": [
"./introduction/index",
"./getting-started/index",
"./quick-reference/index",
"triggers",
"blocks",
"tools",
"connections",
"mcp",
"copilot",
"skills",
"knowledgebase",
"variables",
"credentials",
"execution",
"permissions",
"self-hosting",
"./enterprise/index",
"./keyboard-shortcuts/index"
],
"defaultOpen": false
}

View File

@@ -0,0 +1,394 @@
---
title: Kurzreferenz
description: Wesentliche Aktionen zum Navigieren und Verwenden des Sim-Workflow-Editors
---
import { Callout } from 'fumadocs-ui/components/callout'
import { ActionImage, ActionVideo } from '@/components/ui/action-media'
Eine schnelle Übersicht für alltägliche Aktionen im Sim-Workflow-Editor. Für Tastaturkürzel siehe [Tastaturkürzel](/keyboard-shortcuts).
<Callout type="info">
**Mod** bezieht sich auf `Cmd` unter macOS und `Ctrl` unter Windows/Linux.
</Callout>
## Arbeitsbereiche
<table>
<thead>
<tr><th>Aktion</th><th>Wie</th><th>Vorschau</th></tr>
</thead>
<tbody>
<tr>
<td>Arbeitsbereich erstellen</td>
<td>Arbeitsbereich-Dropdown anklicken → **Neuer Arbeitsbereich**</td>
<td><ActionVideo src="quick-reference/create-workspace.mp4" alt="Arbeitsbereich erstellen" /></td>
</tr>
<tr>
<td>Arbeitsbereiche wechseln</td>
<td>Arbeitsbereich-Dropdown anklicken → Arbeitsbereich auswählen</td>
<td><ActionVideo src="quick-reference/switch-workspace.mp4" alt="Arbeitsbereiche wechseln" /></td>
</tr>
<tr>
<td>Teammitglieder einladen</td>
<td>Seitenleiste → **Einladen**</td>
<td><ActionVideo src="quick-reference/invite.mp4" alt="Teammitglieder einladen" /></td>
</tr>
<tr>
<td>Arbeitsbereich umbenennen</td>
<td>Rechtsklick auf Arbeitsbereich → **Umbenennen**</td>
<td rowSpan={4}><ActionImage src="/static/quick-reference/workspace-context-menu.png" alt="Arbeitsbereich-Kontextmenü" /></td>
</tr>
<tr>
<td>Arbeitsbereich duplizieren</td>
<td>Rechtsklick auf Arbeitsbereich → **Duplizieren**</td>
</tr>
<tr>
<td>Arbeitsbereich exportieren</td>
<td>Rechtsklick auf Arbeitsbereich → **Exportieren**</td>
</tr>
<tr>
<td>Arbeitsbereich löschen</td>
<td>Rechtsklick auf Arbeitsbereich → **Löschen**</td>
</tr>
</tbody>
</table>
## Workflows
<table>
<thead>
<tr><th>Aktion</th><th>Wie</th><th>Vorschau</th></tr>
</thead>
<tbody>
<tr>
<td>Workflow erstellen</td>
<td>**+**-Schaltfläche in der Seitenleiste anklicken</td>
<td><ActionImage src="/static/quick-reference/create-workflow.png" alt="Workflow erstellen" /></td>
</tr>
<tr>
<td>Workflows neu anordnen / verschieben</td>
<td>Workflow nach oben/unten oder auf einen Ordner ziehen</td>
<td><ActionVideo src="quick-reference/reordering.mp4" alt="Workflows neu anordnen" /></td>
</tr>
<tr>
<td>Workflow importieren</td>
<td>Import-Schaltfläche in der Seitenleiste anklicken → Datei auswählen</td>
<td><ActionImage src="/static/quick-reference/import-workflow.png" alt="Workflow importieren" /></td>
</tr>
<tr>
<td>Mehrere Workflows auswählen</td>
<td>`Mod+Click` oder `Shift+Click` Workflows in der Seitenleiste</td>
<td><ActionVideo src="quick-reference/multiselect.mp4" alt="Mehrere Workflows auswählen" /></td>
</tr>
<tr>
<td>In neuem Tab öffnen</td>
<td>Rechtsklick auf Workflow → **In neuem Tab öffnen**</td>
<td rowSpan={6}><ActionImage src="/static/quick-reference/workflow-context-menu.png" alt="Workflow-Kontextmenü" /></td>
</tr>
<tr>
<td>Workflow umbenennen</td>
<td>Rechtsklick auf Workflow → **Umbenennen**</td>
</tr>
<tr>
<td>Workflow-Farbe zuweisen</td>
<td>Rechtsklick auf Workflow → **Farbe ändern**</td>
</tr>
<tr>
<td>Workflow duplizieren</td>
<td>Rechtsklick auf Workflow → **Duplizieren**</td>
</tr>
<tr>
<td>Workflow exportieren</td>
<td>Rechtsklick auf Workflow → **Exportieren**</td>
</tr>
<tr>
<td>Workflow löschen</td>
<td>Rechtsklick auf Workflow → **Löschen**</td>
</tr>
<tr>
<td>Ordner umbenennen</td>
<td>Rechtsklick auf Ordner → **Umbenennen**</td>
<td rowSpan={6}><ActionImage src="/static/quick-reference/folder-context-menu.png" alt="Ordner-Kontextmenü" /></td>
</tr>
<tr>
<td>Workflow in Ordner erstellen</td>
<td>Rechtsklick auf Ordner → **Workflow erstellen**</td>
</tr>
<tr>
<td>Ordner in Ordner erstellen</td>
<td>Rechtsklick auf Ordner → **Ordner erstellen**</td>
</tr>
<tr>
<td>Ordner duplizieren</td>
<td>Rechtsklick auf Ordner → **Duplizieren**</td>
</tr>
<tr>
<td>Ordner exportieren</td>
<td>Rechtsklick auf Ordner → **Exportieren**</td>
</tr>
<tr>
<td>Ordner löschen</td>
<td>Rechtsklick auf Ordner → **Löschen**</td>
</tr>
</tbody>
</table>
## Blöcke
<table>
<thead>
<tr><th>Aktion</th><th>Wie</th><th>Vorschau</th></tr>
</thead>
<tbody>
<tr>
<td>Block hinzufügen</td>
<td>Aus Toolbar-Panel ziehen oder Rechtsklick auf Canvas → **Block hinzufügen**</td>
<td><ActionVideo src="quick-reference/add-block.mp4" alt="Block hinzufügen" /></td>
</tr>
<tr>
<td>Mehrere Blöcke auswählen</td>
<td>`Mod+Click` zusätzliche Blöcke oder Shift-Ziehen für Auswahlrahmen</td>
<td><ActionVideo src="quick-reference/multiselect-blocks.mp4" alt="Mehrere Blöcke auswählen" /></td>
</tr>
<tr>
<td>Blöcke kopieren</td>
<td>`Mod+C` mit ausgewählten Blöcken</td>
<td rowSpan={2}><ActionVideo src="quick-reference/copy-paste.mp4" alt="Blöcke kopieren und einfügen" /></td>
</tr>
<tr>
<td>Blöcke einfügen</td>
<td>`Mod+V` zum Einfügen kopierter Blöcke</td>
</tr>
<tr>
<td>Blöcke duplizieren</td>
<td>Rechtsklick → **Duplizieren**</td>
<td><ActionVideo src="quick-reference/duplicate-block.mp4" alt="Blöcke duplizieren" /></td>
</tr>
<tr>
<td>Blöcke löschen</td>
<td>`Delete` oder `Backspace` Taste oder Rechtsklick → **Löschen**</td>
<td><ActionImage src="/static/quick-reference/delete-block.png" alt="Block löschen" /></td>
</tr>
<tr>
<td>Block umbenennen</td>
<td>Auf Blocknamen im Header klicken oder im Editor-Panel bearbeiten</td>
<td><ActionVideo src="quick-reference/rename-block.mp4" alt="Block umbenennen" /></td>
</tr>
<tr>
<td>Block aktivieren/deaktivieren</td>
<td>Rechtsklick → **Aktivieren/Deaktivieren**</td>
<td><ActionImage src="/static/quick-reference/disable-block.png" alt="Block deaktivieren" /></td>
</tr>
<tr>
<td>Block sperren/entsperren</td>
<td>Über Block hovern → Auf Schloss-Symbol klicken (nur Admin)</td>
<td><ActionImage src="/static/quick-reference/lock-block.png" alt="Block sperren" /></td>
</tr>
<tr>
<td>Handle-Ausrichtung umschalten</td>
<td>Rechtsklick → **Handles umschalten**</td>
<td><ActionVideo src="quick-reference/toggle-handles.mp4" alt="Handle-Ausrichtung umschalten" /></td>
</tr>
<tr>
<td>Block konfigurieren</td>
<td>Block auswählen → Editor-Panel rechts verwenden</td>
<td><ActionVideo src="quick-reference/configure-block.mp4" alt="Block konfigurieren" /></td>
</tr>
</tbody>
</table>
## Verbindungen
<table>
<thead>
<tr><th>Aktion</th><th>Wie</th><th>Vorschau</th></tr>
</thead>
<tbody>
<tr>
<td>Verbindung erstellen</td>
<td>Vom Ausgangs-Handle zum Eingangs-Handle ziehen</td>
<td><ActionVideo src="quick-reference/connect-blocks.mp4" alt="Blöcke verbinden" /></td>
</tr>
<tr>
<td>Verbindung löschen</td>
<td>Auf Kante klicken zum Auswählen → `Delete` Taste</td>
<td><ActionVideo src="quick-reference/delete-connection.mp4" alt="Verbindung löschen" /></td>
</tr>
<tr>
<td>Ausgabe in anderem Block verwenden</td>
<td>Verbindungs-Tag in Eingabefeld ziehen</td>
<td><ActionVideo src="quick-reference/connection-tag.mp4" alt="Verbindungs-Tag verwenden" /></td>
</tr>
</tbody>
</table>
## Panels und Ansichten
<table>
<thead>
<tr><th>Aktion</th><th>Wie</th><th>Vorschau</th></tr>
</thead>
<tbody>
<tr>
<td>Symbolleiste durchsuchen</td>
<td>`Mod+F`</td>
<td><ActionVideo src="quick-reference/search-toolbar.mp4" alt="Symbolleiste durchsuchen" /></td>
</tr>
<tr>
<td>Alles durchsuchen</td>
<td>`Mod+K`</td>
<td><ActionImage src="/static/quick-reference/search-everything.png" alt="Alles durchsuchen" /></td>
</tr>
<tr>
<td>Manuellen Modus umschalten</td>
<td>Klicken Sie auf die Umschalt-Schaltfläche, um zwischen manuell und Selektor zu wechseln</td>
<td><ActionImage src="/static/quick-reference/toggle-manual-mode.png" alt="Manuellen Modus umschalten" /></td>
</tr>
<tr>
<td>Seitenleiste ein-/ausklappen</td>
<td>Klicken Sie auf die Einklappen-Schaltfläche in der Seitenleiste</td>
<td><ActionVideo src="quick-reference/collapse-sidebar.mp4" alt="Seitenleiste einklappen" /></td>
</tr>
</tbody>
</table>
## Ausführen und Testen
<table>
<thead>
<tr><th>Aktion</th><th>Wie</th><th>Vorschau</th></tr>
</thead>
<tbody>
<tr>
<td>Workflow ausführen</td>
<td>Klicken Sie auf die Schaltfläche Workflow ausführen oder `Mod+Enter`</td>
<td><ActionImage src="/static/quick-reference/run-workflow.png" alt="Workflow ausführen" /></td>
</tr>
<tr>
<td>Workflow stoppen</td>
<td>Klicken Sie auf die Stopp-Schaltfläche oder `Mod+Enter` während der Ausführung</td>
<td><ActionImage src="/static/quick-reference/stop-workflow.png" alt="Workflow stoppen" /></td>
</tr>
<tr>
<td>Mit Chat testen</td>
<td>Verwenden Sie das Chat-Panel auf der rechten Seite</td>
<td><ActionImage src="/static/quick-reference/test-chat.png" alt="Mit Chat testen" /></td>
</tr>
<tr>
<td>Ausgabe zum Anzeigen auswählen</td>
<td>Klicken Sie auf das Dropdown-Menü im Chat-Panel → Wählen Sie Block-Ausgabe aus</td>
<td><ActionImage src="/static/quick-reference/output-select.png" alt="Ausgabe zum Anzeigen auswählen" /></td>
</tr>
<tr>
<td>Chat-Verlauf löschen</td>
<td>Klicken Sie auf die Löschen-Schaltfläche im Chat-Panel</td>
<td><ActionImage src="/static/quick-reference/clear-chat.png" alt="Chat-Verlauf löschen" /></td>
</tr>
<tr>
<td>Ab Block ausführen</td>
<td>Bewegen Sie den Mauszeiger über den Block → Klicken Sie auf die Wiedergabe-Schaltfläche oder Rechtsklick → **Ab Block ausführen**</td>
<td><ActionImage src="/static/quick-reference/run-from-block.png" alt="Ab Block ausführen" /></td>
</tr>
<tr>
<td>Bis Block ausführen</td>
<td>Rechtsklick auf Block → **Bis Block ausführen**</td>
<td><ActionImage src="/static/quick-reference/run-until-block.png" alt="Bis Block ausführen" /></td>
</tr>
<tr>
<td>Ausführungsprotokolle anzeigen</td>
<td>Öffnen Sie das Terminal-Panel unten oder `Mod+L`</td>
<td><ActionImage src="/static/quick-reference/terminal.png" alt="Terminal für Ausführungsprotokolle" /></td>
</tr>
<tr>
<td>Protokolle filtern</td>
<td>Klicken Sie auf das Filter-Symbol im Terminal → Filtern Sie nach Block oder Status</td>
<td><ActionImage src="/static/quick-reference/filter-block.png" alt="Protokolle nach Block filtern" /></td>
</tr>
<tr>
<td>Protokolle durchsuchen</td>
<td>Verwenden Sie das Suchfeld im Terminal oder Rechtsklick auf Protokolleintrag → **Suchen**</td>
<td><ActionImage src="/static/quick-reference/terminal-search.png" alt="Protokolle durchsuchen" /></td>
</tr>
<tr>
<td>Protokolleintrag kopieren</td>
<td>Zwischenablage-Symbol oder Rechtsklick auf Protokolleintrag → **Kopieren**</td>
<td><ActionImage src="/static/quick-reference/copy-log.png" alt="Protokolleintrag kopieren" /></td>
</tr>
<tr>
<td>Terminal leeren</td>
<td>Papierkorb-Symbol oder `Mod+D`</td>
<td><ActionImage src="/static/quick-reference/clear-terminal.png" alt="Terminal leeren" /></td>
</tr>
</tbody>
</table>
## Bereitstellung
<table>
<thead>
<tr><th>Aktion</th><th>Wie</th><th>Vorschau</th></tr>
</thead>
<tbody>
<tr>
<td>Workflow bereitstellen</td>
<td>Klicken Sie auf die Schaltfläche **Bereitstellen** im Panel</td>
<td><ActionImage src="/static/quick-reference/deploy.png" alt="Workflow bereitstellen" /></td>
</tr>
<tr>
<td>Bereitstellung aktualisieren</td>
<td>Klicken Sie auf **Aktualisieren**, wenn Änderungen erkannt werden</td>
<td><ActionImage src="/static/quick-reference/update-deployment.png" alt="Bereitstellung aktualisieren" /></td>
</tr>
<tr>
<td>Bereitstellungsstatus anzeigen</td>
<td>Überprüfen Sie die Statusanzeige (Live/Aktualisieren/Bereitstellen) im Tab „Bereitstellen"</td>
<td><ActionImage src="/static/quick-reference/view-deployment.png" alt="Bereitstellungsstatus anzeigen" /></td>
</tr>
<tr>
<td>Bereitstellung zurücksetzen</td>
<td>Greifen Sie auf frühere Versionen im Tab „Bereitstellen" zu → **Zu Live befördern**</td>
<td><ActionImage src="/static/quick-reference/promote-deployment.png" alt="Bereitstellung zu Live befördern" /></td>
</tr>
<tr>
<td>Versionsbeschreibung hinzufügen</td>
<td>Tab „Bereitstellen" → Klicken Sie auf das Beschreibungssymbol → Beschreibung hinzufügen oder generieren</td>
<td><ActionVideo src="quick-reference/deployment-description.mp4" alt="Versionsbeschreibung für Bereitstellung hinzufügen" /></td>
</tr>
<tr>
<td>API-Endpunkt kopieren</td>
<td>Tab „Bereitstellen" → API → API-cURL kopieren</td>
<td><ActionImage src="/static/quick-reference/copy-api.png" alt="API-Endpunkt kopieren" /></td>
</tr>
</tbody>
</table>
## Variablen
<table>
<thead>
<tr><th>Aktion</th><th>Wie</th><th>Vorschau</th></tr>
</thead>
<tbody>
<tr>
<td>Workflow-Variable hinzufügen / bearbeiten / löschen</td>
<td>Panel → Variablen → **Variable hinzufügen**, zum Bearbeiten klicken oder Löschsymbol verwenden</td>
<td><ActionImage src="/static/quick-reference/variables.png" alt="Variablen-Panel" /></td>
</tr>
<tr>
<td>Umgebungsvariable hinzufügen</td>
<td>Einstellungen → **Umgebungsvariablen** → **Hinzufügen**</td>
<td><ActionImage src="/static/quick-reference/add-env-variable.png" alt="Umgebungsvariable hinzufügen" /></td>
</tr>
<tr>
<td>Auf Workflow-Variable verweisen</td>
<td>Verwenden Sie die Syntax `<blockName.itemName>` in Block-Eingaben</td>
<td><ActionImage src="/static/quick-reference/variable-reference.png" alt="Auf Workflow-Variable verweisen" /></td>
</tr>
<tr>
<td>Auf Umgebungsvariable verweisen</td>
<td>Verwenden Sie die Syntax `{{ENV_VAR}}` in Block-Eingaben</td>
<td><ActionImage src="/static/quick-reference/env-variable-reference.png" alt="Auf Umgebungsvariable verweisen" /></td>
</tr>
</tbody>
</table>

View File

@@ -7,10 +7,10 @@ import { Card, Cards } from 'fumadocs-ui/components/card'
import { Step, Steps } from 'fumadocs-ui/components/steps'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
Das offizielle Python SDK für Sim ermöglicht es Ihnen, Workflows programmatisch aus Ihren Python-Anwendungen mithilfe des offiziellen Python SDKs auszuführen.
Das offizielle Python SDK für Sim ermöglicht es Ihnen, Workflows programmatisch aus Ihren Python-Anwendungen heraus mit dem offiziellen Python SDK auszuführen.
<Callout type="info">
Das Python SDK unterstützt Python 3.8+ mit asynchroner Ausführungsunterstützung, automatischer Ratenbegrenzung mit exponentiellem Backoff und Nutzungsverfolgung.
Das Python SDK unterstützt Python 3.8+ mit Unterstützung für asynchrone Ausführung, automatischer Ratenbegrenzung mit exponentiellem Backoff und Nutzungsverfolgung.
</Callout>
## Installation
@@ -75,16 +75,16 @@ result = client.execute_workflow(
- `input_data` (dict, optional): Eingabedaten, die an den Workflow übergeben werden
- `timeout` (float, optional): Timeout in Sekunden (Standard: 30.0)
- `stream` (bool, optional): Streaming-Antworten aktivieren (Standard: False)
- `selected_outputs` (list[str], optional): Block-Ausgaben, die im `blockName.attribute`Format gestreamt werden sollen (z.B. `["agent1.content"]`)
- `selected_outputs` (list[str], optional): Block-Ausgaben zum Streamen im Format `blockName.attribute` (z. B. `["agent1.content"]`)
- `async_execution` (bool, optional): Asynchron ausführen (Standard: False)
**Rückgabe:** `WorkflowExecutionResult | AsyncExecutionResult`
**Rückgabewert:** `WorkflowExecutionResult | AsyncExecutionResult`
Wenn `async_execution=True`, wird sofort mit einer Task-ID zum Abfragen zurückgegeben. Andernfalls wird auf den Abschluss gewartet.
Wenn `async_execution=True`, wird sofort mit einer Task-ID zum Polling zurückgegeben. Andernfalls wird auf die Fertigstellung gewartet.
##### get_workflow_status()
Den Status eines Workflows abrufen (Bereitstellungsstatus usw.).
Ruft den Status eines Workflows ab (Deployment-Status usw.).
```python
status = client.get_workflow_status("workflow-id")
@@ -98,7 +98,7 @@ print("Is deployed:", status.is_deployed)
##### validate_workflow()
Überprüfen, ob ein Workflow für die Ausführung bereit ist.
Überprüft, ob ein Workflow zur Ausführung bereit ist.
```python
is_ready = client.validate_workflow("workflow-id")
@@ -114,7 +114,7 @@ if is_ready:
##### get_job_status()
Den Status einer asynchronen Job-Ausführung abrufen.
Ruft den Status einer asynchronen Job-Ausführung ab.
```python
status = client.get_job_status("task-id-from-async-execution")
@@ -131,7 +131,7 @@ if status["status"] == "completed":
**Antwortfelder:**
- `success` (bool): Ob die Anfrage erfolgreich war
- `taskId` (str): Die Task-ID
- `status` (str): Einer der Werte `'queued'`, `'processing'`, `'completed'`, `'failed'`, `'cancelled'`
- `status` (str): Einer von `'queued'`, `'processing'`, `'completed'`, `'failed'`, `'cancelled'`
- `metadata` (dict): Enthält `startedAt`, `completedAt` und `duration`
- `output` (any, optional): Die Workflow-Ausgabe (wenn abgeschlossen)
- `error` (any, optional): Fehlerdetails (wenn fehlgeschlagen)
@@ -139,7 +139,7 @@ if status["status"] == "completed":
##### execute_with_retry()
Einen Workflow mit automatischer Wiederholung bei Ratenbegrenzungsfehlern unter Verwendung von exponentiellem Backoff ausführen.
Führt einen Workflow mit automatischer Wiederholung bei Rate-Limit-Fehlern unter Verwendung von exponentiellem Backoff aus.
```python
result = client.execute_with_retry(
@@ -161,13 +161,13 @@ result = client.execute_with_retry(
- `selected_outputs` (list, optional): Block-Ausgaben zum Streamen
- `async_execution` (bool, optional): Asynchron ausführen
- `max_retries` (int, optional): Maximale Anzahl von Wiederholungen (Standard: 3)
- `initial_delay` (float, optional): Anfängliche Verzögerung in Sekunden (Standard: 1.0)
- `initial_delay` (float, optional): Anfangsverzögerung in Sekunden (Standard: 1.0)
- `max_delay` (float, optional): Maximale Verzögerung in Sekunden (Standard: 30.0)
- `backoff_multiplier` (float, optional): Backoff-Multiplikator (Standard: 2.0)
**Rückgabewert:** `WorkflowExecutionResult | AsyncExecutionResult`
**Rückgabe:** `WorkflowExecutionResult | AsyncExecutionResult`
Die Wiederholungslogik verwendet exponentielles Backoff (1s → 2s → 4s → 8s...) mit ±25% Jitter, um den Thundering-Herd-Effekt zu vermeiden. Wenn die API einen `retry-after` Header bereitstellt, wird dieser stattdessen verwendet.
Die Wiederholungslogik verwendet exponentielles Backoff (1s → 2s → 4s → 8s...) mit ±25% Jitter, um Thundering Herd zu verhindern. Wenn die API einen `retry-after`-Header bereitstellt, wird dieser stattdessen verwendet.
##### get_rate_limit_info()
@@ -185,7 +185,7 @@ if rate_limit_info:
##### get_usage_limits()
Ruft aktuelle Nutzungslimits und Kontingentinformationen für dein Konto ab.
Ruft aktuelle Nutzungslimits und Kontingentinformationen für Ihr Konto ab.
```python
limits = client.get_usage_limits()
@@ -320,9 +320,9 @@ class SimStudioError(Exception):
**Häufige Fehlercodes:**
- `UNAUTHORIZED`: Ungültiger API-Schlüssel
- `TIMEOUT`: Zeitüberschreitung bei der Anfrage
- `RATE_LIMIT_EXCEEDED`: Ratengrenze überschritten
- `USAGE_LIMIT_EXCEEDED`: Nutzungsgrenze überschritten
- `TIMEOUT`: Zeitüberschreitung der Anfrage
- `RATE_LIMIT_EXCEEDED`: Ratenlimit überschritten
- `USAGE_LIMIT_EXCEEDED`: Nutzungslimit überschritten
- `EXECUTION_ERROR`: Workflow-Ausführung fehlgeschlagen
## Beispiele
@@ -334,7 +334,7 @@ class SimStudioError(Exception):
Richten Sie den SimStudioClient mit Ihrem API-Schlüssel ein.
</Step>
<Step title="Workflow validieren">
Prüfen Sie, ob der Workflow bereitgestellt und für die Ausführung bereit ist.
Prüfen Sie, ob der Workflow bereitgestellt und zur Ausführung bereit ist.
</Step>
<Step title="Workflow ausführen">
Führen Sie den Workflow mit Ihren Eingabedaten aus.
@@ -386,7 +386,7 @@ Behandeln Sie verschiedene Fehlertypen, die während der Workflow-Ausführung au
from simstudio import SimStudioClient, SimStudioError
import os
client = SimStudioClient(api_key=os.getenv("SIM_API_KEY"))
client = SimStudioClient(api_key=os.getenv("SIM_API_KEY"))
def execute_with_error_handling():
try:
@@ -409,11 +409,20 @@ def execute_with_error_handling():
raise
```
### Verwendung des Kontextmanagers
### Verwendung des Context-Managers
Verwenden Sie den Client als Kontextmanager, um die Ressourcenbereinigung automatisch zu handhaben:
Verwenden Sie den Client als Context-Manager, um die Ressourcenbereinigung automatisch zu handhaben:
---CODE-PLACEHOLDER-ef99d3dd509e04865d5b6b0e0e03d3f8---
```python
from simstudio import SimStudioClient
import os
# Using context manager to automatically close the session
with SimStudioClient(api_key=os.getenv("SIM_API_KEY")) as client:
result = client.execute_workflow("workflow-id")
print("Result:", result)
# Session is automatically closed here
```
### Batch-Workflow-Ausführung
@@ -466,7 +475,7 @@ for result in results:
### Asynchrone Workflow-Ausführung
Führen Sie Workflows asynchron für lang laufende Aufgaben aus:
Führen Sie Workflows asynchron für langwierige Aufgaben aus:
```python
import os
@@ -510,9 +519,9 @@ def execute_async():
execute_async()
```
### Rate-Limiting und Wiederholungsversuche
### Ratenlimitierung und Wiederholung
Behandle Rate-Limits automatisch mit exponentiellem Backoff:
Behandeln Sie Ratenbegrenzungen automatisch mit exponentiellem Backoff:
```python
import os
@@ -549,7 +558,7 @@ execute_with_retry_handling()
### Nutzungsüberwachung
Überwache deine Kontonutzung und -limits:
Überwachen Sie die Nutzung und Limits Ihres Kontos:
```python
import os
@@ -593,13 +602,13 @@ check_usage()
### Streaming-Workflow-Ausführung
Führe Workflows mit Echtzeit-Streaming-Antworten aus:
Führen Sie Workflows mit Echtzeit-Streaming-Antworten aus:
```python
from simstudio import SimStudioClient
import os
client = SimStudioClient(api_key=os.getenv("SIM_API_KEY"))
client = SimStudioClient(api_key=os.getenv("SIM_API_KEY"))
def execute_with_streaming():
"""Execute workflow with streaming enabled."""
@@ -619,7 +628,7 @@ def execute_with_streaming():
execute_with_streaming()
```
Die Streaming-Antwort folgt dem Server-Sent Events (SSE) Format:
Die Streaming-Antwort folgt dem Server-Sent-Events- (SSE-) Format:
```
data: {"blockId":"7b7735b9-19e5-4bd6-818b-46aae2596e9f","chunk":"One"}
@@ -688,9 +697,9 @@ if __name__ == '__main__':
app.run(debug=True)
```
### Umgebungskonfiguration
### Umgebungs­konfiguration
Konfiguriere den Client mit Umgebungsvariablen:
Konfigurieren Sie den Client mit Umgebungsvariablen:
<Tabs items={['Development', 'Production']}>
<Tab value="Development">
@@ -727,27 +736,27 @@ Konfiguriere den Client mit Umgebungsvariablen:
</Tab>
</Tabs>
## API-Schlüssel erhalten
## Ihren API-Schlüssel erhalten
<Steps>
<Step title="Bei Sim anmelden">
Navigiere zu [Sim](https://sim.ai) und melde dich bei deinem Konto an.
Navigieren Sie zu [Sim](https://sim.ai) und melden Sie sich in Ihrem Konto an.
</Step>
<Step title="Öffne deinen Workflow">
Navigiere zu dem Workflow, den du programmatisch ausführen möchtest.
<Step title="Workflow öffnen">
Navigieren Sie zu dem Workflow, den Sie programmatisch ausführen möchten.
</Step>
<Step title="Deploye deinen Workflow">
Klicke auf "Deploy", um deinen Workflow zu deployen, falls dies noch nicht geschehen ist.
<Step title="Workflow bereitstellen">
Klicken Sie auf "Bereitstellen", um Ihren Workflow bereitzustellen, falls dies noch nicht geschehen ist.
</Step>
<Step title="Erstelle oder wähle einen API-Schlüssel">
Wähle während des Deployment-Prozesses einen API-Schlüssel aus oder erstelle einen neuen.
<Step title="API-Schlüssel erstellen oder auswählen">
Wählen oder erstellen Sie während des Bereitstellungsprozesses einen API-Schlüssel.
</Step>
<Step title="Kopiere den API-Schlüssel">
Kopiere den API-Schlüssel zur Verwendung in deiner Python-Anwendung.
<Step title="API-Schlüssel kopieren">
Kopieren Sie den API-Schlüssel, um ihn in Ihrer Python-Anwendung zu verwenden.
</Step>
</Steps>
## Anforderungen
## Voraussetzungen
- Python 3.8+
- requests >= 2.25.0

View File

@@ -56,3 +56,10 @@ docker compose -f docker-compose.prod.yml up -d
| realtime | 3002 | WebSocket-Server |
| db | 5432 | PostgreSQL mit pgvector |
| migrations | - | Datenbank-Migrationen (werden einmal ausgeführt) |
| Komponente | Port | Beschreibung |
|-----------|------|-------------|
| simstudio | 3000 | Hauptanwendung |
| realtime | 3002 | WebSocket-Server |
| db | 5432 | PostgreSQL mit pgvector |
| migrations | - | Datenbankmigrationen (wird einmal ausgeführt) |

View File

@@ -0,0 +1,134 @@
---
title: Agent-Fähigkeiten
---
import { Callout } from 'fumadocs-ui/components/callout'
Agent-Fähigkeiten sind wiederverwendbare Anweisungspakete, die Ihren KI-Agenten spezialisierte Funktionen verleihen. Basierend auf dem offenen [Agent Skills](https://agentskills.io)-Format ermöglichen Fähigkeiten Ihnen, Fachwissen, Arbeitsabläufe und Best Practices zu erfassen, die Agenten bei Bedarf laden können.
## Wie Fähigkeiten funktionieren
Fähigkeiten nutzen **progressive Offenlegung**, um den Kontext des Agenten schlank zu halten:
1. **Entdeckung** — Nur Fähigkeitsnamen und Beschreibungen werden in den System-Prompt des Agenten aufgenommen (~50-100 Token jeweils)
2. **Aktivierung** — Wenn der Agent entscheidet, dass eine Fähigkeit relevant ist, ruft er das `load_skill`-Tool auf, um die vollständigen Anweisungen in den Kontext zu laden
3. **Ausführung** — Der Agent folgt den geladenen Anweisungen, um die Aufgabe zu erledigen
Das bedeutet, Sie können viele Fähigkeiten an einen Agenten anhängen, ohne dessen Kontextfenster aufzublähen. Der Agent lädt nur das, was er benötigt.
## Fähigkeiten erstellen
Gehen Sie zu **Einstellungen** und wählen Sie **Fähigkeiten** im Bereich Tools aus.
![Manage Skills](/static/skills/manage-skills.png)
Klicken Sie auf **Hinzufügen**, um eine neue Fähigkeit mit drei Feldern zu erstellen:
| Feld | Beschreibung |
|-------|-------------|
| **Name** | Eine Kennung im Kebab-Case-Format (z. B. `sql-expert`, `code-reviewer`). Maximal 64 Zeichen. |
| **Beschreibung** | Eine kurze Erklärung, was die Fähigkeit tut und wann sie verwendet werden soll. Dies liest der Agent, um zu entscheiden, ob er die Fähigkeit aktiviert. Maximal 1024 Zeichen. |
| **Inhalt** | Die vollständigen Fähigkeitsanweisungen in Markdown. Diese werden geladen, wenn der Agent die Fähigkeit aktiviert. |
<Callout type="info">
Die Beschreibung ist entscheidend — sie ist das Einzige, was der Agent sieht, bevor er entscheidet, eine Fähigkeit zu laden. Seien Sie spezifisch darüber, wann und warum die Fähigkeit verwendet werden sollte.
</Callout>
### Gute Skill-Inhalte schreiben
Skill-Inhalte folgen denselben Konventionen wie [SKILL.md-Dateien](https://agentskills.io/specification):
```markdown
# SQL Expert
## When to use this skill
Use when the user asks you to write, optimize, or debug SQL queries.
## Instructions
1. Always ask which database engine (PostgreSQL, MySQL, SQLite)
2. Use CTEs over subqueries for readability
3. Add index recommendations when relevant
4. Explain query plans for optimization requests
## Common Patterns
...
```
**Empfohlene Struktur:**
- **Wann verwenden** — Spezifische Auslöser und Szenarien
- **Anweisungen** — Schritt-für-Schritt-Anleitung mit nummerierten Listen
- **Beispiele** — Eingabe-/Ausgabe-Beispiele, die das erwartete Verhalten zeigen
- **Häufige Muster** — Wiederverwendbare Ansätze für häufige Aufgaben
- **Sonderfälle** — Fallstricke und besondere Überlegungen
Halten Sie Skills fokussiert und unter 500 Zeilen. Wenn ein Skill zu groß wird, teilen Sie ihn in mehrere spezialisierte Skills auf.
## Skills zu einem Agenten hinzufügen
Öffnen Sie einen beliebigen **Agent**-Block und finden Sie das **Skills**-Dropdown unterhalb des Tool-Bereichs. Wählen Sie die Skills aus, auf die der Agent Zugriff haben soll.
![Skill hinzufügen](/static/skills/add-skill.png)
Ausgewählte Skills erscheinen als Karten, die Sie anklicken können, um sie zu bearbeiten oder zu entfernen.
### Was zur Laufzeit passiert
Wenn der Workflow ausgeführt wird:
1. Der System-Prompt des Agenten enthält einen `<available_skills>`-Abschnitt, der Name und Beschreibung jedes Skills auflistet
2. Ein `load_skill`-Tool wird automatisch zu den verfügbaren Tools des Agenten hinzugefügt
3. Wenn der Agent feststellt, dass ein Skill für die aktuelle Aufgabe relevant ist, ruft er `load_skill` mit dem Skill-Namen auf
4. Der vollständige Skill-Inhalt wird als Tool-Antwort zurückgegeben und gibt dem Agenten detaillierte Anweisungen
Dies funktioniert über alle unterstützten LLM-Anbieter hinweg — das `load_skill`-Tool verwendet standardmäßiges Tool-Calling, sodass keine anbieterspezifische Konfiguration erforderlich ist.
## Häufige Anwendungsfälle
Skills sind besonders wertvoll, wenn Agenten spezialisiertes Wissen oder mehrstufige Workflows benötigen:
**Domain-Expertise**
- `api-integration-expert` — Best Practices für den Aufruf spezifischer APIs (Authentifizierung, Rate Limiting, Fehlerbehandlung)
- `data-transformation` — ETL-Muster, Datenbereinigung und Validierungsregeln
- `code-reviewer` — Code-Review-Richtlinien spezifisch für die Standards Ihres Teams
**Workflow-Vorlagen**
- `bug-investigation` — Schritt-für-Schritt-Debugging-Methodik (reproduzieren → isolieren → testen → beheben)
- `feature-implementation` — Entwicklungs-Workflow von Anforderungen bis zur Bereitstellung
- `document-generator` — Vorlagen und Formatierungsregeln für technische Dokumentation
**Unternehmensspezifisches Wissen**
- `our-architecture` — Systemarchitekturdiagramme, Service-Abhängigkeiten und Bereitstellungsprozesse
- `style-guide` — Markenrichtlinien, Schreibstil, UI/UX-Muster
- `customer-onboarding` — Standardverfahren und häufige Kundenfragen
**Wann Skills vs. Agentenanweisungen verwendet werden sollten:**
- Verwenden Sie **Skills** für Wissen, das über mehrere Workflows hinweg gilt oder sich häufig ändert
- Verwenden Sie **Agentenanweisungen** für aufgabenspezifischen Kontext, der für einen einzelnen Agenten einzigartig ist
## Best Practices
**Effektive Beschreibungen schreiben**
- **Seien Sie spezifisch und keyword-reich** — Statt "Hilft bei SQL", schreiben Sie "Optimierte SQL-Abfragen für PostgreSQL, MySQL und SQLite schreiben, einschließlich Index-Empfehlungen und Abfrageplan-Analyse"
- **Aktivierungstrigger einbeziehen** — Erwähnen Sie spezifische Wörter oder Phrasen, die den Skill auslösen sollten (z. B. "Verwenden, wenn der Benutzer PDFs, Formulare oder Dokumentenextraktion erwähnt")
- **Unter 200 Wörtern halten** — Agenten scannen Beschreibungen schnell; jedes Wort zählt
**Skill-Umfang und Organisation**
- **Ein Skill pro Domäne** — Ein fokussierter `sql-expert`-Skill funktioniert besser als ein breiter `database-everything`-Skill
- **Auf 5-10 Skills pro Agent begrenzen** — Mehr Skills = mehr Entscheidungsaufwand; klein anfangen und bei Bedarf erweitern
- **Große Skills aufteilen** — Wenn ein Skill 500 Zeilen überschreitet, in fokussierte Sub-Skills aufteilen
**Inhaltsstruktur**
- **Markdown-Formatierung verwenden** — Überschriften, Listen und Code-Blöcke helfen Agenten beim Parsen und Befolgen von Anweisungen
- **Beispiele bereitstellen** — Input/Output-Paare zeigen, damit Agenten das erwartete Verhalten verstehen
- **Explizit über Sonderfälle sein** — Gehen Sie nicht davon aus, dass Agenten spezielle Behandlung ableiten werden
**Testen und Iteration**
- **Aktivierung testen** — Führen Sie Ihren Workflow aus und überprüfen Sie, ob der Agent die Skill lädt, wenn erwartet
- **Auf Fehlalarme prüfen** — Stellen Sie sicher, dass Skills nicht aktiviert werden, wenn sie es nicht sollten
- **Beschreibungen verfeinern** — Wenn eine Skill nicht geladen wird, wenn sie benötigt wird, fügen Sie der Beschreibung weitere Schlüsselwörter hinzu
## Mehr erfahren
- [Agent Skills Spezifikation](https://agentskills.io) — Das offene Format für portable Agent-Skills
- [Beispiel-Skills](https://github.com/anthropics/skills) — Community-Skill-Beispiele durchsuchen
- [Best Practices](https://agentskills.io/what-are-skills) — Effektive Skills schreiben

View File

@@ -0,0 +1,207 @@
---
title: A2A
description: Interagiere mit externen A2A-kompatiblen Agenten
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="a2a"
color="#4151B5"
/>
{/* MANUAL-CONTENT-START:intro */}
Das A2A-Protokoll (Agent-to-Agent) ermöglicht es Sim, mit externen KI-Agenten und Systemen zu interagieren, die A2A-kompatible APIs implementieren. Mit A2A kannst du Sims Automatisierungen und Workflows mit Remote-Agenten verbinden wie LLM-gestützten Bots, Microservices und anderen KI-basierten Tools unter Verwendung eines standardisierten Nachrichtenformats.
Mit den A2A-Tools in Sim kannst du:
- **Nachrichten an externe Agenten senden**: Kommuniziere direkt mit Remote-Agenten und übermittle Prompts, Befehle oder Daten.
- **Antworten empfangen und streamen**: Erhalte strukturierte Antworten, Artefakte oder Echtzeit-Updates vom Agenten, während die Aufgabe fortschreitet.
- **Gespräche oder Aufgaben fortsetzen**: Führe mehrstufige Konversationen oder Workflows fort, indem du auf Aufgaben- und Kontext-IDs verweist.
- **Drittanbieter-KI und Automatisierung integrieren**: Nutze externe A2A-kompatible Dienste als Teil deiner Sim-Workflows.
Diese Funktionen ermöglichen es dir, fortgeschrittene Workflows zu erstellen, die Sims native Fähigkeiten mit der Intelligenz und Automatisierung externer KIs oder benutzerdefinierter Agenten kombinieren. Um A2A-Integrationen zu nutzen, benötigst du die Endpunkt-URL des externen Agenten und, falls erforderlich, einen API-Schlüssel oder Zugangsdaten.
{/* MANUAL-CONTENT-END */}
## Nutzungsanleitung
Verwende das A2A-Protokoll (Agent-to-Agent), um mit externen KI-Agenten zu interagieren.
## Tools
### `a2a_send_message`
Sende eine Nachricht an einen externen A2A-kompatiblen Agenten.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `agentUrl` | string | Ja | Die A2A-Agenten-Endpunkt-URL |
| `message` | string | Ja | Nachricht, die an den Agenten gesendet werden soll |
| `taskId` | string | Nein | Aufgaben-ID zum Fortsetzen einer bestehenden Aufgabe |
| `contextId` | string | Nein | Kontext-ID für Gesprächskontinuität |
| `data` | string | Nein | Strukturierte Daten, die mit der Nachricht einbezogen werden sollen \(JSON-String\) |
| `files` | array | Nein | Dateien, die mit der Nachricht einbezogen werden sollen |
| `apiKey` | string | Nein | API-Schlüssel für die Authentifizierung |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `content` | string | Textantwort-Inhalt vom Agenten |
| `taskId` | string | Eindeutige Aufgabenkennung |
| `contextId` | string | Gruppiert zusammenhängende Aufgaben/Nachrichten |
| `state` | string | Aktueller Lebenszyklus-Status \(working, completed, failed, canceled, rejected, input_required, auth_required\) |
| `artifacts` | array | Ausgabe-Artefakte der Aufgabe |
| `history` | array | Gesprächsverlauf \(Message-Array\) |
### `a2a_get_task`
Abfrage des Status einer bestehenden A2A-Aufgabe.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `agentUrl` | string | Ja | Die A2A-Agenten-Endpunkt-URL |
| `taskId` | string | Ja | Abzufragende Aufgaben-ID |
| `apiKey` | string | Nein | API-Schlüssel für die Authentifizierung |
| `historyLength` | number | Nein | Anzahl der einzubeziehenden Verlaufsnachrichten |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `taskId` | string | Eindeutige Aufgabenkennung |
| `contextId` | string | Gruppiert zusammenhängende Aufgaben/Nachrichten |
| `state` | string | Aktueller Lebenszyklus-Status \(working, completed, failed, canceled, rejected, input_required, auth_required\) |
| `artifacts` | array | Ausgabe-Artefakte der Aufgabe |
| `history` | array | Gesprächsverlauf \(Message-Array\) |
### `a2a_cancel_task`
Abbrechen einer laufenden A2A-Aufgabe.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `agentUrl` | string | Ja | Die A2A-Agenten-Endpunkt-URL |
| `taskId` | string | Ja | Abzubrechende Aufgaben-ID |
| `apiKey` | string | Nein | API-Schlüssel für die Authentifizierung |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `cancelled` | boolean | Ob die Stornierung erfolgreich war |
| `state` | string | Aktueller Lebenszyklus-Status \(working, completed, failed, canceled, rejected, input_required, auth_required\) |
### `a2a_get_agent_card`
Ruft die Agent Card (Discovery-Dokument) für einen A2A-Agenten ab.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `agentUrl` | string | Ja | Die Endpunkt-URL des A2A-Agenten |
| `apiKey` | string | Nein | API-Schlüssel für die Authentifizierung \(falls erforderlich\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `name` | string | Anzeigename des Agenten |
| `description` | string | Zweck/Fähigkeiten des Agenten |
| `url` | string | Service-Endpunkt-URL |
| `provider` | object | Details zur Ersteller-Organisation |
| `capabilities` | object | Feature-Support-Matrix |
| `skills` | array | Verfügbare Operationen |
| `version` | string | Vom Agenten unterstützte A2A-Protokollversion |
| `defaultInputModes` | array | Standard-Eingabe-Inhaltstypen, die vom Agenten akzeptiert werden |
| `defaultOutputModes` | array | Standard-Ausgabe-Inhaltstypen, die vom Agenten produziert werden |
### `a2a_resubscribe`
Stellt die Verbindung zu einem laufenden A2A-Task-Stream nach einer Verbindungsunterbrechung wieder her.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `agentUrl` | string | Ja | Die Endpunkt-URL des A2A-Agenten |
| `taskId` | string | Ja | Task-ID, zu der erneut abonniert werden soll |
| `apiKey` | string | Nein | API-Schlüssel für die Authentifizierung |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `taskId` | string | Eindeutige Aufgabenkennung |
| `contextId` | string | Gruppiert zusammenhängende Aufgaben/Nachrichten |
| `state` | string | Aktueller Lebenszyklusstatus \(working, completed, failed, canceled, rejected, input_required, auth_required\) |
| `isRunning` | boolean | Ob die Aufgabe noch läuft |
| `artifacts` | array | Ausgabeartefakte der Aufgabe |
| `history` | array | Gesprächsverlauf \(Message-Array\) |
### `a2a_set_push_notification`
Konfigurieren Sie einen Webhook, um Benachrichtigungen über Aufgabenaktualisierungen zu erhalten.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `agentUrl` | string | Ja | Die A2A-Agent-Endpunkt-URL |
| `taskId` | string | Ja | Aufgaben-ID, für die Benachrichtigungen konfiguriert werden sollen |
| `webhookUrl` | string | Ja | HTTPS-Webhook-URL zum Empfang von Benachrichtigungen |
| `token` | string | Nein | Token zur Webhook-Validierung |
| `apiKey` | string | Nein | API-Schlüssel zur Authentifizierung |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `url` | string | HTTPS-Webhook-URL für Benachrichtigungen |
| `token` | string | Authentifizierungstoken zur Webhook-Validierung |
| `success` | boolean | Ob der Vorgang erfolgreich war |
### `a2a_get_push_notification`
Rufen Sie die Push-Benachrichtigungs-Webhook-Konfiguration für eine Aufgabe ab.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `agentUrl` | string | Ja | Die A2A-Agent-Endpunkt-URL |
| `taskId` | string | Ja | Aufgaben-ID, für die die Benachrichtigungskonfiguration abgerufen werden soll |
| `apiKey` | string | Nein | API-Schlüssel zur Authentifizierung |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `token` | string | Authentifizierungstoken für Webhook-Validierung |
| `exists` | boolean | Ob die Ressource existiert |
### `a2a_delete_push_notification`
Löscht die Push-Benachrichtigungs-Webhook-Konfiguration für eine Aufgabe.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `agentUrl` | string | Ja | Die A2A-Agent-Endpunkt-URL |
| `taskId` | string | Ja | Aufgaben-ID, für die die Benachrichtigungskonfiguration gelöscht werden soll |
| `pushNotificationConfigId` | string | Nein | Push-Benachrichtigungskonfigurations-ID zum Löschen \(optional - Server kann aus taskId ableiten\) |
| `apiKey` | string | Nein | API-Schlüssel für Authentifizierung |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Ob die Operation erfolgreich war |

View File

@@ -193,8 +193,3 @@ Erhalte eine Liste defekter Backlinks, die auf eine Zieldomäne oder URL verweis
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `brokenBacklinks` | array | Liste defekter Backlinks |
## Hinweise
- Kategorie: `tools`
- Typ: `ahrefs`

View File

@@ -123,8 +123,3 @@ Mehrere vorhandene Datensätze in einer Airtable-Tabelle aktualisieren
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `records` | json | Array der aktualisierten Airtable-Datensätze |
## Hinweise
- Kategorie: `tools`
- Typ: `airtable`

View File

@@ -0,0 +1,63 @@
---
title: Airweave
description: Durchsuchen Sie Ihre synchronisierten Datensammlungen
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="airweave"
color="#6366F1"
/>
{/* MANUAL-CONTENT-START:intro */}
[Airweave](https://airweave.ai/) ist eine KI-gestützte semantische Suchplattform, die Ihnen hilft, Wissen über alle Ihre synchronisierten Datenquellen hinweg zu entdecken und abzurufen. Airweave wurde für moderne Teams entwickelt und ermöglicht schnelle, relevante Suchergebnisse mithilfe neuraler, hybrider oder schlüsselwortbasierter Strategien, die auf Ihre Bedürfnisse zugeschnitten sind.
Mit Airweave können Sie:
- **Intelligenter suchen**: Verwenden Sie natürlichsprachliche Abfragen, um Informationen aufzudecken, die in Ihren verbundenen Tools und Datenbanken gespeichert sind
- **Ihre Daten vereinheitlichen**: Greifen Sie nahtlos auf Inhalte aus Quellen wie Code, Dokumenten, Chat, E-Mails, Cloud-Dateien und mehr zu
- **Abruf anpassen**: Wählen Sie zwischen hybriden (semantisch + Schlüsselwort), neuralen oder Schlüsselwort-Suchstrategien für optimale Ergebnisse
- **Recall steigern**: Erweitern Sie Suchanfragen mit KI, um umfassendere Antworten zu finden
- **Ergebnisse mit KI neu ordnen**: Priorisieren Sie die relevantesten Antworten mit leistungsstarken Sprachmodellen
- **Sofortige Antworten erhalten**: Generieren Sie klare, KI-gestützte Antworten, die aus Ihren Daten synthetisiert werden
In Sim ermöglicht die Airweave-Integration Ihren Agenten, alle Daten Ihrer Organisation über ein einziges Tool zu durchsuchen, zusammenzufassen und Erkenntnisse zu extrahieren. Nutzen Sie Airweave, um umfassenden, kontextbezogenen Wissensabruf in Ihren Workflows zu ermöglichen sei es beim Beantworten von Fragen, Erstellen von Zusammenfassungen oder Unterstützen dynamischer Entscheidungsfindung.
{/* MANUAL-CONTENT-END */}
## Nutzungsanweisungen
Durchsuchen Sie Ihre synchronisierten Datenquellen mit Airweave. Unterstützt semantische Suche mit hybriden, neuralen oder schlüsselwortbasierten Abrufstrategien. Optional können KI-gestützte Antworten aus Suchergebnissen generiert werden.
## Tools
### `airweave_search`
Durchsuchen Sie Ihre synchronisierten Datensammlungen mit Airweave. Unterstützt semantische Suche mit hybriden, neuralen oder schlüsselwortbasierten Abrufstrategien. Optional können KI-gestützte Antworten aus Suchergebnissen generiert werden.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Airweave API-Schlüssel für die Authentifizierung |
| `collectionId` | string | Ja | Die lesbare ID der zu durchsuchenden Sammlung |
| `query` | string | Ja | Der Suchanfragetext |
| `limit` | number | Nein | Maximale Anzahl der zurückzugebenden Ergebnisse \(Standard: 100\) |
| `retrievalStrategy` | string | Nein | Abrufstrategie: hybrid \(Standard\), neural oder keyword |
| `expandQuery` | boolean | Nein | Abfragevariationen generieren, um die Trefferquote zu verbessern |
| `rerank` | boolean | Nein | Ergebnisse für verbesserte Relevanz mithilfe von LLM neu ordnen |
| `generateAnswer` | boolean | Nein | Eine natürlichsprachliche Antwort auf die Abfrage generieren |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `results` | array | Suchergebnisse mit Inhalten, Scores und Metadaten aus Ihren synchronisierten Daten |
| ↳ `entity_id` | string | Eindeutige Kennung für die Suchergebnisentität |
| ↳ `source_name` | string | Name der Datenquelle \(z. B. "GitHub", "Slack"\) |
| ↳ `md_content` | string | Markdown-formatierter Inhalt des Ergebnisses |
| ↳ `score` | number | Relevanz-Score aus der Suche |
| ↳ `metadata` | object | Zusätzliche Metadaten, die mit dem Ergebnis verknüpft sind |
| ↳ `breadcrumbs` | array | Navigationspfad zum Ergebnis innerhalb seiner Quelle |
| ↳ `url` | string | URL zum Originalinhalt |
| `completion` | string | KI-generierte Antwort auf die Abfrage \(wenn generateAnswer aktiviert ist\) |

View File

@@ -81,8 +81,3 @@ Führe einen APIFY-Aktor asynchron mit Polling für lang laufende Aufgaben aus
| `status` | string | Laufstatus \(SUCCEEDED, FAILED, usw.\) |
| `datasetId` | string | Dataset-ID mit Ergebnissen |
| `items` | array | Dataset-Elemente \(falls abgeschlossen\) |
## Hinweise
- Kategorie: `tools`
- Typ: `apify`

View File

@@ -567,8 +567,3 @@ Liste des Teams abrufen
| --------- | ---- | ----------- |
| `email_accounts` | json | Array von Team-E-Mail-Konten, die in Apollo verknüpft sind |
| `metadata` | json | Metadaten einschließlich der Gesamtanzahl von E-Mail-Konten |
## Notizen
- Kategorie: `tools`
- Typ: `apollo`

View File

@@ -82,8 +82,3 @@ Suche nach Artikeln eines bestimmten Autors auf ArXiv.
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `authorPapers` | json | Array von Publikationen, die vom angegebenen Autor verfasst wurden |
## Hinweise
- Kategorie: `tools`
- Typ: `arxiv`

View File

@@ -163,3 +163,16 @@ Einen Kommentar (Story) zu einer Asana-Aufgabe hinzufügen
- Kategorie: `tools`
- Typ: `asana`
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `ts` | string | Zeitstempel der Antwort |
| `gid` | string | Global eindeutige Kennung des Kommentars |
| `text` | string | Textinhalt des Kommentars |
| `created_at` | string | Erstellungszeitstempel des Kommentars |
| `created_by` | object | Details zum Kommentarautor |
| ↳ `gid` | string | Autor-GID |
| ↳ `name` | string | Name des Autors |

View File

@@ -53,8 +53,3 @@ Führt eine Browser-Automatisierungsaufgabe mit BrowserUse aus
| `success` | boolean | Status der Aufgabenfertigstellung |
| `output` | json | Ausgabedaten der Aufgabe |
| `steps` | json | Ausgeführte Schritte |
## Hinweise
- Kategorie: `tools`
- Typ: `browser_use`

View File

@@ -0,0 +1,785 @@
---
title: Cal Com
description: Verwalten Sie Cal.com-Buchungen, Veranstaltungstypen, Zeitpläne und
Verfügbarkeiten
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="calcom"
color="#FFFFFE"
/>
{/* MANUAL-CONTENT-START:intro */}
[Cal.com](https://cal.com/) ist eine flexible und quelloffene Planungsplattform, die es einfach macht, Termine, Buchungen, Veranstaltungstypen und Teamverfügbarkeiten zu verwalten.
Mit Cal.com können Sie:
- **Planung automatisieren**: Ermöglichen Sie Nutzern, Ihre verfügbaren Zeitfenster einzusehen und Meetings automatisch zu buchen, ohne E-Mail-Pingpong.
- **Veranstaltungen verwalten**: Erstellen und passen Sie Veranstaltungstypen, Dauern und Regeln für Einzel- oder Gruppenmeetings an.
- **Kalender integrieren**: Verbinden Sie sich nahtlos mit Google, Outlook, Apple oder anderen Kalenderanbietern, um Doppelbuchungen zu vermeiden.
- **Teilnehmer und Gäste verwalten**: Erfassen Sie Teilnehmerinformationen, verwalten Sie Gäste und versenden Sie Einladungen oder Erinnerungen.
- **Verfügbarkeit steuern**: Definieren Sie individuelle Arbeitszeiten, Pufferzeiten und Storno-/Umbuchungsregeln.
- **Workflows automatisieren**: Lösen Sie benutzerdefinierte Aktionen über Webhooks aus, wenn eine Buchung erstellt, storniert oder umgebucht wird.
In Sim ermöglicht die Cal.com-Integration Ihren Agenten, Meetings zu buchen, Verfügbarkeiten zu prüfen, Veranstaltungstypen zu verwalten und Planungsaufgaben programmatisch zu automatisieren. Dies hilft Agenten, Meetings zu koordinieren, Buchungen im Namen von Nutzern zu versenden, Zeitpläne zu prüfen oder auf Buchungsereignisse zu reagieren alles ohne manuelle Eingriffe. Durch die Verbindung von Sim mit Cal.com erschließen Sie hochautomatisierte und intelligente Planungs-Workflows, die sich nahtlos in Ihre umfassenderen Automatisierungsanforderungen integrieren lassen.
{/* MANUAL-CONTENT-END */}
## Nutzungsanleitung
Integrieren Sie Cal.com in Ihren Workflow. Erstellen und verwalten Sie Buchungen, Veranstaltungstypen, Zeitpläne und prüfen Sie Verfügbarkeitsfenster. Unterstützt das Erstellen, Auflisten, Umbuchen und Stornieren von Buchungen sowie die Verwaltung von Veranstaltungstypen und Zeitplänen. Kann auch Workflows basierend auf Cal.com-Webhook-Ereignissen auslösen (Buchung erstellt, storniert, umgebucht). Verbinden Sie Ihr Cal.com-Konto über OAuth.
## Tools
### `calcom_create_booking`
Eine neue Buchung auf Cal.com erstellen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `eventTypeId` | number | Ja | Die ID des zu buchenden Ereignistyps |
| `start` | string | Ja | Startzeit im UTC ISO 8601-Format \(z. B. 2024-01-15T09:00:00Z\) |
| `attendee` | object | Ja | Teilnehmerinformationsobjekt mit Name, E-Mail, Zeitzone und optionaler Telefonnummer \(zusammengestellt aus einzelnen Teilnehmerfeldern\) |
| `guests` | array | Nein | Array von Gast-E-Mail-Adressen |
| `items` | string | Nein | Gast-E-Mail-Adresse |
| `lengthInMinutes` | number | Nein | Dauer der Buchung in Minuten \(überschreibt die Standardeinstellung des Ereignistyps\) |
| `metadata` | object | Nein | Benutzerdefinierte Metadaten, die an die Buchung angehängt werden |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `status` | string | Antwortstatus |
| `data` | object | Details der erstellten Buchung |
| ↳ `eventType` | object | Details des Ereignistyps |
| ↳ `id` | number | Ereignistyp-ID |
| ↳ `slug` | string | Ereignistyp-Slug |
| ↳ `attendees` | array | Liste der Teilnehmer |
| ↳ `name` | string | Name des Teilnehmers |
| ↳ `email` | string | Tatsächliche E-Mail-Adresse des Teilnehmers |
| ↳ `displayEmail` | string | Öffentlich angezeigte E-Mail \(kann von der tatsächlichen E-Mail abweichen\) |
| ↳ `timeZone` | string | Zeitzone des Teilnehmers \(IANA-Format\) |
| ↳ `phoneNumber` | string | Telefonnummer des Teilnehmers |
| ↳ `language` | string | Sprachpräferenz des Teilnehmers \(ISO-Code\) |
| ↳ `absent` | boolean | Ob der Teilnehmer abwesend war |
| ↳ `hosts` | array | Liste der Gastgeber |
| ↳ `id` | number | Benutzer-ID des Gastgebers |
| ↳ `name` | string | Anzeigename des Gastgebers |
| ↳ `email` | string | Tatsächliche E-Mail-Adresse des Gastgebers |
| ↳ `displayEmail` | string | Öffentlich angezeigte E-Mail \(kann von der tatsächlichen E-Mail abweichen\) |
| ↳ `username` | string | Cal.com-Benutzername des Gastgebers |
| ↳ `timeZone` | string | Zeitzone des Gastgebers \(IANA-Format\) |
| ↳ `id` | number | Numerische Buchungs-ID |
| ↳ `uid` | string | Eindeutige Kennung für die Buchung |
| ↳ `title` | string | Titel der Buchung |
| ↳ `status` | string | Buchungsstatus \(z. B. akzeptiert, ausstehend, storniert\) |
| ↳ `start` | string | Startzeit im ISO 8601-Format |
| ↳ `end` | string | Endzeit im ISO 8601-Format |
| ↳ `duration` | number | Dauer in Minuten |
| ↳ `eventTypeId` | number | Ereignistyp-ID |
| ↳ `meetingUrl` | string | URL zum Beitritt zum Meeting |
| ↳ `location` | string | Ort der Buchung |
| ↳ `absentHost` | boolean | Ob der Gastgeber abwesend war |
| ↳ `guests` | array | Gast-E-Mail-Adressen |
| ↳ `bookingFieldsResponses` | json | Benutzerdefinierte Buchungsfeldantworten \(dynamische Schlüssel basierend auf der Ereignistyp-Konfiguration\) |
| ↳ `metadata` | json | Benutzerdefinierte Metadaten, die an die Buchung angehängt sind \(dynamische Schlüssel-Wert-Paare\) |
| ↳ `icsUid` | string | ICS-Kalender-UID |
| ↳ `createdAt` | string | Zeitpunkt der Erstellung der Buchung |
### `calcom_get_booking`
Details einer bestimmten Buchung anhand ihrer UID abrufen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `bookingUid` | string | Ja | Eindeutige Kennung \(UID\) der Buchung |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `status` | string | Antwortstatus |
| `data` | object | Buchungsdetails |
| ↳ `eventType` | object | Details zum Ereignistyp |
| ↳ `id` | number | Ereignistyp-ID |
| ↳ `slug` | string | Ereignistyp-Slug |
| ↳ `attendees` | array | Liste der Teilnehmer |
| ↳ `name` | string | Name des Teilnehmers |
| ↳ `email` | string | Tatsächliche E-Mail-Adresse des Teilnehmers |
| ↳ `displayEmail` | string | Öffentlich angezeigte E-Mail \(kann von der tatsächlichen E-Mail abweichen\) |
| ↳ `timeZone` | string | Zeitzone des Teilnehmers \(IANA-Format\) |
| ↳ `phoneNumber` | string | Telefonnummer des Teilnehmers |
| ↳ `language` | string | Sprachpräferenz des Teilnehmers \(ISO-Code\) |
| ↳ `absent` | boolean | Ob der Teilnehmer abwesend war |
| ↳ `hosts` | array | Liste der Gastgeber |
| ↳ `id` | number | Benutzer-ID des Gastgebers |
| ↳ `name` | string | Anzeigename des Gastgebers |
| ↳ `email` | string | Tatsächliche E-Mail-Adresse des Gastgebers |
| ↳ `displayEmail` | string | Öffentlich angezeigte E-Mail \(kann von der tatsächlichen E-Mail abweichen\) |
| ↳ `username` | string | Cal.com-Benutzername des Gastgebers |
| ↳ `timeZone` | string | Zeitzone des Gastgebers \(IANA-Format\) |
| ↳ `id` | number | Numerische Buchungs-ID |
| ↳ `uid` | string | Eindeutige Kennung für die Buchung |
| ↳ `title` | string | Titel der Buchung |
| ↳ `description` | string | Beschreibung der Buchung |
| ↳ `status` | string | Buchungsstatus \(z. B. akzeptiert, ausstehend, storniert\) |
| ↳ `start` | string | Startzeit im ISO-8601-Format |
| ↳ `end` | string | Endzeit im ISO-8601-Format |
| ↳ `duration` | number | Dauer in Minuten |
| ↳ `eventTypeId` | number | Ereignistyp-ID |
| ↳ `meetingUrl` | string | URL zum Beitritt zum Meeting |
| ↳ `location` | string | Ort der Buchung |
| ↳ `absentHost` | boolean | Ob der Gastgeber abwesend war |
| ↳ `guests` | array | E-Mail-Adressen der Gäste |
| ↳ `bookingFieldsResponses` | json | Benutzerdefinierte Buchungsfeld-Antworten \(dynamische Schlüssel basierend auf der Ereignistyp-Konfiguration\) |
| ↳ `metadata` | json | Benutzerdefinierte Metadaten, die der Buchung angehängt sind \(dynamische Schlüssel-Wert-Paare\) |
| ↳ `rating` | number | Buchungsbewertung |
| ↳ `icsUid` | string | ICS-Kalender-UID |
| ↳ `cancellationReason` | string | Grund für die Stornierung, falls storniert |
| ↳ `reschedulingReason` | string | Grund für die Umbuchung, falls umgebucht |
| ↳ `rescheduledFromUid` | string | Ursprüngliche Buchungs-UID, falls diese Buchung umgebucht wurde |
| ↳ `rescheduledToUid` | string | Neue Buchungs-UID nach Umbuchung |
| ↳ `cancelledByEmail` | string | E-Mail der Person, die die Buchung storniert hat |
| ↳ `rescheduledByEmail` | string | E-Mail der Person, die die Buchung umgebucht hat |
| ↳ `createdAt` | string | Zeitpunkt der Erstellung der Buchung |
| ↳ `updatedAt` | string | Zeitpunkt der letzten Aktualisierung der Buchung |
### `calcom_list_bookings`
Alle Buchungen mit optionalem Statusfilter auflisten
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `status` | string | Nein | Buchungen nach Status filtern: upcoming, recurring, past, cancelled oder unconfirmed |
| `take` | number | Nein | Anzahl der zurückzugebenden Buchungen \(Paginierungslimit\) |
| `skip` | number | Nein | Anzahl der zu überspringenden Buchungen \(Paginierungsoffset\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `status` | string | Antwortstatus |
| `data` | array | Array von Buchungen |
| ↳ `eventType` | object | Details zum Ereignistyp |
| ↳ `id` | number | Ereignistyp-ID |
| ↳ `slug` | string | Ereignistyp-Slug |
| ↳ `attendees` | array | Liste der Teilnehmer |
| ↳ `name` | string | Name des Teilnehmers |
| ↳ `email` | string | Tatsächliche E-Mail-Adresse des Teilnehmers |
| ↳ `displayEmail` | string | Öffentlich angezeigte E-Mail \(kann von der tatsächlichen E-Mail abweichen\) |
| ↳ `timeZone` | string | Zeitzone des Teilnehmers \(IANA-Format\) |
| ↳ `phoneNumber` | string | Telefonnummer des Teilnehmers |
| ↳ `language` | string | Sprachpräferenz des Teilnehmers \(ISO-Code\) |
| ↳ `absent` | boolean | Ob der Teilnehmer abwesend war |
| ↳ `hosts` | array | Liste der Gastgeber |
| ↳ `id` | number | Benutzer-ID des Gastgebers |
| ↳ `name` | string | Anzeigename des Gastgebers |
| ↳ `email` | string | Tatsächliche E-Mail-Adresse des Gastgebers |
| ↳ `displayEmail` | string | Öffentlich angezeigte E-Mail \(kann von der tatsächlichen E-Mail abweichen\) |
| ↳ `username` | string | Cal.com-Benutzername des Gastgebers |
| ↳ `timeZone` | string | Zeitzone des Gastgebers \(IANA-Format\) |
| ↳ `id` | number | Numerische Buchungs-ID |
| ↳ `uid` | string | Eindeutige Kennung für die Buchung |
| ↳ `title` | string | Titel der Buchung |
| ↳ `description` | string | Beschreibung der Buchung |
| ↳ `status` | string | Buchungsstatus \(z. B. accepted, pending, cancelled\) |
| ↳ `start` | string | Startzeit im ISO-8601-Format |
| ↳ `end` | string | Endzeit im ISO-8601-Format |
| ↳ `duration` | number | Dauer in Minuten |
| ↳ `eventTypeId` | number | Ereignistyp-ID |
| ↳ `meetingUrl` | string | URL zum Beitritt zum Meeting |
| ↳ `location` | string | Ort der Buchung |
| ↳ `absentHost` | boolean | Ob der Gastgeber abwesend war |
| ↳ `guests` | array | E-Mail-Adressen der Gäste |
| ↳ `bookingFieldsResponses` | json | Antworten auf benutzerdefinierte Buchungsfelder \(dynamische Schlüssel basierend auf der Ereignistyp-Konfiguration\) |
| ↳ `metadata` | json | Benutzerdefinierte Metadaten, die der Buchung zugeordnet sind \(dynamische Schlüssel-Wert-Paare\) |
| ↳ `rating` | number | Buchungsbewertung |
| ↳ `icsUid` | string | ICS-Kalender-UID |
| ↳ `cancellationReason` | string | Grund für die Stornierung, falls storniert |
| ↳ `cancelledByEmail` | string | E-Mail der Person, die die Buchung storniert hat |
| ↳ `reschedulingReason` | string | Grund für die Umbuchung, falls umgebucht |
| ↳ `rescheduledByEmail` | string | E-Mail der Person, die die Buchung umgebucht hat |
| ↳ `rescheduledFromUid` | string | Ursprüngliche Buchungs-UID, falls diese Buchung umgebucht wurde |
| ↳ `rescheduledToUid` | string | Neue Buchungs-UID nach Umbuchung |
| ↳ `createdAt` | string | Zeitpunkt der Erstellung der Buchung |
| ↳ `updatedAt` | string | Zeitpunkt der letzten Aktualisierung der Buchung |
| `pagination` | object | Paginierungs-Metadaten |
| ↳ `totalItems` | number | Gesamtanzahl der Elemente |
| ↳ `remainingItems` | number | Verbleibende Elemente nach der aktuellen Seite |
| ↳ `returnedItems` | number | Anzahl der in dieser Antwort zurückgegebenen Elemente |
| ↳ `itemsPerPage` | number | Elemente pro Seite |
| ↳ `currentPage` | number | Aktuelle Seitennummer |
| ↳ `totalPages` | number | Gesamtanzahl der Seiten |
| ↳ `hasNextPage` | boolean | Ob es eine nächste Seite gibt |
| ↳ `hasPreviousPage` | boolean | Ob es eine vorherige Seite gibt |
### `calcom_cancel_booking`
Eine bestehende Buchung stornieren
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `bookingUid` | string | Ja | Eindeutige Kennung \(UID\) der zu stornierenden Buchung |
| `cancellationReason` | string | Nein | Grund für die Stornierung der Buchung |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `status` | string | Antwortstatus |
| `data` | object | Details der stornierten Buchung |
| ↳ `eventType` | object | Details des Ereignistyps |
| ↳ `id` | number | Ereignistyp-ID |
| ↳ `slug` | string | Ereignistyp-Slug |
| ↳ `attendees` | array | Liste der Teilnehmer |
| ↳ `name` | string | Name des Teilnehmers |
| ↳ `email` | string | Tatsächliche E-Mail-Adresse des Teilnehmers |
| ↳ `displayEmail` | string | Öffentlich angezeigte E-Mail \(kann von der tatsächlichen E-Mail abweichen\) |
| ↳ `timeZone` | string | Zeitzone des Teilnehmers \(IANA-Format\) |
| ↳ `phoneNumber` | string | Telefonnummer des Teilnehmers |
| ↳ `language` | string | Sprachpräferenz des Teilnehmers \(ISO-Code\) |
| ↳ `absent` | boolean | Ob der Teilnehmer abwesend war |
| ↳ `hosts` | array | Liste der Gastgeber |
| ↳ `id` | number | Benutzer-ID des Gastgebers |
| ↳ `name` | string | Anzeigename des Gastgebers |
| ↳ `email` | string | Tatsächliche E-Mail-Adresse des Gastgebers |
| ↳ `displayEmail` | string | Öffentlich angezeigte E-Mail \(kann von der tatsächlichen E-Mail abweichen\) |
| ↳ `username` | string | Cal.com-Benutzername des Gastgebers |
| ↳ `timeZone` | string | Zeitzone des Gastgebers \(IANA-Format\) |
| ↳ `id` | number | Numerische Buchungs-ID |
| ↳ `uid` | string | Eindeutige Kennung für die Buchung |
| ↳ `title` | string | Titel der Buchung |
| ↳ `cancellationReason` | string | Grund für die Stornierung, falls storniert |
| ↳ `cancelledByEmail` | string | E-Mail der Person, die die Buchung storniert hat |
| ↳ `start` | string | Startzeit im ISO-8601-Format |
| ↳ `end` | string | Endzeit im ISO-8601-Format |
| ↳ `duration` | number | Dauer in Minuten |
| ↳ `eventTypeId` | number | Ereignistyp-ID |
| ↳ `location` | string | Ort der Buchung |
| ↳ `metadata` | json | Benutzerdefinierte Metadaten, die der Buchung zugeordnet sind \(dynamische Schlüssel-Wert-Paare\) |
| ↳ `createdAt` | string | Zeitpunkt der Erstellung der Buchung |
| ↳ `status` | string | Buchungsstatus \(sollte storniert sein\) |
### `calcom_reschedule_booking`
Eine bestehende Buchung auf einen neuen Zeitpunkt verschieben
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `bookingUid` | string | Ja | Eindeutige Kennung \(UID\) der zu verschiebenden Buchung |
| `start` | string | Ja | Neue Startzeit im UTC ISO 8601-Format \(z. B. 2024-01-15T09:00:00Z\) |
| `reschedulingReason` | string | Nein | Grund für die Verschiebung der Buchung |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `status` | string | Antwortstatus |
| `data` | object | Details der verschobenen Buchung |
| ↳ `eventType` | object | Details des Ereignistyps |
| ↳ `id` | number | Ereignistyp-ID |
| ↳ `slug` | string | Ereignistyp-Slug |
| ↳ `attendees` | array | Liste der Teilnehmer |
| ↳ `name` | string | Name des Teilnehmers |
| ↳ `email` | string | Tatsächliche E-Mail-Adresse des Teilnehmers |
| ↳ `displayEmail` | string | Öffentlich angezeigte E-Mail \(kann von der tatsächlichen E-Mail abweichen\) |
| ↳ `timeZone` | string | Zeitzone des Teilnehmers \(IANA-Format\) |
| ↳ `phoneNumber` | string | Telefonnummer des Teilnehmers |
| ↳ `language` | string | Sprachpräferenz des Teilnehmers \(ISO-Code\) |
| ↳ `absent` | boolean | Ob der Teilnehmer abwesend war |
| ↳ `hosts` | array | Liste der Gastgeber |
| ↳ `id` | number | Benutzer-ID des Gastgebers |
| ↳ `name` | string | Anzeigename des Gastgebers |
| ↳ `email` | string | Tatsächliche E-Mail-Adresse des Gastgebers |
| ↳ `displayEmail` | string | Öffentlich angezeigte E-Mail \(kann von der tatsächlichen E-Mail abweichen\) |
| ↳ `username` | string | Cal.com-Benutzername des Gastgebers |
| ↳ `timeZone` | string | Zeitzone des Gastgebers \(IANA-Format\) |
| ↳ `id` | number | Numerische Buchungs-ID |
| ↳ `title` | string | Titel der Buchung |
| ↳ `status` | string | Buchungsstatus \(z. B. akzeptiert, ausstehend, storniert\) |
| ↳ `reschedulingReason` | string | Grund für die Verschiebung, falls verschoben |
| ↳ `rescheduledFromUid` | string | Ursprüngliche Buchungs-UID, falls diese Buchung verschoben wurde |
| ↳ `rescheduledByEmail` | string | E-Mail der Person, die die Buchung verschoben hat |
| ↳ `duration` | number | Dauer in Minuten |
| ↳ `eventTypeId` | number | Ereignistyp-ID |
| ↳ `meetingUrl` | string | URL zum Beitreten des Meetings |
| ↳ `location` | string | Ort der Buchung |
| ↳ `guests` | array | E-Mail-Adressen der Gäste |
| ↳ `metadata` | json | Benutzerdefinierte Metadaten, die an die Buchung angehängt sind \(dynamische Schlüssel-Wert-Paare\) |
| ↳ `icsUid` | string | ICS-Kalender-UID |
| ↳ `createdAt` | string | Zeitpunkt der Erstellung der Buchung |
| ↳ `uid` | string | Eindeutige Kennung für die neue Buchung |
| ↳ `start` | string | Neue Startzeit im ISO 8601-Format |
| ↳ `end` | string | Neue Endzeit im ISO 8601-Format |
### `calcom_confirm_booking`
Eine ausstehende Buchung bestätigen, die eine Bestätigung erfordert
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `bookingUid` | string | Ja | Eindeutige Kennung \(UID\) der zu bestätigenden Buchung |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `status` | string | Antwortstatus |
| `data` | object | Details der bestätigten Buchung |
| ↳ `eventType` | object | Details des Ereignistyps |
| ↳ `id` | number | Ereignistyp-ID |
| ↳ `slug` | string | Ereignistyp-Slug |
| ↳ `attendees` | array | Liste der Teilnehmer |
| ↳ `name` | string | Name des Teilnehmers |
| ↳ `email` | string | Tatsächliche E-Mail-Adresse des Teilnehmers |
| ↳ `displayEmail` | string | Öffentlich angezeigte E-Mail \(kann von der tatsächlichen E-Mail abweichen\) |
| ↳ `timeZone` | string | Zeitzone des Teilnehmers \(IANA-Format\) |
| ↳ `phoneNumber` | string | Telefonnummer des Teilnehmers |
| ↳ `language` | string | Sprachpräferenz des Teilnehmers \(ISO-Code\) |
| ↳ `absent` | boolean | Ob der Teilnehmer abwesend war |
| ↳ `hosts` | array | Liste der Gastgeber |
| ↳ `id` | number | Benutzer-ID des Gastgebers |
| ↳ `name` | string | Anzeigename des Gastgebers |
| ↳ `email` | string | Tatsächliche E-Mail-Adresse des Gastgebers |
| ↳ `displayEmail` | string | Öffentlich angezeigte E-Mail \(kann von der tatsächlichen E-Mail abweichen\) |
| ↳ `username` | string | Cal.com-Benutzername des Gastgebers |
| ↳ `timeZone` | string | Zeitzone des Gastgebers \(IANA-Format\) |
| ↳ `id` | number | Numerische Buchungs-ID |
| ↳ `uid` | string | Eindeutige Kennung für die Buchung |
| ↳ `title` | string | Titel der Buchung |
| ↳ `start` | string | Startzeit im ISO-8601-Format |
| ↳ `end` | string | Endzeit im ISO-8601-Format |
| ↳ `duration` | number | Dauer in Minuten |
| ↳ `eventTypeId` | number | Ereignistyp-ID |
| ↳ `meetingUrl` | string | URL zum Beitreten des Meetings |
| ↳ `location` | string | Ort der Buchung |
| ↳ `guests` | array | E-Mail-Adressen der Gäste |
| ↳ `metadata` | json | Benutzerdefinierte Metadaten, die der Buchung angehängt sind \(dynamische Schlüssel-Wert-Paare\) |
| ↳ `icsUid` | string | ICS-Kalender-UID |
| ↳ `createdAt` | string | Zeitpunkt der Erstellung der Buchung |
| ↳ `status` | string | Buchungsstatus \(sollte akzeptiert/bestätigt sein\) |
### `calcom_decline_booking`
Eine ausstehende Buchungsanfrage ablehnen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `bookingUid` | string | Ja | Eindeutige Kennung (UID) der abzulehnenden Buchung |
| `reason` | string | Nein | Grund für die Ablehnung der Buchung |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `status` | string | Antwortstatus |
| `data` | object | Details der abgelehnten Buchung |
| ↳ `eventType` | object | Details des Ereignistyps |
| ↳ `id` | number | Ereignistyp-ID |
| ↳ `slug` | string | Ereignistyp-Slug |
| ↳ `attendees` | array | Liste der Teilnehmer |
| ↳ `name` | string | Name des Teilnehmers |
| ↳ `email` | string | Tatsächliche E-Mail-Adresse des Teilnehmers |
| ↳ `displayEmail` | string | Öffentlich angezeigte E-Mail (kann von der tatsächlichen E-Mail abweichen) |
| ↳ `timeZone` | string | Zeitzone des Teilnehmers (IANA-Format) |
| ↳ `phoneNumber` | string | Telefonnummer des Teilnehmers |
| ↳ `language` | string | Sprachpräferenz des Teilnehmers (ISO-Code) |
| ↳ `absent` | boolean | Ob der Teilnehmer abwesend war |
| ↳ `hosts` | array | Liste der Gastgeber |
| ↳ `id` | number | Benutzer-ID des Gastgebers |
| ↳ `name` | string | Anzeigename des Gastgebers |
| ↳ `email` | string | Tatsächliche E-Mail-Adresse des Gastgebers |
| ↳ `displayEmail` | string | Öffentlich angezeigte E-Mail (kann von der tatsächlichen E-Mail abweichen) |
| ↳ `username` | string | Cal.com-Benutzername des Gastgebers |
| ↳ `timeZone` | string | Zeitzone des Gastgebers (IANA-Format) |
| ↳ `id` | number | Numerische Buchungs-ID |
| ↳ `uid` | string | Eindeutige Kennung für die Buchung |
| ↳ `title` | string | Titel der Buchung |
| ↳ `cancellationReason` | string | Grund für die Stornierung, falls storniert |
| ↳ `start` | string | Startzeit im ISO-8601-Format |
| ↳ `end` | string | Endzeit im ISO-8601-Format |
| ↳ `duration` | number | Dauer in Minuten |
| ↳ `eventTypeId` | number | Ereignistyp-ID |
| ↳ `location` | string | Ort der Buchung |
| ↳ `metadata` | json | Benutzerdefinierte Metadaten, die der Buchung angehängt sind (dynamische Schlüssel-Wert-Paare) |
| ↳ `createdAt` | string | Zeitpunkt der Erstellung der Buchung |
| ↳ `status` | string | Buchungsstatus (sollte storniert/abgelehnt sein) |
### `calcom_create_event_type`
Einen neuen Ereignistyp in Cal.com erstellen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `title` | string | Ja | Titel des Ereignistyps |
| `slug` | string | Ja | Eindeutiger Slug für die Ereignistyp-URL |
| `lengthInMinutes` | number | Ja | Dauer des Ereignisses in Minuten |
| `description` | string | Nein | Beschreibung des Ereignistyps |
| `slotInterval` | number | Nein | Intervall zwischen verfügbaren Buchungsslots in Minuten |
| `minimumBookingNotice` | number | Nein | Erforderliche Mindestvorlaufzeit vor der Buchung in Minuten |
| `beforeEventBuffer` | number | Nein | Pufferzeit vor dem Ereignis in Minuten |
| `afterEventBuffer` | number | Nein | Pufferzeit nach dem Ereignis in Minuten |
| `scheduleId` | number | Nein | ID des Zeitplans für die Verfügbarkeit |
| `disableGuests` | boolean | Nein | Ob das Hinzufügen von Gästen zu Buchungen deaktiviert ist |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `status` | string | Antwortstatus |
| `data` | object | Details des erstellten Ereignistyps |
| ↳ `id` | number | Ereignistyp-ID |
| ↳ `title` | string | Ereignistyp-Titel |
| ↳ `slug` | string | Ereignistyp-Slug |
| ↳ `description` | string | Ereignistyp-Beschreibung |
| ↳ `lengthInMinutes` | number | Dauer in Minuten |
| ↳ `slotInterval` | number | Slot-Intervall in Minuten |
| ↳ `minimumBookingNotice` | number | Mindestvorlaufzeit für Buchung in Minuten |
| ↳ `beforeEventBuffer` | number | Puffer vor Ereignis in Minuten |
| ↳ `afterEventBuffer` | number | Puffer nach Ereignis in Minuten |
| ↳ `scheduleId` | number | Zeitplan-ID |
| ↳ `disableGuests` | boolean | Ob Gäste deaktiviert sind |
| ↳ `createdAt` | string | ISO-Zeitstempel der Erstellung |
| ↳ `updatedAt` | string | ISO-Zeitstempel der letzten Aktualisierung |
### `calcom_get_event_type`
Detaillierte Informationen über einen bestimmten Ereignistyp abrufen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `eventTypeId` | number | Ja | Ereignistyp-ID zum Abrufen |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `status` | string | Antwortstatus |
| `data` | object | Details zum Ereignistyp |
| ↳ `id` | number | Ereignistyp-ID |
| ↳ `title` | string | Titel des Ereignistyps |
| ↳ `slug` | string | Slug des Ereignistyps |
| ↳ `description` | string | Beschreibung des Ereignistyps |
| ↳ `lengthInMinutes` | number | Dauer in Minuten |
| ↳ `slotInterval` | number | Zeitfensterintervall in Minuten |
| ↳ `minimumBookingNotice` | number | Mindestvorlaufzeit für Buchungen in Minuten |
| ↳ `beforeEventBuffer` | number | Puffer vor dem Ereignis in Minuten |
| ↳ `afterEventBuffer` | number | Puffer nach dem Ereignis in Minuten |
| ↳ `scheduleId` | number | Zeitplan-ID |
| ↳ `disableGuests` | boolean | Ob Gäste deaktiviert sind |
| ↳ `createdAt` | string | ISO-Zeitstempel der Erstellung |
| ↳ `updatedAt` | string | ISO-Zeitstempel der letzten Aktualisierung |
### `calcom_list_event_types`
Eine Liste aller Ereignistypen abrufen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `sortCreatedAt` | string | Nein | Sortierung nach Erstellungsdatum: "asc" oder "desc" |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `status` | string | Antwortstatus |
| `data` | array | Array von Ereignistypen |
| ↳ `id` | number | Ereignistyp-ID |
| ↳ `title` | string | Ereignistyp-Titel |
| ↳ `slug` | string | Ereignistyp-Slug |
| ↳ `description` | string | Ereignistyp-Beschreibung |
| ↳ `lengthInMinutes` | number | Dauer in Minuten |
| ↳ `slotInterval` | number | Zeitfensterintervall in Minuten |
| ↳ `minimumBookingNotice` | number | Mindestvorlaufzeit für Buchungen in Minuten |
| ↳ `beforeEventBuffer` | number | Pufferzeit vor dem Ereignis in Minuten |
| ↳ `afterEventBuffer` | number | Pufferzeit nach dem Ereignis in Minuten |
| ↳ `scheduleId` | number | Zeitplan-ID |
| ↳ `disableGuests` | boolean | Ob Gäste deaktiviert sind |
| ↳ `createdAt` | string | ISO-Zeitstempel der Erstellung |
| ↳ `updatedAt` | string | ISO-Zeitstempel der letzten Aktualisierung |
### `calcom_update_event_type`
Einen bestehenden Ereignistyp in Cal.com aktualisieren
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `eventTypeId` | number | Ja | Zu aktualisierende Ereignistyp-ID \(z. B. 12345\) |
| `title` | string | Nein | Titel des Ereignistyps |
| `slug` | string | Nein | Eindeutiger Slug für die Ereignistyp-URL |
| `lengthInMinutes` | number | Nein | Dauer des Ereignisses in Minuten |
| `description` | string | Nein | Beschreibung des Ereignistyps |
| `slotInterval` | number | Nein | Intervall zwischen verfügbaren Buchungszeitfenstern in Minuten |
| `minimumBookingNotice` | number | Nein | Erforderliche Mindestvorlaufzeit vor der Buchung in Minuten |
| `beforeEventBuffer` | number | Nein | Pufferzeit vor dem Ereignis in Minuten |
| `afterEventBuffer` | number | Nein | Pufferzeit nach dem Ereignis in Minuten |
| `scheduleId` | number | Nein | ID des Zeitplans für die Verfügbarkeit |
| `disableGuests` | boolean | Nein | Ob das Hinzufügen von Gästen zu Buchungen deaktiviert werden soll |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `status` | string | Antwortstatus |
| `data` | object | Aktualisierte Details des Ereignistyps |
| ↳ `id` | number | Ereignistyp-ID |
| ↳ `title` | string | Titel des Ereignistyps |
| ↳ `slug` | string | Slug des Ereignistyps |
| ↳ `description` | string | Beschreibung des Ereignistyps |
| ↳ `lengthInMinutes` | number | Dauer in Minuten |
| ↳ `slotInterval` | number | Zeitfensterintervall in Minuten |
| ↳ `minimumBookingNotice` | number | Mindestvorlaufzeit für Buchungen in Minuten |
| ↳ `beforeEventBuffer` | number | Puffer vor dem Ereignis in Minuten |
| ↳ `afterEventBuffer` | number | Puffer nach dem Ereignis in Minuten |
| ↳ `scheduleId` | number | Zeitplan-ID |
| ↳ `disableGuests` | boolean | Ob Gäste deaktiviert sind |
| ↳ `createdAt` | string | ISO-Zeitstempel der Erstellung |
| ↳ `updatedAt` | string | ISO-Zeitstempel der letzten Aktualisierung |
### `calcom_delete_event_type`
Einen Ereignistyp aus Cal.com löschen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `eventTypeId` | number | Ja | Zu löschende Ereignistyp-ID |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `status` | string | Antwortstatus |
| `data` | object | Details des gelöschten Ereignistyps |
| ↳ `id` | number | Ereignistyp-ID |
| ↳ `lengthInMinutes` | number | Dauer in Minuten |
| ↳ `title` | string | Titel des Ereignistyps |
| ↳ `slug` | string | Slug des Ereignistyps |
### `calcom_create_schedule`
Einen neuen Verfügbarkeitsplan in Cal.com erstellen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `name` | string | Ja | Name des Plans |
| `timeZone` | string | Ja | Zeitzone für den Plan \(z. B. America/New_York\) |
| `isDefault` | boolean | Ja | Ob dieser Plan als Standard festgelegt werden soll |
| `availability` | array | Nein | Verfügbarkeitsintervalle für den Plan |
| `items` | object | Nein | Verfügbarkeitsintervall |
| `properties` | array | Nein | Wochentage \(Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag, Sonntag\) |
| `days` | array | Nein | Wochentage \(Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag, Sonntag\) |
| `startTime` | string | Nein | Startzeit im Format HH:MM |
| `endTime` | string | Nein | Endzeit im Format HH:MM |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `status` | string | Antwortstatus |
| `data` | object | Erstellte Plandaten |
| ↳ `id` | number | Plan-ID |
| ↳ `ownerId` | number | Benutzer-ID des Eigentümers |
| ↳ `name` | string | Planname |
| ↳ `timeZone` | string | Zeitzone \(z. B. America/New_York\) |
| ↳ `isDefault` | boolean | Ob dies der Standardplan ist |
| ↳ `availability` | array | Verfügbarkeitsfenster |
| ↳ `days` | array | Wochentage \(Montag, Dienstag usw.\) |
| ↳ `startTime` | string | Startzeit im Format HH:MM |
| ↳ `endTime` | string | Endzeit im Format HH:MM |
| ↳ `overrides` | array | Datumsspezifische Verfügbarkeitsüberschreibungen |
| ↳ `date` | string | Datum im Format JJJJ-MM-TT |
| ↳ `startTime` | string | Startzeit im Format HH:MM |
| ↳ `endTime` | string | Endzeit im Format HH:MM |
### `calcom_get_schedule`
Einen bestimmten Zeitplan anhand der ID von Cal.com abrufen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `scheduleId` | string | Ja | ID des abzurufenden Zeitplans |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `status` | string | Antwortstatus |
| `data` | object | Zeitplandaten |
| ↳ `id` | number | Zeitplan-ID |
| ↳ `ownerId` | number | Benutzer-ID des Eigentümers |
| ↳ `name` | string | Zeitplanname |
| ↳ `timeZone` | string | Zeitzone \(z. B. America/New_York\) |
| ↳ `isDefault` | boolean | Ob dies der Standardzeitplan ist |
| ↳ `availability` | array | Verfügbarkeitsfenster |
| ↳ `days` | array | Wochentage \(Montag, Dienstag usw.\) |
| ↳ `startTime` | string | Startzeit im Format HH:MM |
| ↳ `endTime` | string | Endzeit im Format HH:MM |
| ↳ `overrides` | array | Datumsspezifische Verfügbarkeitsüberschreibungen |
| ↳ `date` | string | Datum im Format JJJJ-MM-TT |
| ↳ `startTime` | string | Startzeit im Format HH:MM |
| ↳ `endTime` | string | Endzeit im Format HH:MM |
### `calcom_list_schedules`
Alle Verfügbarkeitszeitpläne von Cal.com auflisten
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `status` | string | Antwortstatus |
| `data` | array | Array von Zeitplanobjekten |
| ↳ `id` | number | Zeitplan-ID |
| ↳ `ownerId` | number | Benutzer-ID des Eigentümers |
| ↳ `name` | string | Zeitplanname |
| ↳ `timeZone` | string | Zeitzone \(z. B. America/New_York\) |
| ↳ `isDefault` | boolean | Ob dies der Standardzeitplan ist |
| ↳ `availability` | array | Verfügbarkeitsfenster |
| ↳ `days` | array | Wochentage \(Montag, Dienstag usw.\) |
| ↳ `startTime` | string | Startzeit im Format HH:MM |
| ↳ `endTime` | string | Endzeit im Format HH:MM |
| ↳ `overrides` | array | Datumsspezifische Verfügbarkeitsüberschreibungen |
| ↳ `date` | string | Datum im Format JJJJ-MM-TT |
| ↳ `startTime` | string | Startzeit im Format HH:MM |
| ↳ `endTime` | string | Endzeit im Format HH:MM |
### `calcom_update_schedule`
Einen bestehenden Zeitplan in Cal.com aktualisieren
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `scheduleId` | string | Ja | ID des zu aktualisierenden Zeitplans |
| `name` | string | Nein | Neuer Name für den Zeitplan |
| `timeZone` | string | Nein | Neue Zeitzone für den Zeitplan \(z. B. America/New_York\) |
| `isDefault` | boolean | Nein | Ob dieser Zeitplan als Standard festgelegt werden soll |
| `availability` | array | Nein | Neue Verfügbarkeitsintervalle für den Zeitplan |
| `items` | object | Nein | Verfügbarkeitsintervall |
| `properties` | array | Nein | Wochentage \(Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag, Sonntag\) |
| `days` | array | Nein | Wochentage \(Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag, Sonntag\) |
| `startTime` | string | Nein | Startzeit im Format HH:MM |
| `endTime` | string | Nein | Endzeit im Format HH:MM |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `status` | string | Antwortstatus |
| `data` | object | Aktualisierte Zeitplandaten |
| ↳ `id` | number | Zeitplan-ID |
| ↳ `ownerId` | number | Benutzer-ID des Eigentümers |
| ↳ `name` | string | Zeitplanname |
| ↳ `timeZone` | string | Zeitzone \(z. B. America/New_York\) |
| ↳ `isDefault` | boolean | Ob dies der Standardzeitplan ist |
| ↳ `availability` | array | Verfügbarkeitsfenster |
| ↳ `days` | array | Wochentage \(Montag, Dienstag usw.\) |
| ↳ `startTime` | string | Startzeit im Format HH:MM |
| ↳ `endTime` | string | Endzeit im Format HH:MM |
| ↳ `overrides` | array | Datumsspezifische Verfügbarkeitsüberschreibungen |
| ↳ `date` | string | Datum im Format JJJJ-MM-TT |
| ↳ `startTime` | string | Startzeit im Format HH:MM |
| ↳ `endTime` | string | Endzeit im Format HH:MM |
### `calcom_delete_schedule`
Einen Zeitplan aus Cal.com löschen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `scheduleId` | string | Ja | ID des zu löschenden Zeitplans |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `status` | string | Antwortstatus \(Erfolg oder Fehler\) |
### `calcom_get_default_schedule`
Den Standard-Verfügbarkeitszeitplan aus Cal.com abrufen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `status` | string | Antwortstatus |
| `data` | object | Standard-Zeitplandaten |
| ↳ `id` | number | Zeitplan-ID |
| ↳ `ownerId` | number | Benutzer-ID des Eigentümers |
| ↳ `name` | string | Zeitplanname |
| ↳ `timeZone` | string | Zeitzone \(z. B. America/New_York\) |
| ↳ `isDefault` | boolean | Ob dies der Standardzeitplan ist |
| ↳ `availability` | array | Verfügbarkeitsfenster |
| ↳ `days` | array | Wochentage \(Montag, Dienstag usw.\) |
| ↳ `startTime` | string | Startzeit im Format HH:MM |
| ↳ `endTime` | string | Endzeit im Format HH:MM |
| ↳ `overrides` | array | Datumsspezifische Verfügbarkeitsüberschreibungen |
| ↳ `date` | string | Datum im Format JJJJ-MM-TT |
| ↳ `startTime` | string | Startzeit im Format HH:MM |
| ↳ `endTime` | string | Endzeit im Format HH:MM |
### `calcom_get_slots`
Verfügbare Buchungsslots für einen Cal.com-Ereignistyp innerhalb eines Zeitraums abrufen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `start` | string | Ja | Beginn des Zeitraums im UTC ISO 8601-Format \(z. B. 2024-01-15T00:00:00Z\) |
| `end` | string | Ja | Ende des Zeitraums im UTC ISO 8601-Format \(z. B. 2024-01-22T00:00:00Z\) |
| `eventTypeId` | number | Nein | Ereignistyp-ID für direkte Suche |
| `eventTypeSlug` | string | Nein | Ereignistyp-Slug \(erfordert, dass der Benutzername gesetzt ist\) |
| `username` | string | Nein | Benutzername für persönliche Ereignistypen \(erforderlich bei Verwendung von eventTypeSlug\) |
| `timeZone` | string | Nein | Zeitzone für zurückgegebene Slots \(Standard ist UTC\) |
| `duration` | number | Nein | Slot-Länge in Minuten |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `status` | string | Antwortstatus |
| `data` | json | Verfügbare Zeitslots gruppiert nach Datum \(Schlüssel im Format JJJJ-MM-TT\). Jedes Datum ist einem Array von Slot-Objekten mit Startzeit, optionaler Endzeit und Informationen zu Sitzplatz-Events zugeordnet. |

View File

@@ -165,8 +165,3 @@ Ein geplantes Ereignis stornieren
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `resource` | object | Stornierungsdetails |
## Hinweise
- Kategorie: `tools`
- Typ: `calendly`

View File

@@ -52,8 +52,3 @@ Egal, ob Sie sofortige Zusammenfassungen verteilen, Aufgaben protokollieren oder
## Nutzungsanleitung
Erhalten Sie Meeting-Notizen, Aufgaben, Transkripte und Aufzeichnungen, wenn Meetings verarbeitet werden. Circleback nutzt Webhooks, um Daten an Ihre Workflows zu übermitteln.
## Hinweise
- Kategorie: `triggers`
- Typ: `circleback`

View File

@@ -53,13 +53,3 @@ Populate Clay with data from a JSON file. Enables direct communication and notif
| `authToken` | string | Nein | Optionaler Auth-Token für die Clay-Webhook-Authentifizierung \(die meisten Webhooks benötigen dies nicht\) |
#### Output
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `data` | json | Antwortdaten vom Clay-Webhook |
| `metadata` | object | Webhook-Antwort-Metadaten |
## Notes
- Category: `tools`
- Type: `clay`

View File

@@ -0,0 +1,437 @@
---
title: Clerk
description: Verwalten Sie Benutzer, Organisationen und Sitzungen in Clerk
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="clerk"
color="#131316"
/>
{/* MANUAL-CONTENT-START:intro */}
[Clerk](https://clerk.com/) ist eine umfassende Identitätsinfrastruktur-Plattform, die Ihnen hilft, Benutzer, Authentifizierung und Sitzungen für Ihre Anwendungen zu verwalten.
In Sim ermöglicht die Clerk-Integration Ihren Agenten, die Benutzer- und Sitzungsverwaltung durch einfach zu bedienende API-basierte Tools zu automatisieren. Agenten können sicher Benutzer auflisten, Benutzerprofile aktualisieren, Organisationen verwalten, Sitzungen überwachen und den Zugriff direkt in Ihrem Workflow widerrufen.
Mit Clerk können Sie:
- **Benutzer authentifizieren und Sitzungen verwalten**: Steuern Sie nahtlos Anmeldung, Registrierung und den Sitzungslebenszyklus für Ihre Benutzer.
- **Benutzer auflisten und aktualisieren**: Rufen Sie automatisch Benutzerlisten ab, aktualisieren Sie Benutzerattribute oder zeigen Sie Profildetails als Teil Ihrer Agentenaufgaben an.
- **Organisationen und Mitgliedschaften verwalten**: Fügen Sie Organisationen hinzu oder aktualisieren Sie diese und verwalten Sie Benutzermitgliedschaften übersichtlich.
- **Sitzungen überwachen und widerrufen**: Sehen Sie aktive oder vergangene Benutzersitzungen ein und widerrufen Sie bei Bedarf sofort den Zugriff aus Sicherheitsgründen.
Die Integration ermöglicht eine Echtzeit- und nachvollziehbare Verwaltung Ihrer Benutzerbasis alles innerhalb von Sim. Verbundene Agenten können das Onboarding automatisieren, Richtlinien durchsetzen, Verzeichnisse aktuell halten und auf Authentifizierungsereignisse oder organisatorische Änderungen reagieren, sodass Sie sichere und flexible Prozesse mit Clerk als Ihrer Identitäts-Engine betreiben können.
{/* MANUAL-CONTENT-END */}
## Nutzungsanweisungen
Integrieren Sie Clerk-Authentifizierung und Benutzerverwaltung in Ihren Workflow. Erstellen, aktualisieren, löschen und listen Sie Benutzer auf. Verwalten Sie Organisationen und deren Mitgliedschaften. Überwachen und steuern Sie Benutzersitzungen.
## Tools
### `clerk_list_users`
Listen Sie alle Benutzer in Ihrer Clerk-Anwendung mit optionaler Filterung und Paginierung auf
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `secretKey` | string | Ja | Der Clerk Secret Key für die API-Authentifizierung |
| `limit` | number | Nein | Anzahl der Ergebnisse pro Seite \(z. B. 10, 50, 100; Bereich: 1-500, Standard: 10\) |
| `offset` | number | Nein | Anzahl der zu überspringenden Ergebnisse für die Paginierung \(z. B. 0, 10, 20\) |
| `orderBy` | string | Nein | Sortierfeld mit optionalem +/- Präfix für die Richtung \(Standard: -created_at\) |
| `emailAddress` | string | Nein | Filtern nach E-Mail-Adresse \(z. B. user@example.com oder user1@example.com,user2@example.com\) |
| `phoneNumber` | string | Nein | Filtern nach Telefonnummer \(durch Komma getrennt für mehrere\) |
| `externalId` | string | Nein | Filtern nach externer ID \(durch Komma getrennt für mehrere\) |
| `username` | string | Nein | Filtern nach Benutzername \(durch Komma getrennt für mehrere\) |
| `userId` | string | Nein | Filtern nach Benutzer-ID \(z. B. user_2NNEqL2nrIRdJ194ndJqAHwEfxC oder durch Komma getrennt für mehrere\) |
| `query` | string | Nein | Suchanfrage zur Übereinstimmung über E-Mail, Telefon, Benutzername und Namen \(z. B. john oder john@example.com\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `users` | array | Array von Clerk-Benutzerobjekten |
| ↳ `id` | string | Benutzer-ID |
| ↳ `username` | string | Benutzername |
| ↳ `firstName` | string | Vorname |
| ↳ `lastName` | string | Nachname |
| ↳ `imageUrl` | string | Profilbild-URL |
| ↳ `hasImage` | boolean | Ob Benutzer ein Profilbild hat |
| ↳ `primaryEmailAddressId` | string | Primäre E-Mail-Adressen-ID |
| ↳ `primaryPhoneNumberId` | string | Primäre Telefonnummer-ID |
| ↳ `emailAddresses` | array | E-Mail-Adressen des Benutzers |
| ↳ `id` | string | E-Mail-Adressen-ID |
| ↳ `emailAddress` | string | E-Mail-Adresse |
| ↳ `phoneNumbers` | array | Telefonnummern des Benutzers |
| ↳ `id` | string | Telefonnummer-ID |
| ↳ `phoneNumber` | string | Telefonnummer |
| ↳ `externalId` | string | Externe System-ID |
| ↳ `passwordEnabled` | boolean | Ob Passwort aktiviert ist |
| ↳ `twoFactorEnabled` | boolean | Ob 2FA aktiviert ist |
| ↳ `banned` | boolean | Ob Benutzer gesperrt ist |
| ↳ `locked` | boolean | Ob Benutzer blockiert ist |
| ↳ `lastSignInAt` | number | Zeitstempel der letzten Anmeldung |
| ↳ `lastActiveAt` | number | Zeitstempel der letzten Aktivität |
| ↳ `createdAt` | number | Erstellungszeitstempel |
| ↳ `updatedAt` | number | Zeitstempel der letzten Aktualisierung |
| ↳ `publicMetadata` | json | Öffentliche Metadaten |
| `totalCount` | number | Gesamtanzahl der Benutzer, die der Abfrage entsprechen |
| `success` | boolean | Erfolgsstatus der Operation |
### `clerk_get_user`
Einen einzelnen Benutzer anhand seiner ID von Clerk abrufen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `secretKey` | string | Ja | Der Clerk Secret Key für die API-Authentifizierung |
| `userId` | string | Ja | Die ID des abzurufenden Benutzers \(z. B. user_2NNEqL2nrIRdJ194ndJqAHwEfxC\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `id` | string | Benutzer-ID |
| `username` | string | Benutzername |
| `firstName` | string | Vorname |
| `lastName` | string | Nachname |
| `imageUrl` | string | Profilbild-URL |
| `hasImage` | boolean | Ob der Benutzer ein Profilbild hat |
| `primaryEmailAddressId` | string | Primäre E-Mail-Adressen-ID |
| `primaryPhoneNumberId` | string | Primäre Telefonnummer-ID |
| `primaryWeb3WalletId` | string | Primäre Web3-Wallet-ID |
| `emailAddresses` | array | E-Mail-Adressen des Benutzers |
| ↳ `id` | string | E-Mail-Adressen-ID |
| ↳ `emailAddress` | string | E-Mail-Adresse |
| ↳ `verified` | boolean | Ob die E-Mail verifiziert ist |
| `phoneNumbers` | array | Telefonnummern des Benutzers |
| ↳ `id` | string | Telefonnummer-ID |
| ↳ `phoneNumber` | string | Telefonnummer |
| ↳ `verified` | boolean | Ob die Telefonnummer verifiziert ist |
| `externalId` | string | Externe System-ID |
| `passwordEnabled` | boolean | Ob das Passwort aktiviert ist |
| `twoFactorEnabled` | boolean | Ob 2FA aktiviert ist |
| `totpEnabled` | boolean | Ob TOTP aktiviert ist |
| `backupCodeEnabled` | boolean | Ob Backup-Codes aktiviert sind |
| `banned` | boolean | Ob der Benutzer gesperrt ist |
| `locked` | boolean | Ob der Benutzer blockiert ist |
| `deleteSelfEnabled` | boolean | Ob der Benutzer sich selbst löschen kann |
| `createOrganizationEnabled` | boolean | Ob der Benutzer Organisationen erstellen kann |
| `lastSignInAt` | number | Zeitstempel der letzten Anmeldung |
| `lastActiveAt` | number | Zeitstempel der letzten Aktivität |
| `createdAt` | number | Erstellungszeitstempel |
| `updatedAt` | number | Zeitstempel der letzten Aktualisierung |
| `publicMetadata` | json | Öffentliche Metadaten \(vom Frontend lesbar\) |
| `privateMetadata` | json | Private Metadaten \(nur Backend\) |
| `unsafeMetadata` | json | Unsichere Metadaten \(vom Frontend änderbar\) |
| `success` | boolean | Erfolgsstatus der Operation |
### `clerk_create_user`
Erstellen Sie einen neuen Benutzer in Ihrer Clerk-Anwendung
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `secretKey` | string | Ja | Der Clerk Secret Key für die API-Authentifizierung |
| `emailAddress` | string | Nein | E-Mail-Adressen für den Benutzer \(durch Komma getrennt für mehrere\) |
| `phoneNumber` | string | Nein | Telefonnummern für den Benutzer \(durch Komma getrennt für mehrere\) |
| `username` | string | Nein | Benutzername für den Benutzer \(muss eindeutig sein\) |
| `password` | string | Nein | Passwort für den Benutzer \(mindestens 8 Zeichen\) |
| `firstName` | string | Nein | Vorname des Benutzers |
| `lastName` | string | Nein | Nachname des Benutzers |
| `externalId` | string | Nein | Externe System-ID \(muss eindeutig sein\) |
| `publicMetadata` | json | Nein | Öffentliche Metadaten \(JSON-Objekt, lesbar vom Frontend\) |
| `privateMetadata` | json | Nein | Private Metadaten \(JSON-Objekt, nur Backend\) |
| `unsafeMetadata` | json | Nein | Unsichere Metadaten \(JSON-Objekt, änderbar vom Frontend\) |
| `skipPasswordChecks` | boolean | Nein | Passwortvalidierungsprüfungen überspringen |
| `skipPasswordRequirement` | boolean | Nein | Passwort optional machen |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `id` | string | Erstellte Benutzer-ID |
| `username` | string | Benutzername |
| `firstName` | string | Vorname |
| `lastName` | string | Nachname |
| `imageUrl` | string | Profilbild-URL |
| `primaryEmailAddressId` | string | Primäre E-Mail-Adressen-ID |
| `primaryPhoneNumberId` | string | Primäre Telefonnummer-ID |
| `emailAddresses` | array | E-Mail-Adressen des Benutzers |
| ↳ `id` | string | E-Mail-Adressen-ID |
| ↳ `emailAddress` | string | E-Mail-Adresse |
| ↳ `verified` | boolean | Ob die E-Mail verifiziert ist |
| `phoneNumbers` | array | Telefonnummern des Benutzers |
| ↳ `id` | string | Telefonnummer-ID |
| ↳ `phoneNumber` | string | Telefonnummer |
| ↳ `verified` | boolean | Ob die Telefonnummer verifiziert ist |
| `externalId` | string | Externe System-ID |
| `createdAt` | number | Erstellungszeitstempel |
| `updatedAt` | number | Letzter Aktualisierungszeitstempel |
| `publicMetadata` | json | Öffentliche Metadaten |
| `success` | boolean | Erfolgsstatus der Operation |
### `clerk_update_user`
Aktualisieren Sie einen bestehenden Benutzer in Ihrer Clerk-Anwendung
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `secretKey` | string | Ja | Der Clerk Secret Key für die API-Authentifizierung |
| `userId` | string | Ja | Die ID des zu aktualisierenden Benutzers \(z. B. user_2NNEqL2nrIRdJ194ndJqAHwEfxC\) |
| `firstName` | string | Nein | Vorname des Benutzers |
| `lastName` | string | Nein | Nachname des Benutzers |
| `username` | string | Nein | Benutzername \(muss eindeutig sein\) |
| `password` | string | Nein | Neues Passwort \(mindestens 8 Zeichen\) |
| `externalId` | string | Nein | Externe System-ID |
| `primaryEmailAddressId` | string | Nein | ID der verifizierten E-Mail, die als primär festgelegt werden soll |
| `primaryPhoneNumberId` | string | Nein | ID der verifizierten Telefonnummer, die als primär festgelegt werden soll |
| `publicMetadata` | json | Nein | Öffentliche Metadaten \(JSON-Objekt\) |
| `privateMetadata` | json | Nein | Private Metadaten \(JSON-Objekt\) |
| `unsafeMetadata` | json | Nein | Unsichere Metadaten \(JSON-Objekt\) |
| `skipPasswordChecks` | boolean | Nein | Passwortvalidierungsprüfungen überspringen |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `id` | string | Aktualisierte Benutzer-ID |
| `username` | string | Benutzername |
| `firstName` | string | Vorname |
| `lastName` | string | Nachname |
| `imageUrl` | string | Profilbild-URL |
| `primaryEmailAddressId` | string | Primäre E-Mail-Adressen-ID |
| `primaryPhoneNumberId` | string | Primäre Telefonnummer-ID |
| `emailAddresses` | array | E-Mail-Adressen des Benutzers |
| ↳ `id` | string | E-Mail-Adressen-ID |
| ↳ `emailAddress` | string | E-Mail-Adresse |
| ↳ `verified` | boolean | Ob die E-Mail verifiziert ist |
| `phoneNumbers` | array | Telefonnummern des Benutzers |
| ↳ `id` | string | Telefonnummer-ID |
| ↳ `phoneNumber` | string | Telefonnummer |
| ↳ `verified` | boolean | Ob die Telefonnummer verifiziert ist |
| `externalId` | string | Externe System-ID |
| `banned` | boolean | Ob der Benutzer gesperrt ist |
| `locked` | boolean | Ob der Benutzer blockiert ist |
| `createdAt` | number | Erstellungszeitstempel |
| `updatedAt` | number | Zeitstempel der letzten Aktualisierung |
| `publicMetadata` | json | Öffentliche Metadaten |
| `success` | boolean | Erfolgsstatus der Operation |
### `clerk_delete_user`
Einen Benutzer aus Ihrer Clerk-Anwendung löschen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `secretKey` | string | Ja | Der Clerk Secret Key für die API-Authentifizierung |
| `userId` | string | Ja | Die ID des zu löschenden Benutzers (z. B. user_2NNEqL2nrIRdJ194ndJqAHwEfxC) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `id` | string | ID des gelöschten Benutzers |
| `object` | string | Objekttyp (user) |
| `deleted` | boolean | Ob der Benutzer gelöscht wurde |
| `success` | boolean | Erfolgsstatus der Operation |
### `clerk_list_organizations`
Alle Organisationen in Ihrer Clerk-Anwendung mit optionaler Filterung auflisten
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `secretKey` | string | Ja | Der Clerk Secret Key für die API-Authentifizierung |
| `limit` | number | Nein | Anzahl der Ergebnisse pro Seite (z. B. 10, 50, 100; Bereich: 1500, Standard: 10) |
| `offset` | number | Nein | Anzahl der zu überspringenden Ergebnisse für die Paginierung (z. B. 0, 10, 20) |
| `includeMembersCount` | boolean | Nein | Mitgliederanzahl für jede Organisation einbeziehen |
| `query` | string | Nein | Suche nach Organisations-ID, Name oder Slug (z. B. Acme Corp oder acme-corp) |
| `orderBy` | string | Nein | Sortierfeld (name, created_at, members_count) mit +/- Präfix |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `organizations` | array | Array von Clerk-Organisationsobjekten |
| ↳ `id` | string | Organisations-ID |
| ↳ `name` | string | Organisationsname |
| ↳ `slug` | string | Organisations-Slug |
| ↳ `imageUrl` | string | URL des Organisationsbilds |
| ↳ `hasImage` | boolean | Ob die Organisation ein Bild hat |
| ↳ `membersCount` | number | Anzahl der Mitglieder |
| ↳ `pendingInvitationsCount` | number | Anzahl ausstehender Einladungen |
| ↳ `maxAllowedMemberships` | number | Maximal zulässige Mitgliedschaften |
| ↳ `adminDeleteEnabled` | boolean | Ob Admin-Löschung aktiviert ist |
| ↳ `createdBy` | string | Benutzer-ID des Erstellers |
| ↳ `createdAt` | number | Erstellungszeitstempel |
| ↳ `updatedAt` | number | Zeitstempel der letzten Aktualisierung |
| ↳ `publicMetadata` | json | Öffentliche Metadaten |
| `totalCount` | number | Gesamtanzahl der Organisationen |
| `success` | boolean | Erfolgsstatus der Operation |
### `clerk_get_organization`
Abrufen einer einzelnen Organisation nach ID oder Slug von Clerk
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `secretKey` | string | Ja | Der Clerk Secret Key für die API-Authentifizierung |
| `organizationId` | string | Ja | Die ID oder der Slug der abzurufenden Organisation \(z. B. org_2NNEqL2nrIRdJ194ndJqAHwEfxC oder my-org-slug\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `id` | string | Organisations-ID |
| `name` | string | Organisationsname |
| `slug` | string | Organisations-Slug |
| `imageUrl` | string | URL des Organisationsbilds |
| `hasImage` | boolean | Ob die Organisation ein Bild hat |
| `membersCount` | number | Anzahl der Mitglieder |
| `pendingInvitationsCount` | number | Anzahl ausstehender Einladungen |
| `maxAllowedMemberships` | number | Maximal zulässige Mitgliedschaften |
| `adminDeleteEnabled` | boolean | Ob Admin-Löschung aktiviert ist |
| `createdBy` | string | Benutzer-ID des Erstellers |
| `createdAt` | number | Erstellungszeitstempel |
| `updatedAt` | number | Zeitstempel der letzten Aktualisierung |
| `publicMetadata` | json | Öffentliche Metadaten |
| `success` | boolean | Erfolgsstatus der Operation |
### `clerk_create_organization`
Erstellen Sie eine neue Organisation in Ihrer Clerk-Anwendung
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `secretKey` | string | Ja | Der Clerk Secret Key für die API-Authentifizierung |
| `name` | string | Ja | Name der Organisation |
| `createdBy` | string | Ja | Benutzer-ID des Erstellers, der Administrator wird \(z. B. user_2NNEqL2nrIRdJ194ndJqAHwEfxC\) |
| `slug` | string | Nein | Slug-Identifikator für die Organisation |
| `maxAllowedMemberships` | number | Nein | Maximale Mitgliederkapazität \(0 für unbegrenzt\) |
| `publicMetadata` | json | Nein | Öffentliche Metadaten \(JSON-Objekt\) |
| `privateMetadata` | json | Nein | Private Metadaten \(JSON-Objekt\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `id` | string | Erstellte Organisations-ID |
| `name` | string | Organisationsname |
| `slug` | string | Organisations-Slug |
| `imageUrl` | string | URL des Organisationsbildes |
| `hasImage` | boolean | Ob die Organisation ein Bild hat |
| `membersCount` | number | Anzahl der Mitglieder |
| `pendingInvitationsCount` | number | Anzahl ausstehender Einladungen |
| `maxAllowedMemberships` | number | Maximal zulässige Mitgliedschaften |
| `adminDeleteEnabled` | boolean | Ob das Löschen durch den Administrator aktiviert ist |
| `createdBy` | string | Benutzer-ID des Erstellers |
| `createdAt` | number | Erstellungszeitstempel |
| `updatedAt` | number | Zeitstempel der letzten Aktualisierung |
| `publicMetadata` | json | Öffentliche Metadaten |
| `success` | boolean | Erfolgsstatus der Operation |
### `clerk_list_sessions`
Sitzungen für einen Benutzer oder Client in Ihrer Clerk-Anwendung auflisten
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `secretKey` | string | Ja | Der Clerk Secret Key für die API-Authentifizierung |
| `userId` | string | Nein | Benutzer-ID, für die Sitzungen aufgelistet werden sollen \(z. B. user_2NNEqL2nrIRdJ194ndJqAHwEfxC; erforderlich, wenn clientId nicht angegeben ist\) |
| `clientId` | string | Nein | Client-ID, für die Sitzungen aufgelistet werden sollen \(erforderlich, wenn userId nicht angegeben ist\) |
| `status` | string | Nein | Nach Sitzungsstatus filtern \(abandoned, active, ended, expired, pending, removed, replaced, revoked\) |
| `limit` | number | Nein | Anzahl der Ergebnisse pro Seite \(z. B. 10, 50, 100; Bereich: 1-500, Standard: 10\) |
| `offset` | number | Nein | Anzahl der zu überspringenden Ergebnisse für die Paginierung \(z. B. 0, 10, 20\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `sessions` | array | Array von Clerk-Sitzungsobjekten |
| ↳ `id` | string | Sitzungs-ID |
| ↳ `userId` | string | Benutzer-ID |
| ↳ `clientId` | string | Client-ID |
| ↳ `status` | string | Sitzungsstatus |
| ↳ `lastActiveAt` | number | Zeitstempel der letzten Aktivität |
| ↳ `lastActiveOrganizationId` | string | ID der zuletzt aktiven Organisation |
| ↳ `expireAt` | number | Ablaufzeitstempel |
| ↳ `abandonAt` | number | Abbruchzeitstempel |
| ↳ `createdAt` | number | Erstellungszeitstempel |
| ↳ `updatedAt` | number | Zeitstempel der letzten Aktualisierung |
| `totalCount` | number | Gesamtanzahl der Sitzungen |
| `success` | boolean | Erfolgsstatus der Operation |
### `clerk_get_session`
Eine einzelne Sitzung anhand der ID von Clerk abrufen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `secretKey` | string | Ja | Der geheime Clerk-Schlüssel für die API-Authentifizierung |
| `sessionId` | string | Ja | Die ID der abzurufenden Sitzung \(z. B. sess_2NNEqL2nrIRdJ194ndJqAHwEfxC\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `id` | string | Sitzungs-ID |
| `userId` | string | Benutzer-ID |
| `clientId` | string | Client-ID |
| `status` | string | Sitzungsstatus |
| `lastActiveAt` | number | Zeitstempel der letzten Aktivität |
| `lastActiveOrganizationId` | string | ID der zuletzt aktiven Organisation |
| `expireAt` | number | Ablaufzeitstempel |
| `abandonAt` | number | Zeitstempel für Abbruch |
| `createdAt` | number | Erstellungszeitstempel |
| `updatedAt` | number | Zeitstempel der letzten Aktualisierung |
| `success` | boolean | Erfolgsstatus der Operation |
### `clerk_revoke_session`
Eine Sitzung widerrufen, um sie sofort ungültig zu machen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `secretKey` | string | Ja | Der geheime Clerk-Schlüssel für die API-Authentifizierung |
| `sessionId` | string | Ja | Die ID der zu widerrufenden Sitzung \(z. B. sess_2NNEqL2nrIRdJ194ndJqAHwEfxC\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `id` | string | Sitzungs-ID |
| `userId` | string | Benutzer-ID |
| `clientId` | string | Client-ID |
| `status` | string | Sitzungsstatus \(sollte widerrufen sein\) |
| `lastActiveAt` | number | Zeitstempel der letzten Aktivität |
| `lastActiveOrganizationId` | string | ID der zuletzt aktiven Organisation |
| `expireAt` | number | Ablaufzeitstempel |
| `abandonAt` | number | Zeitstempel für Abbruch |
| `createdAt` | number | Erstellungszeitstempel |
| `updatedAt` | number | Zeitstempel der letzten Aktualisierung |
| `success` | boolean | Erfolgsstatus der Operation |

View File

@@ -354,3 +354,512 @@ Listet alle Confluence-Spaces auf, auf die der Benutzer zugreifen kann.
- Kategorie: `tools`
- Typ: `confluence`
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `domain` | string | Ja | Ihre Confluence-Domain (z. B. ihrfirma.atlassian.net) |
| `blogPostId` | string | Ja | Die ID des abzurufenden Blogbeitrags |
| `bodyFormat` | string | Nein | Format für den Blogbeitrag-Body: storage, atlas_doc_format oder view |
| `cloudId` | string | Nein | Confluence Cloud-ID für die Instanz. Wenn nicht angegeben, wird sie über die Domain abgerufen. |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `ts` | string | ISO 8601-Zeitstempel der Operation |
| `id` | string | Blogbeitrag-ID |
| `title` | string | Blogbeitrag-Titel |
| `status` | string | Blogbeitrag-Status |
| `spaceId` | string | Space-ID |
| `authorId` | string | Konto-ID des Autors |
| `createdAt` | string | Erstellungszeitstempel |
| `version` | object | Versionsinformationen |
| ↳ `number` | number | Versionsnummer |
| ↳ `message` | string | Versionsnachricht |
| ↳ `minorEdit` | boolean | Ob dies eine geringfügige Bearbeitung ist |
| ↳ `authorId` | string | Konto-ID des Versionsautors |
| ↳ `createdAt` | string | ISO 8601-Zeitstempel der Versionserstellung |
| `body` | object | Blogbeitrag-Body-Inhalt im angeforderten Format |
| ↳ `storage` | object | Body im Speicherformat (Confluence-Markup) |
| ↳ `value` | string | Der Inhaltswert im angegebenen Format |
| ↳ `representation` | string | Inhaltsdarstellungstyp |
| ↳ `view` | object | Body im Ansichtsformat (gerendertes HTML) |
| ↳ `value` | string | Der Inhaltswert im angegebenen Format |
| ↳ `representation` | string | Inhaltsdarstellungstyp |
| ↳ `atlas_doc_format` | object | Body im Atlassian Document Format (ADF) |
| ↳ `value` | string | Der Inhaltswert im angegebenen Format |
| ↳ `representation` | string | Inhaltsdarstellungstyp |
| `webUrl` | string | URL zum Anzeigen des Blogbeitrags |
### `confluence_create_blogpost`
Erstellen Sie einen neuen Blogbeitrag in einem Confluence-Space.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `domain` | string | Ja | Ihre Confluence-Domain (z.B. ihrfirma.atlassian.net) |
| `spaceId` | string | Ja | Die ID des Spaces, in dem der Blogbeitrag erstellt werden soll |
| `title` | string | Ja | Titel des Blogbeitrags |
| `content` | string | Ja | Blogbeitrag-Inhalt im Confluence-Speicherformat (HTML) |
| `status` | string | Nein | Blogbeitrag-Status: current (Standard) oder draft |
| `cloudId` | string | Nein | Confluence Cloud-ID für die Instanz. Wenn nicht angegeben, wird sie über die Domain abgerufen. |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `ts` | string | ISO 8601-Zeitstempel der Operation |
| `id` | string | Erstellte Blogbeitrag-ID |
| `title` | string | Blogbeitrag-Titel |
| `status` | string | Blogbeitrag-Status |
| `spaceId` | string | Space-ID |
| `authorId` | string | Konto-ID des Autors |
| `body` | object | Blogbeitrag-Inhalt |
| ↳ `storage` | object | Inhalt im Speicherformat (Confluence-Markup) |
| ↳ `value` | string | Der Inhaltswert im angegebenen Format |
| ↳ `representation` | string | Inhaltsdarstellungstyp |
| ↳ `view` | object | Inhalt im Anzeigeformat (gerendertes HTML) |
| ↳ `value` | string | Der Inhaltswert im angegebenen Format |
| ↳ `representation` | string | Inhaltsdarstellungstyp |
| ↳ `atlas_doc_format` | object | Inhalt im Atlassian Document Format (ADF) |
| ↳ `value` | string | Der Inhaltswert im angegebenen Format |
| ↳ `representation` | string | Inhaltsdarstellungstyp |
| `version` | object | Versionsinformationen des Blogbeitrags |
| ↳ `number` | number | Versionsnummer |
| ↳ `message` | string | Versionsnachricht |
| ↳ `minorEdit` | boolean | Ob dies eine geringfügige Bearbeitung ist |
| ↳ `authorId` | string | Konto-ID des Versionsautors |
| ↳ `createdAt` | string | ISO 8601-Zeitstempel der Versionserstellung |
| `webUrl` | string | URL zum Anzeigen des Blogbeitrags |
### `confluence_list_blogposts_in_space`
Listet alle Blogbeiträge innerhalb eines bestimmten Confluence-Spaces auf.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `domain` | string | Ja | Ihre Confluence-Domain (z.B. ihrfirma.atlassian.net) |
| `spaceId` | string | Ja | Die ID des Confluence-Spaces, aus dem Blogbeiträge aufgelistet werden sollen |
| `limit` | number | Nein | Maximale Anzahl der zurückzugebenden Blogbeiträge (Standard: 25, max: 250) |
| `status` | string | Nein | Filtern nach Status: current, archived, trashed oder draft |
| `bodyFormat` | string | Nein | Format für den Blogbeitrags-Body: storage, atlas_doc_format oder view |
| `cursor` | string | Nein | Paginierungs-Cursor aus vorheriger Antwort |
| `cloudId` | string | Nein | Confluence Cloud-ID für die Instanz. Wenn nicht angegeben, wird sie über die Domain abgerufen. |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `ts` | string | ISO 8601-Zeitstempel der Operation |
| `blogPosts` | array | Array von Blogbeiträgen im Space |
| ↳ `id` | string | Blogbeitrags-ID |
| ↳ `title` | string | Blogbeitragstitel |
| ↳ `status` | string | Blogbeitragsstatus |
| ↳ `spaceId` | string | Space-ID |
| ↳ `authorId` | string | Konto-ID des Autors |
| ↳ `createdAt` | string | Erstellungszeitstempel |
| ↳ `version` | object | Versionsinformationen |
| ↳ `number` | number | Versionsnummer |
| ↳ `message` | string | Versionsnachricht |
| ↳ `minorEdit` | boolean | Ob dies eine geringfügige Bearbeitung ist |
| ↳ `authorId` | string | Konto-ID des Versionsautors |
| ↳ `createdAt` | string | ISO 8601-Zeitstempel der Versionserstellung |
| ↳ `body` | object | Blogbeitrags-Body-Inhalt |
| ↳ `storage` | object | Body im Speicherformat (Confluence-Markup) |
| ↳ `value` | string | Der Inhaltswert im angegebenen Format |
| ↳ `representation` | string | Inhaltsdarstellungstyp |
| ↳ `view` | object | Body im Ansichtsformat (gerendertes HTML) |
| ↳ `value` | string | Der Inhaltswert im angegebenen Format |
| ↳ `representation` | string | Inhaltsdarstellungstyp |
| ↳ `atlas_doc_format` | object | Body im Atlassian Document Format (ADF) |
| ↳ `value` | string | Der Inhaltswert im angegebenen Format |
| ↳ `representation` | string | Inhaltsdarstellungstyp |
| ↳ `webUrl` | string | URL zum Anzeigen des Blogbeitrags |
| `nextCursor` | string | Cursor zum Abrufen der nächsten Ergebnisseite |
### `confluence_create_comment`
Fügen Sie einen Kommentar zu einer Confluence-Seite hinzu.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `domain` | string | Ja | Ihre Confluence-Domain (z.B. ihrfirma.atlassian.net) |
| `pageId` | string | Ja | Confluence-Seiten-ID, zu der ein Kommentar hinzugefügt werden soll |
| `comment` | string | Ja | Kommentartext im Confluence-Speicherformat |
| `cloudId` | string | Nein | Confluence Cloud-ID für die Instanz. Wenn nicht angegeben, wird sie über die Domain abgerufen. |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `ts` | string | Zeitstempel der Erstellung |
| `commentId` | string | Erstellte Kommentar-ID |
| `pageId` | string | Seiten-ID |
### `confluence_list_comments`
Listen Sie alle Kommentare auf einer Confluence-Seite auf.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `domain` | string | Ja | Ihre Confluence-Domain (z.B. ihrfirma.atlassian.net) |
| `pageId` | string | Ja | Confluence-Seiten-ID, von der Kommentare aufgelistet werden sollen |
| `limit` | number | Nein | Maximale Anzahl der zurückzugebenden Kommentare (Standard: 25) |
| `bodyFormat` | string | Nein | Format für den Kommentartext: storage, atlas_doc_format, view oder export_view (Standard: storage) |
| `cursor` | string | Nein | Paginierungs-Cursor aus vorheriger Antwort |
| `cloudId` | string | Nein | Confluence Cloud-ID für die Instanz. Wenn nicht angegeben, wird sie über die Domain abgerufen. |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `ts` | string | ISO 8601-Zeitstempel der Operation |
| `comments` | array | Array von Confluence-Kommentaren |
| ↳ `id` | string | Eindeutige Kommentar-ID |
| ↳ `status` | string | Kommentarstatus (z. B. current) |
| ↳ `title` | string | Kommentartitel |
| ↳ `pageId` | string | ID der Seite, zu der der Kommentar gehört |
| ↳ `blogPostId` | string | ID des Blogposts, zu dem der Kommentar gehört |
| ↳ `parentCommentId` | string | ID des übergeordneten Kommentars |
| ↳ `body` | object | Kommentarinhalt |
| ↳ `value` | string | Kommentarinhalt |
| ↳ `representation` | string | Format der Inhaltsdarstellung (z. B. storage, view) |
| ↳ `createdAt` | string | ISO 8601-Zeitstempel der Kommentarerstellung |
| ↳ `authorId` | string | Account-ID des Kommentarautors |
| ↳ `version` | object | Versionsinformationen des Kommentars |
| ↳ `number` | number | Versionsnummer |
| ↳ `message` | string | Versionsnachricht |
| ↳ `minorEdit` | boolean | Ob es sich um eine geringfügige Bearbeitung handelt |
| ↳ `authorId` | string | Account-ID des Versionsautors |
| ↳ `createdAt` | string | ISO 8601-Zeitstempel der Versionserstellung |
| `nextCursor` | string | Cursor zum Abrufen der nächsten Ergebnisseite |
### `confluence_update_comment`
Aktualisiert einen vorhandenen Kommentar auf einer Confluence-Seite.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `domain` | string | Ja | Ihre Confluence-Domain (z.B. ihrfirma.atlassian.net) |
| `commentId` | string | Ja | Confluence-Kommentar-ID zum Aktualisieren |
| `comment` | string | Ja | Aktualisierter Kommentartext im Confluence-Speicherformat |
| `cloudId` | string | Nein | Confluence Cloud-ID für die Instanz. Wenn nicht angegeben, wird sie über die Domain abgerufen. |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `ts` | string | Zeitstempel der Aktualisierung |
| `commentId` | string | Aktualisierte Kommentar-ID |
| `updated` | boolean | Aktualisierungsstatus |
### `confluence_delete_comment`
Löscht einen Kommentar von einer Confluence-Seite.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `domain` | string | Ja | Ihre Confluence-Domain (z.B. ihrfirma.atlassian.net) |
| `commentId` | string | Ja | Confluence-Kommentar-ID zum Löschen |
| `cloudId` | string | Nein | Confluence Cloud-ID für die Instanz. Wenn nicht angegeben, wird sie über die Domain abgerufen. |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `ts` | string | Zeitstempel der Löschung |
| `commentId` | string | Gelöschte Kommentar-ID |
| `deleted` | boolean | Löschstatus |
### `confluence_upload_attachment`
Laden Sie eine Datei als Anhang zu einer Confluence-Seite hoch.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `domain` | string | Ja | Ihre Confluence-Domain (z. B. ihrfirma.atlassian.net) |
| `pageId` | string | Ja | Confluence-Seiten-ID, an die die Datei angehängt werden soll |
| `file` | file | Ja | Die als Anhang hochzuladende Datei |
| `fileName` | string | Nein | Optionaler benutzerdefinierter Dateiname für den Anhang |
| `comment` | string | Nein | Optionaler Kommentar zum Anhang |
| `cloudId` | string | Nein | Confluence Cloud-ID für die Instanz. Wenn nicht angegeben, wird sie über die Domain abgerufen. |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `ts` | string | Zeitstempel des Uploads |
| `attachmentId` | string | Hochgeladene Anhangs-ID |
| `title` | string | Dateiname des Anhangs |
| `fileSize` | number | Dateigröße in Bytes |
| `mediaType` | string | MIME-Typ des Anhangs |
| `downloadUrl` | string | Download-URL für den Anhang |
| `pageId` | string | Seiten-ID, zu der der Anhang hinzugefügt wurde |
### `confluence_list_attachments`
Listen Sie alle Anhänge auf einer Confluence-Seite auf.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `domain` | string | Ja | Ihre Confluence-Domain (z. B. ihrfirma.atlassian.net) |
| `pageId` | string | Ja | Confluence-Seiten-ID, von der Anhänge aufgelistet werden sollen |
| `limit` | number | Nein | Maximale Anzahl der zurückzugebenden Anhänge (Standard: 50, max: 250) |
| `cursor` | string | Nein | Paginierungs-Cursor aus vorheriger Antwort |
| `cloudId` | string | Nein | Confluence Cloud-ID für die Instanz. Wenn nicht angegeben, wird sie über die Domain abgerufen. |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `ts` | string | ISO 8601-Zeitstempel der Operation |
| `attachments` | array | Array von Confluence-Anhängen |
| ↳ `id` | string | Eindeutige Anhangs-ID (mit Präfix "att") |
| ↳ `title` | string | Dateiname des Anhangs |
| ↳ `status` | string | Anhangsstatus (z. B. current, archived, trashed) |
| ↳ `mediaType` | string | MIME-Typ des Anhangs |
| ↳ `fileSize` | number | Dateigröße in Bytes |
| ↳ `downloadUrl` | string | URL zum Herunterladen des Anhangs |
| ↳ `webuiUrl` | string | URL zum Anzeigen des Anhangs in der Confluence-Oberfläche |
| ↳ `pageId` | string | ID der Seite, zu der der Anhang gehört |
| ↳ `blogPostId` | string | ID des Blogbeitrags, zu dem der Anhang gehört |
| ↳ `comment` | string | Kommentar/Beschreibung des Anhangs |
| ↳ `version` | object | Versionsinformationen des Anhangs |
| ↳ `number` | number | Versionsnummer |
| ↳ `message` | string | Versionsnachricht |
| ↳ `minorEdit` | boolean | Ob es sich um eine geringfügige Bearbeitung handelt |
| ↳ `authorId` | string | Konto-ID des Versionsautors |
| ↳ `createdAt` | string | ISO 8601-Zeitstempel der Versionserstellung |
| `nextCursor` | string | Cursor zum Abrufen der nächsten Ergebnisseite |
### `confluence_delete_attachment`
Löschen eines Anhangs von einer Confluence-Seite (verschiebt ihn in den Papierkorb).
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `domain` | string | Ja | Ihre Confluence-Domain (z.B. ihrfirma.atlassian.net) |
| `attachmentId` | string | Ja | Confluence-Anhangs-ID zum Löschen |
| `cloudId` | string | Nein | Confluence Cloud-ID für die Instanz. Wenn nicht angegeben, wird sie über die Domain abgerufen. |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `ts` | string | Zeitstempel der Löschung |
| `attachmentId` | string | Gelöschte Anhangs-ID |
| `deleted` | boolean | Löschstatus |
### `confluence_list_labels`
Alle Labels auf einer Confluence-Seite auflisten.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `domain` | string | Ja | Ihre Confluence-Domain (z.B. ihrfirma.atlassian.net) |
| `pageId` | string | Ja | Confluence-Seiten-ID, von der Labels aufgelistet werden sollen |
| `limit` | number | Nein | Maximale Anzahl der zurückzugebenden Labels (Standard: 25, max: 250) |
| `cursor` | string | Nein | Paginierungs-Cursor aus vorheriger Antwort |
| `cloudId` | string | Nein | Confluence Cloud-ID für die Instanz. Wenn nicht angegeben, wird sie über die Domain abgerufen. |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `ts` | string | Zeitstempel des Abrufs |
| `labels` | array | Array von Labels auf der Seite |
| ↳ `id` | string | Eindeutige Label-ID |
| ↳ `name` | string | Label-Name |
| ↳ `prefix` | string | Label-Präfix/Typ (z.B. global, my, team) |
| `nextCursor` | string | Cursor zum Abrufen der nächsten Ergebnisseite |
### `confluence_add_label`
Fügen Sie einer Confluence-Seite ein Label zur Organisation und Kategorisierung hinzu.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `domain` | string | Ja | Ihre Confluence-Domain (z.B. ihrfirma.atlassian.net) |
| `pageId` | string | Ja | Confluence-Seiten-ID, zu der das Label hinzugefügt werden soll |
| `labelName` | string | Ja | Name des hinzuzufügenden Labels |
| `prefix` | string | Nein | Label-Präfix: global (Standard), my, team oder system |
| `cloudId` | string | Nein | Confluence Cloud-ID für die Instanz. Wenn nicht angegeben, wird sie über die Domain abgerufen. |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `ts` | string | ISO 8601-Zeitstempel der Operation |
| `pageId` | string | Seiten-ID, zu der das Label hinzugefügt wurde |
| `labelName` | string | Name des hinzugefügten Labels |
| `labelId` | string | ID des hinzugefügten Labels |
### `confluence_delete_label`
Entfernen Sie ein Label von einer Confluence-Seite.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `domain` | string | Ja | Ihre Confluence-Domain (z.B. ihrfirma.atlassian.net) |
| `pageId` | string | Ja | Confluence-Seiten-ID, von der das Label entfernt werden soll |
| `labelName` | string | Ja | Name des zu entfernenden Labels |
| `cloudId` | string | Nein | Confluence Cloud-ID für die Instanz. Wenn nicht angegeben, wird sie über die Domain abgerufen. |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `ts` | string | ISO 8601-Zeitstempel der Operation |
| `pageId` | string | Seiten-ID, von der das Label entfernt wurde |
| `labelName` | string | Name des entfernten Labels |
| `deleted` | boolean | Löschstatus |
### `confluence_get_pages_by_label`
Ruft alle Seiten ab, auf die ein bestimmtes Label angewendet wurde.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `domain` | string | Ja | Ihre Confluence-Domain (z. B. ihrfirma.atlassian.net) |
| `labelId` | string | Ja | Die ID des Labels, für das Seiten abgerufen werden sollen |
| `limit` | number | Nein | Maximale Anzahl der zurückzugebenden Seiten (Standard: 50, max: 250) |
| `cursor` | string | Nein | Paginierungs-Cursor aus vorheriger Antwort |
| `cloudId` | string | Nein | Confluence Cloud-ID für die Instanz. Wenn nicht angegeben, wird sie über die Domain abgerufen. |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `ts` | string | ISO 8601-Zeitstempel der Operation |
| `labelId` | string | ID des Labels |
| `pages` | array | Array von Seiten mit diesem Label |
| ↳ `id` | string | Eindeutige Seitenkennung |
| ↳ `title` | string | Seitentitel |
| ↳ `status` | string | Seitenstatus (z. B. current, archived, trashed, draft) |
| ↳ `spaceId` | string | ID des Spaces, der die Seite enthält |
| ↳ `parentId` | string | ID der übergeordneten Seite (null bei oberster Ebene) |
| ↳ `authorId` | string | Account-ID des Seitenautors |
| ↳ `createdAt` | string | ISO 8601-Zeitstempel der Seitenerstellung |
| ↳ `version` | object | Seitenversionsinformationen |
| ↳ `number` | number | Versionsnummer |
| ↳ `message` | string | Versionsnachricht |
| ↳ `minorEdit` | boolean | Ob dies eine geringfügige Bearbeitung ist |
| ↳ `authorId` | string | Account-ID des Versionsautors |
| ↳ `createdAt` | string | ISO 8601-Zeitstempel der Versionserstellung |
| `nextCursor` | string | Cursor zum Abrufen der nächsten Ergebnisseite |
### `confluence_list_space_labels`
Alle Labels auflisten, die mit einem Confluence-Space verknüpft sind.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `domain` | string | Ja | Ihre Confluence-Domain (z.B. ihrfirma.atlassian.net) |
| `spaceId` | string | Ja | Die ID des Confluence-Space, von dem Labels aufgelistet werden sollen |
| `limit` | number | Nein | Maximale Anzahl der zurückzugebenden Labels (Standard: 25, max: 250) |
| `cursor` | string | Nein | Paginierungs-Cursor aus vorheriger Antwort |
| `cloudId` | string | Nein | Confluence Cloud-ID für die Instanz. Wenn nicht angegeben, wird sie über die Domain abgerufen. |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `ts` | string | ISO 8601-Zeitstempel der Operation |
| `spaceId` | string | ID des Space |
| `labels` | array | Array von Labels im Space |
| ↳ `id` | string | Eindeutige Label-ID |
| ↳ `name` | string | Label-Name |
| ↳ `prefix` | string | Label-Präfix/Typ (z.B. global, my, team) |
| `nextCursor` | string | Cursor zum Abrufen der nächsten Ergebnisseite |
### `confluence_get_space`
Details zu einem bestimmten Confluence-Space abrufen.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `domain` | string | Ja | Ihre Confluence-Domain (z.B. ihrfirma.atlassian.net) |
| `spaceId` | string | Ja | Confluence-Space-ID zum Abrufen |
| `cloudId` | string | Nein | Confluence Cloud-ID für die Instanz. Wenn nicht angegeben, wird sie über die Domain abgerufen. |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `ts` | string | ISO 8601-Zeitstempel der Operation |
| `spaceId` | string | Space-ID |
| `name` | string | Space-Name |
| `key` | string | Space-Schlüssel |
| `type` | string | Space-Typ (global, personal) |
| `status` | string | Space-Status (current, archived) |
| `url` | string | URL zum Anzeigen des Space in Confluence |
| `authorId` | string | Account-ID des Space-Erstellers |
| `createdAt` | string | ISO 8601-Zeitstempel der Space-Erstellung |
| `homepageId` | string | ID der Space-Startseite |
| `description` | object | Space-Beschreibungsinhalt |
| ↳ `value` | string | Beschreibungstext |
| ↳ `representation` | string | Format der Inhaltsdarstellung (z. B. plain, view, storage) |
### `confluence_list_spaces`
Listet alle Confluence-Spaces auf, auf die der Benutzer zugreifen kann.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `domain` | string | Ja | Ihre Confluence-Domain (z. B. ihrfirma.atlassian.net) |
| `limit` | number | Nein | Maximale Anzahl der zurückzugebenden Spaces (Standard: 25, max: 250) |
| `cursor` | string | Nein | Paginierungs-Cursor aus vorheriger Antwort |
| `cloudId` | string | Nein | Confluence Cloud-ID für die Instanz. Wenn nicht angegeben, wird sie über die Domain abgerufen. |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `ts` | string | ISO-8601-Zeitstempel der Operation |
| `spaces` | array | Array von Confluence-Spaces |
| ↳ `id` | string | Eindeutige Space-ID |
| ↳ `key` | string | Space-Schlüssel \(Kurzbezeichner für URLs\) |
| ↳ `name` | string | Space-Name |
| ↳ `type` | string | Space-Typ \(z. B. global, personal\) |
| ↳ `status` | string | Space-Status \(z. B. current, archived\) |
| ↳ `authorId` | string | Account-ID des Space-Erstellers |
| ↳ `createdAt` | string | ISO-8601-Zeitstempel der Space-Erstellung |
| ↳ `homepageId` | string | ID der Space-Startseite |
| ↳ `description` | object | Space-Beschreibung |
| ↳ `value` | string | Beschreibungstext |
| ↳ `representation` | string | Format der Inhaltsdarstellung \(z. B. plain, view, storage\) |
| `nextCursor` | string | Cursor zum Abrufen der nächsten Ergebnisseite |

View File

@@ -168,15 +168,3 @@ Löscht einen Cloud-Agenten dauerhaft. Diese Aktion kann nicht rückgängig gema
| --------- | ---- | -------- | ----------- |
| `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

@@ -295,8 +295,3 @@ Eine geplante Ausfallzeit abbrechen.
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Ob die Ausfallzeit erfolgreich abgebrochen wurde |
## Hinweise
- Kategorie: `tools`
- Typ: `datadog`

View File

@@ -730,8 +730,3 @@ Einen Discord-Webhook löschen
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `message` | string | Erfolgs- oder Fehlermeldung |
## Hinweise
- Kategorie: `tools`
- Typ: `discord`

View File

@@ -212,8 +212,3 @@ Suche nach Dateien und Ordnern in Dropbox
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `matches` | array | Suchergebnisse |
## Hinweise
- Kategorie: `tools`
- Typ: `dropbox`

View File

@@ -0,0 +1,107 @@
---
title: DSPy
description: Führen Sie Vorhersagen mit selbst gehosteten DSPy-Programmen aus
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="dspy"
color="#E0E0E0"
/>
{/* MANUAL-CONTENT-START:intro */}
[DSPy](https://github.com/stanford-oval/dspy) ist ein Open-Source-Framework für die Programmierung statt Prompting von Sprachmodellen. DSPy ermöglicht es Ihnen, interpretierbare und modulare LLM-gestützte Agenten mithilfe von Python-Funktionen, strukturierten Modulen und deklarativen Signaturen zu erstellen, wodurch es einfach wird, Sprachmodellanwendungen zu komponieren, zu debuggen und zuverlässig bereitzustellen.
Mit DSPy in Sim können Sie:
- **Benutzerdefinierte Vorhersagen ausführen**: Verbinden Sie Ihren selbst gehosteten DSPy-Server und rufen Sie Vorhersage-Endpunkte für eine Vielzahl von natürlichsprachlichen Aufgaben auf.
- **Chain of Thought und ReAct-Reasoning**: Nutzen Sie fortgeschrittene DSPy-Module für schrittweises Reasoning, mehrstufige Dialoge und Action-Observation-Schleifen.
- **Integration in Ihre Workflows**: Automatisieren Sie LLM-Vorhersagen und Reasoning als Teil jeder Sim-Automatisierung oder Agentenroutine.
- **Benutzerdefinierte Endpunkte und Kontext bereitstellen**: Rufen Sie flexibel Ihre eigenen DSPy-gestützten APIs mit benutzerdefinierter Authentifizierung, Endpunkten, Eingabefeldern und Kontext auf.
Diese Funktionen ermöglichen es Ihren Sim-Agenten, auf modulare, interpretierbare LLM-basierte Programme für Aufgaben wie Fragebeantwortung, Dokumentenanalyse, Entscheidungsunterstützung und mehr zuzugreifen wobei Sie die Kontrolle über das Modell, die Daten und die Logik behalten.
{/* MANUAL-CONTENT-END */}
## Nutzungsanweisungen
Integrieren Sie sich mit Ihren selbst gehosteten DSPy-Programmen für LLM-gestützte Vorhersagen. Unterstützt Predict, Chain of Thought und ReAct-Agenten. DSPy ist das Framework für die Programmierung nicht das Prompting von Sprachmodellen.
## Tools
### `dspy_predict`
Führen Sie eine Vorhersage mit einem selbst gehosteten DSPy-Programm-Endpunkt aus
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `baseUrl` | string | Ja | Basis-URL des DSPy-Servers \(z. B. https://your-dspy-server.com\) |
| `apiKey` | string | Nein | API-Schlüssel für die Authentifizierung \(falls von Ihrem Server erforderlich\) |
| `endpoint` | string | Nein | API-Endpunkt-Pfad \(Standard ist /predict\) |
| `input` | string | Ja | Der Eingabetext, der an das DSPy-Programm gesendet werden soll |
| `inputField` | string | Nein | Name des Eingabefelds, das vom DSPy-Programm erwartet wird \(Standard ist "text"\) |
| `context` | string | Nein | Zusätzlicher Kontext, der dem DSPy-Programm bereitgestellt werden soll |
| `additionalInputs` | json | Nein | Zusätzliche Schlüssel-Wert-Paare, die in den Request-Body aufgenommen werden sollen |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `answer` | string | Die Hauptausgabe/Antwort des DSPy-Programms |
| `reasoning` | string | Die Begründung oder Erklärung hinter der Antwort \(falls verfügbar\) |
| `status` | string | Antwortstatus vom DSPy-Server \(Erfolg oder Fehler\) |
| `rawOutput` | json | Die vollständige Rohausgabe des DSPy-Programms \(result.toDict\(\)\) |
### `dspy_chain_of_thought`
Führen Sie eine Chain of Thought-Vorhersage mit einem selbst gehosteten DSPy ChainOfThought-Programm-Endpunkt aus
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `baseUrl` | string | Ja | Basis-URL des DSPy-Servers \(z. B. https://your-dspy-server.com\) |
| `apiKey` | string | Nein | API-Schlüssel für die Authentifizierung \(falls von Ihrem Server erforderlich\) |
| `endpoint` | string | Nein | API-Endpunkt-Pfad \(Standard ist /predict\) |
| `question` | string | Ja | Die Frage, die mithilfe von Chain of Thought-Reasoning beantwortet werden soll |
| `context` | string | Nein | Zusätzlicher Kontext zur Beantwortung der Frage |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `answer` | string | Die durch Chain of Thought-Reasoning generierte Antwort |
| `reasoning` | string | Die schrittweise Begründung, die zur Antwort geführt hat |
| `status` | string | Antwortstatus vom DSPy-Server \(Erfolg oder Fehler\) |
| `rawOutput` | json | Die vollständige Rohausgabe des DSPy-Programms \(result.toDict\(\)\) |
### `dspy_react`
Führen Sie einen ReAct-Agenten mit einem selbst gehosteten DSPy ReAct-Programm-Endpunkt für mehrstufiges Denken und Handeln aus
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `baseUrl` | string | Ja | Basis-URL des DSPy-Servers \(z. B. https://your-dspy-server.com\) |
| `apiKey` | string | Nein | API-Schlüssel für die Authentifizierung \(falls von Ihrem Server erforderlich\) |
| `endpoint` | string | Nein | API-Endpunkt-Pfad \(Standardwert: /predict\) |
| `task` | string | Ja | Die Aufgabe oder Frage, an der der ReAct-Agent arbeiten soll |
| `context` | string | Nein | Zusätzlicher Kontext für die Aufgabe |
| `maxIterations` | number | Nein | Maximale Anzahl von Denkiterationen \(Standardwert: Servereinstellung\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `answer` | string | Die endgültige Antwort oder das Ergebnis des ReAct-Agenten |
| `reasoning` | string | Die Gesamtzusammenfassung des Denkprozesses des Agenten |
| `trajectory` | array | Der schrittweise Verlauf von Gedanken, Aktionen und Beobachtungen |
| ↳ `thought` | string | Der Denkprozess in diesem Schritt |
| ↳ `toolName` | string | Der Name des aufgerufenen Tools/der Aktion |
| ↳ `toolArgs` | json | An das Tool übergebene Argumente |
| ↳ `observation` | string | Die Beobachtung/das Ergebnis der Tool-Ausführung |
| `status` | string | Antwortstatus vom DSPy-Server \(Erfolg oder Fehler\) |
| `rawOutput` | json | Die vollständige Rohausgabe des DSPy-Programms \(result.toDict\(\)\) |

View File

@@ -56,8 +56,3 @@ Durchsuche das Web mit der DuckDuckGo Instant Answers API. Liefert sofortige Ant
| `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

@@ -186,3 +186,20 @@ Ein Element aus einer DynamoDB-Tabelle löschen
- Kategorie: `tools`
- Typ: `dynamodb`
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `region` | string | Ja | AWS-Region (z.B. us-east-1) |
| `accessKeyId` | string | Ja | AWS-Zugriffsschlüssel-ID |
| `secretAccessKey` | string | Ja | AWS-Geheimzugriffsschlüssel |
| `tableName` | string | Nein | Optionaler Tabellenname, um ein detailliertes Schema zu erhalten (z.B. "Users", "Orders"). Wenn nicht angegeben, werden alle Tabellen aufgelistet. |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `message` | string | Statusmeldung der Operation |
| `tables` | array | Liste der Tabellennamen in der Region |
| `tableDetails` | object | Detaillierte Schemainformationen für eine bestimmte Tabelle |

View File

@@ -363,3 +363,22 @@ Erhalte umfassende Statistiken über den Elasticsearch-Cluster.
- Kategorie: `tools`
- Typ: `elasticsearch`
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `deploymentType` | string | Ja | Bereitstellungstyp: self_hosted oder cloud |
| `host` | string | Nein | Elasticsearch-Host-URL \(für self-hosted\) |
| `cloudId` | string | Nein | Elastic Cloud ID \(für Cloud-Bereitstellungen\) |
| `authMethod` | string | Ja | Authentifizierungsmethode: api_key oder basic_auth |
| `apiKey` | string | Nein | Elasticsearch API-Schlüssel |
| `username` | string | Nein | Benutzername für Basic-Auth |
| `password` | string | Nein | Passwort für Basic-Auth |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `message` | string | Zusammenfassende Nachricht über die Indizes |
| `indices` | json | Array von Indexinformationsobjekten |

View File

@@ -49,8 +49,3 @@ TTS mit ElevenLabs-Stimmen konvertieren
| --------- | ---- | ----------- |
| `audioUrl` | string | Die URL der generierten Audiodatei |
| `audioFile` | file | Die generierte Audiodatei |
## Hinweise
- Kategorie: `tools`
- Typ: `elevenlabs`

View File

@@ -0,0 +1,925 @@
---
title: Enrich
description: B2B-Datenanreicherung und LinkedIn-Intelligence mit Enrich.so
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="enrich"
color="#E5E5E6"
/>
{/* MANUAL-CONTENT-START:intro */}
[Enrich.so](https://enrich.so/) liefert präzise B2B-Datenanreicherung und LinkedIn-Intelligence in Echtzeit. Die Plattform bietet dynamischen Zugriff auf öffentliche und strukturierte Unternehmens-, Kontakt- und berufliche Informationen und ermöglicht es Teams, umfassendere Profile zu erstellen, die Lead-Qualität zu verbessern und effektivere Kontaktaufnahmen durchzuführen.
Mit Enrich.so können Sie:
- **Kontakt- und Unternehmensprofile anreichern**: Entdecken Sie sofort wichtige Datenpunkte für Leads, Interessenten und Unternehmen nur mit einer E-Mail-Adresse oder einem LinkedIn-Profil.
- **E-Mail-Zustellbarkeit überprüfen**: Prüfen Sie, ob E-Mail-Adressen gültig, zustellbar und sicher zu kontaktieren sind, bevor Sie versenden.
- **Geschäftliche und private E-Mails finden**: Identifizieren Sie fehlende geschäftliche E-Mails aus einem LinkedIn-Profil oder private E-Mails, um Ihre Reichweite zu erweitern.
- **Telefonnummern und Social-Media-Profile aufdecken**: Erschließen Sie zusätzliche Kommunikationskanäle für Kontakte durch Anreicherungstools.
- **LinkedIn-Beiträge und Engagement analysieren**: Extrahieren Sie Erkenntnisse über Reichweite, Reaktionen und Zielgruppe aus öffentlichen LinkedIn-Inhalten.
- **Erweiterte Personen- und Unternehmenssuche durchführen**: Ermöglichen Sie Ihren Agenten, Unternehmen und Fachkräfte anhand detaillierter Filter und Echtzeit-Intelligence zu finden.
Die Sim-Integration mit Enrich.so befähigt Ihre Agenten und Automatisierungen, B2B-Daten sofort abzufragen, anzureichern und zu validieren, wodurch die Produktivität in Workflows wie Vertriebsakquise, Recruiting, Marketing-Operations und mehr gesteigert wird. Die Kombination der Orchestrierungsfähigkeiten von Sim mit Enrich.so ermöglicht intelligentere, datengesteuerte Automatisierungsstrategien, die durch erstklassige B2B-Intelligence unterstützt werden.
{/* MANUAL-CONTENT-END */}
## Nutzungsanleitung
Greifen Sie auf B2B-Daten-Intelligence in Echtzeit mit Enrich.so zu. Reichern Sie Profile aus E-Mail-Adressen an, finden Sie geschäftliche E-Mails aus LinkedIn, überprüfen Sie die E-Mail-Zustellbarkeit, suchen Sie nach Personen und Unternehmen und analysieren Sie das Engagement von LinkedIn-Beiträgen.
## Tools
### `enrich_check_credits`
Überprüfen Sie Ihre Enrich API-Guthaben-Nutzung und Ihr verbleibendes Guthaben.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Enrich API-Schlüssel |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `totalCredits` | number | Dem Konto insgesamt zugewiesene Credits |
| `creditsUsed` | number | Bisher verbrauchte Credits |
| `creditsRemaining` | number | Verbleibende verfügbare Credits |
### `enrich_email_to_profile`
Rufen Sie detaillierte LinkedIn-Profilinformationen über eine E-Mail-Adresse ab, einschließlich Berufserfahrung, Ausbildung und Fähigkeiten.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Enrich API-Schlüssel |
| `email` | string | Ja | E-Mail-Adresse für die Suche \(z. B. john.doe@company.com\) |
| `inRealtime` | boolean | Nein | Auf true setzen, um aktuelle Daten abzurufen und zwischengespeicherte Informationen zu umgehen |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `displayName` | string | Vollständiger Anzeigename |
| `firstName` | string | Vorname |
| `lastName` | string | Nachname |
| `headline` | string | Berufliche Überschrift |
| `occupation` | string | Aktuelle Tätigkeit |
| `summary` | string | Profilzusammenfassung |
| `location` | string | Standort |
| `country` | string | Land |
| `linkedInUrl` | string | LinkedIn-Profil-URL |
| `photoUrl` | string | Profilfoto-URL |
| `connectionCount` | number | Anzahl der Kontakte |
| `isConnectionCountObfuscated` | boolean | Ob die Kontaktanzahl verschleiert ist \(500+\) |
| `positionHistory` | array | Berufserfahrung |
| ↳ `title` | string | Berufsbezeichnung |
| ↳ `company` | string | Firmenname |
| ↳ `startDate` | string | Startdatum |
| ↳ `endDate` | string | Enddatum |
| ↳ `location` | string | Standort |
| `education` | array | Ausbildungsverlauf |
| ↳ `school` | string | Schulname |
| ↳ `degree` | string | Abschluss |
| ↳ `fieldOfStudy` | string | Studienrichtung |
| ↳ `startDate` | string | Startdatum |
| ↳ `endDate` | string | Enddatum |
| `certifications` | array | Berufliche Zertifizierungen |
| ↳ `name` | string | Zertifizierungsname |
| ↳ `authority` | string | Ausstellende Behörde |
| ↳ `url` | string | Zertifizierungs-URL |
| `skills` | array | Liste der Fähigkeiten |
| `languages` | array | Liste der Sprachen |
| `locale` | string | Profil-Locale \(z. B. en_US\) |
| `version` | number | Profilversionsnummer |
### `enrich_email_to_person_lite`
Rufen Sie grundlegende LinkedIn-Profilinformationen über eine E-Mail-Adresse ab. Eine schlankere Version mit nur den wichtigsten Daten.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Enrich API-Schlüssel |
| `email` | string | Ja | E-Mail-Adresse für die Suche \(z. B. john.doe@company.com\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `name` | string | Vollständiger Name |
| `firstName` | string | Vorname |
| `lastName` | string | Nachname |
| `email` | string | E-Mail-Adresse |
| `title` | string | Berufsbezeichnung |
| `location` | string | Standort |
| `company` | string | Aktuelles Unternehmen |
| `companyLocation` | string | Unternehmensstandort |
| `companyLinkedIn` | string | LinkedIn-URL des Unternehmens |
| `profileId` | string | LinkedIn-Profil-ID |
| `schoolName` | string | Schulname |
| `schoolUrl` | string | Schul-URL |
| `linkedInUrl` | string | LinkedIn-Profil-URL |
| `photoUrl` | string | Profilfoto-URL |
| `followerCount` | number | Anzahl der Follower |
| `connectionCount` | number | Anzahl der Kontakte |
| `languages` | array | Gesprochene Sprachen |
| `projects` | array | Projekte |
| `certifications` | array | Zertifizierungen |
| `volunteerExperience` | array | Ehrenamtliche Tätigkeiten |
### `enrich_linkedin_profile`
Reichern Sie eine LinkedIn-Profil-URL mit detaillierten Informationen an, einschließlich Positionen, Ausbildung und Social-Media-Kennzahlen.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Enrich API-Schlüssel |
| `url` | string | Ja | LinkedIn-Profil-URL \(z. B. linkedin.com/in/williamhgates\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `profileId` | string | LinkedIn-Profil-ID |
| `firstName` | string | Vorname |
| `lastName` | string | Nachname |
| `subTitle` | string | Profil-Untertitel/Überschrift |
| `profilePicture` | string | Profilbild-URL |
| `backgroundImage` | string | Hintergrundbild-URL |
| `industry` | string | Branche |
| `location` | string | Standort |
| `followersCount` | number | Anzahl der Follower |
| `connectionsCount` | number | Anzahl der Kontakte |
| `premium` | boolean | Ob das Konto Premium ist |
| `influencer` | boolean | Ob das Konto ein Influencer ist |
| `positions` | array | Berufspositionen |
| ↳ `title` | string | Berufsbezeichnung |
| ↳ `company` | string | Firmenname |
| ↳ `companyLogo` | string | Firmenlogo-URL |
| ↳ `startDate` | string | Startdatum |
| ↳ `endDate` | string | Enddatum |
| ↳ `location` | string | Standort |
| `education` | array | Bildungshistorie |
| ↳ `school` | string | Schulname |
| ↳ `degree` | string | Abschluss |
| ↳ `fieldOfStudy` | string | Studienrichtung |
| ↳ `startDate` | string | Startdatum |
| ↳ `endDate` | string | Enddatum |
| `websites` | array | Persönliche Websites |
### `enrich_find_email`
Person finden
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Enrich API-Schlüssel |
| `fullName` | string | Ja | Vollständiger Name der Person \(z. B. Max Mustermann\) |
| `companyDomain` | string | Ja | Unternehmens-Domain \(z. B. beispiel.de\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `email` | string | Gefundene E-Mail-Adresse |
| `firstName` | string | Vorname |
| `lastName` | string | Nachname |
| `domain` | string | Unternehmens-Domain |
| `found` | boolean | Ob eine E-Mail gefunden wurde |
| `acceptAll` | boolean | Ob die Domain alle E-Mails akzeptiert |
### `enrich_linkedin_to_work_email`
Geschäftliche E-Mail-Adresse aus einer LinkedIn-Profil-URL finden.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Enrich API-Schlüssel |
| `linkedinProfile` | string | Ja | LinkedIn-Profil-URL \(z. B. https://www.linkedin.com/in/williamhgates\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `email` | string | Gefundene geschäftliche E-Mail-Adresse |
| `found` | boolean | Ob eine E-Mail gefunden wurde |
| `status` | string | Anfragestatus \(in_progress oder completed\) |
### `enrich_linkedin_to_personal_email`
Private E-Mail-Adresse aus einer LinkedIn-Profil-URL finden.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Enrich-API-Schlüssel |
| `linkedinProfile` | string | Ja | LinkedIn-Profil-URL \(z. B. linkedin.com/in/benutzername\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `email` | string | Persönliche E-Mail-Adresse |
| `found` | boolean | Ob eine E-Mail-Adresse gefunden wurde |
| `status` | string | Anfragestatus |
### `enrich_phone_finder`
Finden Sie eine Telefonnummer anhand einer LinkedIn-Profil-URL.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Enrich-API-Schlüssel |
| `linkedinProfile` | string | Ja | LinkedIn-Profil-URL \(z. B. linkedin.com/in/williamhgates\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `profileUrl` | string | LinkedIn-Profil-URL |
| `mobileNumber` | string | Gefundene Mobiltelefonnummer |
| `found` | boolean | Ob eine Telefonnummer gefunden wurde |
| `status` | string | Anfragestatus \(in_progress oder completed\) |
### `enrich_email_to_phone`
Finden Sie eine Telefonnummer, die mit einer E-Mail-Adresse verknüpft ist.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Enrich-API-Schlüssel |
| `email` | string | Ja | Zu suchende E-Mail-Adresse \(z. B. john.doe@example.com\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `email` | string | Nachgeschlagene E-Mail-Adresse |
| `mobileNumber` | string | Gefundene Mobiltelefonnummer |
| `found` | boolean | Ob eine Telefonnummer gefunden wurde |
| `status` | string | Anfragestatus \(in_progress oder completed\) |
### `enrich_verify_email`
Überprüfen Sie eine E-Mail-Adresse auf Zustellbarkeit, einschließlich Catch-All-Erkennung und Anbieteridentifikation.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Enrich-API-Schlüssel |
| `email` | string | Ja | Zu überprüfende E-Mail-Adresse \(z. B. john.doe@example.com\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `email` | string | Überprüfte E-Mail-Adresse |
| `status` | string | Überprüfungsstatus |
| `result` | string | Zustellbarkeitsergebnis \(deliverable, undeliverable usw.\) |
| `confidenceScore` | number | Konfidenzwert \(0-100\) |
| `smtpProvider` | string | E-Mail-Dienstanbieter \(z. B. Google, Microsoft\) |
| `mailDisposable` | boolean | Ob die E-Mail von einem Wegwerf-Anbieter stammt |
| `mailAcceptAll` | boolean | Ob die Domain eine Catch-All-Domain ist |
| `free` | boolean | Ob die E-Mail einen kostenlosen E-Mail-Dienst verwendet |
### `enrich_disposable_email_check`
Überprüfen Sie, ob eine E-Mail-Adresse von einem Wegwerf- oder temporären E-Mail-Anbieter stammt. Gibt einen Score und Validierungsdetails zurück.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Enrich-API-Schlüssel |
| `email` | string | Ja | Zu überprüfende E-Mail-Adresse \(z. B. john.doe@example.com\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `email` | string | Geprüfte E-Mail-Adresse |
| `score` | number | Validierungsbewertung \(0-100\) |
| `testsPassed` | string | Anzahl bestandener Tests \(z. B. "3/3"\) |
| `passed` | boolean | Ob die E-Mail alle Validierungstests bestanden hat |
| `reason` | string | Grund für Fehler, falls E-Mail nicht bestanden hat |
| `mailServerIp` | string | IP-Adresse des Mailservers |
| `mxRecords` | array | MX-Einträge für die Domain |
| ↳ `host` | string | MX-Eintrag-Host |
| ↳ `pref` | number | MX-Eintrag-Präferenz |
### `enrich_email_to_ip`
Ermitteln Sie eine IP-Adresse, die mit einer E-Mail-Adresse verknüpft ist.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Enrich-API-Schlüssel |
| `email` | string | Ja | Zu suchende E-Mail-Adresse \(z. B. john.doe@example.com\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `email` | string | Gesuchte E-Mail-Adresse |
| `ip` | string | Zugehörige IP-Adresse |
| `found` | boolean | Ob eine IP-Adresse gefunden wurde |
### `enrich_ip_to_company`
Identifizieren Sie ein Unternehmen anhand einer IP-Adresse mit detaillierten firmografischen Informationen.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Enrich-API-Schlüssel |
| `ip` | string | Ja | Zu suchende IP-Adresse \(z. B. 86.92.60.221\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `name` | string | Firmenname |
| `legalName` | string | Rechtlicher Firmenname |
| `domain` | string | Primäre Domain |
| `domainAliases` | array | Domain-Aliase |
| `sector` | string | Geschäftsbereich |
| `industry` | string | Branche |
| `phone` | string | Telefonnummer |
| `employees` | number | Anzahl der Mitarbeiter |
| `revenue` | string | Geschätzter Umsatz |
| `location` | json | Firmenstandort |
| ↳ `city` | string | Stadt |
| ↳ `state` | string | Bundesland |
| ↳ `country` | string | Land |
| ↳ `timezone` | string | Zeitzone |
| `linkedInUrl` | string | LinkedIn-Unternehmens-URL |
| `twitterUrl` | string | Twitter-URL |
| `facebookUrl` | string | Facebook-URL |
### `enrich_company_lookup`
Umfassende Unternehmensinformationen nach Name oder Domain abrufen, einschließlich Finanzierung, Standort und Social-Media-Profile.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Enrich-API-Schlüssel |
| `name` | string | Nein | Firmenname \(z. B. Google\) |
| `domain` | string | Nein | Firmendomain \(z. B. google.com\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `name` | string | Firmenname |
| `universalName` | string | Universeller Firmenname |
| `companyId` | string | Firmen-ID |
| `description` | string | Firmenbeschreibung |
| `phone` | string | Telefonnummer |
| `linkedInUrl` | string | LinkedIn-Unternehmens-URL |
| `websiteUrl` | string | Firmenwebsite |
| `followers` | number | Anzahl der LinkedIn-Follower |
| `staffCount` | number | Anzahl der Mitarbeiter |
| `foundedDate` | string | Gründungsdatum |
| `type` | string | Unternehmenstyp |
| `industries` | array | Branchen |
| `specialties` | array | Unternehmensspezialisierungen |
| `headquarters` | json | Hauptsitz |
| ↳ `city` | string | Stadt |
| ↳ `country` | string | Land |
| ↳ `postalCode` | string | Postleitzahl |
| ↳ `line1` | string | Adresszeile 1 |
| `logo` | string | Firmenlogo-URL |
| `coverImage` | string | Titelbild-URL |
| `fundingRounds` | array | Finanzierungshistorie |
| ↳ `roundType` | string | Finanzierungsrunde |
| ↳ `amount` | number | Eingeworbener Betrag |
| ↳ `currency` | string | Währung |
| ↳ `investors` | array | Investoren |
### `enrich_company_funding`
Rufen Sie die Finanzierungshistorie, Traffic-Metriken und Führungskräfteinformationen eines Unternehmens nach Domain ab.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Enrich API-Schlüssel |
| `domain` | string | Ja | Unternehmens-Domain \(z. B. example.com\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `legalName` | string | Rechtlicher Unternehmensname |
| `employeeCount` | number | Anzahl der Mitarbeiter |
| `headquarters` | string | Hauptsitz |
| `industry` | string | Branche |
| `totalFundingRaised` | number | Gesamte eingeworbene Finanzierung |
| `fundingRounds` | array | Finanzierungsrunden |
| ↳ `roundType` | string | Rundentyp |
| ↳ `amount` | number | Eingeworbener Betrag |
| ↳ `date` | string | Datum |
| ↳ `investors` | array | Investoren |
| `monthlyVisits` | number | Monatliche Website-Besuche |
| `trafficChange` | number | Traffic-Veränderung in Prozent |
| `itSpending` | number | Geschätzte IT-Ausgaben in USD |
| `executives` | array | Führungsteam |
| ↳ `name` | string | Name |
| ↳ `title` | string | Titel |
### `enrich_company_revenue`
Rufen Sie Umsatzdaten, CEO-Informationen und Wettbewerbsanalysen eines Unternehmens nach Domain ab.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Enrich API-Schlüssel |
| `domain` | string | Ja | Unternehmens-Domain \(z. B. clay.io\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `companyName` | string | Firmenname |
| `shortDescription` | string | Kurze Firmenbeschreibung |
| `fullSummary` | string | Vollständige Firmenzusammenfassung |
| `revenue` | string | Firmenumsatz |
| `revenueMin` | number | Minimale Umsatzschätzung |
| `revenueMax` | number | Maximale Umsatzschätzung |
| `employeeCount` | number | Anzahl der Mitarbeiter |
| `founded` | string | Gründungsjahr |
| `ownership` | string | Eigentumsform |
| `status` | string | Firmenstatus \(z. B. Aktiv\) |
| `website` | string | Firmenwebsite-URL |
| `ceo` | json | CEO-Informationen |
| ↳ `name` | string | CEO-Name |
| ↳ `designation` | string | CEO-Bezeichnung/Titel |
| ↳ `rating` | number | CEO-Bewertung |
| `socialLinks` | json | Social-Media-Links |
| ↳ `linkedIn` | string | LinkedIn-URL |
| ↳ `twitter` | string | Twitter-URL |
| ↳ `facebook` | string | Facebook-URL |
| `totalFunding` | string | Gesamte eingeworbene Finanzierung |
| `fundingRounds` | number | Anzahl der Finanzierungsrunden |
| `competitors` | array | Wettbewerber |
| ↳ `name` | string | Name des Wettbewerbers |
| ↳ `revenue` | string | Umsatz |
| ↳ `employeeCount` | number | Mitarbeiterzahl |
| ↳ `headquarters` | string | Hauptsitz |
### `enrich_search_people`
Suche nach Fachkräften anhand verschiedener Kriterien wie Name, Titel, Fähigkeiten, Ausbildung und Unternehmen.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Enrich API-Schlüssel |
| `firstName` | string | Nein | Vorname |
| `lastName` | string | Nein | Nachname |
| `summary` | string | Nein | Schlüsselwörter für berufliche Zusammenfassung |
| `subTitle` | string | Nein | Berufsbezeichnung/Untertitel |
| `locationCountry` | string | Nein | Land |
| `locationCity` | string | Nein | Stadt |
| `locationState` | string | Nein | Bundesland/Provinz |
| `influencer` | boolean | Nein | Nur nach Influencern filtern |
| `premium` | boolean | Nein | Nur nach Premium-Konten filtern |
| `language` | string | Nein | Hauptsprache |
| `industry` | string | Nein | Branche |
| `currentJobTitles` | json | Nein | Aktuelle Berufsbezeichnungen \(Array\) |
| `pastJobTitles` | json | Nein | Frühere Berufsbezeichnungen \(Array\) |
| `skills` | json | Nein | Zu suchende Fähigkeiten \(Array\) |
| `schoolNames` | json | Nein | Schulnamen \(Array\) |
| `certifications` | json | Nein | Zertifizierungen zum Filtern \(Array\) |
| `degreeNames` | json | Nein | Abschlussnamen zum Filtern \(Array\) |
| `studyFields` | json | Nein | Studienfächer zum Filtern \(Array\) |
| `currentCompanies` | json | Nein | Aktuelle Unternehmens-IDs zum Filtern \(Array von Zahlen\) |
| `pastCompanies` | json | Nein | Frühere Unternehmens-IDs zum Filtern \(Array von Zahlen\) |
| `currentPage` | number | Nein | Seitennummer \(Standard: 1\) |
| `pageSize` | number | Nein | Ergebnisse pro Seite \(Standard: 20\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `currentPage` | number | Aktuelle Seitennummer |
| `totalPage` | number | Gesamtanzahl der Seiten |
| `pageSize` | number | Ergebnisse pro Seite |
| `profiles` | array | Suchergebnisse |
| ↳ `profileIdentifier` | string | Profil-ID |
| ↳ `givenName` | string | Vorname |
| ↳ `familyName` | string | Nachname |
| ↳ `currentPosition` | string | Aktuelle Berufsbezeichnung |
| ↳ `profileImage` | string | Profilbild-URL |
| ↳ `externalProfileUrl` | string | LinkedIn-URL |
| ↳ `city` | string | Stadt |
| ↳ `country` | string | Land |
| ↳ `expertSkills` | array | Fähigkeiten |
### `enrich_search_company`
Suche nach Unternehmen anhand verschiedener Kriterien wie Name, Branche, Standort und Größe.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Enrich-API-Schlüssel |
| `name` | string | Nein | Unternehmensname |
| `website` | string | Nein | Unternehmenswebsite-URL |
| `tagline` | string | Nein | Unternehmens-Slogan |
| `type` | string | Nein | Unternehmenstyp \(z. B. Privat, Öffentlich\) |
| `description` | string | Nein | Schlüsselwörter der Unternehmensbeschreibung |
| `industries` | json | Nein | Branchen zum Filtern \(Array\) |
| `locationCountry` | string | Nein | Land |
| `locationCity` | string | Nein | Stadt |
| `postalCode` | string | Nein | Postleitzahl |
| `locationCountryList` | json | Nein | Mehrere Länder zum Filtern \(Array\) |
| `locationCityList` | json | Nein | Mehrere Städte zum Filtern \(Array\) |
| `specialities` | json | Nein | Unternehmensspezialisierungen \(Array\) |
| `followers` | number | Nein | Mindestanzahl an Followern |
| `staffCount` | number | Nein | Maximale Mitarbeiterzahl |
| `staffCountMin` | number | Nein | Minimale Mitarbeiterzahl |
| `staffCountMax` | number | Nein | Maximale Mitarbeiterzahl |
| `currentPage` | number | Nein | Seitennummer \(Standard: 1\) |
| `pageSize` | number | Nein | Ergebnisse pro Seite \(Standard: 20\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `currentPage` | number | Aktuelle Seitennummer |
| `totalPage` | number | Gesamtanzahl der Seiten |
| `pageSize` | number | Ergebnisse pro Seite |
| `companies` | array | Suchergebnisse |
| ↳ `companyName` | string | Firmenname |
| ↳ `tagline` | string | Firmen-Slogan |
| ↳ `webAddress` | string | Website-URL |
| ↳ `industries` | array | Branchen |
| ↳ `teamSize` | number | Teamgröße |
| ↳ `linkedInProfile` | string | LinkedIn-URL |
### `enrich_search_company_employees`
Suche nach Mitarbeitern in bestimmten Unternehmen nach Standort und Berufsbezeichnung.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Enrich-API-Schlüssel |
| `companyIds` | json | Nein | Array von Firmen-IDs, in denen gesucht werden soll |
| `country` | string | Nein | Länderfilter \(z. B. Vereinigte Staaten\) |
| `city` | string | Nein | Stadtfilter \(z. B. San Francisco\) |
| `state` | string | Nein | Bundesland-Filter \(z. B. Kalifornien\) |
| `jobTitles` | json | Nein | Berufsbezeichnungen zum Filtern \(Array\) |
| `page` | number | Nein | Seitennummer \(Standard: 1\) |
| `pageSize` | number | Nein | Ergebnisse pro Seite \(Standard: 10\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `currentPage` | number | Aktuelle Seitennummer |
| `totalPage` | number | Gesamtanzahl der Seiten |
| `pageSize` | number | Anzahl der Ergebnisse pro Seite |
| `profiles` | array | Mitarbeiterprofile |
| ↳ `profileIdentifier` | string | Profil-ID |
| ↳ `givenName` | string | Vorname |
| ↳ `familyName` | string | Nachname |
| ↳ `currentPosition` | string | Aktuelle Berufsbezeichnung |
| ↳ `profileImage` | string | Profilbild-URL |
| ↳ `externalProfileUrl` | string | LinkedIn-URL |
| ↳ `city` | string | Stadt |
| ↳ `country` | string | Land |
| ↳ `expertSkills` | array | Fähigkeiten |
### `enrich_search_similar_companies`
Finden Sie Unternehmen, die einem bestimmten Unternehmen ähnlich sind, anhand der LinkedIn-URL mit Filtern für Standort und Größe.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Enrich API-Schlüssel |
| `url` | string | Ja | LinkedIn-Unternehmens-URL \(z. B. linkedin.com/company/google\) |
| `accountLocation` | json | Nein | Nach Standorten filtern \(Array von Ländernamen\) |
| `employeeSizeType` | string | Nein | Filtertyp für Mitarbeiterzahl \(z. B. RANGE\) |
| `employeeSizeRange` | json | Nein | Bereiche der Mitarbeiterzahl \(Array von \{start, end\}-Objekten\) |
| `page` | number | Nein | Seitennummer \(Standard: 1\) |
| `num` | number | Nein | Anzahl der Ergebnisse pro Seite |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `companies` | array | Ähnliche Unternehmen |
| ↳ `url` | string | LinkedIn-URL |
| ↳ `name` | string | Unternehmensname |
| ↳ `universalName` | string | Universeller Name |
| ↳ `type` | string | Unternehmenstyp |
| ↳ `description` | string | Beschreibung |
| ↳ `phone` | string | Telefonnummer |
| ↳ `website` | string | Website-URL |
| ↳ `logo` | string | Logo-URL |
| ↳ `foundedYear` | number | Gründungsjahr |
| ↳ `staffTotal` | number | Gesamtzahl der Mitarbeiter |
| ↳ `industries` | array | Branchen |
| ↳ `relevancyScore` | number | Relevanzbewertung |
| ↳ `relevancyValue` | string | Relevanzwert |
### `enrich_sales_pointer_people`
Erweiterte Personensuche mit komplexen Filtern für Standort, Unternehmensgröße, Seniorität, Erfahrung und mehr.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Enrich-API-Schlüssel |
| `page` | number | Ja | Seitennummer \(beginnt bei 1\) |
| `filters` | json | Ja | Array von Filterobjekten. Jeder Filter hat einen Typ \(z. B. POSTAL_CODE, COMPANY_HEADCOUNT\), Werte \(Array mit id, text, selectionType: INCLUDED/EXCLUDED\) und optional selectedSubFilter |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `data` | array | Personenergebnisse |
| ↳ `name` | string | Vollständiger Name |
| ↳ `summary` | string | Berufliche Zusammenfassung |
| ↳ `location` | string | Standort |
| ↳ `profilePicture` | string | Profilbild-URL |
| ↳ `linkedInUrn` | string | LinkedIn-URN |
| ↳ `positions` | array | Berufspositionen |
| ↳ `education` | array | Ausbildung |
| `pagination` | json | Paginierungsinformationen |
| ↳ `totalCount` | number | Gesamtergebnisse |
| ↳ `returnedCount` | number | Zurückgegebene Anzahl |
| ↳ `start` | number | Startposition |
| ↳ `limit` | number | Limit |
### `enrich_search_posts`
Durchsuchen Sie LinkedIn-Beiträge nach Schlüsselwörtern mit Datumsfilterung.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Enrich-API-Schlüssel |
| `keywords` | string | Ja | Suchbegriffe \(z. B. "KI-Automatisierung"\) |
| `datePosted` | string | Nein | Zeitfilter \(z. B. past_week, past_month\) |
| `page` | number | Nein | Seitennummer \(Standard: 1\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `count` | number | Gesamtanzahl der Ergebnisse |
| `posts` | array | Suchergebnisse |
| ↳ `url` | string | Beitrags-URL |
| ↳ `postId` | string | Beitrags-ID |
| ↳ `author` | object | Autoreninformationen |
| ↳ `name` | string | Autorenname |
| ↳ `headline` | string | Autoren-Headline |
| ↳ `linkedInUrl` | string | LinkedIn-URL des Autors |
| ↳ `profileImage` | string | Profilbild des Autors |
| ↳ `timestamp` | string | Zeitstempel des Beitrags |
| ↳ `textContent` | string | Textinhalt des Beitrags |
| ↳ `hashtags` | array | Hashtags |
| ↳ `mediaUrls` | array | Medien-URLs |
| ↳ `reactions` | number | Anzahl der Reaktionen |
| ↳ `commentsCount` | number | Anzahl der Kommentare |
### `enrich_get_post_details`
Detaillierte Informationen zu einem LinkedIn-Beitrag anhand der URL abrufen.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Enrich-API-Schlüssel |
| `url` | string | Ja | LinkedIn-Beitrags-URL |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `postId` | string | Beitrags-ID |
| `author` | json | Autoreninformationen |
| ↳ `name` | string | Autorenname |
| ↳ `headline` | string | Autoren-Headline |
| ↳ `linkedInUrl` | string | LinkedIn-URL des Autors |
| ↳ `profileImage` | string | Profilbild des Autors |
| `timestamp` | string | Zeitstempel des Beitrags |
| `textContent` | string | Textinhalt des Beitrags |
| `hashtags` | array | Hashtags |
| `mediaUrls` | array | Medien-URLs |
| `reactions` | number | Anzahl der Reaktionen |
| `commentsCount` | number | Anzahl der Kommentare |
### `enrich_search_post_reactions`
Reaktionen auf einen LinkedIn-Beitrag mit Filterung nach Reaktionstyp abrufen.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Enrich API-Schlüssel |
| `postUrn` | string | Ja | LinkedIn-Aktivitäts-URN \(z. B. urn:li:activity:7231931952839196672\) |
| `reactionType` | string | Ja | Reaktionstyp-Filter: all, like, love, celebrate, insightful oder funny \(Standard: all\) |
| `page` | number | Ja | Seitennummer \(beginnt bei 1\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `page` | number | Aktuelle Seitennummer |
| `totalPage` | number | Gesamtanzahl der Seiten |
| `count` | number | Anzahl der zurückgegebenen Reaktionen |
| `reactions` | array | Reaktionen |
| ↳ `reactionType` | string | Art der Reaktion |
| ↳ `reactor` | object | Person, die reagiert hat |
| ↳ `name` | string | Name |
| ↳ `subTitle` | string | Berufsbezeichnung |
| ↳ `profileId` | string | Profil-ID |
| ↳ `profilePicture` | string | Profilbild-URL |
| ↳ `linkedInUrl` | string | LinkedIn-URL |
### `enrich_search_post_comments`
Kommentare zu einem LinkedIn-Beitrag abrufen.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Enrich API-Schlüssel |
| `postUrn` | string | Ja | LinkedIn-Aktivitäts-URN \(z. B. urn:li:activity:7191163324208705536\) |
| `page` | number | Nein | Seitennummer \(beginnt bei 1, Standard: 1\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `page` | number | Aktuelle Seitennummer |
| `totalPage` | number | Gesamtanzahl der Seiten |
| `count` | number | Anzahl der zurückgegebenen Kommentare |
| `comments` | array | Kommentare |
| ↳ `activityId` | string | Kommentar-Aktivitäts-ID |
| ↳ `commentary` | string | Kommentartext |
| ↳ `linkedInUrl` | string | Link zum Kommentar |
| ↳ `commenter` | object | Informationen zum Kommentator |
| ↳ `profileId` | string | Profil-ID |
| ↳ `firstName` | string | Vorname |
| ↳ `lastName` | string | Nachname |
| ↳ `subTitle` | string | Untertitel/Überschrift |
| ↳ `profilePicture` | string | Profilbild-URL |
| ↳ `backgroundImage` | string | Hintergrundbild-URL |
| ↳ `entityUrn` | string | Entity-URN |
| ↳ `objectUrn` | string | Objekt-URN |
| ↳ `profileType` | string | Profiltyp |
| ↳ `reactionBreakdown` | object | Reaktionen auf den Kommentar |
| ↳ `likes` | number | Anzahl der Likes |
| ↳ `empathy` | number | Anzahl der Empathie-Reaktionen |
| ↳ `other` | number | Anzahl der sonstigen Reaktionen |
### `enrich_search_people_activities`
Person abrufen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Enrich-API-Schlüssel |
| `profileId` | string | Ja | LinkedIn-Profil-ID |
| `activityType` | string | Ja | Aktivitätstyp: posts, comments oder articles |
| `paginationToken` | string | Nein | Paginierungs-Token für die nächste Ergebnisseite |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `paginationToken` | string | Token zum Abrufen der nächsten Seite |
| `activityType` | string | Typ der zurückgegebenen Aktivitäten |
| `activities` | array | Aktivitäten |
| ↳ `activityId` | string | Aktivitäts-ID |
| ↳ `commentary` | string | Textinhalt der Aktivität |
| ↳ `linkedInUrl` | string | Link zur Aktivität |
| ↳ `timeElapsed` | string | Verstrichene Zeit seit der Aktivität |
| ↳ `numReactions` | number | Gesamtanzahl der Reaktionen |
| ↳ `author` | object | Informationen zum Autor der Aktivität |
| ↳ `name` | string | Name des Autors |
| ↳ `profileId` | string | Profil-ID |
| ↳ `profilePicture` | string | URL des Profilbilds |
| ↳ `reactionBreakdown` | object | Reaktionen |
| ↳ `likes` | number | Likes |
| ↳ `empathy` | number | Empathie-Reaktionen |
| ↳ `other` | number | Sonstige Reaktionen |
| ↳ `attachments` | array | Anhang-URLs |
### `enrich_search_company_activities`
Unternehmen abrufen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Enrich-API-Schlüssel |
| `companyId` | string | Ja | LinkedIn-Unternehmens-ID |
| `activityType` | string | Ja | Aktivitätstyp: Posts, Kommentare oder Artikel |
| `paginationToken` | string | Nein | Paginierungs-Token für die nächste Ergebnisseite |
| `offset` | number | Nein | Anzahl der zu überspringenden Datensätze \(Standard: 0\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `paginationToken` | string | Token zum Abrufen der nächsten Seite |
| `activityType` | string | Typ der zurückgegebenen Aktivitäten |
| `activities` | array | Aktivitäten |
| ↳ `activityId` | string | Aktivitäts-ID |
| ↳ `commentary` | string | Textinhalt der Aktivität |
| ↳ `linkedInUrl` | string | Link zur Aktivität |
| ↳ `timeElapsed` | string | Verstrichene Zeit seit der Aktivität |
| ↳ `numReactions` | number | Gesamtanzahl der Reaktionen |
| ↳ `author` | object | Informationen zum Autor der Aktivität |
| ↳ `name` | string | Name des Autors |
| ↳ `profileId` | string | Profil-ID |
| ↳ `profilePicture` | string | URL des Profilbilds |
| ↳ `reactionBreakdown` | object | Reaktionen |
| ↳ `likes` | number | Likes |
| ↳ `empathy` | number | Empathie-Reaktionen |
| ↳ `other` | number | Sonstige Reaktionen |
| ↳ `attachments` | array | Anhänge |
### `enrich_reverse_hash_lookup`
Wandelt einen MD5-E-Mail-Hash zurück in die ursprüngliche E-Mail-Adresse und den Anzeigenamen um.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Enrich-API-Schlüssel |
| `hash` | string | Ja | MD5-Hash-Wert zum Nachschlagen |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `hash` | string | MD5-Hash, der nachgeschlagen wurde |
| `email` | string | Ursprüngliche E-Mail-Adresse |
| `displayName` | string | Anzeigename, der mit der E-Mail verknüpft ist |
| `found` | boolean | Ob eine E-Mail für den Hash gefunden wurde |
### `enrich_search_logo`
Ruft die URL eines Firmenlogos anhand der Domain ab.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Enrich API-Schlüssel |
| `url` | string | Ja | Firmendomain \(z. B. google.com\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `logoUrl` | string | URL zum Abrufen des Firmenlogos |
| `domain` | string | Domain, die nachgeschlagen wurde |

View File

@@ -143,8 +143,3 @@ Führe umfassende Recherchen mit KI durch, um detaillierte Berichte mit Quellena
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `research` | array | Umfassende Forschungsergebnisse mit Quellenangaben und Zusammenfassungen |
## Hinweise
- Kategorie: `tools`
- Typ: `exa`

View File

@@ -47,8 +47,3 @@ Parsen einer oder mehrerer hochgeladener Dateien oder Dateien von URLs (Text, PD
| --------- | ---- | ----------- |
| `files` | array | Array der geparsten Dateien |
| `combinedContent` | string | Kombinierter Inhalt aller geparsten Dateien |
## Hinweise
- Kategorie: `tools`
- Typ: `file`

View File

@@ -171,8 +171,3 @@ Autonomer Web-Datenextraktions-Agent. Sucht und sammelt Informationen basierend
| `creditsUsed` | number | Anzahl der von dieser Agent-Aufgabe verbrauchten Credits |
| `expiresAt` | string | Zeitstempel, wann die Ergebnisse ablaufen \(24 Stunden\) |
| `sources` | object | Array der vom Agent verwendeten Quell-URLs |
## Hinweise
- Kategorie: `tools`
- Typ: `firecrawl`

View File

@@ -226,8 +226,3 @@ Alle Kontakte aus Ihren Fireflies.ai-Meetings auflisten
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `contacts` | array | Liste der Kontakte aus Meetings |
## Hinweise
- Kategorie: `tools`
- Typ: `fireflies`

File diff suppressed because it is too large Load Diff

View File

@@ -422,8 +422,3 @@ Eine laufende GitLab-Pipeline abbrechen
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `pipeline` | object | Die abgebrochene GitLab-Pipeline |
## Hinweise
- Kategorie: `tools`
- Typ: `gitlab`

View File

@@ -264,13 +264,3 @@ Label(s) von einer Gmail-Nachricht entfernen
| `labelIds` | string | Ja | Durch Kommas getrennte Label-IDs zum Entfernen \(z.B. INBOX, Label_123\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `content` | string | Erfolgsmeldung |
| `metadata` | object | E-Mail-Metadaten |
## Hinweise
- Kategorie: `tools`
- Typ: `gmail`

View File

@@ -0,0 +1,92 @@
---
title: Google Books
description: Buchinformationen suchen und abrufen
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="google_books"
color="#FFFFFF"
/>
## Nutzungsanleitung
Suchen Sie nach Büchern über die Google Books API. Finden Sie Bände nach Titel, Autor, ISBN oder Stichwörtern und rufen Sie detaillierte Informationen zu bestimmten Büchern ab, einschließlich Beschreibungen, Bewertungen und Veröffentlichungsdetails.
## Tools
### `google_books_volume_search`
Suchen Sie nach Büchern über die Google Books API
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Google Books API-Schlüssel |
| `query` | string | Ja | Suchanfrage. Unterstützt spezielle Schlüsselwörter: intitle:, inauthor:, inpublisher:, subject:, isbn: |
| `filter` | string | Nein | Ergebnisse nach Verfügbarkeit filtern \(partial, full, free-ebooks, paid-ebooks, ebooks\) |
| `printType` | string | Nein | Auf Drucktyp beschränken \(all, books, magazines\) |
| `orderBy` | string | Nein | Sortierreihenfolge \(relevance, newest\) |
| `startIndex` | number | Nein | Index des ersten zurückzugebenden Ergebnisses \(für Paginierung\) |
| `maxResults` | number | Nein | Maximale Anzahl der zurückzugebenden Ergebnisse \(1-40\) |
| `langRestrict` | string | Nein | Ergebnisse auf eine bestimmte Sprache beschränken \(ISO 639-1-Code\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `totalItems` | number | Gesamtanzahl der übereinstimmenden Ergebnisse |
| `volumes` | array | Liste der übereinstimmenden Bände |
| ↳ `id` | string | Band-ID |
| ↳ `title` | string | Buchtitel |
| ↳ `subtitle` | string | Buchuntertitel |
| ↳ `authors` | array | Liste der Autoren |
| ↳ `publisher` | string | Verlagsname |
| ↳ `publishedDate` | string | Veröffentlichungsdatum |
| ↳ `description` | string | Buchbeschreibung |
| ↳ `pageCount` | number | Anzahl der Seiten |
| ↳ `categories` | array | Buchkategorien |
| ↳ `averageRating` | number | Durchschnittliche Bewertung \(1-5\) |
| ↳ `ratingsCount` | number | Anzahl der Bewertungen |
| ↳ `language` | string | Sprachcode |
| ↳ `previewLink` | string | Link zur Vorschau auf Google Books |
| ↳ `infoLink` | string | Link zur Infoseite |
| ↳ `thumbnailUrl` | string | URL des Buchcover-Thumbnails |
| ↳ `isbn10` | string | ISBN-10-Kennung |
| ↳ `isbn13` | string | ISBN-13-Kennung |
### `google_books_volume_details`
Detaillierte Informationen über ein bestimmtes Buchvolumen abrufen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Google Books API-Schlüssel |
| `volumeId` | string | Ja | Die ID des abzurufenden Volumens |
| `projection` | string | Nein | Projektionsebene \(full, lite\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `id` | string | Volumen-ID |
| `title` | string | Buchtitel |
| `subtitle` | string | Buchuntertitel |
| `authors` | array | Liste der Autoren |
| `publisher` | string | Verlagsname |
| `publishedDate` | string | Veröffentlichungsdatum |
| `description` | string | Buchbeschreibung |
| `pageCount` | number | Anzahl der Seiten |
| `categories` | array | Buchkategorien |
| `averageRating` | number | Durchschnittliche Bewertung \(1-5\) |
| `ratingsCount` | number | Anzahl der Bewertungen |
| `language` | string | Sprachcode |
| `previewLink` | string | Link zur Vorschau auf Google Books |
| `infoLink` | string | Link zur Infoseite |
| `thumbnailUrl` | string | URL des Buchcover-Thumbnails |
| `isbn10` | string | ISBN-10-Kennung |
| `isbn13` | string | ISBN-13-Kennung |

View File

@@ -139,3 +139,145 @@ Teilnehmer zu einem bestehenden Google Kalender-Ereignis einladen
- Kategorie: `tools`
- Typ: `google_calendar`
Ein Ereignis in einen anderen Kalender verschieben. Gibt nur API-konforme Felder zurück.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `calendarId` | string | Nein | Quell-Google-Kalender-ID (z. B. primary oder calendar@group.calendar.google.com) |
| `eventId` | string | Ja | Google-Kalender-Ereignis-ID, die verschoben werden soll |
| `destinationCalendarId` | string | Ja | Ziel-Google-Kalender-ID |
| `sendUpdates` | string | Nein | Wie Updates an Teilnehmer gesendet werden: all, externalOnly oder none |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `id` | string | Ereignis-ID |
| `htmlLink` | string | Ereignis-Link |
| `status` | string | Ereignisstatus |
| `summary` | string | Ereignistitel |
| `description` | string | Ereignisbeschreibung |
| `location` | string | Ereignisort |
| `start` | json | Ereignisstart |
| `end` | json | Ereignisende |
| `attendees` | json | Ereignisteilnehmer |
| `creator` | json | Ereignisersteller |
| `organizer` | json | Ereignisorganisator |
### `google_calendar_instances`
Instanzen eines wiederkehrenden Ereignisses aus Google Kalender abrufen. Gibt nur API-konforme Felder zurück.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `calendarId` | string | Nein | Google-Kalender-ID (z. B. primary oder calendar@group.calendar.google.com) |
| `eventId` | string | Ja | ID des wiederkehrenden Ereignisses, dessen Instanzen abgerufen werden sollen |
| `timeMin` | string | Nein | Untere Grenze für Instanzen (RFC3339-Zeitstempel, z. B. 2025-06-03T00:00:00Z) |
| `timeMax` | string | Nein | Obere Grenze für Instanzen (RFC3339-Zeitstempel, z. B. 2025-06-04T00:00:00Z) |
| `maxResults` | number | Nein | Maximale Anzahl der zurückzugebenden Instanzen (Standard 250, max. 2500) |
| `pageToken` | string | Nein | Token zum Abrufen nachfolgender Ergebnisseiten |
| `showDeleted` | boolean | Nein | Gelöschte Instanzen einschließen |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `nextPageToken` | string | Nächstes Seiten-Token |
| `timeZone` | string | Kalender-Zeitzone |
| `instances` | json | Liste der wiederkehrenden Ereignisinstanzen |
### `google_calendar_list_calendars`
Alle Kalender des Benutzers auflisten
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `minAccessRole` | string | Nein | Minimale Zugriffsrolle für zurückgegebene Kalender: freeBusyReader, reader, writer oder owner |
| `maxResults` | number | Nein | Maximale Anzahl der zurückzugebenden Kalender (Standard 100, max. 250) |
| `pageToken` | string | Nein | Token zum Abrufen nachfolgender Ergebnisseiten |
| `showDeleted` | boolean | Nein | Gelöschte Kalender einschließen |
| `showHidden` | boolean | Nein | Ausgeblendete Kalender einschließen |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `nextPageToken` | string | Nächstes Seiten-Token |
| `calendars` | array | Liste der Kalender |
| ↳ `id` | string | Kalender-ID |
| ↳ `summary` | string | Kalendertitel |
| ↳ `description` | string | Kalenderbeschreibung |
| ↳ `location` | string | Kalenderort |
| ↳ `timeZone` | string | Kalender-Zeitzone |
| ↳ `accessRole` | string | Zugriffsrolle für den Kalender |
| ↳ `backgroundColor` | string | Kalender-Hintergrundfarbe |
| ↳ `foregroundColor` | string | Kalender-Vordergrundfarbe |
| ↳ `primary` | boolean | Ob dies der Hauptkalender ist |
| ↳ `hidden` | boolean | Ob der Kalender ausgeblendet ist |
| ↳ `selected` | boolean | Ob der Kalender ausgewählt ist |
### `google_calendar_quick_add`
Ereignisse aus natürlichsprachlichem Text erstellen. Gibt nur API-konforme Felder zurück.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `calendarId` | string | Nein | Google Kalender-ID (z. B. primary oder calendar@group.calendar.google.com) |
| `text` | string | Ja | Natürlichsprachlicher Text, der das Ereignis beschreibt (z. B. "Meeting mit John morgen um 15 Uhr") |
| `attendees` | array | Nein | Array von E-Mail-Adressen der Teilnehmer (kommagetrennte Zeichenkette wird ebenfalls akzeptiert) |
| `sendUpdates` | string | Nein | Wie Updates an Teilnehmer gesendet werden: all, externalOnly oder none |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `id` | string | Ereignis-ID |
| `htmlLink` | string | Ereignis-Link |
| `status` | string | Ereignisstatus |
| `summary` | string | Ereignistitel |
| `description` | string | Ereignisbeschreibung |
| `location` | string | Ereignisort |
| `start` | json | Ereignisstart |
| `end` | json | Ereignisende |
| `attendees` | json | Ereignisteilnehmer |
| `creator` | json | Ereignisersteller |
| `organizer` | json | Ereignisorganisator |
### `google_calendar_invite`
Teilnehmer zu einem bestehenden Google Kalender-Ereignis einladen. Gibt nur API-konforme Felder zurück.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `calendarId` | string | Nein | Google Kalender-ID (z. B. primary oder calendar@group.calendar.google.com) |
| `eventId` | string | Ja | Google Kalender-Ereignis-ID, zu der Teilnehmer eingeladen werden sollen |
| `attendees` | array | Ja | Array von E-Mail-Adressen der einzuladenden Teilnehmer |
| `sendUpdates` | string | Nein | Wie Updates an Teilnehmer gesendet werden: all, externalOnly oder none |
| `replaceExisting` | boolean | Nein | Ob bestehende Teilnehmer ersetzt oder hinzugefügt werden sollen (Standard ist false) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `id` | string | Ereignis-ID |
| `htmlLink` | string | Ereignis-Link |
| `status` | string | Ereignisstatus |
| `summary` | string | Ereignistitel |
| `description` | string | Ereignisbeschreibung |
| `location` | string | Ereignisort |
| `start` | json | Ereignisbeginn |
| `end` | json | Ereignisende |
| `attendees` | json | Ereignisteilnehmer |
| `creator` | json | Ereignisersteller |
| `organizer` | json | Ereignisorganisator |

View File

@@ -102,27 +102,3 @@ Inhalte in einem Google Docs-Dokument schreiben oder aktualisieren
| --------- | ---- | ----------- |
| `updatedContent` | boolean | Gibt an, ob der Dokumentinhalt erfolgreich aktualisiert wurde |
| `metadata` | json | Aktualisierte Dokument-Metadaten einschließlich ID, Titel und URL |
### `google_docs_create`
Ein neues Google Docs-Dokument erstellen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `title` | string | Ja | Der Titel des zu erstellenden Dokuments |
| `content` | string | Nein | Der Inhalt des zu erstellenden Dokuments |
| `folderSelector` | string | Nein | Wählen Sie den Ordner aus, in dem das Dokument erstellt werden soll |
| `folderId` | string | Nein | Die ID des Ordners, in dem das Dokument erstellt werden soll \(interne Verwendung\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `metadata` | json | Metadaten des erstellten Dokuments einschließlich ID, Titel und URL |
## Hinweise
- Kategorie: `tools`
- Typ: `google_docs`

View File

@@ -124,3 +124,270 @@ Dateien und Ordner in Google Drive auflisten
- Kategorie: `tools`
- Typ: `google_drive`
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `file` | file | Heruntergeladene Datei, gespeichert in Ausführungsdateien |
| `metadata` | object | Vollständige Dateimetadaten von Google Drive |
| ↳ `id` | string | Google Drive-Datei-ID |
| ↳ `kind` | string | Ressourcentyp-Kennung |
| ↳ `name` | string | Dateiname |
| ↳ `mimeType` | string | MIME-Typ |
| ↳ `description` | string | Dateibeschreibung |
| ↳ `originalFilename` | string | Original hochgeladener Dateiname |
| ↳ `fullFileExtension` | string | Vollständige Dateierweiterung |
| ↳ `fileExtension` | string | Dateierweiterung |
| ↳ `owners` | json | Liste der Dateieigentümer |
| ↳ `permissions` | json | Dateiberechtigungen |
| ↳ `permissionIds` | json | Berechtigungs-IDs |
| ↳ `shared` | boolean | Ob Datei geteilt ist |
| ↳ `ownedByMe` | boolean | Ob im Besitz des aktuellen Benutzers |
| ↳ `writersCanShare` | boolean | Ob Autoren teilen können |
| ↳ `viewersCanCopyContent` | boolean | Ob Betrachter kopieren können |
| ↳ `copyRequiresWriterPermission` | boolean | Ob Kopieren Autorenberechtigung erfordert |
| ↳ `sharingUser` | json | Benutzer, der die Datei geteilt hat |
| ↳ `starred` | boolean | Ob Datei mit Stern markiert ist |
| ↳ `trashed` | boolean | Ob Datei im Papierkorb ist |
| ↳ `explicitlyTrashed` | boolean | Ob explizit in Papierkorb verschoben |
| ↳ `appProperties` | json | App-spezifische Eigenschaften |
| ↳ `createdTime` | string | Dateierstellungszeit |
| ↳ `modifiedTime` | string | Letzte Änderungszeit |
| ↳ `modifiedByMeTime` | string | Wann vom aktuellen Benutzer geändert |
| ↳ `viewedByMeTime` | string | Wann zuletzt vom aktuellen Benutzer angesehen |
| ↳ `sharedWithMeTime` | string | Wann mit aktuellem Benutzer geteilt |
| ↳ `lastModifyingUser` | json | Benutzer, der die Datei zuletzt geändert hat |
| ↳ `viewedByMe` | boolean | Ob vom aktuellen Benutzer angesehen |
| ↳ `modifiedByMe` | boolean | Ob vom aktuellen Benutzer geändert |
| ↳ `webViewLink` | string | URL zum Anzeigen im Browser |
| ↳ `webContentLink` | string | Direkte Download-URL |
| ↳ `iconLink` | string | URL zum Dateisymbol |
| ↳ `thumbnailLink` | string | URL zum Vorschaubild |
| ↳ `exportLinks` | json | Exportformat-Links |
| ↳ `size` | string | Dateigröße in Bytes |
| ↳ `quotaBytesUsed` | string | Verwendetes Speicherkontingent |
| ↳ `md5Checksum` | string | MD5-Hash |
| ↳ `sha1Checksum` | string | SHA-1-Hash |
| ↳ `sha256Checksum` | string | SHA-256-Hash |
| ↳ `parents` | json | Übergeordnete Ordner-IDs |
| ↳ `spaces` | json | Bereiche, die Datei enthalten |
| ↳ `driveId` | string | Geteilte Laufwerk-ID |
| ↳ `capabilities` | json | Benutzerfähigkeiten für Datei |
| ↳ `version` | string | Versionsnummer |
| ↳ `headRevisionId` | string | Hauptrevisions-ID |
| ↳ `hasThumbnail` | boolean | Ob Vorschaubild vorhanden |
| ↳ `thumbnailVersion` | string | Vorschaubild-Version |
| ↳ `imageMediaMetadata` | json | Bildspezifische Metadaten |
| ↳ `videoMediaMetadata` | json | Videospezifische Metadaten |
| ↳ `isAppAuthorized` | boolean | Ob von anfragender App erstellt |
| ↳ `contentRestrictions` | json | Inhaltsbeschränkungen |
| ↳ `linkShareMetadata` | json | Link-Freigabe-Metadaten |
| ↳ `revisions` | json | Dateirevisionshistorie \(nur erste 100 Revisionen\) |
### `google_drive_copy`
Erstellen Sie eine Kopie einer Datei in Google Drive
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `fileId` | string | Ja | Die ID der zu kopierenden Datei |
| `newName` | string | Nein | Name für die kopierte Datei (Standard: "Kopie von [ursprünglicher Name]") |
| `destinationFolderId` | string | Nein | ID des Ordners, in dem die Kopie abgelegt werden soll (Standard: gleicher Speicherort wie das Original) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `file` | json | Die Metadaten der kopierten Datei |
| ↳ `id` | string | Google Drive-Datei-ID der Kopie |
| ↳ `kind` | string | Ressourcentyp-Kennung |
| ↳ `name` | string | Dateiname |
| ↳ `mimeType` | string | MIME-Typ |
| ↳ `webViewLink` | string | URL zum Anzeigen im Browser |
| ↳ `parents` | json | IDs der übergeordneten Ordner |
| ↳ `createdTime` | string | Erstellungszeit der Datei |
| ↳ `modifiedTime` | string | Zeitpunkt der letzten Änderung |
| ↳ `owners` | json | Liste der Dateieigentümer |
| ↳ `size` | string | Dateigröße in Bytes |
### `google_drive_update`
Aktualisieren Sie Dateimetadaten in Google Drive (umbenennen, verschieben, mit Stern markieren, Beschreibung hinzufügen)
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `fileId` | string | Ja | Die ID der zu aktualisierenden Datei |
| `name` | string | Nein | Neuer Name für die Datei |
| `description` | string | Nein | Neue Beschreibung für die Datei |
| `addParents` | string | Nein | Durch Kommas getrennte Liste von IDs übergeordneter Ordner, die hinzugefügt werden sollen (verschiebt die Datei in diese Ordner) |
| `removeParents` | string | Nein | Durch Kommas getrennte Liste von IDs übergeordneter Ordner, die entfernt werden sollen |
| `starred` | boolean | Nein | Ob die Datei mit einem Stern markiert oder die Markierung entfernt werden soll |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `file` | json | Die aktualisierten Dateimetadaten |
| ↳ `id` | string | Google Drive-Datei-ID |
| ↳ `kind` | string | Ressourcentyp-Kennung |
| ↳ `name` | string | Dateiname |
| ↳ `mimeType` | string | MIME-Typ |
| ↳ `description` | string | Dateibeschreibung |
| ↳ `starred` | boolean | Ob die Datei mit Stern markiert ist |
| ↳ `webViewLink` | string | URL zum Anzeigen im Browser |
| ↳ `parents` | json | IDs der übergeordneten Ordner |
| ↳ `modifiedTime` | string | Zeitpunkt der letzten Änderung |
### `google_drive_trash`
Eine Datei in den Papierkorb von Google Drive verschieben (kann später wiederhergestellt werden)
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `fileId` | string | Ja | Die ID der Datei, die in den Papierkorb verschoben werden soll |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `file` | json | Die Metadaten der gelöschten Datei |
| ↳ `id` | string | Google Drive-Datei-ID |
| ↳ `kind` | string | Ressourcentyp-Kennung |
| ↳ `name` | string | Dateiname |
| ↳ `mimeType` | string | MIME-Typ |
| ↳ `trashed` | boolean | Ob sich die Datei im Papierkorb befindet (sollte true sein) |
| ↳ `trashedTime` | string | Zeitpunkt, zu dem die Datei gelöscht wurde |
| ↳ `webViewLink` | string | URL zum Anzeigen im Browser |
### `google_drive_delete`
Eine Datei dauerhaft aus Google Drive löschen (umgeht den Papierkorb)
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `fileId` | string | Ja | Die ID der Datei, die dauerhaft gelöscht werden soll |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `deleted` | boolean | Ob die Datei erfolgreich gelöscht wurde |
| `fileId` | string | Die ID der gelöschten Datei |
### `google_drive_share`
Eine Datei mit einem Benutzer, einer Gruppe, einer Domain teilen oder öffentlich machen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `fileId` | string | Ja | Die ID der Datei, die geteilt werden soll |
| `type` | string | Ja | Art des Empfängers: user, group, domain oder anyone |
| `role` | string | Ja | Berechtigungsrolle: owner \(Eigentümerschaft übertragen\), organizer \(nur freigegebenes Laufwerk\), fileOrganizer \(nur freigegebenes Laufwerk\), writer \(bearbeiten\), commenter \(ansehen und kommentieren\), reader \(nur ansehen\) |
| `email` | string | Nein | E-Mail-Adresse des Benutzers oder der Gruppe \(erforderlich für type=user oder type=group\) |
| `domain` | string | Nein | Domain, mit der geteilt werden soll \(erforderlich für type=domain\) |
| `transferOwnership` | boolean | Nein | Erforderlich, wenn die Rolle owner ist. Überträgt die Eigentümerschaft an den angegebenen Benutzer. |
| `moveToNewOwnersRoot` | boolean | Nein | Beim Übertragen der Eigentümerschaft die Datei in den Stammordner von „Meine Ablage" des neuen Eigentümers verschieben. |
| `sendNotification` | boolean | Nein | Ob eine E-Mail-Benachrichtigung gesendet werden soll \(Standard: true\) |
| `emailMessage` | string | Nein | Benutzerdefinierte Nachricht, die in die Benachrichtigungs-E-Mail aufgenommen werden soll |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `permission` | json | Die Details der erstellten Berechtigung |
| ↳ `id` | string | Berechtigungs-ID |
| ↳ `type` | string | Empfängertyp \(user, group, domain, anyone\) |
| ↳ `role` | string | Berechtigungsrolle |
| ↳ `emailAddress` | string | E-Mail des Empfängers |
| ↳ `displayName` | string | Anzeigename des Empfängers |
| ↳ `domain` | string | Domain des Empfängers |
| ↳ `expirationTime` | string | Ablaufzeit |
| ↳ `deleted` | boolean | Ob der Empfänger gelöscht wurde |
### `google_drive_unshare`
Eine Berechtigung von einer Datei entfernen (Zugriff widerrufen)
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `fileId` | string | Ja | Die ID der Datei, deren Berechtigungen geändert werden sollen |
| `permissionId` | string | Ja | Die ID der zu entfernenden Berechtigung \(verwenden Sie list_permissions, um diese zu finden\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `removed` | boolean | Ob die Berechtigung erfolgreich entfernt wurde |
| `fileId` | string | Die ID der Datei |
| `permissionId` | string | Die ID der entfernten Berechtigung |
### `google_drive_list_permissions`
Alle Berechtigungen (wer hat Zugriff) für eine Datei in Google Drive auflisten
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `fileId` | string | Ja | Die ID der Datei, für die Berechtigungen aufgelistet werden sollen |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `permissions` | array | Liste der Berechtigungen für die Datei |
| ↳ `id` | string | Berechtigungs-ID \(zum Entfernen der Berechtigung verwenden\) |
| ↳ `type` | string | Empfängertyp \(user, group, domain, anyone\) |
| ↳ `role` | string | Berechtigungsrolle \(owner, organizer, fileOrganizer, writer, commenter, reader\) |
| ↳ `emailAddress` | string | E-Mail des Empfängers |
| ↳ `displayName` | string | Anzeigename des Empfängers |
| ↳ `photoLink` | string | Foto-URL des Empfängers |
| ↳ `domain` | string | Domain des Empfängers |
| ↳ `expirationTime` | string | Ablaufzeitpunkt der Berechtigung |
| ↳ `deleted` | boolean | Ob das Empfängerkonto gelöscht wurde |
| ↳ `allowFileDiscovery` | boolean | Ob die Datei vom Empfänger auffindbar ist |
| ↳ `pendingOwner` | boolean | Ob eine Eigentumsübertragung aussteht |
| ↳ `permissionDetails` | json | Details zu geerbten Berechtigungen |
| `nextPageToken` | string | Token zum Abrufen der nächsten Seite von Berechtigungen |
### `google_drive_get_about`
Informationen über den Benutzer und sein Google Drive abrufen (Speicherkontingent, Funktionen)
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `user` | json | Informationen über den authentifizierten Benutzer |
| ↳ `displayName` | string | Anzeigename des Benutzers |
| ↳ `emailAddress` | string | E-Mail-Adresse des Benutzers |
| ↳ `photoLink` | string | URL zum Profilfoto des Benutzers |
| ↳ `permissionId` | string | Berechtigungs-ID des Benutzers |
| ↳ `me` | boolean | Ob dies der authentifizierte Benutzer ist |
| `storageQuota` | json | Informationen zum Speicherkontingent in Bytes |
| ↳ `limit` | string | Gesamtes Speicherlimit in Bytes \(null für unbegrenzt\) |
| ↳ `usage` | string | Insgesamt verwendeter Speicher in Bytes |
| ↳ `usageInDrive` | string | Von Drive-Dateien verwendeter Speicher in Bytes |
| ↳ `usageInDriveTrash` | string | Von gelöschten Dateien verwendeter Speicher in Bytes |
| `canCreateDrives` | boolean | Ob der Benutzer geteilte Ablagen erstellen kann |
| `importFormats` | json | Zuordnung von MIME-Typen, die importiert werden können, und ihren Zielformaten |
| `exportFormats` | json | Zuordnung von Google Workspace-MIME-Typen und ihren exportierbaren Formaten |
| `maxUploadSize` | string | Maximale Upload-Größe in Bytes |

View File

@@ -52,3 +52,193 @@ Integrieren Sie Google Forms in Ihren Workflow. Geben Sie eine Formular-ID an, u
- Kategorie: `tools`
- Typ: `google_forms`
Ruft eine Formularstruktur einschließlich ihrer Elemente, Einstellungen und Metadaten ab
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `formId` | string | Ja | Die ID des abzurufenden Google-Formulars |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `formId` | string | Die Formular-ID |
| `title` | string | Der für Befragte sichtbare Formulartitel |
| `description` | string | Die Formularbeschreibung |
| `documentTitle` | string | Der in Drive sichtbare Dokumenttitel |
| `responderUri` | string | Die URI zum Teilen mit Befragten |
| `linkedSheetId` | string | Die ID der verknüpften Google-Tabelle |
| `revisionId` | string | Die Revisions-ID des Formulars |
| `items` | array | Die Formularelemente (Fragen, Abschnitte usw.) |
| ↳ `itemId` | string | Element-ID |
| ↳ `title` | string | Elementtitel |
| ↳ `description` | string | Elementbeschreibung |
| `settings` | json | Formulareinstellungen |
| `publishSettings` | json | Formularveröffentlichungseinstellungen |
### `google_forms_create_form`
Erstellt ein neues Google-Formular mit einem Titel
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `title` | string | Ja | Der für Befragte sichtbare Titel des Formulars |
| `documentTitle` | string | Nein | Der in Drive sichtbare Dokumenttitel (standardmäßig der Formulartitel) |
| `unpublished` | boolean | Nein | Falls true, wird ein unveröffentlichtes Formular erstellt, das keine Antworten akzeptiert |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `formId` | string | Die ID des erstellten Formulars |
| `title` | string | Der Formulartitel |
| `documentTitle` | string | Der Dokumenttitel in Drive |
| `responderUri` | string | Die URI zum Teilen mit Befragten |
| `revisionId` | string | Die Revisions-ID des Formulars |
### `google_forms_batch_update`
Mehrere Aktualisierungen auf ein Formular anwenden (Elemente hinzufügen, Informationen aktualisieren, Einstellungen ändern usw.)
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `formId` | string | Ja | Google Forms Formular-ID |
| `requests` | json | Ja | Array von Aktualisierungsanfragen (updateFormInfo, updateSettings, createItem, updateItem, moveItem, deleteItem) |
| `includeFormInResponse` | boolean | Nein | Ob das aktualisierte Formular in der Antwort zurückgegeben werden soll |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `replies` | array | Die Antworten von jeder Aktualisierungsanfrage |
| `writeControl` | object | Schreibsteuerungsinformationen mit Revisions-IDs |
| ↳ `requiredRevisionId` | string | Erforderliche Revisions-ID zur Konflikterkennung |
| ↳ `targetRevisionId` | string | Ziel-Revisions-ID |
| `form` | object | Das aktualisierte Formular (falls includeFormInResponse true war) |
| ↳ `formId` | string | Die Formular-ID |
| ↳ `info` | object | Formularinformationen mit Titel und Beschreibung |
| ↳ `title` | string | Der für Befragte sichtbare Formulartitel |
| ↳ `description` | string | Die Formularbeschreibung |
| ↳ `documentTitle` | string | Der in Drive sichtbare Dokumenttitel |
| ↳ `settings` | object | Formulareinstellungen |
| ↳ `quizSettings` | object | Quiz-Einstellungen |
| ↳ `isQuiz` | boolean | Ob das Formular ein Quiz ist |
| ↳ `emailCollectionType` | string | E-Mail-Erfassungstyp |
| ↳ `revisionId` | string | Die Revisions-ID des Formulars |
| ↳ `responderUri` | string | Die URI zum Teilen mit Befragten |
| ↳ `linkedSheetId` | string | Die ID des verknüpften Google Sheets |
| ↳ `publishSettings` | object | Formularveröffentlichungseinstellungen |
| ↳ `publishState` | object | Aktueller Veröffentlichungsstatus |
| ↳ `isPublished` | boolean | Ob das Formular veröffentlicht ist |
| ↳ `isAcceptingResponses` | boolean | Ob das Formular Antworten akzeptiert |
### `google_forms_set_publish_settings`
Aktualisiert die Veröffentlichungseinstellungen eines Formulars (veröffentlichen/zurückziehen, Antworten akzeptieren)
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `formId` | string | Ja | Google Forms Formular-ID |
| `isPublished` | boolean | Ja | Ob das Formular veröffentlicht und für andere sichtbar ist |
| `isAcceptingResponses` | boolean | Nein | Ob das Formular Antworten akzeptiert \(wird auf false gesetzt, wenn isPublished false ist\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `formId` | string | Die Formular-ID |
| `publishSettings` | json | Die aktualisierten Veröffentlichungseinstellungen |
| ↳ `publishState` | object | Der Veröffentlichungsstatus |
| ↳ `isPublished` | boolean | Ob das Formular veröffentlicht ist |
| ↳ `isAcceptingResponses` | boolean | Ob das Formular Antworten akzeptiert |
### `google_forms_create_watch`
Erstellt eine Benachrichtigungsüberwachung für Formularänderungen (Schemaänderungen oder neue Antworten)
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `formId` | string | Ja | Google Forms Formular-ID zur Überwachung |
| `eventType` | string | Ja | Zu überwachender Ereignistyp: SCHEMA \(Formularänderungen\) oder RESPONSES \(neue Einreichungen\) |
| `topicName` | string | Ja | Der Cloud Pub/Sub Topic-Name \(Format: projects/\{project\}/topics/\{topic\}\) |
| `watchId` | string | Nein | Benutzerdefinierte Watch-ID \(4-63 Zeichen, Kleinbuchstaben, Zahlen, Bindestriche\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `id` | string | Die Watch-ID |
| `eventType` | string | Der überwachte Ereignistyp |
| `topicName` | string | Das Cloud Pub/Sub-Thema |
| `createTime` | string | Zeitpunkt der Erstellung der Watch |
| `expireTime` | string | Ablaufzeitpunkt der Watch \(7 Tage nach Erstellung\) |
| `state` | string | Der Watch-Status \(ACTIVE, SUSPENDED\) |
### `google_forms_list_watches`
Alle Benachrichtigungs-Watches für ein Formular auflisten
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `formId` | string | Ja | Google Forms Formular-ID |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `watches` | array | Liste der Watches für das Formular |
| ↳ `id` | string | Watch-ID |
| ↳ `eventType` | string | Ereignistyp \(SCHEMA oder RESPONSES\) |
| ↳ `createTime` | string | Zeitpunkt der Erstellung der Watch |
| ↳ `expireTime` | string | Ablaufzeitpunkt der Watch |
| ↳ `state` | string | Watch-Status |
### `google_forms_delete_watch`
Eine Benachrichtigungs-Watch von einem Formular löschen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `formId` | string | Ja | Google Forms Formular-ID |
| `watchId` | string | Ja | Zu löschende Watch-ID |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `deleted` | boolean | Ob die Überwachung erfolgreich gelöscht wurde |
### `google_forms_renew_watch`
Verlängert eine Benachrichtigungsüberwachung um weitere 7 Tage
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `formId` | string | Ja | Google Forms Formular-ID |
| `watchId` | string | Ja | Zu verlängernde Überwachungs-ID |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `id` | string | Die Überwachungs-ID |
| `eventType` | string | Der überwachte Ereignistyp |
| `expireTime` | string | Die neue Ablaufzeit |
| `state` | string | Der Überwachungsstatus |

View File

@@ -217,3 +217,201 @@ Prüfen, ob ein Benutzer Mitglied einer Google-Gruppe ist
- Kategorie: `tools`
- Typ: `google_groups`
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `groupKey` | string | Ja | Gruppenkennung. Kann die E-Mail-Adresse der Gruppe \(z. B. team@example.com\) oder die eindeutige Gruppen-ID sein |
| `memberKey` | string | Ja | Zu prüfende Mitgliederkennung. Kann die E-Mail-Adresse des Mitglieds \(z. B. user@example.com\) oder die eindeutige Mitglieds-ID sein |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `isMember` | boolean | Gibt an, ob der Benutzer ein Mitglied der Gruppe ist |
### `google_groups_list_aliases`
Alle E-Mail-Aliase für eine Google-Gruppe auflisten
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `groupKey` | string | Ja | Gruppenkennung. Kann die E-Mail-Adresse der Gruppe \(z. B. team@example.com\) oder die eindeutige Gruppen-ID sein |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `aliases` | array | Liste der E-Mail-Aliase für die Gruppe |
| ↳ `id` | string | Eindeutige Gruppenkennung |
| ↳ `primaryEmail` | string | Primäre E-Mail-Adresse der Gruppe |
| ↳ `alias` | string | Alias-E-Mail-Adresse |
| ↳ `kind` | string | API-Ressourcentyp |
| ↳ `etag` | string | Ressourcenversionskennung |
### `google_groups_add_alias`
Einen E-Mail-Alias zu einer Google-Gruppe hinzufügen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `groupKey` | string | Ja | Gruppenkennung. Kann die E-Mail-Adresse der Gruppe \(z. B. team@example.com\) oder die eindeutige Gruppen-ID sein |
| `alias` | string | Ja | Der E-Mail-Alias, der zur Gruppe hinzugefügt werden soll |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `id` | string | Eindeutige Gruppenkennung |
| `primaryEmail` | string | Primäre E-Mail-Adresse der Gruppe |
| `alias` | string | Der hinzugefügte Alias |
| `kind` | string | API-Ressourcentyp |
| `etag` | string | Ressourcenversionskennung |
### `google_groups_remove_alias`
Einen E-Mail-Alias von einer Google-Gruppe entfernen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `groupKey` | string | Ja | Gruppenkennung. Kann die E-Mail-Adresse der Gruppe \(z. B. team@example.com\) oder die eindeutige Gruppen-ID sein |
| `alias` | string | Ja | Der E-Mail-Alias, der aus der Gruppe entfernt werden soll |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `deleted` | boolean | Gibt an, ob der Alias erfolgreich gelöscht wurde |
### `google_groups_get_settings`
Die Einstellungen für eine Google-Gruppe abrufen, einschließlich Zugriffsberechtigungen, Moderation und Veröffentlichungsoptionen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `groupEmail` | string | Ja | Die E-Mail-Adresse der Gruppe \(z. B. team@example.com\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `email` | string | Die E-Mail-Adresse der Gruppe |
| `name` | string | Der Gruppenname \(max. 75 Zeichen\) |
| `description` | string | Die Gruppenbeschreibung \(max. 4096 Zeichen\) |
| `whoCanJoin` | string | Wer der Gruppe beitreten kann \(ANYONE_CAN_JOIN, ALL_IN_DOMAIN_CAN_JOIN, INVITED_CAN_JOIN, CAN_REQUEST_TO_JOIN\) |
| `whoCanViewMembership` | string | Wer die Gruppenmitgliedschaft anzeigen kann |
| `whoCanViewGroup` | string | Wer Gruppennachrichten anzeigen kann |
| `whoCanPostMessage` | string | Wer Nachrichten in der Gruppe veröffentlichen kann |
| `allowExternalMembers` | string | Ob externe Benutzer Mitglieder sein können |
| `allowWebPosting` | string | Ob Web-Veröffentlichung erlaubt ist |
| `primaryLanguage` | string | Die primäre Sprache der Gruppe |
| `isArchived` | string | Ob Nachrichten archiviert werden |
| `archiveOnly` | string | Ob die Gruppe nur archiviert ist \(inaktiv\) |
| `messageModerationLevel` | string | Nachrichtenmoderationsebene |
| `spamModerationLevel` | string | Spam-Behandlungsebene \(ALLOW, MODERATE, SILENTLY_MODERATE, REJECT\) |
| `replyTo` | string | Standard-Antwortziel |
| `customReplyTo` | string | Benutzerdefinierte E-Mail für Antworten |
| `includeCustomFooter` | string | Ob eine benutzerdefinierte Fußzeile eingefügt werden soll |
| `customFooterText` | string | Benutzerdefinierter Fußzeilentext \(max. 1000 Zeichen\) |
| `sendMessageDenyNotification` | string | Ob Ablehnungsbenachrichtigungen gesendet werden sollen |
| `defaultMessageDenyNotificationText` | string | Standard-Ablehnungsnachrichtentext |
| `membersCanPostAsTheGroup` | string | Ob Mitglieder als Gruppe veröffentlichen können |
| `includeInGlobalAddressList` | string | Ob in der globalen Adressliste enthalten |
| `whoCanLeaveGroup` | string | Wer die Gruppe verlassen kann |
| `whoCanContactOwner` | string | Wer den Gruppeninhaber kontaktieren kann |
| `favoriteRepliesOnTop` | string | Ob bevorzugte Antworten oben erscheinen |
| `whoCanApproveMembers` | string | Wer neue Mitglieder genehmigen kann |
| `whoCanBanUsers` | string | Wer Benutzer sperren kann |
| `whoCanModerateMembers` | string | Wer Mitglieder verwalten kann |
| `whoCanModerateContent` | string | Wer Inhalte moderieren kann |
| `whoCanAssistContent` | string | Wer bei Inhaltsmetadaten unterstützen kann |
| `enableCollaborativeInbox` | string | Ob der kollaborative Posteingang aktiviert ist |
| `whoCanDiscoverGroup` | string | Wer die Gruppe entdecken kann |
| `defaultSender` | string | Standard-Absenderidentität \(DEFAULT_SELF oder GROUP\) |
### `google_groups_update_settings`
Aktualisieren Sie die Einstellungen für eine Google-Gruppe, einschließlich Zugriffsberechtigungen, Moderation und Veröffentlichungsoptionen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `groupEmail` | string | Ja | Die E-Mail-Adresse der Gruppe \(z. B. team@example.com\) |
| `name` | string | Nein | Der Gruppenname \(max. 75 Zeichen\) |
| `description` | string | Nein | Die Gruppenbeschreibung \(max. 4096 Zeichen\) |
| `whoCanJoin` | string | Nein | Wer kann beitreten: ANYONE_CAN_JOIN, ALL_IN_DOMAIN_CAN_JOIN, INVITED_CAN_JOIN, CAN_REQUEST_TO_JOIN |
| `whoCanViewMembership` | string | Nein | Wer kann Mitgliedschaft einsehen: ALL_IN_DOMAIN_CAN_VIEW, ALL_MEMBERS_CAN_VIEW, ALL_MANAGERS_CAN_VIEW |
| `whoCanViewGroup` | string | Nein | Wer kann Gruppennachrichten einsehen: ANYONE_CAN_VIEW, ALL_IN_DOMAIN_CAN_VIEW, ALL_MEMBERS_CAN_VIEW, ALL_MANAGERS_CAN_VIEW |
| `whoCanPostMessage` | string | Nein | Wer kann posten: NONE_CAN_POST, ALL_MANAGERS_CAN_POST, ALL_MEMBERS_CAN_POST, ALL_OWNERS_CAN_POST, ALL_IN_DOMAIN_CAN_POST, ANYONE_CAN_POST |
| `allowExternalMembers` | string | Nein | Ob externe Benutzer Mitglieder sein können: true oder false |
| `allowWebPosting` | string | Nein | Ob Web-Posting erlaubt ist: true oder false |
| `primaryLanguage` | string | Nein | Die Hauptsprache der Gruppe \(z. B. de\) |
| `isArchived` | string | Nein | Ob Nachrichten archiviert werden: true oder false |
| `archiveOnly` | string | Nein | Ob die Gruppe nur archiviert \(inaktiv\) ist: true oder false |
| `messageModerationLevel` | string | Nein | Nachrichtenmoderation: MODERATE_ALL_MESSAGES, MODERATE_NON_MEMBERS, MODERATE_NEW_MEMBERS, MODERATE_NONE |
| `spamModerationLevel` | string | Nein | Spam-Behandlung: ALLOW, MODERATE, SILENTLY_MODERATE, REJECT |
| `replyTo` | string | Nein | Standard-Antwort: REPLY_TO_CUSTOM, REPLY_TO_SENDER, REPLY_TO_LIST, REPLY_TO_OWNER, REPLY_TO_IGNORE, REPLY_TO_MANAGERS |
| `customReplyTo` | string | Nein | Benutzerdefinierte E-Mail für Antworten \(wenn replyTo REPLY_TO_CUSTOM ist\) |
| `includeCustomFooter` | string | Nein | Ob benutzerdefinierte Fußzeile eingefügt werden soll: true oder false |
| `customFooterText` | string | Nein | Benutzerdefinierter Fußzeilentext \(max. 1000 Zeichen\) |
| `sendMessageDenyNotification` | string | Nein | Ob Ablehnungsbenachrichtigungen gesendet werden sollen: true oder false |
| `defaultMessageDenyNotificationText` | string | Nein | Standard-Ablehnungsnachrichtentext |
| `membersCanPostAsTheGroup` | string | Nein | Ob Mitglieder als Gruppe posten können: true oder false |
| `includeInGlobalAddressList` | string | Nein | Ob in der globalen Adressliste enthalten: true oder false |
| `whoCanLeaveGroup` | string | Nein | Wer kann austreten: ALL_MANAGERS_CAN_LEAVE, ALL_MEMBERS_CAN_LEAVE, NONE_CAN_LEAVE |
| `whoCanContactOwner` | string | Nein | Wer kann Inhaber kontaktieren: ALL_IN_DOMAIN_CAN_CONTACT, ALL_MANAGERS_CAN_CONTACT, ALL_MEMBERS_CAN_CONTACT, ANYONE_CAN_CONTACT |
| `favoriteRepliesOnTop` | string | Nein | Ob bevorzugte Antworten oben erscheinen: true oder false |
| `whoCanApproveMembers` | string | Nein | Wer kann Mitglieder genehmigen: ALL_OWNERS_CAN_APPROVE, ALL_MANAGERS_CAN_APPROVE, ALL_MEMBERS_CAN_APPROVE, NONE_CAN_APPROVE |
| `whoCanBanUsers` | string | Nein | Wer kann Benutzer sperren: OWNERS_ONLY, OWNERS_AND_MANAGERS, NONE |
| `whoCanModerateMembers` | string | Nein | Wer kann Mitglieder verwalten: OWNERS_ONLY, OWNERS_AND_MANAGERS, ALL_MEMBERS, NONE |
| `whoCanModerateContent` | string | Nein | Wer kann Inhalte moderieren: OWNERS_ONLY, OWNERS_AND_MANAGERS, ALL_MEMBERS, NONE |
| `whoCanAssistContent` | string | Nein | Wer kann bei Inhaltsmetadaten unterstützen: OWNERS_ONLY, OWNERS_AND_MANAGERS, ALL_MEMBERS, NONE |
| `enableCollaborativeInbox` | string | Nein | Ob kollaborativer Posteingang aktiviert ist: true oder false |
| `whoCanDiscoverGroup` | string | Nein | Wer kann entdecken: ANYONE_CAN_DISCOVER, ALL_IN_DOMAIN_CAN_DISCOVER, ALL_MEMBERS_CAN_DISCOVER |
| `defaultSender` | string | Nein | Standard-Absender: DEFAULT_SELF oder GROUP |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `email` | string | Die E-Mail-Adresse der Gruppe |
| `name` | string | Der Gruppenname |
| `description` | string | Die Gruppenbeschreibung |
| `whoCanJoin` | string | Wer der Gruppe beitreten kann |
| `whoCanViewMembership` | string | Wer die Gruppenmitgliedschaft einsehen kann |
| `whoCanViewGroup` | string | Wer Gruppennachrichten einsehen kann |
| `whoCanPostMessage` | string | Wer Nachrichten in der Gruppe posten kann |
| `allowExternalMembers` | string | Ob externe Benutzer Mitglieder sein können |
| `allowWebPosting` | string | Ob Web-Posting erlaubt ist |
| `primaryLanguage` | string | Die Hauptsprache der Gruppe |
| `isArchived` | string | Ob Nachrichten archiviert werden |
| `archiveOnly` | string | Ob die Gruppe nur zum Archivieren dient |
| `messageModerationLevel` | string | Moderationsstufe für Nachrichten |
| `spamModerationLevel` | string | Spam-Behandlungsstufe |
| `replyTo` | string | Standard-Antwortziel |
| `customReplyTo` | string | Benutzerdefinierte E-Mail für Antworten |
| `includeCustomFooter` | string | Ob eine benutzerdefinierte Fußzeile eingefügt werden soll |
| `customFooterText` | string | Text der benutzerdefinierten Fußzeile |
| `sendMessageDenyNotification` | string | Ob Ablehnungsbenachrichtigungen gesendet werden sollen |
| `defaultMessageDenyNotificationText` | string | Text der Standard-Ablehnungsnachricht |
| `membersCanPostAsTheGroup` | string | Ob Mitglieder als Gruppe posten können |
| `includeInGlobalAddressList` | string | Ob in der globalen Adressliste enthalten |
| `whoCanLeaveGroup` | string | Wer die Gruppe verlassen kann |
| `whoCanContactOwner` | string | Wer den Gruppeninhaber kontaktieren kann |
| `favoriteRepliesOnTop` | string | Ob bevorzugte Antworten oben erscheinen |
| `whoCanApproveMembers` | string | Wer neue Mitglieder genehmigen kann |
| `whoCanBanUsers` | string | Wer Benutzer sperren kann |
| `whoCanModerateMembers` | string | Wer Mitglieder verwalten kann |
| `whoCanModerateContent` | string | Wer Inhalte moderieren kann |
| `whoCanAssistContent` | string | Wer bei Inhalts-Metadaten unterstützen kann |
| `enableCollaborativeInbox` | string | Ob der gemeinsame Posteingang aktiviert ist |
| `whoCanDiscoverGroup` | string | Wer die Gruppe entdecken kann |
| `defaultSender` | string | Standard-Absenderidentität |

View File

@@ -0,0 +1,445 @@
---
title: Google Maps
description: Geocodierung, Routenplanung, Orte und Entfernungsberechnungen
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="google_maps"
color="#E0E0E0"
/>
{/* MANUAL-CONTENT-START:intro */}
[Google Maps](https://maps.google.com) ist eine umfassende Plattform, die eine Vielzahl von APIs für Kartierung, Geocodierung, Routenplanung, Orte, Umweltdaten und mehr bietet. Über Sim können Ihre Agenten wichtige Google Maps Platform APIs nutzen, um eine Vielzahl standortbasierter Workflows zu automatisieren.
**Die folgenden Google Maps APIs sind in dieser Integration enthalten:**
- **Geocoding API:** Wandelt Adressen in Breiten- und Längengrade um und führt Reverse-Geocodierung durch.
- **Directions API:** Berechnet Routen und Wegbeschreibungen für Auto, Fußgänger, Fahrrad oder öffentliche Verkehrsmittel zwischen Standorten.
- **Distance Matrix API:** Berechnet Reiseentfernungen und -zeiten für mehrere Kombinationen von Start- und Zielorten.
- **Places API:** Sucht nach Orten (Unternehmen, Sehenswürdigkeiten, Einrichtungen) nach Name, Typ oder Nähe.
- **Place Details API:** Ruft detaillierte Informationen für einen bestimmten Ort ab, wie Adresse, Bewertungen, Öffnungszeiten und Kontaktinformationen.
- **Elevation API:** Ermittelt Höhendaten (Höhe über dem Meeresspiegel) für beliebige Standorte weltweit.
- **Time Zone API:** Ruft Zeitzoneninformationen für jeden geografischen Standort ab.
- **Air Quality API:** Ruft Echtzeit-Luftqualitätsdaten für bestimmte Koordinaten ab.
Mit diesen APIs können Ihre Sim-Agenten die Standortsuche und -anreicherung automatisieren, optimale Routen und Lieferungen planen, Zeiten und Entfernungen schätzen, Ortsdaten analysieren, Datensätze mit geografischem Kontext anreichern, Umweltbedingungen abrufen und mehr alles ohne manuelle Arbeit oder externe Tools.
Wenn Sie Funktionen benötigen, die über das hier Aufgeführte hinausgehen, oder Unterstützung für zusätzliche Google Maps APIs anfordern möchten, lassen Sie es uns wissen!
{/* MANUAL-CONTENT-END */}
## Nutzungsanweisungen
Integrieren Sie Google Maps Platform APIs in Ihren Workflow. Unterstützt Geocodierung von Adressen zu Koordinaten, Reverse-Geocodierung, Abrufen von Wegbeschreibungen zwischen Standorten, Berechnung von Distanzmatrizen, Suche nach Orten, Abrufen von Ortsdetails, Höhendaten und Zeitzoneninformationen.
## Tools
### `google_maps_air_quality`
Aktuelle Luftqualitätsdaten für einen Standort abrufen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Google Maps API-Schlüssel mit aktivierter Air Quality API |
| `lat` | number | Ja | Breitengradkoordinate |
| `lng` | number | Ja | Längengradkoordinate |
| `languageCode` | string | Nein | Sprachcode für die Antwort \(z. B. "en", "es"\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `dateTime` | string | Zeitstempel der Luftqualitätsdaten |
| `regionCode` | string | Regionscode für den Standort |
| `indexes` | array | Array von Luftqualitätsindizes |
| ↳ `code` | string | Indexcode \(z. B. "uaqi", "usa_epa"\) |
| ↳ `displayName` | string | Anzeigename des Index |
| ↳ `aqi` | number | Luftqualitätsindexwert |
| ↳ `aqiDisplay` | string | Formatierte AQI-Anzeigezeichenfolge |
| ↳ `color` | object | RGB-Farbe für die AQI-Stufe |
| ↳ `category` | string | Kategoriebeschreibung \(z. B. "Gut", "Mäßig"\) |
| ↳ `dominantPollutant` | string | Der dominierende Schadstoff |
| `pollutants` | array | Array von Schadstoffkonzentrationen |
| ↳ `code` | string | Schadstoffcode \(z. B. "pm25", "o3"\) |
| ↳ `displayName` | string | Anzeigename |
| ↳ `fullName` | string | Vollständiger Schadstoffname |
| ↳ `concentration` | object | Konzentrationsinformationen |
| ↳ `value` | number | Konzentrationswert |
| ↳ `units` | string | Einheiten \(z. B. "PARTS_PER_BILLION"\) |
| ↳ `additionalInfo` | object | Zusätzliche Informationen über Quellen und Auswirkungen |
| `healthRecommendations` | object | Gesundheitsempfehlungen für verschiedene Bevölkerungsgruppen |
### `google_maps_directions`
Wegbeschreibung und Routeninformationen zwischen zwei Standorten abrufen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Google Maps API-Schlüssel |
| `origin` | string | Ja | Startort \(Adresse oder lat,lng\) |
| `destination` | string | Ja | Zielort \(Adresse oder lat,lng\) |
| `mode` | string | Nein | Reisemodus: driving, walking, bicycling oder transit |
| `avoid` | string | Nein | Zu vermeidende Merkmale: tolls, highways oder ferries |
| `waypoints` | json | Nein | Array von Zwischenwegpunkten |
| `units` | string | Nein | Einheitensystem: metric oder imperial |
| `language` | string | Nein | Sprachcode für Ergebnisse \(z. B. en, es, fr\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `routes` | array | Alle verfügbaren Routen |
| ↳ `summary` | string | Routenzusammenfassung \(Hauptstraßennamen\) |
| ↳ `legs` | array | Routenabschnitte \(Segmente zwischen Wegpunkten\) |
| ↳ `overviewPolyline` | string | Kodierte Polylinie für die gesamte Route |
| ↳ `warnings` | array | Routenwarnungen |
| ↳ `waypointOrder` | array | Optimierte Wegpunktreihenfolge \(falls angefordert\) |
| `distanceText` | string | Gesamtentfernung als lesbarer Text \(z. B. „5,2 km"\) |
| `distanceMeters` | number | Gesamtentfernung in Metern |
| `durationText` | string | Gesamtdauer als lesbarer Text \(z. B. „15 Min."\) |
| `durationSeconds` | number | Gesamtdauer in Sekunden |
| `startAddress` | string | Aufgelöste Startadresse |
| `endAddress` | string | Aufgelöste Zieladresse |
| `steps` | array | Schritt-für-Schritt-Navigationsanweisungen |
| ↳ `instruction` | string | Navigationsanweisung \(HTML entfernt\) |
| ↳ `distanceText` | string | Schrittentfernung als Text |
| ↳ `distanceMeters` | number | Schrittentfernung in Metern |
| ↳ `durationText` | string | Schrittdauer als Text |
| ↳ `durationSeconds` | number | Schrittdauer in Sekunden |
| ↳ `startLocation` | object | Startkoordinaten des Schritts |
| ↳ `endLocation` | object | Endkoordinaten des Schritts |
| ↳ `travelMode` | string | Reisemodus für diesen Schritt |
| ↳ `maneuver` | string | Manövertyp \(turn-left usw.\) |
| `polyline` | string | Kodierte Polylinie für die Hauptroute |
### `google_maps_distance_matrix`
Berechnung von Reiseentfernung und -zeit zwischen mehreren Start- und Zielorten
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Google Maps API-Schlüssel |
| `origin` | string | Ja | Startort \(Adresse oder lat,lng\) |
| `destinations` | json | Ja | Array von Zielorten |
| `mode` | string | Nein | Reisemodus: driving, walking, bicycling oder transit |
| `avoid` | string | Nein | Zu vermeidende Merkmale: tolls, highways oder ferries |
| `units` | string | Nein | Einheitensystem: metric oder imperial |
| `language` | string | Nein | Sprachcode für Ergebnisse \(z. B. en, es, fr\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `originAddresses` | array | Aufgelöste Startadressen |
| `destinationAddresses` | array | Aufgelöste Zieladressen |
| `rows` | array | Distanzmatrix-Zeilen \(eine pro Startort\) |
| ↳ `elements` | array | Elemente \(eines pro Zielort\) |
| ↳ `distanceText` | string | Entfernung als Text \(z. B. "5,2 km"\) |
| ↳ `distanceMeters` | number | Entfernung in Metern |
| ↳ `durationText` | string | Dauer als Text \(z. B. "15 Min."\) |
| ↳ `durationSeconds` | number | Dauer in Sekunden |
| ↳ `durationInTrafficText` | string | Dauer im Verkehr als Text |
| ↳ `durationInTrafficSeconds` | number | Dauer im Verkehr in Sekunden |
| ↳ `status` | string | Elementstatus \(OK, NOT_FOUND, ZERO_RESULTS\) |
### `google_maps_elevation`
Höhendaten für einen Standort abrufen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Google Maps API-Schlüssel |
| `lat` | number | Ja | Breitengradkoordinate |
| `lng` | number | Ja | Längengradkoordinate |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `elevation` | number | Höhe in Metern über dem Meeresspiegel \(negativ für darunter\) |
| `lat` | number | Breitengrad der Höhenmessung |
| `lng` | number | Längengrad der Höhenmessung |
| `resolution` | number | Maximale Entfernung zwischen Datenpunkten \(Meter\), aus denen die Höhe interpoliert wurde |
### `google_maps_geocode`
Eine Adresse in geografische Koordinaten (Breiten- und Längengrad) umwandeln
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Google Maps API-Schlüssel |
| `address` | string | Ja | Die zu geokodierende Adresse |
| `language` | string | Nein | Sprachcode für Ergebnisse \(z. B. en, es, fr\) |
| `region` | string | Nein | Regionspräferenz als ccTLD-Code \(z. B. us, uk\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `formattedAddress` | string | Die formatierte Adresszeichenfolge |
| `lat` | number | Breitengradkoordinate |
| `lng` | number | Längengradkoordinate |
| `location` | json | Standortobjekt mit lat und lng |
| `placeId` | string | Google Place ID für diesen Standort |
| `addressComponents` | array | Detaillierte Adresskomponenten |
| ↳ `longName` | string | Vollständiger Name der Komponente |
| ↳ `shortName` | string | Abgekürzter Name |
| ↳ `types` | array | Komponententypen |
| `locationType` | string | Standortgenauigkeitstyp \(ROOFTOP, RANGE_INTERPOLATED, etc.\) |
### `google_maps_geolocate`
Geolokalisierung eines Geräts mithilfe von WLAN-Zugangspunkten, Mobilfunkmasten oder IP-Adresse
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Google Maps API-Schlüssel mit aktivierter Geolocation API |
| `homeMobileCountryCode` | number | Nein | Heimat-Mobilfunkländercode \(MCC\) |
| `homeMobileNetworkCode` | number | Nein | Heimat-Mobilfunknetzcode \(MNC\) |
| `radioType` | string | Nein | Funktyp: lte, gsm, cdma, wcdma oder nr |
| `carrier` | string | Nein | Name des Mobilfunkanbieters |
| `considerIp` | boolean | Nein | Ob IP-Adresse für Geolokalisierung verwendet werden soll \(Standard: true\) |
| `cellTowers` | array | Nein | Array von Mobilfunkmast-Objekten mit cellId, locationAreaCode, mobileCountryCode, mobileNetworkCode |
| `wifiAccessPoints` | array | Nein | Array von WLAN-Zugangspunkt-Objekten mit macAddress \(erforderlich\), signalStrength usw. |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `lat` | number | Breitengrad-Koordinate |
| `lng` | number | Längengrad-Koordinate |
| `accuracy` | number | Genauigkeitsradius in Metern |
### `google_maps_place_details`
Detaillierte Informationen über einen bestimmten Ort abrufen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Google Maps API-Schlüssel |
| `placeId` | string | Ja | Google Place ID |
| `fields` | string | Nein | Kommagetrennte Liste der zurückzugebenden Felder |
| `language` | string | Nein | Sprachcode für Ergebnisse \(z. B. en, es, fr\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `placeId` | string | Google Place ID |
| `name` | string | Name des Ortes |
| `formattedAddress` | string | Formatierte Straßenadresse |
| `lat` | number | Breitengrad-Koordinate |
| `lng` | number | Längengrad-Koordinate |
| `types` | array | Ortstypen \(z. B. Restaurant, Café\) |
| `rating` | number | Durchschnittliche Bewertung \(1,0 bis 5,0\) |
| `userRatingsTotal` | number | Gesamtanzahl der Nutzerbewertungen |
| `priceLevel` | number | Preisniveau \(0=Kostenlos, 1=Günstig, 2=Moderat, 3=Teuer, 4=Sehr teuer\) |
| `website` | string | Website-URL des Ortes |
| `phoneNumber` | string | Lokal formatierte Telefonnummer |
| `internationalPhoneNumber` | string | International formatierte Telefonnummer |
| `openNow` | boolean | Ob der Ort derzeit geöffnet ist |
| `weekdayText` | array | Öffnungszeiten formatiert nach Wochentag |
| `reviews` | array | Nutzerbewertungen \(bis zu 5 relevanteste\) |
| ↳ `authorName` | string | Name des Bewerters |
| ↳ `authorUrl` | string | Profil-URL des Bewerters |
| ↳ `profilePhotoUrl` | string | Foto-URL des Bewerters |
| ↳ `rating` | number | Vergebene Bewertung \(1-5\) |
| ↳ `text` | string | Bewertungstext |
| ↳ `time` | number | Zeitstempel der Bewertung \(Unix-Epoche\) |
| ↳ `relativeTimeDescription` | string | Relative Zeit \(z. B. „vor einem Monat"\) |
| `photos` | array | Fotos des Ortes |
| ↳ `photoReference` | string | Foto-Referenz für Place Photos API |
| ↳ `height` | number | Fotohöhe in Pixeln |
| ↳ `width` | number | Fotobreite in Pixeln |
| ↳ `htmlAttributions` | array | Erforderliche Quellenangaben |
| `url` | string | Google Maps-URL für den Ort |
| `utcOffset` | number | UTC-Offset in Minuten |
| `vicinity` | string | Vereinfachte Adresse \(Stadtteil/Straße\) |
| `businessStatus` | string | Geschäftsstatus \(OPERATIONAL, CLOSED_TEMPORARILY, CLOSED_PERMANENTLY\) |
### `google_maps_places_search`
Orte mithilfe einer Textabfrage suchen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Google Maps API-Schlüssel |
| `query` | string | Ja | Suchabfrage \(z. B. "Restaurants am Times Square"\) |
| `location` | json | Nein | Standort zur Gewichtung der Ergebnisse \(\{lat, lng\}\) |
| `radius` | number | Nein | Suchradius in Metern |
| `type` | string | Nein | Ortstyp-Filter \(z. B. restaurant, cafe, hotel\) |
| `language` | string | Nein | Sprachcode für Ergebnisse \(z. B. en, es, fr\) |
| `region` | string | Nein | Regionsgewichtung als ccTLD-Code \(z. B. us, uk\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `places` | array | Liste der gefundenen Orte |
| ↳ `placeId` | string | Google Place ID |
| ↳ `name` | string | Ortsname |
| ↳ `formattedAddress` | string | Formatierte Adresse |
| ↳ `lat` | number | Breitengrad |
| ↳ `lng` | number | Längengrad |
| ↳ `types` | array | Ortstypen |
| ↳ `rating` | number | Durchschnittliche Bewertung \(1-5\) |
| ↳ `userRatingsTotal` | number | Anzahl der Bewertungen |
| ↳ `priceLevel` | number | Preisniveau \(0-4\) |
| ↳ `openNow` | boolean | Ob derzeit geöffnet |
| ↳ `photoReference` | string | Fotoreferenz für Photos API |
| ↳ `businessStatus` | string | Geschäftsstatus |
| `nextPageToken` | string | Token zum Abrufen der nächsten Ergebnisseite |
### `google_maps_reverse_geocode`
Geografische Koordinaten (Breiten- und Längengrad) in eine lesbare Adresse umwandeln
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Google Maps API-Schlüssel |
| `lat` | number | Ja | Breitengrad-Koordinate |
| `lng` | number | Ja | Längengrad-Koordinate |
| `language` | string | Nein | Sprachcode für Ergebnisse \(z. B. en, es, fr\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `formattedAddress` | string | Die formatierte Adresszeichenfolge |
| `placeId` | string | Google Place ID für diesen Standort |
| `addressComponents` | array | Detaillierte Adresskomponenten |
| ↳ `longName` | string | Vollständiger Name der Komponente |
| ↳ `shortName` | string | Abgekürzter Name |
| ↳ `types` | array | Komponententypen |
| `types` | array | Adresstypen \(z. B. street_address, route\) |
### `google_maps_snap_to_roads`
GPS-Koordinaten auf das nächstgelegene Straßensegment ausrichten
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Google Maps API-Schlüssel mit aktivierter Roads API |
| `path` | string | Ja | Durch Pipe getrennte Liste von Breiten-/Längengrad-Koordinaten \(z. B. "60.170880,24.942795\|60.170879,24.942796"\) |
| `interpolate` | boolean | Nein | Ob zusätzliche Punkte entlang der Straße interpoliert werden sollen |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `snappedPoints` | array | Array von ausgerichteten Punkten auf Straßen |
| ↳ `location` | object | Ausgerichtete Standortkoordinaten |
| ↳ `lat` | number | Breitengrad |
| ↳ `lng` | number | Längengrad |
| ↳ `originalIndex` | number | Index im ursprünglichen Pfad \(falls nicht interpoliert\) |
| ↳ `placeId` | string | Place ID für dieses Straßensegment |
| `warningMessage` | string | Warnmeldung, falls vorhanden \(z. B. wenn Punkte nicht ausgerichtet werden konnten\) |
### `google_maps_speed_limits`
Geschwindigkeitsbegrenzungen für Straßenabschnitte abrufen. Erfordert entweder Pfadkoordinaten oder placeIds.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Google Maps API-Schlüssel mit aktivierter Roads API |
| `path` | string | Nein | Pipe-getrennte Liste von Breiten-/Längengrad-Koordinaten \(erforderlich, wenn placeIds nicht angegeben\) |
| `placeIds` | array | Nein | Array von Place-IDs für Straßenabschnitte \(erforderlich, wenn path nicht angegeben\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `speedLimits` | array | Array von Geschwindigkeitsbegrenzungen für Straßenabschnitte |
| ↳ `placeId` | string | Place-ID für den Straßenabschnitt |
| ↳ `speedLimit` | number | Wert der Geschwindigkeitsbegrenzung |
| ↳ `units` | string | Einheit der Geschwindigkeitsbegrenzung \(KPH oder MPH\) |
| `snappedPoints` | array | Array von angepassten Punkten, die den Geschwindigkeitsbegrenzungen entsprechen |
| ↳ `location` | object | Angepasste Standortkoordinaten |
| ↳ `lat` | number | Breitengrad |
| ↳ `lng` | number | Längengrad |
| ↳ `originalIndex` | number | Index im ursprünglichen Pfad |
| ↳ `placeId` | string | Place-ID für diesen Straßenabschnitt |
### `google_maps_timezone`
Zeitzoneninformationen für einen Standort abrufen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Google Maps API-Schlüssel |
| `lat` | number | Ja | Breitengrad-Koordinate |
| `lng` | number | Ja | Längengrad-Koordinate |
| `timestamp` | number | Nein | Unix-Zeitstempel zur Bestimmung des DST-Offsets \(Standard: aktuelle Zeit\) |
| `language` | string | Nein | Sprachcode für Zeitzonennamen \(z. B. en, es, fr\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `timeZoneId` | string | IANA-Zeitzonen-ID \(z. B. "America/New_York", "Europe/London"\) |
| `timeZoneName` | string | Lokalisierter Zeitzonenname \(z. B. "Östliche Sommerzeit"\) |
| `rawOffset` | number | UTC-Versatz in Sekunden \(ohne Sommerzeit\) |
| `dstOffset` | number | Sommerzeitversatz in Sekunden \(0, wenn keine Sommerzeit\) |
| `totalOffsetSeconds` | number | Gesamter UTC-Versatz in Sekunden \(rawOffset + dstOffset\) |
| `totalOffsetHours` | number | Gesamter UTC-Versatz in Stunden \(z. B. -5 für EST, -4 für EDT\) |
### `google_maps_validate_address`
Postanschrift validieren und standardisieren
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Google Maps API-Schlüssel mit aktivierter Address Validation API |
| `address` | string | Ja | Die zu validierende Adresse \(als einzelne Zeichenfolge\) |
| `regionCode` | string | Nein | ISO 3166-1 Alpha-2-Ländercode \(z. B. "US", "CA"\) |
| `locality` | string | Nein | Stadt- oder Ortsname |
| `enableUspsCass` | boolean | Nein | USPS CASS-Validierung für US-Adressen aktivieren |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `formattedAddress` | string | Die standardisierte formatierte Adresse |
| `lat` | number | Breitengradkoordinate |
| `lng` | number | Längengradkoordinate |
| `placeId` | string | Google Place ID für diese Adresse |
| `addressComplete` | boolean | Ob die Adresse vollständig und zustellbar ist |
| `hasUnconfirmedComponents` | boolean | Ob einige Adresskomponenten nicht bestätigt werden konnten |
| `hasInferredComponents` | boolean | Ob einige Komponenten abgeleitet wurden \(nicht in der Eingabe\) |
| `hasReplacedComponents` | boolean | Ob einige Komponenten durch kanonische Werte ersetzt wurden |
| `validationGranularity` | string | Granularität der Validierung \(PREMISE, SUB_PREMISE, ROUTE usw.\) |
| `geocodeGranularity` | string | Granularität des Geocode-Ergebnisses |
| `addressComponents` | array | Detaillierte Adresskomponenten |
| ↳ `longName` | string | Vollständiger Name der Komponente |
| ↳ `shortName` | string | Abgekürzter Name |
| ↳ `types` | array | Komponententypen |
| `missingComponentTypes` | array | Typen von Adresskomponenten, die fehlen |
| `unconfirmedComponentTypes` | array | Typen von Komponenten, die nicht bestätigt werden konnten |
| `unresolvedTokens` | array | Eingabe-Tokens, die nicht aufgelöst werden konnten |

View File

@@ -45,23 +45,3 @@ Integriert Google-Suche in den Workflow. Kann im Web suchen. Erfordert API-Schl
### `google_search`
Durchsuchen des Webs mit der Custom Search API
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `query` | string | Ja | Die auszuführende Suchanfrage |
| `searchEngineId` | string | Ja | Custom Search Engine ID |
| `num` | string | Nein | Anzahl der zurückzugebenden Ergebnisse \(Standard: 10, max: 10\) |
| `apiKey` | string | Ja | Google API-Schlüssel |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `items` | array | Array von Suchergebnissen von Google |
## Hinweise
- Kategorie: `tools`
- Typ: `google_search`

View File

@@ -176,3 +176,151 @@ Daten am Ende einer Google Sheets-Tabelle anhängen
- Kategorie: `tools`
- Typ: `google_sheets`
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `spreadsheetId` | string | Ja | Google Sheets-Tabellenkalkulations-ID |
| `includeGridData` | boolean | Nein | Ob Rasterdaten \(Zellwerte\) einbezogen werden sollen. Standardmäßig false. |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `spreadsheetId` | string | Die Tabellenkalkulations-ID |
| `title` | string | Der Titel der Tabellenkalkulation |
| `locale` | string | Das Gebietsschema der Tabellenkalkulation |
| `timeZone` | string | Die Zeitzone der Tabellenkalkulation |
| `spreadsheetUrl` | string | URL zur Tabellenkalkulation |
| `sheets` | array | Liste der Tabellenblätter in der Tabellenkalkulation |
| ↳ `sheetId` | number | Die Tabellenblatt-ID |
| ↳ `title` | string | Der Titel/Name des Tabellenblatts |
| ↳ `index` | number | Der Tabellenblatt-Index \(Position\) |
| ↳ `rowCount` | number | Anzahl der Zeilen im Tabellenblatt |
| ↳ `columnCount` | number | Anzahl der Spalten im Tabellenblatt |
| ↳ `hidden` | boolean | Ob das Tabellenblatt ausgeblendet ist |
### `google_sheets_create_spreadsheet`
Erstellt eine neue Google Sheets-Tabellenkalkulation
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `title` | string | Ja | Der Titel der neuen Tabellenkalkulation |
| `sheetTitles` | json | Nein | Array von Tabellenblattnamen, die erstellt werden sollen \(z. B. \["Tabelle1", "Daten", "Zusammenfassung"\]\). Standardmäßig ein einzelnes "Tabelle1". |
| `locale` | string | Nein | Das Gebietsschema der Tabellenkalkulation \(z. B. "de_DE"\) |
| `timeZone` | string | Nein | Die Zeitzone der Tabellenkalkulation \(z. B. "Europe/Berlin"\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `spreadsheetId` | string | Die ID der erstellten Tabellenkalkulation |
| `title` | string | Der Titel der erstellten Tabellenkalkulation |
| `spreadsheetUrl` | string | URL zur erstellten Tabellenkalkulation |
| `sheets` | array | Liste der in der Tabellenkalkulation erstellten Tabellenblätter |
| ↳ `sheetId` | number | Die Tabellenblatt-ID |
| ↳ `title` | string | Der Tabellenblatt-Titel/-Name |
| ↳ `index` | number | Der Tabellenblatt-Index \(Position\) |
### `google_sheets_batch_get`
Liest mehrere Bereiche aus einer Google Sheets-Tabellenkalkulation in einer einzigen Anfrage
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `spreadsheetId` | string | Ja | Google Sheets-Tabellenkalkulationskennung |
| `ranges` | json | Ja | Array von zu lesenden Bereichen \(z. B. \["Tabelle1!A1:D10", "Tabelle2!A1:B5"\]\). Jeder Bereich sollte den Tabellenblattnamen enthalten. |
| `majorDimension` | string | Nein | Die Hauptdimension der Werte: "ROWS" \(Standard\) oder "COLUMNS" |
| `valueRenderOption` | string | Nein | Wie Werte dargestellt werden sollen: "FORMATTED_VALUE" \(Standard\), "UNFORMATTED_VALUE" oder "FORMULA" |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `spreadsheetId` | string | Die Tabellenkalkulationskennung |
| `valueRanges` | array | Array von Wertebereichen, die aus der Tabellenkalkulation gelesen wurden |
| ↳ `range` | string | Der Bereich, der gelesen wurde |
| ↳ `majorDimension` | string | Hauptdimension \(ROWS oder COLUMNS\) |
| ↳ `values` | array | Die Zellwerte als 2D-Array |
| `metadata` | json | Tabellenkalkulationsmetadaten einschließlich ID und URL |
| ↳ `spreadsheetId` | string | Google Sheets-Tabellenkalkulationskennung |
| ↳ `spreadsheetUrl` | string | Tabellenkalkulations-URL |
### `google_sheets_batch_update`
Mehrere Bereiche in einer Google Sheets-Tabelle in einer einzigen Anfrage aktualisieren
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `spreadsheetId` | string | Ja | Google Sheets-Tabellen-ID |
| `data` | json | Ja | Array von Wertebereichen, die aktualisiert werden sollen. Jedes Element sollte "range" \(z. B. "Sheet1!A1:D10"\) und "values" \(2D-Array\) enthalten. |
| `valueInputOption` | string | Nein | Wie Eingabedaten interpretiert werden sollen: "RAW" oder "USER_ENTERED" \(Standard\). USER_ENTERED analysiert Formeln. |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `spreadsheetId` | string | Die Tabellen-ID |
| `totalUpdatedRows` | number | Gesamtanzahl der aktualisierten Zeilen |
| `totalUpdatedColumns` | number | Gesamtanzahl der aktualisierten Spalten |
| `totalUpdatedCells` | number | Gesamtanzahl der aktualisierten Zellen |
| `totalUpdatedSheets` | number | Gesamtanzahl der aktualisierten Tabellenblätter |
| `responses` | array | Array von Aktualisierungsantworten für jeden Bereich |
| ↳ `spreadsheetId` | string | Die Tabellen-ID |
| ↳ `updatedRange` | string | Der Bereich, der aktualisiert wurde |
| ↳ `updatedRows` | number | Anzahl der in diesem Bereich aktualisierten Zeilen |
| ↳ `updatedColumns` | number | Anzahl der in diesem Bereich aktualisierten Spalten |
| ↳ `updatedCells` | number | Anzahl der in diesem Bereich aktualisierten Zellen |
| `metadata` | json | Tabellenmetadaten einschließlich ID und URL |
| ↳ `spreadsheetId` | string | Google Sheets-Tabellen-ID |
| ↳ `spreadsheetUrl` | string | Tabellen-URL |
### `google_sheets_batch_clear`
Mehrere Bereiche in einer Google Sheets-Tabelle mit einer einzigen Anfrage löschen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | ----------- | ------------- |
| `spreadsheetId` | string | Ja | Google Sheets-Tabellen-ID |
| `ranges` | json | Ja | Array der zu löschenden Bereiche (z. B. ["Sheet1!A1:D10", "Sheet2!A1:B5"]). Jeder Bereich muss den Blattnamen enthalten. |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ------------- |
| `spreadsheetId` | string | Die Tabellen-ID |
| `clearedRanges` | array | Array der gelöschten Bereiche |
| `metadata` | json | Tabellenmetadaten einschließlich ID und URL |
| ↳ `spreadsheetId` | string | Google Sheets-Tabellen-ID |
| ↳ `spreadsheetUrl` | string | Tabellen-URL |
### `google_sheets_copy_sheet`
Ein Blatt von einer Tabelle in eine andere kopieren
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | ----------- | ------------- |
| `sourceSpreadsheetId` | string | Ja | Quell-Google-Sheets-Tabellen-ID |
| `sheetId` | number | Ja | Die ID des zu kopierenden Blatts (numerische ID, nicht der Blattname). Verwenden Sie "Get Spreadsheet", um Blatt-IDs zu finden. |
| `destinationSpreadsheetId` | string | Ja | Die ID der Zieltabelle, in die das Blatt kopiert wird |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ------------- |
| `sheetId` | number | Die ID des neu erstellten Blatts in der Zieltabelle |
| `title` | string | Der Titel des kopierten Blatts |
| `index` | number | Der Index (Position) des kopierten Blatts |
| `sheetType` | string | Der Typ des Blatts (GRID, CHART usw.) |
| `destinationSpreadsheetId` | string | Die ID der Zieltabelle |
| `destinationSpreadsheetUrl` | string | URL zur Zieltabelle |

View File

@@ -178,3 +178,171 @@ Ein Vorschaubild einer bestimmten Folie in einer Google Slides-Präsentation gen
- Kategorie: `tools`
- Typ: `google_slides`
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `presentationId` | string | Ja | Die ID der Präsentation |
| `pageObjectId` | string | Ja | Die Objekt-ID der Folie/Seite, die abgerufen werden soll |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `objectId` | string | Die Objekt-ID der Seite |
| `pageType` | string | Der Typ der Seite \(SLIDE, MASTER, LAYOUT, NOTES, NOTES_MASTER\) |
| `pageElements` | array | Array von Seitenelementen \(Formen, Bilder, Tabellen usw.\) auf dieser Seite |
| `slideProperties` | object | Eigenschaften, die spezifisch für Folien sind \(Layout, Master, Notizen\) |
| ↳ `layoutObjectId` | string | Objekt-ID des Layouts, auf dem diese Folie basiert |
| ↳ `masterObjectId` | string | Objekt-ID des Masters, auf dem diese Folie basiert |
| ↳ `notesPage` | json | Die Notizenseite, die mit der Folie verknüpft ist |
| `metadata` | object | Operationsmetadaten einschließlich Präsentations-ID und URL |
| ↳ `presentationId` | string | Die Präsentations-ID |
| ↳ `url` | string | URL zur Präsentation |
### `google_slides_delete_object`
Löschen Sie ein Seitenelement (Form, Bild, Tabelle usw.) oder eine gesamte Folie aus einer Google Slides-Präsentation
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `presentationId` | string | Ja | Die ID der Präsentation |
| `objectId` | string | Ja | Die Objekt-ID des Elements oder der Folie, das/die gelöscht werden soll |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `deleted` | boolean | Ob das Objekt erfolgreich gelöscht wurde |
| `objectId` | string | Die Objekt-ID, die gelöscht wurde |
| `metadata` | object | Operationsmetadaten einschließlich Präsentations-ID und URL |
| ↳ `presentationId` | string | Die Präsentations-ID |
| ↳ `url` | string | URL zur Präsentation |
### `google_slides_duplicate_object`
Dupliziert ein Objekt (Folie, Form, Bild, Tabelle usw.) in einer Google Slides-Präsentation
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `presentationId` | string | Ja | Google Slides-Präsentations-ID |
| `objectId` | string | Ja | Die Objekt-ID des zu duplizierenden Elements oder der Folie |
| `objectIds` | string | Nein | Optionales JSON-Objekt, das Quellobjekt-IDs (innerhalb der zu duplizierenden Folie) neuen Objekt-IDs für die Duplikate zuordnet. Format: \{"sourceId1":"newId1","sourceId2":"newId2"\} |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `duplicatedObjectId` | string | Die Objekt-ID des neu erstellten Duplikats |
| `metadata` | object | Operationsmetadaten einschließlich Präsentations-ID und Quellobjekt-ID |
| ↳ `presentationId` | string | Die Präsentations-ID |
| ↳ `sourceObjectId` | string | Die ursprüngliche Objekt-ID, die dupliziert wurde |
| ↳ `url` | string | URL zur Präsentation |
### `google_slides_update_slides_position`
Verschiebt eine oder mehrere Folien an eine neue Position in einer Google Slides-Präsentation
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `presentationId` | string | Ja | Die ID der Google Slides-Präsentation |
| `slideObjectIds` | string | Ja | Kommagetrennte Liste von Folienobjekt-IDs, die verschoben werden sollen. Die Folien behalten ihre relative Reihenfolge bei. |
| `insertionIndex` | number | Ja | Der nullbasierte Index, an den die Folien verschoben werden sollen. Alle Folien mit Indizes größer oder gleich diesem werden nach rechts verschoben. |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `moved` | boolean | Ob die Folien erfolgreich verschoben wurden |
| `slideObjectIds` | array | Die Folienobjekt-IDs, die verschoben wurden |
| `insertionIndex` | number | Der Index, an den die Folien verschoben wurden |
| `metadata` | object | Operationsmetadaten einschließlich Präsentations-ID und URL |
| ↳ `presentationId` | string | Die Präsentations-ID |
| ↳ `url` | string | URL zur Präsentation |
### `google_slides_create_table`
Erstellt eine neue Tabelle auf einer Folie in einer Google Slides-Präsentation
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `presentationId` | string | Ja | Die ID der Google Slides-Präsentation |
| `pageObjectId` | string | Ja | Die Objekt-ID der Folie/Seite, zu der die Tabelle hinzugefügt werden soll |
| `rows` | number | Ja | Anzahl der Zeilen in der Tabelle \(mindestens 1\) |
| `columns` | number | Ja | Anzahl der Spalten in der Tabelle \(mindestens 1\) |
| `width` | number | Nein | Breite der Tabelle in Punkten \(Standard: 400\) |
| `height` | number | Nein | Höhe der Tabelle in Punkten \(Standard: 200\) |
| `positionX` | number | Nein | X-Position vom linken Rand in Punkten \(Standard: 100\) |
| `positionY` | number | Nein | Y-Position vom oberen Rand in Punkten \(Standard: 100\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `tableId` | string | Die Objekt-ID der neu erstellten Tabelle |
| `rows` | number | Anzahl der Zeilen in der Tabelle |
| `columns` | number | Anzahl der Spalten in der Tabelle |
| `metadata` | object | Operationsmetadaten einschließlich Präsentations-ID und Seitenobjekt-ID |
| ↳ `presentationId` | string | Die Präsentations-ID |
| ↳ `pageObjectId` | string | Die Seitenobjekt-ID, auf der die Tabelle erstellt wurde |
| ↳ `url` | string | URL zur Präsentation |
### `google_slides_create_shape`
Erstellt eine Form (Rechteck, Ellipse, Textfeld, Pfeil usw.) auf einer Folie in einer Google Slides-Präsentation
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `presentationId` | string | Ja | Die ID der Google Slides-Präsentation |
| `pageObjectId` | string | Ja | Die Objekt-ID der Folie/Seite, zu der die Form hinzugefügt werden soll |
| `shapeType` | string | Ja | Der Typ der zu erstellenden Form. Gängige Typen: TEXT_BOX, RECTANGLE, ROUND_RECTANGLE, ELLIPSE, TRIANGLE, DIAMOND, STAR_5, ARROW_EAST, HEART, CLOUD |
| `width` | number | Nein | Breite der Form in Punkten \(Standard: 200\) |
| `height` | number | Nein | Höhe der Form in Punkten \(Standard: 100\) |
| `positionX` | number | Nein | X-Position vom linken Rand in Punkten \(Standard: 100\) |
| `positionY` | number | Nein | Y-Position vom oberen Rand in Punkten \(Standard: 100\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `shapeId` | string | Die Objekt-ID der neu erstellten Form |
| `shapeType` | string | Der Typ der Form, die erstellt wurde |
| `metadata` | object | Operationsmetadaten einschließlich Präsentations-ID und Seitenobjekt-ID |
| ↳ `presentationId` | string | Die Präsentations-ID |
| ↳ `pageObjectId` | string | Die Seitenobjekt-ID, auf der die Form erstellt wurde |
| ↳ `url` | string | URL zur Präsentation |
### `google_slides_insert_text`
Fügt Text in eine Form oder Tabellenzelle in einer Google Slides-Präsentation ein. Verwenden Sie dies, um Text zu Textfeldern, Formen oder Tabellenzellen hinzuzufügen.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `presentationId` | string | Ja | Google Slides-Präsentations-ID |
| `objectId` | string | Ja | Die Objekt-ID der Form oder Tabellenzelle, in die Text eingefügt werden soll. Verwenden Sie für Tabellenzellen die Zellobjekt-ID. |
| `text` | string | Ja | Der einzufügende Text |
| `insertionIndex` | number | Nein | Der nullbasierte Index, an dem der Text eingefügt werden soll. Wenn nicht angegeben, wird der Text am Anfang eingefügt \(Index 0\). |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `inserted` | boolean | Ob der Text erfolgreich eingefügt wurde |
| `objectId` | string | Die Objekt-ID, in die der Text eingefügt wurde |
| `text` | string | Der Text, der eingefügt wurde |
| `metadata` | object | Operationsmetadaten einschließlich Präsentations-ID und URL |
| ↳ `presentationId` | string | Die Präsentations-ID |
| ↳ `url` | string | URL zur Präsentation |

View File

@@ -159,3 +159,17 @@ Fälle auflisten oder einen bestimmten Fall abrufen, wenn matterId angegeben ist
- Kategorie: `tools`
- Typ: `google_vault`
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `pageSize` | number | Nein | Anzahl der Angelegenheiten, die pro Seite zurückgegeben werden sollen |
| `pageToken` | string | Nein | Token für Paginierung |
| `matterId` | string | Nein | Optionale Angelegenheits-ID zum Abrufen einer bestimmten Angelegenheit \(z. B. "12345678901234567890"\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `matters` | json | Array von Angelegenheitsobjekten |
| `matter` | json | Einzelnes Angelegenheitsobjekt \(wenn matterId angegeben ist\) |
| `nextPageToken` | string | Token zum Abrufen der nächsten Ergebnisseite |

View File

@@ -497,8 +497,3 @@ Einen neuen Ordner in Grafana erstellen
| `updatedBy` | string | Benutzername desjenigen, der den Ordner zuletzt aktualisiert hat |
| `updated` | string | Zeitstempel, wann der Ordner zuletzt aktualisiert wurde |
| `version` | number | Versionsnummer des Ordners |
## Notizen
- Kategorie: `tools`
- Typ: `grafana`

View File

@@ -211,8 +211,3 @@ Einen Webhook anhand der ID löschen
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | True, wenn der Webhook erfolgreich gelöscht wurde |
## Hinweise
- Kategorie: `tools`
- Typ: `grain`

View File

@@ -129,8 +129,3 @@ Durchsuchen Sie Repositories in natürlicher Sprache und erhalten Sie relevante
| `numFiles` | number | Gesamtanzahl der Dateien im Repository |
| `sampleQuestions` | array | Beispielfragen für das indexierte Repository |
| `sha` | string | Git-Commit-SHA der indexierten Version |
## Hinweise
- Kategorie: `tools`
- Typ: `greptile`

View File

@@ -287,8 +287,3 @@ Alle Deals vom HubSpot-Konto mit Paginierungsunterstützung abrufen
| `paging` | object | Paginierungsinformationen |
| `metadata` | object | Operationsmetadaten |
| `success` | boolean | Erfolgsstatus der Operation |
## Hinweise
- Kategorie: `tools`
- Typ: `hubspot`

View File

@@ -51,8 +51,3 @@ Generate completions using Hugging Face Inference API
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Chat completion results |
## Notes
- Category: `tools`
- Type: `huggingface`

View File

@@ -185,8 +185,3 @@ Gibt die Gesamtzahl der für eine Domain oder ein Unternehmen gefundenen E-Mail-
| `generic_emails` | number | Anzahl der gefundenen generischen E-Mail-Adressen |
| `department` | object | Aufschlüsselung der E-Mail-Adressen nach Abteilung (Geschäftsführung, IT, Finanzen, Management, Vertrieb, Recht, Support, HR, Marketing, Kommunikation) |
| `seniority` | object | Aufschlüsselung der E-Mail-Adressen nach Hierarchieebene (Junior, Senior, Führungskraft) |
## Notizen
- Kategorie: `tools`
- Typ: `hunter`

View File

@@ -55,8 +55,3 @@ Bilder mit OpenAI generieren
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Generierte Bilddaten |
## Hinweise
- Kategorie: `tools`
- Typ: `image_generator`

View File

@@ -29,8 +29,3 @@ Mit Sim gibt Ihnen die IMAP-Integration die Möglichkeit, E-Mails in eine handlu
## Nutzungsanleitung
Verbinden Sie sich über das IMAP-Protokoll mit jedem E-Mail-Server, um Workflows auszulösen, wenn neue E-Mails empfangen werden. Unterstützt Gmail, Outlook, Yahoo und jeden anderen IMAP-kompatiblen E-Mail-Anbieter.
## Hinweise
- Kategorie: `triggers`
- Typ: `imap`

View File

@@ -836,8 +836,3 @@ Einen Eskalationspfad in incident.io löschen
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `message` | string | Erfolgsmeldung |
## Hinweise
- Kategorie: `tools`
- Typ: `incidentio`

View File

@@ -358,3 +358,370 @@ Eine neue vom Administrator initiierte Nachricht in Intercom erstellen und sende
- Kategorie: `tools`
- Typ: `intercom`
Erstellen und senden Sie eine neue, vom Administrator initiierte Nachricht in Intercom. Gibt nur API-konforme Felder zurück.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `message_type` | string | Ja | Nachrichtentyp: "inapp" für In-App-Nachrichten oder "email" für E-Mail-Nachrichten |
| `template` | string | Ja | Nachrichtenvorlagenstil: "plain" für einfachen Text oder "personal" für personalisierten Stil |
| `subject` | string | Nein | Der Betreff der Nachricht \(für E-Mail-Typ\) |
| `body` | string | Ja | Der Inhalt der Nachricht |
| `from_type` | string | Ja | Absendertyp: "admin" |
| `from_id` | string | Ja | Die ID des Administrators, der die Nachricht sendet |
| `to_type` | string | Ja | Empfängertyp: "contact" |
| `to_id` | string | Ja | Die ID des Kontakts, der die Nachricht erhält |
| `created_at` | number | Nein | Unix-Zeitstempel für den Zeitpunkt der Nachrichtenerstellung. Wenn nicht angegeben, wird die aktuelle Zeit verwendet. |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `message` | object | Erstelltes Nachrichtenobjekt |
| ↳ `id` | string | Eindeutige Kennung für die Nachricht |
| ↳ `type` | string | Objekttyp \(message\) |
| ↳ `created_at` | number | Unix-Zeitstempel der Nachrichtenerstellung |
| ↳ `body` | string | Inhalt der Nachricht |
| ↳ `message_type` | string | Typ der Nachricht \(in_app oder email\) |
| ↳ `conversation_id` | string | ID der erstellten Konversation |
| ↳ `owner` | object | Eigentümer der Nachricht |
| `messageId` | string | ID der erstellten Nachricht |
| `success` | boolean | Status des Vorgangserfolgs |
### `intercom_list_admins`
Eine Liste aller Administratoren für den Workspace abrufen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `admins` | array | Array von Administrator-Objekten |
| ↳ `id` | string | Eindeutige Kennung für den Administrator |
| ↳ `type` | string | Objekttyp \(admin\) |
| ↳ `name` | string | Name des Administrators |
| ↳ `email` | string | E-Mail des Administrators |
| ↳ `job_title` | string | Berufsbezeichnung des Administrators |
| ↳ `away_mode_enabled` | boolean | Ob der Administrator im Abwesenheitsmodus ist |
| ↳ `away_mode_reassign` | boolean | Ob Konversationen bei Abwesenheit neu zugewiesen werden sollen |
| ↳ `has_inbox_seat` | boolean | Ob der Administrator einen bezahlten Posteingangsplatz hat |
| ↳ `team_ids` | array | Liste der Team-IDs, denen der Administrator angehört |
| ↳ `avatar` | object | Avatar-Informationen |
| ↳ `email_verified` | boolean | Ob die E-Mail verifiziert ist |
| `type` | string | Objekttyp \(admin.list\) |
### `intercom_close_conversation`
Eine Konversation in Intercom schließen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `conversationId` | string | Ja | Die ID der zu schließenden Konversation |
| `admin_id` | string | Ja | Die ID des Administrators, der die Aktion ausführt |
| `body` | string | Nein | Optionale Abschlussnachricht, die zur Konversation hinzugefügt werden soll |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `conversation` | object | Das geschlossene Konversationsobjekt |
| ↳ `id` | string | Eindeutige Kennung für die Konversation |
| ↳ `type` | string | Objekttyp \(conversation\) |
| ↳ `state` | string | Status der Konversation \(closed\) |
| ↳ `open` | boolean | Ob die Konversation offen ist \(false\) |
| ↳ `read` | boolean | Ob die Konversation gelesen wurde |
| ↳ `created_at` | number | Unix-Zeitstempel, wann die Konversation erstellt wurde |
| ↳ `updated_at` | number | Unix-Zeitstempel, wann die Konversation zuletzt aktualisiert wurde |
| `conversationId` | string | ID der geschlossenen Konversation |
| `state` | string | Status der Konversation \(closed\) |
### `intercom_open_conversation`
Eine geschlossene oder schlummernde Konversation in Intercom öffnen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `conversationId` | string | Ja | Die ID der zu öffnenden Konversation |
| `admin_id` | string | Ja | Die ID des Administrators, der die Aktion ausführt |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `conversation` | object | Das geöffnete Konversationsobjekt |
| ↳ `id` | string | Eindeutige Kennung für die Konversation |
| ↳ `type` | string | Objekttyp \(conversation\) |
| ↳ `state` | string | Status der Konversation \(open\) |
| ↳ `open` | boolean | Ob die Konversation offen ist \(true\) |
| ↳ `read` | boolean | Ob die Konversation gelesen wurde |
| ↳ `created_at` | number | Unix-Zeitstempel, wann die Konversation erstellt wurde |
| ↳ `updated_at` | number | Unix-Zeitstempel, wann die Konversation zuletzt aktualisiert wurde |
| `conversationId` | string | ID der geöffneten Konversation |
| `state` | string | Status der Konversation \(open\) |
### `intercom_snooze_conversation`
Eine Konversation schlummern lassen, um sie zu einem späteren Zeitpunkt wieder zu öffnen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `conversationId` | string | Ja | Die ID der Konversation, die schlummern soll |
| `admin_id` | string | Ja | Die ID des Administrators, der die Aktion ausführt |
| `snoozed_until` | number | Ja | Unix-Zeitstempel für den Zeitpunkt, zu dem die Konversation wieder geöffnet werden soll |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `conversation` | object | Das schlummernde Konversationsobjekt |
| ↳ `id` | string | Eindeutige Kennung für die Konversation |
| ↳ `type` | string | Objekttyp \(conversation\) |
| ↳ `state` | string | Status der Konversation \(snoozed\) |
| ↳ `open` | boolean | Ob die Konversation offen ist |
| ↳ `snoozed_until` | number | Unix-Zeitstempel, wann die Konversation wieder geöffnet wird |
| ↳ `created_at` | number | Unix-Zeitstempel, wann die Konversation erstellt wurde |
| ↳ `updated_at` | number | Unix-Zeitstempel, wann die Konversation zuletzt aktualisiert wurde |
| `conversationId` | string | ID der schlummernden Konversation |
| `state` | string | Status der Konversation \(snoozed\) |
| `snoozed_until` | number | Unix-Zeitstempel, wann die Konversation wieder geöffnet wird |
### `intercom_assign_conversation`
Eine Konversation einem Administrator oder Team in Intercom zuweisen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `conversationId` | string | Ja | Die ID der Konversation, die zugewiesen werden soll |
| `admin_id` | string | Ja | Die ID des Administrators, der die Zuweisung durchführt |
| `assignee_id` | string | Ja | Die ID des Administrators oder Teams, dem die Konversation zugewiesen werden soll. Auf "0" setzen, um die Zuweisung aufzuheben. |
| `body` | string | Nein | Optionale Nachricht, die beim Zuweisen hinzugefügt werden kann \(z. B. "Übergabe an das Support-Team"\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `conversation` | object | Das zugewiesene Konversationsobjekt |
| ↳ `id` | string | Eindeutige Kennung für die Konversation |
| ↳ `type` | string | Objekttyp \(conversation\) |
| ↳ `state` | string | Status der Konversation |
| ↳ `open` | boolean | Ob die Konversation offen ist |
| ↳ `admin_assignee_id` | number | ID des zugewiesenen Administrators |
| ↳ `team_assignee_id` | string | ID des zugewiesenen Teams |
| ↳ `created_at` | number | Unix-Zeitstempel, wann die Konversation erstellt wurde |
| ↳ `updated_at` | number | Unix-Zeitstempel, wann die Konversation zuletzt aktualisiert wurde |
| `conversationId` | string | ID der zugewiesenen Konversation |
| `admin_assignee_id` | number | ID des zugewiesenen Administrators |
| `team_assignee_id` | string | ID des zugewiesenen Teams |
### `intercom_list_tags`
Eine Liste aller Tags im Workspace abrufen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `tags` | array | Array von Tag-Objekten |
| ↳ `id` | string | Eindeutige Kennung für den Tag |
| ↳ `type` | string | Objekttyp \(tag\) |
| ↳ `name` | string | Name des Tags |
| `type` | string | Objekttyp \(list\) |
### `intercom_create_tag`
Ein neues Tag erstellen oder einen bestehenden Tag-Namen aktualisieren
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `name` | string | Ja | Der Name des Tags. Erstellt ein neues Tag, falls nicht gefunden, oder aktualisiert den Namen, wenn eine ID angegeben ist. |
| `id` | string | Nein | Die ID eines bestehenden Tags zum Aktualisieren. Weglassen, um ein neues Tag zu erstellen. |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `id` | string | Eindeutige Kennung für das Tag |
| `name` | string | Name des Tags |
| `type` | string | Objekttyp \(tag\) |
### `intercom_tag_contact`
Einem bestimmten Kontakt ein Tag hinzufügen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `contactId` | string | Ja | Die ID des Kontakts, der getaggt werden soll |
| `tagId` | string | Ja | Die ID des anzuwendenden Tags |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `id` | string | Eindeutige Kennung für das Tag |
| `name` | string | Name des Tags |
| `type` | string | Objekttyp \(tag\) |
### `intercom_untag_contact`
Ein Tag von einem bestimmten Kontakt entfernen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `contactId` | string | Ja | Die ID des Kontakts, dessen Tag entfernt werden soll |
| `tagId` | string | Ja | Die ID des zu entfernenden Tags |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `id` | string | Eindeutige Kennung für das entfernte Tag |
| `name` | string | Name des entfernten Tags |
| `type` | string | Objekttyp \(tag\) |
### `intercom_tag_conversation`
Ein Tag zu einer bestimmten Konversation hinzufügen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `conversationId` | string | Ja | Die ID der zu markierenden Konversation |
| `tagId` | string | Ja | Die ID des anzuwendenden Tags |
| `admin_id` | string | Ja | Die ID des Administrators, der das Tag anwendet |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `id` | string | Eindeutige Kennung für das Tag |
| `name` | string | Name des Tags |
| `type` | string | Objekttyp \(tag\) |
### `intercom_create_note`
Eine Notiz zu einem bestimmten Kontakt hinzufügen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `contactId` | string | Ja | Die ID des Kontakts, zu dem die Notiz hinzugefügt werden soll |
| `body` | string | Ja | Der Textinhalt der Notiz |
| `admin_id` | string | Nein | Die ID des Administrators, der die Notiz erstellt |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `id` | string | Eindeutige Kennung für die Notiz |
| `body` | string | Der Textinhalt der Notiz |
| `created_at` | number | Unix-Zeitstempel, wann die Notiz erstellt wurde |
| `type` | string | Objekttyp \(note\) |
| `author` | object | Der Administrator, der die Notiz erstellt hat |
| ↳ `type` | string | Autorentyp \(admin\) |
| ↳ `id` | string | Autoren-ID |
| ↳ `name` | string | Autorenname |
| ↳ `email` | string | Autoren-E-Mail |
| `contact` | object | Der Kontakt, für den die Notiz erstellt wurde |
| ↳ `type` | string | Kontakttyp |
| ↳ `id` | string | Kontakt-ID |
### `intercom_create_event`
Ein benutzerdefiniertes Ereignis für einen Kontakt in Intercom verfolgen
#### Input
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `event_name` | string | Ja | Der Name des Ereignisses \(z. B. "order-completed"\). Verwenden Sie das Format Verb-Nomen in der Vergangenheitsform für bessere Lesbarkeit. |
| `created_at` | number | Nein | Unix-Zeitstempel für den Zeitpunkt, zu dem das Ereignis aufgetreten ist. Wird dringend empfohlen für Eindeutigkeit. |
| `user_id` | string | Nein | Ihre Kennung für den Benutzer \(external_id\) |
| `email` | string | Nein | E-Mail-Adresse des Benutzers. Verwenden Sie dies nur, wenn Ihre App E-Mail zur eindeutigen Identifizierung von Benutzern verwendet. |
| `id` | string | Nein | Die Intercom-Kontakt-ID |
| `metadata` | string | Nein | JSON-Objekt mit bis zu 10 Metadaten-Schlüssel-Wert-Paaren über das Ereignis \(z. B. \{"order_value": 99.99\}\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `accepted` | boolean | Ob das Ereignis akzeptiert wurde \(202 Accepted\) |
### `intercom_attach_contact_to_company`
Einen Kontakt mit einem Unternehmen in Intercom verknüpfen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `contactId` | string | Ja | Die ID des Kontakts, der mit dem Unternehmen verknüpft werden soll |
| `companyId` | string | Ja | Die ID des Unternehmens, mit dem der Kontakt verknüpft werden soll |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `company` | object | Das Unternehmensobjekt, mit dem der Kontakt verknüpft wurde |
| ↳ `id` | string | Eindeutige Kennung für das Unternehmen |
| ↳ `type` | string | Objekttyp \(company\) |
| ↳ `company_id` | string | Die von Ihnen definierte company_id |
| ↳ `name` | string | Name des Unternehmens |
| ↳ `created_at` | number | Unix-Zeitstempel, wann das Unternehmen erstellt wurde |
| ↳ `updated_at` | number | Unix-Zeitstempel, wann das Unternehmen aktualisiert wurde |
| ↳ `user_count` | number | Anzahl der Benutzer im Unternehmen |
| ↳ `session_count` | number | Anzahl der Sitzungen |
| ↳ `monthly_spend` | number | Monatlicher Umsatzbetrag |
| ↳ `plan` | object | Details zum Unternehmensplan |
| `companyId` | string | ID des Unternehmens |
| `name` | string | Name des Unternehmens |
### `intercom_detach_contact_from_company`
Einen Kontakt von einem Unternehmen in Intercom entfernen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `contactId` | string | Ja | Die ID des Kontakts, der vom Unternehmen getrennt werden soll |
| `companyId` | string | Ja | Die ID des Unternehmens, von dem der Kontakt getrennt werden soll |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `company` | object | Das Unternehmensobjekt, von dem der Kontakt getrennt wurde |
| ↳ `id` | string | Eindeutige Kennung für das Unternehmen |
| ↳ `type` | string | Objekttyp \(company\) |
| ↳ `company_id` | string | Die von Ihnen definierte company_id |
| ↳ `name` | string | Name des Unternehmens |
| `companyId` | string | ID des Unternehmens |
| `name` | string | Name des Unternehmens |

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