Compare commits

...

34 Commits

Author SHA1 Message Date
Waleed
ebef5f3a27 v0.5.20: google slides, ui fixes, subflow resizing improvements 2025-12-06 15:36:09 -08:00
Waleed
7bfc6ebe48 fix(copilot): fixed copilot code component overflowing gutter (#2230) 2025-12-06 15:20:41 -08:00
Vikhyath Mondreti
23ef39de72 improvement(ui): revert settings > envvar ui (#2227) 2025-12-06 14:26:39 -08:00
Waleed
507fc112be feat(admin): added more billing, subscriptions, and organization admin API routes (#2225)
* feat(admin): added more billing, subscriptions, and organization admin API routes

* cleanup

* ack PR comments

* cleanup

* ack PR comment
2025-12-06 14:13:50 -08:00
Waleed
26670e289d fix(hosted): fixed hosted providers to exact string match model names rather than check provider names (#2228) 2025-12-06 13:33:34 -08:00
Waleed
e52bd575e7 feat(i18n): update translations (#2226)
Co-authored-by: waleedlatif1 <waleedlatif1@users.noreply.github.com>
2025-12-06 13:33:00 -08:00
Emir Karabeg
0b28128f25 feat(tools): google slides tool, terminal console virtualization, tool fixes (#2209)
* feat: google slides tool

* fix oauth for slides, add remaining endpoints, update docs

* optimize json dump viewer using react window

* change slides to use google drive credentials

* fix some tools

* ack PR comments

---------

Co-authored-by: waleed <walif6@gmail.com>
Co-authored-by: Vikhyath Mondreti <vikhyath@simstudio.ai>
2025-12-06 12:16:21 -08:00
Vikhyath Mondreti
a50edf8131 fix(autolayout): subflow calculation (#2223)
* fix(autolayout): subflow calculation

* cleanup code

* fix missing import

* add back missing import
2025-12-05 16:31:10 -08:00
Vikhyath Mondreti
12c4c2d44f v0.5.19: copilot fix 2025-12-05 15:27:31 -08:00
Siddharth Ganesan
656dfafb8f fix(copilot): fix function execute tool (#2222) 2025-12-05 15:19:39 -08:00
Siddharth Ganesan
9f604f379e fix(copilot): fix tool call flash (#2221)
* Fix copilot tool call flash

* Fix lint
2025-12-05 15:12:35 -08:00
Siddharth Ganesan
75da06adf8 fix(copilot): fix hanging tool calls (#2218) 2025-12-05 14:59:38 -08:00
Vikhyath Mondreti
929a352edb fix(build): added trigger.dev sdk mock to tests (#2216) 2025-12-05 14:26:50 -08:00
Vikhyath Mondreti
c7b473f55f fix(build): added trigger.dev sdk mock to tests (#2216) 2025-12-05 14:24:52 -08:00
Vikhyath Mondreti
6cd078b0fe v0.5.18: ui fixes, nextjs16, workspace notifications, admin APIs, loading improvements, new slack tools 2025-12-05 14:03:09 -08:00
Vikhyath Mondreti
fb4c9827f8 fix(custom-bot-slack): dependsOn incorrectly set for bot_token (#2214)
* fix(custom-bot-slack): dependsOn incorrectly set for bot_token"

* fix other references to be compatible

* fix dependsOn for things depending on authMethod"
2025-12-05 13:54:52 -08:00
Siddharth Ganesan
4fd5f0051f fix(copilot): validation (#2215)
* Fix validation error

* Fix lint
2025-12-05 13:46:50 -08:00
Waleed
002713ec4b feat(i18n): update translations (#2208)
Co-authored-by: icecrasher321 <icecrasher321@users.noreply.github.com>
2025-12-05 13:29:44 -08:00
Waleed
5d6c1f7b88 feat(tools): added more slack tools (#2212) 2025-12-05 13:22:35 -08:00
Siddharth Ganesan
7752beac01 fix(import): fix array errors on import/export (#2211)
* Fix import/export

* Remove copilot gdrive tools

* Null

* Fix lint

* Add copilot validation

* Fix validation
2025-12-05 13:07:01 -08:00
Emir Karabeg
7101dc58d4 improvement: loading, optimistic actions (#2193)
* improvement: loading, optimistic operations

* improvement: folders update

* fix usage indicator rounding + new tsconfig

* remove redundant checks

* fix hmr case for missing workflow loads

* add abstraction for zustand/react hybrid optimism

* remove comments

---------

Co-authored-by: Vikhyath Mondreti <vikhyath@simstudio.ai>
2025-12-05 13:01:12 -08:00
Siddharth Ganesan
58251e28e6 feat(copilot): superagent (#2201)
* Superagent poc

* Checkpoint brokeN

* tool call rag

* Fix

* Fixes

* Improvements

* Creds stuff

* Fix

* Fix tools

* Fix stream

* Prompt

* Update sheets descriptions

* Better

* Copilot components

* Delete stuff

* Remove db migration

* Fix migrations

* Fix things

* Copilot side superagent

* Build workflow from chat

* Combine superagent into copilkot

* Render tools

* Function execution

* Max mode indicators

* Tool call confirmations

* Credential settings

* Remove betas

* Bump version

* Dropdown options in block metadata

* Copilot kb tools

* Fix lint

* Credentials modal

* Fix lint

* Cleanup

* Env var resolution in superagent tools

* Get id for workflow vars

* Fix insert into subflow

* Fix executor for while and do while loops

* Fix metadata for parallel

* Remove db migration

* Rebase

* Add migrations back

* Clean up code

* Fix executor logic issue

* Cleanup

* Diagram tool

* Fix tool naems

* Comment out g3p

* Remove popup option

* Hide o3

* Remove db migration

* Fix merge conflicts

* Fix lint

* Fix tests

* Remove webhook change

* Remove cb change

* Fix lint

* Fix

* Fix lint

* Fix build

* comment out gemini

* Add gemini back

* Remove bad test

* Fix

* Fix test

* Fix

* Nuke bad test

* Fix lint

---------

Co-authored-by: Vikhyath Mondreti <vikhyathvikku@gmail.com>
Co-authored-by: Waleed <walif6@gmail.com>
Co-authored-by: waleedlatif1 <waleedlatif1@users.noreply.github.com>
2025-12-04 21:26:18 -08:00
Vikhyath Mondreti
8ef9a45125 fix(env-vars): refactor for workspace/personal env vars to work with server side execution correctly (#2197)
* fix(env-var-resolution): new executor env var resolution changes

* add sessionuser id"

* cleanup code

* add doc update

* fix build

* fix client session pass through"

* add type change

* fix env var with hitl

* fix types
2025-12-04 21:08:20 -08:00
Waleed
ca818a6503 feat(admin): added admin APIs for admin management (#2206) 2025-12-04 20:52:32 -08:00
Waleed
1b903f2db5 fix(images): updated helm charts with branding URL guidance, removed additional nextjs image optimizations (#2205) 2025-12-04 19:39:51 -08:00
Waleed
414a54c358 feat(i18n): update translations (#2204)
Co-authored-by: icecrasher321 <icecrasher321@users.noreply.github.com>
2025-12-04 19:03:03 -08:00
Vikhyath Mondreti
3b9f0f9ce2 feat(error-notifications): workspace-level configuration of slack, email, webhook notifications for workflow execution (#2157)
* feat(notification): slack, email, webhook notifications from logs

* retain search params for filters to link in notification

* add alerting rules

* update selector

* fix lint

* add limits on num of emails and notification triggers per workspace

* address greptile comments

* add search to combobox

* move notifications to react query

* fix lint

* fix email formatting

* add more alert types

* fix imports

* fix test route

* use emcn componentfor modal

* refactor: consolidate notification config fields into jsonb objects

* regen migration

* fix delete notif modal ui

* make them multiselect dropdowns

* update tag styling

* combobox font size with multiselect tags'
2025-12-04 18:29:22 -08:00
Waleed
dcbdcb43aa chore(deps): upgrade to nextjs 16 (#2203)
* chore(deps): upgrade to nextjs 16

* upgraded fumadocs

* ensure vercel uses bun

* fix build

* fix bui;d

* remove redundant vercel.json
2025-12-04 17:55:37 -08:00
Emir Karabeg
1642ed754b improvement: modal UI (#2202)
* fix: trigger-save delete modal

* improvement: old modal styling
2025-12-04 17:10:59 -08:00
Vikhyath Mondreti
d22b5783be fix(enterprise-plan): seats should be taken from metadata (#2200)
* fix(enterprise): seats need to be picked up from metadata not column

* fix env var access

* fix user avatar
2025-12-04 16:22:29 -08:00
Waleed
8e7d8c93e3 fix(profile-pics): remove sharp dependency for serving profile pics in settings (#2199) 2025-12-04 15:46:10 -08:00
Waleed
ca3eb5b5a5 fix(subscription): fixed text clipping on subscription panel (#2198) 2025-12-04 15:12:50 -08:00
Waleed
dc5a2b1ad1 fix(envvar): fix envvar dropdown positioning, remove dead code (#2196) 2025-12-04 14:35:25 -08:00
Waleed
3f84ed9b72 fix(settings): fix long description on wordpress integration (#2195) 2025-12-04 14:10:50 -08:00
349 changed files with 38507 additions and 7980 deletions

View File

@@ -1,4 +1,4 @@
import { findNeighbour } from 'fumadocs-core/server'
import { findNeighbour } from 'fumadocs-core/page-tree'
import defaultMdxComponents from 'fumadocs-ui/mdx'
import { DocsBody, DocsDescription, DocsPage, DocsTitle } from 'fumadocs-ui/page'
import { ChevronLeft, ChevronRight } from 'lucide-react'
@@ -186,9 +186,6 @@ export default async function Page(props: { params: Promise<{ slug?: string[]; l
footer: <TOCFooter />,
single: false,
}}
article={{
className: 'scroll-smooth max-sm:pb-16',
}}
tableOfContentPopover={{
style: 'clerk',
enabled: true,

View File

@@ -1,7 +1,7 @@
'use client'
import { type ReactNode, useEffect, useState } from 'react'
import type { PageTree } from 'fumadocs-core/server'
import type { Folder, Item, Separator } from 'fumadocs-core/page-tree'
import { ChevronRight } from 'lucide-react'
import Link from 'next/link'
import { usePathname } from 'next/navigation'
@@ -11,7 +11,7 @@ function isActive(url: string, pathname: string, nested = true): boolean {
return url === pathname || (nested && pathname.startsWith(`${url}/`))
}
export function SidebarItem({ item }: { item: PageTree.Item }) {
export function SidebarItem({ item }: { item: Item }) {
const pathname = usePathname()
const active = isActive(item.url, pathname, false)
@@ -33,15 +33,7 @@ export function SidebarItem({ item }: { item: PageTree.Item }) {
)
}
export function SidebarFolder({
item,
level,
children,
}: {
item: PageTree.Folder
level: number
children: ReactNode
}) {
export function SidebarFolder({ item, children }: { item: Folder; children: ReactNode }) {
const pathname = usePathname()
const hasActiveChild = checkHasActiveChild(item, pathname)
const [open, setOpen] = useState(hasActiveChild)
@@ -112,7 +104,7 @@ export function SidebarFolder({
)
}
export function SidebarSeparator({ item }: { item: PageTree.Separator }) {
export function SidebarSeparator({ item }: { item: Separator }) {
return (
<p className='mt-4 mb-1.5 px-2.5 font-semibold text-[10px] text-gray-500/80 uppercase tracking-wide dark:text-gray-500'>
{item.name}
@@ -120,7 +112,7 @@ export function SidebarSeparator({ item }: { item: PageTree.Separator }) {
)
}
function checkHasActiveChild(node: PageTree.Folder, pathname: string): boolean {
function checkHasActiveChild(node: Folder, pathname: string): boolean {
if (node.index && isActive(node.index.url, pathname)) {
return true
}

View File

@@ -696,8 +696,8 @@ export function GrafanaIcon(props: SVGProps<SVGSVGElement>) {
y2='5.356'
gradientUnits='userSpaceOnUse'
>
<stop stop-color='#FFF200' />
<stop offset='1' stop-color='#F15A29' />
<stop stopColor='#FFF200' />
<stop offset='1' stopColor='#F15A29' />
</linearGradient>
</defs>
</svg>
@@ -1084,6 +1084,27 @@ export function GoogleDocsIcon(props: SVGProps<SVGSVGElement>) {
)
}
export function GoogleSlidesIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg
{...props}
xmlns='http://www.w3.org/2000/svg'
viewBox='0 0 48 48'
width='96px'
height='96px'
>
<path
fill='#FFC107'
d='M37,45H11c-1.657,0-3-1.343-3-3V6c0-1.657,1.343-3,3-3h19l10,10v29C40,43.657,38.657,45,37,45z'
/>
<path fill='#FFECB3' d='M40 13L30 13 30 3z' />
<path fill='#FFA000' d='M30 13L40 23 40 13z' />
<path fill='#FFF8E1' d='M14 21H34V35H14z' />
<path fill='#FFA000' d='M16 23H32V26H16zM16 28H28V30H16z' />
</svg>
)
}
export function GoogleCalendarIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg
@@ -2757,111 +2778,19 @@ export function MicrosoftSharepointIcon(props: SVGProps<SVGSVGElement>) {
export function MicrosoftPlannerIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg
{...props}
xmlnsXlink='http://www.w3.org/1999/xlink'
viewBox='0 0 24 24'
fill='none'
xmlns='http://www.w3.org/2000/svg'
>
<g clipPath='url(#msplanner_clip0)'>
<path
d='M8.25809 15.7412C7.22488 16.7744 5.54971 16.7744 4.5165 15.7412L0.774909 11.9996C-0.258303 10.9664 -0.258303 9.29129 0.774908 8.25809L4.5165 4.51655C5.54971 3.48335 7.22488 3.48335 8.25809 4.51655L11.9997 8.2581C13.0329 9.29129 13.0329 10.9664 11.9997 11.9996L8.25809 15.7412Z'
fill='url(#msplanner_paint0_linear)'
/>
<path
d='M8.25809 15.7412C7.22488 16.7744 5.54971 16.7744 4.5165 15.7412L0.774909 11.9996C-0.258303 10.9664 -0.258303 9.29129 0.774908 8.25809L4.5165 4.51655C5.54971 3.48335 7.22488 3.48335 8.25809 4.51655L11.9997 8.2581C13.0329 9.29129 13.0329 10.9664 11.9997 11.9996L8.25809 15.7412Z'
fill='url(#msplanner_paint1_linear)'
/>
<path
d='M0.774857 11.9999C1.80809 13.0331 3.48331 13.0331 4.51655 11.9999L15.7417 0.774926C16.7749 -0.258304 18.4501 -0.258309 19.4834 0.774914L23.225 4.51655C24.2583 5.54977 24.2583 7.22496 23.225 8.25819L11.9999 19.4832C10.9667 20.5164 9.29146 20.5164 8.25822 19.4832L0.774857 11.9999Z'
fill='url(#msplanner_paint2_linear)'
/>
<path
d='M0.774857 11.9999C1.80809 13.0331 3.48331 13.0331 4.51655 11.9999L15.7417 0.774926C16.7749 -0.258304 18.4501 -0.258309 19.4834 0.774914L23.225 4.51655C24.2583 5.54977 24.2583 7.22496 23.225 8.25819L11.9999 19.4832C10.9667 20.5164 9.29146 20.5164 8.25822 19.4832L0.774857 11.9999Z'
fill='url(#msplanner_paint3_linear)'
/>
<path
d='M4.51642 15.7413C5.54966 16.7746 7.22487 16.7746 8.25812 15.7413L15.7415 8.25803C16.7748 7.2248 18.45 7.2248 19.4832 8.25803L23.2249 11.9997C24.2582 13.0329 24.2582 14.7081 23.2249 15.7413L15.7415 23.2246C14.7083 24.2579 13.033 24.2579 11.9998 23.2246L4.51642 15.7413Z'
fill='url(#msplanner_paint4_linear)'
/>
<path
d='M4.51642 15.7413C5.54966 16.7746 7.22487 16.7746 8.25812 15.7413L15.7415 8.25803C16.7748 7.2248 18.45 7.2248 19.4832 8.25803L23.2249 11.9997C24.2582 13.0329 24.2582 14.7081 23.2249 15.7413L15.7415 23.2246C14.7083 24.2579 13.033 24.2579 11.9998 23.2246L4.51642 15.7413Z'
fill='url(#msplanner_paint5_linear)'
/>
</g>
<defs>
<linearGradient
id='msplanner_paint0_linear'
x1='6.38724'
y1='3.74167'
x2='2.15779'
y2='12.777'
gradientUnits='userSpaceOnUse'
>
<stop stopColor='#8752E0' />
<stop offset='1' stopColor='#541278' />
</linearGradient>
<linearGradient
id='msplanner_paint1_linear'
x1='8.38032'
y1='11.0696'
x2='4.94062'
y2='7.69244'
gradientUnits='userSpaceOnUse'
>
<stop offset='0.12172' stopColor='#3D0D59' />
<stop offset='1' stopColor='#7034B0' stopOpacity='0' />
</linearGradient>
<linearGradient
id='msplanner_paint2_linear'
x1='18.3701'
y1='-3.33385e-05'
x2='9.85717'
y2='20.4192'
gradientUnits='userSpaceOnUse'
>
<stop stopColor='#DB45E0' />
<stop offset='1' stopColor='#6C0F71' />
</linearGradient>
<linearGradient
id='msplanner_paint3_linear'
x1='18.3701'
y1='-3.33385e-05'
x2='9.85717'
y2='20.4192'
gradientUnits='userSpaceOnUse'
>
<stop stopColor='#DB45E0' />
<stop offset='0.677403' stopColor='#A829AE' />
<stop offset='1' stopColor='#8F28B3' />
</linearGradient>
<linearGradient
id='msplanner_paint4_linear'
x1='18.0002'
y1='7.49958'
x2='14.0004'
y2='23.9988'
gradientUnits='userSpaceOnUse'
>
<stop stopColor='#3DCBFF' />
<stop offset='1' stopColor='#00479E' />
</linearGradient>
<linearGradient
id='msplanner_paint5_linear'
x1='18.2164'
y1='7.92626'
x2='10.5237'
y2='22.9363'
gradientUnits='userSpaceOnUse'
>
<stop stopColor='#3DCBFF' />
<stop offset='1' stopColor='#4A40D4' />
</linearGradient>
<clipPath id='msplanner_clip0'>
<rect width='24' height='24' fill='white' />
</clipPath>
</defs>
<svg {...props} viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'>
<path
d='M8.25809 15.7412C7.22488 16.7744 5.54971 16.7744 4.5165 15.7412L0.774909 11.9996C-0.258303 10.9664 -0.258303 9.29129 0.774908 8.25809L4.5165 4.51655C5.54971 3.48335 7.22488 3.48335 8.25809 4.51655L11.9997 8.2581C13.0329 9.29129 13.0329 10.9664 11.9997 11.9996L8.25809 15.7412Z'
fill='#185ABD'
/>
<path
d='M0.774857 11.9999C1.80809 13.0331 3.48331 13.0331 4.51655 11.9999L15.7417 0.774926C16.7749 -0.258304 18.4501 -0.258309 19.4834 0.774914L23.225 4.51655C24.2583 5.54977 24.2583 7.22496 23.225 8.25819L11.9999 19.4832C10.9667 20.5164 9.29146 20.5164 8.25822 19.4832L0.774857 11.9999Z'
fill='#41A5EE'
/>
<path
d='M4.51642 15.7413C5.54966 16.7746 7.22487 16.7746 8.25812 15.7413L15.7415 8.25803C16.7748 7.2248 18.45 7.2248 19.4832 8.25803L23.2249 11.9997C24.2582 13.0329 24.2582 14.7081 23.2249 15.7413L15.7415 23.2246C14.7083 24.2579 13.033 24.2579 11.9998 23.2246L4.51642 15.7413Z'
fill='#2B7CD3'
/>
</svg>
)
}
@@ -3344,29 +3273,10 @@ export function TrelloIcon(props: SVGProps<SVGSVGElement>) {
export function AsanaIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg
{...props}
xmlns='http://www.w3.org/2000/svg'
width='24'
height='24'
viewBox='781.361 0 944.893 873.377'
>
<radialGradient
id='asana_radial_gradient'
cx='943.992'
cy='1221.416'
r='.663'
gradientTransform='matrix(944.8934 0 0 -873.3772 -890717.875 1067234.75)'
gradientUnits='userSpaceOnUse'
>
<stop offset='0' stopColor='#ffb900' />
<stop offset='.6' stopColor='#f95d8f' />
<stop offset='.999' stopColor='#f95353' />
</radialGradient>
<path
fill='url(#asana_radial_gradient)'
d='M1520.766 462.371c-113.508 0-205.508 92-205.508 205.488 0 113.499 92 205.518 205.508 205.518 113.489 0 205.488-92.019 205.488-205.518 0-113.488-91.999-205.488-205.488-205.488zm-533.907.01c-113.489.01-205.498 91.99-205.498 205.488 0 113.489 92.009 205.498 205.498 205.498 113.498 0 205.508-92.009 205.508-205.498 0-113.499-92.01-205.488-205.518-205.488h.01zm472.447-256.883c0 113.489-91.999 205.518-205.488 205.518-113.508 0-205.508-92.029-205.508-205.518S1140.31 0 1253.817 0c113.489 0 205.479 92.009 205.479 205.498h.01z'
/>
<svg {...props} xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none'>
<circle cx='18' cy='16' r='4' fill='#F06A6A' />
<circle cx='6' cy='16' r='4' fill='#F06A6A' />
<circle cx='12' cy='6.5' r='4' fill='#F06A6A' />
</svg>
)
}
@@ -3975,6 +3885,33 @@ export function DynamoDBIcon(props: SVGProps<SVGSVGElement>) {
)
}
export function McpIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg
{...props}
width='16'
height='16'
viewBox='0 0 16 16'
fill='none'
xmlns='http://www.w3.org/2000/svg'
>
<g clipPath='url(#mcp-clip)'>
<path
fillRule='evenodd'
clipRule='evenodd'
d='M14.5572 7.87503L14.5022 7.92903L8.69824 13.62C8.68102 13.6368 8.66728 13.6569 8.65781 13.679C8.64834 13.7011 8.64332 13.7248 8.64304 13.7489C8.64276 13.773 8.64723 13.7968 8.65619 13.8192C8.66514 13.8415 8.67842 13.8618 8.69524 13.879L8.69824 13.882L9.89024 15.052C9.99431 15.1536 10.0539 15.2923 10.056 15.4378C10.058 15.5832 10.0024 15.7235 9.90124 15.828L9.89124 15.838C9.78385 15.9428 9.63977 16.0014 9.48974 16.0014C9.33972 16.0014 9.19564 15.9428 9.08824 15.838L7.89624 14.67C7.77347 14.5507 7.67588 14.408 7.60923 14.2503C7.54259 14.0927 7.50825 13.9232 7.50825 13.752C7.50825 13.5808 7.54259 13.4114 7.60923 13.2537C7.67588 13.096 7.77347 12.9533 7.89624 12.834L13.7012 7.14203C14.0139 6.83733 14.1928 6.42097 14.1986 5.98444C14.2044 5.54792 14.0367 5.12694 13.7322 4.81403L13.7012 4.78203L13.6672 4.75003C13.3455 4.43669 12.9143 4.26118 12.4651 4.2608C12.016 4.26043 11.5845 4.43522 11.2622 4.74803L6.48124 9.43803H6.47924L6.41424 9.50303C6.30685 9.60778 6.16277 9.66642 6.01274 9.66642C5.86272 9.66642 5.71864 9.60778 5.61124 9.50303C5.50731 9.40128 5.44791 9.26252 5.44604 9.11709C5.44417 8.97166 5.49997 8.83141 5.60124 8.72703L5.61124 8.71703L10.4602 3.96003C11.1102 3.32403 11.1232 2.28203 10.4872 1.63103L10.4582 1.60103C10.1362 1.28736 9.70433 1.11183 9.25474 1.11183C8.80516 1.11183 8.37333 1.28736 8.05124 1.60103L1.63524 7.89603C1.5279 8.00048 1.38403 8.05893 1.23424 8.05893C1.08446 8.05893 0.940591 8.00048 0.833243 7.89603C0.729179 7.79442 0.669597 7.65573 0.667536 7.5103C0.665474 7.36487 0.7211 7.22454 0.822243 7.12003L0.833243 7.11003L7.25024 0.814026C7.78698 0.291743 8.50633 -0.000488281 9.25524 -0.000488281C10.0042 -0.000488281 10.7235 0.291743 11.2602 0.814026C11.8902 1.42703 12.1892 2.30403 12.0632 3.17403C12.9432 3.04903 13.8332 3.34003 14.4692 3.96103L14.5032 3.99403C14.7616 4.24525 14.9679 4.54492 15.1104 4.87591C15.2529 5.2069 15.3287 5.56272 15.3337 5.92304C15.3386 6.28337 15.2725 6.64113 15.1391 6.97589C15.0057 7.31064 14.8076 7.61584 14.5562 7.87403M12.8652 6.32103C12.9692 6.21928 13.0286 6.08052 13.0304 5.93509C13.0323 5.78966 12.9765 5.64941 12.8752 5.54503L12.8652 5.53503C12.7578 5.43027 12.6138 5.37164 12.4637 5.37164C12.3137 5.37164 12.1696 5.43027 12.0622 5.53503L7.31724 10.19C6.99515 10.5037 6.56333 10.6792 6.11374 10.6792C5.66416 10.6792 5.23233 10.5037 4.91024 10.19C4.7552 10.0391 4.63143 9.85901 4.54601 9.66018C4.46058 9.46135 4.41518 9.24763 4.4124 9.03124C4.40961 8.81486 4.4495 8.60004 4.52977 8.39908C4.61005 8.19812 4.72914 8.01494 4.88024 7.86003L4.91124 7.82903L9.65824 3.17403C9.76231 3.07242 9.82189 2.93373 9.82395 2.7883C9.82601 2.64287 9.77039 2.50254 9.66924 2.39803L9.65824 2.38803C9.55085 2.28327 9.40677 2.22464 9.25674 2.22464C9.10672 2.22464 8.96264 2.28327 8.85524 2.38803L4.10824 7.04203C3.84537 7.29765 3.63642 7.60338 3.49374 7.94115C3.35107 8.27892 3.27755 8.64186 3.27755 9.00853C3.27755 9.37519 3.35107 9.73814 3.49374 10.0759C3.63642 10.4137 3.84537 10.7194 4.10824 10.975C4.64515 11.4974 5.36467 11.7896 6.11374 11.7896C6.86282 11.7896 7.58234 11.4974 8.11924 10.975L12.8652 6.32103Z'
fill='currentColor'
/>
</g>
<defs>
<clipPath id='mcp-clip'>
<rect width='16' height='16' fill='white' />
</clipPath>
</defs>
</svg>
)
}
export function WordpressIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} xmlns='http://www.w3.org/2000/svg' viewBox='0 0 25.925 25.925'>

View File

@@ -34,6 +34,7 @@ import {
GoogleFormsIcon,
GoogleIcon,
GoogleSheetsIcon,
GoogleSlidesIcon,
GoogleVaultIcon,
GrafanaIcon,
HubspotIcon,
@@ -192,6 +193,7 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
hubspot: HubspotIcon,
grafana: GrafanaIcon,
google_vault: GoogleVaultIcon,
google_slides: GoogleSlidesIcon,
google_sheets: GoogleSheetsIcon,
google_forms: GoogleFormsIcon,
google_drive: GoogleDriveIcon,

View File

@@ -251,32 +251,78 @@ Rufen Sie Ausführungsdetails einschließlich des Workflow-Zustandsschnappschuss
</Tab>
</Tabs>
## Webhook-Abonnements
## Benachrichtigungen
Erhalten Sie Echtzeitbenachrichtigungen, wenn Workflow-Ausführungen abgeschlossen werden. Webhooks werden über die Sim-Benutzeroberfläche im Workflow-Editor konfiguriert.
Erhalten Sie Echtzeit-Benachrichtigungen, wenn Workflow-Ausführungen abgeschlossen sind, per Webhook, E-Mail oder Slack. Benachrichtigungen werden auf Workspace-Ebene von der Protokollseite aus konfiguriert.
### Konfiguration
Webhooks können für jeden Workflow über die Benutzeroberfläche des Workflow-Editors konfiguriert werden. Klicken Sie auf das Webhook-Symbol in der Kontrollleiste, um Ihre Webhook-Abonnements einzurichten.
Konfigurieren Sie Benachrichtigungen von der Protokollseite aus, indem Sie auf die Menütaste klicken und "Benachrichtigungen konfigurieren" auswählen.
<div className="mx-auto w-full overflow-hidden rounded-lg">
<Video src="configure-webhook.mp4" width={700} height={450} />
</div>
**Benachrichtigungskanäle:**
- **Webhook**: Senden Sie HTTP POST-Anfragen an Ihren Endpunkt
- **E-Mail**: Erhalten Sie E-Mail-Benachrichtigungen mit Ausführungsdetails
- **Slack**: Posten Sie Nachrichten in einen Slack-Kanal
**Verfügbare Konfigurationsoptionen:**
**Workflow-Auswahl:**
- Wählen Sie bestimmte Workflows zur Überwachung aus
- Oder wählen Sie "Alle Workflows", um aktuelle und zukünftige Workflows einzubeziehen
**Filteroptionen:**
- `levelFilter`: Zu empfangende Protokollebenen (`info`, `error`)
- `triggerFilter`: Zu empfangende Auslösertypen (`api`, `webhook`, `schedule`, `manual`, `chat`)
**Optionale Daten:**
- `includeFinalOutput`: Schließt die endgültige Ausgabe des Workflows ein
- `includeTraceSpans`: Schließt detaillierte Ausführungs-Trace-Spans ein
- `includeRateLimits`: Schließt Informationen zum Ratenlimit ein (Sync/Async-Limits und verbleibende)
- `includeUsageData`: Schließt Abrechnungszeitraum-Nutzung und -Limits ein
### Alarmregeln
Anstatt Benachrichtigungen für jede Ausführung zu erhalten, konfigurieren Sie Alarmregeln, um nur bei erkannten Problemen benachrichtigt zu werden:
**Aufeinanderfolgende Fehler**
- Alarm nach X aufeinanderfolgenden fehlgeschlagenen Ausführungen (z.B. 3 Fehler in Folge)
- Wird zurückgesetzt, wenn eine Ausführung erfolgreich ist
**Fehlerrate**
- Alarm, wenn die Fehlerrate X% in den letzten Y Stunden überschreitet
- Erfordert mindestens 5 Ausführungen im Zeitfenster
- Wird erst nach Ablauf des vollständigen Zeitfensters ausgelöst
**Latenz-Schwellenwert**
- Alarm, wenn eine Ausführung länger als X Sekunden dauert
- Nützlich zum Erkennen langsamer oder hängender Workflows
**Latenz-Spitze**
- Alarm, wenn die Ausführung X% langsamer als der Durchschnitt ist
- Vergleicht mit der durchschnittlichen Dauer über das konfigurierte Zeitfenster
- Erfordert mindestens 5 Ausführungen, um eine Baseline zu etablieren
**Kostenschwelle**
- Alarmierung, wenn eine einzelne Ausführung mehr als $X kostet
- Nützlich, um teure LLM-Aufrufe zu erkennen
**Keine Aktivität**
- Alarmierung, wenn innerhalb von X Stunden keine Ausführungen stattfinden
- Nützlich zur Überwachung geplanter Workflows, die regelmäßig ausgeführt werden sollten
**Fehlerzählung**
- Alarmierung, wenn die Fehleranzahl X innerhalb eines Zeitfensters überschreitet
- Erfasst die Gesamtfehler, nicht aufeinanderfolgende
Alle Alarmtypen beinhalten eine Abklingzeit von 1 Stunde, um Benachrichtigungsspam zu vermeiden.
### Webhook-Konfiguration
Für Webhooks stehen zusätzliche Optionen zur Verfügung:
- `url`: Ihre Webhook-Endpunkt-URL
- `secret`: Optionales Geheimnis für die HMAC-Signaturverifizierung
- `includeFinalOutput`: Die endgültige Ausgabe des Workflows in die Nutzlast einschließen
- `includeTraceSpans`: Detaillierte Ausführungs-Trace-Spans einschließen
- `includeRateLimits`: Informationen zum Ratelimit des Workflow-Besitzers einschließen
- `includeUsageData`: Nutzungs- und Abrechnungsdaten des Workflow-Besitzers einschließen
- `levelFilter`: Array von Log-Ebenen, die empfangen werden sollen (`info`, `error`)
- `triggerFilter`: Array von Auslösertypen, die empfangen werden sollen (`api`, `webhook`, `schedule`, `manual`, `chat`)
- `active`: Webhook-Abonnement aktivieren/deaktivieren
- `secret`: Optionales Geheimnis für HMAC-Signaturverifizierung
### Webhook-Nutzlast
### Payload-Struktur
Wenn eine Workflow-Ausführung abgeschlossen ist, sendet Sim eine POST-Anfrage an Ihre Webhook-URL:
Wenn eine Workflow-Ausführung abgeschlossen ist, sendet Sim die folgende Payload (über Webhook POST, E-Mail oder Slack):
```json
{
@@ -327,17 +373,17 @@ Wenn eine Workflow-Ausführung abgeschlossen ist, sendet Sim eine POST-Anfrage a
### Webhook-Header
Jede Webhook-Anfrage enthält diese Header:
Jede Webhook-Anfrage enthält diese Header (nur Webhook-Kanal):
- `sim-event`: Ereignistyp (immer `workflow.execution.completed`)
- `sim-timestamp`: Unix-Zeitstempel in Millisekunden
- `sim-delivery-id`: Eindeutige Lieferungs-ID für Idempotenz
- `sim-signature`: HMAC-SHA256-Signatur zur Verifizierung (falls Secret konfiguriert)
- `Idempotency-Key`: Identisch mit der Lieferungs-ID zur Erkennung von Duplikaten
- `sim-delivery-id`: Eindeutige Zustell-ID für Idempotenz
- `sim-signature`: HMAC-SHA256-Signatur zur Verifizierung (falls Geheimnis konfiguriert)
- `Idempotency-Key`: Gleich wie Zustell-ID zur Erkennung von Duplikaten
### Signaturverifizierung
Wenn Sie ein Webhook-Secret konfigurieren, überprüfen Sie die Signatur, um sicherzustellen, dass der Webhook von Sim stammt:
Wenn Sie ein Webhook-Geheimnis konfigurieren, überprüfen Sie die Signatur, um sicherzustellen, dass der Webhook von Sim stammt:
<Tabs items={['Node.js', 'Python']}>
<Tab value="Node.js">
@@ -414,7 +460,7 @@ Fehlgeschlagene Webhook-Zustellungen werden mit exponentiellem Backoff und Jitte
- Maximale Versuche: 5
- Wiederholungsverzögerungen: 5 Sekunden, 15 Sekunden, 1 Minute, 3 Minuten, 10 Minuten
- Jitter: Bis zu 10% zusätzliche Verzögerung, um Überlastungen zu vermeiden
- Jitter: Bis zu 10% zusätzliche Verzögerung, um Überlastung zu vermeiden
- Nur HTTP 5xx und 429 Antworten lösen Wiederholungen aus
- Zustellungen haben ein Timeout nach 30 Sekunden
@@ -424,15 +470,15 @@ Fehlgeschlagene Webhook-Zustellungen werden mit exponentiellem Backoff und Jitte
## Best Practices
1. **Polling-Strategie**: Verwenden Sie beim Abfragen von Logs die cursorbasierte Paginierung mit `order=asc` und `startDate`, um neue Logs effizient abzurufen.
1. **Polling-Strategie**: Verwende bei der Abfrage von Logs eine cursor-basierte Paginierung mit `order=asc` und `startDate`, um neue Logs effizient abzurufen.
2. **Webhook-Sicherheit**: Konfigurieren Sie immer ein Webhook-Secret und überprüfen Sie Signaturen, um sicherzustellen, dass Anfragen von Sim stammen.
2. **Webhook-Sicherheit**: Konfiguriere immer ein Webhook-Secret und überprüfe Signaturen, um sicherzustellen, dass Anfragen von Sim stammen.
3. **Idempotenz**: Verwenden Sie den `Idempotency-Key`Header, um doppelte Webhook-Zustellungen zu erkennen und zu behandeln.
3. **Idempotenz**: Verwende den `Idempotency-Key`Header, um doppelte Webhook-Zustellungen zu erkennen und zu behandeln.
4. **Datenschutz**: Standardmäßig werden `finalOutput` und `traceSpans` von den Antworten ausgeschlossen. Aktivieren Sie diese nur, wenn Sie die Daten benötigen und die Datenschutzauswirkungen verstehen.
4. **Datenschutz**: Standardmäßig werden `finalOutput` und `traceSpans` aus den Antworten ausgeschlossen. Aktiviere diese nur, wenn du die Daten benötigst und die Datenschutzauswirkungen verstehst.
5. **Rate-Limiting**: Implementieren Sie exponentielles Backoff, wenn Sie 429-Antworten erhalten. Überprüfen Sie den `Retry-After`Header für die empfohlene Wartezeit.
5. **Rate-Limiting**: Implementiere exponentielles Backoff, wenn du 429-Antworten erhältst. Überprüfe den `Retry-After`Header für die empfohlene Wartezeit.
## Rate-Limiting
@@ -443,7 +489,7 @@ Die API implementiert Rate-Limiting, um eine faire Nutzung zu gewährleisten:
- **Team-Plan**: 60 Anfragen pro Minute
- **Enterprise-Plan**: Individuelle Limits
Informationen zum Rate-Limit sind in den Antwort-Headern enthalten:
Rate-Limit-Informationen sind in den Antwort-Headern enthalten:
- `X-RateLimit-Limit`: Maximale Anfragen pro Zeitfenster
- `X-RateLimit-Remaining`: Verbleibende Anfragen im aktuellen Zeitfenster
- `X-RateLimit-Reset`: ISO-Zeitstempel, wann das Zeitfenster zurückgesetzt wird
@@ -495,7 +541,7 @@ async function pollLogs() {
setInterval(pollLogs, 30000);
```
## Beispiel: Verarbeitung von Webhooks
## Beispiel: Verarbeiten von Webhooks
```javascript
import express from 'express';

View File

@@ -147,4 +147,4 @@ Der Snapshot bietet:
- Erfahren Sie mehr über die [Kostenberechnung](/execution/costs), um die Preisgestaltung von Workflows zu verstehen
- Erkunden Sie die [externe API](/execution/api) für programmatischen Zugriff auf Protokolle
- Richten Sie [Webhook-Benachrichtigungen](/execution/api#webhook-subscriptions) für Echtzeit-Warnungen ein
- Richten Sie [Benachrichtigungen](/execution/api#notifications) für Echtzeit-Warnungen per Webhook, E-Mail oder Slack ein

View File

@@ -142,10 +142,11 @@ Erhalte die Top-Seiten einer Zieldomain, sortiert nach organischem Traffic. Lief
| --------- | ---- | -------- | ----------- |
| `target` | string | Ja | Die zu analysierende Zieldomäne |
| `country` | string | Nein | Ländercode für Verkehrsdaten \(z.B. us, gb, de\). Standard: us |
| `mode` | string | Nein | Analysemodus: domain \(gesamte Domain\), prefix \(URL-Präfix\), subdomains \(alle Subdomains einschließen\) |
| `mode` | string | Nein | Analysemodus: domain \(gesamte Domäne\), prefix \(URL-Präfix\), subdomains \(alle Subdomänen einschließen\) |
| `date` | string | Nein | Datum für historische Daten im Format JJJJ-MM-TT \(standardmäßig heute\) |
| `limit` | number | Nein | Maximale Anzahl der zurückzugebenden Ergebnisse \(Standard: 100\) |
| `offset` | number | Nein | Anzahl der zu überspringenden Ergebnisse für Paginierung |
| `select` | string | Nein | Kommagetrennte Liste der zurückzugebenden Felder \(z.B. url,traffic,keywords,top_keyword,value\). Standard: url,traffic,keywords,top_keyword,value |
| `apiKey` | string | Ja | Ahrefs API-Schlüssel |
#### Ausgabe

View File

@@ -38,14 +38,14 @@ Erstellt ein neues Ereignis in Google Kalender
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `calendarId` | string | Nein | Kalender-ID \(standardmäßig primary\) |
| `calendarId` | string | Nein | Kalender-ID (standardmäßig primary) |
| `summary` | string | Ja | Ereignistitel/Zusammenfassung |
| `description` | string | Nein | Ereignisbeschreibung |
| `location` | string | Nein | Ereignisort |
| `startDateTime` | string | Ja | Startdatum und -uhrzeit \(RFC3339-Format, z.B. 2025-06-03T10:00:00-08:00\) |
| `endDateTime` | string | Ja | Enddatum und -uhrzeit \(RFC3339-Format, z.B. 2025-06-03T11:00:00-08:00\) |
| `timeZone` | string | Nein | Zeitzone \(z.B. America/Los_Angeles\) |
| `attendees` | array | Nein | Array mit E-Mail-Adressen der Teilnehmer |
| `startDateTime` | string | Ja | Startdatum und -uhrzeit. MUSS Zeitzonen-Offset enthalten (z.B. 2025-06-03T10:00:00-08:00) ODER timeZone-Parameter bereitstellen |
| `endDateTime` | string | Ja | Enddatum und -uhrzeit. MUSS Zeitzonen-Offset enthalten (z.B. 2025-06-03T11:00:00-08:00) ODER timeZone-Parameter bereitstellen |
| `timeZone` | string | Nein | Zeitzone (z.B. America/Los_Angeles). Erforderlich, wenn datetime keinen Offset enthält. Standardmäßig America/Los_Angeles, wenn nicht angegeben. |
| `attendees` | array | Nein | Array von E-Mail-Adressen der Teilnehmer |
| `sendUpdates` | string | Nein | Wie Updates an Teilnehmer gesendet werden: all, externalOnly oder none |
#### Ausgabe

View File

@@ -108,10 +108,10 @@ Dateien und Ordner in Google Drive auflisten
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `folderSelector` | string | Nein | Den Ordner auswählen, aus dem Dateien aufgelistet werden sollen |
| `folderSelector` | string | Nein | Wählen Sie den Ordner aus, aus dem Dateien aufgelistet werden sollen |
| `folderId` | string | Nein | Die ID des Ordners, aus dem Dateien aufgelistet werden sollen (interne Verwendung) |
| `query` | string | Nein | Eine Abfrage zum Filtern der Dateien |
| `pageSize` | number | Nein | Die Anzahl der zurückzugebenden Dateien |
| `query` | string | Nein | Suchbegriff, um Dateien nach Namen zu filtern (z.B. "budget" findet Dateien mit "budget" im Namen). Verwenden Sie hier KEINE Google Drive-Abfragesyntax - geben Sie einfach einen einfachen Suchbegriff ein. |
| `pageSize` | number | Nein | Die maximale Anzahl der zurückzugebenden Dateien (Standard: 100) |
| `pageToken` | string | Nein | Das Seitentoken für die Paginierung |
#### Ausgabe

View File

@@ -88,8 +88,8 @@ Daten aus einer Google Sheets-Tabelle lesen
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `spreadsheetId` | string | Ja | Die ID der Tabelle, aus der gelesen werden soll |
| `range` | string | Nein | Der Zellbereich, aus dem gelesen werden soll |
| `spreadsheetId` | string | Ja | Die ID der Tabelle \(zu finden in der URL: docs.google.com/spreadsheets/d/\{SPREADSHEET_ID\}/edit\). |
| `range` | string | Nein | Der A1-Notationsbereich zum Lesen \(z.B. "Sheet1!A1:D10", "A1:B5"\). Standardmäßig wird das erste Tabellenblatt A1:Z1000 verwendet, wenn nicht angegeben. |
#### Ausgabe
@@ -106,9 +106,9 @@ Daten in eine Google Sheets-Tabelle schreiben
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `spreadsheetId` | string | Ja | Die ID der Tabelle, in die geschrieben werden soll |
| `range` | string | Nein | Der Zellbereich, in den geschrieben werden soll |
| `values` | array | Ja | Die Daten, die in die Tabelle geschrieben werden sollen |
| `spreadsheetId` | string | Ja | Die ID der Tabelle |
| `range` | string | Nein | Der A1-Notationsbereich, in den geschrieben werden soll \(z.B. "Sheet1!A1:D10", "A1:B5"\) |
| `values` | array | Ja | Die zu schreibenden Daten als 2D-Array \(z.B. \[\["Name", "Alter"\], \["Alice", 30\], \["Bob", 25\]\]\) oder Array von Objekten. |
| `valueInputOption` | string | Nein | Das Format der zu schreibenden Daten |
| `includeValuesInResponse` | boolean | Nein | Ob die geschriebenen Werte in der Antwort enthalten sein sollen |
@@ -131,8 +131,8 @@ Daten in einer Google Sheets-Tabelle aktualisieren
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `spreadsheetId` | string | Ja | Die ID der zu aktualisierenden Tabelle |
| `range` | string | Nein | Der Bereich der zu aktualisierenden Zellen |
| `values` | array | Ja | Die Daten, die in der Tabelle aktualisiert werden sollen |
| `range` | string | Nein | Der A1-Notationsbereich, der aktualisiert werden soll \(z.B. "Sheet1!A1:D10", "A1:B5"\) |
| `values` | array | Ja | Die zu aktualisierenden Daten als 2D-Array \(z.B. \[\["Name", "Alter"\], \["Alice", 30\]\]\) oder Array von Objekten. |
| `valueInputOption` | string | Nein | Das Format der zu aktualisierenden Daten |
| `includeValuesInResponse` | boolean | Nein | Ob die aktualisierten Werte in der Antwort enthalten sein sollen |
@@ -155,10 +155,10 @@ Daten am Ende einer Google Sheets-Tabelle anhängen
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `spreadsheetId` | string | Ja | Die ID der Tabelle, an die angehängt werden soll |
| `range` | string | Nein | Der Bereich der Zellen, nach dem angehängt werden soll |
| `values` | array | Ja | Die Daten, die an die Tabelle angehängt werden sollen |
| `range` | string | Nein | Der A1-Notationsbereich, an den angehängt werden soll (z.B. "Sheet1", "Sheet1!A:D") |
| `values` | array | Ja | Die anzuhängenden Daten als 2D-Array (z.B. [["Alice", 30], ["Bob", 25]]) oder Array von Objekten |
| `valueInputOption` | string | Nein | Das Format der anzuhängenden Daten |
| `insertDataOption` | string | Nein | Wie die Daten eingefügt werden sollen \(OVERWRITE oder INSERT_ROWS\) |
| `insertDataOption` | string | Nein | Wie die Daten eingefügt werden sollen (OVERWRITE oder INSERT_ROWS) |
| `includeValuesInResponse` | boolean | Nein | Ob die angehängten Werte in der Antwort enthalten sein sollen |
#### Ausgabe

View File

@@ -0,0 +1,180 @@
---
title: Google Slides
description: Präsentationen lesen, schreiben und erstellen
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="google_slides"
color="#E0E0E0"
/>
{/* MANUAL-CONTENT-START:intro */}
[Google Slides](https://slides.google.com) ist eine dynamische cloudbasierte Präsentationsanwendung, mit der Benutzer in Echtzeit Präsentationen erstellen, bearbeiten, gemeinsam daran arbeiten und präsentieren können. Als Teil der Google-Produktivitätssuite bietet Google Slides eine flexible Plattform zum Gestalten ansprechender Präsentationen, zur Zusammenarbeit mit anderen und zum nahtlosen Teilen von Inhalten über die Cloud.
Erfahren Sie, wie Sie die Google Slides-Tools in Sim integrieren können, um Präsentationen mühelos als Teil Ihrer automatisierten Workflows zu verwalten. Mit Sim können Sie Google Slides-Präsentationen direkt über Ihre Agenten und automatisierten Prozesse lesen, schreiben, erstellen und aktualisieren, wodurch es einfach wird, aktuelle Informationen zu liefern, benutzerdefinierte Berichte zu generieren oder Marken-Präsentationen programmatisch zu erstellen.
Mit Google Slides können Sie:
- **Präsentationen erstellen und bearbeiten**: Gestalten Sie visuell ansprechende Folien mit Designs, Layouts und Multimedia-Inhalten
- **In Echtzeit zusammenarbeiten**: Arbeiten Sie gleichzeitig mit Teammitgliedern, kommentieren Sie, weisen Sie Aufgaben zu und erhalten Sie Live-Feedback zu Präsentationen
- **Überall präsentieren**: Zeigen Sie Präsentationen online oder offline an, teilen Sie Links oder veröffentlichen Sie im Web
- **Bilder und umfangreiche Inhalte hinzufügen**: Fügen Sie Bilder, Grafiken, Diagramme und Videos ein, um Ihre Präsentationen ansprechend zu gestalten
- **Mit anderen Diensten integrieren**: Verbinden Sie sich nahtlos mit Google Drive, Docs, Sheets und anderen Drittanbieter-Tools
- **Von jedem Gerät aus zugreifen**: Nutzen Sie Google Slides auf Desktop-Computern, Laptops, Tablets und mobilen Geräten für maximale Flexibilität
In Sim ermöglicht die Google Slides-Integration Ihren Agenten, direkt programmatisch mit Präsentationsdateien zu interagieren. Automatisieren Sie Aufgaben wie das Lesen von Folieninhalten, das Einfügen neuer Folien oder Bilder, das Ersetzen von Text in einer gesamten Präsentation, das Erstellen neuer Präsentationen und das Abrufen von Folien-Miniaturansichten. Dies ermöglicht Ihnen, die Inhaltserstellung zu skalieren, Präsentationen aktuell zu halten und sie in automatisierte Dokumenten-Workflows einzubetten. Durch die Verbindung von Sim mit Google Slides ermöglichen Sie KI-gestütztes Präsentationsmanagement so wird es einfach, Präsentationen ohne manuellen Aufwand zu generieren, zu aktualisieren oder Informationen daraus zu extrahieren.
{/* MANUAL-CONTENT-END */}
## Nutzungsanleitung
Integrieren Sie Google Slides in den Workflow. Kann Präsentationen lesen, schreiben, erstellen, Text ersetzen, Folien hinzufügen, Bilder einfügen und Vorschaubilder abrufen.
## Tools
### `google_slides_read`
Inhalte aus einer Google Slides-Präsentation lesen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `presentationId` | string | Ja | Die ID der zu lesenden Präsentation |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `slides` | json | Array von Folien mit ihren Inhalten |
| `metadata` | json | Präsentationsmetadaten einschließlich ID, Titel und URL |
### `google_slides_write`
Inhalte in einer Google Slides-Präsentation schreiben oder aktualisieren
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `presentationId` | string | Ja | Die ID der Präsentation, in die geschrieben werden soll |
| `content` | string | Ja | Der Inhalt, der in die Folie geschrieben werden soll |
| `slideIndex` | number | Nein | Der Index der Folie, in die geschrieben werden soll \(standardmäßig die erste Folie\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `updatedContent` | boolean | Gibt an, ob der Präsentationsinhalt erfolgreich aktualisiert wurde |
| `metadata` | json | Aktualisierte Präsentationsmetadaten einschließlich ID, Titel und URL |
### `google_slides_create`
Eine neue Google Slides-Präsentation erstellen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `title` | string | Ja | Der Titel der zu erstellenden Präsentation |
| `content` | string | Nein | Der Inhalt, der zur ersten Folie hinzugefügt werden soll |
| `folderSelector` | string | Nein | Wählen Sie den Ordner aus, in dem die Präsentation erstellt werden soll |
| `folderId` | string | Nein | Die ID des Ordners, in dem die Präsentation erstellt werden soll \(interne Verwendung\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `metadata` | json | Metadaten der erstellten Präsentation einschließlich ID, Titel und URL |
### `google_slides_replace_all_text`
Suchen und ersetzen aller Textvorkommen in einer Google Slides-Präsentation
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `presentationId` | string | Ja | Die ID der Präsentation |
| `findText` | string | Ja | Der zu suchende Text (z.B. \{\{placeholder\}\}) |
| `replaceText` | string | Ja | Der Text, durch den ersetzt werden soll |
| `matchCase` | boolean | Nein | Ob die Suche Groß-/Kleinschreibung berücksichtigen soll (Standard: true) |
| `pageObjectIds` | string | Nein | Kommagetrennte Liste von Folienobjekt-IDs, um Ersetzungen auf bestimmte Folien zu beschränken (leer lassen für alle Folien) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `occurrencesChanged` | number | Anzahl der Textvorkommen, die ersetzt wurden |
| `metadata` | json | Operationsmetadaten einschließlich Präsentations-ID und URL |
### `google_slides_add_slide`
Eine neue Folie mit einem bestimmten Layout zu einer Google Slides-Präsentation hinzufügen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `presentationId` | string | Ja | Die ID der Präsentation |
| `layout` | string | Nein | Das vordefinierte Layout für die Folie (BLANK, TITLE, TITLE_AND_BODY, TITLE_ONLY, SECTION_HEADER, usw.). Standard ist BLANK. |
| `insertionIndex` | number | Nein | Der optionale nullbasierte Index, der angibt, wo die Folie eingefügt werden soll. Wenn nicht angegeben, wird die Folie am Ende hinzugefügt. |
| `placeholderIdMappings` | string | Nein | JSON-Array von Platzhalter-Zuordnungen, um Platzhaltern benutzerdefinierte Objekt-IDs zuzuweisen. Format: \[\{"layoutPlaceholder":\{"type":"TITLE"\},"objectId":"custom_title_id"\}\] |
#### Output
| Parameter | Type | Beschreibung |
| --------- | ---- | ----------- |
| `slideId` | string | Die Objekt-ID der neu erstellten Folie |
| `metadata` | json | Operationsmetadaten einschließlich Präsentations-ID, Layout und URL |
### `google_slides_add_image`
Ein Bild in eine bestimmte Folie einer Google Slides-Präsentation einfügen
#### Input
| Parameter | Type | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `presentationId` | string | Ja | Die ID der Präsentation |
| `pageObjectId` | string | Ja | Die Objekt-ID der Folie/Seite, zu der das Bild hinzugefügt werden soll |
| `imageUrl` | string | Ja | Die öffentlich zugängliche URL des Bildes \(muss PNG, JPEG oder GIF sein, max. 50MB\) |
| `width` | number | Nein | Breite des Bildes in Punkten \(Standard: 300\) |
| `height` | number | Nein | Höhe des Bildes 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\) |
#### Output
| Parameter | Type | Beschreibung |
| --------- | ---- | ----------- |
| `imageId` | string | Die Objekt-ID des neu erstellten Bildes |
| `metadata` | json | Operationsmetadaten einschließlich Präsentations-ID und Bild-URL |
### `google_slides_get_thumbnail`
Ein Vorschaubild einer bestimmten Folie in einer Google Slides-Präsentation generieren
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `presentationId` | string | Ja | Die ID der Präsentation |
| `pageObjectId` | string | Ja | Die Objekt-ID der Folie/Seite, für die ein Thumbnail erstellt werden soll |
| `thumbnailSize` | string | Nein | Die Größe des Thumbnails: SMALL \(200px\), MEDIUM \(800px\) oder LARGE \(1600px\). Standardmäßig MEDIUM. |
| `mimeType` | string | Nein | Der MIME-Typ des Thumbnail-Bildes: PNG oder GIF. Standardmäßig PNG. |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `contentUrl` | string | URL zum Thumbnail-Bild \(gültig für 30 Minuten\) |
| `width` | number | Breite des Thumbnails in Pixeln |
| `height` | number | Höhe des Thumbnails in Pixeln |
| `metadata` | json | Operationsmetadaten einschließlich Präsentations-ID und Seitenobjekt-ID |
## Hinweise
- Kategorie: `tools`
- Typ: `google_slides`

View File

@@ -361,6 +361,8 @@ Einen bestehenden Zeitplan in incident.io aktualisieren
| `id` | string | Ja | Die 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\) |
| `config` | string | Nein | Zeitplankonfiguration als JSON-String mit Rotationen. Beispiel: \{"rotations": \[\{"name": "Primary", "users": \[\{"id": "user_id"\}\], "handover_start_at": "2024-01-01T09:00:00Z", "handovers": \[\{"interval": 1, "interval_type": "weekly"\}\]\}\]\} |
| `Example` | string | Nein | Keine Beschreibung |
#### Ausgabe

View File

@@ -167,7 +167,7 @@ Ein Unternehmen in Intercom erstellen oder aktualisieren
| `plan` | string | Nein | Der Unternehmensplan |
| `size` | number | Nein | Die Anzahl der Mitarbeiter im Unternehmen |
| `industry` | string | Nein | Die Branche, in der das Unternehmen tätig ist |
| `monthly_spend` | number | Nein | Wie viel Umsatz das Unternehmen für Ihr Geschäft generiert |
| `monthly_spend` | number | Nein | Wie viel Umsatz das Unternehmen für Ihr Geschäft generiert. Hinweis: Dieses Feld kürzt Dezimalzahlen auf ganze Zahlen \(z.B. wird aus 155,98 die Zahl 155\) |
| `custom_attributes` | string | Nein | Benutzerdefinierte Attribute als JSON-Objekt |
#### Ausgabe
@@ -196,7 +196,7 @@ Ein einzelnes Unternehmen anhand der ID von Intercom abrufen
### `intercom_list_companies`
Alle Unternehmen von Intercom mit Paginierungsunterstützung auflisten
Listet alle Unternehmen von Intercom mit Paginierungsunterstützung auf. Hinweis: Dieser Endpunkt hat ein Limit von 10.000 Unternehmen, die über Paginierung zurückgegeben werden können. Für Datensätze mit mehr als 10.000 Unternehmen verwenden Sie stattdessen die Scroll-API.
#### Eingabe
@@ -259,8 +259,8 @@ Als Administrator auf eine Konversation in Intercom antworten
| `conversationId` | string | Ja | Konversations-ID, auf die geantwortet werden soll |
| `message_type` | string | Ja | Nachrichtentyp: "comment" oder "note" |
| `body` | string | Ja | Der Textinhalt der Antwort |
| `admin_id` | string | Ja | Die ID des Administrators, der die Antwort verfasst |
| `attachment_urls` | string | Nein | Kommagetrennte Liste von Bild-URLs (max. 10) |
| `admin_id` | string | Nein | Die ID des Administrators, der die Antwort verfasst. Wenn nicht angegeben, wird ein Standard-Administrator \(Operator/Fin\) verwendet. |
| `attachment_urls` | string | Nein | Kommagetrennte Liste von Bild-URLs \(max. 10\) |
#### Ausgabe

View File

@@ -1,6 +1,6 @@
---
title: Kalshi
description: Zugriff auf Prognosemarktdaten von Kalshi
description: Zugriff auf Prognosemärkte und Handel auf Kalshi
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
@@ -27,7 +27,7 @@ Durch die Nutzung dieser einheitlichen Tools und Endpunkte können Sie Kalshis P
## Nutzungsanleitung
Integrieren Sie Kalshi-Prognosemärkte in den Workflow. Kann Märkte, Markt, Ereignisse, Ereignis, Guthaben, Positionen, Aufträge, Orderbuch, Trades, Candlesticks, Ausführungen, Serien und Börsenstatus abrufen.
Integrieren Sie Kalshi-Prognosemärkte in den Workflow. Kann Märkte, Markt, Ereignisse, Ereignis, Kontostand, Positionen, Aufträge, Orderbuch, Trades, Candlesticks, Ausführungen, Serien, Börsenstatus abrufen und Trades platzieren/stornieren/ändern.
## Tools
@@ -172,16 +172,34 @@ Rufen Sie Ihre Bestellungen von Kalshi mit optionaler Filterung ab
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Bestelldaten und Metadaten |
### `kalshi_get_order`
Rufen Sie Details zu einem bestimmten Auftrag anhand der ID von Kalshi ab
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `keyId` | string | Ja | Ihre Kalshi API-Schlüssel-ID |
| `privateKey` | string | Ja | Ihr RSA Private Key \(PEM-Format\) |
| `orderId` | string | Ja | Die abzurufende Auftrags-ID |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Auftragsdaten |
### `kalshi_get_orderbook`
Rufen Sie das Orderbuch (Gebote und Anfragen) für einen bestimmten Markt ab
Rufen Sie das Orderbuch (Ja- und Nein-Gebote) für einen bestimmten Markt ab
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `ticker` | string | Ja | Markt-Ticker \(z.B. KXBTC-24DEC31\) |
| `depth` | number | Nein | Anzahl der Preisstufen, die pro Seite zurückgegeben werden sollen |
#### Ausgabe
@@ -192,49 +210,46 @@ Rufen Sie das Orderbuch (Gebote und Anfragen) für einen bestimmten Markt ab
### `kalshi_get_trades`
Ruft aktuelle Trades über alle Märkte oder für einen bestimmten Markt ab
Rufen Sie aktuelle Trades über alle Märkte hinweg ab
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `ticker` | string | Nein | Nach Markt-Ticker filtern |
| `minTs` | number | Nein | Minimaler Zeitstempel (Unix-Millisekunden) |
| `maxTs` | number | Nein | Maximaler Zeitstempel (Unix-Millisekunden) |
| `limit` | string | Nein | Anzahl der Ergebnisse (1-1000, Standard: 100) |
| `limit` | string | Nein | Anzahl der Ergebnisse \(1-1000, Standard: 100\) |
| `cursor` | string | Nein | Paginierungscursor für die nächste Seite |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Trade-Daten und Metadaten |
### `kalshi_get_candlesticks`
Ruft OHLC-Kerzendaten für einen bestimmten Markt ab
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `seriesTicker` | string | Ja | Serien-Ticker |
| `ticker` | string | Ja | Markt-Ticker (z.B. KXBTC-24DEC31) |
| `startTs` | number | Nein | Startzeitstempel (Unix-Millisekunden) |
| `endTs` | number | Nein | Endzeitstempel (Unix-Millisekunden) |
| `periodInterval` | number | Nein | Periodenintervall: 1 (1min), 60 (1std), oder 1440 (1tag) |
#### Output
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Candlestick-Daten und Metadaten |
| `output` | object | Handelsdaten und Metadaten |
### `kalshi_get_candlesticks`
OHLC-Kerzendaten für einen bestimmten Markt abrufen
#### Input
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `seriesTicker` | string | Ja | Serien-Ticker |
| `ticker` | string | Ja | Markt-Ticker \(z.B. KXBTC-24DEC31\) |
| `startTs` | number | Ja | Startzeitstempel \(Unix-Sekunden\) |
| `endTs` | number | Ja | Endzeitstempel \(Unix-Sekunden\) |
| `periodInterval` | number | Ja | Periodenintervall: 1 \(1min\), 60 \(1Stunde\) oder 1440 \(1Tag\) |
#### Output
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Kerzendaten und Metadaten |
### `kalshi_get_fills`
Rufen Sie Ihr Portfolio ab
Ihr Portfolio abrufen
#### Input
@@ -243,7 +258,7 @@ Rufen Sie Ihr Portfolio ab
| `keyId` | string | Ja | Ihre Kalshi API-Schlüssel-ID |
| `privateKey` | string | Ja | Ihr RSA Private Key \(PEM-Format\) |
| `ticker` | string | Nein | Nach Markt-Ticker filtern |
| `orderId` | string | Nein | Nach Auftrags-ID filtern |
| `orderId` | string | Nein | Nach Bestell-ID filtern |
| `minTs` | number | Nein | Minimaler Zeitstempel \(Unix-Millisekunden\) |
| `maxTs` | number | Nein | Maximaler Zeitstempel \(Unix-Millisekunden\) |
| `limit` | string | Nein | Anzahl der Ergebnisse \(1-1000, Standard: 100\) |
@@ -258,15 +273,15 @@ Rufen Sie Ihr Portfolio ab
### `kalshi_get_series_by_ticker`
Rufen Sie Details einer bestimmten Marktserie nach Ticker ab
Details einer bestimmten Marktserie nach Ticker abrufen
#### Input
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `seriesTicker` | string | Ja | Serien-Ticker |
#### Output
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
@@ -275,7 +290,7 @@ Rufen Sie Details einer bestimmten Marktserie nach Ticker ab
### `kalshi_get_exchange_status`
Ruft den aktuellen Status der Kalshi-Börse ab (Handels- und Börsenaktivität)
Den aktuellen Status der Kalshi-Börse abrufen (Handel und Börsenaktivität)
#### Eingabe
@@ -289,6 +304,89 @@ Ruft den aktuellen Status der Kalshi-Börse ab (Handels- und Börsenaktivität)
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Börsenstatus-Daten und Metadaten |
### `kalshi_create_order`
Eine neue Order auf einem Kalshi-Prognosemarkt erstellen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `keyId` | string | Ja | Ihre Kalshi API-Schlüssel-ID |
| `privateKey` | string | Ja | Ihr RSA Private Key \(PEM-Format\) |
| `ticker` | string | Ja | Markt-Ticker \(z.B. KXBTC-24DEC31\) |
| `side` | string | Ja | Seite der Order: 'yes' oder 'no' |
| `action` | string | Ja | Aktionstyp: 'buy' oder 'sell' |
| `count` | string | Ja | Anzahl der Kontrakte \(mindestens 1\) |
| `type` | string | Nein | Ordertyp: 'limit' oder 'market' \(Standard: limit\) |
| `yesPrice` | string | Nein | Yes-Preis in Cent \(1-99\) |
| `noPrice` | string | Nein | No-Preis in Cent \(1-99\) |
| `yesPriceDollars` | string | Nein | Yes-Preis in Dollar \(z.B. "0.56"\) |
| `noPriceDollars` | string | Nein | No-Preis in Dollar \(z.B. "0.56"\) |
| `clientOrderId` | string | Nein | Benutzerdefinierte Order-ID |
| `expirationTs` | string | Nein | Unix-Zeitstempel für Order-Ablauf |
| `timeInForce` | string | Nein | Gültigkeitsdauer: 'fill_or_kill', 'good_till_canceled', 'immediate_or_cancel' |
| `buyMaxCost` | string | Nein | Maximale Kosten in Cent \(aktiviert automatisch fill_or_kill\) |
| `postOnly` | string | Nein | Auf 'true' setzen für Maker-Only-Orders |
| `reduceOnly` | string | Nein | Auf 'true' setzen für ausschließliche Positionsreduzierung |
| `selfTradePreventionType` | string | Nein | Selbsthandel-Prävention: 'taker_at_cross' oder 'maker' |
| `orderGroupId` | string | Nein | Zugehörige Ordergruppen-ID |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Erstellte Auftragsdaten |
### `kalshi_cancel_order`
Einen bestehenden Auftrag auf Kalshi stornieren
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `keyId` | string | Ja | Ihre Kalshi API-Schlüssel-ID |
| `privateKey` | string | Ja | Ihr RSA Private Key \(PEM-Format\) |
| `orderId` | string | Ja | Die zu stornierende Auftrags-ID |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Stornierte Auftragsdaten |
### `kalshi_amend_order`
Preis oder Menge eines bestehenden Auftrags auf Kalshi ändern
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `keyId` | string | Ja | Ihre Kalshi API-Schlüssel-ID |
| `privateKey` | string | Ja | Ihr RSA Private Key \(PEM-Format\) |
| `orderId` | string | Ja | Die zu ändernde Auftrags-ID |
| `ticker` | string | Ja | Markt-Ticker |
| `side` | string | Ja | Seite des Auftrags: 'yes' oder 'no' |
| `action` | string | Ja | Aktionstyp: 'buy' oder 'sell' |
| `clientOrderId` | string | Ja | Die ursprüngliche vom Kunden angegebene Auftrags-ID |
| `updatedClientOrderId` | string | Ja | Die neue vom Kunden angegebene Auftrags-ID nach der Änderung |
| `count` | string | Nein | Aktualisierte Menge für den Auftrag |
| `yesPrice` | string | Nein | Aktualisierter Ja-Preis in Cent \(1-99\) |
| `noPrice` | string | Nein | Aktualisierter Nein-Preis in Cent \(1-99\) |
| `yesPriceDollars` | string | Nein | Aktualisierter Ja-Preis in Dollar \(z.B. "0.56"\) |
| `noPriceDollars` | string | Nein | Aktualisierter Nein-Preis in Dollar \(z.B. "0.56"\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Erfolgsstatus der Operation |
| `output` | object | Geänderte Auftragsdaten |
## Hinweise
- Kategorie: `tools`

View File

@@ -41,11 +41,11 @@ Rufen Sie eine Liste von Prognosemärkten von Polymarket mit optionaler Filterun
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `closed` | string | Nein | Nach geschlossenem Status filtern \(true/false\). Verwenden Sie false für nur aktive Märkte. |
| `order` | string | Nein | Sortierfeld \(z.B. id, volume, liquidity\) |
| `order` | string | Nein | Sortierfeld \(z.B. volumeNum, liquidityNum, startDate, endDate, createdAt\) |
| `ascending` | string | Nein | Sortierrichtung \(true für aufsteigend, false für absteigend\) |
| `tagId` | string | Nein | Nach Tag-ID filtern |
| `limit` | string | Nein | Anzahl der Ergebnisse pro Seite \(empfohlen: 25-50\) |
| `offset` | string | Nein | Paginierungsoffset \(überspringe so viele Ergebnisse\) |
| `offset` | string | Nein | Paginierungsoffset \(überspringe diese Anzahl an Ergebnissen\) |
#### Ausgabe
@@ -80,12 +80,12 @@ Ruft eine Liste von Events von Polymarket mit optionaler Filterung ab
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `closed` | string | Nein | Filtern nach geschlossenem Status \(true/false\). Verwenden Sie false für nur aktive Events. |
| `order` | string | Nein | Sortierfeld \(z.B. id, volume\) |
| `closed` | string | Nein | Nach geschlossenem Status filtern \(true/false\). Verwenden Sie false für nur aktive Events. |
| `order` | string | Nein | Sortierfeld \(z.B. volume, liquidity, startDate, endDate, createdAt\) |
| `ascending` | string | Nein | Sortierrichtung \(true für aufsteigend, false für absteigend\) |
| `tagId` | string | Nein | Filtern nach Tag-ID |
| `tagId` | string | Nein | Nach Tag-ID filtern |
| `limit` | string | Nein | Anzahl der Ergebnisse pro Seite \(empfohlen: 25-50\) |
| `offset` | string | Nein | Paginierungsoffset \(überspringe so viele Ergebnisse\) |
| `offset` | string | Nein | Paginierungsoffset \(überspringe diese Anzahl an Ergebnissen\) |
#### Ausgabe

View File

@@ -120,6 +120,82 @@ Lesen Sie die neuesten Nachrichten aus Slack-Kanälen. Rufen Sie den Konversatio
| --------- | ---- | ----------- |
| `messages` | array | Array von Nachrichtenobjekten aus dem Kanal |
### `slack_list_channels`
Listet alle Kanäle in einem Slack-Workspace auf. Gibt öffentliche und private Kanäle zurück, auf die der Bot Zugriff hat.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `authMethod` | string | Nein | Authentifizierungsmethode: oauth oder bot_token |
| `botToken` | string | Nein | Bot-Token für benutzerdefinierten Bot |
| `includePrivate` | boolean | Nein | Private Kanäle einschließen, in denen der Bot Mitglied ist \(Standard: true\) |
| `excludeArchived` | boolean | Nein | Archivierte Kanäle ausschließen \(Standard: true\) |
| `limit` | number | Nein | Maximale Anzahl der zurückzugebenden Kanäle \(Standard: 100, max: 200\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `channels` | array | Array von Kanalobjekten aus dem Workspace |
### `slack_list_members`
Listet alle Mitglieder (Benutzer-IDs) in einem Slack-Kanal auf. Verwenden Sie diese Funktion mit Get User Info, um IDs in Namen aufzulösen.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `authMethod` | string | Nein | Authentifizierungsmethode: oauth oder bot_token |
| `botToken` | string | Nein | Bot-Token für benutzerdefinierten Bot |
| `channel` | string | Ja | Kanal-ID, aus der Mitglieder aufgelistet werden sollen |
| `limit` | number | Nein | Maximale Anzahl der zurückzugebenden Mitglieder \(Standard: 100, max: 200\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `members` | array | Array von Benutzer-IDs, die Mitglieder des Kanals sind \(z.B. U1234567890\) |
### `slack_list_users`
Listet alle Benutzer in einem Slack-Workspace auf. Gibt Benutzerprofile mit Namen und Avataren zurück.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `authMethod` | string | Nein | Authentifizierungsmethode: oauth oder bot_token |
| `botToken` | string | Nein | Bot-Token für benutzerdefinierten Bot |
| `includeDeleted` | boolean | Nein | Deaktivierte/gelöschte Benutzer einbeziehen \(Standard: false\) |
| `limit` | number | Nein | Maximale Anzahl der zurückzugebenden Benutzer \(Standard: 100, max: 200\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `users` | array | Array von Benutzerobjekten aus dem Workspace |
### `slack_get_user`
Ruft detaillierte Informationen über einen bestimmten Slack-Benutzer anhand seiner Benutzer-ID ab.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `authMethod` | string | Nein | Authentifizierungsmethode: oauth oder bot_token |
| `botToken` | string | Nein | Bot-Token für benutzerdefinierten Bot |
| `userId` | string | Ja | Zu suchende Benutzer-ID \(z.B. U1234567890\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `user` | object | Detaillierte Benutzerinformationen |
### `slack_download`
Eine Datei von Slack herunterladen
@@ -148,7 +224,7 @@ Eine zuvor vom Bot in Slack gesendete Nachricht aktualisieren
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `authMethod` | string | Nein | Authentifizierungsmethode: oauth oder bot_token |
| `botToken` | string | Nein | Bot-Token für Custom Bot |
| `botToken` | string | Nein | Bot-Token für benutzerdefinierten Bot |
| `channel` | string | Ja | Kanal-ID, in dem die Nachricht gepostet wurde \(z.B. C1234567890\) |
| `timestamp` | string | Ja | Zeitstempel der zu aktualisierenden Nachricht \(z.B. 1405894322.002768\) |
| `text` | string | Ja | Neuer Nachrichtentext \(unterstützt Slack mrkdwn-Formatierung\) |
@@ -159,7 +235,7 @@ Eine zuvor vom Bot in Slack gesendete Nachricht aktualisieren
| --------- | ---- | ----------- |
| `message` | object | Vollständiges aktualisiertes Nachrichtenobjekt mit allen von Slack zurückgegebenen Eigenschaften |
| `content` | string | Erfolgsmeldung |
| `metadata` | object | Metadaten der aktualisierten Nachricht |
| `metadata` | object | Aktualisierte Nachrichtenmetadaten |
### `slack_delete_message`
@@ -170,7 +246,7 @@ Eine zuvor vom Bot in Slack gesendete Nachricht löschen
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `authMethod` | string | Nein | Authentifizierungsmethode: oauth oder bot_token |
| `botToken` | string | Nein | Bot-Token für Custom Bot |
| `botToken` | string | Nein | Bot-Token für benutzerdefinierten Bot |
| `channel` | string | Ja | Kanal-ID, in dem die Nachricht gepostet wurde \(z.B. C1234567890\) |
| `timestamp` | string | Ja | Zeitstempel der zu löschenden Nachricht \(z.B. 1405894322.002768\) |
@@ -183,7 +259,7 @@ Eine zuvor vom Bot in Slack gesendete Nachricht löschen
### `slack_add_reaction`
Emoji-Reaktion zu einer Slack-Nachricht hinzufügen
Eine Emoji-Reaktion zu einer Slack-Nachricht hinzufügen
#### Eingabe

View File

@@ -66,16 +66,16 @@ Um Umgebungsvariablen in Ihren Workflows zu referenzieren, verwenden Sie die `{{
height={350}
/>
## Variablen-Präzedenz
## Wie Variablen aufgelöst werden
Wenn Sie sowohl persönliche als auch Workspace-Variablen mit demselben Namen haben:
**Workspace-Variablen haben immer Vorrang** vor persönlichen Variablen, unabhängig davon, wer den Workflow ausführt.
1. **Workspace-Variablen haben Vorrang** vor persönlichen Variablen
2. Dies verhindert Namenskonflikte und gewährleistet ein konsistentes Verhalten in Team-Workflows
3. Wenn eine Workspace-Variable existiert, wird die persönliche Variable mit demselben Namen ignoriert
Wenn keine Workspace-Variable für einen Schlüssel existiert, werden persönliche Variablen verwendet:
- **Manuelle Ausführungen (UI)**: Ihre persönlichen Variablen
- **Automatisierte Ausführungen (API, Webhook, Zeitplan, bereitgestellter Chat)**: Persönliche Variablen des Workflow-Besitzers
<Callout type="warning">
Wählen Sie Variablennamen sorgfältig, um unbeabsichtigte Überschreibungen zu vermeiden. Erwägen Sie, persönliche Variablen mit Ihren Initialen oder Workspace-Variablen mit dem Projektnamen zu versehen.
<Callout type="info">
Persönliche Variablen eignen sich am besten zum Testen. Verwenden Sie Workspace-Variablen für Produktions-Workflows.
</Callout>
## Sicherheits-Best-Practices

View File

@@ -240,32 +240,78 @@ Retrieve execution details including the workflow state snapshot.
</Tab>
</Tabs>
## Webhook Subscriptions
## Notifications
Get real-time notifications when workflow executions complete. Webhooks are configured through the Sim UI in the workflow editor.
Get real-time notifications when workflow executions complete via webhook, email, or Slack. Notifications are configured at the workspace level from the Logs page.
### Configuration
Webhooks can be configured for each workflow through the workflow editor UI. Click the webhook icon in the control bar to set up your webhook subscriptions.
Configure notifications from the Logs page by clicking the menu button and selecting "Configure Notifications".
<div className="mx-auto w-full overflow-hidden rounded-lg">
<Video src="configure-webhook.mp4" width={700} height={450} />
</div>
**Notification Channels:**
- **Webhook**: Send HTTP POST requests to your endpoint
- **Email**: Receive email notifications with execution details
- **Slack**: Post messages to a Slack channel
**Available Configuration Options:**
**Workflow Selection:**
- Select specific workflows to monitor
- Or choose "All Workflows" to include current and future workflows
**Filtering Options:**
- `levelFilter`: Log levels to receive (`info`, `error`)
- `triggerFilter`: Trigger types to receive (`api`, `webhook`, `schedule`, `manual`, `chat`)
**Optional Data:**
- `includeFinalOutput`: Include the workflow's final output
- `includeTraceSpans`: Include detailed execution trace spans
- `includeRateLimits`: Include rate limit information (sync/async limits and remaining)
- `includeUsageData`: Include billing period usage and limits
### Alert Rules
Instead of receiving notifications for every execution, configure alert rules to be notified only when issues are detected:
**Consecutive Failures**
- Alert after X consecutive failed executions (e.g., 3 failures in a row)
- Resets when an execution succeeds
**Failure Rate**
- Alert when failure rate exceeds X% over the last Y hours
- Requires minimum 5 executions in the window
- Only triggers after the full time window has elapsed
**Latency Threshold**
- Alert when any execution takes longer than X seconds
- Useful for catching slow or hanging workflows
**Latency Spike**
- Alert when execution is X% slower than the average
- Compares against the average duration over the configured time window
- Requires minimum 5 executions to establish baseline
**Cost Threshold**
- Alert when a single execution costs more than $X
- Useful for catching expensive LLM calls
**No Activity**
- Alert when no executions occur within X hours
- Useful for monitoring scheduled workflows that should run regularly
**Error Count**
- Alert when error count exceeds X within a time window
- Tracks total errors, not consecutive
All alert types include a 1-hour cooldown to prevent notification spam.
### Webhook Configuration
For webhooks, additional options are available:
- `url`: Your webhook endpoint URL
- `secret`: Optional secret for HMAC signature verification
- `includeFinalOutput`: Include the workflow's final output in the payload
- `includeTraceSpans`: Include detailed execution trace spans
- `includeRateLimits`: Include the workflow owner's rate limit information
- `includeUsageData`: Include the workflow owner's usage and billing data
- `levelFilter`: Array of log levels to receive (`info`, `error`)
- `triggerFilter`: Array of trigger types to receive (`api`, `webhook`, `schedule`, `manual`, `chat`)
- `active`: Enable/disable the webhook subscription
### Webhook Payload
### Payload Structure
When a workflow execution completes, Sim sends a POST request to your webhook URL:
When a workflow execution completes, Sim sends the following payload (via webhook POST, email, or Slack):
```json
{
@@ -316,7 +362,7 @@ When a workflow execution completes, Sim sends a POST request to your webhook UR
### Webhook Headers
Each webhook request includes these headers:
Each webhook request includes these headers (webhook channel only):
- `sim-event`: Event type (always `workflow.execution.completed`)
- `sim-timestamp`: Unix timestamp in milliseconds

View File

@@ -147,4 +147,4 @@ The snapshot provides:
- Learn about [Cost Calculation](/execution/costs) to understand workflow pricing
- Explore the [External API](/execution/api) for programmatic log access
- Set up [Webhook notifications](/execution/api#webhook-subscriptions) for real-time alerts
- Set up [Notifications](/execution/api#notifications) for real-time alerts via webhook, email, or Slack

View File

@@ -149,6 +149,7 @@ Get the top pages of a target domain sorted by organic traffic. Returns page URL
| `date` | string | No | Date for historical data in YYYY-MM-DD format \(defaults to today\) |
| `limit` | number | No | Maximum number of results to return \(default: 100\) |
| `offset` | number | No | Number of results to skip for pagination |
| `select` | string | No | Comma-separated list of fields to return \(e.g., url,traffic,keywords,top_keyword,value\). Default: url,traffic,keywords,top_keyword,value |
| `apiKey` | string | Yes | Ahrefs API Key |
#### Output

View File

@@ -45,9 +45,9 @@ Create a new event in Google Calendar
| `summary` | string | Yes | Event title/summary |
| `description` | string | No | Event description |
| `location` | string | No | Event location |
| `startDateTime` | string | Yes | Start date and time \(RFC3339 format, e.g., 2025-06-03T10:00:00-08:00\) |
| `endDateTime` | string | Yes | End date and time \(RFC3339 format, e.g., 2025-06-03T11:00:00-08:00\) |
| `timeZone` | string | No | Time zone \(e.g., America/Los_Angeles\) |
| `startDateTime` | string | Yes | Start date and time. MUST include timezone offset \(e.g., 2025-06-03T10:00:00-08:00\) OR provide timeZone parameter |
| `endDateTime` | string | Yes | End date and time. MUST include timezone offset \(e.g., 2025-06-03T11:00:00-08:00\) OR provide timeZone parameter |
| `timeZone` | string | No | Time zone \(e.g., America/Los_Angeles\). Required if datetime does not include offset. Defaults to America/Los_Angeles if not provided. |
| `attendees` | array | No | Array of attendee email addresses |
| `sendUpdates` | string | No | How to send updates to attendees: all, externalOnly, or none |

View File

@@ -113,8 +113,8 @@ List files and folders in Google Drive
| --------- | ---- | -------- | ----------- |
| `folderSelector` | string | No | Select the folder to list files from |
| `folderId` | string | No | The ID of the folder to list files from \(internal use\) |
| `query` | string | No | A query to filter the files |
| `pageSize` | number | No | The number of files to return |
| `query` | string | No | Search term to filter files by name \(e.g. "budget" finds files with "budget" in the name\). Do NOT use Google Drive query syntax here - just provide a plain search term. |
| `pageSize` | number | No | The maximum number of files to return \(default: 100\) |
| `pageToken` | string | No | The page token to use for pagination |
#### Output

View File

@@ -91,8 +91,8 @@ Read data from a Google Sheets spreadsheet
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `spreadsheetId` | string | Yes | The ID of the spreadsheet to read from |
| `range` | string | No | The range of cells to read from |
| `spreadsheetId` | string | Yes | The ID of the spreadsheet \(found in the URL: docs.google.com/spreadsheets/d/\{SPREADSHEET_ID\}/edit\). |
| `range` | string | No | The A1 notation range to read \(e.g. "Sheet1!A1:D10", "A1:B5"\). Defaults to first sheet A1:Z1000 if not specified. |
#### Output
@@ -109,9 +109,9 @@ Write data to a Google Sheets spreadsheet
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `spreadsheetId` | string | Yes | The ID of the spreadsheet to write to |
| `range` | string | No | The range of cells to write to |
| `values` | array | Yes | The data to write to the spreadsheet |
| `spreadsheetId` | string | Yes | The ID of the spreadsheet |
| `range` | string | No | The A1 notation range to write to \(e.g. "Sheet1!A1:D10", "A1:B5"\) |
| `values` | array | Yes | The data to write as a 2D array \(e.g. \[\["Name", "Age"\], \["Alice", 30\], \["Bob", 25\]\]\) or array of objects. |
| `valueInputOption` | string | No | The format of the data to write |
| `includeValuesInResponse` | boolean | No | Whether to include the written values in the response |
@@ -134,8 +134,8 @@ Update data in a Google Sheets spreadsheet
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `spreadsheetId` | string | Yes | The ID of the spreadsheet to update |
| `range` | string | No | The range of cells to update |
| `values` | array | Yes | The data to update in the spreadsheet |
| `range` | string | No | The A1 notation range to update \(e.g. "Sheet1!A1:D10", "A1:B5"\) |
| `values` | array | Yes | The data to update as a 2D array \(e.g. \[\["Name", "Age"\], \["Alice", 30\]\]\) or array of objects. |
| `valueInputOption` | string | No | The format of the data to update |
| `includeValuesInResponse` | boolean | No | Whether to include the updated values in the response |
@@ -158,8 +158,8 @@ Append data to the end of a Google Sheets spreadsheet
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `spreadsheetId` | string | Yes | The ID of the spreadsheet to append to |
| `range` | string | No | The range of cells to append after |
| `values` | array | Yes | The data to append to the spreadsheet |
| `range` | string | No | The A1 notation range to append after \(e.g. "Sheet1", "Sheet1!A:D"\) |
| `values` | array | Yes | The data to append as a 2D array \(e.g. \[\["Alice", 30\], \["Bob", 25\]\]\) or array of objects. |
| `valueInputOption` | string | No | The format of the data to append |
| `insertDataOption` | string | No | How to insert the data \(OVERWRITE or INSERT_ROWS\) |
| `includeValuesInResponse` | boolean | No | Whether to include the appended values in the response |

View File

@@ -0,0 +1,185 @@
---
title: Google Slides
description: Read, write, and create presentations
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="google_slides"
color="#E0E0E0"
/>
{/* MANUAL-CONTENT-START:intro */}
[Google Slides](https://slides.google.com) is a dynamic cloud-based presentation application that allows users to create, edit, collaborate on, and present slideshows in real-time. As part of Google's productivity suite, Google Slides offers a flexible platform for designing engaging presentations, collaborating with others, and sharing content seamlessly through the cloud.
Learn how to integrate the Google Slides tools in Sim to effortlessly manage presentations as part of your automated workflows. With Sim, you can read, write, create, and update Google Slides presentations directly through your agents and automated processes, making it easy to deliver up-to-date information, generate custom reports, or produce branded decks programmatically.
With Google Slides, you can:
- **Create and edit presentations**: Design visually appealing slides with themes, layouts, and multimedia content
- **Collaborate in real-time**: Work simultaneously with teammates, comment, assign tasks, and receive live feedback on presentations
- **Present anywhere**: Display presentations online or offline, share links, or publish to the web
- **Add images and rich content**: Insert images, graphics, charts, and videos to make your presentations engaging
- **Integrate with other services**: Connect seamlessly with Google Drive, Docs, Sheets, and other third-party tools
- **Access from any device**: Use Google Slides on desktops, laptops, tablets, and mobile devices for maximum flexibility
In Sim, the Google Slides integration enables your agents to interact directly with presentation files programmatically. Automate tasks like reading slide content, inserting new slides or images, replacing text throughout a deck, generating new presentations, and retrieving slide thumbnails. This empowers you to scale content creation, keep presentations up-to-date, and embed them into automated document workflows. By connecting Sim with Google Slides, you facilitate AI-driven presentation management—making it easy to generate, update, or extract information from presentations without manual effort.
{/* MANUAL-CONTENT-END */}
## Usage Instructions
Integrate Google Slides into the workflow. Can read, write, create presentations, replace text, add slides, add images, and get thumbnails.
## Tools
### `google_slides_read`
Read content from a Google Slides presentation
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `presentationId` | string | Yes | The ID of the presentation to read |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `slides` | json | Array of slides with their content |
| `metadata` | json | Presentation metadata including ID, title, and URL |
### `google_slides_write`
Write or update content in a Google Slides presentation
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `presentationId` | string | Yes | The ID of the presentation to write to |
| `content` | string | Yes | The content to write to the slide |
| `slideIndex` | number | No | The index of the slide to write to \(defaults to first slide\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `updatedContent` | boolean | Indicates if presentation content was updated successfully |
| `metadata` | json | Updated presentation metadata including ID, title, and URL |
### `google_slides_create`
Create a new Google Slides presentation
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `title` | string | Yes | The title of the presentation to create |
| `content` | string | No | The content to add to the first slide |
| `folderSelector` | string | No | Select the folder to create the presentation in |
| `folderId` | string | No | The ID of the folder to create the presentation in \(internal use\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `metadata` | json | Created presentation metadata including ID, title, and URL |
### `google_slides_replace_all_text`
Find and replace all occurrences of text throughout a Google Slides presentation
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `presentationId` | string | Yes | The ID of the presentation |
| `findText` | string | Yes | The text to find \(e.g., \{\{placeholder\}\}\) |
| `replaceText` | string | Yes | The text to replace with |
| `matchCase` | boolean | No | Whether the search should be case-sensitive \(default: true\) |
| `pageObjectIds` | string | No | Comma-separated list of slide object IDs to limit replacements to specific slides \(leave empty for all slides\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `occurrencesChanged` | number | Number of text occurrences that were replaced |
| `metadata` | json | Operation metadata including presentation ID and URL |
### `google_slides_add_slide`
Add a new slide to a Google Slides presentation with a specified layout
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `presentationId` | string | Yes | The ID of the presentation |
| `layout` | string | No | The predefined layout for the slide \(BLANK, TITLE, TITLE_AND_BODY, TITLE_ONLY, SECTION_HEADER, etc.\). Defaults to BLANK. |
| `insertionIndex` | number | No | The optional zero-based index indicating where to insert the slide. If not specified, the slide is added at the end. |
| `placeholderIdMappings` | string | No | JSON array of placeholder mappings to assign custom object IDs to placeholders. Format: \[\{"layoutPlaceholder":\{"type":"TITLE"\},"objectId":"custom_title_id"\}\] |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `slideId` | string | The object ID of the newly created slide |
| `metadata` | json | Operation metadata including presentation ID, layout, and URL |
### `google_slides_add_image`
Insert an image into a specific slide in a Google Slides presentation
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `presentationId` | string | Yes | The ID of the presentation |
| `pageObjectId` | string | Yes | The object ID of the slide/page to add the image to |
| `imageUrl` | string | Yes | The publicly accessible URL of the image \(must be PNG, JPEG, or GIF, max 50MB\) |
| `width` | number | No | Width of the image in points \(default: 300\) |
| `height` | number | No | Height of the image in points \(default: 200\) |
| `positionX` | number | No | X position from the left edge in points \(default: 100\) |
| `positionY` | number | No | Y position from the top edge in points \(default: 100\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `imageId` | string | The object ID of the newly created image |
| `metadata` | json | Operation metadata including presentation ID and image URL |
### `google_slides_get_thumbnail`
Generate a thumbnail image of a specific slide in a Google Slides presentation
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `presentationId` | string | Yes | The ID of the presentation |
| `pageObjectId` | string | Yes | The object ID of the slide/page to get a thumbnail for |
| `thumbnailSize` | string | No | The size of the thumbnail: SMALL \(200px\), MEDIUM \(800px\), or LARGE \(1600px\). Defaults to MEDIUM. |
| `mimeType` | string | No | The MIME type of the thumbnail image: PNG or GIF. Defaults to PNG. |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `contentUrl` | string | URL to the thumbnail image \(valid for 30 minutes\) |
| `width` | number | Width of the thumbnail in pixels |
| `height` | number | Height of the thumbnail in pixels |
| `metadata` | json | Operation metadata including presentation ID and page object ID |
## Notes
- Category: `tools`
- Type: `google_slides`

View File

@@ -364,6 +364,8 @@ Update an existing schedule in incident.io
| `id` | string | Yes | The ID of the schedule to update |
| `name` | string | No | New name for the schedule |
| `timezone` | string | No | New timezone for the schedule \(e.g., America/New_York\) |
| `config` | string | No | Schedule configuration as JSON string with rotations. Example: \{"rotations": \[\{"name": "Primary", "users": \[\{"id": "user_id"\}\], "handover_start_at": "2024-01-01T09:00:00Z", "handovers": \[\{"interval": 1, "interval_type": "weekly"\}\]\}\]\} |
| `Example` | string | No | No description |
#### Output

View File

@@ -170,7 +170,7 @@ Create or update a company in Intercom
| `plan` | string | No | The company plan name |
| `size` | number | No | The number of employees in the company |
| `industry` | string | No | The industry the company operates in |
| `monthly_spend` | number | No | How much revenue the company generates for your business |
| `monthly_spend` | number | No | How much revenue the company generates for your business. Note: This field truncates floats to whole integers \(e.g., 155.98 becomes 155\) |
| `custom_attributes` | string | No | Custom attributes as JSON object |
#### Output
@@ -199,7 +199,7 @@ Retrieve a single company by ID from Intercom
### `intercom_list_companies`
List all companies from Intercom with pagination support
List all companies from Intercom with pagination support. Note: This endpoint has a limit of 10,000 companies that can be returned using pagination. For datasets larger than 10,000 companies, use the Scroll API instead.
#### Input
@@ -262,7 +262,7 @@ Reply to a conversation as an admin in Intercom
| `conversationId` | string | Yes | Conversation ID to reply to |
| `message_type` | string | Yes | Message type: "comment" or "note" |
| `body` | string | Yes | The text body of the reply |
| `admin_id` | string | Yes | The ID of the admin authoring the reply |
| `admin_id` | string | No | The ID of the admin authoring the reply. If not provided, a default admin \(Operator/Fin\) will be used. |
| `attachment_urls` | string | No | Comma-separated list of image URLs \(max 10\) |
#### Output

View File

@@ -1,6 +1,6 @@
---
title: Kalshi
description: Access prediction markets data from Kalshi
description: Access prediction markets and trade on Kalshi
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
@@ -28,7 +28,7 @@ By using these unified tools and endpoints, you can seamlessly incorporate Kalsh
## Usage Instructions
Integrate Kalshi prediction markets into the workflow. Can get markets, market, events, event, balance, positions, orders, orderbook, trades, candlesticks, fills, series, and exchange status.
Integrate Kalshi prediction markets into the workflow. Can get markets, market, events, event, balance, positions, orders, orderbook, trades, candlesticks, fills, series, exchange status, and place/cancel/amend trades.
@@ -175,16 +175,34 @@ Retrieve your orders from Kalshi with optional filtering
| `success` | boolean | Operation success status |
| `output` | object | Orders data and metadata |
### `kalshi_get_order`
Retrieve details of a specific order by ID from Kalshi
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `keyId` | string | Yes | Your Kalshi API Key ID |
| `privateKey` | string | Yes | Your RSA Private Key \(PEM format\) |
| `orderId` | string | Yes | The order ID to retrieve |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Order data |
### `kalshi_get_orderbook`
Retrieve the orderbook (bids and asks) for a specific market
Retrieve the orderbook (yes and no bids) for a specific market
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `ticker` | string | Yes | Market ticker \(e.g., KXBTC-24DEC31\) |
| `depth` | number | No | Number of price levels to return per side |
#### Output
@@ -195,15 +213,12 @@ Retrieve the orderbook (bids and asks) for a specific market
### `kalshi_get_trades`
Retrieve recent trades across all markets or for a specific market
Retrieve recent trades across all markets
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `ticker` | string | No | Filter by market ticker |
| `minTs` | number | No | Minimum timestamp \(Unix milliseconds\) |
| `maxTs` | number | No | Maximum timestamp \(Unix milliseconds\) |
| `limit` | string | No | Number of results \(1-1000, default: 100\) |
| `cursor` | string | No | Pagination cursor for next page |
@@ -224,9 +239,9 @@ Retrieve OHLC candlestick data for a specific market
| --------- | ---- | -------- | ----------- |
| `seriesTicker` | string | Yes | Series ticker |
| `ticker` | string | Yes | Market ticker \(e.g., KXBTC-24DEC31\) |
| `startTs` | number | No | Start timestamp \(Unix milliseconds\) |
| `endTs` | number | No | End timestamp \(Unix milliseconds\) |
| `periodInterval` | number | No | Period interval: 1 \(1min\), 60 \(1hour\), or 1440 \(1day\) |
| `startTs` | number | Yes | Start timestamp \(Unix seconds\) |
| `endTs` | number | Yes | End timestamp \(Unix seconds\) |
| `periodInterval` | number | Yes | Period interval: 1 \(1min\), 60 \(1hour\), or 1440 \(1day\) |
#### Output
@@ -292,6 +307,89 @@ Retrieve the current status of the Kalshi exchange (trading and exchange activit
| `success` | boolean | Operation success status |
| `output` | object | Exchange status data and metadata |
### `kalshi_create_order`
Create a new order on a Kalshi prediction market
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `keyId` | string | Yes | Your Kalshi API Key ID |
| `privateKey` | string | Yes | Your RSA Private Key \(PEM format\) |
| `ticker` | string | Yes | Market ticker \(e.g., KXBTC-24DEC31\) |
| `side` | string | Yes | Side of the order: 'yes' or 'no' |
| `action` | string | Yes | Action type: 'buy' or 'sell' |
| `count` | string | Yes | Number of contracts \(minimum 1\) |
| `type` | string | No | Order type: 'limit' or 'market' \(default: limit\) |
| `yesPrice` | string | No | Yes price in cents \(1-99\) |
| `noPrice` | string | No | No price in cents \(1-99\) |
| `yesPriceDollars` | string | No | Yes price in dollars \(e.g., "0.56"\) |
| `noPriceDollars` | string | No | No price in dollars \(e.g., "0.56"\) |
| `clientOrderId` | string | No | Custom order identifier |
| `expirationTs` | string | No | Unix timestamp for order expiration |
| `timeInForce` | string | No | Time in force: 'fill_or_kill', 'good_till_canceled', 'immediate_or_cancel' |
| `buyMaxCost` | string | No | Maximum cost in cents \(auto-enables fill_or_kill\) |
| `postOnly` | string | No | Set to 'true' for maker-only orders |
| `reduceOnly` | string | No | Set to 'true' for position reduction only |
| `selfTradePreventionType` | string | No | Self-trade prevention: 'taker_at_cross' or 'maker' |
| `orderGroupId` | string | No | Associated order group ID |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Created order data |
### `kalshi_cancel_order`
Cancel an existing order on Kalshi
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `keyId` | string | Yes | Your Kalshi API Key ID |
| `privateKey` | string | Yes | Your RSA Private Key \(PEM format\) |
| `orderId` | string | Yes | The order ID to cancel |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Canceled order data |
### `kalshi_amend_order`
Modify the price or quantity of an existing order on Kalshi
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `keyId` | string | Yes | Your Kalshi API Key ID |
| `privateKey` | string | Yes | Your RSA Private Key \(PEM format\) |
| `orderId` | string | Yes | The order ID to amend |
| `ticker` | string | Yes | Market ticker |
| `side` | string | Yes | Side of the order: 'yes' or 'no' |
| `action` | string | Yes | Action type: 'buy' or 'sell' |
| `clientOrderId` | string | Yes | The original client-specified order ID |
| `updatedClientOrderId` | string | Yes | The new client-specified order ID after amendment |
| `count` | string | No | Updated quantity for the order |
| `yesPrice` | string | No | Updated yes price in cents \(1-99\) |
| `noPrice` | string | No | Updated no price in cents \(1-99\) |
| `yesPriceDollars` | string | No | Updated yes price in dollars \(e.g., "0.56"\) |
| `noPriceDollars` | string | No | Updated no price in dollars \(e.g., "0.56"\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `output` | object | Amended order data |
## Notes

View File

@@ -29,6 +29,7 @@
"google_forms",
"google_search",
"google_sheets",
"google_slides",
"google_vault",
"grafana",
"hubspot",

View File

@@ -44,7 +44,7 @@ Retrieve a list of prediction markets from Polymarket with optional filtering
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `closed` | string | No | Filter by closed status \(true/false\). Use false for active markets only. |
| `order` | string | No | Sort field \(e.g., id, volume, liquidity\) |
| `order` | string | No | Sort field \(e.g., volumeNum, liquidityNum, startDate, endDate, createdAt\) |
| `ascending` | string | No | Sort direction \(true for ascending, false for descending\) |
| `tagId` | string | No | Filter by tag ID |
| `limit` | string | No | Number of results per page \(recommended: 25-50\) |
@@ -84,7 +84,7 @@ Retrieve a list of events from Polymarket with optional filtering
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `closed` | string | No | Filter by closed status \(true/false\). Use false for active events only. |
| `order` | string | No | Sort field \(e.g., id, volume\) |
| `order` | string | No | Sort field \(e.g., volume, liquidity, startDate, endDate, createdAt\) |
| `ascending` | string | No | Sort direction \(true for ascending, false for descending\) |
| `tagId` | string | No | Filter by tag ID |
| `limit` | string | No | Number of results per page \(recommended: 25-50\) |

View File

@@ -122,6 +122,82 @@ Read the latest messages from Slack channels. Retrieve conversation history with
| --------- | ---- | ----------- |
| `messages` | array | Array of message objects from the channel |
### `slack_list_channels`
List all channels in a Slack workspace. Returns public and private channels the bot has access to.
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `authMethod` | string | No | Authentication method: oauth or bot_token |
| `botToken` | string | No | Bot token for Custom Bot |
| `includePrivate` | boolean | No | Include private channels the bot is a member of \(default: true\) |
| `excludeArchived` | boolean | No | Exclude archived channels \(default: true\) |
| `limit` | number | No | Maximum number of channels to return \(default: 100, max: 200\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `channels` | array | Array of channel objects from the workspace |
### `slack_list_members`
List all members (user IDs) in a Slack channel. Use with Get User Info to resolve IDs to names.
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `authMethod` | string | No | Authentication method: oauth or bot_token |
| `botToken` | string | No | Bot token for Custom Bot |
| `channel` | string | Yes | Channel ID to list members from |
| `limit` | number | No | Maximum number of members to return \(default: 100, max: 200\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `members` | array | Array of user IDs who are members of the channel \(e.g., U1234567890\) |
### `slack_list_users`
List all users in a Slack workspace. Returns user profiles with names and avatars.
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `authMethod` | string | No | Authentication method: oauth or bot_token |
| `botToken` | string | No | Bot token for Custom Bot |
| `includeDeleted` | boolean | No | Include deactivated/deleted users \(default: false\) |
| `limit` | number | No | Maximum number of users to return \(default: 100, max: 200\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `users` | array | Array of user objects from the workspace |
### `slack_get_user`
Get detailed information about a specific Slack user by their user ID.
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `authMethod` | string | No | Authentication method: oauth or bot_token |
| `botToken` | string | No | Bot token for Custom Bot |
| `userId` | string | Yes | User ID to look up \(e.g., U1234567890\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `user` | object | Detailed user information |
### `slack_download`
Download a file from Slack

View File

@@ -66,16 +66,16 @@ To reference environment variables in your workflows, use the `{{}}` notation. W
height={350}
/>
## Variable Precedence
## How Variables are Resolved
When you have both personal and workspace variables with the same name:
**Workspace variables always take precedence** over personal variables, regardless of who runs the workflow.
1. **Workspace variables take precedence** over personal variables
2. This prevents naming conflicts and ensures consistent behavior across team workflows
3. If a workspace variable exists, the personal variable with the same name is ignored
When no workspace variable exists for a key, personal variables are used:
- **Manual runs (UI)**: Your personal variables
- **Automated runs (API, webhook, schedule, deployed chat)**: Workflow owner's personal variables
<Callout type="warning">
Choose variable names carefully to avoid unintended overrides. Consider prefixing personal variables with your initials or workspace variables with the project name.
<Callout type="info">
Personal variables are best for testing. Use workspace variables for production workflows.
</Callout>
## Security Best Practices

View File

@@ -251,32 +251,78 @@ Recupera detalles de ejecución incluyendo la instantánea del estado del flujo
</Tab>
</Tabs>
## Suscripciones a webhooks
## Notificaciones
Recibe notificaciones en tiempo real cuando se completan las ejecuciones de flujos de trabajo. Los webhooks se configuran a través de la interfaz de usuario de Sim en el editor de flujos de trabajo.
Recibe notificaciones en tiempo real cuando se completan las ejecuciones de flujos de trabajo a través de webhook, correo electrónico o Slack. Las notificaciones se configuran a nivel de espacio de trabajo desde la página de Registros.
### Configuración
Los webhooks pueden configurarse para cada flujo de trabajo a través de la interfaz de usuario del editor de flujos de trabajo. Haz clic en el icono de webhook en la barra de control para configurar tus suscripciones a webhooks.
Configura las notificaciones desde la página de Registros haciendo clic en el botón de menú y seleccionando "Configurar notificaciones".
<div className="mx-auto w-full overflow-hidden rounded-lg">
<Video src="configure-webhook.mp4" width={700} height={450} />
</div>
**Canales de notificación:**
- **Webhook**: Envía solicitudes HTTP POST a tu punto de conexión
- **Correo electrónico**: Recibe notificaciones por correo con detalles de la ejecución
- **Slack**: Publica mensajes en un canal de Slack
**Opciones de configuración disponibles:**
- `url`: URL del punto final de tu webhook
**Selección de flujos de trabajo:**
- Selecciona flujos de trabajo específicos para monitorear
- O elige "Todos los flujos de trabajo" para incluir los flujos actuales y futuros
**Opciones de filtrado:**
- `levelFilter`: Niveles de registro a recibir (`info`, `error`)
- `triggerFilter`: Tipos de disparadores a recibir (`api`, `webhook`, `schedule`, `manual`, `chat`)
**Datos opcionales:**
- `includeFinalOutput`: Incluir la salida final del flujo de trabajo
- `includeTraceSpans`: Incluir trazas detalladas de la ejecución
- `includeRateLimits`: Incluir información de límites de tasa (límites sincrónicos/asincrónicos y restantes)
- `includeUsageData`: Incluir uso y límites del período de facturación
### Reglas de alerta
En lugar de recibir notificaciones por cada ejecución, configura reglas de alerta para ser notificado solo cuando se detecten problemas:
**Fallos consecutivos**
- Alerta después de X ejecuciones fallidas consecutivas (por ejemplo, 3 fallos seguidos)
- Se reinicia cuando una ejecución tiene éxito
**Tasa de fallos**
- Alerta cuando la tasa de fallos supera el X% durante las últimas Y horas
- Requiere un mínimo de 5 ejecuciones en la ventana de tiempo
- Solo se activa después de que haya transcurrido la ventana de tiempo completa
**Umbral de latencia**
- Alerta cuando cualquier ejecución tarda más de X segundos
- Útil para detectar flujos de trabajo lentos o bloqueados
**Pico de latencia**
- Alerta cuando la ejecución es X% más lenta que el promedio
- Compara con la duración promedio durante la ventana de tiempo configurada
- Requiere un mínimo de 5 ejecuciones para establecer una línea base
**Umbral de costo**
- Alerta cuando una sola ejecución cuesta más de $X
- Útil para detectar llamadas costosas a LLM
**Sin actividad**
- Alerta cuando no ocurren ejecuciones dentro de X horas
- Útil para monitorear flujos de trabajo programados que deberían ejecutarse regularmente
**Recuento de errores**
- Alerta cuando el recuento de errores excede X dentro de una ventana de tiempo
- Rastrea errores totales, no consecutivos
Todos los tipos de alertas incluyen un período de enfriamiento de 1 hora para evitar el spam de notificaciones.
### Configuración de webhook
Para webhooks, hay opciones adicionales disponibles:
- `url`: La URL de tu endpoint webhook
- `secret`: Secreto opcional para verificación de firma HMAC
- `includeFinalOutput`: Incluir la salida final del flujo de trabajo en la carga útil
- `includeTraceSpans`: Incluir intervalos de seguimiento de ejecución detallados
- `includeRateLimits`: Incluir información del límite de tasa del propietario del flujo de trabajo
- `includeUsageData`: Incluir datos de uso y facturación del propietario del flujo de trabajo
- `levelFilter`: Array de niveles de registro a recibir (`info`, `error`)
- `triggerFilter`: Array de tipos de disparadores a recibir (`api`, `webhook`, `schedule`, `manual`, `chat`)
- `active`: Habilitar/deshabilitar la suscripción al webhook
### Carga útil del webhook
### Estructura de carga útil
Cuando se completa la ejecución de un flujo de trabajo, Sim envía una solicitud POST a tu URL de webhook:
Cuando se completa la ejecución de un flujo de trabajo, Sim envía la siguiente carga útil (vía webhook POST, correo electrónico o Slack):
```json
{
@@ -325,9 +371,9 @@ Cuando se completa la ejecución de un flujo de trabajo, Sim envía una solicitu
}
```
### Cabeceras de webhook
### Encabezados de webhook
Cada solicitud de webhook incluye estas cabeceras:
Cada solicitud de webhook incluye estos encabezados (solo canal webhook):
- `sim-event`: Tipo de evento (siempre `workflow.execution.completed`)
- `sim-timestamp`: Marca de tiempo Unix en milisegundos
@@ -416,15 +462,15 @@ Las entregas de webhook fallidas se reintentan con retroceso exponencial y fluct
- Retrasos de reintento: 5 segundos, 15 segundos, 1 minuto, 3 minutos, 10 minutos
- Fluctuación: Hasta un 10% de retraso adicional para prevenir el efecto de manada
- Solo las respuestas HTTP 5xx y 429 activan reintentos
- Las entregas agotan el tiempo de espera después de 30 segundos
- Las entregas agotan el tiempo después de 30 segundos
<Callout type="info">
Las entregas de webhook se procesan de forma asíncrona y no afectan al rendimiento de ejecución del flujo de trabajo.
Las entregas de webhook se procesan de forma asíncrona y no afectan el rendimiento de ejecución del flujo de trabajo.
</Callout>
## Mejores prácticas
1. **Estrategia de sondeo**: Al sondear registros, utiliza paginación basada en cursor con `order=asc` y `startDate` para obtener nuevos registros de manera eficiente.
1. **Estrategia de sondeo**: Cuando consultes registros, utiliza paginación basada en cursores con `order=asc` y `startDate` para obtener nuevos registros de manera eficiente.
2. **Seguridad de webhook**: Siempre configura un secreto de webhook y verifica las firmas para asegurar que las solicitudes provienen de Sim.
@@ -432,23 +478,23 @@ Las entregas de webhook fallidas se reintentan con retroceso exponencial y fluct
4. **Privacidad**: Por defecto, `finalOutput` y `traceSpans` están excluidos de las respuestas. Habilítalos solo si necesitas los datos y comprendes las implicaciones de privacidad.
5. **Limitación de tasa**: Implementa retroceso exponencial cuando recibas respuestas 429. Consulta la cabecera `Retry-After` para conocer el tiempo de espera recomendado.
5. **Limitación de tasa**: Implementa retroceso exponencial cuando recibas respuestas 429. Verifica la cabecera `Retry-After` para conocer el tiempo de espera recomendado.
## Limitación de tasa
La API implementa limitación de tasa para garantizar un uso justo:
La API implementa limitación de tasa para asegurar un uso justo:
- **Plan gratuito**: 10 solicitudes por minuto
- **Plan Pro**: 30 solicitudes por minuto
- **Plan Team**: 60 solicitudes por minuto
- **Plan Enterprise**: Límites personalizados
La información del límite de tasa se incluye en los encabezados de respuesta:
- `X-RateLimit-Limit`: Máximo de solicitudes por ventana
La información de límite de tasa se incluye en las cabeceras de respuesta:
- `X-RateLimit-Limit`: Solicitudes máximas por ventana
- `X-RateLimit-Remaining`: Solicitudes restantes en la ventana actual
- `X-RateLimit-Reset`: Marca de tiempo ISO cuando se reinicia la ventana
- `X-RateLimit-Reset`: Marca de tiempo ISO cuando la ventana se reinicia
## Ejemplo: Sondeo para nuevos registros
## Ejemplo: Sondeo de nuevos registros
```javascript
let cursor = null;

View File

@@ -147,4 +147,4 @@ La instantánea proporciona:
- Aprende sobre [Cálculo de costos](/execution/costs) para entender los precios de los flujos de trabajo
- Explora la [API externa](/execution/api) para acceso programático a los registros
- Configura [notificaciones por Webhook](/execution/api#webhook-subscriptions) para alertas en tiempo real
- Configura [Notificaciones](/execution/api#notifications) para alertas en tiempo real vía webhook, correo electrónico o Slack

View File

@@ -140,12 +140,13 @@ Obtén las páginas principales de un dominio objetivo ordenadas por tráfico or
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | ---------- | ----------- |
| `target` | string | Sí | El dominio objetivo para analizar |
| `target` | string | Sí | El dominio objetivo a analizar |
| `country` | string | No | Código de país para datos de tráfico \(p. ej., us, gb, de\). Predeterminado: us |
| `mode` | string | No | Modo de análisis: domain \(dominio completo\), prefix \(prefijo URL\), subdomains \(incluir todos los subdominios\) |
| `date` | string | No | Fecha para datos históricos en formato AAAA-MM-DD \(predeterminado: hoy\) |
| `date` | string | No | Fecha para datos históricos en formato AAAA-MM-DD \(por defecto es hoy\) |
| `limit` | number | No | Número máximo de resultados a devolver \(predeterminado: 100\) |
| `offset` | number | No | Número de resultados a omitir para paginación |
| `select` | string | No | Lista separada por comas de campos a devolver \(p. ej., url,traffic,keywords,top_keyword,value\). Predeterminado: url,traffic,keywords,top_keyword,value |
| `apiKey` | string | Sí | Clave API de Ahrefs |
#### Salida

View File

@@ -42,9 +42,9 @@ Crear un nuevo evento en Google Calendar
| `summary` | string | Sí | Título/resumen del evento |
| `description` | string | No | Descripción del evento |
| `location` | string | No | Ubicación del evento |
| `startDateTime` | string | Sí | Fecha y hora de inicio \(formato RFC3339, p. ej., 2025-06-03T10:00:00-08:00\) |
| `endDateTime` | string | Sí | Fecha y hora de finalización \(formato RFC3339, p. ej., 2025-06-03T11:00:00-08:00\) |
| `timeZone` | string | No | Zona horaria \(p. ej., America/Los_Angeles\) |
| `startDateTime` | string | Sí | Fecha y hora de inicio. DEBE incluir el desplazamiento de zona horaria \(p. ej., 2025-06-03T10:00:00-08:00\) O proporcionar el parámetro timeZone |
| `endDateTime` | string | Sí | Fecha y hora de finalización. DEBE incluir el desplazamiento de zona horaria \(p. ej., 2025-06-03T11:00:00-08:00\) O proporcionar el parámetro timeZone |
| `timeZone` | string | No | Zona horaria \(p. ej., America/Los_Angeles\). Obligatorio si la fecha y hora no incluye desplazamiento. Por defecto es America/Los_Angeles si no se proporciona. |
| `attendees` | array | No | Array de direcciones de correo electrónico de los asistentes |
| `sendUpdates` | string | No | Cómo enviar actualizaciones a los asistentes: all, externalOnly o none |

View File

@@ -108,10 +108,10 @@ Listar archivos y carpetas en Google Drive
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `folderSelector` | string | No | Seleccionar la carpeta desde la que listar archivos |
| `folderSelector` | string | No | Selecciona la carpeta desde la que listar archivos |
| `folderId` | string | No | El ID de la carpeta desde la que listar archivos \(uso interno\) |
| `query` | string | No | Una consulta para filtrar los archivos |
| `pageSize` | number | No | El número de archivos a devolver |
| `query` | string | No | Término de búsqueda para filtrar archivos por nombre \(p. ej. "presupuesto" encuentra archivos con "presupuesto" en el nombre\). NO uses la sintaxis de consulta de Google Drive aquí - solo proporciona un término de búsqueda simple. |
| `pageSize` | number | No | El número máximo de archivos a devolver \(predeterminado: 100\) |
| `pageToken` | string | No | El token de página para usar en la paginación |
#### Salida

View File

@@ -87,9 +87,9 @@ Leer datos de una hoja de cálculo de Google Sheets
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | ----------- | ----------- |
| `spreadsheetId` | string | Sí | El ID de la hoja de cálculo de la que leer |
| `range` | string | No | El rango de celdas del que leer |
| --------- | ---- | -------- | ----------- |
| `spreadsheetId` | string | Sí | El ID de la hoja de cálculo \(se encuentra en la URL: docs.google.com/spreadsheets/d/\{SPREADSHEET_ID\}/edit\). |
| `range` | string | No | El rango en notación A1 para leer \(por ejemplo, "Sheet1!A1:D10", "A1:B5"\). Si no se especifica, por defecto es la primera hoja A1:Z1000. |
#### Salida
@@ -105,10 +105,10 @@ Escribir datos en una hoja de cálculo de Google Sheets
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | ----------- | ----------- |
| `spreadsheetId` | string | Sí | El ID de la hoja de cálculo en la que escribir |
| `range` | string | No | El rango de celdas en el que escribir |
| `values` | array | Sí | Los datos a escribir en la hoja de cálculo |
| --------- | ---- | -------- | ----------- |
| `spreadsheetId` | string | Sí | El ID de la hoja de cálculo |
| `range` | string | No | El rango en notación A1 donde escribir \(por ejemplo, "Sheet1!A1:D10", "A1:B5"\) |
| `values` | array | Sí | Los datos a escribir como un array 2D \(por ejemplo, \[\["Nombre", "Edad"\], \["Alice", 30\], \["Bob", 25\]\]\) o array de objetos. |
| `valueInputOption` | string | No | El formato de los datos a escribir |
| `includeValuesInResponse` | boolean | No | Si se deben incluir los valores escritos en la respuesta |
@@ -129,10 +129,10 @@ Actualizar datos en una hoja de cálculo de Google Sheets
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | ----------- | ----------- |
| --------- | ---- | -------- | ----------- |
| `spreadsheetId` | string | Sí | El ID de la hoja de cálculo a actualizar |
| `range` | string | No | El rango de celdas a actualizar |
| `values` | array | Sí | Los datos para actualizar en la hoja de cálculo |
| `range` | string | No | El rango en notación A1 para actualizar \(por ejemplo, "Sheet1!A1:D10", "A1:B5"\) |
| `values` | array | Sí | Los datos para actualizar como un array 2D \(por ejemplo, \[\["Nombre", "Edad"\], \["Alice", 30\]\]\) o array de objetos. |
| `valueInputOption` | string | No | El formato de los datos a actualizar |
| `includeValuesInResponse` | boolean | No | Si se deben incluir los valores actualizados en la respuesta |
@@ -153,12 +153,12 @@ Añadir datos al final de una hoja de cálculo de Google Sheets
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| --------- | ---- | ----------- | ----------- |
| `spreadsheetId` | string | Sí | El ID de la hoja de cálculo a la que añadir datos |
| `range` | string | No | El rango de celdas después del cual añadir datos |
| `values` | array | Sí | Los datos a añadir a la hoja de cálculo |
| `range` | string | No | El rango en notación A1 después del cual añadir datos (ej. "Hoja1", "Hoja1!A:D") |
| `values` | array | Sí | Los datos a añadir como un array 2D (ej. [["Alice", 30], ["Bob", 25]]) o array de objetos. |
| `valueInputOption` | string | No | El formato de los datos a añadir |
| `insertDataOption` | string | No | Cómo insertar los datos \(OVERWRITE o INSERT_ROWS\) |
| `insertDataOption` | string | No | Cómo insertar los datos (OVERWRITE o INSERT_ROWS) |
| `includeValuesInResponse` | boolean | No | Si se deben incluir los valores añadidos en la respuesta |
#### Salida

View File

@@ -0,0 +1,180 @@
---
title: Google Slides
description: Lee, escribe y crea presentaciones
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="google_slides"
color="#E0E0E0"
/>
{/* MANUAL-CONTENT-START:intro */}
[Google Slides](https://slides.google.com) es una aplicación dinámica de presentaciones basada en la nube que permite a los usuarios crear, editar, colaborar y presentar diapositivas en tiempo real. Como parte del conjunto de productividad de Google, Google Slides ofrece una plataforma flexible para diseñar presentaciones atractivas, colaborar con otros y compartir contenido sin problemas a través de la nube.
Aprende cómo integrar las herramientas de Google Slides en Sim para gestionar presentaciones sin esfuerzo como parte de tus flujos de trabajo automatizados. Con Sim, puedes leer, escribir, crear y actualizar presentaciones de Google Slides directamente a través de tus agentes y procesos automatizados, facilitando la entrega de información actualizada, la generación de informes personalizados o la producción de presentaciones corporativas de forma programática.
Con Google Slides, puedes:
- **Crear y editar presentaciones**: Diseña diapositivas visualmente atractivas con temas, diseños y contenido multimedia
- **Colaborar en tiempo real**: Trabaja simultáneamente con compañeros, comenta, asigna tareas y recibe comentarios en vivo sobre las presentaciones
- **Presentar en cualquier lugar**: Muestra presentaciones en línea o sin conexión, comparte enlaces o publica en la web
- **Añadir imágenes y contenido enriquecido**: Inserta imágenes, gráficos, diagramas y videos para hacer tus presentaciones más atractivas
- **Integrar con otros servicios**: Conéctate sin problemas con Google Drive, Docs, Sheets y otras herramientas de terceros
- **Acceder desde cualquier dispositivo**: Usa Google Slides en ordenadores de escritorio, portátiles, tabletas y dispositivos móviles para máxima flexibilidad
En Sim, la integración con Google Slides permite a tus agentes interactuar directamente con archivos de presentación de forma programática. Automatiza tareas como leer el contenido de diapositivas, insertar nuevas diapositivas o imágenes, reemplazar texto en toda una presentación, generar nuevas presentaciones y recuperar miniaturas de diapositivas. Esto te permite escalar la creación de contenido, mantener las presentaciones actualizadas e incorporarlas en flujos de trabajo de documentos automatizados. Al conectar Sim con Google Slides, facilitas la gestión de presentaciones impulsada por IA, haciendo que sea fácil generar, actualizar o extraer información de presentaciones sin esfuerzo manual.
{/* MANUAL-CONTENT-END */}
## Instrucciones de uso
Integra Google Slides en el flujo de trabajo. Puede leer, escribir, crear presentaciones, reemplazar texto, añadir diapositivas, añadir imágenes y obtener miniaturas.
## Herramientas
### `google_slides_read`
Leer contenido de una presentación de Google Slides
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `presentationId` | string | Sí | El ID de la presentación a leer |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `slides` | json | Array de diapositivas con su contenido |
| `metadata` | json | Metadatos de la presentación incluyendo ID, título y URL |
### `google_slides_write`
Escribir o actualizar contenido en una presentación de Google Slides
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `presentationId` | string | Sí | El ID de la presentación en la que escribir |
| `content` | string | Sí | El contenido a escribir en la diapositiva |
| `slideIndex` | number | No | El índice de la diapositiva en la que escribir \(por defecto, primera diapositiva\) |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `updatedContent` | boolean | Indica si el contenido de la presentación se actualizó correctamente |
| `metadata` | json | Metadatos de la presentación actualizada incluyendo ID, título y URL |
### `google_slides_create`
Crear una nueva presentación de Google Slides
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `title` | string | Sí | El título de la presentación a crear |
| `content` | string | No | El contenido a añadir a la primera diapositiva |
| `folderSelector` | string | No | Seleccionar la carpeta donde crear la presentación |
| `folderId` | string | No | El ID de la carpeta donde crear la presentación \(uso interno\) |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `metadata` | json | Metadatos de la presentación creada, incluyendo ID, título y URL |
### `google_slides_replace_all_text`
Buscar y reemplazar todas las ocurrencias de texto en una presentación de Google Slides
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `presentationId` | string | Sí | El ID de la presentación |
| `findText` | string | Sí | El texto a buscar \(p. ej., \{\{placeholder\}\}\) |
| `replaceText` | string | Sí | El texto con el que reemplazar |
| `matchCase` | boolean | No | Si la búsqueda debe distinguir entre mayúsculas y minúsculas \(predeterminado: true\) |
| `pageObjectIds` | string | No | Lista separada por comas de IDs de objetos de diapositivas para limitar los reemplazos a diapositivas específicas \(dejar vacío para todas las diapositivas\) |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `occurrencesChanged` | number | Número de ocurrencias de texto que fueron reemplazadas |
| `metadata` | json | Metadatos de la operación, incluyendo ID de la presentación y URL |
### `google_slides_add_slide`
Añadir una nueva diapositiva a una presentación de Google Slides con un diseño específico
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `presentationId` | string | Sí | El ID de la presentación |
| `layout` | string | No | El diseño predefinido para la diapositiva \(BLANK, TITLE, TITLE_AND_BODY, TITLE_ONLY, SECTION_HEADER, etc.\). Por defecto es BLANK. |
| `insertionIndex` | number | No | El índice opcional basado en cero que indica dónde insertar la diapositiva. Si no se especifica, la diapositiva se añade al final. |
| `placeholderIdMappings` | string | No | Array JSON de mapeos de marcadores de posición para asignar IDs de objeto personalizados a los marcadores. Formato: \[\{"layoutPlaceholder":\{"type":"TITLE"\},"objectId":"custom_title_id"\}\] |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `slideId` | string | El ID del objeto de la diapositiva recién creada |
| `metadata` | json | Metadatos de la operación incluyendo ID de la presentación, diseño y URL |
### `google_slides_add_image`
Insertar una imagen en una diapositiva específica de una presentación de Google Slides
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `presentationId` | string | Sí | El ID de la presentación |
| `pageObjectId` | string | Sí | El ID del objeto de la diapositiva/página donde se añadirá la imagen |
| `imageUrl` | string | Sí | La URL de acceso público de la imagen \(debe ser PNG, JPEG o GIF, máximo 50MB\) |
| `width` | number | No | Ancho de la imagen en puntos \(predeterminado: 300\) |
| `height` | number | No | Altura de la imagen en puntos \(predeterminado: 200\) |
| `positionX` | number | No | Posición X desde el borde izquierdo en puntos \(predeterminado: 100\) |
| `positionY` | number | No | Posición Y desde el borde superior en puntos \(predeterminado: 100\) |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `imageId` | string | El ID del objeto de la imagen recién creada |
| `metadata` | json | Metadatos de la operación incluyendo ID de la presentación y URL de la imagen |
### `google_slides_get_thumbnail`
Generar una imagen en miniatura de una diapositiva específica en una presentación de Google Slides
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `presentationId` | string | Sí | El ID de la presentación |
| `pageObjectId` | string | Sí | El ID del objeto de la diapositiva/página para obtener una miniatura |
| `thumbnailSize` | string | No | El tamaño de la miniatura: SMALL \(200px\), MEDIUM \(800px\), o LARGE \(1600px\). Por defecto es MEDIUM. |
| `mimeType` | string | No | El tipo MIME de la imagen en miniatura: PNG o GIF. Por defecto es PNG. |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `contentUrl` | string | URL de la imagen en miniatura \(válida durante 30 minutos\) |
| `width` | number | Ancho de la miniatura en píxeles |
| `height` | number | Alto de la miniatura en píxeles |
| `metadata` | json | Metadatos de la operación incluyendo el ID de la presentación y el ID del objeto de la página |
## Notas
- Categoría: `tools`
- Tipo: `google_slides`

View File

@@ -357,10 +357,12 @@ Actualizar un horario existente en incident.io
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `apiKey` | cadena | Sí | Clave API de incident.io |
| `id` | cadena | Sí | El ID del horario a actualizar |
| `name` | cadena | No | Nuevo nombre para el horario |
| `timezone` | cadena | No | Nueva zona horaria para el horario \(p. ej., America/New_York\) |
| `apiKey` | string | Sí | Clave API de incident.io |
| `id` | string | Sí | El ID del horario a actualizar |
| `name` | string | No | Nuevo nombre para el horario |
| `timezone` | string | No | Nueva zona horaria para el horario \(p. ej., America/New_York\) |
| `config` | string | No | Configuración del horario como cadena JSON con rotaciones. Ejemplo: \{"rotations": \[\{"name": "Primary", "users": \[\{"id": "user_id"\}\], "handover_start_at": "2024-01-01T09:00:00Z", "handovers": \[\{"interval": 1, "interval_type": "weekly"\}\]\}\]\} |
| `Example` | string | No | Sin descripción |
#### Salida

View File

@@ -167,7 +167,7 @@ Crear o actualizar una empresa en Intercom
| `plan` | string | No | El nombre del plan de la empresa |
| `size` | number | No | El número de empleados en la empresa |
| `industry` | string | No | El sector en el que opera la empresa |
| `monthly_spend` | number | No | Cuántos ingresos genera la empresa para tu negocio |
| `monthly_spend` | number | No | Cuántos ingresos genera la empresa para tu negocio. Nota: Este campo trunca los decimales a números enteros \(por ejemplo, 155.98 se convierte en 155\) |
| `custom_attributes` | string | No | Atributos personalizados como objeto JSON |
#### Salida
@@ -196,7 +196,7 @@ Recuperar una única empresa por ID desde Intercom
### `intercom_list_companies`
Listar todas las empresas de Intercom con soporte de paginación
Lista todas las empresas de Intercom con soporte de paginación. Nota: Este endpoint tiene un límite de 10,000 empresas que pueden ser devueltas usando paginación. Para conjuntos de datos mayores a 10,000 empresas, usa la API Scroll en su lugar.
#### Entrada
@@ -259,8 +259,8 @@ Responder a una conversación como administrador en Intercom
| `conversationId` | string | Sí | ID de la conversación a la que responder |
| `message_type` | string | Sí | Tipo de mensaje: "comment" o "note" |
| `body` | string | Sí | El texto del cuerpo de la respuesta |
| `admin_id` | string | | El ID del administrador que escribe la respuesta |
| `attachment_urls` | string | No | Lista separada por comas de URLs de imágenes (máx. 10) |
| `admin_id` | string | No | El ID del administrador que escribe la respuesta. Si no se proporciona, se utilizará un administrador predeterminado \(Operator/Fin\). |
| `attachment_urls` | string | No | Lista separada por comas de URLs de imágenes \(máximo 10\) |
#### Salida

View File

@@ -1,6 +1,6 @@
---
title: Kalshi
description: Accede a datos de mercados de predicción de Kalshi
description: Accede a mercados de predicción y opera en Kalshi
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
@@ -27,7 +27,7 @@ Al utilizar estas herramientas y puntos de acceso unificados, puedes incorporar
## Instrucciones de uso
Integra los mercados de predicción de Kalshi en el flujo de trabajo. Puede obtener mercados, mercado, eventos, evento, saldo, posiciones, órdenes, libro de órdenes, operaciones, velas, ejecuciones, series y estado del mercado.
Integra los mercados de predicción de Kalshi en el flujo de trabajo. Puede obtener mercados, mercado específico, eventos, evento específico, saldo, posiciones, órdenes, libro de órdenes, operaciones, gráficos de velas, ejecuciones, series, estado del intercambio y realizar/cancelar/modificar operaciones.
## Herramientas
@@ -172,35 +172,50 @@ Recupera tus órdenes de Kalshi con filtrado opcional
| `success` | boolean | Estado de éxito de la operación |
| `output` | object | Datos de órdenes y metadatos |
### `kalshi_get_orderbook`
### `kalshi_get_order`
Recupera el libro de órdenes (ofertas de compra y venta) para un mercado específico
Recupera detalles de una orden específica por ID desde Kalshi
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `ticker` | string | Sí | Ticker del mercado \(p. ej., KXBTC-24DEC31\) |
| `depth` | number | No | Número de niveles de precio a devolver por lado |
| `keyId` | string | Sí | Tu ID de clave API de Kalshi |
| `privateKey` | string | | Tu clave privada RSA \(formato PEM\) |
| `orderId` | string | Sí | El ID de la orden a recuperar |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `success` | boolean | Estado de éxito de la operación |
| `output` | object | Datos y metadatos del libro de órdenes |
| `output` | object | Datos de la orden |
### `kalshi_get_trades`
### `kalshi_get_orderbook`
Recuperar operaciones recientes en todos los mercados o para un mercado específico
Recupera el libro de órdenes (ofertas de sí y no) para un mercado específico
#### Entrada
| Parámetro | Tipo | Requerido | Descripción |
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `ticker` | string | Sí | Ticker del mercado \(p. ej., KXBTC-24DEC31\) |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `success` | boolean | Estado de éxito de la operación |
| `output` | object | Datos del libro de órdenes y metadatos |
### `kalshi_get_trades`
Recupera operaciones recientes de todos los mercados
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `ticker` | string | No | Filtrar por ticker de mercado |
| `minTs` | number | No | Marca de tiempo mínima \(Unix en milisegundos\) |
| `maxTs` | number | No | Marca de tiempo máxima \(Unix en milisegundos\) |
| `limit` | string | No | Número de resultados \(1-1000, predeterminado: 100\) |
| `cursor` | string | No | Cursor de paginación para la siguiente página |
@@ -209,44 +224,44 @@ Recuperar operaciones recientes en todos los mercados o para un mercado específ
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `success` | boolean | Estado de éxito de la operación |
| `output` | object | Datos y metadatos de operaciones |
| `output` | object | Datos de operaciones y metadatos |
### `kalshi_get_candlesticks`
Recuperar datos de velas OHLC para un mercado específico
Obtener datos de velas OHLC para un mercado específico
#### Entrada
| Parámetro | Tipo | Requerido | Descripción |
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `seriesTicker` | string | Sí | Ticker de serie |
| `ticker` | string | Sí | Ticker de mercado \(p. ej., KXBTC-24DEC31\) |
| `startTs` | number | No | Marca de tiempo de inicio \(Unix en milisegundos\) |
| `endTs` | number | No | Marca de tiempo de fin \(Unix en milisegundos\) |
| `periodInterval` | number | No | Intervalo de período: 1 \(1min\), 60 \(1hora\), o 1440 \(1día\) |
| `ticker` | string | Sí | Ticker del mercado \(p. ej., KXBTC-24DEC31\) |
| `startTs` | number | | Marca de tiempo inicial \(segundos Unix\) |
| `endTs` | number | | Marca de tiempo final \(segundos Unix\) |
| `periodInterval` | number | | Intervalo de período: 1 \(1min\), 60 \(1hora\), o 1440 \(1día\) |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `success` | boolean | Estado de éxito de la operación |
| `output` | object | Datos de velas e información adicional |
| `output` | object | Datos de velas y metadatos |
### `kalshi_get_fills`
Recuperar tu cartera
Recuperar tu portafolio
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `keyId` | string | Sí | Tu ID de clave API de Kalshi |
| `privateKey` | string | Sí | Tu clave privada RSA (formato PEM) |
| `privateKey` | string | Sí | Tu clave privada RSA \(formato PEM\) |
| `ticker` | string | No | Filtrar por ticker de mercado |
| `orderId` | string | No | Filtrar por ID de orden |
| `minTs` | number | No | Marca de tiempo mínima (milisegundos Unix) |
| `maxTs` | number | No | Marca de tiempo máxima (milisegundos Unix) |
| `limit` | string | No | Número de resultados (1-1000, predeterminado: 100) |
| `minTs` | number | No | Marca de tiempo mínima \(milisegundos Unix\) |
| `maxTs` | number | No | Marca de tiempo máxima \(milisegundos Unix\) |
| `limit` | string | No | Número de resultados \(1-1000, predeterminado: 100\) |
| `cursor` | string | No | Cursor de paginación para la siguiente página |
#### Salida
@@ -254,11 +269,11 @@ Recuperar tu cartera
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `success` | boolean | Estado de éxito de la operación |
| `output` | object | Datos de ejecuciones e información adicional |
| `output` | object | Datos de ejecuciones y metadatos |
### `kalshi_get_series_by_ticker`
Recuperar detalles de una serie de mercado específica por ticker
Obtener detalles de una serie de mercado específica por ticker
#### Entrada
@@ -271,15 +286,15 @@ Recuperar detalles de una serie de mercado específica por ticker
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `success` | boolean | Estado de éxito de la operación |
| `output` | object | Datos de la serie e información adicional |
| `output` | object | Datos de la serie y metadatos |
### `kalshi_get_exchange_status`
Recupera el estado actual del intercambio Kalshi (actividad de trading y del intercambio)
Obtener el estado actual del intercambio Kalshi (actividad de trading y del intercambio)
#### Entrada
| Parámetro | Tipo | Requerido | Descripción |
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
#### Salida
@@ -287,7 +302,90 @@ Recupera el estado actual del intercambio Kalshi (actividad de trading y del int
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `success` | boolean | Estado de éxito de la operación |
| `output` | object | Datos de estado del intercambio y metadatos |
| `output` | object | Datos del estado del intercambio y metadatos |
### `kalshi_create_order`
Crear una nueva orden en un mercado de predicción de Kalshi
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `keyId` | string | Sí | Tu ID de clave API de Kalshi |
| `privateKey` | string | Sí | Tu clave privada RSA \(formato PEM\) |
| `ticker` | string | Sí | Ticker del mercado \(p. ej., KXBTC-24DEC31\) |
| `side` | string | Sí | Lado de la orden: 'yes' o 'no' |
| `action` | string | Sí | Tipo de acción: 'buy' o 'sell' |
| `count` | string | Sí | Número de contratos \(mínimo 1\) |
| `type` | string | No | Tipo de orden: 'limit' o 'market' \(predeterminado: limit\) |
| `yesPrice` | string | No | Precio de 'yes' en centavos \(1-99\) |
| `noPrice` | string | No | Precio de 'no' en centavos \(1-99\) |
| `yesPriceDollars` | string | No | Precio de 'yes' en dólares \(p. ej., "0.56"\) |
| `noPriceDollars` | string | No | Precio de 'no' en dólares \(p. ej., "0.56"\) |
| `clientOrderId` | string | No | Identificador personalizado de la orden |
| `expirationTs` | string | No | Marca de tiempo Unix para la expiración de la orden |
| `timeInForce` | string | No | Tiempo en vigor: 'fill_or_kill', 'good_till_canceled', 'immediate_or_cancel' |
| `buyMaxCost` | string | No | Costo máximo en centavos \(habilita automáticamente fill_or_kill\) |
| `postOnly` | string | No | Establecer como 'true' para órdenes solo maker |
| `reduceOnly` | string | No | Establecer como 'true' solo para reducción de posición |
| `selfTradePreventionType` | string | No | Prevención de auto-negociación: 'taker_at_cross' o 'maker' |
| `orderGroupId` | string | No | ID de grupo de órdenes asociado |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `success` | boolean | Estado de éxito de la operación |
| `output` | object | Datos de la orden creada |
### `kalshi_cancel_order`
Cancelar una orden existente en Kalshi
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `keyId` | string | Sí | Tu ID de clave API de Kalshi |
| `privateKey` | string | Sí | Tu clave privada RSA \(formato PEM\) |
| `orderId` | string | Sí | El ID de la orden a cancelar |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `success` | boolean | Estado de éxito de la operación |
| `output` | object | Datos de la orden cancelada |
### `kalshi_amend_order`
Modificar el precio o la cantidad de una orden existente en Kalshi
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `keyId` | string | Sí | Tu ID de clave API de Kalshi |
| `privateKey` | string | Sí | Tu clave privada RSA \(formato PEM\) |
| `orderId` | string | Sí | El ID de la orden a modificar |
| `ticker` | string | Sí | Ticker del mercado |
| `side` | string | Sí | Lado de la orden: 'yes' o 'no' |
| `action` | string | Sí | Tipo de acción: 'buy' o 'sell' |
| `clientOrderId` | string | Sí | El ID de orden original especificado por el cliente |
| `updatedClientOrderId` | string | Sí | El nuevo ID de orden especificado por el cliente después de la modificación |
| `count` | string | No | Cantidad actualizada para la orden |
| `yesPrice` | string | No | Precio actualizado para 'yes' en centavos \(1-99\) |
| `noPrice` | string | No | Precio actualizado para 'no' en centavos \(1-99\) |
| `yesPriceDollars` | string | No | Precio actualizado para 'yes' en dólares \(p. ej., "0.56"\) |
| `noPriceDollars` | string | No | Precio actualizado para 'no' en dólares \(p. ej., "0.56"\) |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `success` | boolean | Estado de éxito de la operación |
| `output` | object | Datos de la orden modificada |
## Notas

View File

@@ -38,10 +38,10 @@ Obtener una lista de mercados de predicción de Polymarket con filtrado opcional
#### Entrada
| Parámetro | Tipo | Requerido | Descripción |
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `closed` | string | No | Filtrar por estado cerrado \(true/false\). Usa false para mercados activos solamente. |
| `order` | string | No | Campo de ordenación \(p. ej., id, volume, liquidity\) |
| `closed` | string | No | Filtrar por estado cerrado \(true/false\). Use false para mostrar solo mercados activos. |
| `order` | string | No | Campo de ordenación \(p. ej., volumeNum, liquidityNum, startDate, endDate, createdAt\) |
| `ascending` | string | No | Dirección de ordenación \(true para ascendente, false para descendente\) |
| `tagId` | string | No | Filtrar por ID de etiqueta |
| `limit` | string | No | Número de resultados por página \(recomendado: 25-50\) |
@@ -78,14 +78,14 @@ Obtener una lista de eventos de Polymarket con filtrado opcional
#### Entrada
| Parámetro | Tipo | Requerido | Descripción |
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `closed` | string | No | Filtrar por estado cerrado (true/false). Usar false para eventos activos solamente. |
| `order` | string | No | Campo de ordenación (ej., id, volume) |
| `ascending` | string | No | Dirección de ordenación (true para ascendente, false para descendente) |
| `closed` | string | No | Filtrar por estado cerrado \(true/false\). Use false para mostrar solo eventos activos. |
| `order` | string | No | Campo de ordenación \(p. ej., volume, liquidity, startDate, endDate, createdAt\) |
| `ascending` | string | No | Dirección de ordenación \(true para ascendente, false para descendente\) |
| `tagId` | string | No | Filtrar por ID de etiqueta |
| `limit` | string | No | Número de resultados por página (recomendado: 25-50) |
| `offset` | string | No | Desplazamiento de paginación (omitir esta cantidad de resultados) |
| `limit` | string | No | Número de resultados por página \(recomendado: 25-50\) |
| `offset` | string | No | Desplazamiento de paginación \(omitir esta cantidad de resultados\) |
#### Salida

View File

@@ -120,6 +120,82 @@ Lee los últimos mensajes de los canales de Slack. Recupera el historial de conv
| --------- | ---- | ----------- |
| `messages` | array | Array de objetos de mensaje del canal |
### `slack_list_channels`
Lista todos los canales en un espacio de trabajo de Slack. Devuelve los canales públicos y privados a los que el bot tiene acceso.
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `authMethod` | string | No | Método de autenticación: oauth o bot_token |
| `botToken` | string | No | Token del bot para Bot personalizado |
| `includePrivate` | boolean | No | Incluir canales privados de los que el bot es miembro (predeterminado: true) |
| `excludeArchived` | boolean | No | Excluir canales archivados (predeterminado: true) |
| `limit` | number | No | Número máximo de canales a devolver (predeterminado: 100, máx: 200) |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `channels` | array | Array de objetos de canal del espacio de trabajo |
### `slack_list_members`
Lista todos los miembros (IDs de usuario) en un canal de Slack. Úsalo con Obtener Información de Usuario para resolver IDs a nombres.
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `authMethod` | string | No | Método de autenticación: oauth o bot_token |
| `botToken` | string | No | Token del bot para Bot personalizado |
| `channel` | string | Sí | ID del canal del que listar miembros |
| `limit` | number | No | Número máximo de miembros a devolver (predeterminado: 100, máx: 200) |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `members` | array | Array de IDs de usuario que son miembros del canal (p. ej., U1234567890) |
### `slack_list_users`
Lista todos los usuarios en un espacio de trabajo de Slack. Devuelve perfiles de usuario con nombres y avatares.
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `authMethod` | string | No | Método de autenticación: oauth o bot_token |
| `botToken` | string | No | Token del bot para Bot personalizado |
| `includeDeleted` | boolean | No | Incluir usuarios desactivados/eliminados \(predeterminado: false\) |
| `limit` | number | No | Número máximo de usuarios a devolver \(predeterminado: 100, máx: 200\) |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `users` | array | Array de objetos de usuario del espacio de trabajo |
### `slack_get_user`
Obtiene información detallada sobre un usuario específico de Slack mediante su ID de usuario.
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `authMethod` | string | No | Método de autenticación: oauth o bot_token |
| `botToken` | string | No | Token del bot para Bot personalizado |
| `userId` | string | Sí | ID de usuario a buscar \(p. ej., U1234567890\) |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `user` | object | Información detallada del usuario |
### `slack_download`
Descargar un archivo de Slack
@@ -183,7 +259,7 @@ Eliminar un mensaje enviado previamente por el bot en Slack
### `slack_add_reaction`
Añadir una reacción con emoji a un mensaje de Slack
Añadir una reacción emoji a un mensaje de Slack
#### Entrada

View File

@@ -66,16 +66,16 @@ Para hacer referencia a variables de entorno en tus flujos de trabajo, utiliza l
height={350}
/>
## Precedencia de variables
## Cómo se resuelven las variables
Cuando tienes variables personales y de espacio de trabajo con el mismo nombre:
**Las variables del espacio de trabajo siempre tienen prioridad** sobre las variables personales, independientemente de quién ejecute el flujo de trabajo.
1. **Las variables del espacio de trabajo tienen precedencia** sobre las variables personales
2. Esto previene conflictos de nombres y asegura un comportamiento consistente en los flujos de trabajo del equipo
3. Si existe una variable de espacio de trabajo, la variable personal con el mismo nombre será ignorada
Cuando no existe una variable de espacio de trabajo para una clave, se utilizan las variables personales:
- **Ejecuciones manuales (UI)**: Tus variables personales
- **Ejecuciones automatizadas (API, webhook, programación, chat implementado)**: Variables personales del propietario del flujo de trabajo
<Callout type="warning">
Elige los nombres de las variables cuidadosamente para evitar sobrescrituras no deseadas. Considera usar prefijos con tus iniciales para variables personales o con el nombre del proyecto para variables del espacio de trabajo.
<Callout type="info">
Las variables personales son mejores para pruebas. Usa variables de espacio de trabajo para flujos de trabajo de producción.
</Callout>
## Mejores prácticas de seguridad

View File

@@ -251,32 +251,78 @@ Récupérer les détails d'exécution, y compris l'instantané de l'état du wor
</Tab>
</Tabs>
## Abonnements aux webhooks
## Notifications
Recevez des notifications en temps réel lorsque les exécutions de workflow sont terminées. Les webhooks sont configurés via l'interface utilisateur Sim dans l'éditeur de workflow.
Recevez des notifications en temps réel lorsque les exécutions de flux de travail sont terminées via webhook, e-mail ou Slack. Les notifications sont configurées au niveau de l'espace de travail depuis la page Logs.
### Configuration
Les webhooks peuvent être configurés pour chaque workflow via l'interface utilisateur de l'éditeur de workflow. Cliquez sur l'icône webhook dans la barre de contrôle pour configurer vos abonnements aux webhooks.
Configurez les notifications depuis la page Logs en cliquant sur le bouton menu et en sélectionnant "Configurer les notifications".
<div className="mx-auto w-full overflow-hidden rounded-lg">
<Video src="configure-webhook.mp4" width={700} height={450} />
</div>
**Canaux de notification :**
- **Webhook** : envoi de requêtes HTTP POST à votre point de terminaison
- **E-mail** : réception de notifications par e-mail avec les détails d'exécution
- **Slack** : publication de messages dans un canal Slack
**Options de configuration disponibles :**
- `url` : URL de votre endpoint webhook
- `secret` : Secret optionnel pour la vérification de signature HMAC
- `includeFinalOutput` : Inclure la sortie finale du workflow dans la charge utile
- `includeTraceSpans` : Inclure les intervalles de trace d'exécution détaillés
- `includeRateLimits` : Inclure les informations de limite de débit du propriétaire du workflow
- `includeUsageData` : Inclure les données d'utilisation et de facturation du propriétaire du workflow
- `levelFilter` : Tableau des niveaux de journal à recevoir (`info`, `error`)
- `triggerFilter` : Tableau des types de déclencheurs à recevoir (`api`, `webhook`, `schedule`, `manual`, `chat`)
- `active` : Activer/désactiver l'abonnement webhook
**Sélection de flux de travail :**
- Sélectionnez des flux de travail spécifiques à surveiller
- Ou choisissez "Tous les flux de travail" pour inclure les flux actuels et futurs
### Charge utile du webhook
**Options de filtrage :**
- `levelFilter` : niveaux de journalisation à recevoir (`info`, `error`)
- `triggerFilter` : types de déclencheurs à recevoir (`api`, `webhook`, `schedule`, `manual`, `chat`)
Lorsqu'une exécution de workflow est terminée, Sim envoie une requête POST à votre URL webhook :
**Données optionnelles :**
- `includeFinalOutput` : inclure le résultat final du flux de travail
- `includeTraceSpans` : inclure les traces détaillées d'exécution
- `includeRateLimits` : inclure les informations de limite de débit (limites synchrones/asynchrones et restantes)
- `includeUsageData` : inclure l'utilisation et les limites de la période de facturation
### Règles d'alerte
Au lieu de recevoir des notifications pour chaque exécution, configurez des règles d'alerte pour être notifié uniquement lorsque des problèmes sont détectés :
**Échecs consécutifs**
- Alerte après X exécutions échouées consécutives (par exemple, 3 échecs d'affilée)
- Réinitialisation lorsqu'une exécution réussit
**Taux d'échec**
- Alerte lorsque le taux d'échec dépasse X % au cours des Y dernières heures
- Nécessite un minimum de 5 exécutions dans la fenêtre
- Ne se déclenche qu'après l'écoulement complet de la fenêtre temporelle
**Seuil de latence**
- Alerte lorsqu'une exécution prend plus de X secondes
- Utile pour détecter les flux de travail lents ou bloqués
**Pic de latence**
- Alerte lorsque l'exécution est X % plus lente que la moyenne
- Compare à la durée moyenne sur la fenêtre temporelle configurée
- Nécessite un minimum de 5 exécutions pour établir une référence
**Seuil de coût**
- Alerte lorsqu'une seule exécution coûte plus de X €
- Utile pour détecter les appels LLM coûteux
**Aucune activité**
- Alerte lorsqu'aucune exécution ne se produit pendant X heures
- Utile pour surveiller les workflows programmés qui devraient s'exécuter régulièrement
**Nombre d'erreurs**
- Alerte lorsque le nombre d'erreurs dépasse X dans une fenêtre temporelle
- Suit le total des erreurs, pas les erreurs consécutives
Tous les types d'alertes incluent un temps de récupération d'une heure pour éviter le spam de notifications.
### Configuration du webhook
Pour les webhooks, des options supplémentaires sont disponibles :
- `url` : l'URL de votre point de terminaison webhook
- `secret` : secret optionnel pour la vérification de signature HMAC
### Structure de la charge utile
Lorsqu'une exécution de workflow se termine, Sim envoie la charge utile suivante (via webhook POST, e-mail ou Slack) :
```json
{
@@ -325,15 +371,15 @@ Lorsqu'une exécution de workflow est terminée, Sim envoie une requête POST à
}
```
### En-têtes de webhook
### En-têtes webhook
Chaque requête webhook inclut ces en-têtes :
Chaque requête webhook inclut ces en-têtes (canal webhook uniquement) :
- `sim-event` : Type d'événement (toujours `workflow.execution.completed`)
- `sim-timestamp` : Horodatage Unix en millisecondes
- `sim-event` : type d'événement (toujours `workflow.execution.completed`)
- `sim-timestamp` : horodatage Unix en millisecondes
- `sim-delivery-id` : ID de livraison unique pour l'idempotence
- `sim-signature` : Signature HMAC-SHA256 pour vérification (si un secret est configuré)
- `Idempotency-Key` : Identique à l'ID de livraison pour la détection des doublons
- `sim-signature` : signature HMAC-SHA256 pour vérification (si un secret est configuré)
- `Idempotency-Key` : identique à l'ID de livraison pour la détection des doublons
### Vérification de signature
@@ -408,14 +454,14 @@ Si vous configurez un secret webhook, vérifiez la signature pour vous assurer q
</Tab>
</Tabs>
### Politique de réessai
### Politique de nouvelle tentative
Les livraisons de webhook échouées sont réessayées avec un backoff exponentiel et du jitter :
- Nombre maximum de tentatives : 5
- Délais de réessai : 5 secondes, 15 secondes, 1 minute, 3 minutes, 10 minutes
- Délais de nouvelle tentative : 5 secondes, 15 secondes, 1 minute, 3 minutes, 10 minutes
- Jitter : jusqu'à 10 % de délai supplémentaire pour éviter l'effet de horde
- Seules les réponses HTTP 5xx et 429 déclenchent des réessais
- Seules les réponses HTTP 5xx et 429 déclenchent de nouvelles tentatives
- Les livraisons expirent après 30 secondes
<Callout type="info">
@@ -424,15 +470,15 @@ Les livraisons de webhook échouées sont réessayées avec un backoff exponenti
## Bonnes pratiques
1. **Stratégie de polling** : lors de l'interrogation des logs, utilisez la pagination basée sur curseur avec `order=asc` et `startDate` pour récupérer efficacement les nouveaux logs.
1. **Stratégie de polling** : Lors du polling des logs, utilisez la pagination basée sur curseur avec `order=asc` et `startDate` pour récupérer efficacement les nouveaux logs.
2. **Sécurité des webhooks** : configurez toujours un secret webhook et vérifiez les signatures pour vous assurer que les requêtes proviennent de Sim.
2. **Sécurité des webhooks** : Configurez toujours un secret de webhook et vérifiez les signatures pour vous assurer que les requêtes proviennent de Sim.
3. **Idempotence** : utilisez l'en-tête `Idempotency-Key` pour détecter et gérer les livraisons de webhook en double.
3. **Idempotence** : Utilisez l'en-tête `Idempotency-Key` pour détecter et gérer les livraisons de webhook en double.
4. **Confidentialité** : par défaut, `finalOutput` et `traceSpans` sont exclus des réponses. Activez-les uniquement si vous avez besoin des données et comprenez les implications en matière de confidentialité.
4. **Confidentialité** : Par défaut, `finalOutput` et `traceSpans` sont exclus des réponses. Activez-les uniquement si vous avez besoin des données et comprenez les implications en matière de confidentialité.
5. **Limitation de débit** : implémentez un backoff exponentiel lorsque vous recevez des réponses 429. Vérifiez l'en-tête `Retry-After` pour connaître le temps d'attente recommandé.
5. **Limitation de débit** : Implémentez un backoff exponentiel lorsque vous recevez des réponses 429. Vérifiez l'en-tête `Retry-After` pour connaître le temps d'attente recommandé.
## Limitation de débit
@@ -443,12 +489,12 @@ L'API implémente une limitation de débit pour garantir une utilisation équita
- **Plan Équipe** : 60 requêtes par minute
- **Plan Entreprise** : Limites personnalisées
Les informations de limite de débit sont incluses dans les en-têtes de réponse :
Les informations de limitation de débit sont incluses dans les en-têtes de réponse :
- `X-RateLimit-Limit` : Nombre maximum de requêtes par fenêtre
- `X-RateLimit-Remaining` : Requêtes restantes dans la fenêtre actuelle
- `X-RateLimit-Reset` : Horodatage ISO indiquant quand la fenêtre se réinitialise
## Exemple : Interrogation pour nouveaux journaux
## Exemple : Polling pour nouveaux logs
```javascript
let cursor = null;

View File

@@ -147,4 +147,4 @@ L'instantané fournit :
- Découvrez le [Calcul des coûts](/execution/costs) pour comprendre la tarification des workflows
- Explorez l'[API externe](/execution/api) pour un accès programmatique aux journaux
- Configurez les [notifications Webhook](/execution/api#webhook-subscriptions) pour des alertes en temps réel
- Configurez les [Notifications](/execution/api#notifications) pour des alertes en temps réel par webhook, e-mail ou Slack

View File

@@ -139,13 +139,14 @@ Obtenez les meilleures pages d'un domaine cible triées par trafic organique. Re
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | ---------- | ----------- |
| --------- | ---- | -------- | ----------- |
| `target` | string | Oui | Le domaine cible à analyser |
| `country` | string | Non | Code pays pour les données de trafic \(ex., us, gb, de\). Par défaut : us |
| `country` | string | Non | Code pays pour les données de trafic \(ex. : us, gb, de\). Par défaut : us |
| `mode` | string | Non | Mode d'analyse : domain \(domaine entier\), prefix \(préfixe d'URL\), subdomains \(inclure tous les sous-domaines\) |
| `date` | string | Non | Date pour les données historiques au format AAAA-MM-JJ \(par défaut : aujourd'hui\) |
| `limit` | number | Non | Nombre maximum de résultats à retourner \(par défaut : 100\) |
| `limit` | number | Non | Nombre maximum de résultats à renvoyer \(par défaut : 100\) |
| `offset` | number | Non | Nombre de résultats à ignorer pour la pagination |
| `select` | string | Non | Liste de champs à renvoyer, séparés par des virgules \(ex. : url,traffic,keywords,top_keyword,value\). Par défaut : url,traffic,keywords,top_keyword,value |
| `apiKey` | string | Oui | Clé API Ahrefs |
#### Sortie

View File

@@ -37,16 +37,16 @@ Créer un nouvel événement dans Google Agenda
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| --------- | ---- | ----------- | ----------- |
| `calendarId` | chaîne | Non | ID du calendrier (par défaut : primaire) |
| `summary` | chaîne | Oui | Titre/résumé de l'événement |
| `description` | chaîne | Non | Description de l'événement |
| `location` | chaîne | Non | Lieu de l'événement |
| `startDateTime` | chaîne | Oui | Date et heure de début (format RFC3339, ex. : 2025-06-03T10:00:00-08:00) |
| `endDateTime` | chaîne | Oui | Date et heure de fin (format RFC3339, ex. : 2025-06-03T11:00:00-08:00) |
| `timeZone` | chaîne | Non | Fuseau horaire (ex. : America/Los_Angeles) |
| `attendees` | tableau | Non | Tableau des adresses e-mail des participants |
| `sendUpdates` | chaîne | Non | Comment envoyer les mises à jour aux participants : all, externalOnly ou none |
| `startDateTime` | chaîne | Oui | Date et heure de début. DOIT inclure le décalage horaire (ex. : 2025-06-03T10:00:00-08:00) OU fournir le paramètre timeZone |
| `endDateTime` | chaîne | Oui | Date et heure de fin. DOIT inclure le décalage horaire (ex. : 2025-06-03T11:00:00-08:00) OU fournir le paramètre timeZone |
| `timeZone` | chaîne | Non | Fuseau horaire (ex. : America/Los_Angeles). Obligatoire si la date/heure n'inclut pas de décalage. Par défaut : America/Los_Angeles si non fourni. |
| `attendees` | tableau | Non | Tableau d'adresses e-mail des participants |
| `sendUpdates` | chaîne | Non | Comment envoyer les mises à jour aux participants : all, externalOnly, ou none |
#### Sortie

View File

@@ -107,11 +107,11 @@ Lister les fichiers et dossiers dans Google Drive
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| --------- | ---- | ---------- | ----------- |
| `folderSelector` | string | Non | Sélectionner le dossier à partir duquel lister les fichiers |
| `folderId` | string | Non | L'ID du dossier à partir duquel lister les fichiers \(usage interne\) |
| `query` | string | Non | Une requête pour filtrer les fichiers |
| `pageSize` | number | Non | Le nombre de fichiers à retourner |
| `folderId` | string | Non | L'ID du dossier à partir duquel lister les fichiers (usage interne) |
| `query` | string | Non | Terme de recherche pour filtrer les fichiers par nom (ex. "budget" trouve les fichiers avec "budget" dans le nom). N'utilisez PAS la syntaxe de requête Google Drive ici - fournissez simplement un terme de recherche ordinaire. |
| `pageSize` | number | Non | Le nombre maximum de fichiers à retourner (par défaut : 100) |
| `pageToken` | string | Non | Le jeton de page à utiliser pour la pagination |
#### Sortie

View File

@@ -88,8 +88,8 @@ Lire des données d'une feuille de calcul Google Sheets
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | ----------- | ----------- |
| `spreadsheetId` | chaîne | Oui | L'identifiant de la feuille de calcul à lire |
| `range` | chaîne | Non | La plage de cellules à lire |
| `spreadsheetId` | chaîne | Oui | L'identifiant de la feuille de calcul \(trouvé dans l'URL : docs.google.com/spreadsheets/d/\{SPREADSHEET_ID\}/edit\). |
| `range` | chaîne | Non | La plage en notation A1 à lire \(par exemple "Sheet1!A1:D10", "A1:B5"\). Par défaut, première feuille A1:Z1000 si non spécifié. |
#### Sortie
@@ -106,9 +106,9 @@ Lire des données d'une feuille de calcul Google Sheets
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | ----------- | ----------- |
| `spreadsheetId` | chaîne | Oui | L'identifiant de la feuille de calcul dans laquelle écrire |
| `range` | chaîne | Non | La plage de cellules dans laquelle écrire |
| `values` | tableau | Oui | Les données à écrire dans la feuille de calcul |
| `spreadsheetId` | chaîne | Oui | L'identifiant de la feuille de calcul |
| `range` | chaîne | Non | La plage en notation A1 où écrire \(par exemple "Sheet1!A1:D10", "A1:B5"\) |
| `values` | tableau | Oui | Les données à écrire sous forme de tableau 2D \(par exemple \[\["Nom", "Âge"\], \["Alice", 30\], \["Bob", 25\]\]\) ou tableau d'objets. |
| `valueInputOption` | chaîne | Non | Le format des données à écrire |
| `includeValuesInResponse` | booléen | Non | Indique si les valeurs écrites doivent être incluses dans la réponse |
@@ -129,12 +129,12 @@ Mettre à jour des données dans une feuille de calcul Google Sheets
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | ---------- | ----------- |
| `spreadsheetId` | string | Oui | L'ID de la feuille de calcul à mettre à jour |
| `range` | string | Non | La plage de cellules à mettre à jour |
| `values` | array | Oui | Les données à mettre à jour dans la feuille de calcul |
| `valueInputOption` | string | Non | Le format des données à mettre à jour |
| `includeValuesInResponse` | boolean | Non | Indique s'il faut inclure les valeurs mises à jour dans la réponse |
| --------- | ---- | ----------- | ----------- |
| `spreadsheetId` | chaîne | Oui | L'identifiant de la feuille de calcul à mettre à jour |
| `range` | chaîne | Non | La plage en notation A1 à mettre à jour \(par exemple "Sheet1!A1:D10", "A1:B5"\) |
| `values` | tableau | Oui | Les données à mettre à jour sous forme de tableau 2D \(par exemple \[\["Nom", "Âge"\], \["Alice", 30\]\]\) ou tableau d'objets. |
| `valueInputOption` | chaîne | Non | Le format des données à mettre à jour |
| `includeValuesInResponse` | booléen | Non | Indique si les valeurs mises à jour doivent être incluses dans la réponse |
#### Sortie
@@ -155,11 +155,11 @@ Ajouter des données à la fin d'une feuille de calcul Google Sheets
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | ----------- | ----------- |
| `spreadsheetId` | chaîne | Oui | L'identifiant de la feuille de calcul à laquelle ajouter des données |
| `range` | chaîne | Non | La plage de cellules après laquelle ajouter des données |
| `values` | tableau | Oui | Les données à ajouter à la feuille de calcul |
| `range` | chaîne | Non | La plage de notation A1 après laquelle ajouter des données \(ex. "Feuille1", "Feuille1!A:D"\) |
| `values` | tableau | Oui | Les données à ajouter sous forme de tableau 2D \(ex. \[\["Alice", 30\], \["Bob", 25\]\]\) ou tableau d'objets. |
| `valueInputOption` | chaîne | Non | Le format des données à ajouter |
| `insertDataOption` | chaîne | Non | Comment insérer les données \(OVERWRITE ou INSERT_ROWS\) |
| `includeValuesInResponse` | booléen | Non | Indique si les valeurs ajoutées doivent être incluses dans la réponse |
| `includeValuesInResponse` | booléen | Non | Indique s'il faut inclure les valeurs ajoutées dans la réponse |
#### Sortie

View File

@@ -0,0 +1,180 @@
---
title: Google Slides
description: Lire, écrire et créer des présentations
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="google_slides"
color="#E0E0E0"
/>
{/* MANUAL-CONTENT-START:intro */}
[Google Slides](https://slides.google.com) est une application de présentation dynamique basée sur le cloud qui permet aux utilisateurs de créer, modifier, collaborer et présenter des diaporamas en temps réel. En tant que partie de la suite de productivité de Google, Google Slides offre une plateforme flexible pour concevoir des présentations attrayantes, collaborer avec d'autres et partager du contenu de manière transparente via le cloud.
Découvrez comment intégrer les outils Google Slides dans Sim pour gérer sans effort les présentations dans le cadre de vos flux de travail automatisés. Avec Sim, vous pouvez lire, écrire, créer et mettre à jour des présentations Google Slides directement via vos agents et processus automatisés, ce qui facilite la diffusion d'informations actualisées, la génération de rapports personnalisés ou la production programmatique de présentations à l'image de votre marque.
Avec Google Slides, vous pouvez :
- **Créer et modifier des présentations** : concevoir des diapositives visuellement attrayantes avec des thèmes, des mises en page et du contenu multimédia
- **Collaborer en temps réel** : travailler simultanément avec des coéquipiers, commenter, attribuer des tâches et recevoir des commentaires en direct sur les présentations
- **Présenter n'importe où** : afficher des présentations en ligne ou hors ligne, partager des liens ou publier sur le web
- **Ajouter des images et du contenu enrichi** : insérer des images, des graphiques, des diagrammes et des vidéos pour rendre vos présentations attrayantes
- **S'intégrer à d'autres services** : se connecter de manière transparente avec Google Drive, Docs, Sheets et d'autres outils tiers
- **Accéder depuis n'importe quel appareil** : utiliser Google Slides sur ordinateurs de bureau, portables, tablettes et appareils mobiles pour une flexibilité maximale
Dans Sim, l'intégration de Google Slides permet à vos agents d'interagir directement avec les fichiers de présentation de manière programmatique. Automatisez des tâches comme la lecture du contenu des diapositives, l'insertion de nouvelles diapositives ou images, le remplacement de texte dans toute une présentation, la génération de nouvelles présentations et la récupération de miniatures de diapositives. Cela vous permet de développer la création de contenu, de maintenir les présentations à jour et de les intégrer dans des flux de travail de documents automatisés. En connectant Sim avec Google Slides, vous facilitez la gestion des présentations pilotée par l'IA, ce qui permet de générer, mettre à jour ou extraire facilement des informations des présentations sans effort manuel.
{/* MANUAL-CONTENT-END */}
## Instructions d'utilisation
Intégrez Google Slides dans le flux de travail. Peut lire, écrire, créer des présentations, remplacer du texte, ajouter des diapositives, ajouter des images et obtenir des miniatures.
## Outils
### `google_slides_read`
Lire le contenu d'une présentation Google Slides
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| `presentationId` | string | Oui | L'ID de la présentation à lire |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `slides` | json | Tableau des diapositives avec leur contenu |
| `metadata` | json | Métadonnées de la présentation incluant ID, titre et URL |
### `google_slides_write`
Écrire ou mettre à jour le contenu dans une présentation Google Slides
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| `presentationId` | string | Oui | L'ID de la présentation dans laquelle écrire |
| `content` | string | Oui | Le contenu à écrire dans la diapositive |
| `slideIndex` | number | Non | L'index de la diapositive dans laquelle écrire \(par défaut, première diapositive\) |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `updatedContent` | boolean | Indique si le contenu de la présentation a été mis à jour avec succès |
| `metadata` | json | Métadonnées de la présentation mise à jour incluant ID, titre et URL |
### `google_slides_create`
Créer une nouvelle présentation Google Slides
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| `title` | string | Oui | Le titre de la présentation à créer |
| `content` | string | Non | Le contenu à ajouter à la première diapositive |
| `folderSelector` | string | Non | Sélectionner le dossier dans lequel créer la présentation |
| `folderId` | string | Non | L'ID du dossier dans lequel créer la présentation \(usage interne\) |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `metadata` | json | Métadonnées de la présentation créée, y compris l'ID, le titre et l'URL |
### `google_slides_replace_all_text`
Rechercher et remplacer toutes les occurrences de texte dans une présentation Google Slides
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| `presentationId` | string | Oui | L'ID de la présentation |
| `findText` | string | Oui | Le texte à rechercher \(par exemple, \{\{placeholder\}\}\) |
| `replaceText` | string | Oui | Le texte de remplacement |
| `matchCase` | boolean | Non | Si la recherche doit être sensible à la casse \(par défaut : true\) |
| `pageObjectIds` | string | Non | Liste séparée par des virgules des ID d'objets de diapositive pour limiter les remplacements à des diapositives spécifiques \(laisser vide pour toutes les diapositives\) |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `occurrencesChanged` | number | Nombre d'occurrences de texte qui ont été remplacées |
| `metadata` | json | Métadonnées de l'opération, y compris l'ID et l'URL de la présentation |
### `google_slides_add_slide`
Ajouter une nouvelle diapositive à une présentation Google Slides avec une mise en page spécifiée
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| `presentationId` | string | Oui | L'ID de la présentation |
| `layout` | string | Non | La mise en page prédéfinie pour la diapositive \(BLANK, TITLE, TITLE_AND_BODY, TITLE_ONLY, SECTION_HEADER, etc.\). Par défaut : BLANK. |
| `insertionIndex` | number | Non | L'index facultatif basé sur zéro indiquant où insérer la diapositive. Si non spécifié, la diapositive est ajoutée à la fin. |
| `placeholderIdMappings` | string | Non | Tableau JSON de mappages d'espaces réservés pour attribuer des ID d'objets personnalisés aux espaces réservés. Format : \[\{"layoutPlaceholder":\{"type":"TITLE"\},"objectId":"custom_title_id"\}\] |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `slideId` | string | L'ID d'objet de la diapositive nouvellement créée |
| `metadata` | json | Métadonnées de l'opération incluant l'ID de la présentation, la mise en page et l'URL |
### `google_slides_add_image`
Insérer une image dans une diapositive spécifique d'une présentation Google Slides
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | ----------- | ----------- |
| `presentationId` | string | Oui | L'ID de la présentation |
| `pageObjectId` | string | Oui | L'ID d'objet de la diapositive/page où ajouter l'image |
| `imageUrl` | string | Oui | L'URL accessible publiquement de l'image \(doit être PNG, JPEG ou GIF, max 50 Mo\) |
| `width` | number | Non | Largeur de l'image en points \(par défaut : 300\) |
| `height` | number | Non | Hauteur de l'image en points \(par défaut : 200\) |
| `positionX` | number | Non | Position X depuis le bord gauche en points \(par défaut : 100\) |
| `positionY` | number | Non | Position Y depuis le bord supérieur en points \(par défaut : 100\) |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `imageId` | string | L'ID d'objet de l'image nouvellement créée |
| `metadata` | json | Métadonnées de l'opération incluant l'ID de la présentation et l'URL de l'image |
### `google_slides_get_thumbnail`
Générer une image miniature d'une diapositive spécifique dans une présentation Google Slides
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | ----------- | ----------- |
| `presentationId` | chaîne | Oui | L'identifiant de la présentation |
| `pageObjectId` | chaîne | Oui | L'identifiant d'objet de la diapositive/page pour laquelle obtenir une vignette |
| `thumbnailSize` | chaîne | Non | La taille de la vignette : SMALL \(200px\), MEDIUM \(800px\), ou LARGE \(1600px\). Par défaut MEDIUM. |
| `mimeType` | chaîne | Non | Le type MIME de l'image vignette : PNG ou GIF. Par défaut PNG. |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `contentUrl` | chaîne | URL vers l'image vignette \(valide pendant 30 minutes\) |
| `width` | nombre | Largeur de la vignette en pixels |
| `height` | nombre | Hauteur de la vignette en pixels |
| `metadata` | json | Métadonnées de l'opération incluant l'identifiant de la présentation et l'identifiant d'objet de la page |
## Notes
- Catégorie : `tools`
- Type : `google_slides`

View File

@@ -360,7 +360,9 @@ Mettre à jour un planning existant dans incident.io
| `apiKey` | chaîne | Oui | Clé API incident.io |
| `id` | chaîne | Oui | L'ID du planning à mettre à jour |
| `name` | chaîne | Non | Nouveau nom pour le planning |
| `timezone` | chaîne | Non | Nouveau fuseau horaire pour le planning \(ex., America/New_York\) |
| `timezone` | chaîne | Non | Nouveau fuseau horaire pour le planning \(ex. : America/New_York\) |
| `config` | chaîne | Non | Configuration du planning au format JSON avec rotations. Exemple : \{"rotations": \[\{"name": "Primary", "users": \[\{"id": "user_id"\}\], "handover_start_at": "2024-01-01T09:00:00Z", "handovers": \[\{"interval": 1, "interval_type": "weekly"\}\]\}\]\} |
| `Example` | chaîne | Non | Pas de description |
#### Sortie

View File

@@ -162,14 +162,14 @@ Créer ou mettre à jour une entreprise dans Intercom
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | ---------- | ----------- |
| `company_id` | chaîne | Oui | Votre identifiant unique pour l'entreprise |
| `name` | chaîne | Non | Le nom de l'entreprise |
| `website` | chaîne | Non | Le site web de l'entreprise |
| `plan` | chaîne | Non | Le nom du forfait de l'entreprise |
| `size` | nombre | Non | Le nombre d'employés dans l'entreprise |
| `industry` | chaîne | Non | Le secteur d'activité de l'entreprise |
| `monthly_spend` | nombre | Non | Le montant des revenus que l'entreprise génère pour votre activité |
| `custom_attributes` | chaîne | Non | Attributs personnalisés sous forme d'objet JSON |
| `company_id` | string | Oui | Votre identifiant unique pour l'entreprise |
| `name` | string | Non | Le nom de l'entreprise |
| `website` | string | Non | Le site web de l'entreprise |
| `plan` | string | Non | Le nom du forfait de l'entreprise |
| `size` | number | Non | Le nombre d'employés dans l'entreprise |
| `industry` | string | Non | Le secteur d'activité de l'entreprise |
| `monthly_spend` | number | Non | Le montant des revenus que l'entreprise génère pour votre activité. Remarque : ce champ tronque les décimales en nombres entiers (par exemple, 155,98 devient 155) |
| `custom_attributes` | string | Non | Attributs personnalisés sous forme d'objet JSON |
#### Sortie
@@ -197,7 +197,7 @@ Récupérer une seule entreprise par ID depuis Intercom
### `intercom_list_companies`
Lister toutes les entreprises depuis Intercom avec prise en charge de la pagination
Liste toutes les entreprises d'Intercom avec prise en charge de la pagination. Remarque : cet endpoint a une limite de 10 000 entreprises qui peuvent être renvoyées en utilisant la pagination. Pour les ensembles de données de plus de 10 000 entreprises, utilisez plutôt l'API Scroll.
#### Entrée
@@ -256,11 +256,11 @@ Répondre à une conversation en tant qu'administrateur dans Intercom
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| --------- | ---- | ---------- | ----------- |
| `conversationId` | string | Oui | ID de la conversation à laquelle répondre |
| `message_type` | string | Oui | Type de message : "comment" ou "note" |
| `body` | string | Oui | Le corps du texte de la réponse |
| `admin_id` | string | Oui | L'ID de l'administrateur qui rédige la réponse |
| `admin_id` | string | Non | L'ID de l'administrateur qui rédige la réponse. Si non fourni, un administrateur par défaut (Operator/Fin) sera utilisé. |
| `attachment_urls` | string | Non | Liste d'URLs d'images séparées par des virgules (max 10) |
#### Sortie

View File

@@ -1,6 +1,6 @@
---
title: Kalshi
description: Accédez aux données des marchés prédictifs de Kalshi
description: Accédez aux marchés prédictifs et tradez sur Kalshi
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
@@ -27,7 +27,7 @@ En utilisant ces outils et points d'accès unifiés, vous pouvez intégrer de ma
## Instructions d'utilisation
Intégrez les marchés prédictifs de Kalshi dans le flux de travail. Peut obtenir les marchés, le marché, les événements, l'événement, le solde, les positions, les ordres, le carnet d'ordres, les transactions, les chandeliers, les exécutions, les séries et le statut de la bourse.
Intégrez les marchés prédictifs Kalshi dans votre flux de travail. Permet d'obtenir les marchés, un marché spécifique, les événements, un événement spécifique, le solde, les positions, les ordres, le carnet d'ordres, les transactions, les chandeliers, les exécutions, les séries, l'état de l'échange, et de placer/annuler/modifier des transactions.
## Outils
@@ -172,36 +172,51 @@ Récupérez vos ordres depuis Kalshi avec filtrage optionnel
| `success` | boolean | Statut de réussite de l'opération |
| `output` | object | Données des ordres et métadonnées |
### `kalshi_get_orderbook`
### `kalshi_get_order`
Récupérez le carnet d'ordres (offres d'achat et de vente) pour un marché spécifique
Récupérer les détails d'un ordre spécifique par ID depuis Kalshi
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| `ticker` | string | Oui | Ticker du marché \(ex. : KXBTC-24DEC31\) |
| `depth` | number | Non | Nombre de niveaux de prix à retourner par côté |
| `keyId` | string | Oui | Votre ID de clé API Kalshi |
| `privateKey` | string | Oui | Votre clé privée RSA \(format PEM\) |
| `orderId` | string | Oui | L'ID de l'ordre à récupérer |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Statut de réussite de l'opération |
| `output` | object | Données et métadonnées du carnet d'ordres |
| `output` | object | Données de l'ordre |
### `kalshi_get_trades`
### `kalshi_get_orderbook`
Récupérer les transactions récentes sur tous les marchés ou pour un marché spécifique
Récupérer le carnet d'ordres (offres oui et non) pour un marché spécifique
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | ----------- | ----------- |
| `ticker` | string | Non | Filtrer par symbole de marché |
| `minTs` | number | Non | Horodatage minimum (millisecondes Unix) |
| `maxTs` | number | Non | Horodatage maximum (millisecondes Unix) |
| `limit` | string | Non | Nombre de résultats (1-1000, par défaut : 100) |
| --------- | ---- | -------- | ----------- |
| `ticker` | string | Oui | Ticker du marché \(ex. : KXBTC-24DEC31\) |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Statut de réussite de l'opération |
| `output` | object | Données du carnet d'ordres et métadonnées |
### `kalshi_get_trades`
Récupérer les transactions récentes sur tous les marchés
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| `limit` | string | Non | Nombre de résultats \(1-1000, par défaut : 100\) |
| `cursor` | string | Non | Curseur de pagination pour la page suivante |
#### Sortie
@@ -209,7 +224,7 @@ Récupérer les transactions récentes sur tous les marchés ou pour un marché
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Statut de réussite de l'opération |
| `output` | object | Données et métadonnées des transactions |
| `output` | object | Données des transactions et métadonnées |
### `kalshi_get_candlesticks`
@@ -218,19 +233,19 @@ Récupérer les données de chandeliers OHLC pour un marché spécifique
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | ----------- | ----------- |
| `seriesTicker` | string | Oui | Symbole de la série |
| `ticker` | string | Oui | Symbole du marché (ex. : KXBTC-24DEC31) |
| `startTs` | number | Non | Horodatage de début (millisecondes Unix) |
| `endTs` | number | Non | Horodatage de fin (millisecondes Unix) |
| `periodInterval` | number | Non | Intervalle de période : 1 (1min), 60 (1heure), ou 1440 (1jour) |
| --------- | ---- | -------- | ----------- |
| `seriesTicker` | string | Oui | Ticker de série |
| `ticker` | string | Oui | Ticker du marché \(ex. : KXBTC-24DEC31\) |
| `startTs` | number | Oui | Horodatage de début \(secondes Unix\) |
| `endTs` | number | Oui | Horodatage de fin \(secondes Unix\) |
| `periodInterval` | number | Oui | Intervalle de période : 1 \(1min\), 60 \(1heure\), ou 1440 \(1jour\) |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Statut de réussite de l'opération |
| `output` | object | Données et métadonnées du chandelier |
| `output` | object | Données de chandeliers et métadonnées |
### `kalshi_get_fills`
@@ -243,7 +258,7 @@ Récupérer votre portefeuille
| `keyId` | string | Oui | Votre ID de clé API Kalshi |
| `privateKey` | string | Oui | Votre clé privée RSA \(format PEM\) |
| `ticker` | string | Non | Filtrer par ticker de marché |
| `orderId` | string | Non | Filtrer par ID de commande |
| `orderId` | string | Non | Filtrer par ID d'ordre |
| `minTs` | number | Non | Horodatage minimum \(millisecondes Unix\) |
| `maxTs` | number | Non | Horodatage maximum \(millisecondes Unix\) |
| `limit` | string | Non | Nombre de résultats \(1-1000, par défaut : 100\) |
@@ -275,19 +290,102 @@ Récupérer les détails d'une série de marché spécifique par ticker
### `kalshi_get_exchange_status`
Récupérer l'état actuel de l'échange Kalshi (activité de trading et d'échange)
Récupérer le statut actuel de la plateforme d'échange Kalshi (activité de trading et d'échange)
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | ---------- | ----------- |
| --------- | ---- | -------- | ----------- |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Statut de réussite de l'opération |
| `output` | object | Données d'état de l'échange et métadonnées |
| `output` | object | Données et métadonnées du statut de l'échange |
### `kalshi_create_order`
Créer un nouvel ordre sur un marché de prédiction Kalshi
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| `keyId` | string | Oui | Votre ID de clé API Kalshi |
| `privateKey` | string | Oui | Votre clé privée RSA \(format PEM\) |
| `ticker` | string | Oui | Ticker du marché \(ex., KXBTC-24DEC31\) |
| `side` | string | Oui | Côté de l'ordre : 'yes' ou 'no' |
| `action` | string | Oui | Type d'action : 'buy' ou 'sell' |
| `count` | string | Oui | Nombre de contrats \(minimum 1\) |
| `type` | string | Non | Type d'ordre : 'limit' ou 'market' \(par défaut : limit\) |
| `yesPrice` | string | Non | Prix du 'yes' en centimes \(1-99\) |
| `noPrice` | string | Non | Prix du 'no' en centimes \(1-99\) |
| `yesPriceDollars` | string | Non | Prix du 'yes' en dollars \(ex., "0.56"\) |
| `noPriceDollars` | string | Non | Prix du 'no' en dollars \(ex., "0.56"\) |
| `clientOrderId` | string | Non | Identifiant personnalisé de l'ordre |
| `expirationTs` | string | Non | Horodatage Unix pour l'expiration de l'ordre |
| `timeInForce` | string | Non | Durée de validité : 'fill_or_kill', 'good_till_canceled', 'immediate_or_cancel' |
| `buyMaxCost` | string | Non | Coût maximum en centimes \(active automatiquement fill_or_kill\) |
| `postOnly` | string | Non | Définir à 'true' pour les ordres maker uniquement |
| `reduceOnly` | string | Non | Définir à 'true' pour la réduction de position uniquement |
| `selfTradePreventionType` | string | Non | Prévention d'auto-négociation : 'taker_at_cross' ou 'maker' |
| `orderGroupId` | string | Non | ID de groupe d'ordres associé |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Statut de réussite de l'opération |
| `output` | object | Données de l'ordre créé |
### `kalshi_cancel_order`
Annuler un ordre existant sur Kalshi
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| `keyId` | string | Oui | Votre ID de clé API Kalshi |
| `privateKey` | string | Oui | Votre clé privée RSA \(format PEM\) |
| `orderId` | string | Oui | L'ID de l'ordre à annuler |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Statut de réussite de l'opération |
| `output` | object | Données de l'ordre annulé |
### `kalshi_amend_order`
Modifier le prix ou la quantité d'un ordre existant sur Kalshi
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| `keyId` | string | Oui | Votre ID de clé API Kalshi |
| `privateKey` | string | Oui | Votre clé privée RSA \(format PEM\) |
| `orderId` | string | Oui | L'ID de l'ordre à modifier |
| `ticker` | string | Oui | Ticker du marché |
| `side` | string | Oui | Côté de l'ordre : 'yes' ou 'no' |
| `action` | string | Oui | Type d'action : 'buy' ou 'sell' |
| `clientOrderId` | string | Oui | L'ID d'ordre original spécifié par le client |
| `updatedClientOrderId` | string | Oui | Le nouvel ID d'ordre spécifié par le client après modification |
| `count` | string | Non | Quantité mise à jour pour l'ordre |
| `yesPrice` | string | Non | Prix 'yes' mis à jour en centimes \(1-99\) |
| `noPrice` | string | Non | Prix 'no' mis à jour en centimes \(1-99\) |
| `yesPriceDollars` | string | Non | Prix 'yes' mis à jour en dollars \(ex. : "0.56"\) |
| `noPriceDollars` | string | Non | Prix 'no' mis à jour en dollars \(ex. : "0.56"\) |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Statut de réussite de l'opération |
| `output` | object | Données de l'ordre modifié |
## Notes

View File

@@ -39,13 +39,13 @@ Récupérer une liste des marchés prédictifs de Polymarket avec filtrage optio
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| `closed` | chaîne | Non | Filtrer par statut fermé \(true/false\). Utilisez false pour les marchés actifs uniquement. |
| `order` | chaîne | Non | Champ de tri \(ex. id, volume, liquidity\) |
| `ascending` | chaîne | Non | Direction de tri \(true pour ascendant, false pour descendant\) |
| `tagId` | chaîne | Non | Filtrer par ID de tag |
| `limit` | chaîne | Non | Nombre de résultats par page \(recommandé : 25-50\) |
| `offset` | chaîne | Non | Décalage de pagination \(ignorer ce nombre de résultats\) |
| --------- | ---- | ---------- | ----------- |
| `closed` | string | Non | Filtrer par statut fermé \(true/false\). Utilisez false pour les marchés actifs uniquement. |
| `order` | string | Non | Champ de tri \(par exemple, volumeNum, liquidityNum, startDate, endDate, createdAt\) |
| `ascending` | string | Non | Direction de tri \(true pour ascendant, false pour descendant\) |
| `tagId` | string | Non | Filtrer par ID de tag |
| `limit` | string | Non | Nombre de résultats par page \(recommandé : 25-50\) |
| `offset` | string | Non | Décalage de pagination \(ignorer ce nombre de résultats\) |
#### Sortie
@@ -79,9 +79,9 @@ Récupérer une liste d'événements de Polymarket avec filtrage optionnel
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| --------- | ---- | ---------- | ----------- |
| `closed` | string | Non | Filtrer par statut fermé \(true/false\). Utilisez false pour les événements actifs uniquement. |
| `order` | string | Non | Champ de tri \(ex. : id, volume\) |
| `order` | string | Non | Champ de tri \(par exemple, volume, liquidity, startDate, endDate, createdAt\) |
| `ascending` | string | Non | Direction de tri \(true pour ascendant, false pour descendant\) |
| `tagId` | string | Non | Filtrer par ID de tag |
| `limit` | string | Non | Nombre de résultats par page \(recommandé : 25-50\) |

View File

@@ -120,6 +120,82 @@ Lisez les derniers messages des canaux Slack. Récupérez l'historique des conve
| --------- | ---- | ----------- |
| `messages` | tableau | Tableau d'objets de messages du canal |
### `slack_list_channels`
Liste tous les canaux dans un espace de travail Slack. Renvoie les canaux publics et privés auxquels le bot a accès.
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | ---------- | ----------- |
| `authMethod` | chaîne | Non | Méthode d'authentification : oauth ou bot_token |
| `botToken` | chaîne | Non | Jeton du bot pour Bot personnalisé |
| `includePrivate` | booléen | Non | Inclure les canaux privés dont le bot est membre \(par défaut : true\) |
| `excludeArchived` | booléen | Non | Exclure les canaux archivés \(par défaut : true\) |
| `limit` | nombre | Non | Nombre maximum de canaux à renvoyer \(par défaut : 100, max : 200\) |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `channels` | tableau | Tableau d'objets de canaux de l'espace de travail |
### `slack_list_members`
Liste tous les membres (identifiants d'utilisateurs) dans un canal Slack. À utiliser avec Get User Info pour convertir les identifiants en noms.
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | ---------- | ----------- |
| `authMethod` | chaîne | Non | Méthode d'authentification : oauth ou bot_token |
| `botToken` | chaîne | Non | Jeton du bot pour Bot personnalisé |
| `channel` | chaîne | Oui | ID du canal dont il faut lister les membres |
| `limit` | nombre | Non | Nombre maximum de membres à renvoyer \(par défaut : 100, max : 200\) |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `members` | tableau | Tableau d'identifiants d'utilisateurs qui sont membres du canal \(par ex., U1234567890\) |
### `slack_list_users`
Liste tous les utilisateurs dans un espace de travail Slack. Renvoie les profils d'utilisateurs avec noms et avatars.
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | ---------- | ----------- |
| `authMethod` | chaîne | Non | Méthode d'authentification : oauth ou bot_token |
| `botToken` | chaîne | Non | Jeton du bot pour le Bot personnalisé |
| `includeDeleted` | booléen | Non | Inclure les utilisateurs désactivés/supprimés \(par défaut : false\) |
| `limit` | nombre | Non | Nombre maximum d'utilisateurs à renvoyer \(par défaut : 100, max : 200\) |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `users` | tableau | Tableau d'objets utilisateur de l'espace de travail |
### `slack_get_user`
Obtenir des informations détaillées sur un utilisateur Slack spécifique à partir de son ID utilisateur.
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | ---------- | ----------- |
| `authMethod` | chaîne | Non | Méthode d'authentification : oauth ou bot_token |
| `botToken` | chaîne | Non | Jeton du bot pour le Bot personnalisé |
| `userId` | chaîne | Oui | ID utilisateur à rechercher \(par ex., U1234567890\) |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `user` | objet | Informations détaillées sur l'utilisateur |
### `slack_download`
Télécharger un fichier depuis Slack

View File

@@ -66,16 +66,16 @@ Pour référencer des variables d'environnement dans vos workflows, utilisez la
height={350}
/>
## Priorité des variables
## Comment les variables sont résolues
Lorsque vous avez à la fois des variables personnelles et d'espace de travail portant le même nom :
**Les variables d'espace de travail ont toujours la priorité** sur les variables personnelles, quel que soit l'utilisateur qui exécute le flux de travail.
1. **Les variables d'espace de travail ont la priorité** sur les variables personnelles
2. Cela évite les conflits de nommage et assure un comportement cohérent dans les workflows d'équipe
3. Si une variable d'espace de travail existe, la variable personnelle portant le même nom est ignorée
Lorsqu'aucune variable d'espace de travail n'existe pour une clé, les variables personnelles sont utilisées :
- **Exécutions manuelles (UI)** : Vos variables personnelles
- **Exécutions automatisées (API, webhook, planification, chat déployé)** : Variables personnelles du propriétaire du flux de travail
<Callout type="warning">
Choisissez les noms de variables avec soin pour éviter les remplacements involontaires. Envisagez de préfixer les variables personnelles avec vos initiales ou les variables d'espace de travail avec le nom du projet.
<Callout type="info">
Les variables personnelles sont idéales pour les tests. Utilisez les variables d'espace de travail pour les flux de travail en production.
</Callout>
## Bonnes pratiques de sécurité

View File

@@ -251,32 +251,78 @@ SimダッシュボードのユーザーセッティングからAPIキーを生
</Tab>
</Tabs>
## Webhookサブスクリプション
## 通知
ワークフロー実行が完了したときにリアルタイム通知を受け取ります。WebhookはSim UIのワークフローエディタで設定されます。
ワークフロー実行が完了したときに、Webhook、メール、またはSlackを通じてリアルタイム通知を受け取ることができます。通知はログページからワークスペースレベルで設定されます。
### 設定
Webhookは、ワークフローエディタUIを通じて各ワークフローに設定できます。コントロールバーのWebhookアイコンをクリックして、Webhookサブスクリプションを設定します。
ログページからメニューボタンをクリックし、「通知を設定する」を選択して通知を設定します。
<div className="mx-auto w-full overflow-hidden rounded-lg">
<Video src="configure-webhook.mp4" width={700} height={450} />
</div>
**通知チャネル:**
- **Webhook**: エンドポイントにHTTP POSTリクエストを送信
- **メール**: 実行詳細を含むメール通知を受信
- **Slack**: Slackチャンネルにメッセージを投稿
**利用可能な設定オプション:**
- `url`: WebhookエンドポイントURL
- `secret`: HMAC署名検証用のオプションシークレット
- `includeFinalOutput`: ペイロードにワークフローの最終出力を含める
**ワークフロー選択:**
- 監視する特定のワークフローを選択
- または「すべてのワークフロー」を選択して現在および将来のワークフローを含める
**フィルタリングオプション:**
- `levelFilter`: 受信するログレベル (`info`, `error`)
- `triggerFilter`: 受信するトリガータイプ (`api`, `webhook`, `schedule`, `manual`, `chat`)
**オプションデータ:**
- `includeFinalOutput`: ワークフローの最終出力を含める
- `includeTraceSpans`: 詳細な実行トレーススパンを含める
- `includeRateLimits`: ワークフロー所有者のレート制限情報を含める
- `includeUsageData`: ワークフロー所有者の使用状況と請求データを含める
- `levelFilter`: 受信するログレベルの配列 (`info`, `error`)
- `triggerFilter`: 受信するトリガータイプの配列 (`api`, `webhook`, `schedule`, `manual`, `chat`)
- `active`: Webhookサブスクリプションの有効化/無効化
- `includeRateLimits`: レート制限情報(同期/非同期の制限と残り)を含める
- `includeUsageData`: 請求期間の使用状況と制限を含める
### Webhookペイロード
### アラートルール
ワークフロー実行が完了すると、SimはWebhook URLにPOSTリクエストを送信します:
すべての実行について通知を受け取る代わりに、問題が検出された場合にのみ通知されるようにアラートルールを設定できます
**連続失敗**
- X回連続して実行が失敗した後にアラート3回連続の失敗
- 実行が成功すると、リセットされます
**失敗率**
- 過去Y時間の失敗率がX%を超えた場合にアラート
- ウィンドウ内で最低5回の実行が必要
- 完全な時間ウィンドウが経過した後にのみトリガーされます
**レイテンシーしきい値**
- 実行がX秒以上かかった場合にアラート
- 遅いまたは停止しているワークフローを検出するのに役立ちます
**レイテンシースパイク**
- 実行が平均よりX%遅い場合にアラート
- 設定された時間ウィンドウでの平均所要時間と比較
- ベースラインを確立するために最低5回の実行が必要
**コスト閾値**
- 単一の実行コストが$Xを超えた場合にアラート
- 高価なLLM呼び出しを検出するのに役立つ
**アクティビティなし**
- X時間以内に実行がない場合にアラート
- 定期的に実行されるべきスケジュールされたワークフローの監視に役立つ
**エラー数**
- 時間枠内でエラー数がXを超えた場合にアラート
- 連続ではなく、総エラー数を追跡
すべてのアラートタイプには、通知スパムを防ぐための1時間のクールダウンが含まれています。
### Webhook設定
Webhookの場合、追加オプションが利用可能です
- `url`WebhookエンドポイントURL
- `secret`HMAC署名検証用のオプションシークレット
### ペイロード構造
ワークフロー実行が完了すると、Simは以下のペイロードを送信しますwebhook POST、メール、またはSlackを介して
```json
{
@@ -327,17 +373,17 @@ Webhookは、ワークフローエディタUIを通じて各ワークフロー
### Webhookヘッダー
各Webhookリクエストには以下のヘッダーが含まれます
各Webhookリクエストには以下のヘッダーが含まれますWebhookチャンネルのみ
- `sim-event`: イベントタイプ(常に `workflow.execution.completed`
- `sim-timestamp`: ミリ秒単位のUnixタイムスタンプ
- `sim-delivery-id`: べき等性のための一意の配信ID
- `sim-signature`: 検証用のHMAC-SHA256署名シークレットが設定されている場合
- `Idempotency-Key`: 重複検出のための配信IDと同じ
- `sim-event`イベントタイプ(常に`workflow.execution.completed`
- `sim-timestamp`ミリ秒単位のUnixタイムスタンプ
- `sim-delivery-id`べき等性のための一意の配信ID
- `sim-signature`検証用のHMAC-SHA256署名シークレットが設定されている場合
- `Idempotency-Key`重複検出のための配信IDと同じ
### 署名検証
Webhookシークレットを設定した場合、署名を検証してWebhookがSimからのものであることを確認してください
Webhookシークレットを設定した場合、署名を検証してWebhookがSimからのものであることを確認します
<Tabs items={['Node.js', 'Python']}>
<Tab value="Node.js">
@@ -412,21 +458,21 @@ Webhookシークレットを設定した場合、署名を検証してWebhookが
失敗したWebhook配信は指数バックオフとジッターを使用して再試行されます
- 最大試行回数: 5回
- リトライ間隔: 5秒、15秒、1分、3分、10分
- ジッター: 最大10%の追加遅延(サンダリングハード問題を防ぐため
- 最大試行回数5回
- リトライ遅延:5秒、15秒、1分、3分、10分
- ジッターサンダリングハード問題を防ぐために最大10%の追加遅延
- HTTP 5xxと429レスポンスのみがリトライをトリガー
- 配信は30秒後にタイムアウト
<Callout type="info">
Webhook配信は非同期で処理され、ワークフロー実行のパフォーマンスに影響しません。
Webhook配信は非同期で処理され、ワークフロー実行のパフォーマンスに影響しません。
</Callout>
## ベストプラクティス
1. **ポーリング戦略**: ログをポーリングする場合、`order=asc`と`startDate`を使用したカーソルベースのページネーションを使用して、新しいログを効率的に取得してください。
1. **ポーリング戦略**: ログをポーリングする場合、`order=asc`と`startDate`を使用したカーソルベースのページネーションを用して、新しいログを効率的に取得してください。
2. **Webhookセキュリティ**: 常にWebhookシークレットを設定し、署名を検証してリクエストがSimからのものであることを確認してください。
2. **Webhookセキュリティ**: 常にWebhookシークレットを設定し、署名を検証してリクエストがSimからのものであることを確認してください。
3. **べき等性**: `Idempotency-Key`ヘッダーを使用して、重複するWebhook配信を検出し処理してください。
@@ -445,7 +491,7 @@ APIは公平な使用を確保するためにレート制限を実装してい
レート制限情報はレスポンスヘッダーに含まれています:
- `X-RateLimit-Limit`: ウィンドウあたりの最大リクエスト数
- `X-RateLimit-Remaining`: 現在のウィンドウで残りのリクエスト数
- `X-RateLimit-Remaining`: 現在のウィンドウで残っているリクエスト数
- `X-RateLimit-Reset`: ウィンドウがリセットされるISOタイムスタンプ
## 例:新しいログのポーリング
@@ -495,7 +541,7 @@ async function pollLogs() {
setInterval(pollLogs, 30000);
```
## 例:ウェブフックの処理
## 例:Webhookの処理
```javascript
import express from 'express';

View File

@@ -145,6 +145,6 @@ Simは異なるワークフローとユースケースに対応する2つの補
## 次のステップ
- ワークフロー価格設定を理解するための[コスト計算](/execution/costs)について学ぶ
- ワークフロー価格設定を理解するための[コスト計算](/execution/costs)について学ぶ
- プログラムによるログアクセスのための[外部API](/execution/api)を探索する
- リアルタイムアラート用の[Webhookによる通知](/execution/api#webhook-subscriptions)を設定する
- webhook、メール、またはSlackによるリアルタイムアラートのための[通知](/execution/api#notifications)を設定する

View File

@@ -142,10 +142,11 @@ AhrefsのSEOツールをワークフローに統合します。ドメインレ
| --------- | ---- | -------- | ----------- |
| `target` | string | はい | 分析対象のドメイン |
| `country` | string | いいえ | トラフィックデータの国コードus、gb、de。デフォルトus |
| `mode` | string | いいえ | 分析モードdomainドメイン全体、prefixURL接頭辞、subdomainsすべてのサブドメインを含む |
| `date` | string | いいえ | 過去データの日付YYYY-MM-DD形式デフォルト今日) |
| `mode` | string | いいえ | 分析モードdomainドメイン全体、prefixURLプレフィックス、subdomainsすべてのサブドメインを含む |
| `date` | string | いいえ | 履歴データの日付YYYY-MM-DD形式デフォルト今日) |
| `limit` | number | いいえ | 返す結果の最大数デフォルト100 |
| `offset` | number | いいえ | ページネーション用にスキップする結果の数 |
| `select` | string | いいえ | 返すフィールドのカンマ区切りリストurl,traffic,keywords,top_keyword,value。デフォルトurl,traffic,keywords,top_keyword,value |
| `apiKey` | string | はい | Ahrefs APIキー |
#### 出力

View File

@@ -38,15 +38,15 @@ Googleカレンダーに新しいイベントを作成する
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `calendarId` | string | いいえ | カレンダーIDデフォルトはprimary |
| `calendarId` | string | いいえ | カレンダーIDデフォルトはプライマリ |
| `summary` | string | はい | イベントのタイトル/概要 |
| `description` | string | いいえ | イベントの説明 |
| `location` | string | いいえ | イベントの場所 |
| `startDateTime` | string | はい | 開始日時RFC3339形式、2025-06-03T10:00:00-08:00 |
| `endDateTime` | string | はい | 終了日時RFC3339形式、2025-06-03T11:00:00-08:00 |
| `timeZone` | string | いいえ | タイムゾーンAmerica/Los_Angeles |
| `startDateTime` | string | はい | 開始日時。タイムゾーンオフセットを含める必要があります(2025-06-03T10:00:00-08:00または、timeZoneパラメータを提供する |
| `endDateTime` | string | はい | 終了日時。タイムゾーンオフセットを含める必要があります(2025-06-03T11:00:00-08:00または、timeZoneパラメータを提供する |
| `timeZone` | string | いいえ | タイムゾーンAmerica/Los_Angeles。日時にオフセットが含まれていない場合は必須。提供されない場合はAmerica/Los_Angelesがデフォルト。 |
| `attendees` | array | いいえ | 参加者のメールアドレスの配列 |
| `sendUpdates` | string | いいえ | 参加者への更新通知方法all、externalOnly、またはnone |
| `sendUpdates` | string | いいえ | 参加者への更新通知方法all(全員)、externalOnly(外部のみ)、またはnone(なし) |
#### 出力

View File

@@ -110,8 +110,8 @@ Google Drive内のファイルとフォルダを一覧表示する
| --------- | ---- | -------- | ----------- |
| `folderSelector` | string | いいえ | ファイルを一覧表示するフォルダを選択 |
| `folderId` | string | いいえ | ファイルを一覧表示するフォルダのID内部使用 |
| `query` | string | いいえ | ファイルフィルタリングするためのクエリ |
| `pageSize` | number | いいえ | 返すファイルの |
| `query` | string | いいえ | ファイル名でフィルタリングする検索語「budget」は名前に「budget」を含むファイルを検索。ここではGoogle Driveのクエリ構文を使用しないでください - 単純な検索語を提供してください。 |
| `pageSize` | number | いいえ | 返すファイルの最大数デフォルト100 |
| `pageToken` | string | いいえ | ページネーションに使用するページトークン |
#### 出力

View File

@@ -88,8 +88,8 @@ Google Sheetsスプレッドシートからデータを読み取る
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `spreadsheetId` | string | はい | 読み取り元のスプレッドシートID |
| `range` | string | いいえ | 読み取るセル範囲 |
| `spreadsheetId` | string | はい | スプレッドシートIDURLで確認できます: docs.google.com/spreadsheets/d/\{SPREADSHEET_ID\}/edit |
| `range` | string | いいえ | 読み取るA1表記の範囲例: "Sheet1!A1:D10"、"A1:B5"。指定しない場合、デフォルトで最初のシートのA1:Z1000が使用されます。 |
#### 出力
@@ -106,9 +106,9 @@ Google Sheetsスプレッドシートにデータを書き込む
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `spreadsheetId` | string | はい | 書き込み先のスプレッドシートID |
| `range` | string | いいえ | 書き込むセル範囲 |
| `values` | array | はい | スプレッドシートに書き込むデータ |
| `spreadsheetId` | string | はい | スプレッドシートID |
| `range` | string | いいえ | 書き込むA1表記の範囲例: "Sheet1!A1:D10"、"A1:B5" |
| `values` | array | はい | 2次元配列例: \[\["名前", "年齢"\], \["Alice", 30\], \["Bob", 25\]\])またはオブジェクトの配列として書き込むデータ |
| `valueInputOption` | string | いいえ | 書き込むデータの形式 |
| `includeValuesInResponse` | boolean | いいえ | レスポンスに書き込まれた値を含めるかどうか |
@@ -131,8 +131,8 @@ Google Sheetsスプレッドシートのデータを更新する
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `spreadsheetId` | string | はい | 更新するスプレッドシートのID |
| `range` | string | いいえ | 更新するセルの範囲 |
| `values` | array | はい | スプレッドシートに更新するデータ |
| `range` | string | いいえ | 更新するA1表記の範囲例: "Sheet1!A1:D10"、"A1:B5" |
| `values` | array | はい | 2次元配列例: \[\["名前", "年齢"\], \["Alice", 30\]\])またはオブジェクトの配列として更新するデータ |
| `valueInputOption` | string | いいえ | 更新するデータの形式 |
| `includeValuesInResponse` | boolean | いいえ | レスポンスに更新された値を含めるかどうか |
@@ -154,11 +154,11 @@ Google Sheetsスプレッドシートの末尾にデータを追加する
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `spreadsheetId` | string | はい | 追加先のスプレッドシートID |
| `range` | string | いいえ | 追加する位置の後のセル範囲 |
| `values` | array | はい | スプレッドシートに追加するデータ |
| `spreadsheetId` | string | はい | 追加先のスプレッドシートID |
| `range` | string | いいえ | 追加するセル範囲 |
| `values` | array | はい | 追加するデータ |
| `valueInputOption` | string | いいえ | 追加するデータの形式 |
| `insertDataOption` | string | いいえ | データの挿入方法(OVERWRITE または INSERT_ROWS |
| `insertDataOption` | string | いいえ | データの挿入方法(上書きまたは行の挿入 |
| `includeValuesInResponse` | boolean | いいえ | レスポンスに追加された値を含めるかどうか |
#### 出力

View File

@@ -0,0 +1,180 @@
---
title: Google スライド
description: プレゼンテーションの読み取り、作成、編集
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="google_slides"
color="#E0E0E0"
/>
{/* MANUAL-CONTENT-START:intro */}
[Google スライド](https://slides.google.com)は、ユーザーがリアルタイムでスライドショーを作成、編集、共同作業、プレゼンテーションできるダイナミッククラウドベースのプレゼンテーションアプリケーションです。Googleの生産性スイートの一部として、Google スライドは魅力的なプレゼンテーションの設計、他者との共同作業、クラウドを通じたコンテンツのシームレスな共有のための柔軟なプラットフォームを提供します。
Simで Google スライドツールを統合して、自動化されたワークフローの一部としてプレゼンテーションを簡単に管理する方法を学びましょう。Simを使用すると、エージェントや自動化されたプロセスを通じて直接Google スライドプレゼンテーションの読み取り、書き込み、作成、更新ができ、最新情報の配信、カスタムレポートの生成、またはプログラムによるブランド化されたデッキの作成が容易になります。
Google スライドでは、次のことができます:
- **プレゼンテーションの作成と編集**:テーマ、レイアウト、マルチメディアコンテンツを使用して視覚的に魅力的なスライドをデザイン
- **リアルタイムでの共同作業**:チームメイトと同時に作業し、コメントを残し、タスクを割り当て、プレゼンテーションに関するライブフィードバックを受け取る
- **どこでもプレゼンテーション**:オンラインまたはオフラインでプレゼンテーションを表示し、リンクを共有したり、ウェブに公開したりする
- **画像やリッチコンテンツの追加**:画像、グラフィック、チャート、動画を挿入してプレゼンテーションを魅力的にする
- **他のサービスとの統合**Google ドライブ、ドキュメント、スプレッドシート、その他のサードパーティツールとシームレスに接続
- **あらゆるデバイスからアクセス**最大限の柔軟性を得るために、デスクトップ、ラップトップ、タブレット、モバイルデバイスでGoogle スライドを使用
Simでは、Google スライド統合によりエージェントがプログラムでプレゼンテーションファイルと直接やり取りできるようになります。スライドコンテンツの読み取り、新しいスライドや画像の挿入、デッキ全体のテキスト置換、新しいプレゼンテーションの生成、スライドサムネイルの取得などのタスクを自動化します。これにより、コンテンツ作成のスケーリング、プレゼンテーションの最新状態の維持、自動化されたドキュメントワークフローへの組み込みが可能になります。SimとGoogle スライドを接続することで、AIによるプレゼンテーション管理を促進し、手動の労力なしにプレゼンテーションの生成、更新、または情報の抽出を簡単に行うことができます。
{/* MANUAL-CONTENT-END */}
## 使用方法
Google スライドをワークフローに統合します。プレゼンテーションの読み取り、書き込み、作成、テキストの置換、スライドの追加、画像の追加、サムネイルの取得が可能です。
## ツール
### `google_slides_read`
Google スライドプレゼンテーションからコンテンツを読み取る
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `presentationId` | string | はい | 読み取るプレゼンテーションのID |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `slides` | json | コンテンツを含むスライドの配列 |
| `metadata` | json | ID、タイトル、URLを含むプレゼンテーションのメタデータ |
### `google_slides_write`
Google スライドプレゼンテーションにコンテンツを書き込みまたは更新する
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `presentationId` | string | はい | 書き込み先のプレゼンテーションのID |
| `content` | string | はい | スライドに書き込むコンテンツ |
| `slideIndex` | number | いいえ | 書き込み先のスライドのインデックス(デフォルトは最初のスライド) |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `updatedContent` | boolean | プレゼンテーションのコンテンツが正常に更新されたかどうかを示す |
| `metadata` | json | ID、タイトル、URLを含む更新されたプレゼンテーションのメタデータ |
### `google_slides_create`
新しいGoogle スライドプレゼンテーションを作成する
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `title` | string | はい | 作成するプレゼンテーションのタイトル |
| `content` | string | いいえ | 最初のスライドに追加するコンテンツ |
| `folderSelector` | string | いいえ | プレゼンテーションを作成するフォルダを選択 |
| `folderId` | string | いいえ | プレゼンテーションを作成するフォルダのID内部使用 |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `metadata` | json | 作成されたプレゼンテーションのメタデータID、タイトル、URLを含む |
### `google_slides_replace_all_text`
Google Slidesプレゼンテーション全体でテキストのすべての出現箇所を検索して置換する
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `presentationId` | string | はい | プレゼンテーションのID |
| `findText` | string | はい | 検索するテキスト(例:\{\{placeholder\}\} |
| `replaceText` | string | はい | 置換するテキスト |
| `matchCase` | boolean | いいえ | 検索で大文字と小文字を区別するかどうかデフォルトtrue |
| `pageObjectIds` | string | いいえ | 特定のスライドに置換を制限するスライドオブジェクトIDのカンマ区切りリストすべてのスライドの場合は空のままにする |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `occurrencesChanged` | number | 置換されたテキストの出現回数 |
| `metadata` | json | プレゼンテーションIDとURLを含む操作メタデータ |
### `google_slides_add_slide`
指定されたレイアウトでGoogle Slidesプレゼンテーションに新しいスライドを追加する
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `presentationId` | string | はい | プレゼンテーションのID |
| `layout` | string | いいえ | スライドの事前定義されたレイアウトBLANK、TITLE、TITLE_AND_BODY、TITLE_ONLY、SECTION_HEADERなど。デフォルトはBLANK。 |
| `insertionIndex` | number | いいえ | スライドを挿入する場所を示すオプションのゼロベースのインデックス。指定されていない場合、スライドは最後に追加されます。 |
| `placeholderIdMappings` | string | いいえ | プレースホルダーにカスタムオブジェクトIDを割り当てるプレースホルダーマッピングのJSON配列。形式\[\{"layoutPlaceholder":\{"type":"TITLE"\},"objectId":"custom_title_id"\}\] |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `slideId` | string | 新しく作成されたスライドのオブジェクトID |
| `metadata` | json | プレゼンテーションID、レイアウト、URLを含む操作メタデータ |
### `google_slides_add_image`
Google Slidesプレゼンテーションの特定のスライドに画像を挿入する
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `presentationId` | string | はい | プレゼンテーションのID |
| `pageObjectId` | string | はい | 画像を追加するスライド/ページのオブジェクトID |
| `imageUrl` | string | はい | 画像の公開アクセス可能なURLPNG、JPEG、またはGIF形式、最大50MB |
| `width` | number | いいえ | ポイント単位の画像の幅デフォルト300 |
| `height` | number | いいえ | ポイント単位の画像の高さデフォルト200 |
| `positionX` | number | いいえ | 左端からのX位置ポイント単位デフォルト100 |
| `positionY` | number | いいえ | 上端からのY位置ポイント単位デフォルト100 |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `imageId` | string | 新しく作成された画像のオブジェクトID |
| `metadata` | json | プレゼンテーションIDと画像URLを含む操作メタデータ |
### `google_slides_get_thumbnail`
Google Slidesプレゼンテーションの特定のスライドのサムネイル画像を生成する
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `presentationId` | string | はい | プレゼンテーションのID |
| `pageObjectId` | string | はい | サムネイルを取得するスライド/ページのオブジェクトID |
| `thumbnailSize` | string | いいえ | サムネイルのサイズSMALL200px、MEDIUM800px、またはLARGE1600px。デフォルトはMEDIUM。 |
| `mimeType` | string | いいえ | サムネイル画像のMIMEタイプPNGまたはGIF。デフォルトはPNG。 |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `contentUrl` | string | サムネイル画像へのURL30分間有効 |
| `width` | number | サムネイルの幅(ピクセル単位) |
| `height` | number | サムネイルの高さ(ピクセル単位) |
| `metadata` | json | プレゼンテーションIDとページオブジェクトIDを含む操作メタデータ |
## 注意事項
- カテゴリ: `tools`
- タイプ: `google_slides`

View File

@@ -361,6 +361,8 @@ incident.io内の既存のスケジュールを更新する
| `id` | string | はい | 更新するスケジュールのID |
| `name` | string | いいえ | スケジュールの新しい名前 |
| `timezone` | string | いいえ | スケジュールの新しいタイムゾーンAmerica/New_York |
| `config` | string | いいえ | ローテーションを含むJSONフォーマットのスケジュール設定。例\{"rotations": \[\{"name": "Primary", "users": \[\{"id": "user_id"\}\], "handover_start_at": "2024-01-01T09:00:00Z", "handovers": \[\{"interval": 1, "interval_type": "weekly"\}\]\}\]\} |
| `Example` | string | いいえ | 説明なし |
#### 出力

View File

@@ -167,7 +167,7 @@ Intercomで企業を作成または更新する
| `plan` | string | いいえ | 企業のプラン名 |
| `size` | number | いいえ | 企業の従業員数 |
| `industry` | string | いいえ | 企業が事業を展開している業界 |
| `monthly_spend` | number | いいえ | 企業があなたのビジネスにもたらす収益額 |
| `monthly_spend` | number | いいえ | 企業があなたのビジネスにもたらす収益額。注このフィールドは小数点以下を切り捨てて整数にします155.98は155になります |
| `custom_attributes` | string | いいえ | JSONオブジェクトとしてのカスタム属性 |
#### 出力
@@ -196,7 +196,7 @@ IDによってIntercomから単一の企業を取得する
### `intercom_list_companies`
ページネーションサポート付きでIntercomからすべての企業を一覧表示
ページネーションサポートしてIntercomからすべての企業を一覧表示します。注このエンドポイントはページネーションを使用して返すことができる企業数が10,000社に制限されています。10,000社を超えるデータセットの場合は、代わりにスクロールAPIを使用してください。
#### 入力
@@ -259,8 +259,8 @@ IDによりIntercomから単一の会話を取得
| `conversationId` | string | はい | 返信する会話ID |
| `message_type` | string | はい | メッセージタイプ「comment」または「note」 |
| `body` | string | はい | 返信の本文テキスト |
| `admin_id` | string | い | 返信を作成する管理者のID |
| `attachment_urls` | string | いいえ | カンマ区切りの画像URL一覧最大10件 |
| `admin_id` | string | いいえ | 返信を作成する管理者のID。提供されない場合、デフォルトの管理者(オペレーター/Finが使用されます。 |
| `attachment_urls` | string | いいえ | 画像URLのカンマ区切りリスト最大10件 |
#### 出力

View File

@@ -1,6 +1,6 @@
---
title: Kalshi
description: Kalshiの予測市場データにアクセス
description: Kalshiの予測市場にアクセスして取引する
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
@@ -27,7 +27,7 @@ SimにおけるKalshiの統合により、以下のことが可能になりま
## 使用方法
Kalshi予測市場をワークフローに統合します。市場一覧、特定の市場、イベント一覧、特定のイベント、残高、ポジション、注文、注文板、取引、ローソク足チャート、約定、シリーズ、取引所ステータス取得できます。
Kalshi予測市場をワークフローに統合します。市場一覧、個別市場、イベント一覧、個別イベント、残高、ポジション、注文、注文板、取引履歴、ローソク足チャート、約定履歴、シリーズ、取引所ステータス取得、および取引の発注/キャンセル/変更が可能です。
## ツール
@@ -172,37 +172,52 @@ Kalshiからオープンポジションを取得
| `success` | boolean | 操作成功ステータス |
| `output` | object | 注文データとメタデータ |
### `kalshi_get_orderbook`
### `kalshi_get_order`
特定のマーケットの注文板(買い注文と売り注文)を取得する
IDを指定してKalshiから特定の注文の詳細を取得する
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `ticker` | string | はい | マーケットティッカーKXBTC-24DEC31 |
| `depth` | number | いいえ | 各サイドで返す価格レベルの数 |
| `keyId` | string | はい | あなたのKalshi APIキーID |
| `privateKey` | string | はい | あなたのRSA秘密鍵PEM形式 |
| `orderId` | string | はい | 取得する注文ID |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `success` | boolean | 操作成功ステータス |
| `output` | object | オーダーブックデータとメタデータ |
| `output` | object | 注文データ |
### `kalshi_get_trades`
### `kalshi_get_orderbook`
すべての市場または特定の市場における最近の取引を取得する
特定の市場の注文板yesとnoの注文を取得する
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `ticker` | string | いいえ | 市場ティッカーでフィルタリング |
| `minTs` | number | いいえ | 最小タイムスタンプUnixミリ秒 |
| `maxTs` | number | いいえ | 最大タイムスタンプUnixミリ秒 |
| `limit` | string | いいえ | 結果数1-1000、デフォルト100 |
| `cursor` | string | いいえ | 次ページのページネーションカーソル |
| `ticker` | string | い | 市場ティッカーKXBTC-24DEC31 |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `success` | boolean | 操作成功ステータス |
| `output` | object | 注文板データとメタデータ |
### `kalshi_get_trades`
すべての市場の最近の取引を取得する
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `limit` | string | いいえ | 結果の数1-1000、デフォルト100 |
| `cursor` | string | いいえ | 次のページのページネーションカーソル |
#### 出力
@@ -221,9 +236,9 @@ Kalshiからオープンポジションを取得
| --------- | ---- | -------- | ----------- |
| `seriesTicker` | string | はい | シリーズティッカー |
| `ticker` | string | はい | 市場ティッカーKXBTC-24DEC31 |
| `startTs` | number | いいえ | 開始タイムスタンプUnixミリ秒) |
| `endTs` | number | いいえ | 終了タイムスタンプUnixミリ秒) |
| `periodInterval` | number | いいえ | 期間間隔11分、601時間、または14401日 |
| `startTs` | number | い | 開始タイムスタンプUnix秒 |
| `endTs` | number | い | 終了タイムスタンプUnix秒 |
| `periodInterval` | number | い | 期間間隔11分、601時間、または14401日 |
#### 出力
@@ -234,19 +249,19 @@ Kalshiからオープンポジションを取得
### `kalshi_get_fills`
ポートフォリオを取得する
あなたのポートフォリオを取得する
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `keyId` | string | はい | Kalshi API キーID |
| `privateKey` | string | はい | RSA秘密鍵PEM形式 |
| `ticker` | string | いいえ | マーケットティッカーでフィルタリング |
| `keyId` | string | はい | あなたのKalshi APIキーID |
| `privateKey` | string | はい | あなたのRSA秘密鍵PEM形式 |
| `ticker` | string | いいえ | 市場ティッカーでフィルタリング |
| `orderId` | string | いいえ | 注文IDでフィルタリング |
| `minTs` | number | いいえ | 最小タイムスタンプUnixミリ秒 |
| `maxTs` | number | いいえ | 最大タイムスタンプUnixミリ秒 |
| `limit` | string | いいえ | 結果数1-1000、デフォルト100 |
| `limit` | string | いいえ | 結果1-1000、デフォルト100 |
| `cursor` | string | いいえ | 次ページのページネーションカーソル |
#### 出力
@@ -258,7 +273,7 @@ Kalshiからオープンポジションを取得
### `kalshi_get_series_by_ticker`
ティッカーで特定のマーケットシリーズの詳細を取得する
ティッカーで特定の市場シリーズの詳細を取得する
#### 入力
@@ -289,6 +304,89 @@ Kalshi取引所の現在のステータス取引と取引所のアクティ
| `success` | boolean | 操作成功ステータス |
| `output` | object | 取引所ステータスデータとメタデータ |
### `kalshi_create_order`
Kalshi予測市場に新しい注文を作成する
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `keyId` | string | はい | あなたのKalshi APIキーID |
| `privateKey` | string | はい | あなたのRSA秘密鍵PEM形式 |
| `ticker` | string | はい | 市場ティッカーKXBTC-24DEC31 |
| `side` | string | はい | 注文のサイド:'yes'または'no' |
| `action` | string | はい | アクションタイプ:'buy'または'sell' |
| `count` | string | はい | 契約数最小1 |
| `type` | string | いいえ | 注文タイプ:'limit'または'market'デフォルトlimit |
| `yesPrice` | string | いいえ | Yesの価格セント単位、1-99 |
| `noPrice` | string | いいえ | Noの価格セント単位、1-99 |
| `yesPriceDollars` | string | いいえ | Yesの価格ドル単位、例"0.56" |
| `noPriceDollars` | string | いいえ | Noの価格ドル単位、例"0.56" |
| `clientOrderId` | string | いいえ | カスタム注文識別子 |
| `expirationTs` | string | いいえ | 注文有効期限のUnixタイムスタンプ |
| `timeInForce` | string | いいえ | 有効期間:'fill_or_kill'、'good_till_canceled'、'immediate_or_cancel' |
| `buyMaxCost` | string | いいえ | 最大コストセント単位、自動的にfill_or_killを有効にする |
| `postOnly` | string | いいえ | メーカーオンリー注文の場合は'true'に設定 |
| `reduceOnly` | string | いいえ | ポジション削減のみの場合は'true'に設定 |
| `selfTradePreventionType` | string | いいえ | 自己取引防止:'taker_at_cross'または'maker' |
| `orderGroupId` | string | いいえ | 関連する注文グループID |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `success` | boolean | 操作成功ステータス |
| `output` | object | 作成された注文データ |
### `kalshi_cancel_order`
Kalshiで既存の注文をキャンセルする
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `keyId` | string | はい | あなたのKalshi APIキーID |
| `privateKey` | string | はい | あなたのRSA秘密鍵PEM形式 |
| `orderId` | string | はい | キャンセルする注文ID |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `success` | boolean | 操作成功ステータス |
| `output` | object | キャンセルされた注文データ |
### `kalshi_amend_order`
Kalshiで既存の注文の価格または数量を変更する
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `keyId` | string | はい | あなたのKalshi APIキーID |
| `privateKey` | string | はい | あなたのRSA秘密鍵PEM形式 |
| `orderId` | string | はい | 変更する注文ID |
| `ticker` | string | はい | マーケットティッカー |
| `side` | string | はい | 注文のサイド:'yes'または'no' |
| `action` | string | はい | アクションタイプ:'buy'または'sell' |
| `clientOrderId` | string | はい | クライアントが指定した元の注文ID |
| `updatedClientOrderId` | string | はい | 変更後のクライアントが指定した新しい注文ID |
| `count` | string | いいえ | 注文の更新された数量 |
| `yesPrice` | string | いいえ | 更新されたyes価格セント単位、1-99 |
| `noPrice` | string | いいえ | 更新されたno価格セント単位、1-99 |
| `yesPriceDollars` | string | いいえ | 更新されたyes価格ドル単位、例"0.56" |
| `noPriceDollars` | string | いいえ | 更新されたno価格ドル単位、例"0.56" |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `success` | boolean | 操作成功ステータス |
| `output` | object | 変更された注文データ |
## 注意事項
- カテゴリー: `tools`

View File

@@ -40,8 +40,8 @@ Polymarketから予測市場のリストをオプションのフィルタリン
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `closed` | string | いいえ | クローズ状態でフィルタリングtrue/false。アクティブな市場のみの場合はfalseを使用。 |
| `order` | string | いいえ | ソートフィールド(例:id、volume、liquidity |
| `closed` | string | いいえ | クローズ状態でフィルタリングtrue/false。アクティブなマーケットのみの場合はfalseを使用。 |
| `order` | string | いいえ | ソートフィールドvolumeNum、liquidityNum、startDate、endDate、createdAt |
| `ascending` | string | いいえ | ソート方向昇順の場合はtrue、降順の場合はfalse |
| `tagId` | string | いいえ | タグIDでフィルタリング |
| `limit` | string | いいえ | ページあたりの結果数推奨25-50 |
@@ -81,7 +81,7 @@ Polymarketからイベントのリストを取得し、オプションでフィ
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `closed` | string | いいえ | クローズ状態でフィルタリングtrue/false。アクティブなイベントのみの場合はfalseを使用。 |
| `order` | string | いいえ | ソートフィールド(例:id、volume |
| `order` | string | いいえ | ソートフィールドvolume、liquidity、startDate、endDate、createdAt |
| `ascending` | string | いいえ | ソート方向昇順の場合はtrue、降順の場合はfalse |
| `tagId` | string | いいえ | タグIDでフィルタリング |
| `limit` | string | いいえ | ページあたりの結果数推奨25-50 |

View File

@@ -119,6 +119,82 @@ Slackチャンネルから最新のメッセージを読み取ります。フィ
| --------- | ---- | ----------- |
| `messages` | array | チャンネルからのメッセージオブジェクトの配列 |
### `slack_list_channels`
Slackワークスペース内のすべてのチャンネルを一覧表示します。ボットがアクセスできるパブリックチャンネルとプライベートチャンネルを返します。
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `authMethod` | string | いいえ | 認証方法oauthまたはbot_token |
| `botToken` | string | いいえ | カスタムボット用のボットトークン |
| `includePrivate` | boolean | いいえ | ボットがメンバーであるプライベートチャンネルを含めるデフォルトtrue |
| `excludeArchived` | boolean | いいえ | アーカイブされたチャンネルを除外するデフォルトtrue |
| `limit` | number | いいえ | 返すチャンネルの最大数デフォルト100、最大200 |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `channels` | array | ワークスペースからのチャンネルオブジェクトの配列 |
### `slack_list_members`
Slackチャンネル内のすべてのメンバーユーザーIDを一覧表示します。IDを名前に解決するには「ユーザー情報を取得」と併用してください。
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `authMethod` | string | いいえ | 認証方法oauthまたはbot_token |
| `botToken` | string | いいえ | カスタムボット用のボットトークン |
| `channel` | string | はい | メンバーを一覧表示するチャンネルID |
| `limit` | number | いいえ | 返すメンバーの最大数デフォルト100、最大200 |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `members` | array | チャンネルのメンバーであるユーザーIDの配列U1234567890 |
### `slack_list_users`
Slackワークスペース内のすべてのユーザーを一覧表示します。名前とアバターを含むユーザープロファイルを返します。
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `authMethod` | string | いいえ | 認証方法oauthまたはbot_token |
| `botToken` | string | いいえ | カスタムボット用のボットトークン |
| `includeDeleted` | boolean | いいえ | 無効化/削除されたユーザーを含めるデフォルトfalse |
| `limit` | number | いいえ | 返すユーザーの最大数デフォルト100、最大200 |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `users` | array | ワークスペースからのユーザーオブジェクトの配列 |
### `slack_get_user`
ユーザーIDを使用して特定のSlackユーザーに関する詳細情報を取得します。
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `authMethod` | string | いいえ | 認証方法oauthまたはbot_token |
| `botToken` | string | いいえ | カスタムボット用のボットトークン |
| `userId` | string | はい | 検索するユーザーIDU1234567890 |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `user` | object | 詳細なユーザー情報 |
### `slack_download`
Slackからファイルをダウンロードする
@@ -140,13 +216,13 @@ Slackからファイルをダウンロードする
### `slack_update_message`
Slackでボットが以前送信したメッセージを更新する
Slackでボットが以前送信したメッセージを更新する
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `authMethod` | string | いいえ | 認証方法oauth または bot_token |
| `authMethod` | string | いいえ | 認証方法oauthまたはbot_token |
| `botToken` | string | いいえ | カスタムボット用のボットトークン |
| `channel` | string | はい | メッセージが投稿されたチャンネルIDC1234567890 |
| `timestamp` | string | はい | 更新するメッセージのタイムスタンプ1405894322.002768 |
@@ -156,19 +232,19 @@ Slackでボットが以前送信したメッセージを更新する
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `message` | object | Slackから返されたすべてのプロパティを含む完全更新されたメッセージオブジェクト |
| `message` | object | Slackから返されたすべてのプロパティを含む完全更新メッセージオブジェクト |
| `content` | string | 成功メッセージ |
| `metadata` | object | 更新されたメッセージのメタデータ |
### `slack_delete_message`
Slackでボットが以前送信したメッセージを削除する
Slackでボットが以前送信したメッセージを削除する
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `authMethod` | string | いいえ | 認証方法oauth または bot_token |
| `authMethod` | string | いいえ | 認証方法oauthまたはbot_token |
| `botToken` | string | いいえ | カスタムボット用のボットトークン |
| `channel` | string | はい | メッセージが投稿されたチャンネルIDC1234567890 |
| `timestamp` | string | はい | 削除するメッセージのタイムスタンプ1405894322.002768 |
@@ -188,7 +264,7 @@ Slackメッセージに絵文字リアクションを追加する
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `authMethod` | string | いいえ | 認証方法oauth または bot_token |
| `authMethod` | string | いいえ | 認証方法oauthまたはbot_token |
| `botToken` | string | いいえ | カスタムボット用のボットトークン |
| `channel` | string | はい | メッセージが投稿されたチャンネルIDC1234567890 |
| `timestamp` | string | はい | リアクションするメッセージのタイムスタンプ1405894322.002768 |

View File

@@ -66,16 +66,16 @@ Simの環境変数は2つのレベルで機能します
height={350}
/>
## 変数の優先順位
## 変数の解決方法
同じ名前の個人変数とワークスペース変数がある場合:
**ワークスペース変数は常に優先されます**。誰がワークフローを実行するかに関わらず、個人変数よりも優先されます。
1. **ワークスペース変数が**個人変数よりも**優先されます**
2. これにより名前の競合を防ぎ、チームワークフロー全体で一貫した動作を確保します
3. ワークスペース変数が存在する場合、同じ名前の個人変数は無視されます
キーに対するワークスペース変数が存在しない場合、個人変数が使用されます
- **手動実行UI**:あなたの個人変数
- **自動実行API、ウェブフック、スケジュール、デプロイされたチャット**:ワークフロー所有者の個人変数
<Callout type="warning">
意図しない上書きを避けるために、変数名は慎重に選んでください。個人変数にはイニシャルを、ワークスペース変数にはプロジェクト名を接頭辞として付けることを検討してください。
<Callout type="info">
個人変数はテストに最適です。本番環境のワークフローにはワークスペース変数を使用してください。
</Callout>
## セキュリティのベストプラクティス

View File

@@ -251,32 +251,78 @@ curl -H "x-api-key: YOUR_API_KEY" \
</Tab>
</Tabs>
## Webhook 订阅
## 通知
工作流执行完成时获取实时通知。Webhook 可通过 Sim UI 的工作流编辑器进行配置。
通过 webhook、电子邮件或 Slack 获取工作流执行完成实时通知。通知在工作区级别从日志页面进行配置。
### 配置
可以通过工作流编辑器 UI 为每个工作流配置 Webhook。点击控制栏中的 Webhook 图标以设置 Webhook 订阅
通过点击菜单按钮并选择“配置通知”从日志页面配置通知
<div className="mx-auto w-full overflow-hidden rounded-lg">
<Video src="configure-webhook.mp4" width={700} height={450} />
</div>
**通知渠道:**
- **Webhook**:向您的端点发送 HTTP POST 请求
- **电子邮件**:接收包含执行详情的电子邮件通知
- **Slack**:向 Slack 频道发送消息
**可用配置选项**
- `url`:您的 Webhook 端点 URL
- `secret`:用于 HMAC 签名验证的可选密钥
- `includeFinalOutput`:在负载中包含工作流的最终输出
**工作流选择**
- 选择特定的工作流进行监控
- 或选择“所有工作流”以包含当前和未来的工作流
**过滤选项:**
- `levelFilter`:接收的日志级别(`info``error`
- `triggerFilter`:接收的触发类型(`api``webhook``schedule``manual``chat`
**可选数据:**
- `includeFinalOutput`:包含工作流的最终输出
- `includeTraceSpans`:包含详细的执行跟踪跨度
- `includeRateLimits`:包含工作流所有者的速率限制信息
- `includeUsageData`:包含工作流所有者的使用和计费数据
- `levelFilter`:接收的日志级别数组(`info`, `error`
- `triggerFilter`:接收的触发类型数组(`api`, `webhook`, `schedule`, `manual`, `chat`
- `active`:启用/禁用 Webhook 订阅
- `includeRateLimits`:包含速率限制信息(同步/异步限制和剩余)
- `includeUsageData`:包含计费周期的使用情况和限制
### Webhook 负载
### 警报规则
当工作流执行完成时Sim 会向您的 Webhook URL 发送一个 POST 请求
与其为每次执行接收通知,不如配置警报规则,仅在检测到问题时收到通知
**连续失败**
- 在 X 次连续失败执行后发出警报(例如,连续 3 次失败)
- 当执行成功时重置
**失败率**
- 当失败率在过去 Y 小时内超过 X% 时发出警报
- 需要窗口内至少 5 次执行
- 仅在整个时间窗口结束后触发
**延迟阈值**
- 当任何执行时间超过 X 秒时发出警报
- 用于捕捉缓慢或挂起的工作流
**延迟峰值**
- 当执行时间比平均值慢 X% 时发出警报
- 与配置时间窗口内的平均持续时间进行比较
- 需要至少 5 次执行以建立基线
**成本阈值**
- 当单次执行成本超过 $X 时发出警报
- 用于捕捉高成本的 LLM 调用
**无活动**
- 当 X 小时内没有执行发生时发出警报
- 用于监控应定期运行的计划工作流
**错误计数**
- 当错误计数在某个时间窗口内超过 X 时发出警报
- 跟踪总错误数,而非连续错误
所有警报类型都包括 1 小时的冷却时间,以防止通知过多。
### Webhook 配置
对于 webhooks可用以下附加选项
- `url`:您的 webhook 端点 URL
- `secret`:用于 HMAC 签名验证的可选密钥
### 负载结构
当工作流执行完成时Sim 会发送以下负载(通过 webhook POST、电子邮件或 Slack
```json
{
@@ -325,9 +371,9 @@ curl -H "x-api-key: YOUR_API_KEY" \
}
```
### Webhook 请求
### Webhook 头信息
每个 webhook 请求都包含以下请求头:
每个 webhook 请求都包含以下头信息(仅限 webhook 渠道)
- `sim-event`:事件类型(始终为 `workflow.execution.completed`
- `sim-timestamp`:以毫秒为单位的 Unix 时间戳
@@ -410,7 +456,7 @@ curl -H "x-api-key: YOUR_API_KEY" \
### 重试策略
失败的 webhook 交付使用指数退避和抖动进行重试:
失败的 webhook 交付使用指数退避和抖动进行重试:
- 最大尝试次数5
- 重试延迟5 秒、15 秒、1 分钟、3 分钟、10 分钟
@@ -424,15 +470,15 @@ curl -H "x-api-key: YOUR_API_KEY" \
## 最佳实践
1. **轮询策略**:在轮询日志时,使用基于游标的分页与 `order=asc` 和 `startDate` 高效获取新日志。
1. **轮询策略**:在轮询日志时,使用基于游标的分页与 `order=asc` 和 `startDate` 高效获取新日志。
2. **Webhook 安全性**:始终配置 webhook 密钥并验证签名以确保请求来自 Sim。
2. **Webhook 安全性**:始终配置一个 webhook 密钥并验证签名以确保请求来自 Sim。
3. **幂等性**:使用 `Idempotency-Key` 请求头检测并处理重复的 webhook 交付。
3. **幂等性**:使用 `Idempotency-Key` 头检测并处理重复的 webhook 交付。
4. **隐私**:默认情况下,`finalOutput` 和 `traceSpans` 不包含在响应中。仅在需要这些数据并了解隐私影响时启用它们。
4. **隐私**:默认情况下,`finalOutput` 和 `traceSpans` 会从响应中排除。仅在需要这些数据并了解隐私影响时启用它们。
5. **速率限制**:当收到 429 响应时,实施指数退避。检查 `Retry-After` 请求头以获取推荐的等待时间。
5. **速率限制**:当收到 429 响应时,实施指数退避。检查 `Retry-After` 头以获取推荐的等待时间。
## 速率限制
@@ -443,7 +489,7 @@ API 实现了速率限制以确保公平使用:
- **团队计划**:每分钟 60 次请求
- **企业计划**:自定义限制
速率限制信息包含在响应头中:
速率限制信息包含在响应头中:
- `X-RateLimit-Limit`:每个窗口的最大请求数
- `X-RateLimit-Remaining`:当前窗口中剩余的请求数
- `X-RateLimit-Reset`:窗口重置时的 ISO 时间戳
@@ -495,7 +541,7 @@ async function pollLogs() {
setInterval(pollLogs, 30000);
```
## 示例:处理 Webhooks
## 示例:处理 Webhook
```javascript
import express from 'express';

View File

@@ -146,5 +146,5 @@ Sim 提供了两种互补的日志界面,以适应不同的工作流和使用
## 下一步
- 了解 [成本计算](/execution/costs) 以理解工作流定价
- 探索 [外部 API](/execution/api) 以进行编程日志访问
- 设置 [Webhook 通知](/execution/api#webhook-subscriptions) 以获取实时警报
- 探索 [外部 API](/execution/api) 以编程方式访问日志
- 设置 [通知](/execution/api#notifications) 以通过 webhook、电子邮件或 Slack 接收实时警报

View File

@@ -140,13 +140,14 @@ import { BlockInfoCard } from "@/components/ui/block-info-card"
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `target` | string | 是 | 要分析的目标域名 |
| `country` | string | 否 | 流量数据的国家代码 \(例如us, gb, de\)。默认值us |
| `mode` | string | 否 | 分析模式domain \(整个域名\), prefix \(URL 前缀\), subdomains \(包含所有子域名\) |
| `date` | string | 否 | 历史数据的日期,格式为 YYYY-MM-DD \(默认为今天\) |
| `limit` | number | 否 | 返回结果的最大数量 \(默认值100\) |
| `offset` | number | 否 | 分页时跳过的结果数量 |
| `apiKey` | string | | Ahrefs API 密钥 |
| `target` | 字符串 | 是 | 要分析的目标域名 |
| `country` | 字符串 | 否 | 流量数据的国家代码 \(例如us, gb, de\)。默认值us |
| `mode` | 字符串 | 否 | 分析模式domain \(整个域名\), prefix \(URL 前缀\), subdomains \(包含所有子域名\) |
| `date` | 字符串 | 否 | 历史数据的日期,格式为 YYYY-MM-DD \(默认为今天\) |
| `limit` | 数字 | 否 | 返回结果的最大数量 \(默认值100\) |
| `offset` | 数字 | 否 | 分页时跳过的结果数量 |
| `select` | 字符串 | | 要返回的字段的逗号分隔列表 \(例如url,traffic,keywords,top_keyword,value\)。默认值url,traffic,keywords,top_keyword,value |
| `apiKey` | 字符串 | 是 | Ahrefs API 密钥 |
#### 输出

View File

@@ -38,15 +38,15 @@ import { BlockInfoCard } from "@/components/ui/block-info-card"
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `calendarId` | string | 否 | 日历 ID默认为主日历 |
| `summary` | string | 是 | 事件标题/摘要 |
| `description` | string | 否 | 事件描述 |
| `location` | string | 否 | 事件地点 |
| `startDateTime` | string | 是 | 开始日期和时间RFC3339 格式,例如2025-06-03T10:00:00-08:00 |
| `endDateTime` | string | 是 | 结束日期和时间RFC3339 格式,例如2025-06-03T11:00:00-08:00 |
| `timeZone` | string | 否 | 时区例如America/Los_Angeles |
| `calendarId` | string | 否 | 日历 ID \(默认为主日历\) |
| `summary` | string | 是 | 活动标题/摘要 |
| `description` | string | 否 | 活动描述 |
| `location` | string | 否 | 活动地点 |
| `startDateTime` | string | 是 | 开始日期和时间。必须包含时区偏移 \(例如2025-06-03T10:00:00-08:00\) 或提供 timeZone 参数 |
| `endDateTime` | string | 是 | 结束日期和时间。必须包含时区偏移 \(例如2025-06-03T11:00:00-08:00\) 或提供 timeZone 参数 |
| `timeZone` | string | 否 | 时区 \(例如America/Los_Angeles\)。如果日期时间未包含偏移,则必需提供。如果未提供,默认为 America/Los_Angeles。 |
| `attendees` | array | 否 | 参与者电子邮件地址数组 |
| `sendUpdates` | string | 否 | 向参与者发送更新的方式all、externalOnly 或 none |
| `sendUpdates` | string | 否 | 如何向参与者发送更新all、externalOnly 或 none |
#### 输出

View File

@@ -110,8 +110,8 @@ import { BlockInfoCard } from "@/components/ui/block-info-card"
| --------- | ---- | -------- | ----------- |
| `folderSelector` | string | 否 | 选择要列出文件的文件夹 |
| `folderId` | string | 否 | 要列出文件的文件夹 ID内部使用 |
| `query` | string | 否 | 用于过滤文件的查询 |
| `pageSize` | number | 否 | 要返回的文件数 |
| `query` | string | 否 | 用于按名称过滤文件的搜索词(例如,"budget" 会找到名称中包含 "budget" 的文件)。不要在此处使用 Google Drive 查询语法 - 只需提供一个普通的搜索词即可。 |
| `pageSize` | number | 否 | 要返回的最大文件数默认值100 |
| `pageToken` | string | 否 | 用于分页的页面令牌 |
#### 输出

View File

@@ -88,8 +88,8 @@ import { BlockInfoCard } from "@/components/ui/block-info-card"
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `spreadsheetId` | string | 是 | 要读取的电子表格的 ID |
| `range` | string | 否 | 要读取的单元格范围 |
| `spreadsheetId` | string | 是 | 电子表格的 ID \(可在 URL 中找到docs.google.com/spreadsheets/d/\{SPREADSHEET_ID\}/edit\)。 |
| `range` | string | 否 | 要读取的 A1 表示法范围 \(例如 "Sheet1!A1:D10", "A1:B5"\)。如果未指定,默认为第一个工作表 A1:Z1000。 |
#### 输出
@@ -106,9 +106,9 @@ import { BlockInfoCard } from "@/components/ui/block-info-card"
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `spreadsheetId` | string | 是 | 要写入的电子表格的 ID |
| `range` | string | 否 | 要写入的单元格范围 |
| `values` | array | 是 | 要写入电子表格的数据 |
| `spreadsheetId` | string | 是 | 电子表格的 ID |
| `range` | string | 否 | 要写入的 A1 表示法范围 \(例如 "Sheet1!A1:D10", "A1:B5"\) |
| `values` | array | 是 | 要写入的数据,格式为二维数组 \(例如 \[\["Name", "Age"\], \["Alice", 30\], \["Bob", 25\]\]\) 或对象数组。 |
| `valueInputOption` | string | 否 | 要写入数据的格式 |
| `includeValuesInResponse` | boolean | 否 | 是否在响应中包含写入的值 |
@@ -131,10 +131,10 @@ import { BlockInfoCard } from "@/components/ui/block-info-card"
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `spreadsheetId` | string | 是 | 要更新的电子表格的 ID |
| `range` | string | 否 | 要更新的单元格范围 |
| `values` | array | 是 | 要更新到电子表格中的数据 |
| `range` | string | 否 | 要更新的 A1 表示法范围 \(例如 "Sheet1!A1:D10", "A1:B5"\) |
| `values` | array | 是 | 要更新的数据,格式为二维数组 \(例如 \[\["Name", "Age"\], \["Alice", 30\]\]\) 或对象数组。 |
| `valueInputOption` | string | 否 | 要更新数据的格式 |
| `includeValuesInResponse` | boolean | 否 | 是否在响应中包含更新的值 |
| `includeValuesInResponse` | boolean | 否 | 是否在响应中包含更新的值 |
#### 输出
@@ -154,12 +154,12 @@ import { BlockInfoCard } from "@/components/ui/block-info-card"
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `spreadsheetId` | string | 是 | 要追加的电子表格的 ID |
| `range` | string | 否 | 要在其后追加的单元格范围 |
| `values` | array | 是 | 要追加到电子表格的数据 |
| `spreadsheetId` | string | 是 | 要追加数据的电子表格的 ID |
| `range` | string | 否 | 要追加数据的单元格范围 \(例如:"Sheet1", "Sheet1!A:D"\) |
| `values` | array | 是 | 要追加的数据,格式为二维数组 \(例如:\[\["Alice", 30\], \["Bob", 25\]\]\) 或对象数组。 |
| `valueInputOption` | string | 否 | 要追加数据的格式 |
| `insertDataOption` | string | 否 | 如何插入数据 \(OVERWRITE 或 INSERT_ROWS\) |
| `includeValuesInResponse` | boolean | 否 | 是否在响应中包含追加的值 |
| `insertDataOption` | string | 否 | 数据插入方式 \(OVERWRITE 或 INSERT_ROWS\) |
| `includeValuesInResponse` | boolean | 否 | 是否在响应中包含追加的值 |
#### 输出

View File

@@ -0,0 +1,180 @@
---
title: Google Slides
description: 阅读、编写和创建演示文稿
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="google_slides"
color="#E0E0E0"
/>
{/* MANUAL-CONTENT-START:intro */}
[Google Slides](https://slides.google.com) 是一个动态的基于云的演示文稿应用程序,允许用户实时创建、编辑、协作和展示幻灯片。作为 Google 生产力套件的一部分Google Slides 提供了一个灵活的平台,用于设计引人入胜的演示文稿,与他人协作,并通过云无缝共享内容。
了解如何在 Sim 中集成 Google Slides 工具,以轻松管理作为自动化工作流程一部分的演示文稿。通过 Sim您可以直接通过代理和自动化流程读取、编写、创建和更新 Google Slides 演示文稿,从而轻松传递最新信息、生成自定义报告或以编程方式制作品牌幻灯片。
使用 Google Slides您可以
- **创建和编辑演示文稿**:使用主题、布局和多媒体内容设计视觉吸引力的幻灯片
- **实时协作**:与团队成员同时工作,评论、分配任务并实时接收演示文稿的反馈
- **随时随地展示**:在线或离线展示演示文稿,分享链接或发布到网络
- **添加图片和丰富内容**:插入图片、图形、图表和视频,使您的演示文稿更具吸引力
- **与其他服务集成**:与 Google Drive、Docs、Sheets 和其他第三方工具无缝连接
- **从任何设备访问**:在台式机、笔记本电脑、平板电脑和移动设备上使用 Google Slides最大限度地提高灵活性
在 Sim 中Google Slides 集成使您的代理能够以编程方式直接与演示文稿文件交互。自动化任务如读取幻灯片内容、插入新幻灯片或图片、替换整个幻灯片中的文本、生成新演示文稿以及检索幻灯片缩略图。这使您能够扩展内容创建,保持演示文稿的最新状态,并将其嵌入到自动化文档工作流程中。通过将 Sim 与 Google Slides 连接,您可以实现 AI 驱动的演示文稿管理——轻松生成、更新或从演示文稿中提取信息,而无需手动操作。
{/* MANUAL-CONTENT-END */}
## 使用说明
将 Google 幻灯片集成到工作流程中。可以读取、写入、创建演示文稿,替换文本,添加幻灯片,添加图片,以及获取缩略图。
## 工具
### `google_slides_read`
从 Google 幻灯片演示文稿中读取内容
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `presentationId` | string | 是 | 要读取的演示文稿的 ID |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `slides` | json | 包含内容的幻灯片数组 |
| `metadata` | json | 包括 ID、标题和 URL 的演示文稿元数据 |
### `google_slides_write`
在 Google 幻灯片演示文稿中写入或更新内容
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `presentationId` | string | 是 | 要写入的演示文稿的 ID |
| `content` | string | 是 | 要写入幻灯片的内容 |
| `slideIndex` | number | 否 | 要写入的幻灯片索引 \(默认为第一张幻灯片\) |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `updatedContent` | boolean | 表示演示文稿内容是否成功更新 |
| `metadata` | json | 更新后的演示文稿元数据,包括 ID、标题和 URL |
### `google_slides_create`
创建一个新的 Google 幻灯片演示文稿
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `title` | string | 是 | 要创建的演示文稿的标题 |
| `content` | string | 否 | 要添加到第一张幻灯片的内容 |
| `folderSelector` | string | 否 | 选择创建演示文稿的文件夹 |
| `folderId` | string | 否 | 用于创建演示文稿的文件夹 ID \(内部使用\) |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `metadata` | json | 创建的演示文稿元数据,包括 ID、标题和 URL |
### `google_slides_replace_all_text`
在 Google 幻灯片演示文稿中查找并替换所有文本
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `presentationId` | string | 是 | 演示文稿的 ID |
| `findText` | string | 是 | 要查找的文本 \(例如,\{\{placeholder\}\}\) |
| `replaceText` | string | 是 | 要替换的文本 |
| `matchCase` | boolean | 否 | 是否区分大小写 \(默认值true\) |
| `pageObjectIds` | string | 否 | 用逗号分隔的幻灯片对象 ID 列表,用于限制替换到特定幻灯片 \(留空表示所有幻灯片\) |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `occurrencesChanged` | number | 替换的文本出现次数 |
| `metadata` | json | 操作元数据,包括演示文稿 ID 和 URL |
### `google_slides_add_slide`
向 Google 幻灯片演示文稿添加具有指定布局的新幻灯片
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `presentationId` | string | 是 | 演示文稿的 ID |
| `layout` | string | 否 | 幻灯片的预定义布局 \(BLANK, TITLE, TITLE_AND_BODY, TITLE_ONLY, SECTION_HEADER 等\)。默认为 BLANK。 |
| `insertionIndex` | number | 否 | 可选的从零开始的索引,指示插入幻灯片的位置。如果未指定,则幻灯片添加到末尾。 |
| `placeholderIdMappings` | string | 否 | JSON 数组的占位符映射,用于为占位符分配自定义对象 ID。格式\[\{"layoutPlaceholder":\{"type":"TITLE"\},"objectId":"custom_title_id"\}\] |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `slideId` | string | 新创建幻灯片的对象 ID |
| `metadata` | json | 操作元数据,包括演示文稿 ID、布局和 URL |
### `google_slides_add_image`
在 Google 幻灯片演示文稿中的特定幻灯片中插入图片
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `presentationId` | string | 是 | 演示文稿的 ID |
| `pageObjectId` | string | 是 | 要添加图片的幻灯片/页面的对象 ID |
| `imageUrl` | string | 是 | 图片的公开可访问 URL必须是 PNG、JPEG 或 GIF最大 50MB |
| `width` | number | 否 | 图片的宽度单位默认值300 |
| `height` | number | 否 | 图片的高度单位默认值200 |
| `positionX` | number | 否 | 距离左边缘的 X 位置单位默认值100 |
| `positionY` | number | 否 | 距离顶部边缘的 Y 位置单位默认值100 |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `imageId` | string | 新创建图片的对象 ID |
| `metadata` | json | 操作元数据,包括演示文稿 ID 和图片 URL |
### `google_slides_get_thumbnail`
生成 Google 幻灯片演示文稿中特定幻灯片的缩略图
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `presentationId` | string | 是 | 演示文稿的 ID |
| `pageObjectId` | string | 是 | 要获取缩略图的幻灯片/页面的对象 ID |
| `thumbnailSize` | string | 否 | 缩略图的大小SMALL200px、MEDIUM800px或 LARGE1600px。默认为 MEDIUM。 |
| `mimeType` | string | 否 | 缩略图图像的 MIME 类型PNG 或 GIF。默认为 PNG。 |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `contentUrl` | string | 缩略图图像的 URL有效期为 30 分钟) |
| `width` | number | 缩略图的宽度(以像素为单位) |
| `height` | number | 缩略图的高度(以像素为单位) |
| `metadata` | json | 操作元数据,包括演示文稿 ID 和页面对象 ID |
## 注意
- 类别:`tools`
- 类型:`google_slides`

View File

@@ -360,7 +360,9 @@ incident.io 赋能现代组织更快响应、协调团队并捕获经验教训
| `apiKey` | string | 是 | incident.io API 密钥 |
| `id` | string | 是 | 要更新的日程 ID |
| `name` | string | 否 | 日程的新名称 |
| `timezone` | string | 否 | 日程的新时区 \(例如America/New_York\) |
| `timezone` | string | 否 | 日程的新时区 \(例如: America/New_York\) |
| `config` | string | 否 | 以 JSON 字符串形式表示的日程配置,包括轮换。例如: \{"rotations": \[\{"name": "Primary", "users": \[\{"id": "user_id"\}\], "handover_start_at": "2024-01-01T09:00:00Z", "handovers": \[\{"interval": 1, "interval_type": "weekly"\}\]\}\]\} |
| `Example` | string | 否 | 无描述 |
#### 输出

View File

@@ -167,7 +167,7 @@ import { BlockInfoCard } from "@/components/ui/block-info-card"
| `plan` | string | 否 | 公司计划名称 |
| `size` | number | 否 | 公司员工数量 |
| `industry` | string | 否 | 公司所属行业 |
| `monthly_spend` | number | 否 | 公司为您的业务创造的收入 |
| `monthly_spend` | number | 否 | 公司为您的业务创造的收入。注意此字段会将浮点数截断为整数例如155.98 会变为 155 |
| `custom_attributes` | string | 否 | 作为 JSON 对象的自定义属性 |
#### 输出
@@ -196,7 +196,7 @@ import { BlockInfoCard } from "@/components/ui/block-info-card"
### `intercom_list_companies`
列出 Intercom 的所有公司,支持分页
列出来自 Intercom 的所有公司,支持分页。注意:此端点限制为通过分页返回最多 10,000 家公司。对于超过 10,000 家公司的数据集,请改用 Scroll API。
#### 输入
@@ -254,12 +254,12 @@ import { BlockInfoCard } from "@/components/ui/block-info-card"
#### 输入
| 参数 | 类型 | 必 | 描述 |
| 参数 | 类型 | 必 | 描述 |
| --------- | ---- | -------- | ----------- |
| `conversationId` | string | 是 | 要回复的话 ID |
| `conversationId` | string | 是 | 要回复的话 ID |
| `message_type` | string | 是 | 消息类型:"comment" 或 "note" |
| `body` | string | 是 | 回复的文本内容 |
| `admin_id` | string | | 撰写回复的管理员 ID |
| `body` | string | 是 | 回复的正文文本 |
| `admin_id` | string | | 撰写回复的管理员 ID。如果未提供将使用默认管理员Operator/Fin |
| `attachment_urls` | string | 否 | 逗号分隔的图片 URL 列表(最多 10 个) |
#### 输出

View File

@@ -1,6 +1,6 @@
---
title: Kalshi
description: 访问 Kalshi 的预测市场数据
description: 访问预测市场并在 Kalshi 上进行交易
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
@@ -27,7 +27,7 @@ import { BlockInfoCard } from "@/components/ui/block-info-card"
## 使用说明
将 Kalshi 预测市场集成到工作流中。可以获取市场、单个市场、事件、单个事件、余额、头寸、订单、订单簿、交易、K 线、成交、系列交易所状态。
将 Kalshi 预测市场集成到工作流中。可以获取市场、单个市场、事件、单个事件、余额、头寸、订单、订单簿、交易、K线、成交、系列交易所状态,并进行下单/取消/修改交易
## 工具
@@ -172,16 +172,34 @@ import { BlockInfoCard } from "@/components/ui/block-info-card"
| `success` | boolean | 操作成功状态 |
| `output` | object | 订单数据和元数据 |
### `kalshi_get_orderbook`
### `kalshi_get_order`
检索特定市场的订单簿(买入和卖出)
通过 ID 从 Kalshi 检索特定订单的详细信息
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `ticker` | string | 是 | 市场代码 \(例如KXBTC-24DEC31\) |
| `depth` | number | | 每侧返回的价格级别数量 |
| `keyId` | string | 是 | 您的 Kalshi API 密钥 ID |
| `privateKey` | string | | 您的 RSA 私钥 \(PEM 格式\) |
| `orderId` | string | 是 | 要检索的订单 ID |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `success` | boolean | 操作成功状态 |
| `output` | object | 订单数据 |
### `kalshi_get_orderbook`
检索特定市场的订单簿(买入和卖出报价)
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `ticker` | string | 是 | 市场代码 \(例如KXBTC-24DEC31\) |
#### 输出
@@ -192,15 +210,12 @@ import { BlockInfoCard } from "@/components/ui/block-info-card"
### `kalshi_get_trades`
获取所有市场或特定市场的最近交易记录
检索所有市场的最近交易
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `ticker` | string | 否 | 按市场代码过滤 |
| `minTs` | number | 否 | 最小时间戳 \(Unix 毫秒\) |
| `maxTs` | number | 否 | 最大时间戳 \(Unix 毫秒\) |
| `limit` | string | 否 | 结果数量 \(1-1000默认值100\) |
| `cursor` | string | 否 | 下一页的分页游标 |
@@ -213,7 +228,7 @@ import { BlockInfoCard } from "@/components/ui/block-info-card"
### `kalshi_get_candlesticks`
获取特定市场的 OHLC 蜡烛图数据
检索特定市场的 OHLC 蜡烛图数据
#### 输入
@@ -221,16 +236,16 @@ import { BlockInfoCard } from "@/components/ui/block-info-card"
| --------- | ---- | -------- | ----------- |
| `seriesTicker` | string | 是 | 系列代码 |
| `ticker` | string | 是 | 市场代码 \(例如KXBTC-24DEC31\) |
| `startTs` | number | | 开始时间戳 \(Unix 秒\) |
| `endTs` | number | | 结束时间戳 \(Unix 秒\) |
| `periodInterval` | number | | 时间间隔1 \(1分钟\)60 \(1小时\)或 1440 \(1天\) |
| `startTs` | number | | 开始时间戳 \(Unix 秒\) |
| `endTs` | number | | 结束时间戳 \(Unix 秒\) |
| `periodInterval` | number | | 时间间隔1 \(1分钟\), 60 \(1小时\), 或 1440 \(1天\) |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `success` | boolean | 操作成功状态 |
| `output` | object | K线数据和元数据 |
| `output` | object | 蜡烛图数据和元数据 |
### `kalshi_get_fills`
@@ -241,12 +256,12 @@ import { BlockInfoCard } from "@/components/ui/block-info-card"
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `keyId` | string | 是 | 您的 Kalshi API 密钥 ID |
| `privateKey` | string | 是 | 您的 RSA 私钥PEM 格式|
| `ticker` | string | 否 | 按市场代码筛选 |
| `orderId` | string | 否 | 按订单 ID 筛选 |
| `minTs` | number | 否 | 最小时间戳Unix 毫秒|
| `maxTs` | number | 否 | 最大时间戳Unix 毫秒|
| `limit` | string | 否 | 结果数量1-1000默认值100|
| `privateKey` | string | 是 | 您的 RSA 私钥 \(PEM 格式\) |
| `ticker` | string | 否 | 按市场代码过滤 |
| `orderId` | string | 否 | 按订单 ID 过滤 |
| `minTs` | number | 否 | 最小时间戳 \(Unix 毫秒\) |
| `maxTs` | number | 否 | 最大时间戳 \(Unix 毫秒\) |
| `limit` | string | 否 | 结果数量 \(1-1000默认值100\) |
| `cursor` | string | 否 | 下一页的分页游标 |
#### 输出
@@ -254,7 +269,7 @@ import { BlockInfoCard } from "@/components/ui/block-info-card"
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `success` | boolean | 操作成功状态 |
| `output` | object | 成交数据和元数据 |
| `output` | object | 填充数据和元数据 |
### `kalshi_get_series_by_ticker`
@@ -275,7 +290,7 @@ import { BlockInfoCard } from "@/components/ui/block-info-card"
### `kalshi_get_exchange_status`
检索 Kalshi 交易所的当前状态(交易和交易活动)
检索 Kalshi 交易所的当前状态(交易和交易活动)
#### 输入
@@ -289,7 +304,90 @@ import { BlockInfoCard } from "@/components/ui/block-info-card"
| `success` | boolean | 操作成功状态 |
| `output` | object | 交易所状态数据和元数据 |
### `kalshi_create_order`
在 Kalshi 预测市场创建新订单
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `keyId` | string | 是 | 您的 Kalshi API 密钥 ID |
| `privateKey` | string | 是 | 您的 RSA 私钥PEM 格式)|
| `ticker` | string | 是 | 市场代码 \(例如KXBTC-24DEC31\) |
| `side` | string | 是 | 订单方向:'yes' 或 'no' |
| `action` | string | 是 | 操作类型:'buy' 或 'sell' |
| `count` | string | 是 | 合约数量(最少 1|
| `type` | string | 否 | 订单类型:'limit' 或 'market'默认limit|
| `yesPrice` | string | 否 | Yes 价格以美分为单位1-99|
| `noPrice` | string | 否 | No 价格以美分为单位1-99|
| `yesPriceDollars` | string | 否 | Yes 价格(以美元为单位,例如:"0.56"|
| `noPriceDollars` | string | 否 | No 价格(以美元为单位,例如:"0.56"|
| `clientOrderId` | string | 否 | 自定义订单标识符 |
| `expirationTs` | string | 否 | 订单过期的 Unix 时间戳 |
| `timeInForce` | string | 否 | 有效时间:'fill_or_kill''good_till_canceled''immediate_or_cancel' |
| `buyMaxCost` | string | 否 | 最大成本(以美分为单位,自动启用 fill_or_kill|
| `postOnly` | string | 否 | 设置为 'true' 以仅限做市订单 |
| `reduceOnly` | string | 否 | 设置为 'true' 以仅限减少头寸 |
| `selfTradePreventionType` | string | 否 | 自交易预防:'taker_at_cross' 或 'maker' |
| `orderGroupId` | string | 否 | 关联的订单组 ID |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `success` | boolean | 操作成功状态 |
| `output` | object | 创建的订单数据 |
### `kalshi_cancel_order`
取消 Kalshi 上的现有订单
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `keyId` | string | 是 | 您的 Kalshi API 密钥 ID |
| `privateKey` | string | 是 | 您的 RSA 私钥 \(PEM 格式\) |
| `orderId` | string | 是 | 要取消的订单 ID |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `success` | boolean | 操作成功状态 |
| `output` | object | 已取消的订单数据 |
### `kalshi_amend_order`
修改 Kalshi 上现有订单的价格或数量
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `keyId` | string | 是 | 您的 Kalshi API 密钥 ID |
| `privateKey` | string | 是 | 您的 RSA 私钥 \(PEM 格式\) |
| `orderId` | string | 是 | 要修改的订单 ID |
| `ticker` | string | 是 | 市场代码 |
| `side` | string | 是 | 订单方向:'yes' 或 'no' |
| `action` | string | 是 | 操作类型:'buy' 或 'sell' |
| `clientOrderId` | string | 是 | 原始客户指定的订单 ID |
| `updatedClientOrderId` | string | 是 | 修改后的客户指定订单 ID |
| `count` | string | 否 | 更新后的订单数量 |
| `yesPrice` | string | 否 | 更新后的 yes 价格(以分为单位 \(1-99\) |
| `noPrice` | string | 否 | 更新后的 no 价格(以分为单位 \(1-99\) |
| `yesPriceDollars` | string | 否 | 更新后的 yes 价格(以美元为单位 \(例如,"0.56"\) |
| `noPriceDollars` | string | 否 | 更新后的 no 价格(以美元为单位 \(例如,"0.56"\) |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `success` | boolean | 操作成功状态 |
| `output` | object | 修改后的订单数据 |
## 注意
- 类别: `tools`
- 类型: `kalshi`
- 类别`tools`
- 类型`kalshi`

View File

@@ -38,14 +38,14 @@ Polymarket 集成的主要功能包括:
#### 输入
| 参数 | 类型 | 是否必需 | 描述 |
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `closed` | 字符串 | 否 | 按关闭状态筛选 \(true/false\)。使用 false 仅显示活跃市场。 |
| `order` | 字符串 | 否 | 排序字段 \(例如id、volumeliquidity\) |
| `ascending` | 字符串 | 否 | 排序方向 \(true 表示升序false 表示降序\) |
| `tagId` | 字符串 | 否 | 按标签 ID 筛选 |
| `limit` | 字符串 | 否 | 每页结果数量 \(建议25-50\) |
| `offset` | 字符串 | 否 | 分页偏移量 \(跳过此数量的结果\) |
| `closed` | string | 否 | 按关闭状态筛选 \(true/false\)。使用 false 仅显示活跃市场。 |
| `order` | string | 否 | 排序字段 \(例如volumeNum, liquidityNum, startDate, endDate, createdAt\) |
| `ascending` | string | 否 | 排序方向 \(true 表示升序false 表示降序\) |
| `tagId` | string | 否 | 按标签 ID 筛选 |
| `limit` | string | 否 | 每页结果数量 \(推荐25-50\) |
| `offset` | string | 否 | 分页偏移量 \(跳过此数量的结果\) |
#### 输出
@@ -80,10 +80,10 @@ Polymarket 集成的主要功能包括:
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `closed` | string | 否 | 按关闭状态过滤 \(true/false\)。使用 false 仅显示活跃事件。 |
| `order` | string | 否 | 排序字段 \(例如id, volume\) |
| `ascending` | string | 否 | 排序方向 \(true 升序false 降序\) |
| `tagId` | string | 否 | 按标签 ID 过滤 |
| `closed` | string | 否 | 按关闭状态筛选 \(true/false\)。使用 false 仅显示活跃事件。 |
| `order` | string | 否 | 排序字段 \(例如volume, liquidity, startDate, endDate, createdAt\) |
| `ascending` | string | 否 | 排序方向 \(true 表示升序false 表示降序\) |
| `tagId` | string | 否 | 按标签 ID 筛选 |
| `limit` | string | 否 | 每页结果数量 \(推荐25-50\) |
| `offset` | string | 否 | 分页偏移量 \(跳过此数量的结果\) |

View File

@@ -118,6 +118,82 @@ import { BlockInfoCard } from "@/components/ui/block-info-card"
| --------- | ---- | ----------- |
| `messages` | array | 频道中的消息对象数组 |
### `slack_list_channels`
列出 Slack 工作区中的所有频道。返回机器人有权限访问的公共和私人频道。
#### 输入
| 参数 | 类型 | 是否必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `authMethod` | string | 否 | 认证方法oauth 或 bot_token |
| `botToken` | string | 否 | 自定义 Bot 的 Bot token |
| `includePrivate` | boolean | 否 | 包括机器人是成员的私人频道默认true |
| `excludeArchived` | boolean | 否 | 排除已归档的频道默认true |
| `limit` | number | 否 | 返回的最大频道数量默认100最大200 |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `channels` | array | 工作区中的频道对象数组 |
### `slack_list_members`
列出 Slack 频道中的所有成员(用户 ID。可与获取用户信息功能结合使用将 ID 解析为名称。
#### 输入
| 参数 | 类型 | 是否必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `authMethod` | string | 否 | 认证方法oauth 或 bot_token |
| `botToken` | string | 否 | 自定义 Bot 的 Bot token |
| `channel` | string | 是 | 要列出成员的频道 ID |
| `limit` | number | 否 | 返回的最大成员数量默认100最大200 |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `members` | array | 频道成员的用户 ID 数组例如U1234567890 |
### `slack_list_users`
列出 Slack 工作区中的所有用户。返回包含名称和头像的用户资料。
#### 输入
| 参数 | 类型 | 是否必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `authMethod` | string | 否 | 认证方法oauth 或 bot_token |
| `botToken` | string | 否 | 自定义 Bot 的令牌 |
| `includeDeleted` | boolean | 否 | 是否包含已停用/已删除的用户默认值false |
| `limit` | number | 否 | 返回的最大用户数量默认值100最大值200 |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `users` | array | 工作区中的用户对象数组 |
### `slack_get_user`
通过用户 ID 获取特定 Slack 用户的详细信息。
#### 输入
| 参数 | 类型 | 是否必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `authMethod` | string | 否 | 认证方法oauth 或 bot_token |
| `botToken` | string | 否 | 自定义 Bot 的令牌 |
| `userId` | string | 是 | 要查询的用户 ID例如U1234567890 |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `user` | object | 用户的详细信息 |
### `slack_download`
从 Slack 下载文件
@@ -139,7 +215,7 @@ import { BlockInfoCard } from "@/components/ui/block-info-card"
### `slack_update_message`
更新由机器人在 Slack 中前发送的消息
更新由机器人在 Slack 中前发送的消息
#### 输入
@@ -161,7 +237,7 @@ import { BlockInfoCard } from "@/components/ui/block-info-card"
### `slack_delete_message`
删除由机器人在 Slack 中前发送的消息
删除由机器人在 Slack 中前发送的消息
#### 输入
@@ -177,7 +253,7 @@ import { BlockInfoCard } from "@/components/ui/block-info-card"
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `content` | string | 成功消息 |
| `metadata` | object | 删除消息元数据 |
| `metadata` | object | 删除消息元数据 |
### `slack_add_reaction`

View File

@@ -66,16 +66,16 @@ Sim 中的环境变量分为两个级别:
height={350}
/>
## 变量优先级
## 变量的解析方式
当您同时拥有名称相同的个人变量和工作区变量时:
**工作区变量始终优先于**个人变量,无论是谁运行工作流。
1. **工作区变量优先** 于个人变量
2. 这可以防止命名冲突,并确保团队工作流中的行为一致
3. 如果存在工作区变量,则会忽略具有相同名称的个人变量
当某个键没有工作区变量时,将使用个人变量
- **手动运行UI**:使用您的个人变量
- **自动运行API、Webhook、计划任务、已部署的聊天**:使用工作流所有者的个人变量
<Callout type="warning">
请谨慎选择变量名称,以避免意外覆盖。建议为个人变量添加您的姓名首字母前缀,或为工作区变量添加项目名称前缀
<Callout type="info">
个人变量最适合用于测试。生产环境的工作流请使用工作区变量
</Callout>
## 安全最佳实践

View File

@@ -155,10 +155,10 @@ checksums:
content/17: 71f197abc03ccf0fbd23f1bad0bfd450
content/18: 2fa6f2c12d3ad71b64e1c1b7b96bf348
content/19: 17f927a05543fb337b72be5501332577
content/20: d9380cdcc96b7cbc253f7a916bbf8ea5
content/21: 485586a48c36c878a95c22a03e8f3676
content/22: c3d2fa5d359011e843e8771ea6d3491f
content/23: 1a2569897c84b009b770c6585d72d7d6
content/20: 7f832236ba279639c9f12b97e0a75615
content/21: 0a61b9c5fc3ae7648c648a07b1adae17
content/22: a04ec7cf757e7a63c1145257887e01d0
content/23: 9c0f1d6c3ef087ccb77a81267fbbf078
content/24: fc8a2d65e8fa2c33010d2b6fe10bbd68
content/25: 7beb08526a7baf4cc6d32dc67eb67376
content/26: 4f8bbb64b829f602156d0985fd48ca88
@@ -907,32 +907,56 @@ checksums:
content/27: 170ccdc4ce7ee086e9c6b5073efca582
content/28: bcadfc362b69078beee0088e5936c98b
content/29: b82def7d82657f941fbe60df3924eeeb
content/30: bcc307ab47d781529e1809281c84f6e1
content/31: f3b1717da25bab99b686761a60f53842
content/30: 1ca7ee3856805fa1718031c5f75b6ffb
content/31: 949801e405d87718b6c2b9059cae502e
content/32: 371d0e46b4bd2c23f559b8bc112f6955
content/33: a3a3035f55f9475958a212a317202cf7
content/33: 6f837577eee86c44737b01077235690c
content/34: bcadfc362b69078beee0088e5936c98b
content/35: f87e976ce212bb9c7bcd83a26156de2a
content/36: df64b205315168a0264574d76f7776ad
content/37: 263aabafa94113ea3e562655cb92dbac
content/35: d07ba6e7e81a6c14f4c755c5d4e1feb7
content/36: 9885b40af8a69f3209842c6b1999e2f0
content/37: dd1630773e623a22170424b9a9fcd8dc
content/38: 371d0e46b4bd2c23f559b8bc112f6955
content/39: 5319bf5409aced353e6b9d67f597ffef
content/39: cad87a46758853b623344e8eb6e736a9
content/40: bcadfc362b69078beee0088e5936c98b
content/41: d67f49be147c5ea63f88554f3b8eaed1
content/42: e10ecb501eb65fd1a59501a40b707c7a
content/43: d829a82e9bcbcfb6239ca2ed9e10ba77
content/41: 55cce6895bb236266b0012554c8f9421
content/42: a5364fa7f3eccd9d409d7a55b80ee29d
content/43: 17e3fecb26d6cf65b93d08cc455d82c3
content/44: 371d0e46b4bd2c23f559b8bc112f6955
content/45: 33e38761b95cbf57093ae18ee93753b3
content/45: 77493a293ee95216ef36fe6d4aece3d1
content/46: bcadfc362b69078beee0088e5936c98b
content/47: de2a47d11b7a6bb3bd6a2c76902c7ef2
content/48: 359c44f8d3f1bf46e03d20d51b8a028f
content/49: e7b1cc0780768ccbf9876e9ce76e984f
content/47: a9471f623e6956bed2ba9934d04129fb
content/48: 56cfa01acbab775b52ea70fa53aa172b
content/49: d2f31d68fc899d5806a92122600a4e80
content/50: 371d0e46b4bd2c23f559b8bc112f6955
content/51: c2843b4d30bf09aca759e5b2a064aba8
content/51: d690cfede23e591a52765ead94ee7103
content/52: bcadfc362b69078beee0088e5936c98b
content/53: 883dfd99c21232c8569bbdf8939f0e7e
content/54: b3f310d5ef115bea5a8b75bf25d7ea9a
content/55: f80857bbc3489ef18fcaadab197e2e77
content/53: ffc6403a8169d47eeef5dd8674e413df
content/54: bcc307ab47d781529e1809281c84f6e1
content/55: f3b1717da25bab99b686761a60f53842
content/56: 371d0e46b4bd2c23f559b8bc112f6955
content/57: a3a3035f55f9475958a212a317202cf7
content/58: bcadfc362b69078beee0088e5936c98b
content/59: f87e976ce212bb9c7bcd83a26156de2a
content/60: df64b205315168a0264574d76f7776ad
content/61: 263aabafa94113ea3e562655cb92dbac
content/62: 371d0e46b4bd2c23f559b8bc112f6955
content/63: 5319bf5409aced353e6b9d67f597ffef
content/64: bcadfc362b69078beee0088e5936c98b
content/65: d67f49be147c5ea63f88554f3b8eaed1
content/66: e10ecb501eb65fd1a59501a40b707c7a
content/67: d829a82e9bcbcfb6239ca2ed9e10ba77
content/68: 371d0e46b4bd2c23f559b8bc112f6955
content/69: 33e38761b95cbf57093ae18ee93753b3
content/70: bcadfc362b69078beee0088e5936c98b
content/71: de2a47d11b7a6bb3bd6a2c76902c7ef2
content/72: 359c44f8d3f1bf46e03d20d51b8a028f
content/73: e7b1cc0780768ccbf9876e9ce76e984f
content/74: 371d0e46b4bd2c23f559b8bc112f6955
content/75: c2843b4d30bf09aca759e5b2a064aba8
content/76: bcadfc362b69078beee0088e5936c98b
content/77: 883dfd99c21232c8569bbdf8939f0e7e
content/78: b3f310d5ef115bea5a8b75bf25d7ea9a
content/79: f80857bbc3489ef18fcaadab197e2e77
3b259d9553c506dab1915efe6df32fc4:
meta/title: bffce99cf04c6651f6f5e82b731c6093
meta/description: 6ed9ca8738fc05b54b373173c32a1dea
@@ -2778,25 +2802,25 @@ checksums:
content/17: ea3d2fb612b08ffe583e92ecd5b3025c
content/18: a78936adb114037a8dee267d88abb603
content/19: 371d0e46b4bd2c23f559b8bc112f6955
content/20: 7ca1d93dc14ae39cd3b4d56ac56f93d4
content/20: b9b0012cb532c77dda6dba57fd5fb943
content/21: bcadfc362b69078beee0088e5936c98b
content/22: 11a612ef04dadc8a3d55cab9afa1e4df
content/23: ab15a93aaed1f9cef3847c4ead310fa2
content/24: 2ebb96901a65dd1736f9dbaae7b744e6
content/25: 371d0e46b4bd2c23f559b8bc112f6955
content/26: 3baeb386e740b984a8df4561397c4cfb
content/26: c83d5d790dd881ee43938bb93522e77a
content/27: bcadfc362b69078beee0088e5936c98b
content/28: 47edc139bf3ff54edf851af50aec7c60
content/29: 456511a19c775d0f6f7be905765f41d7
content/30: f47eab9d86d77728d9934b080758c58b
content/31: 371d0e46b4bd2c23f559b8bc112f6955
content/32: dfb83115b39e7d573161be0230d5bea3
content/32: e76c892ef9374151ed506737008e5f18
content/33: bcadfc362b69078beee0088e5936c98b
content/34: 47edc139bf3ff54edf851af50aec7c60
content/35: 6ec9639048ecca2d156c7be05a893934
content/36: 247cb9d4bf4ec359896a78f037088319
content/37: 371d0e46b4bd2c23f559b8bc112f6955
content/38: a32ed8d3852d56e8a6ce706e44f319ea
content/38: ca57a9ef1818257f362ad930e949fae3
content/39: bcadfc362b69078beee0088e5936c98b
content/40: 79400769ec9ac9106489b520c4752077
content/41: b3f310d5ef115bea5a8b75bf25d7ea9a
@@ -2858,7 +2882,7 @@ checksums:
content/29: ea522cae48853c07c8d5d8b378769653
content/30: e260dc1e43fda57cedb8ff50fd9ff8b0
content/31: 371d0e46b4bd2c23f559b8bc112f6955
content/32: 0ec9739376bf4d1607f508a9ccd5135d
content/32: 9a2bf9be39ff41b735bc13e10e7920fb
content/33: bcadfc362b69078beee0088e5936c98b
content/34: b949599a24b5450a297ffdbcb5bc573f
content/35: b3f310d5ef115bea5a8b75bf25d7ea9a
@@ -2916,7 +2940,7 @@ checksums:
content/9: 4094290e2d3e5a386eeb80bbfffdcb66
content/10: 1cf287e27ca91288eb3ddf06d67c1bbc
content/11: 371d0e46b4bd2c23f559b8bc112f6955
content/12: d06a683f0109e4cc78ca5ed12970a3ae
content/12: 5982e8a9d918fbf02a484fb1fa1c4022
content/13: bcadfc362b69078beee0088e5936c98b
content/14: d21e4931f38f03eaafb618e0ff4734c0
content/15: d18ba36c8cdd7aab15fa909f84a76a73
@@ -4488,7 +4512,7 @@ checksums:
content/29: 1a98ac22faecc543d8f2d4065023e774
content/30: fa0c9faaa2ffef89fb19f70e271912c3
content/31: c2cef2688104adaf6641092f43d4969a
content/32: ebdbef07196127ef2c7ba23491f62578
content/32: 16ae245dc265324548e4b7f443b57d71
0334b7b88d5f6e736984d25a5913ce74:
meta/title: 30c54e4dc4ce599b87d94be34a8617f5
content/0: c2b41859d63a751682f0d9aec488e581
@@ -4639,43 +4663,57 @@ checksums:
content/31: 620d49f6fa198176bf6e59685e246e2c
content/32: 736aa604a0310410baaf7723027d3cdb
content/33: 3304a33dfb626c6e2267c062e8956a9d
content/34: 3d833eb8f8e6bd1feebea1cb6c388309
content/35: f4e933e28b226f3b5b35d1401d4a8649
content/34: 1dcfad686ae5b282bc1666e422d3a05c
content/35: 852efbf14e8f30db0806cd41b90812ac
content/36: 95ec79465a3a0d67bf1eaf0ef0574b71
content/37: a995cdc6044f9b6745b7fc7e3a0d6d79
content/38: 4a6b924e56225096e27be99282e0924d
content/39: 9a32a035dfbb07c1daec8939fcec70fd
content/40: ffd9a3c7a121a6a22758a7efc9af55b9
content/41: 8bece06923c42ca045eaffc282b8a0e6
content/42: 68926c22cd421a38f0fb4e51eb68dca5
content/43: f29cfb9cfcc3e4eb4bd63c0c4aa78832
content/44: d27a1d4f71d599ebf7b0dd6f748a5e04
content/45: c378967adfff8419115144415d96f47c
content/46: 44383ae82f1d6e0e0bb70bfc4dc558d6
content/47: c681ed9371c4285112b6cf0c75a14d90
content/48: 7c872ba10b1a7bd9aa66f965b8aa35c0
content/49: c6ae2bcbff69a19c7bf2a50de79a6d45
content/50: cbfe1ade60934bcf4914255350760e4f
content/51: 42b378d3e7ee5b53893f4aed2df7371e
content/52: 3304a33dfb626c6e2267c062e8956a9d
content/53: 7d213c6776c3a2c9094cec87ff25b533
content/54: 4abd5155d278bf5a8e313c464cc232c7
content/55: 54d9518f5153dfc440daaeb4c30aa236
content/56: a577d5715cc0369536eed19cb5a4e6ad
content/57: b2a4a0c279f47d58a2456f25a1e1c6f9
content/58: 4f0ae0ea5cd3920a1f5a4a4cc42c3e10
content/59: 25545e546719f2dce0e3865aef7a5f1f
content/60: b3253e17dc54f4092bffb91d55ac5afa
content/61: c13873edfa750ce6caa155ef2f3f1883
content/62: 0bc07e36a42f7e25d5426b6a9deaac02
content/63: 017c829dd54fde20fa9fac7712342236
content/64: ceba97287cca68b1291142a38175d6d8
content/65: 02072ea1e956490139dbe8bbb0bc3e16
content/66: 44871834b9cb423a9978843c08623979
content/67: 0b22ed8a7e64005c666505c48e09f715
content/68: 494dcadaea5e62eddd599700511ecee5
content/69: 8332b16a0bf7a4c862f5104e9ffeb98d
content/70: 90e2f984a874a8f954ddfd127ec8178a
content/37: fc5f5a62b8d58cabbb3e26f1da4fb174
content/38: 361f583959e1599ed744b8bb076d7a63
content/39: 34ce28c18ded945e0ed7adc2fea7a767
content/40: cbfe3780725022693dbe8bca77166ebf
content/41: 6e6eca3194853de1383060f28e62428e
content/42: ab22182e07b366a5ad8aeaa4cd33c98b
content/43: 9757cdca1f88b3501ab320067ffc69f5
content/44: a9766f789c10b20e7616a89977913461
content/45: 93fcde5246eed5fbbda2c38499991caa
content/46: 74075c0a46913bfb13c5677706a6add1
content/47: ec9cca1ed40ff37ecbbd9079ff7e20b8
content/48: 568646d11f867050de7dc098c172cbdb
content/49: 602e3ba652a74c425b233faa001fd885
content/50: 0dd6137b756a3b6c9c68adc89bda4766
content/51: 827b9be3e2fbc0bff1157cbdfbd9cebd
content/52: e991745d67395e34fe24acbec325163c
content/53: 5712e5497ca7e787d96c18eec0c70715
content/54: 8265f9e2c583cdaa2428440263dd5456
content/55: be210009a4f28628db2583119b604dee
content/56: 68926c22cd421a38f0fb4e51eb68dca5
content/57: f29cfb9cfcc3e4eb4bd63c0c4aa78832
content/58: c47dd793baa3187e133d27545832e474
content/59: c378967adfff8419115144415d96f47c
content/60: 44383ae82f1d6e0e0bb70bfc4dc558d6
content/61: c681ed9371c4285112b6cf0c75a14d90
content/62: 7c872ba10b1a7bd9aa66f965b8aa35c0
content/63: c6ae2bcbff69a19c7bf2a50de79a6d45
content/64: cbfe1ade60934bcf4914255350760e4f
content/65: 42b378d3e7ee5b53893f4aed2df7371e
content/66: 3304a33dfb626c6e2267c062e8956a9d
content/67: 7d213c6776c3a2c9094cec87ff25b533
content/68: 4abd5155d278bf5a8e313c464cc232c7
content/69: 54d9518f5153dfc440daaeb4c30aa236
content/70: a577d5715cc0369536eed19cb5a4e6ad
content/71: b2a4a0c279f47d58a2456f25a1e1c6f9
content/72: 4f0ae0ea5cd3920a1f5a4a4cc42c3e10
content/73: 25545e546719f2dce0e3865aef7a5f1f
content/74: b3253e17dc54f4092bffb91d55ac5afa
content/75: c13873edfa750ce6caa155ef2f3f1883
content/76: 0bc07e36a42f7e25d5426b6a9deaac02
content/77: 017c829dd54fde20fa9fac7712342236
content/78: ceba97287cca68b1291142a38175d6d8
content/79: 02072ea1e956490139dbe8bbb0bc3e16
content/80: 44871834b9cb423a9978843c08623979
content/81: 0b22ed8a7e64005c666505c48e09f715
content/82: 494dcadaea5e62eddd599700511ecee5
content/83: 8332b16a0bf7a4c862f5104e9ffeb98d
content/84: 90e2f984a874a8f954ddfd127ec8178a
0e322683b6d10e9fa8c9a17ff15a5fb1:
meta/title: a912b3c7fb996fefccb182cf5c4a3fbc
content/0: e1f8d4b13687e7d73b5b5fbb4cb6142d
@@ -45970,7 +46008,7 @@ checksums:
content/113: 61f62451582748e0ed3dbc1e2fe5a85e
content/114: 03da6d5c0e86cf220a45e3618628ed32
content/115: 371d0e46b4bd2c23f559b8bc112f6955
content/116: f3f04e72c93bb67b9d324c881485a501
content/116: e18187db483ea88bb15d78e31c705e51
content/117: bcadfc362b69078beee0088e5936c98b
content/118: 0c3b89bd00a8d061646b17910809500d
content/119: eecf897a6786b775557f2682cc7b1c9e
@@ -47055,7 +47093,7 @@ checksums:
content/45: c76943404f9c8d34a85e6315359ed0c4
content/46: b5e111e430aa1c929fb07d5844bf65eb
content/47: 371d0e46b4bd2c23f559b8bc112f6955
content/48: 4f3e33afca0089a4c38e600ddcf987e7
content/48: 3e3ced1f6eb6c0ef39098531beb12598
content/49: bcadfc362b69078beee0088e5936c98b
content/50: dbc08cce26f9565e719891bbbf4632a9
content/51: d0ce65f5420745c45ab42b7edd135bf4
@@ -47065,7 +47103,7 @@ checksums:
content/55: bcadfc362b69078beee0088e5936c98b
content/56: a7e001e39652db8eeb4d32968bda102b
content/57: 440f2732ad006bee8cccc975fdbf673a
content/58: f3cc387aa35265e27be2134def8d9e23
content/58: 7a7048c54763b0109643f37e583381ce
content/59: 371d0e46b4bd2c23f559b8bc112f6955
content/60: 5672a02f72bdb165f91b43e4ad24c4a9
content/61: bcadfc362b69078beee0088e5936c98b
@@ -47085,7 +47123,7 @@ checksums:
content/75: 935f1a713d05f32d3d826434a7e715ee
content/76: e505d8f656fb6e3b65a98cb73d744598
content/77: 371d0e46b4bd2c23f559b8bc112f6955
content/78: c963aaaebebb4ed420f776f10471a033
content/78: e218c4f319e6a6a50c0535d3ee5e8fcf
content/79: bcadfc362b69078beee0088e5936c98b
content/80: 22bd99d5b844817b808b9d0d3baddac4
content/81: e959b48af94a559e9c46cbd7653d2dd2
@@ -47979,7 +48017,7 @@ checksums:
content/10: bb5d0521074c58da3f6b997faef887ae
content/11: 147f49b8a7a56cb60c881117480a71fb
content/12: 371d0e46b4bd2c23f559b8bc112f6955
content/13: d88f3b55a0e0c21884b1666d3d431d06
content/13: 64096864823f19e5e62d794315454652
content/14: bcadfc362b69078beee0088e5936c98b
content/15: 7311861512fa50f2c937d080692151e8
content/16: fbb677a4902291738c3a1f8b9303fd4a
@@ -47991,7 +48029,7 @@ checksums:
content/22: 25e7fef7953155abe4219e03058c2f94
content/23: 1ba7d90c16ff260798c13836a74aad6a
content/24: 371d0e46b4bd2c23f559b8bc112f6955
content/25: 937261561e7fbca25bfa59e1761a77be
content/25: 0f201f6957d27eaf9d1c4b4eab6ec8f7
content/26: bcadfc362b69078beee0088e5936c98b
content/27: a88bd6e0708b4c3017be42eabc480947
content/28: 528f164231d5bf39fcd8849734efebde
@@ -48082,7 +48120,7 @@ checksums:
content/113: 29208f859f7c25898a8bb435d3e744d0
54ec89df9800159df913e0955d2775e1:
meta/title: 6e51f3ea638199ea7733ea81e4512317
meta/description: 5084d459d228b33203d57521e97a15aa
meta/description: 0e3e222a5003cb3a73b6a37cbb3a6cbc
content/0: 1b031fb0c62c46b177aeed5c3d3f8f80
content/1: 367fa4b034d02d9123dca3dc0dcfdadf
content/2: 9eb85e9cb9e915facdce6a4c626757a2
@@ -48090,7 +48128,7 @@ checksums:
content/4: 5cc47b6bd553ef5ae4e6f2a5fba3a4b1
content/5: df92c120b414bd5409e0b2f5d12fa191
content/6: 821e6394b0a953e2b0842b04ae8f3105
content/7: a9d3e8e671a399b716a03dbac5747dd3
content/7: 65ab1981394e333b75e33b02140e3931
content/8: 9c8aa3f09c9b2bd50ea4cdff3598ea4e
content/9: 1249d97c2c2c96fb0dc483cdf764c103
content/10: 14e0d19fa4c092a2db93edcc870dcf67
@@ -48134,44 +48172,68 @@ checksums:
content/48: 93c01d42da765b2862a1c90e5c207f3a
content/49: bcadfc362b69078beee0088e5936c98b
content/50: cb25800f3f5e9a5688769ba1f1d101fb
content/51: 0c321044b21a59eec7b04f91d6ad521f
content/52: e98e73fb76f28bb6c2fbc2d1aaab21f8
content/51: 0440d7abaca1a48b2ce63b48c97444a1
content/52: 4cb6ac8a34a8cc0d87a85a45dd9382b9
content/53: 371d0e46b4bd2c23f559b8bc112f6955
content/54: f130069ac3fcde2a745a1cca5dbb54b5
content/54: df651aea48c483f6163ae49e4f1fda5a
content/55: bcadfc362b69078beee0088e5936c98b
content/56: d6ec19129a153bc0667e76edb9c2953d
content/57: ce48c0560ca3ddaad402f2bdd9d459f3
content/58: b6c9dbaa63995d6b3ee642321e1a9144
content/56: 90bd63383b8ba686aa71a192a945344a
content/57: 0c321044b21a59eec7b04f91d6ad521f
content/58: d8a0a8ae22b5c2a0664f1172adf2c1d1
content/59: 371d0e46b4bd2c23f559b8bc112f6955
content/60: 0eedad01ffe39ef19b5e6728aed5d2f4
content/60: fcef3a88d9de7bfa5e308e4cece9136e
content/61: bcadfc362b69078beee0088e5936c98b
content/62: 77916aef5f86264c96b85ab874c3c447
content/63: 85eba1d62b7cdd083d0a4991169d7162
content/64: d4dd284c2b688770d5c732a7e6dff3f0
content/62: d6ec19129a153bc0667e76edb9c2953d
content/63: ce48c0560ca3ddaad402f2bdd9d459f3
content/64: d96d5d108333391af5bc3ab6425c9f29
content/65: 371d0e46b4bd2c23f559b8bc112f6955
content/66: a76f4df74674266dabf365775e462623
content/66: be92911dda52b245d2fda5b0c54527dc
content/67: bcadfc362b69078beee0088e5936c98b
content/68: 3f6664c231057ceadd9ac8cba5332b3e
content/69: 4936debbcf6ba547fa7c9265f7dcf40f
content/70: 17a43ca41485e2f78ef7987c78a52e8b
content/68: 77916aef5f86264c96b85ab874c3c447
content/69: 85eba1d62b7cdd083d0a4991169d7162
content/70: d4dd284c2b688770d5c732a7e6dff3f0
content/71: 371d0e46b4bd2c23f559b8bc112f6955
content/72: b87a8359c3277447f29050ef280f4ceb
content/72: ad3910637d3e53fef449e8a5aa74b1ef
content/73: bcadfc362b69078beee0088e5936c98b
content/74: be30e8adfbab208f4b7b6fedc0559c19
content/75: 72de310caecaf16e8e74ff37a7fa46b0
content/76: 4738fdcfd44aa60f5bfd7f484be36360
content/74: 3f6664c231057ceadd9ac8cba5332b3e
content/75: 4936debbcf6ba547fa7c9265f7dcf40f
content/76: 17a43ca41485e2f78ef7987c78a52e8b
content/77: 371d0e46b4bd2c23f559b8bc112f6955
content/78: 3ff5cc143dcf2514e730b4f68757a6cb
content/78: b87a8359c3277447f29050ef280f4ceb
content/79: bcadfc362b69078beee0088e5936c98b
content/80: 08aaa5e1b8c8e8c146f68228e6d53792
content/81: a72a19e1aff8ea71d24df98f312d9ada
content/82: 0a0fecc6d1a70497410160ee0ea9e757
content/80: be30e8adfbab208f4b7b6fedc0559c19
content/81: 72de310caecaf16e8e74ff37a7fa46b0
content/82: 4738fdcfd44aa60f5bfd7f484be36360
content/83: 371d0e46b4bd2c23f559b8bc112f6955
content/84: d71b6bb8e2dd6ce98101aec6a1dd77f2
content/84: 3ff5cc143dcf2514e730b4f68757a6cb
content/85: bcadfc362b69078beee0088e5936c98b
content/86: 2e1b6ed9ba71ee98540f582bf5decd41
content/87: b3f310d5ef115bea5a8b75bf25d7ea9a
content/88: cbeffb4f92b38461ac320bc6fe7f7ef0
content/86: 08aaa5e1b8c8e8c146f68228e6d53792
content/87: a72a19e1aff8ea71d24df98f312d9ada
content/88: 0a0fecc6d1a70497410160ee0ea9e757
content/89: 371d0e46b4bd2c23f559b8bc112f6955
content/90: d71b6bb8e2dd6ce98101aec6a1dd77f2
content/91: bcadfc362b69078beee0088e5936c98b
content/92: 2e1b6ed9ba71ee98540f582bf5decd41
content/93: b37060e61c0433052dd02939aa60e412
content/94: c2184e718b1015489f82854fe48e6a37
content/95: 371d0e46b4bd2c23f559b8bc112f6955
content/96: 574cc410d9df4f37e7dc291491e13fe6
content/97: bcadfc362b69078beee0088e5936c98b
content/98: b06f1d576f491777f39a47401c77f268
content/99: 5070ca6b1d2cbd4f8450b15e8f46e446
content/100: 3edfc5e9d7138730bb73863616f3435e
content/101: 371d0e46b4bd2c23f559b8bc112f6955
content/102: 8d5f23e56e4606bacc7ac1f3b1cbe86b
content/103: bcadfc362b69078beee0088e5936c98b
content/104: 52f075cb7459e5cf8daf1f3e37ecd36b
content/105: 82c709054f9e80781baa7d678ff03b24
content/106: 5a38d9ff2a65641f8f13e91db263cc9e
content/107: 371d0e46b4bd2c23f559b8bc112f6955
content/108: 71b47f694d04e8f1a8fa22723539fe47
content/109: bcadfc362b69078beee0088e5936c98b
content/110: 45b9563e3bcc50f89b39b015a9d46114
content/111: b3f310d5ef115bea5a8b75bf25d7ea9a
content/112: cbeffb4f92b38461ac320bc6fe7f7ef0
d58d2e8b125a994bcfb20ff98cfef0ad:
meta/title: 4dd6404ecdca5a70a577f481171c67d6
meta/description: 13a0731523233bca340f1e28be2d11b3
@@ -48721,7 +48783,7 @@ checksums:
content/39: 671fd4e9cf20bbe08cfb3732c8b57f4c
content/40: 74f3efc50333dc5d828aa7ae69f5c4e5
content/41: 371d0e46b4bd2c23f559b8bc112f6955
content/42: bb049223fb68bf44717cee08a563f292
content/42: d2244dafd79365ced4a0df1a56975ad9
content/43: bcadfc362b69078beee0088e5936c98b
content/44: 4ff8530d52904479669c897bce94c95f
content/45: 7520d0a12665f8095be14087d2161e8c
@@ -48738,3 +48800,60 @@ checksums:
content/56: eafb7339fb5be61d3984c611d4a42e0d
content/57: b3f310d5ef115bea5a8b75bf25d7ea9a
content/58: 50d2e01e0d0b0baac560a1329e628da0
09ccda87bd3aa44885e6d15056cd082a:
meta/title: 373ed3498c87f799ef07ffde0ea1d265
meta/description: 36b55b049d6761b91eca1cfec3728d97
content/0: 1b031fb0c62c46b177aeed5c3d3f8f80
content/1: 7b05071991aa2683214ff01e1d237fd6
content/2: 53c416611cbf8a5e2941db4958d847b2
content/3: c19eedc77dfe7959c7a5cdba872d5dd4
content/4: 68a9557198da5e46a16662f9bb7c0626
content/5: 82324e9833120509db51c0630510b058
content/6: bb72f9bd5ed494daedbba52e987f83d1
content/7: 821e6394b0a953e2b0842b04ae8f3105
content/8: 76805f5755b94a715d3fc5b395a77a8e
content/9: 9c8aa3f09c9b2bd50ea4cdff3598ea4e
content/10: 62ce37c2502d7777328da5677584797c
content/11: 3d2e2a51ba0c5426194cb55d4da2e151
content/12: 371d0e46b4bd2c23f559b8bc112f6955
content/13: 2d6c6be43578df4f92ad9584ae55a3b8
content/14: bcadfc362b69078beee0088e5936c98b
content/15: 47970143e4e6c785fd685b2636389ca7
content/16: a36beec71cdd23691b51257f60b3c58c
content/17: ac772dcad079ad5f9ad2b06acb54fec7
content/18: 371d0e46b4bd2c23f559b8bc112f6955
content/19: 44d35b60f0d5b31205814c4c56b1dd3e
content/20: bcadfc362b69078beee0088e5936c98b
content/21: 74263e6c3dc857c8cb93a622936a8691
content/22: 8ac211bb1cb741500d13cf250594307c
content/23: 9aa42d507a938780e9a2fd414587f782
content/24: 371d0e46b4bd2c23f559b8bc112f6955
content/25: eb9977313568849d57fe90b91876bda6
content/26: bcadfc362b69078beee0088e5936c98b
content/27: 955a86ad4d727a003152069d2ee7812d
content/28: 1e4586fc956a22f40bcb150b194fd71d
content/29: 3585aca0b652b03d5676cdb90ca5853b
content/30: 371d0e46b4bd2c23f559b8bc112f6955
content/31: 0a8055f53c4c6a7c5a7531727b7c553d
content/32: bcadfc362b69078beee0088e5936c98b
content/33: 8a1edfff2dfbc40324b6aa1d273b6d61
content/34: 07785703ef06035c1beb02899a167233
content/35: bbeda043ea8bd727559a883885764a92
content/36: 371d0e46b4bd2c23f559b8bc112f6955
content/37: 1ad77742ffd96a0290d3966fd7f4da7c
content/38: bcadfc362b69078beee0088e5936c98b
content/39: b342b9fbd5b7f29ab635c8d84b310aee
content/40: c35d0fb34a4440d8059bb2b530abcb0b
content/41: da9a94744520cda2a28f21fee724cc76
content/42: 371d0e46b4bd2c23f559b8bc112f6955
content/43: e17e13843e3f670e50a84316e495fbbe
content/44: bcadfc362b69078beee0088e5936c98b
content/45: fdd2b073dd551d4550f3057bbc9b40c9
content/46: 4ca9fbd9a079b50e3720fcd493d6b1bd
content/47: 09fbc3004cceaec5af57e0daab0faab0
content/48: 371d0e46b4bd2c23f559b8bc112f6955
content/49: 64b7205c95437eea16e3998609a0e478
content/50: bcadfc362b69078beee0088e5936c98b
content/51: f23cc6d685827f8880df368d65c9ee88
content/52: b3f310d5ef115bea5a8b75bf25d7ea9a
content/53: dce0795eb6bcefcb20aa65529826adab

View File

@@ -2,9 +2,8 @@ import type { InferPageType } from 'fumadocs-core/source'
import type { source } from '@/lib/source'
export async function getLLMText(page: InferPageType<typeof source>) {
const processed = await page.data.getText('processed')
return `# ${page.data.title} (${page.url})
${page.data.description || ''}
${page.data.content || ''}`
${processed}`
}

View File

@@ -1,5 +1,5 @@
import { loader } from 'fumadocs-core/source'
import { docs } from '@/.source'
import { docs } from '@/.source/server'
import { i18n } from './i18n'
export const source = loader({

View File

@@ -16,10 +16,13 @@ const config = {
destination: '/introduction',
permanent: true,
},
]
},
async rewrites() {
return [
{
source: '/docs/:path*.mdx',
source: '/:path*.mdx',
destination: '/llms.mdx/:path*',
permanent: true,
},
]
},

View File

@@ -5,7 +5,7 @@
"license": "Apache-2.0",
"scripts": {
"dev": "next dev --port 3001",
"build": "NODE_OPTIONS='--max-old-space-size=8192' next build",
"build": "fumadocs-mdx && NODE_OPTIONS='--max-old-space-size=8192' next build",
"start": "next start",
"postinstall": "fumadocs-mdx",
"type-check": "tsc --noEmit"
@@ -14,14 +14,14 @@
"@tabler/icons-react": "^3.31.0",
"@vercel/og": "^0.6.5",
"clsx": "^2.1.1",
"fumadocs-core": "15.8.2",
"fumadocs-mdx": "11.10.1",
"fumadocs-ui": "15.8.2",
"fumadocs-core": "16.2.3",
"fumadocs-mdx": "14.1.0",
"fumadocs-ui": "16.2.3",
"lucide-react": "^0.511.0",
"next": "15.4.8",
"next": "16.0.7",
"next-themes": "^0.4.6",
"react": "19.1.0",
"react-dom": "19.1.0",
"react": "19.2.1",
"react-dom": "19.2.1",
"tailwind-merge": "^3.0.2"
},
"devDependencies": {

View File

@@ -4,9 +4,9 @@ import { type NextFetchEvent, type NextRequest, NextResponse } from 'next/server
import { i18n } from '@/lib/i18n'
const { rewrite: rewriteLLM } = rewritePath('/docs/*path', '/llms.mdx/*path')
const i18nMiddleware = createI18nMiddleware(i18n)
const i18nProxy = createI18nMiddleware(i18n)
export default function middleware(request: NextRequest, event: NextFetchEvent) {
export default function proxy(request: NextRequest, event: NextFetchEvent) {
if (isMarkdownPreferred(request)) {
const result = rewriteLLM(request.nextUrl.pathname)
@@ -15,7 +15,7 @@ export default function middleware(request: NextRequest, event: NextFetchEvent)
}
}
return i18nMiddleware(request, event)
return i18nProxy(request, event)
}
export const config = {

View File

@@ -2,6 +2,11 @@ import { defineConfig, defineDocs } from 'fumadocs-mdx/config'
export const docs = defineDocs({
dir: 'content/docs',
docs: {
postprocess: {
includeProcessedMarkdown: true,
},
},
})
export default defineConfig({

View File

@@ -13,10 +13,10 @@
"moduleResolution": "bundler",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve",
"jsx": "react-jsx",
"incremental": true,
"paths": {
"@/.source": ["./.source/index.ts"],
"@/.source/*": ["./.source/*"],
"@/*": ["./*"]
},
"plugins": [
@@ -31,7 +31,8 @@
"**/*.tsx",
".next/types/**/*.ts",
"content/docs/execution/index.mdx",
"content/docs/connections/index.mdx"
"content/docs/connections/index.mdx",
".next/dev/types/**/*.ts"
],
"exclude": ["node_modules"]
}

View File

@@ -24,3 +24,7 @@ API_ENCRYPTION_KEY=your_api_encryption_key # Use `openssl rand -hex 32` to gener
# OLLAMA_URL=http://localhost:11434 # URL for local Ollama server - uncomment if using local models
# VLLM_BASE_URL=http://localhost:8000 # Base URL for your self-hosted vLLM (OpenAI-compatible)
# VLLM_API_KEY= # Optional bearer token if your vLLM instance requires auth
# Admin API (Optional - for self-hosted GitOps)
# ADMIN_API_KEY= # Use `openssl rand -hex 32` to generate. Enables admin API for workflow export/import.
# Usage: curl -H "x-admin-key: your_key" https://your-instance/api/v1/admin/workspaces

View File

@@ -0,0 +1,40 @@
import { db } from '@sim/db'
import { account } from '@sim/db/schema'
import { and, eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { getSession } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
const logger = createLogger('AuthAccountsAPI')
export async function GET(request: NextRequest) {
try {
const session = await getSession()
if (!session?.user?.id) {
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
}
const { searchParams } = new URL(request.url)
const provider = searchParams.get('provider')
const whereConditions = [eq(account.userId, session.user.id)]
if (provider) {
whereConditions.push(eq(account.providerId, provider))
}
const accounts = await db
.select({
id: account.id,
accountId: account.accountId,
providerId: account.providerId,
})
.from(account)
.where(and(...whereConditions))
return NextResponse.json({ accounts })
} catch (error) {
logger.error('Failed to fetch accounts', { error })
return NextResponse.json({ error: 'Internal server error' }, { status: 500 })
}
}

View File

@@ -0,0 +1,150 @@
import { db } from '@sim/db'
import { settings } from '@sim/db/schema'
import { eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { auth } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
const logger = createLogger('CopilotAutoAllowedToolsAPI')
/**
* GET - Fetch user's auto-allowed integration tools
*/
export async function GET(request: NextRequest) {
try {
const session = await auth.api.getSession({ headers: request.headers })
if (!session?.user?.id) {
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
}
const userId = session.user.id
const [userSettings] = await db
.select()
.from(settings)
.where(eq(settings.userId, userId))
.limit(1)
if (userSettings) {
const autoAllowedTools = (userSettings.copilotAutoAllowedTools as string[]) || []
return NextResponse.json({ autoAllowedTools })
}
// If no settings record exists, create one with empty array
await db.insert(settings).values({
id: userId,
userId,
copilotAutoAllowedTools: [],
})
return NextResponse.json({ autoAllowedTools: [] })
} catch (error) {
logger.error('Failed to fetch auto-allowed tools', { error })
return NextResponse.json({ error: 'Internal server error' }, { status: 500 })
}
}
/**
* POST - Add a tool to the auto-allowed list
*/
export async function POST(request: NextRequest) {
try {
const session = await auth.api.getSession({ headers: request.headers })
if (!session?.user?.id) {
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
}
const userId = session.user.id
const body = await request.json()
if (!body.toolId || typeof body.toolId !== 'string') {
return NextResponse.json({ error: 'toolId must be a string' }, { status: 400 })
}
const toolId = body.toolId
// Get existing settings
const [existing] = await db.select().from(settings).where(eq(settings.userId, userId)).limit(1)
if (existing) {
const currentTools = (existing.copilotAutoAllowedTools as string[]) || []
// Add tool if not already present
if (!currentTools.includes(toolId)) {
const updatedTools = [...currentTools, toolId]
await db
.update(settings)
.set({
copilotAutoAllowedTools: updatedTools,
updatedAt: new Date(),
})
.where(eq(settings.userId, userId))
logger.info('Added tool to auto-allowed list', { userId, toolId })
return NextResponse.json({ success: true, autoAllowedTools: updatedTools })
}
return NextResponse.json({ success: true, autoAllowedTools: currentTools })
}
// Create new settings record with the tool
await db.insert(settings).values({
id: userId,
userId,
copilotAutoAllowedTools: [toolId],
})
logger.info('Created settings and added tool to auto-allowed list', { userId, toolId })
return NextResponse.json({ success: true, autoAllowedTools: [toolId] })
} catch (error) {
logger.error('Failed to add auto-allowed tool', { error })
return NextResponse.json({ error: 'Internal server error' }, { status: 500 })
}
}
/**
* DELETE - Remove a tool from the auto-allowed list
*/
export async function DELETE(request: NextRequest) {
try {
const session = await auth.api.getSession({ headers: request.headers })
if (!session?.user?.id) {
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
}
const userId = session.user.id
const { searchParams } = new URL(request.url)
const toolId = searchParams.get('toolId')
if (!toolId) {
return NextResponse.json({ error: 'toolId query parameter is required' }, { status: 400 })
}
// Get existing settings
const [existing] = await db.select().from(settings).where(eq(settings.userId, userId)).limit(1)
if (existing) {
const currentTools = (existing.copilotAutoAllowedTools as string[]) || []
const updatedTools = currentTools.filter((t) => t !== toolId)
await db
.update(settings)
.set({
copilotAutoAllowedTools: updatedTools,
updatedAt: new Date(),
})
.where(eq(settings.userId, userId))
logger.info('Removed tool from auto-allowed list', { userId, toolId })
return NextResponse.json({ success: true, autoAllowedTools: updatedTools })
}
return NextResponse.json({ success: true, autoAllowedTools: [] })
} catch (error) {
logger.error('Failed to remove auto-allowed tool', { error })
return NextResponse.json({ error: 'Internal server error' }, { status: 500 })
}
}

View File

@@ -1,634 +0,0 @@
/**
* Tests for copilot chat API route
*
* @vitest-environment node
*/
import { NextRequest } from 'next/server'
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
import {
createMockRequest,
mockAuth,
mockCryptoUuid,
setupCommonApiMocks,
} from '@/app/api/__test-utils__/utils'
describe('Copilot Chat API Route', () => {
const mockSelect = vi.fn()
const mockFrom = vi.fn()
const mockWhere = vi.fn()
const mockLimit = vi.fn()
const mockOrderBy = vi.fn()
const mockInsert = vi.fn()
const mockValues = vi.fn()
const mockReturning = vi.fn()
const mockUpdate = vi.fn()
const mockSet = vi.fn()
const mockExecuteProviderRequest = vi.fn()
const mockGetCopilotModel = vi.fn()
const mockGetRotatingApiKey = vi.fn()
beforeEach(() => {
vi.resetModules()
setupCommonApiMocks()
mockCryptoUuid()
mockSelect.mockReturnValue({ from: mockFrom })
mockFrom.mockReturnValue({ where: mockWhere })
mockWhere.mockReturnValue({
orderBy: mockOrderBy,
limit: mockLimit,
})
mockOrderBy.mockResolvedValue([])
mockLimit.mockResolvedValue([])
mockInsert.mockReturnValue({ values: mockValues })
mockValues.mockReturnValue({ returning: mockReturning })
mockUpdate.mockReturnValue({ set: mockSet })
mockSet.mockReturnValue({ where: mockWhere })
vi.doMock('@sim/db', () => ({
db: {
select: mockSelect,
insert: mockInsert,
update: mockUpdate,
},
}))
vi.doMock('@sim/db/schema', () => ({
copilotChats: {
id: 'id',
userId: 'userId',
messages: 'messages',
title: 'title',
model: 'model',
workflowId: 'workflowId',
createdAt: 'createdAt',
updatedAt: 'updatedAt',
},
}))
vi.doMock('drizzle-orm', () => ({
and: vi.fn((...conditions) => ({ conditions, type: 'and' })),
eq: vi.fn((field, value) => ({ field, value, type: 'eq' })),
desc: vi.fn((field) => ({ field, type: 'desc' })),
}))
mockGetCopilotModel.mockReturnValue({
provider: 'anthropic',
model: 'claude-3-haiku-20240307',
})
vi.doMock('@/lib/copilot/config', () => ({
getCopilotModel: mockGetCopilotModel,
}))
vi.doMock('@/lib/copilot/prompts', () => ({
TITLE_GENERATION_SYSTEM_PROMPT: 'Generate a title',
TITLE_GENERATION_USER_PROMPT: vi.fn((msg) => `Generate title for: ${msg}`),
}))
mockExecuteProviderRequest.mockResolvedValue({
content: 'Generated Title',
})
vi.doMock('@/providers', () => ({
executeProviderRequest: mockExecuteProviderRequest,
}))
mockGetRotatingApiKey.mockReturnValue('test-api-key')
vi.doMock('@/lib/core/config/api-keys', () => ({
getRotatingApiKey: mockGetRotatingApiKey,
}))
vi.doMock('@/lib/core/utils/request', () => ({
generateRequestId: vi.fn(() => 'test-request-id'),
}))
const mockEnvValues = {
SIM_AGENT_API_URL: 'http://localhost:8000',
COPILOT_API_KEY: 'test-sim-agent-key',
BETTER_AUTH_URL: 'http://localhost:3000',
NEXT_PUBLIC_APP_URL: 'http://localhost:3000',
NODE_ENV: 'test',
} as const
vi.doMock('@/lib/core/config/env', () => ({
env: mockEnvValues,
getEnv: (variable: string) => mockEnvValues[variable as keyof typeof mockEnvValues],
isTruthy: (value: string | boolean | number | undefined) =>
typeof value === 'string'
? value.toLowerCase() === 'true' || value === '1'
: Boolean(value),
isFalsy: (value: string | boolean | number | undefined) =>
typeof value === 'string'
? value.toLowerCase() === 'false' || value === '0'
: value === false,
}))
global.fetch = vi.fn()
})
afterEach(() => {
vi.clearAllMocks()
vi.restoreAllMocks()
})
describe('POST', () => {
it('should return 401 when user is not authenticated', async () => {
const authMocks = mockAuth()
authMocks.setUnauthenticated()
const req = createMockRequest('POST', {
message: 'Hello',
workflowId: 'workflow-123',
})
const { POST } = await import('@/app/api/copilot/chat/route')
const response = await POST(req)
expect(response.status).toBe(401)
const responseData = await response.json()
expect(responseData).toEqual({ error: 'Unauthorized' })
})
it('should return 400 for invalid request body', async () => {
const authMocks = mockAuth()
authMocks.setAuthenticated()
const req = createMockRequest('POST', {
// Missing required fields
})
const { POST } = await import('@/app/api/copilot/chat/route')
const response = await POST(req)
expect(response.status).toBe(400)
const responseData = await response.json()
expect(responseData.error).toBe('Invalid request data')
expect(responseData.details).toBeDefined()
})
it('should handle new chat creation and forward to sim agent', async () => {
const authMocks = mockAuth()
authMocks.setAuthenticated()
// Mock successful chat creation
const newChat = {
id: 'chat-123',
userId: 'user-123',
workflowId: 'workflow-123',
title: null,
model: 'claude-3-haiku-20240307',
messages: [],
}
mockReturning.mockResolvedValue([newChat])
// Mock successful sim agent response
const mockReadableStream = new ReadableStream({
start(controller) {
const encoder = new TextEncoder()
controller.enqueue(
encoder.encode('data: {"type": "assistant_message", "content": "Hello response"}\\n\\n')
)
controller.close()
},
})
;(global.fetch as any).mockResolvedValue({
ok: true,
body: mockReadableStream,
})
const req = createMockRequest('POST', {
message: 'Hello',
workflowId: 'workflow-123',
createNewChat: true,
stream: true,
})
const { POST } = await import('@/app/api/copilot/chat/route')
const response = await POST(req)
expect(response.status).toBe(200)
expect(mockInsert).toHaveBeenCalled()
expect(mockValues).toHaveBeenCalledWith({
userId: 'user-123',
workflowId: 'workflow-123',
title: null,
model: 'claude-3-haiku-20240307',
messages: [],
})
// Verify sim agent was called
expect(global.fetch).toHaveBeenCalledWith(
'http://localhost:8000/api/chat-completion-streaming',
expect.objectContaining({
method: 'POST',
headers: {
'Content-Type': 'application/json',
'x-api-key': 'test-sim-agent-key',
},
body: JSON.stringify({
message: 'Hello',
workflowId: 'workflow-123',
userId: 'user-123',
stream: true,
streamToolCalls: true,
model: 'claude-4.5-sonnet',
mode: 'agent',
messageId: 'mock-uuid-1234-5678',
version: '1.0.2',
chatId: 'chat-123',
}),
})
)
})
it('should load existing chat and include conversation history', async () => {
const authMocks = mockAuth()
authMocks.setAuthenticated()
// Mock existing chat with history
const existingChat = {
id: 'chat-123',
userId: 'user-123',
workflowId: 'workflow-123',
title: 'Existing Chat',
messages: [
{ role: 'user', content: 'Previous message' },
{ role: 'assistant', content: 'Previous response' },
],
}
// For POST route, the select query uses limit not orderBy
mockLimit.mockResolvedValue([existingChat])
// Mock sim agent response
const mockReadableStream = new ReadableStream({
start(controller) {
controller.close()
},
})
;(global.fetch as any).mockResolvedValue({
ok: true,
body: mockReadableStream,
})
const req = createMockRequest('POST', {
message: 'New message',
workflowId: 'workflow-123',
chatId: 'chat-123',
})
const { POST } = await import('@/app/api/copilot/chat/route')
const response = await POST(req)
expect(response.status).toBe(200)
// Verify conversation history was included
expect(global.fetch).toHaveBeenCalledWith(
'http://localhost:8000/api/chat-completion-streaming',
expect.objectContaining({
body: JSON.stringify({
message: 'New message',
workflowId: 'workflow-123',
userId: 'user-123',
stream: true,
streamToolCalls: true,
model: 'claude-4.5-sonnet',
mode: 'agent',
messageId: 'mock-uuid-1234-5678',
version: '1.0.2',
chatId: 'chat-123',
}),
})
)
})
it('should include implicit feedback in messages', async () => {
const authMocks = mockAuth()
authMocks.setAuthenticated()
const newChat = {
id: 'chat-123',
userId: 'user-123',
workflowId: 'workflow-123',
messages: [],
}
mockReturning.mockResolvedValue([newChat])
;(global.fetch as any).mockResolvedValue({
ok: true,
body: new ReadableStream({
start(controller) {
controller.close()
},
}),
})
const req = createMockRequest('POST', {
message: 'Hello',
workflowId: 'workflow-123',
createNewChat: true,
implicitFeedback: 'User seems confused about the workflow',
})
const { POST } = await import('@/app/api/copilot/chat/route')
await POST(req)
// Verify implicit feedback was included
expect(global.fetch).toHaveBeenCalledWith(
'http://localhost:8000/api/chat-completion-streaming',
expect.objectContaining({
body: JSON.stringify({
message: 'Hello',
workflowId: 'workflow-123',
userId: 'user-123',
stream: true,
streamToolCalls: true,
model: 'claude-4.5-sonnet',
mode: 'agent',
messageId: 'mock-uuid-1234-5678',
version: '1.0.2',
chatId: 'chat-123',
}),
})
)
})
it('should handle sim agent API errors', async () => {
const authMocks = mockAuth()
authMocks.setAuthenticated()
mockReturning.mockResolvedValue([{ id: 'chat-123', messages: [] }])
;(global.fetch as any).mockResolvedValue({
ok: false,
status: 500,
text: () => Promise.resolve('Internal server error'),
})
const req = createMockRequest('POST', {
message: 'Hello',
workflowId: 'workflow-123',
createNewChat: true,
})
const { POST } = await import('@/app/api/copilot/chat/route')
const response = await POST(req)
expect(response.status).toBe(500)
const responseData = await response.json()
expect(responseData.error).toContain('Sim agent API error')
})
it('should handle database errors during chat creation', async () => {
const authMocks = mockAuth()
authMocks.setAuthenticated()
// Mock database error
mockReturning.mockRejectedValue(new Error('Database connection failed'))
const req = createMockRequest('POST', {
message: 'Hello',
workflowId: 'workflow-123',
createNewChat: true,
})
const { POST } = await import('@/app/api/copilot/chat/route')
const response = await POST(req)
expect(response.status).toBe(500)
const responseData = await response.json()
expect(responseData.error).toBe('Database connection failed')
})
it('should use ask mode when specified', async () => {
const authMocks = mockAuth()
authMocks.setAuthenticated()
mockReturning.mockResolvedValue([{ id: 'chat-123', messages: [] }])
;(global.fetch as any).mockResolvedValue({
ok: true,
body: new ReadableStream({
start(controller) {
controller.close()
},
}),
})
const req = createMockRequest('POST', {
message: 'What is this workflow?',
workflowId: 'workflow-123',
createNewChat: true,
mode: 'ask',
})
const { POST } = await import('@/app/api/copilot/chat/route')
await POST(req)
expect(global.fetch).toHaveBeenCalledWith(
'http://localhost:8000/api/chat-completion-streaming',
expect.objectContaining({
body: JSON.stringify({
message: 'What is this workflow?',
workflowId: 'workflow-123',
userId: 'user-123',
stream: true,
streamToolCalls: true,
model: 'claude-4.5-sonnet',
mode: 'ask',
messageId: 'mock-uuid-1234-5678',
version: '1.0.2',
chatId: 'chat-123',
}),
})
)
})
})
describe('GET', () => {
it('should return 401 when user is not authenticated', async () => {
const authMocks = mockAuth()
authMocks.setUnauthenticated()
const req = new NextRequest('http://localhost:3000/api/copilot/chat?workflowId=workflow-123')
const { GET } = await import('@/app/api/copilot/chat/route')
const response = await GET(req)
expect(response.status).toBe(401)
const responseData = await response.json()
expect(responseData).toEqual({ error: 'Unauthorized' })
})
it('should return 400 when workflowId is missing', async () => {
const authMocks = mockAuth()
authMocks.setAuthenticated()
const req = new NextRequest('http://localhost:3000/api/copilot/chat')
const { GET } = await import('@/app/api/copilot/chat/route')
const response = await GET(req)
expect(response.status).toBe(400)
const responseData = await response.json()
expect(responseData.error).toBe('workflowId is required')
})
it('should return chats for authenticated user and workflow', async () => {
const authMocks = mockAuth()
authMocks.setAuthenticated()
// Mock database response (what comes from DB)
const mockDbChats = [
{
id: 'chat-1',
title: 'First Chat',
model: 'claude-3-haiku-20240307',
messages: [
{ role: 'user', content: 'Message 1' },
{ role: 'assistant', content: 'Response 1' },
{ role: 'user', content: 'Message 2' },
{ role: 'assistant', content: 'Response 2' },
],
createdAt: new Date('2024-01-01'),
updatedAt: new Date('2024-01-02'),
},
{
id: 'chat-2',
title: 'Second Chat',
model: 'claude-3-haiku-20240307',
messages: [
{ role: 'user', content: 'Message 1' },
{ role: 'assistant', content: 'Response 1' },
],
createdAt: new Date('2024-01-03'),
updatedAt: new Date('2024-01-04'),
},
]
// Expected transformed response (what the route returns)
const expectedChats = [
{
id: 'chat-1',
title: 'First Chat',
model: 'claude-3-haiku-20240307',
messages: [
{ role: 'user', content: 'Message 1' },
{ role: 'assistant', content: 'Response 1' },
{ role: 'user', content: 'Message 2' },
{ role: 'assistant', content: 'Response 2' },
],
messageCount: 4,
previewYaml: null,
createdAt: new Date('2024-01-01'),
updatedAt: new Date('2024-01-02'),
},
{
id: 'chat-2',
title: 'Second Chat',
model: 'claude-3-haiku-20240307',
messages: [
{ role: 'user', content: 'Message 1' },
{ role: 'assistant', content: 'Response 1' },
],
messageCount: 2,
previewYaml: null,
createdAt: new Date('2024-01-03'),
updatedAt: new Date('2024-01-04'),
},
]
mockOrderBy.mockResolvedValue(mockDbChats)
const req = new NextRequest('http://localhost:3000/api/copilot/chat?workflowId=workflow-123')
const { GET } = await import('@/app/api/copilot/chat/route')
const response = await GET(req)
expect(response.status).toBe(200)
const responseData = await response.json()
expect(responseData).toEqual({
success: true,
chats: [
{
id: 'chat-1',
title: 'First Chat',
model: 'claude-3-haiku-20240307',
messages: [
{ role: 'user', content: 'Message 1' },
{ role: 'assistant', content: 'Response 1' },
{ role: 'user', content: 'Message 2' },
{ role: 'assistant', content: 'Response 2' },
],
messageCount: 4,
previewYaml: null,
config: null,
planArtifact: null,
createdAt: '2024-01-01T00:00:00.000Z',
updatedAt: '2024-01-02T00:00:00.000Z',
},
{
id: 'chat-2',
title: 'Second Chat',
model: 'claude-3-haiku-20240307',
messages: [
{ role: 'user', content: 'Message 1' },
{ role: 'assistant', content: 'Response 1' },
],
messageCount: 2,
previewYaml: null,
config: null,
planArtifact: null,
createdAt: '2024-01-03T00:00:00.000Z',
updatedAt: '2024-01-04T00:00:00.000Z',
},
],
})
// Verify database query was made correctly
expect(mockSelect).toHaveBeenCalled()
expect(mockWhere).toHaveBeenCalled()
expect(mockOrderBy).toHaveBeenCalled()
})
it('should handle database errors when fetching chats', async () => {
const authMocks = mockAuth()
authMocks.setAuthenticated()
// Mock database error
mockOrderBy.mockRejectedValue(new Error('Database query failed'))
const req = new NextRequest('http://localhost:3000/api/copilot/chat?workflowId=workflow-123')
const { GET } = await import('@/app/api/copilot/chat/route')
const response = await GET(req)
expect(response.status).toBe(500)
const responseData = await response.json()
expect(responseData.error).toBe('Failed to fetch chats')
})
it('should return empty array when no chats found', async () => {
const authMocks = mockAuth()
authMocks.setAuthenticated()
mockOrderBy.mockResolvedValue([])
const req = new NextRequest('http://localhost:3000/api/copilot/chat?workflowId=workflow-123')
const { GET } = await import('@/app/api/copilot/chat/route')
const response = await GET(req)
expect(response.status).toBe(200)
const responseData = await response.json()
expect(responseData).toEqual({
success: true,
chats: [],
})
})
})
})

View File

@@ -14,11 +14,13 @@ import {
createRequestTracker,
createUnauthorizedResponse,
} from '@/lib/copilot/request-helpers'
import { getCredentialsServerTool } from '@/lib/copilot/tools/server/user/get-credentials'
import type { CopilotProviderConfig } from '@/lib/copilot/types'
import { env } from '@/lib/core/config/env'
import { createLogger } from '@/lib/logs/console/logger'
import { CopilotFiles } from '@/lib/uploads'
import { createFileContent } from '@/lib/uploads/utils/file-utils'
import { tools } from '@/tools/registry'
const logger = createLogger('CopilotChatAPI')
@@ -57,9 +59,10 @@ const ChatMessageSchema = z.object({
'claude-4.5-sonnet',
'claude-4.5-opus',
'claude-4.1-opus',
'gemini-3-pro',
])
.optional()
.default('claude-4.5-sonnet'),
.default('claude-4.5-opus'),
mode: z.enum(['ask', 'agent', 'plan']).optional().default('agent'),
prefetch: z.boolean().optional(),
createNewChat: z.boolean().optional().default(false),
@@ -313,6 +316,119 @@ export async function POST(req: NextRequest) {
const effectiveConversationId =
(currentChat?.conversationId as string | undefined) || conversationId
// For agent/build mode, fetch credentials and build tool definitions
let integrationTools: any[] = []
let baseTools: any[] = []
let credentials: {
oauth: Record<
string,
{ accessToken: string; accountId: string; name: string; expiresAt?: string }
>
apiKeys: string[]
metadata?: {
connectedOAuth: Array<{ provider: string; name: string; scopes?: string[] }>
configuredApiKeys: string[]
}
} | null = null
if (mode === 'agent') {
// Build base tools (executed locally, not deferred)
// Include function_execute for code execution capability
baseTools = [
{
name: 'function_execute',
description:
'Execute JavaScript code to perform calculations, data transformations, API calls, or any programmatic task. Code runs in a secure sandbox with fetch() available. Write plain statements (not wrapped in functions). Example: const res = await fetch(url); const data = await res.json(); return data;',
input_schema: {
type: 'object',
properties: {
code: {
type: 'string',
description:
'Raw JavaScript statements to execute. Code is auto-wrapped in async context. Use fetch() for HTTP requests. Write like: const res = await fetch(url); return await res.json();',
},
},
required: ['code'],
},
executeLocally: true,
},
]
// Fetch user credentials (OAuth + API keys)
try {
const rawCredentials = await getCredentialsServerTool.execute(
{},
{ userId: authenticatedUserId }
)
// Transform OAuth credentials to map format: { [provider]: { accessToken, accountId, ... } }
const oauthMap: Record<
string,
{ accessToken: string; accountId: string; name: string; expiresAt?: string }
> = {}
const connectedOAuth: Array<{ provider: string; name: string; scopes?: string[] }> = []
for (const cred of rawCredentials?.oauth?.connected?.credentials || []) {
if (cred.accessToken) {
oauthMap[cred.provider] = {
accessToken: cred.accessToken,
accountId: cred.id,
name: cred.name,
}
connectedOAuth.push({
provider: cred.provider,
name: cred.name,
})
}
}
credentials = {
oauth: oauthMap,
apiKeys: rawCredentials?.environment?.variableNames || [],
metadata: {
connectedOAuth,
configuredApiKeys: rawCredentials?.environment?.variableNames || [],
},
}
logger.info(`[${tracker.requestId}] Fetched credentials for build mode`, {
oauthProviders: Object.keys(oauthMap),
apiKeyCount: credentials.apiKeys.length,
})
} catch (error) {
logger.warn(`[${tracker.requestId}] Failed to fetch credentials`, {
error: error instanceof Error ? error.message : String(error),
})
}
// Build tool definitions (schemas only)
try {
const { createUserToolSchema } = await import('@/tools/params')
integrationTools = Object.entries(tools).map(([toolId, toolConfig]) => {
const userSchema = createUserToolSchema(toolConfig)
return {
name: toolId,
description: toolConfig.description || toolConfig.name || toolId,
input_schema: userSchema,
defer_loading: true, // Anthropic Advanced Tool Use
...(toolConfig.oauth?.required && {
oauth: {
required: true,
provider: toolConfig.oauth.provider,
},
}),
}
})
logger.info(`[${tracker.requestId}] Built tool definitions for build mode`, {
integrationToolCount: integrationTools.length,
})
} catch (error) {
logger.warn(`[${tracker.requestId}] Failed to build tool definitions`, {
error: error instanceof Error ? error.message : String(error),
})
}
}
const requestPayload = {
message: message, // Just send the current user message text
workflowId,
@@ -330,6 +446,10 @@ export async function POST(req: NextRequest) {
...(agentContexts.length > 0 && { context: agentContexts }),
...(actualChatId ? { chatId: actualChatId } : {}),
...(processedFileContents.length > 0 && { fileAttachments: processedFileContents }),
// For build/agent mode, include tools and credentials
...(integrationTools.length > 0 && { tools: integrationTools }),
...(baseTools.length > 0 && { baseTools }),
...(credentials && { credentials }),
}
try {
@@ -339,6 +459,12 @@ export async function POST(req: NextRequest) {
hasConversationId: !!effectiveConversationId,
hasFileAttachments: processedFileContents.length > 0,
messageLength: message.length,
mode,
hasTools: integrationTools.length > 0,
toolCount: integrationTools.length,
hasBaseTools: baseTools.length > 0,
baseToolCount: baseTools.length,
hasCredentials: !!credentials,
})
} catch {}

View File

@@ -0,0 +1,275 @@
import { db } from '@sim/db'
import { account, workflow } from '@sim/db/schema'
import { and, eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod'
import { getSession } from '@/lib/auth'
import {
createBadRequestResponse,
createInternalServerErrorResponse,
createRequestTracker,
createUnauthorizedResponse,
} from '@/lib/copilot/request-helpers'
import { generateRequestId } from '@/lib/core/utils/request'
import { getEffectiveDecryptedEnv } from '@/lib/environment/utils'
import { createLogger } from '@/lib/logs/console/logger'
import { refreshTokenIfNeeded } from '@/app/api/auth/oauth/utils'
import { executeTool } from '@/tools'
import { getTool } from '@/tools/utils'
const logger = createLogger('CopilotExecuteToolAPI')
const ExecuteToolSchema = z.object({
toolCallId: z.string(),
toolName: z.string(),
arguments: z.record(z.any()).optional().default({}),
workflowId: z.string().optional(),
})
/**
* Resolves all {{ENV_VAR}} references in a value recursively
* Works with strings, arrays, and objects
*/
function resolveEnvVarReferences(value: any, envVars: Record<string, string>): any {
if (typeof value === 'string') {
// Check for exact match: entire string is "{{VAR_NAME}}"
const exactMatch = /^\{\{([^}]+)\}\}$/.exec(value)
if (exactMatch) {
const envVarName = exactMatch[1].trim()
return envVars[envVarName] ?? value
}
// Check for embedded references: "prefix {{VAR}} suffix"
return value.replace(/\{\{([^}]+)\}\}/g, (match, varName) => {
const trimmedName = varName.trim()
return envVars[trimmedName] ?? match
})
}
if (Array.isArray(value)) {
return value.map((item) => resolveEnvVarReferences(item, envVars))
}
if (value !== null && typeof value === 'object') {
const resolved: Record<string, any> = {}
for (const [key, val] of Object.entries(value)) {
resolved[key] = resolveEnvVarReferences(val, envVars)
}
return resolved
}
return value
}
export async function POST(req: NextRequest) {
const tracker = createRequestTracker()
try {
const session = await getSession()
if (!session?.user?.id) {
return createUnauthorizedResponse()
}
const userId = session.user.id
const body = await req.json()
try {
const preview = JSON.stringify(body).slice(0, 300)
logger.debug(`[${tracker.requestId}] Incoming execute-tool request`, { preview })
} catch {}
const { toolCallId, toolName, arguments: toolArgs, workflowId } = ExecuteToolSchema.parse(body)
logger.info(`[${tracker.requestId}] Executing tool`, {
toolCallId,
toolName,
workflowId,
hasArgs: Object.keys(toolArgs).length > 0,
})
// Get tool config from registry
const toolConfig = getTool(toolName)
if (!toolConfig) {
// Find similar tool names to help debug
const { tools: allTools } = await import('@/tools/registry')
const allToolNames = Object.keys(allTools)
const prefix = toolName.split('_').slice(0, 2).join('_')
const similarTools = allToolNames
.filter((name) => name.startsWith(`${prefix.split('_')[0]}_`))
.slice(0, 10)
logger.warn(`[${tracker.requestId}] Tool not found in registry`, {
toolName,
prefix,
similarTools,
totalToolsInRegistry: allToolNames.length,
})
return NextResponse.json(
{
success: false,
error: `Tool not found: ${toolName}. Similar tools: ${similarTools.join(', ')}`,
toolCallId,
},
{ status: 404 }
)
}
// Get the workspaceId from the workflow (env vars are stored at workspace level)
let workspaceId: string | undefined
if (workflowId) {
const workflowResult = await db
.select({ workspaceId: workflow.workspaceId })
.from(workflow)
.where(eq(workflow.id, workflowId))
.limit(1)
workspaceId = workflowResult[0]?.workspaceId ?? undefined
}
// Get decrypted environment variables early so we can resolve all {{VAR}} references
const decryptedEnvVars = await getEffectiveDecryptedEnv(userId, workspaceId)
logger.info(`[${tracker.requestId}] Fetched environment variables`, {
workflowId,
workspaceId,
envVarCount: Object.keys(decryptedEnvVars).length,
envVarKeys: Object.keys(decryptedEnvVars),
})
// Build execution params starting with LLM-provided arguments
// Resolve all {{ENV_VAR}} references in the arguments
const executionParams: Record<string, any> = resolveEnvVarReferences(toolArgs, decryptedEnvVars)
logger.info(`[${tracker.requestId}] Resolved env var references in arguments`, {
toolName,
originalArgKeys: Object.keys(toolArgs),
resolvedArgKeys: Object.keys(executionParams),
})
// Resolve OAuth access token if required
if (toolConfig.oauth?.required && toolConfig.oauth.provider) {
const provider = toolConfig.oauth.provider
logger.info(`[${tracker.requestId}] Resolving OAuth token`, { provider })
try {
// Find the account for this provider and user
const accounts = await db
.select()
.from(account)
.where(and(eq(account.providerId, provider), eq(account.userId, userId)))
.limit(1)
if (accounts.length > 0) {
const acc = accounts[0]
const requestId = generateRequestId()
const { accessToken } = await refreshTokenIfNeeded(requestId, acc as any, acc.id)
if (accessToken) {
executionParams.accessToken = accessToken
logger.info(`[${tracker.requestId}] OAuth token resolved`, { provider })
} else {
logger.warn(`[${tracker.requestId}] No access token available`, { provider })
return NextResponse.json(
{
success: false,
error: `OAuth token not available for ${provider}. Please reconnect your account.`,
toolCallId,
},
{ status: 400 }
)
}
} else {
logger.warn(`[${tracker.requestId}] No account found for provider`, { provider })
return NextResponse.json(
{
success: false,
error: `No ${provider} account connected. Please connect your account first.`,
toolCallId,
},
{ status: 400 }
)
}
} catch (error) {
logger.error(`[${tracker.requestId}] Failed to resolve OAuth token`, {
provider,
error: error instanceof Error ? error.message : String(error),
})
return NextResponse.json(
{
success: false,
error: `Failed to get OAuth token for ${provider}`,
toolCallId,
},
{ status: 500 }
)
}
}
// Check if tool requires an API key that wasn't resolved via {{ENV_VAR}} reference
const needsApiKey = toolConfig.params?.apiKey?.required
if (needsApiKey && !executionParams.apiKey) {
logger.warn(`[${tracker.requestId}] No API key found for tool`, { toolName })
return NextResponse.json(
{
success: false,
error: `API key not provided for ${toolName}. Use {{YOUR_API_KEY_ENV_VAR}} to reference your environment variable.`,
toolCallId,
},
{ status: 400 }
)
}
// Add execution context
executionParams._context = {
workflowId,
userId,
}
// Special handling for function_execute - inject environment variables
if (toolName === 'function_execute') {
executionParams.envVars = decryptedEnvVars
executionParams.workflowVariables = {} // No workflow variables in copilot context
executionParams.blockData = {} // No block data in copilot context
executionParams.blockNameMapping = {} // No block mapping in copilot context
executionParams.language = executionParams.language || 'javascript'
executionParams.timeout = executionParams.timeout || 30000
logger.info(`[${tracker.requestId}] Injected env vars for function_execute`, {
envVarCount: Object.keys(decryptedEnvVars).length,
})
}
// Execute the tool
logger.info(`[${tracker.requestId}] Executing tool with resolved credentials`, {
toolName,
hasAccessToken: !!executionParams.accessToken,
hasApiKey: !!executionParams.apiKey,
})
const result = await executeTool(toolName, executionParams, true)
logger.info(`[${tracker.requestId}] Tool execution complete`, {
toolName,
success: result.success,
hasOutput: !!result.output,
})
return NextResponse.json({
success: true,
toolCallId,
result: {
success: result.success,
output: result.output,
error: result.error,
},
})
} catch (error) {
if (error instanceof z.ZodError) {
logger.debug(`[${tracker.requestId}] Zod validation error`, { issues: error.issues })
return createBadRequestResponse('Invalid request body for execute-tool')
}
logger.error(`[${tracker.requestId}] Failed to execute tool:`, error)
const errorMessage = error instanceof Error ? error.message : 'Failed to execute tool'
return createInternalServerErrorResponse(errorMessage)
}
}

View File

@@ -26,6 +26,7 @@ const DEFAULT_ENABLED_MODELS: Record<string, boolean> = {
'claude-4.5-sonnet': true,
'claude-4.5-opus': true,
// 'claude-4.1-opus': true,
'gemini-3-pro': true,
}
// GET - Fetch user's enabled models

View File

@@ -14,13 +14,9 @@ export const dynamic = 'force-dynamic'
/**
* POST - Refresh an MCP server connection (requires any workspace permission)
*/
export const POST = withMcpAuth('read')(
async (
request: NextRequest,
{ userId, workspaceId, requestId },
{ params }: { params: { id: string } }
) => {
const serverId = params.id
export const POST = withMcpAuth<{ id: string }>('read')(
async (request: NextRequest, { userId, workspaceId, requestId }, { params }) => {
const { id: serverId } = await params
try {
logger.info(

View File

@@ -15,13 +15,9 @@ export const dynamic = 'force-dynamic'
/**
* PATCH - Update an MCP server in the workspace (requires write or admin permission)
*/
export const PATCH = withMcpAuth('write')(
async (
request: NextRequest,
{ userId, workspaceId, requestId },
{ params }: { params: { id: string } }
) => {
const serverId = params.id
export const PATCH = withMcpAuth<{ id: string }>('write')(
async (request: NextRequest, { userId, workspaceId, requestId }, { params }) => {
const { id: serverId } = await params
try {
const body = getParsedBody(request) || (await request.json())

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