Compare commits

...

119 Commits
v0.5 ... v0.5.9

Author SHA1 Message Date
Waleed
842ef27ed9 v0.5.9: add backwards compatibility for agent messages array 2025-11-20 11:19:42 -08:00
Waleed
f208ff9356 fix(agent): add backwards compat for agent messages array (#2076)
* fix(agent): add backwards compat for agent messages array

* add tests
2025-11-20 11:16:06 -08:00
Vikhyath Mondreti
31c34b2ea3 v0.5.8: notifications, billing, ui changes, store loading state machine 2025-11-20 01:32:32 -08:00
Vikhyath Mondreti
304cafe698 improvement(linear): cleanup linear checks (#2075) 2025-11-20 01:32:01 -08:00
Vikhyath Mondreti
472aff5dd7 fix(resolver): json/array field parsing (#2074)
* fix(resolver): json/array field parsing

* remove comment
2025-11-20 00:27:12 -08:00
Waleed
4d5c574363 fix(stt): add fallback for ffmpeg (#2073) 2025-11-19 21:49:12 -08:00
Waleed
e7d4afa46b feat(i18n): update translations (#2071)
Co-authored-by: waleedlatif1 <waleedlatif1@users.noreply.github.com>
2025-11-19 21:21:52 -08:00
Waleed
f570592ad7 fix(linear): update required fields (#2070) 2025-11-19 21:17:37 -08:00
Waleed
e64b1c9fcd feat(tools): added speech to text with openai whisper, elevenlabs, and deepgram (#2068)
* feat(tools): added speech to text with openai whisper, elevenlabs, and deepgram

* added new file icons, implemented ffmpeg

* updated docs

* revert environment
2025-11-19 21:03:54 -08:00
Waleed
7c5d625ca5 fix(blogs): update sitemap and fix loading strat on blogs to prevent mobile crash (#2067)
* fix(blogs): update sitemap and fix loading strat on blogs to prevent mobile crash

* updated sitemap
2025-11-19 19:58:26 -08:00
Vikhyath Mondreti
e5cb6e3d0f improvement(store-hydration): refactor loading state tracking for workflows (#2065)
* improvement(store-hydration): refactor loading state tracking for workflows

* fix type issue

* fix

* fix deploy modal reference

* sidebar

* new panel

* reset stores
2025-11-19 19:10:43 -08:00
Waleed
e4ccedc4ff fix(tools): added stricter aura host db validation check for neo4j tool (#2066) 2025-11-19 18:44:33 -08:00
Emir Karabeg
d9cb63ce5f feat(chat): add 'add inputs' button to chat window (#2057)
* improvement(ui): workflow-block border

* feat(chat): add inputs button

* added socket event, reused existing utils to persist chat inputs

---------

Co-authored-by: waleed <walif6@gmail.com>
2025-11-19 18:12:03 -08:00
Waleed
3468593f84 feat(i18n): update translations (#2064)
Co-authored-by: waleedlatif1 <waleedlatif1@users.noreply.github.com>
2025-11-19 18:01:52 -08:00
Waleed
95d5fd9c35 feat(i18n): update translations (#2062)
Co-authored-by: waleedlatif1 <waleedlatif1@users.noreply.github.com>
2025-11-19 17:44:42 -08:00
Waleed
becd19bc50 improvement(ux): added tab key navigation for agent messages, made variables styling match chat, added neo4j and calendly (#2056)
* improvement(ux): added tab key navigation for agent messages, made variables styling match chat

* added neo4j tools, added calendly tools and triggers

* more style improvements

* consolidate wand generation type

* more ui improvements

* fix calendly

* tested all neo4j tools

* added fuzzy search for search modal, tested and fixed calendly

* updated docs

* fix various broken docs links, neo4j param validation

* removed limit from neo4j block
2025-11-19 17:40:20 -08:00
Travis Johnson
c93f6620f6 improvement(tools): add eleven_v3 to elevenlabs block (#2053) 2025-11-19 17:39:17 -08:00
Adam Gough
3647a3e38c improvement(tools): added add worksheet to excel block (#2061)
Co-authored-by: aadamgough <adam@sim.ai>
2025-11-19 17:34:45 -08:00
Vikhyath Mondreti
f609b6ea4a fix(z-index): deployment versions rename + view active popover (#2059) 2025-11-19 16:42:09 -08:00
Vikhyath Mondreti
2be3007d69 fix(mcp-preview): server and tool name fetch to use tanstack (#2058)
* fix(mcp-preview): server and tool name fetch to use tanstack

* remove comments

* fix mcp tool interface

* change incorrect reference

* fix

* remove comments
2025-11-19 16:22:17 -08:00
Waleed
570b8d61f0 improvement(runners): added blacksmith optimizations to workflows and dockerfiles to enhance performance (#2055)
* added blacksmith optimizations to workflows and dockerfiles to enhance performance. please review before pushing to production

* remove cache from and cache to directives from docker based actions, per blacksmith docs

---------

Co-authored-by: Connor Mulholland <connormul@Connors-MacBook-Pro.local>
2025-11-19 13:07:03 -08:00
Waleed
7045c4a47b fix(dialogs): standardized delete modals (#2049)
* standardized delete modals

* fix

* fix(ui): live usage indicator, child trace spans, cancel subscription modal z-index (#2044)

* cleanup

* show trace spans for child blocks that error

* fix z index for cancel subscription popup

* rotating digit live usage indicator

* fix

* remove unused code

* fix type

* fix(billing): fix team upgrade

* fix

* fix tests

---------

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

* remove unused barrel exports

* remove unused components

---------

Co-authored-by: Vikhyath Mondreti <vikhyathvikku@gmail.com>
2025-11-18 21:17:06 -08:00
Vikhyath Mondreti
5e11e5df91 fix(ui): live usage indicator, child trace spans, cancel subscription modal z-index (#2044)
* cleanup

* show trace spans for child blocks that error

* fix z index for cancel subscription popup

* rotating digit live usage indicator

* fix

* remove unused code

* fix type

* fix(billing): fix team upgrade

* fix

* fix tests

---------

Co-authored-by: waleed <walif6@gmail.com>
2025-11-18 20:21:16 -08:00
Waleed
2608f2f12c fix(copiolot-ui): fix code markdown rendering in copilot & table (#2048) 2025-11-18 18:06:18 -08:00
Waleed
96207d85a7 fix(subflows): add loops/parallels to accessible list of blocks in the tag dropdown when contained withitn a subflow (#2047)
* fix(subflows): add loops/parallels to accessible list of blocks in the tag dropdown when contained withitn a subflow

* remove currentIteration in loop
2025-11-18 17:24:30 -08:00
Waleed
a7fe1d3aea fix(models): remove unrelease oai models, fix help modal (#2046) 2025-11-18 17:08:47 -08:00
Waleed
3faab2cb01 improvement(notifications): add option to disable error notifications, remove deprecated autoFillEnvVars field (#2045) 2025-11-18 16:28:59 -08:00
Emir Karabeg
02d9fedf0c feat(agent): messages array, memory (#2023)
* feat(agent): messages array, memory options

* feat(messages-input): re-order messages

* backend for new memory setup, backwards compatibility in loadWorkflowsFromNormalizedTable from old agent block to new format

* added memories all conversation sliding token window, standardized modals

* lint

* fix build

* reorder popover for output selector for chat

* add internal auth, finish memories

* fix rebase

* fix failing test

---------

Co-authored-by: waleed <walif6@gmail.com>
2025-11-18 15:58:10 -08:00
Waleed
a8a693f1ff fix(deploy): add sockets op for renaming blocks (#2043)
* fix(deploy): add sockets op for renaming blocks

* remove old unused helpers
2025-11-18 15:57:49 -08:00
Emir Karabeg
e0aade85a6 feat: notification store (#2025)
* feat: notification store

* feat: notification stack; improvement: chat output select
2025-11-18 10:43:24 -08:00
Vikhyath Mondreti
8f0ef58056 v0.5.7: combobox selectors, usage indicator, workflow loading race condition, other improvements 2025-11-17 21:25:51 -08:00
Vikhyath Mondreti
33ca1483aa Merge branch 'main' into staging 2025-11-17 21:21:30 -08:00
Vikhyath Mondreti
620ce97056 improvement(selectors): consolidate all integration selectors to use the combobox (#2020)
* improvement(selectors): consolidate all integration selectors to use the combobox

* improved credential selector and file-upload styling to use emcn combobox

* update mcp subblocks to use emcn components, delete unused mcp server modal

* fix filterOptions change

* fix project selector

* attempted jira fix

* fix gdrive inf calls

* rewrite credential selector

* fix docs

* fix onedrive folder

* fix

* fix

* fix excel cred fetch

* fix excel part 2

---------

Co-authored-by: waleed <walif6@gmail.com>
2025-11-17 21:06:52 -08:00
Vikhyath Mondreti
25ac91779b fix(workflow-block): clearing child workflow input format field must lazy cascade parent workflow state deletion (#2038) 2025-11-17 19:00:50 -08:00
Waleed
d51a756c1b improvement(docs): remove copy page from mobile view on docs (#2037)
* improvement(docs): remove copy page from mobile view on docs

* bring title and pagenav lower on mobile

* added cursor pointer to clickable components in docs
2025-11-17 18:10:52 -08:00
Waleed
3d1feab507 improvement(undo-redo): expand undo-redo store to store 100 ops instead of 15 (#2036)
* improvement(undo-redo): expand undo-redo store to store 100 ops instead of 15

* prevent undo-redo from interfering with subblock browser text undo
2025-11-17 18:00:12 -08:00
Vikhyath Mondreti
98908dbfb9 fix(triggers): dedup + not surfacing deployment status log (#2033)
* fix(triggers): dedup + not surfacing deployment status log

* fix ms teams

* change to microsoftteams

* Revert "change to microsoftteams"

This reverts commit 217f808641.

* fix

* fix

* fix provider name

* fix oauth for msteams
2025-11-17 17:48:22 -08:00
Waleed
00d9b45a22 fix(workflows): fixed workflow loading in without start block, added templates RQ hook, cleaned up unused templates code (#2035) 2025-11-17 17:31:01 -08:00
Waleed
b5b2855b40 fix(overage): fix pill calculation in the usage indicator to be consistent across views (#2034) 2025-11-17 16:22:24 -08:00
Waleed
a81f3847df fix(usage-data): refetch on usage limit update in settings (#2032) 2025-11-17 15:07:52 -08:00
Waleed
3058e35edf v0.5.6: executor fixes, UI improvements, run paths (#2028)
* test(pr): hackathon (#1999)

* test(pr): github trigger (#2000)

* fix(usage-indicator): conditional rendering, upgrade, and ui/ux (#2001)

* fix: usage-limit indicator and render conditonally on is billing enabled

* fix: upgrade render

* fix(notes): fix notes, tighten spacing, update deprecated zustand function, update use mention data to ignore block positon (#2002)

* fix(pdfs): use unpdf instead of pdf-parse (#2004)

* fix(modals): fix z-index for various modals and output selector and variables (#2005)

* fix(condition): treat condition input the same as the code subblock (#2006)

* feat(models): added gpt-5.1 (#2007)

* improvement: runpath edges, blocks, active (#2008)

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

* fix(triggers): check triggermode and consolidate block type (#2011)

* fix(triggers): disabled trigger shouldn't be added to dag (#2012)

* Fix disabled blocks

* Comments

* Fix api/chat trigger not found message

* fix(tags): only show start block upstream if is ancestor (#2013)

* fix(variables): Fix resolution on double < (#2016)

* Fix variable <>

* Ling

* Clean

* feat(billing): add notif for first failed payment, added upgrade email from free, updated providers that supported granular tool control to support them, fixed envvar popover, fixed redirect to wrong workspace after oauth connect (#2015)

* feat(billing): add notif for first failed payment, added upgrade email from free, updated providers that supported granular tool control to support them, fixed envvar popover, fixed redirect to wrong workspace after oauth connect

* fix build

* ack PR comments

* feat(performance): added reactquery hooks for workflow operations, for logs, fixed logs reloading, fix subscription UI (#2017)

* feat(performance): added reactquery hooks for workflow operations, for logs, fixed logs reloading, fix subscription UI

* use useInfiniteQuery for logs fetching

* fix(copilot): run workflow supports input format and fix run id (#2018)

* fix(router): fix error edge in router block + fix source handle problem (#2019)

* Fix router block error port handling

* Remove comment

* Fix edge execution

* improvement: code subblock, action bar, connections (#2024)

* improvement: action bar, connections

* fix: code block draggable resize

* fix(response): fix response block http format (#2027)

* Fix response block

* Lint

* fix(notes): fix notes block spacing, additional logs for billing transfer route (#2029)

---------

Co-authored-by: Vikhyath Mondreti <vikhyathvikku@gmail.com>
Co-authored-by: Emir Karabeg <78010029+emir-karabeg@users.noreply.github.com>
Co-authored-by: Siddharth Ganesan <33737564+Sg312@users.noreply.github.com>
2025-11-17 13:46:03 -08:00
Waleed
6f3dee867c fix(notes): fix notes block spacing, additional logs for billing transfer route (#2029) 2025-11-17 13:37:17 -08:00
Siddharth Ganesan
bfa7c919d8 fix(response): fix response block http format (#2027)
* Fix response block

* Lint
2025-11-17 11:50:33 -08:00
Emir Karabeg
e37b01b92c improvement: code subblock, action bar, connections (#2024)
* improvement: action bar, connections

* fix: code block draggable resize
2025-11-17 11:04:41 -08:00
Siddharth Ganesan
7e3e38a6f2 fix(router): fix error edge in router block + fix source handle problem (#2019)
* Fix router block error port handling

* Remove comment

* Fix edge execution
2025-11-15 18:32:14 -08:00
Siddharth Ganesan
1c85fe9a51 fix(copilot): run workflow supports input format and fix run id (#2018) 2025-11-15 18:11:09 -08:00
Waleed
5f446ad756 feat(performance): added reactquery hooks for workflow operations, for logs, fixed logs reloading, fix subscription UI (#2017)
* feat(performance): added reactquery hooks for workflow operations, for logs, fixed logs reloading, fix subscription UI

* use useInfiniteQuery for logs fetching
2025-11-15 16:41:35 -08:00
Waleed
d99d5fe39c feat(billing): add notif for first failed payment, added upgrade email from free, updated providers that supported granular tool control to support them, fixed envvar popover, fixed redirect to wrong workspace after oauth connect (#2015)
* feat(billing): add notif for first failed payment, added upgrade email from free, updated providers that supported granular tool control to support them, fixed envvar popover, fixed redirect to wrong workspace after oauth connect

* fix build

* ack PR comments
2025-11-15 16:09:58 -08:00
Siddharth Ganesan
949f9287cf fix(variables): Fix resolution on double < (#2016)
* Fix variable <>

* Ling

* Clean
2025-11-15 15:09:01 -08:00
Siddharth Ganesan
fca92a7499 fix(tags): only show start block upstream if is ancestor (#2013) 2025-11-15 12:27:34 -08:00
Siddharth Ganesan
c25ea5c677 fix(triggers): disabled trigger shouldn't be added to dag (#2012)
* Fix disabled blocks

* Comments

* Fix api/chat trigger not found message
2025-11-15 12:19:37 -08:00
Siddharth Ganesan
dccd9e9ce5 fix(triggers): check triggermode and consolidate block type (#2011) 2025-11-15 12:00:12 -08:00
Waleed
b5d9964c48 feat(i18n): update translations (#2009) 2025-11-14 23:33:13 -08:00
Emir Karabeg
4bd0f31f36 improvement: runpath edges, blocks, active (#2008) 2025-11-14 23:26:41 -08:00
Waleed
f8070f9029 feat(models): added gpt-5.1 (#2007) 2025-11-14 23:23:47 -08:00
Waleed
bc8947caa6 fix(condition): treat condition input the same as the code subblock (#2006) 2025-11-14 23:23:39 -08:00
Waleed
f1111ec16f fix(modals): fix z-index for various modals and output selector and variables (#2005) 2025-11-14 23:13:31 -08:00
Waleed
d0767507b2 fix(pdfs): use unpdf instead of pdf-parse (#2004) 2025-11-14 22:39:28 -08:00
Waleed
8bd75debc1 fix(notes): fix notes, tighten spacing, update deprecated zustand function, update use mention data to ignore block positon (#2002) 2025-11-14 22:12:01 -08:00
Emir Karabeg
ad2a375358 fix(usage-indicator): conditional rendering, upgrade, and ui/ux (#2001)
* fix: usage-limit indicator and render conditonally on is billing enabled

* fix: upgrade render
2025-11-14 21:26:40 -08:00
Vikhyath Mondreti
de91dc97a9 test(pr): github trigger (#2000) 2025-11-14 18:08:07 -08:00
Vikhyath Mondreti
31ed712378 test(pr): hackathon (#1999) 2025-11-14 18:02:00 -08:00
Waleed
aca4d2fc15 v0.5.5: slack tool updates, logs search, response block fixes, reactquery migrations 2025-11-14 16:20:10 -08:00
Emir Karabeg
96958104c0 Improvement(ui/ux): signup, command-list, cursors, search modal, workflow runs, usage indicator (#1998)
* improvement: signup loading, command-list, cursors, search modal ordering

* improvement: workflow runs, search modal

* improvement(usage-indicator): ui/ux
2025-11-14 16:13:23 -08:00
Siddharth Ganesan
6f29e2413c fix(variables): fix variables block json resolution (#1997) 2025-11-14 16:07:01 -08:00
Vikhyath Mondreti
c2ccd51b3e fix(folders): duplicate (#1996) 2025-11-14 15:50:00 -08:00
Vikhyath Mondreti
ec430abca2 improvement(tanstack): migrate multiple stores (#1994)
* improvement(tanstack): migrate folders, knowledge to tanstack

* fix types
2025-11-14 15:38:15 -08:00
Siddharth Ganesan
4b4060f63f improvement(variables): support dot notation for nested objects (#1992) 2025-11-14 14:47:16 -08:00
Siddharth Ganesan
72a048f37d fix(variables): fix double stringification (#1991) 2025-11-14 12:00:32 -08:00
Emir Karabeg
fa18bef65b fix(landing): hero stripe icon (#1988) 2025-11-14 02:20:32 -08:00
Waleed
a9eb91aed1 feat(i18n): update translations (#1989)
Co-authored-by: waleedlatif1 <waleedlatif1@users.noreply.github.com>
2025-11-14 02:18:32 -08:00
Waleed
16a4f37dac feat(slack): add better error messages, reminder to add bot to app (#1990) 2025-11-14 02:18:19 -08:00
Waleed
6c56d48e73 feat(slack): added slack full message object in response (#1987) 2025-11-14 01:55:01 -08:00
Waleed
1082e55871 improvement(logs): improved logs search (#1985)
* improvement(logs): improved logs search

* more

* ack PR comments
2025-11-14 01:14:20 -08:00
Vikhyath Mondreti
948b6575dc fix(output-selector): z-index in chat deploy modal (#1984) 2025-11-13 20:13:15 -08:00
Waleed
3ba33791f7 fix(settings): update usage data in settings > subs to use reactquery hooks (#1983)
* fix(settings): update usage data in settings > subs to use reactquery hooks

* standardize usage pills calculation
2025-11-13 19:57:48 -08:00
Vikhyath Mondreti
1e915d5427 fix(popovers): billed account + async example command (#1982) 2025-11-13 19:33:15 -08:00
Waleed
d86198ad5d feat(files): add presigned URL generation support for execution files (#1980) 2025-11-13 19:32:23 -08:00
Vikhyath Mondreti
785f847c48 fix(onedrive): parse array values correctly (#1981)
* fix(onedrive): parse array values correctly

* fix onedrive

* fix

* fix onedrive input parsing by reusing code subblock

* fix type
2025-11-13 19:24:33 -08:00
Siddharth Ganesan
dab70a8f1d fix(logs): show block inputs (#1979)
* Fix executor lgos block inputs

* Fix Comment
2025-11-13 19:07:53 -08:00
Waleed
d2c0147822 v0.5.4: streaming fixes, deployment bug fixes, resolve ui bugs, tanstack query for settings, copilot subflow edits fixes 2025-11-13 18:29:20 -08:00
Waleed
67d9343022 feat(i18n): update translations (#1978)
* feat(i18n): update translations

* fix build

---------

Co-authored-by: waleedlatif1 <waleedlatif1@users.noreply.github.com>
2025-11-13 18:07:42 -08:00
Vikhyath Mondreti
b3caef1f31 fix(copilot-subflows): copilot-added subflows id mismatch (#1977) 2025-11-13 17:56:26 -08:00
Waleed
5457d4bc7b feat(settings): added reactquery for settings, removed zustand stores, added apollo, added workflow block selector dropdown search, added add environment variable option to empty env var dropdown (#1971)
* feat(settings): added reactquery for settings, removed zustand stores, added apollo, added workflow block selector dropdown search, added add environment variable option to empty env var dropdown

* fix delete dialog for copilot keys

* simplify combobox

* fix more z indices

* consolidated duplicate hooks

---------

Co-authored-by: Vikhyath Mondreti <vikhyath@simstudio.ai>
2025-11-13 17:33:05 -08:00
Emir Karabeg
32a2e09a14 fix lint 2025-11-13 16:31:30 -08:00
Emir Karabeg
80eaeb00c2 improvement(platform): chat, emcn, terminal, usage-limit (#1974)
* improvement(usage-indicator): layout

* improvement: expand default terminal height

* fix: swap workflow block ports

* improvement: chat initial positioning

* improvement(chat): display; improvement(emcn): popover attributes
2025-11-13 16:02:13 -08:00
Waleed
b67b4ff8fb fix(workflow-block): fix redeploy header to not repeatedly show redeploy when redeploy is not necessary (#1973)
* fix(workflow-block): fix redeploy header to not repeatedly show redeploy when redeploy is not necessary

* cleanup
2025-11-13 15:40:09 -08:00
Siddharth Ganesan
6f4f8cfad2 fix(executor): streaming response format (#1972) 2025-11-13 15:27:15 -08:00
Vikhyath Mondreti
3a8f01f3e4 fix(cmd-k): z-index + reoder tools, triggers (#1970)
* fix(cmd-k): z-index + reoder tools, triggers

* fix more z-index styling
2025-11-13 13:59:09 -08:00
Vikhyath Mondreti
383b6f05a6 fix(code): readd wand to code subblock (#1969) 2025-11-13 12:31:10 -08:00
Siddharth Ganesan
a70f2a6690 fix(executor): streaming after tool calls (#1963)
* Provider changes

* Fix lint
2025-11-13 12:24:26 -08:00
Vikhyath Mondreti
53150021e0 v0.5.3: docs, sheets, slack, custom tools fixes and templates contexts improvements 2025-11-12 22:17:06 -08:00
Vikhyath Mondreti
4e5b834433 fix(onedrive): incorrect canonical param (#1966)
* fix(onedrive): incorrect canonical param

* fix download file

* fix

* fix

* Revert "fix"

This reverts commit f68ccd75fd.

* Revert "fix"

This reverts commit f3d8acee7d.
2025-11-12 22:16:13 -08:00
Waleed
304fb28baf improvement(templates): add share button, serve public templates routes for unauthenticated users and workspace one for authenticated users, improve settings style and organization (#1962)
* improvement(templates): add share button, serve public templates routes for unauthenticated users and workspace one for authenticated users, improve settings style and organization

* fix lint

---------

Co-authored-by: Vikhyath Mondreti <vikhyath@simstudio.ai>
2025-11-12 21:46:26 -08:00
Vikhyath Mondreti
07e803cfdd fix(slack): remove update message incorrect canonical param (#1964)
* fix(slack): send message tool

* add logging

* add more logs

* add more logs

* fix canonical param
2025-11-12 21:46:00 -08:00
Vikhyath Mondreti
d50aefcc68 fix(custom-tools): updates to legacy + copilot generated custom tools (#1960)
* fix(custom-tools): updates to existing tools

* don't reorder custom tools in modal based on edit time

* restructure custom tools to persist copilot generated tools

* fix tests
2025-11-12 18:50:58 -08:00
Vikhyath Mondreti
6513cbb7c1 fix provider for docs selector (#1959) 2025-11-12 17:57:04 -08:00
Waleed
f9e822f6c8 feat(docs): added docs analytics drizzle ods (#1957)
* feat(docs): added docs analytics drizzle ods

* fix build
2025-11-12 17:51:58 -08:00
Vikhyath Mondreti
74202ce1fc fix(sheets): file selector had incorrect provider (#1958) 2025-11-12 17:36:28 -08:00
Waleed
66c8fa2a77 v0.5.2: templates, wand, settings, table, copilot-landing, files, deploy, autoconnect 2025-11-12 16:36:18 -08:00
Waleed
766c7fbfbb feat(drizzle): added ods for analytics from drizzle (#1956)
* feat(drizzle): added ods for analytics from drizzle

* clean
2025-11-12 16:35:46 -08:00
Adam Gough
675c42188a feat(newgifs): added new gifs (#1953)
* new gifs

* changed wording

* changed wording

* lowercase

* changed wording

* remove blog stuff

---------

Co-authored-by: aadamgough <adam@sim.ai>
Co-authored-by: waleed <walif6@gmail.com>
2025-11-12 16:21:09 -08:00
Emir Karabeg
f414ae1936 improvement: template use button (#1954) 2025-11-12 16:17:27 -08:00
Emir Karabeg
ead0db9d2a improvement: templates styling (#1952) 2025-11-12 15:58:38 -08:00
Vikhyath Mondreti
10288111a8 fix(autoconnect): should check if triggermode is set from the toolbar drag event directly (#1951) 2025-11-12 15:51:52 -08:00
Siddharth Ganesan
01183f1771 fix(executor): consolidate execution hooks (#1950) 2025-11-12 15:46:29 -08:00
Waleed
ff081714e4 fix(deploy): fix button (#1949) 2025-11-12 14:16:56 -08:00
Emir Karabeg
36bcd75832 improvement: usage-indicator UI (#1948) 2025-11-12 14:09:18 -08:00
Waleed
9db969b1e0 fix(files): changed file input value sample from string -> object (#1947) 2025-11-12 14:06:33 -08:00
Waleed
2fbe0de5d3 fix(settings): fix broken api keys, help modal, logs, workflow renaming (#1945)
* fix(settings): fix broken api keys, help modal, logs, workflow renaming

* fix build

* cleanup

* use emcn
2025-11-12 13:43:48 -08:00
Vikhyath Mondreti
6315cc105b fix(wand): subblocks should not be overwritten after wand gen (#1946) 2025-11-12 13:36:36 -08:00
Vikhyath Mondreti
61404d48a3 fix(landing): need to propagate landing page copilot prompt (#1944) 2025-11-12 12:36:45 -08:00
Vikhyath Mondreti
dbf9097a5b fix(templates-details): restore approval feature, and keep details UI consistent, smoothen out creation of profile (#1943)
* fix(templates): view current ui

* update UI to be less cluttered

* make state management for creating user profile smoother

* fix autoselect logic

* fix lint
2025-11-12 12:22:16 -08:00
Siddharth Ganesan
79b318fd9c fix(templates): fix templates details page (#1942)
* Fix template details

* Fix deps
2025-11-12 11:16:15 -08:00
Siddharth Ganesan
cb39e697e2 fix(templates): fix template details page (#1940)
* Fix v1

* Template details page
2025-11-12 10:45:34 -08:00
Emir Karabeg
e1a46c90c6 fix: table subblock (#1937) 2025-11-12 09:53:38 -08:00
Waleed
c7560be282 fix(presence): fix additional avatars showing for presence (#1938) 2025-11-12 09:33:01 -08:00
Waleed
63f18995da v0.5.1: blogs 2025-11-12 08:30:33 -08:00
Waleed
af501347bb feat(blogs): added blog tags (#1935) 2025-11-12 08:29:03 -08:00
715 changed files with 60951 additions and 35858 deletions

View File

@@ -24,8 +24,19 @@ jobs:
with:
node-version: latest
- name: Cache Bun dependencies
uses: actions/cache@v4
with:
path: |
~/.bun/install/cache
node_modules
**/node_modules
key: ${{ runner.os }}-bun-${{ hashFiles('**/bun.lock') }}
restore-keys: |
${{ runner.os }}-bun-
- name: Install dependencies
run: bun install
run: bun install --frozen-lockfile
- name: Process docs embeddings
working-directory: ./apps/sim

View File

@@ -28,6 +28,17 @@ jobs:
with:
bun-version: 1.2.22
- name: Cache Bun dependencies
uses: actions/cache@v4
with:
path: |
~/.bun/install/cache
node_modules
**/node_modules
key: ${{ runner.os }}-bun-${{ hashFiles('**/bun.lock') }}
restore-keys: |
${{ runner.os }}-bun-
- name: Run Lingo.dev translations
env:
LINGODOTDEV_API_KEY: ${{ secrets.LINGODOTDEV_API_KEY }}
@@ -117,10 +128,21 @@ jobs:
with:
bun-version: 1.2.22
- name: Cache Bun dependencies
uses: actions/cache@v4
with:
path: |
~/.bun/install/cache
node_modules
**/node_modules
key: ${{ runner.os }}-bun-${{ hashFiles('**/bun.lock') }}
restore-keys: |
${{ runner.os }}-bun-
- name: Install dependencies
run: |
cd apps/docs
bun install
bun install --frozen-lockfile
- name: Build documentation to verify translations
run: |

View File

@@ -18,8 +18,19 @@ jobs:
with:
bun-version: 1.2.22
- name: Cache Bun dependencies
uses: actions/cache@v4
with:
path: |
~/.bun/install/cache
node_modules
**/node_modules
key: ${{ runner.os }}-bun-${{ hashFiles('**/bun.lock') }}
restore-keys: |
${{ runner.os }}-bun-
- name: Install dependencies
run: bun install
run: bun install --frozen-lockfile
- name: Apply migrations
working-directory: ./packages/db

View File

@@ -24,9 +24,20 @@ jobs:
node-version: '18'
registry-url: 'https://registry.npmjs.org/'
- name: Cache Bun dependencies
uses: actions/cache@v4
with:
path: |
~/.bun/install/cache
node_modules
**/node_modules
key: ${{ runner.os }}-bun-${{ hashFiles('**/bun.lock') }}
restore-keys: |
${{ runner.os }}-bun-
- name: Install dependencies
working-directory: packages/cli
run: bun install
run: bun install --frozen-lockfile
- name: Build package
working-directory: packages/cli

View File

@@ -24,8 +24,19 @@ jobs:
node-version: '22'
registry-url: 'https://registry.npmjs.org/'
- name: Cache Bun dependencies
uses: actions/cache@v4
with:
path: |
~/.bun/install/cache
node_modules
**/node_modules
key: ${{ runner.os }}-bun-${{ hashFiles('**/bun.lock') }}
restore-keys: |
${{ runner.os }}-bun-
- name: Install dependencies
run: bun install
run: bun install --frozen-lockfile
- name: Run tests
working-directory: packages/ts-sdk

View File

@@ -23,6 +23,17 @@ jobs:
with:
node-version: latest
- name: Cache Bun dependencies
uses: actions/cache@v4
with:
path: |
~/.bun/install/cache
node_modules
**/node_modules
key: ${{ runner.os }}-bun-${{ hashFiles('**/bun.lock') }}
restore-keys: |
${{ runner.os }}-bun-
- name: Install dependencies
run: bun install --frozen-lockfile

View File

@@ -29,8 +29,19 @@ jobs:
with:
bun-version: 1.2.22
- name: Cache Bun dependencies
uses: actions/cache@v4
with:
path: |
~/.bun/install/cache
node_modules
**/node_modules
key: ${{ runner.os }}-bun-${{ hashFiles('**/bun.lock') }}
restore-keys: |
${{ runner.os }}-bun-
- name: Install dependencies
run: bun install
run: bun install --frozen-lockfile
- name: Deploy to Trigger.dev (Staging)
if: github.ref == 'refs/heads/staging'

View File

@@ -13,8 +13,25 @@
<a href="https://docs.sim.ai" target="_blank" rel="noopener noreferrer"><img src="https://img.shields.io/badge/Docs-6F3DFA.svg" alt="Documentation"></a>
</p>
### Build Workflows with Ease
Design agent workflows visually on a canvas—connect agents, tools, and blocks, then run them instantly.
<p align="center">
<img src="apps/sim/public/static/demo.gif" alt="Sim Demo" width="800"/>
<img src="apps/sim/public/static/workflow.gif" alt="Workflow Builder Demo" width="800"/>
</p>
### Supercharge with Copilot
Leverage Copilot to generate nodes, fix errors, and iterate on flows directly from natural language.
<p align="center">
<img src="apps/sim/public/static/copilot.gif" alt="Copilot Demo" width="800"/>
</p>
### Integrate Vector Databases
Upload documents to a vector store and let agents answer questions grounded in your specific content.
<p align="center">
<img src="apps/sim/public/static/knowledge.gif" alt="Knowledge Uploads and Retrieval Demo" width="800"/>
</p>
## Quickstart

View File

@@ -198,15 +198,17 @@ export default async function Page(props: { params: Promise<{ slug?: string[]; l
component: <CustomFooter />,
}}
>
<div className='relative'>
<div className='relative mt-6 sm:mt-0'>
<div className='absolute top-1 right-0 flex items-center gap-2'>
<CopyPageButton
content={`# ${page.data.title}
<div className='hidden sm:flex'>
<CopyPageButton
content={`# ${page.data.title}
${page.data.description || ''}
${page.data.content || ''}`}
/>
/>
</div>
<PageNavigationArrows previous={neighbours?.previous} next={neighbours?.next} />
</div>
<DocsTitle>{page.data.title}</DocsTitle>

View File

@@ -13,7 +13,6 @@ import { Navbar } from '@/components/navbar/navbar'
import { i18n } from '@/lib/i18n'
import { source } from '@/lib/source'
import '../global.css'
import { Analytics } from '@vercel/analytics/next'
const inter = Inter({
subsets: ['latin'],
@@ -94,6 +93,8 @@ export default async function Layout({ children, params }: LayoutProps) {
type='application/ld+json'
dangerouslySetInnerHTML={{ __html: JSON.stringify(structuredData) }}
/>
{/* OneDollarStats Analytics - CDN script handles everything automatically */}
<script defer src='https://assets.onedollarstats.com/stonks.js' />
</head>
<body className='flex min-h-screen flex-col font-sans'>
<RootProvider i18n={provider(lang)}>
@@ -132,7 +133,6 @@ export default async function Layout({ children, params }: LayoutProps) {
>
{children}
</DocsLayout>
<Analytics />
</RootProvider>
</body>
</html>

View File

@@ -69,7 +69,7 @@ export function SidebarFolder({
</Link>
<button
onClick={() => setOpen(!open)}
className='rounded p-1 transition-colors hover:bg-gray-100/60 dark:hover:bg-gray-800/40'
className='cursor-pointer rounded p-1 transition-colors hover:bg-gray-100/60 dark:hover:bg-gray-800/40'
aria-label={open ? 'Collapse' : 'Expand'}
>
<ChevronRight
@@ -84,7 +84,7 @@ export function SidebarFolder({
<button
onClick={() => setOpen(!open)}
className={cn(
'flex w-full items-center justify-between rounded-md px-2.5 py-1.5 text-left font-medium text-[13px] leading-tight transition-colors',
'flex w-full cursor-pointer items-center justify-between rounded-md px-2.5 py-1.5 text-left font-medium text-[13px] leading-tight transition-colors',
'hover:bg-gray-100/60 dark:hover:bg-gray-800/40',
'text-gray-800 dark:text-gray-200'
)}

View File

@@ -1802,38 +1802,38 @@ export function StripeIcon(props: SVGProps<SVGSVGElement>) {
fillRule='evenodd'
clipRule='evenodd'
d='M360 78.0002C360 52.4002 347.6 32.2002 323.9 32.2002C300.1 32.2002 285.7 52.4002 285.7 77.8002C285.7 107.9 302.7 123.1 327.1 123.1C339 123.1 348 120.4 354.8 116.6V96.6002C348 100 340.2 102.1 330.3 102.1C320.6 102.1 312 98.7002 310.9 86.9002H359.8C359.8 85.6002 360 80.4002 360 78.0002ZM310.6 68.5002C310.6 57.2002 317.5 52.5002 323.8 52.5002C329.9 52.5002 336.4 57.2002 336.4 68.5002H310.6Z'
fill='white'
fill='currentColor'
/>
<path
fillRule='evenodd'
clipRule='evenodd'
d='M247.1 32.2002C237.3 32.2002 231 36.8002 227.5 40.0002L226.2 33.8002H204.2V150.4L229.2 145.1L229.3 116.8C232.9 119.4 238.2 123.1 247 123.1C264.9 123.1 281.2 108.7 281.2 77.0002C281.1 48.0002 264.6 32.2002 247.1 32.2002ZM241.1 101.1C235.2 101.1 231.7 99.0002 229.3 96.4002L229.2 59.3002C231.8 56.4002 235.4 54.4002 241.1 54.4002C250.2 54.4002 256.5 64.6002 256.5 77.7002C256.5 91.1002 250.3 101.1 241.1 101.1Z'
fill='white'
fill='currentColor'
/>
<path
fillRule='evenodd'
clipRule='evenodd'
d='M169.8 26.3001L194.9 20.9001V0.600098L169.8 5.9001V26.3001Z'
fill='white'
fill='currentColor'
/>
<path d='M194.9 33.9001H169.8V121.4H194.9V33.9001Z' fill='white' />
<path d='M194.9 33.9001H169.8V121.4H194.9V33.9001Z' fill='currentColor' />
<path
fillRule='evenodd'
clipRule='evenodd'
d='M142.9 41.3001L141.3 33.9001H119.7V121.4H144.7V62.1001C150.6 54.4001 160.6 55.8001 163.7 56.9001V33.9001C160.5 32.7001 148.8 30.5001 142.9 41.3001Z'
fill='white'
fill='currentColor'
/>
<path
fillRule='evenodd'
clipRule='evenodd'
d='M92.8999 12.2002L68.4999 17.4002L68.3999 97.5002C68.3999 112.3 79.4999 123.2 94.2999 123.2C102.5 123.2 108.5 121.7 111.8 119.9V99.6002C108.6 100.9 92.7999 105.5 92.7999 90.7002V55.2002H111.8V33.9002H92.7999L92.8999 12.2002Z'
fill='white'
fill='currentColor'
/>
<path
fillRule='evenodd'
clipRule='evenodd'
d='M25.3 59.3002C25.3 55.4002 28.5 53.9002 33.8 53.9002C41.4 53.9002 51 56.2002 58.6 60.3002V36.8002C50.3 33.5002 42.1 32.2002 33.8 32.2002C13.5 32.2002 0 42.8002 0 60.5002C0 88.1002 38 83.7002 38 95.6002C38 100.2 34 101.7 28.4 101.7C20.1 101.7 9.5 98.3002 1.1 93.7002V117.5C10.4 121.5 19.8 123.2 28.4 123.2C49.2 123.2 63.5 112.9 63.5 95.0002C63.4 65.2002 25.3 70.5002 25.3 59.3002Z'
fill='white'
fill='currentColor'
/>
</svg>
)
@@ -4003,3 +4003,108 @@ export function SalesforceIcon(props: SVGProps<SVGSVGElement>) {
</svg>
)
}
export function ApolloIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg
{...props}
height='26'
viewBox='0 0 36 36'
fill='currentColor'
xmlns='http://www.w3.org/2000/svg'
>
<path
d='M19.5993 0.0862365L19.605 13.2568C19.6058 15.3375 17.4222 16.6715 15.6079 15.6986L2.58376 8.7153C3.57706 7.05795 4.82616 5.57609 6.27427 4.32386L16.489 13.8945C17.0303 14.4015 17.8835 13.8518 17.6605 13.1398L13.6992 0.493553C15.0326 0.17147 16.4233 0 17.8536 0C18.4428 0 19.0248 0.0296814 19.5993 0.0862365Z'
fill='#000000'
/>
<path
d='M16.0635 36.1087L16.0578 23.0046C16.057 20.9239 18.2407 19.5898 20.0549 20.5627L33.0838 27.5486C32.0838 29.2016 30.8289 30.6786 29.3751 31.925L19.1738 22.3668C18.6326 21.8598 17.7793 22.4095 18.0023 23.1215L21.9486 35.72C20.6338 36.0329 19.263 36.1989 17.8539 36.1989C17.2497 36.1989 16.6523 36.1683 16.0635 36.1087Z'
fill='#000000'
/>
<path
d='M22.0105 16.77L31.4705 6.39392C30.2362 4.92008 28.7742 3.6486 27.1384 2.63702L20.2306 15.8767C19.2709 17.716 20.5871 19.9298 22.6396 19.9288L35.6183 19.923C35.6775 19.3234 35.7082 18.7151 35.7082 18.0996C35.7082 16.6683 35.5436 15.2761 35.2338 13.9406L22.7549 17.9576C22.0526 18.1837 21.5103 17.3187 22.0105 16.77Z'
fill='#000000'
/>
<path
d='M0.0842758 16.3383L13.0237 16.3325C15.0764 16.3317 16.3923 18.5454 15.4327 20.3846L8.56047 33.5561C6.93095 32.547 5.47394 31.2801 4.24344 29.8121L13.653 19.4914C14.1531 18.9427 13.6107 18.0777 12.9084 18.3037L0.485078 22.3029C0.168551 20.954 0 19.5467 0 18.0994C0 17.5051 0.0290814 16.9177 0.0842758 16.3383Z'
fill='#000000'
/>
</svg>
)
}
export function Neo4jIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} viewBox='0 0 128 128' fill='currentColor' xmlns='http://www.w3.org/2000/svg'>
<path
d='M63.333 32.567c-5.2.866-9.566 3-12.833 6.266-3.867 3.867-5.833 8.5-6.5 15.367-.3 3.133-.467 15.467-.2 15.467.067 0 .7-.234 1.4-.534 1.633-.7 5.167-.7 7-.033l1.4.5.167-8.033c.166-8.567.366-9.867 1.966-13.067 1.1-2.133 3.767-4.633 6.034-5.667 2.6-1.2 6.4-1.666 9.333-1.2 6.267 1.034 10 4.434 11.567 10.5.633 2.434.666 3.7.666 17.1v14.434H93.4L93.233 67.9c-.1-14.9-.166-15.9-.866-18.567-1.9-7.4-6.5-12.766-12.934-15.2-3.433-1.3-6.7-1.8-11.2-1.766-2.233.033-4.433.133-4.9.2z'
fill='#000'
/>
<path
d='M22.733 57.2c-2.866 1.433-4.4 4-4.4 7.467 0 1.1.2 2.5.467 3.133.633 1.567 2.433 3.467 4 4.3 1.9 1 5.5 1 7.367.033l1.366-.7 4.267 2.9 4.267 2.934V81.7L35.8 84.633l-4.3 2.934-1.1-.667c-1.6-.933-4.7-1.133-6.6-.4-2 .767-4.067 2.6-4.833 4.333-.834 1.767-.834 5.234 0 7 .7 1.567 2.333 3.3 3.8 4.067.6.3 2.033.6 3.233.7 2.8.2 5.167-.733 6.867-2.733 1.366-1.6 2.266-4.4 2.033-6.334l-.167-1.366 4.3-2.9 4.3-2.9 1.534.7c2.333 1 5.8.766 8-.567 2.4-1.5 3.6-3.633 3.733-6.633.1-2.1 0-2.567-.833-4.2-2.167-4.134-7-5.7-11.134-3.634l-1.233.6-4.233-2.9-4.234-2.9-.1-2.333c-.066-2.8-.866-4.6-2.833-6.233-2.5-2.134-6.233-2.567-9.267-1.067z'
fill='#018BFF'
/>
</svg>
)
}
export function CalendlyIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg
{...props}
viewBox='0 0 512 512'
xmlns='http://www.w3.org/2000/svg'
fillRule='evenodd'
clipRule='evenodd'
strokeLinejoin='round'
strokeMiterlimit='2'
>
<g fillRule='nonzero'>
<path
d='M346.955 330.224c-15.875 14.088-35.7 31.619-71.647 31.619h-21.495c-26.012 0-49.672-9.455-66.607-26.593-16.543-16.747-25.649-39.665-25.649-64.545v-29.41c0-24.88 9.106-47.799 25.65-64.545 16.934-17.138 40.594-26.579 66.606-26.579h21.495c35.99 0 55.772 17.516 71.647 31.604 16.484 14.524 30.703 27.218 68.625 27.218a109.162 109.162 0 0017.269-1.38l-.13-.334a129.909 129.909 0 00-7.974-16.382L399.4 146.99c-23.232-40.234-66.304-65.098-112.763-65.096h-50.703c-46.46-.002-89.531 24.862-112.764 65.096l-25.344 43.906c-23.224 40.238-23.224 89.968 0 130.206l25.344 43.906c23.233 40.234 66.305 65.098 112.764 65.096h50.703c46.459.002 89.53-24.862 112.763-65.096l25.345-43.833a129.909 129.909 0 007.973-16.383l.13-.32a107.491 107.491 0 00-17.268-1.452c-37.922 0-52.14 12.621-68.625 27.218'
fill='#006bff'
/>
<path
d='M275.308 176.823h-21.495c-39.592 0-65.605 28.278-65.605 64.471v29.411c0 36.194 26.013 64.472 65.605 64.472h21.495c57.69 0 53.158-58.822 140.272-58.822 8.254-.009 16.49.75 24.603 2.266a130.047 130.047 0 000-45.242 134.431 134.431 0 01-24.603 2.266c-87.143 0-82.583-58.822-140.272-58.822'
fill='#006bff'
/>
<path
d='M490.233 300.116a121.451 121.451 0 00-50.035-21.51v.436a130.296 130.296 0 01-7.262 25.344 95.25 95.25 0 0141.364 17.037c0 .116-.072.261-.116.392-28.788 93.217-115.55 157.228-213.112 157.228-122.358 0-223.044-100.685-223.044-223.043S138.714 32.956 261.072 32.956c97.561 0 184.324 64.012 213.112 157.229 0 .13.073.276.116.392a95.073 95.073 0 01-41.364 17.022 131.112 131.112 0 017.262 25.373 3.166 3.166 0 000 .407 121.415 121.415 0 0050.035-21.495c14.262-10.56 11.503-22.483 9.339-29.542C467.34 77.803 370.064 6 260.67 6c-137.147 0-250 112.854-250 250 0 137.146 112.853 250 250 250 109.394 0 206.67-71.803 238.902-176.342 2.164-7.059 4.923-18.983-9.34-29.542'
fill='#006bff'
/>
<path
d='M432.849 207.599a107.491 107.491 0 01-17.269 1.452c-37.922 0-52.14-12.62-68.61-27.217-15.89-14.089-35.672-31.619-71.662-31.619h-21.495c-26.027 0-49.672 9.455-66.607 26.593-16.543 16.746-25.649 39.665-25.649 64.545v29.41c0 24.88 9.106 47.799 25.65 64.545 16.934 17.138 40.579 26.578 66.606 26.578h21.495c35.99 0 55.772-17.515 71.661-31.604 16.47-14.524 30.69-27.217 68.611-27.217 5.783.001 11.558.463 17.269 1.38a129.303 129.303 0 007.262-25.345c.009-.145.009-.29 0-.436a134.301 134.301 0 00-24.604-2.25c-87.143 0-82.583 58.836-140.271 58.836H253.74c-39.592 0-65.604-28.293-65.604-64.487v-29.469c0-36.193 26.012-64.471 65.604-64.471h21.496c57.688 0 53.157 58.807 140.271 58.807 8.254.015 16.49-.74 24.604-2.251v-.407a131.112 131.112 0 00-7.262-25.373'
fill='#0ae8f0'
/>
<path
d='M432.849 207.599a107.491 107.491 0 01-17.269 1.452c-37.922 0-52.14-12.62-68.61-27.217-15.89-14.089-35.672-31.619-71.662-31.619h-21.495c-26.027 0-49.672 9.455-66.607 26.593-16.543 16.746-25.649 39.665-25.649 64.545v29.41c0 24.88 9.106 47.799 25.65 64.545 16.934 17.138 40.579 26.578 66.606 26.578h21.495c35.99 0 55.772-17.515 71.661-31.604 16.47-14.524 30.69-27.217 68.611-27.217 5.783.001 11.558.463 17.269 1.38a129.303 129.303 0 007.262-25.345c.009-.145.009-.29 0-.436a134.301 134.301 0 00-24.604-2.25c-87.143 0-82.583 58.836-140.271 58.836H253.74c-39.592 0-65.604-28.293-65.604-64.487v-29.469c0-36.193 26.012-64.471 65.604-64.471h21.496c57.688 0 53.157 58.807 140.271 58.807 8.254.015 16.49-.74 24.604-2.251v-.407a131.112 131.112 0 00-7.262-25.373'
fill='#0ae8f0'
/>
</g>
</svg>
)
}
export function AudioWaveformIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg
{...props}
xmlns='http://www.w3.org/2000/svg'
width='24'
height='24'
viewBox='0 0 24 24'
fill='none'
stroke='currentColor'
strokeWidth='2'
strokeLinecap='round'
strokeLinejoin='round'
>
<path d='M2 10v3' />
<path d='M6 6v11' />
<path d='M10 3v18' />
<path d='M14 8v7' />
<path d='M18 5v13' />
<path d='M22 10v3' />
</svg>
)
}

View File

@@ -30,7 +30,7 @@ export function CodeBlock(props: React.ComponentProps<typeof FumadocsCodeBlock>)
if (pre) handleCopy(pre.textContent || '')
}}
className={cn(
'rounded-md p-2 transition-all',
'cursor-pointer rounded-md p-2 transition-all',
'border border-border bg-background/80 hover:bg-muted',
'backdrop-blur-sm'
)}

View File

@@ -23,7 +23,7 @@ export function CopyPageButton({ content }: CopyPageButtonProps) {
return (
<button
onClick={handleCopy}
className='flex items-center gap-1.5 rounded-lg border border-border/40 bg-background px-2.5 py-2 text-muted-foreground/60 text-sm leading-none transition-all hover:border-border hover:bg-accent/50 hover:text-muted-foreground'
className='flex cursor-pointer items-center gap-1.5 rounded-lg border border-border/40 bg-background px-2.5 py-2 text-muted-foreground/60 text-sm leading-none transition-all hover:border-border hover:bg-accent/50 hover:text-muted-foreground'
aria-label={copied ? 'Copied to clipboard' : 'Copy page content'}
>
{copied ? (

View File

@@ -5,10 +5,13 @@
import type { ComponentType, SVGProps } from 'react'
import {
AirtableIcon,
ApolloIcon,
ArxivIcon,
AsanaIcon,
AudioWaveformIcon,
BrainIcon,
BrowserUseIcon,
CalendlyIcon,
ClayIcon,
ConfluenceIcon,
DiscordIcon,
@@ -43,6 +46,7 @@ import {
MistralIcon,
MongoDBIcon,
MySQLIcon,
Neo4jIcon,
NotionIcon,
OpenAIIcon,
OutlookIcon,
@@ -80,78 +84,82 @@ import {
type IconComponent = ComponentType<SVGProps<SVGSVGElement>>
export const blockTypeToIconMap: Record<string, IconComponent> = {
postgresql: PostgresIcon,
twilio_voice: TwilioIcon,
translate: TranslateIcon,
tavily: TavilyIcon,
stagehand_agent: StagehandIcon,
youtube: YouTubeIcon,
supabase: SupabaseIcon,
vision: EyeIcon,
confluence: ConfluenceIcon,
arxiv: ArxivIcon,
webflow: WebflowIcon,
pinecone: PineconeIcon,
whatsapp: WhatsAppIcon,
typeform: TypeformIcon,
qdrant: QdrantIcon,
asana: AsanaIcon,
memory: BrainIcon,
serper: SerperIcon,
linear: LinearIcon,
exa: ExaAIIcon,
telegram: TelegramIcon,
salesforce: SalesforceIcon,
hubspot: HubspotIcon,
hunter: HunterIOIcon,
linkup: LinkupIcon,
mongodb: MongoDBIcon,
airtable: AirtableIcon,
discord: DiscordIcon,
jina: JinaAIIcon,
google_docs: GoogleDocsIcon,
perplexity: PerplexityIcon,
google_search: GoogleIcon,
x: xIcon,
google_calendar: GoogleCalendarIcon,
zep: ZepIcon,
microsoft_planner: MicrosoftPlannerIcon,
thinking: BrainIcon,
pipedrive: PipedriveIcon,
stagehand: StagehandIcon,
google_forms: GoogleFormsIcon,
file: DocumentIcon,
mistral_parse: MistralIcon,
gmail: GmailIcon,
openai: OpenAIIcon,
outlook: OutlookIcon,
onedrive: MicrosoftOneDriveIcon,
resend: ResendIcon,
google_vault: GoogleVaultIcon,
sharepoint: MicrosoftSharepointIcon,
huggingface: HuggingFaceIcon,
clay: ClayIcon,
jira: JiraIcon,
wealthbox: WealthboxIcon,
notion: NotionIcon,
elevenlabs: ElevenLabsIcon,
microsoft_teams: MicrosoftTeamsIcon,
github: GithubIcon,
google_drive: GoogleDriveIcon,
reddit: RedditIcon,
parallel_ai: ParallelIcon,
stripe: StripeIcon,
s3: S3Icon,
trello: TrelloIcon,
mem0: Mem0Icon,
knowledge: PackageSearchIcon,
twilio_sms: TwilioIcon,
slack: SlackIcon,
microsoft_excel: MicrosoftExcelIcon,
image_generator: ImageIcon,
google_sheets: GoogleSheetsIcon,
youtube: YouTubeIcon,
x: xIcon,
wikipedia: WikipediaIcon,
firecrawl: FirecrawlIcon,
whatsapp: WhatsAppIcon,
webflow: WebflowIcon,
wealthbox: WealthboxIcon,
vision: EyeIcon,
typeform: TypeformIcon,
twilio_voice: TwilioIcon,
twilio_sms: TwilioIcon,
trello: TrelloIcon,
translate: TranslateIcon,
thinking: BrainIcon,
telegram: TelegramIcon,
tavily: TavilyIcon,
supabase: SupabaseIcon,
stt: AudioWaveformIcon,
stripe: StripeIcon,
stagehand_agent: StagehandIcon,
stagehand: StagehandIcon,
slack: SlackIcon,
sharepoint: MicrosoftSharepointIcon,
serper: SerperIcon,
salesforce: SalesforceIcon,
s3: S3Icon,
resend: ResendIcon,
reddit: RedditIcon,
qdrant: QdrantIcon,
postgresql: PostgresIcon,
pipedrive: PipedriveIcon,
pinecone: PineconeIcon,
perplexity: PerplexityIcon,
parallel_ai: ParallelIcon,
outlook: OutlookIcon,
openai: OpenAIIcon,
onedrive: MicrosoftOneDriveIcon,
notion: NotionIcon,
neo4j: Neo4jIcon,
mysql: MySQLIcon,
mongodb: MongoDBIcon,
mistral_parse: MistralIcon,
microsoft_teams: MicrosoftTeamsIcon,
microsoft_planner: MicrosoftPlannerIcon,
microsoft_excel: MicrosoftExcelIcon,
memory: BrainIcon,
mem0: Mem0Icon,
linkup: LinkupIcon,
linear: LinearIcon,
knowledge: PackageSearchIcon,
jira: JiraIcon,
jina: JinaAIIcon,
image_generator: ImageIcon,
hunter: HunterIOIcon,
huggingface: HuggingFaceIcon,
hubspot: HubspotIcon,
google_vault: GoogleVaultIcon,
google_sheets: GoogleSheetsIcon,
google_forms: GoogleFormsIcon,
google_drive: GoogleDriveIcon,
google_docs: GoogleDocsIcon,
google_calendar: GoogleCalendarIcon,
google_search: GoogleIcon,
gmail: GmailIcon,
github: GithubIcon,
firecrawl: FirecrawlIcon,
file: DocumentIcon,
exa: ExaAIIcon,
elevenlabs: ElevenLabsIcon,
discord: DiscordIcon,
confluence: ConfluenceIcon,
clay: ClayIcon,
calendly: CalendlyIcon,
browser_use: BrowserUseIcon,
asana: AsanaIcon,
arxiv: ArxivIcon,
apollo: ApolloIcon,
airtable: AirtableIcon,
}

View File

@@ -82,7 +82,7 @@ export function LanguageDropdown() {
aria-haspopup='listbox'
aria-expanded={isOpen}
aria-controls='language-menu'
className='flex items-center gap-1.5 rounded-xl px-3 py-2 font-normal text-[0.9375rem] text-foreground/60 leading-[1.4] transition-colors hover:bg-foreground/8 hover:text-foreground focus:outline-none focus-visible:ring-2 focus-visible:ring-ring'
className='flex cursor-pointer items-center gap-1.5 rounded-xl px-3 py-2 font-normal text-[0.9375rem] text-foreground/60 leading-[1.4] transition-colors hover:bg-foreground/8 hover:text-foreground focus:outline-none focus-visible:ring-2 focus-visible:ring-ring'
style={{
fontFamily:
'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif',
@@ -110,7 +110,7 @@ export function LanguageDropdown() {
}}
role='option'
aria-selected={currentLang === code}
className={`flex w-full items-center gap-3 px-3 py-3 text-base transition-colors first:rounded-t-xl last:rounded-b-xl hover:bg-muted/80 focus:outline-none focus-visible:ring-2 focus-visible:ring-ring md:gap-2 md:px-2.5 md:py-2 md:text-sm ${
className={`flex w-full cursor-pointer items-center gap-3 px-3 py-3 text-base transition-colors first:rounded-t-xl last:rounded-b-xl hover:bg-muted/80 focus:outline-none focus-visible:ring-2 focus-visible:ring-ring md:gap-2 md:px-2.5 md:py-2 md:text-sm ${
currentLang === code ? 'bg-muted/60 font-medium text-primary' : 'text-foreground'
}`}
>

View File

@@ -15,7 +15,7 @@ export function SearchTrigger() {
return (
<button
type='button'
className='flex h-10 w-[460px] items-center gap-2 rounded-xl border border-border/50 px-3 py-2 text-sm backdrop-blur-xl transition-colors hover:border-border'
className='flex h-10 w-[460px] cursor-pointer items-center gap-2 rounded-xl border border-border/50 px-3 py-2 text-sm backdrop-blur-xl transition-colors hover:border-border'
style={{
backgroundColor: 'hsla(0, 0%, 5%, 0.85)',
backdropFilter: 'blur(33px) saturate(180%)',

View File

@@ -14,7 +14,7 @@ export function ThemeToggle() {
if (!mounted) {
return (
<button className='flex items-center justify-center rounded-md p-1 text-muted-foreground'>
<button className='flex cursor-pointer items-center justify-center rounded-md p-1 text-muted-foreground'>
<Moon className='h-4 w-4' />
</button>
)
@@ -23,7 +23,7 @@ export function ThemeToggle() {
return (
<button
onClick={() => setTheme(theme === 'dark' ? 'light' : 'dark')}
className='flex items-center justify-center rounded-md p-1 text-muted-foreground transition-colors hover:text-foreground'
className='flex cursor-pointer items-center justify-center rounded-md p-1 text-muted-foreground transition-colors hover:text-foreground'
aria-label='Toggle theme'
>
{theme === 'dark' ? <Moon className='h-4 w-4' /> : <Sun className='h-4 w-4' />}

View File

@@ -42,10 +42,10 @@ Der Benutzer-Prompt stellt die primären Eingabedaten für die Inferenzverarbeit
Der Agent-Block unterstützt mehrere LLM-Anbieter über eine einheitliche Inferenzschnittstelle. Verfügbare Modelle umfassen:
- **OpenAI**: GPT-5, GPT-4o, o1, o3, o4-mini, gpt-4.1
- **Anthropic**: Claude 3.7 Sonnet
- **OpenAI**: GPT-5.1, GPT-5, GPT-4o, o1, o3, o4-mini, gpt-4.1
- **Anthropic**: Claude 4.5 Sonnet, Claude Opus 4.1
- **Google**: Gemini 2.5 Pro, Gemini 2.0 Flash
- **Andere Anbieter**: Groq, Cerebras, xAI, DeepSeek
- **Andere Anbieter**: Groq, Cerebras, xAI, Azure OpenAI, OpenRouter
- **Lokale Modelle**: Ollama-kompatible Modelle
### Temperatur

View File

@@ -0,0 +1,574 @@
---
title: Apollo
description: Suchen, anreichern und verwalten Sie Kontakte mit Apollo.io
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="apollo"
color="#EBF212"
/>
{/* MANUAL-CONTENT-START:intro */}
[Apollo.io](https://apollo.io/) ist eine führende Plattform für Vertriebsintelligenz und -engagement, die Benutzern ermöglicht, Kontakte und Unternehmen im großen Maßstab zu finden, anzureichern und zu kontaktieren. Apollo.io kombiniert eine umfangreiche Kontaktdatenbank mit robusten Anreicherungs- und Workflow-Automatisierungstools und unterstützt Vertriebs-, Marketing- und Recruiting-Teams bei der Beschleunigung des Wachstums.
Mit Apollo.io können Sie:
- **Millionen von Kontakten und Unternehmen durchsuchen**: Finden Sie präzise Leads mit erweiterten Filtern
- **Leads und Accounts anreichern**: Füllen Sie fehlende Details mit verifizierten Daten und aktuellen Informationen
- **CRM-Datensätze verwalten und organisieren**: Halten Sie Ihre Personen- und Unternehmensdaten genau und handlungsfähig
- **Outreach automatisieren**: Fügen Sie Kontakte zu Sequenzen hinzu und erstellen Sie Follow-up-Aufgaben direkt aus Apollo.io
In Sim ermöglicht die Apollo.io-Integration Ihren Agenten, zentrale Apollo-Operationen programmatisch durchzuführen:
- **Personen und Unternehmen suchen**: Verwenden Sie `apollo_people_search`, um neue Leads mit flexiblen Filtern zu entdecken.
- **Personendaten anreichern**: Verwenden Sie `apollo_people_enrich`, um Kontakte mit verifizierten Informationen zu ergänzen.
- **Personen in Masse anreichern**: Verwenden Sie `apollo_people_bulk_enrich` für die großflächige Anreicherung mehrerer Kontakte auf einmal.
- **Unternehmen suchen und anreichern**: Verwenden Sie `apollo_company_search` und `apollo_company_enrich`, um wichtige Unternehmensinformationen zu entdecken und zu aktualisieren.
Dies ermöglicht Ihren Agenten, leistungsstarke Workflows für Prospecting, CRM-Anreicherung und Automatisierung zu erstellen, ohne manuelle Dateneingabe oder Tabwechsel. Integrieren Sie Apollo.io als dynamische Datenquelle und CRM-Engine und befähigen Sie Ihre Agenten, Leads nahtlos als Teil ihrer täglichen Arbeit zu identifizieren, zu qualifizieren und zu kontaktieren.
{/* MANUAL-CONTENT-END */}
## Gebrauchsanweisung
Integriert Apollo.io in den Workflow. Suche nach Personen und Unternehmen, reichere Kontaktdaten an, verwalte deine CRM-Kontakte und Konten, füge Kontakte zu Sequenzen hinzu und erstelle Aufgaben.
## Tools
### `apollo_people_search`
Apollo durchsuchen
#### Input
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Apollo API-Schlüssel |
| `person_titles` | array | Nein | Zu suchende Berufsbezeichnungen (z.B. ["CEO", "VP of Sales"]) |
| `person_locations` | array | Nein | Orte, in denen gesucht werden soll (z.B. ["San Francisco, CA", "New York, NY"]) |
| `person_seniorities` | array | Nein | Hierarchieebenen (z.B. ["senior", "executive", "manager"]) |
| `organization_names` | array | Nein | Unternehmensnamen, in denen gesucht werden soll |
| `q_keywords` | string | Nein | Zu suchende Schlüsselwörter |
| `page` | number | Nein | Seitennummer für Paginierung (Standard: 1) |
| `per_page` | number | Nein | Ergebnisse pro Seite (Standard: 25, max: 100) |
#### Output
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `people` | json | Array von Personen, die den Suchkriterien entsprechen |
| `metadata` | json | Paginierungsinformationen einschließlich page, per_page und total_entries |
### `apollo_people_enrich`
Daten für eine einzelne Person mit Apollo anreichern
#### Input
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Apollo API-Schlüssel |
| `first_name` | string | Nein | Vorname der Person |
| `last_name` | string | Nein | Nachname der Person |
| `email` | string | Nein | E-Mail-Adresse der Person |
| `organization_name` | string | Nein | Name des Unternehmens, in dem die Person arbeitet |
| `domain` | string | Nein | Unternehmensdomäne (z.B. apollo.io) |
| `linkedin_url` | string | Nein | LinkedIn-Profil-URL |
| `reveal_personal_emails` | boolean | Nein | Persönliche E-Mail-Adressen aufdecken (verbraucht Credits) |
| `reveal_phone_number` | boolean | Nein | Telefonnummern aufdecken (verbraucht Credits) |
#### Output
| Parameter | Type | Beschreibung |
| --------- | ---- | ----------- |
| `person` | json | Angereicherte Personendaten von Apollo |
| `metadata` | json | Anreicherungsmetadaten einschließlich Anreicherungsstatus |
### `apollo_people_bulk_enrich`
Daten für bis zu 10 Personen gleichzeitig mit Apollo anreichern
#### Input
| Parameter | Type | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Apollo API-Schlüssel |
| `people` | array | Ja | Array von Personen zur Anreicherung (max. 10) |
| `reveal_personal_emails` | boolean | Nein | Persönliche E-Mail-Adressen anzeigen (verbraucht Credits) |
| `reveal_phone_number` | boolean | Nein | Telefonnummern anzeigen (verbraucht Credits) |
#### Output
| Parameter | Type | Beschreibung |
| --------- | ---- | ----------- |
| `people` | json | Array von angereicherten Personendaten |
| `metadata` | json | Metadaten zur Massenanreicherung einschließlich Gesamt- und angereicherter Anzahl |
### `apollo_organization_search`
Apollo durchsuchen
#### Input
| Parameter | Type | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Apollo API-Schlüssel |
| `organization_locations` | array | Nein | Zu durchsuchende Unternehmensstandorte |
| `organization_num_employees_ranges` | array | Nein | Bereiche der Mitarbeiterzahl (z.B. ["1-10", "11-50"]) |
| `q_organization_keyword_tags` | array | Nein | Branchen- oder Schlüsselwort-Tags |
| `q_organization_name` | string | Nein | Zu suchender Organisationsname |
| `page` | number | Nein | Seitennummer für Paginierung |
| `per_page` | number | Nein | Ergebnisse pro Seite (max: 100) |
#### Output
| Parameter | Type | Beschreibung |
| --------- | ---- | ----------- |
| `organizations` | json | Array von Organisationen, die den Suchkriterien entsprechen |
| `metadata` | json | Paginierungsinformationen einschließlich page, per_page und total_entries |
### `apollo_organization_enrich`
Daten für eine einzelne Organisation mit Apollo anreichern
#### Input
| Parameter | Type | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Apollo API-Schlüssel |
| `organization_name` | string | Nein | Name der Organisation \(mindestens einer von organization_name oder domain ist erforderlich\) |
| `domain` | string | Nein | Unternehmensdomäne \(z.B. apollo.io\) \(mindestens einer von domain oder organization_name ist erforderlich\) |
#### Output
| Parameter | Type | Beschreibung |
| --------- | ---- | ----------- |
| `organization` | json | Angereicherte Organisationsdaten von Apollo |
| `metadata` | json | Anreicherungsmetadaten einschließlich des Anreicherungsstatus |
### `apollo_organization_bulk_enrich`
Daten für bis zu 10 Organisationen gleichzeitig mit Apollo anreichern
#### Input
| Parameter | Type | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Apollo API-Schlüssel |
| `organizations` | array | Ja | Array von zu anreichernden Organisationen \(max. 10\) |
#### Output
| Parameter | Type | Beschreibung |
| --------- | ---- | ----------- |
| `organizations` | json | Array von angereicherten Organisationsdaten |
| `metadata` | json | Metadaten zur Massenanreicherung einschließlich Gesamt- und angereicherte Anzahl |
### `apollo_contact_create`
Einen neuen Kontakt in Ihrer Apollo-Datenbank erstellen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Apollo API-Schlüssel |
| `first_name` | string | Ja | Vorname des Kontakts |
| `last_name` | string | Ja | Nachname des Kontakts |
| `email` | string | Nein | E-Mail-Adresse des Kontakts |
| `title` | string | Nein | Berufsbezeichnung |
| `account_id` | string | Nein | Apollo-Konto-ID für die Zuordnung |
| `owner_id` | string | Nein | Benutzer-ID des Kontaktinhabers |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `contact` | json | Erstellte Kontaktdaten von Apollo |
| `metadata` | json | Erstellungsmetadaten einschließlich Erstellungsstatus |
### `apollo_contact_update`
Einen bestehenden Kontakt in Ihrer Apollo-Datenbank aktualisieren
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Apollo API-Schlüssel |
| `contact_id` | string | Ja | ID des zu aktualisierenden Kontakts |
| `first_name` | string | Nein | Vorname des Kontakts |
| `last_name` | string | Nein | Nachname des Kontakts |
| `email` | string | Nein | E-Mail-Adresse |
| `title` | string | Nein | Berufsbezeichnung |
| `account_id` | string | Nein | Apollo-Konto-ID |
| `owner_id` | string | Nein | Benutzer-ID des Kontaktinhabers |
#### Output
| Parameter | Type | Beschreibung |
| --------- | ---- | ----------- |
| `contact` | json | Aktualisierte Kontaktdaten von Apollo |
| `metadata` | json | Aktualisierte Metadaten einschließlich des aktualisierten Status |
### `apollo_contact_search`
Dein Team durchsuchen
#### Input
| Parameter | Type | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Apollo API-Schlüssel |
| `q_keywords` | string | Nein | Suchbegriffe |
| `contact_stage_ids` | array | Nein | Nach Kontaktphasen-IDs filtern |
| `page` | number | Nein | Seitennummer für Paginierung |
| `per_page` | number | Nein | Ergebnisse pro Seite \(max: 100\) |
#### Output
| Parameter | Type | Beschreibung |
| --------- | ---- | ----------- |
| `contacts` | json | Array von Kontakten, die den Suchkriterien entsprechen |
| `metadata` | json | Paginierungsinformationen einschließlich page, per_page und total_entries |
### `apollo_contact_bulk_create`
Erstelle bis zu 100 Kontakte auf einmal in deiner Apollo-Datenbank. Unterstützt Deduplizierung, um das Erstellen von Duplikaten zu verhindern. Master-Schlüssel erforderlich.
#### Input
| Parameter | Type | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Apollo API-Schlüssel \(Master-Schlüssel erforderlich\) |
| `contacts` | array | Ja | Array von zu erstellenden Kontakten \(max. 100\). Jeder Kontakt sollte first_name, last_name und optional email, title, account_id, owner_id enthalten |
| `run_dedupe` | boolean | Nein | Aktiviere Deduplizierung, um das Erstellen von Duplikaten zu verhindern. Bei true werden bestehende Kontakte ohne Änderung zurückgegeben |
#### Output
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `created_contacts` | json | Array neu erstellter Kontakte |
| `existing_contacts` | json | Array bestehender Kontakte \(wenn Deduplizierung aktiviert ist\) |
| `metadata` | json | Metadaten zur Massenerstellung einschließlich Anzahl erstellter und bestehender Kontakte |
### `apollo_contact_bulk_update`
Aktualisieren Sie bis zu 100 bestehende Kontakte gleichzeitig in Ihrer Apollo-Datenbank. Jeder Kontakt muss ein ID-Feld enthalten. Master-Key erforderlich.
#### Input
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Apollo API-Schlüssel \(Master-Key erforderlich\) |
| `contacts` | array | Ja | Array zu aktualisierender Kontakte \(max. 100\). Jeder Kontakt muss ein ID-Feld enthalten und optional first_name, last_name, email, title, account_id, owner_id |
#### Output
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `updated_contacts` | json | Array erfolgreich aktualisierter Kontakte |
| `failed_contacts` | json | Array von Kontakten, deren Aktualisierung fehlgeschlagen ist |
| `metadata` | json | Metadaten zur Massenaktualisierung einschließlich Anzahl aktualisierter und fehlgeschlagener Kontakte |
### `apollo_account_create`
Erstellen Sie ein neues Konto (Unternehmen) in Ihrer Apollo-Datenbank
#### Input
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Apollo API-Schlüssel |
| `name` | string | Ja | Unternehmensname |
| `website_url` | string | Nein | Unternehmens-Website-URL |
| `phone` | string | Nein | Telefonnummer des Unternehmens |
| `owner_id` | string | Nein | Benutzer-ID des Kontoinhabers |
#### Output
| Parameter | Type | Beschreibung |
| --------- | ---- | ----------- |
| `account` | json | Erstellte Kontodaten von Apollo |
| `metadata` | json | Erstellungsmetadaten einschließlich Erstellungsstatus |
### `apollo_account_update`
Aktualisieren eines vorhandenen Kontos in Ihrer Apollo-Datenbank
#### Input
| Parameter | Type | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Apollo API-Schlüssel |
| `account_id` | string | Ja | ID des zu aktualisierenden Kontos |
| `name` | string | Nein | Firmenname |
| `website_url` | string | Nein | Firmen-Website-URL |
| `phone` | string | Nein | Telefonnummer des Unternehmens |
| `owner_id` | string | Nein | Benutzer-ID des Kontoinhabers |
#### Output
| Parameter | Type | Beschreibung |
| --------- | ---- | ----------- |
| `account` | json | Aktualisierte Kontodaten von Apollo |
| `metadata` | json | Aktualisierungsmetadaten einschließlich Aktualisierungsstatus |
### `apollo_account_search`
Durchsuchen Ihres Teams
#### Input
| Parameter | Type | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Apollo API-Schlüssel \(Hauptschlüssel erforderlich\) |
| `q_keywords` | string | Nein | Suchbegriffe für Kontodaten |
| `owner_id` | string | Nein | Filtern nach Benutzer-ID des Kontoinhabers |
| `account_stage_ids` | array | Nein | Filtern nach Kontophase-IDs |
| `page` | number | Nein | Seitennummer für Paginierung |
| `per_page` | number | Nein | Ergebnisse pro Seite \(max: 100\) |
#### Output
| Parameter | Type | Beschreibung |
| --------- | ---- | ----------- |
| `accounts` | json | Array von Konten, die den Suchkriterien entsprechen |
| `metadata` | json | Paginierungsinformationen einschließlich page, per_page und total_entries |
### `apollo_account_bulk_create`
Erstellen Sie bis zu 100 Konten auf einmal in Ihrer Apollo-Datenbank. Hinweis: Apollo wendet keine Deduplizierung an - doppelte Konten können erstellt werden, wenn Einträge ähnliche Namen oder Domains haben. Master-Key erforderlich.
#### Input
| Parameter | Type | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Apollo API-Schlüssel \(Master-Key erforderlich\) |
| `accounts` | array | Ja | Array von zu erstellenden Konten \(max. 100\). Jedes Konto sollte einen Namen \(erforderlich\) und optional website_url, phone, owner_id enthalten |
#### Output
| Parameter | Type | Beschreibung |
| --------- | ---- | ----------- |
| `created_accounts` | json | Array neu erstellter Konten |
| `failed_accounts` | json | Array von Konten, deren Erstellung fehlgeschlagen ist |
| `metadata` | json | Metadaten zur Massenerstellung einschließlich Anzahl erstellter und fehlgeschlagener Konten |
### `apollo_account_bulk_update`
Aktualisieren Sie bis zu 1000 bestehende Konten auf einmal in Ihrer Apollo-Datenbank (höheres Limit als bei Kontakten!). Jedes Konto muss ein id-Feld enthalten. Master-Key erforderlich.
#### Input
| Parameter | Type | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Apollo API-Schlüssel \(Master-Key erforderlich\) |
| `accounts` | array | Ja | Array zu aktualisierender Konten \(max. 1000\). Jedes Konto muss ein id-Feld enthalten und optional name, website_url, phone, owner_id |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `updated_accounts` | json | Array der erfolgreich aktualisierten Konten |
| `failed_accounts` | json | Array der Konten, deren Aktualisierung fehlgeschlagen ist |
| `metadata` | json | Metadaten zur Massenaktualisierung, einschließlich der Anzahl aktualisierter und fehlgeschlagener Konten |
### `apollo_opportunity_create`
Erstellen Sie einen neuen Deal für ein Konto in Ihrer Apollo-Datenbank (Master-Key erforderlich)
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Apollo API-Schlüssel \(Master-Key erforderlich\) |
| `name` | string | Ja | Name der Opportunity/des Deals |
| `account_id` | string | Ja | ID des Kontos, zu dem diese Opportunity gehört |
| `amount` | number | Nein | Geldwert der Opportunity |
| `stage_id` | string | Nein | ID der Deal-Phase |
| `owner_id` | string | Nein | Benutzer-ID des Opportunity-Eigentümers |
| `close_date` | string | Nein | Erwartetes Abschlussdatum \(ISO 8601-Format\) |
| `description` | string | Nein | Beschreibung oder Notizen zur Opportunity |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `opportunity` | json | Erstellte Opportunity-Daten von Apollo |
| `metadata` | json | Erstellungsmetadaten einschließlich Erstellungsstatus |
### `apollo_opportunity_search`
Suchen und listen Sie alle Deals/Opportunities in Ihrem Team auf
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Apollo API-Schlüssel |
| `q_keywords` | string | Nein | Suchbegriffe für die Suche in Opportunity-Namen |
| `account_ids` | array | Nein | Nach bestimmten Account-IDs filtern |
| `stage_ids` | array | Nein | Nach Deal-Phase-IDs filtern |
| `owner_ids` | array | Nein | Nach Opportunity-Besitzer-IDs filtern |
| `page` | number | Nein | Seitennummer für Paginierung |
| `per_page` | number | Nein | Ergebnisse pro Seite \(max: 100\) |
#### Output
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `opportunities` | json | Array von Opportunities, die den Suchkriterien entsprechen |
| `metadata` | json | Paginierungsinformationen einschließlich page, per_page und total_entries |
### `apollo_opportunity_get`
Vollständige Details eines bestimmten Deals/Opportunity anhand der ID abrufen
#### Input
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Apollo API-Schlüssel |
| `opportunity_id` | string | Ja | ID der abzurufenden Opportunity |
#### Output
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `opportunity` | json | Vollständige Opportunity-Daten von Apollo |
| `metadata` | json | Abruf-Metadaten einschließlich Gefunden-Status |
### `apollo_opportunity_update`
Einen bestehenden Deal/Opportunity in Ihrer Apollo-Datenbank aktualisieren
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Apollo API-Schlüssel |
| `opportunity_id` | string | Ja | ID der zu aktualisierenden Opportunity |
| `name` | string | Nein | Name der Opportunity/des Deals |
| `amount` | number | Nein | Geldwert der Opportunity |
| `stage_id` | string | Nein | ID der Deal-Phase |
| `owner_id` | string | Nein | Benutzer-ID des Opportunity-Eigentümers |
| `close_date` | string | Nein | Erwartetes Abschlussdatum (ISO 8601-Format) |
| `description` | string | Nein | Beschreibung oder Notizen zur Opportunity |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `opportunity` | json | Aktualisierte Opportunity-Daten von Apollo |
| `metadata` | json | Aktualisierungsmetadaten einschließlich Aktualisierungsstatus |
### `apollo_sequence_search`
Suche nach Sequenzen/Kampagnen in deinem Team
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Apollo API-Schlüssel (Master-Schlüssel erforderlich) |
| `q_name` | string | Nein | Sequenzen nach Namen durchsuchen |
| `active` | boolean | Nein | Nach Aktivitätsstatus filtern (true für aktive Sequenzen, false für inaktive) |
| `page` | number | Nein | Seitennummer für Paginierung |
| `per_page` | number | Nein | Ergebnisse pro Seite (max: 100) |
#### Output
| Parameter | Type | Beschreibung |
| --------- | ---- | ----------- |
| `sequences` | json | Array von Sequenzen/Kampagnen, die den Suchkriterien entsprechen |
| `metadata` | json | Paginierungsinformationen einschließlich page, per_page und total_entries |
### `apollo_sequence_add_contacts`
Kontakte zu einer Apollo-Sequenz hinzufügen
#### Input
| Parameter | Type | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Apollo API-Schlüssel (Master-Schlüssel erforderlich) |
| `sequence_id` | string | Ja | ID der Sequenz, zu der Kontakte hinzugefügt werden sollen |
| `contact_ids` | array | Ja | Array von Kontakt-IDs, die zur Sequenz hinzugefügt werden sollen |
| `emailer_campaign_id` | string | Nein | Optionale E-Mail-Kampagnen-ID |
| `send_email_from_user_id` | string | Nein | Benutzer-ID, von der E-Mails gesendet werden sollen |
#### Output
| Parameter | Type | Beschreibung |
| --------- | ---- | ----------- |
| `contacts_added` | json | Array von Kontakt-IDs, die zur Sequenz hinzugefügt wurden |
| `metadata` | json | Sequenz-Metadaten einschließlich sequence_id und total_added Anzahl |
### `apollo_task_create`
Eine neue Aufgabe in Apollo erstellen
#### Input
| Parameter | Type | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Apollo API-Schlüssel (Master-Schlüssel erforderlich) |
| `note` | string | Ja | Aufgabennotiz/Beschreibung |
| `contact_id` | string | Nein | Zu verknüpfende Kontakt-ID |
| `account_id` | string | Nein | Zu verknüpfende Account-ID |
| `due_at` | string | Nein | Fälligkeitsdatum im ISO-Format |
| `priority` | string | Nein | Aufgabenpriorität |
| `type` | string | Nein | Aufgabentyp |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `task` | json | Erstellte Aufgabendaten von Apollo |
| `metadata` | json | Erstellungsmetadaten einschließlich des Erstellungsstatus |
### `apollo_task_search`
Suche nach Aufgaben in Apollo
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Apollo API-Schlüssel (Master-Schlüssel erforderlich) |
| `contact_id` | string | Nein | Nach Kontakt-ID filtern |
| `account_id` | string | Nein | Nach Konto-ID filtern |
| `completed` | boolean | Nein | Nach Abschlussstatus filtern |
| `page` | number | Nein | Seitennummer für Paginierung |
| `per_page` | number | Nein | Ergebnisse pro Seite (max: 100) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `tasks` | json | Array von Aufgaben, die den Suchkriterien entsprechen |
| `metadata` | json | Paginierungsinformationen einschließlich Seite, pro_Seite und Gesamteinträge |
### `apollo_email_accounts`
Liste des Teams abrufen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Apollo API-Schlüssel (Master-Schlüssel erforderlich) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `email_accounts` | json | Array von Team-E-Mail-Konten, die in Apollo verknüpft sind |
| `metadata` | json | Metadaten einschließlich der Gesamtanzahl von E-Mail-Konten |
## Notizen
- Kategorie: `tools`
- Typ: `apollo`

View File

@@ -0,0 +1,172 @@
---
title: Calendly
description: Verwalte Calendly-Terminplanung und Ereignisse
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="calendly"
color="#FFFFFF"
/>
{/* MANUAL-CONTENT-START:intro */}
[Calendly](https://calendly.com/) ist eine beliebte Plattform zur Terminplanungsautomatisierung, die Ihnen hilft, Meetings, Events und Termine mühelos zu buchen. Mit Calendly können Teams und Einzelpersonen die Terminplanung optimieren, den E-Mail-Austausch reduzieren und Aufgaben rund um Veranstaltungen automatisieren.
Mit der Sim Calendly-Integration können Ihre Agenten:
- **Informationen über Ihr Konto und geplante Ereignisse abrufen**: Verwenden Sie Tools, um Benutzerinformationen, Ereignistypen und geplante Ereignisse für Analysen oder Automatisierungen abzurufen.
- **Ereignistypen und Terminplanung verwalten**: Greifen Sie auf verfügbare Ereignistypen für Benutzer oder Organisationen zu und listen Sie diese auf, rufen Sie Details zu bestimmten Ereignistypen ab und überwachen Sie geplante Meetings und Teilnehmerdaten.
- **Automatisieren Sie Follow-ups und Workflows**: Wenn Benutzer Meetings planen, umplanen oder stornieren, können Sim-Agenten automatisch entsprechende Workflows auslösen wie das Senden von Erinnerungen, das Aktualisieren von CRMs oder das Benachrichtigen von Teilnehmern.
- **Einfache Integration über Webhooks**: Richten Sie Sim-Workflows ein, um auf Calendly-Webhook-Ereignisse in Echtzeit zu reagieren, einschließlich wenn Eingeladene Termine planen, stornieren oder mit Routing-Formularen interagieren.
Ob Sie die Meeting-Vorbereitung automatisieren, Einladungen verwalten oder benutzerdefinierte Workflows als Reaktion auf Planungsaktivitäten ausführen möchten die Calendly-Tools in Sim bieten Ihnen flexiblen und sicheren Zugriff. Erschließen Sie neue Automatisierungsmöglichkeiten, indem Sie sofort auf Planungsänderungen reagieren und optimieren Sie so die Abläufe und die Kommunikation Ihres Teams.
{/* MANUAL-CONTENT-END */}
## Nutzungsanweisungen
Integrieren Sie Calendly in Ihren Workflow. Verwalten Sie Ereignistypen, geplante Ereignisse, Eingeladene und Webhooks. Kann auch Workflows basierend auf Calendly-Webhook-Ereignissen auslösen (Eingeladener hat Termin vereinbart, Eingeladener hat storniert, Routing-Formular wurde eingereicht). Erfordert einen persönlichen Zugriffstoken.
## Tools
### `calendly_get_current_user`
Informationen über den aktuell authentifizierten Calendly-Benutzer abrufen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Calendly persönlicher Zugriffstoken |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `resource` | object | Informationen zum aktuellen Benutzer |
### `calendly_list_event_types`
Eine Liste aller Ereignistypen für einen Benutzer oder eine Organisation abrufen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Calendly persönliches Zugriffstoken |
| `user` | string | Nein | Nur Ereignistypen zurückgeben, die zu diesem Benutzer gehören \(URI-Format\) |
| `organization` | string | Nein | Nur Ereignistypen zurückgeben, die zu dieser Organisation gehören \(URI-Format\) |
| `count` | number | Nein | Anzahl der Ergebnisse pro Seite \(Standard: 20, max: 100\) |
| `pageToken` | string | Nein | Seitentoken für Paginierung |
| `sort` | string | Nein | Sortierreihenfolge für Ergebnisse \(z.B. "name:asc", "name:desc"\) |
| `active` | boolean | Nein | Bei true werden nur aktive Ereignistypen angezeigt. Bei false oder nicht ausgewählt werden alle Ereignistypen angezeigt \(sowohl aktive als auch inaktive\). |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `collection` | array | Array von Ereignistyp-Objekten |
### `calendly_get_event_type`
Detaillierte Informationen über einen bestimmten Ereignistyp abrufen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Calendly persönliches Zugriffstoken |
| `eventTypeUuid` | string | Ja | Ereignistyp-UUID \(kann vollständige URI oder nur die UUID sein\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `resource` | object | Details zum Ereignistyp |
### `calendly_list_scheduled_events`
Eine Liste geplanter Ereignisse für einen Benutzer oder eine Organisation abrufen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Calendly persönliches Zugriffstoken |
| `user` | string | Nein | Gibt Ereignisse zurück, die zu diesem Benutzer gehören \(URI-Format\). Entweder "user" oder "organization" muss angegeben werden. |
| `organization` | string | Nein | Gibt Ereignisse zurück, die zu dieser Organisation gehören \(URI-Format\). Entweder "user" oder "organization" muss angegeben werden. |
| `invitee_email` | string | Nein | Gibt Ereignisse zurück, bei denen der Eingeladene diese E-Mail hat |
| `count` | number | Nein | Anzahl der Ergebnisse pro Seite \(Standard: 20, max: 100\) |
| `max_start_time` | string | Nein | Gibt Ereignisse mit Startzeit vor diesem Zeitpunkt zurück \(ISO 8601-Format\) |
| `min_start_time` | string | Nein | Gibt Ereignisse mit Startzeit nach diesem Zeitpunkt zurück \(ISO 8601-Format\) |
| `pageToken` | string | Nein | Seitentoken für Paginierung |
| `sort` | string | Nein | Sortierreihenfolge für Ergebnisse \(z.B. "start_time:asc", "start_time:desc"\) |
| `status` | string | Nein | Nach Status filtern \("active" oder "canceled"\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `collection` | array | Array von geplanten Ereignisobjekten |
### `calendly_get_scheduled_event`
Detaillierte Informationen über ein bestimmtes geplantes Ereignis abrufen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Calendly persönliches Zugriffstoken |
| `eventUuid` | string | Ja | UUID des geplanten Ereignisses \(kann vollständige URI oder nur die UUID sein\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `resource` | object | Details zum geplanten Ereignis |
### `calendly_list_event_invitees`
Eine Liste der Eingeladenen für ein geplantes Ereignis abrufen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Calendly persönliches Zugriffstoken |
| `eventUuid` | string | Ja | UUID des geplanten Ereignisses \(kann vollständige URI oder nur die UUID sein\) |
| `count` | number | Nein | Anzahl der Ergebnisse pro Seite \(Standard: 20, max: 100\) |
| `email` | string | Nein | Eingeladene nach E-Mail-Adresse filtern |
| `pageToken` | string | Nein | Seitentoken für Paginierung |
| `sort` | string | Nein | Sortierreihenfolge für Ergebnisse \(z.B. "created_at:asc", "created_at:desc"\) |
| `status` | string | Nein | Nach Status filtern \("active" oder "canceled"\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `collection` | array | Array von Eingeladenen-Objekten |
### `calendly_cancel_event`
Ein geplantes Ereignis stornieren
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Ja | Calendly persönliches Zugriffstoken |
| `eventUuid` | string | Ja | UUID des zu stornierenden geplanten Ereignisses \(kann vollständige URI oder nur die UUID sein\) |
| `reason` | string | Nein | Grund für die Stornierung \(wird an Eingeladene gesendet\) |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `resource` | object | Stornierungsdetails |
## Hinweise
- Kategorie: `tools`
- Typ: `calendly`

View File

@@ -24,9 +24,11 @@ Füge eine neue Erinnerung zur Datenbank hinzu oder ergänze bestehende Erinneru
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `id` | string | Ja | Kennung für die Erinnerung. Wenn bereits eine Erinnerung mit dieser ID existiert, werden die neuen Daten hinzugefügt. |
| `role` | string | Ja | Rolle für Agent-Erinnerung \(user, assistant oder system\) |
| `conversationId` | string | Nein | Konversationskennung (z.B. user-123, session-abc). Wenn bereits eine Erinnerung mit dieser conversationId für diesen Block existiert, wird die neue Nachricht angehängt. |
| `id` | string | Nein | Legacy-Parameter für die Konversationskennung. Verwenden Sie stattdessen conversationId. Für Abwärtskompatibilität bereitgestellt. |
| `role` | string | Ja | Rolle für Agent-Erinnerung (user, assistant oder system) |
| `content` | string | Ja | Inhalt für Agent-Erinnerung |
| `blockId` | string | Nein | Optionale Block-ID. Wenn nicht angegeben, wird die aktuelle Block-ID aus dem Ausführungskontext verwendet oder standardmäßig "default" gesetzt. |
#### Ausgabe
@@ -38,22 +40,25 @@ Füge eine neue Erinnerung zur Datenbank hinzu oder ergänze bestehende Erinneru
### `memory_get`
Einen bestimmten Speicher anhand seiner ID abrufen
Erinnerungen nach conversationId, blockId, blockName oder einer Kombination abrufen. Gibt alle übereinstimmenden Erinnerungen zurück.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `id` | string | Ja | Kennung für den abzurufenden Speicher |
| `conversationId` | string | Nein | Konversationskennung (z.B. user-123, session-abc). Wenn allein angegeben, werden alle Erinnerungen für diese Konversation über alle Blöcke hinweg zurückgegeben. |
| `id` | string | Nein | Legacy-Parameter für die Konversationskennung. Verwenden Sie stattdessen conversationId. Für Abwärtskompatibilität bereitgestellt. |
| `blockId` | string | Nein | Block-Kennung. Wenn allein angegeben, werden alle Erinnerungen für diesen Block über alle Konversationen hinweg zurückgegeben. Wenn mit conversationId angegeben, werden Erinnerungen für diese spezifische Konversation in diesem Block zurückgegeben. |
| `blockName` | string | Nein | Blockname. Alternative zu blockId. Wenn allein angegeben, werden alle Erinnerungen für Blöcke mit diesem Namen zurückgegeben. Wenn mit conversationId angegeben, werden Erinnerungen für diese Konversation in Blöcken mit diesem Namen zurückgegeben. |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Ob der Speicher erfolgreich abgerufen wurde |
| `memories` | array | Array von Speicherdaten für die angeforderte ID |
| `success` | boolean | Ob die Erinnerung erfolgreich abgerufen wurde |
| `memories` | array | Array von Speicherobjekten mit conversationId, blockId, blockName und data-Feldern |
| `message` | string | Erfolgs- oder Fehlermeldung |
| `error` | string | Fehlermeldung, falls der Vorgang fehlgeschlagen ist |
| `error` | string | Fehlermeldung, wenn der Vorgang fehlgeschlagen ist |
### `memory_get_all`
@@ -68,20 +73,23 @@ Alle Speicher aus der Datenbank abrufen
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `success` | boolean | Ob alle Speicher erfolgreich abgerufen wurden |
| `memories` | array | Array aller Speicherobjekte mit Schlüsseln, Typen und Daten |
| `success` | boolean | Ob alle Erinnerungen erfolgreich abgerufen wurden |
| `memories` | array | Array aller Speicherobjekte mit key, conversationId, blockId, blockName und data-Feldern |
| `message` | string | Erfolgs- oder Fehlermeldung |
| `error` | string | Fehlermeldung, falls der Vorgang fehlgeschlagen ist |
| `error` | string | Fehlermeldung, wenn der Vorgang fehlgeschlagen ist |
### `memory_delete`
Eine bestimmte Erinnerung anhand ihrer ID löschen
Löschen von Erinnerungen nach conversationId, blockId, blockName oder einer Kombination davon. Unterstützt Massenlöschung.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `id` | string | Ja | Kennung für die zu löschende Erinnerung |
| `conversationId` | string | Nein | Konversationskennung (z.B. user-123, session-abc). Wenn allein angegeben, werden alle Erinnerungen für diese Konversation über alle Blöcke hinweg gelöscht. |
| `id` | string | Nein | Legacy-Parameter für die Konversationskennung. Verwenden Sie stattdessen conversationId. Für Abwärtskompatibilität bereitgestellt. |
| `blockId` | string | Nein | Block-Kennung. Wenn allein angegeben, werden alle Erinnerungen für diesen Block über alle Konversationen hinweg gelöscht. Wenn mit conversationId angegeben, werden Erinnerungen für diese spezifische Konversation in diesem Block gelöscht. |
| `blockName` | string | Nein | Blockname. Alternative zu blockId. Wenn allein angegeben, werden alle Erinnerungen für Blöcke mit diesem Namen gelöscht. Wenn mit conversationId angegeben, werden Erinnerungen für diese Konversation in Blöcken mit diesem Namen gelöscht. |
#### Ausgabe

View File

@@ -26,7 +26,7 @@ In Sim bietet die Microsoft Excel-Integration nahtlosen Zugriff auf Tabellenkalk
## Nutzungsanweisungen
Integrieren Sie Microsoft Excel in den Workflow. Kann Tabellen lesen, schreiben, aktualisieren und ergänzen. Erfordert OAuth.
Integrieren Sie Microsoft Excel in den Workflow. Kann lesen, schreiben, aktualisieren, zu Tabellen hinzufügen und neue Arbeitsblätter erstellen.
## Tools
@@ -91,6 +91,23 @@ Neue Zeilen zu einer Microsoft Excel-Tabelle hinzufügen
| `values` | array | Array von Zeilen, die zur Tabelle hinzugefügt wurden |
| `metadata` | object | Metadaten der Tabellenkalkulation |
### `microsoft_excel_worksheet_add`
Ein neues Arbeitsblatt (Tabellenblatt) in einer Microsoft Excel-Arbeitsmappe erstellen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `spreadsheetId` | string | Ja | Die ID der Excel-Arbeitsmappe, zu der das Arbeitsblatt hinzugefügt werden soll |
| `worksheetName` | string | Ja | Der Name des neuen Arbeitsblatts. Muss innerhalb der Arbeitsmappe eindeutig sein und darf 31 Zeichen nicht überschreiten |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `worksheet` | object | Details des neu erstellten Arbeitsblatts |
## Hinweise
- Kategorie: `tools`

View File

@@ -0,0 +1,172 @@
---
title: Neo4j
description: Verbindung zur Neo4j-Graphdatenbank
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="neo4j"
color="#FFFFFF"
/>
## Nutzungsanleitung
Integrieren Sie die Neo4j-Graphdatenbank in den Workflow. Kann Knoten und Beziehungen abfragen, erstellen, zusammenführen, aktualisieren und löschen.
## Tools
### `neo4j_query`
Führen Sie MATCH-Abfragen aus, um Knoten und Beziehungen aus der Neo4j-Graphdatenbank zu lesen. Für beste Leistung und zur Vermeidung großer Ergebnismengen, fügen Sie LIMIT in Ihre Abfrage ein (z.B.
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `host` | string | Ja | Neo4j-Server-Hostname oder IP-Adresse |
| `port` | number | Ja | Neo4j-Server-Port \(Standard: 7687 für Bolt-Protokoll\) |
| `database` | string | Ja | Datenbankname für die Verbindung |
| `username` | string | Ja | Neo4j-Benutzername |
| `password` | string | Ja | Neo4j-Passwort |
| `encryption` | string | Nein | Verbindungsverschlüsselungsmodus \(enabled, disabled\) |
| `cypherQuery` | string | Ja | Auszuführende Cypher-Abfrage \(typischerweise MATCH-Anweisungen\) |
| `parameters` | object | Nein | Parameter für die Cypher-Abfrage als JSON-Objekt. Verwenden Sie diese für dynamische Werte einschließlich LIMIT \(z.B. query: "MATCH \(n\) RETURN n LIMIT $limit", parameters: \{limit: 100\}\). |
| `parameters` | string | Nein | Keine Beschreibung |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `message` | string | Statusmeldung der Operation |
| `records` | array | Array von Datensätzen, die von der Abfrage zurückgegeben wurden |
| `recordCount` | number | Anzahl der zurückgegebenen Datensätze |
| `summary` | json | Zusammenfassung der Abfrageausführung mit Zeitangaben und Zählern |
### `neo4j_create`
Führe CREATE-Anweisungen aus, um neue Knoten und Beziehungen zur Neo4j-Graphdatenbank hinzuzufügen
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `host` | string | Ja | Neo4j-Server-Hostname oder IP-Adresse |
| `port` | number | Ja | Neo4j-Server-Port \(Standard: 7687 für Bolt-Protokoll\) |
| `database` | string | Ja | Datenbankname, zu dem verbunden werden soll |
| `username` | string | Ja | Neo4j-Benutzername |
| `password` | string | Ja | Neo4j-Passwort |
| `encryption` | string | Nein | Verbindungsverschlüsselungsmodus \(enabled, disabled\) |
| `cypherQuery` | string | Ja | Auszuführende Cypher CREATE-Anweisung |
| `parameters` | object | Nein | Parameter für die Cypher-Abfrage als JSON-Objekt |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `message` | string | Statusmeldung der Operation |
| `summary` | json | Erstellungszusammenfassung mit Zählern für erstellte Knoten und Beziehungen |
### `neo4j_merge`
Führe MERGE-Anweisungen aus, um Knoten und Beziehungen in Neo4j zu finden oder zu erstellen (Upsert-Operation)
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `host` | string | Ja | Neo4j-Server-Hostname oder IP-Adresse |
| `port` | number | Ja | Neo4j-Server-Port \(Standard: 7687 für Bolt-Protokoll\) |
| `database` | string | Ja | Datenbankname, zu dem verbunden werden soll |
| `username` | string | Ja | Neo4j-Benutzername |
| `password` | string | Ja | Neo4j-Passwort |
| `encryption` | string | Nein | Verbindungsverschlüsselungsmodus \(enabled, disabled\) |
| `cypherQuery` | string | Ja | Auszuführende Cypher MERGE-Anweisung |
| `parameters` | object | Nein | Parameter für die Cypher-Abfrage als JSON-Objekt |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `message` | string | Statusmeldung der Operation |
| `summary` | json | Zusammenfassung der Zusammenführung mit Zählern für erstellte oder zugeordnete Knoten/Beziehungen |
### `neo4j_update`
Führt SET-Anweisungen aus, um Eigenschaften vorhandener Knoten und Beziehungen in Neo4j zu aktualisieren
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `host` | string | Yes | Neo4j-Server-Hostname oder IP-Adresse |
| `port` | number | Yes | Neo4j-Server-Port \(Standard: 7687 für Bolt-Protokoll\) |
| `database` | string | Yes | Datenbankname, zu dem eine Verbindung hergestellt werden soll |
| `username` | string | Yes | Neo4j-Benutzername |
| `password` | string | Yes | Neo4j-Passwort |
| `encryption` | string | No | Verbindungsverschlüsselungsmodus \(enabled, disabled\) |
| `cypherQuery` | string | Yes | Cypher-Abfrage mit MATCH- und SET-Anweisungen zum Aktualisieren von Eigenschaften |
| `parameters` | object | No | Parameter für die Cypher-Abfrage als JSON-Objekt |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `message` | string | Statusmeldung der Operation |
| `summary` | json | Aktualisierungszusammenfassung mit Zählern für gesetzte Eigenschaften |
### `neo4j_delete`
Führt DELETE- oder DETACH DELETE-Anweisungen aus, um Knoten und Beziehungen aus Neo4j zu entfernen
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `host` | string | Yes | Neo4j-Server-Hostname oder IP-Adresse |
| `port` | number | Yes | Neo4j-Server-Port \(Standard: 7687 für Bolt-Protokoll\) |
| `database` | string | Yes | Datenbankname, zu dem eine Verbindung hergestellt werden soll |
| `username` | string | Yes | Neo4j-Benutzername |
| `password` | string | Yes | Neo4j-Passwort |
| `encryption` | string | No | Verbindungsverschlüsselungsmodus \(enabled, disabled\) |
| `cypherQuery` | string | Yes | Cypher-Abfrage mit MATCH- und DELETE/DETACH DELETE-Anweisungen |
| `parameters` | object | No | Parameter für die Cypher-Abfrage als JSON-Objekt |
| `detach` | boolean | No | Ob DETACH DELETE verwendet werden soll, um Beziehungen zu entfernen, bevor Knoten gelöscht werden |
#### Output
| Parameter | Type | Beschreibung |
| --------- | ---- | ----------- |
| `message` | string | Statusmeldung der Operation |
| `summary` | json | Löschzusammenfassung mit Zählern für gelöschte Knoten und Beziehungen |
### `neo4j_execute`
Führt beliebige Cypher-Abfragen auf der Neo4j-Graphdatenbank für komplexe Operationen aus
#### Input
| Parameter | Type | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `host` | string | Ja | Neo4j-Server-Hostname oder IP-Adresse |
| `port` | number | Ja | Neo4j-Server-Port (Standard: 7687 für Bolt-Protokoll) |
| `database` | string | Ja | Datenbankname für die Verbindung |
| `username` | string | Ja | Neo4j-Benutzername |
| `password` | string | Ja | Neo4j-Passwort |
| `encryption` | string | Nein | Verbindungsverschlüsselungsmodus (enabled, disabled) |
| `cypherQuery` | string | Ja | Auszuführende Cypher-Abfrage (jede gültige Cypher-Anweisung) |
| `parameters` | object | Nein | Parameter für die Cypher-Abfrage als JSON-Objekt |
#### Output
| Parameter | Type | Beschreibung |
| --------- | ---- | ----------- |
| `message` | string | Statusmeldung der Operation |
| `records` | array | Array von Datensätzen, die von der Abfrage zurückgegeben wurden |
| `recordCount` | number | Anzahl der zurückgegebenen Datensätze |
| `summary` | json | Ausführungszusammenfassung mit Zeiterfassung und Zählern |
## Hinweise
- Kategorie: `tools`
- Typ: `neo4j`

View File

@@ -71,8 +71,10 @@ Senden Sie Nachrichten an Slack-Kanäle oder Benutzer über die Slack-API. Unter
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `ts` | string | Zeitstempel der Nachricht |
| `channel` | string | Kanal-ID, wohin die Nachricht gesendet wurde |
| `message` | object | Vollständiges Nachrichtenobjekt mit allen von Slack zurückgegebenen Eigenschaften |
| `ts` | string | Nachrichtenzeitstempel |
| `channel` | string | Kanal-ID, in dem die Nachricht gesendet wurde |
| `fileCount` | number | Anzahl der hochgeladenen Dateien \(wenn Dateien angehängt sind\) |
### `slack_canvas`
@@ -155,6 +157,7 @@ Eine zuvor vom Bot in Slack gesendete Nachricht aktualisieren
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `message` | object | Vollständiges aktualisiertes Nachrichtenobjekt mit allen von Slack zurückgegebenen Eigenschaften |
| `content` | string | Erfolgsmeldung |
| `metadata` | object | Metadaten der aktualisierten Nachricht |

View File

@@ -0,0 +1,117 @@
---
title: Speech-to-Text
description: Konvertiere Sprache in Text mit KI
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="stt"
color="#181C1E"
/>
{/* MANUAL-CONTENT-START:intro */}
Transkribiere Sprache zu Text mit modernsten KI-Modellen führender Anbieter. Die Sim Speech-to-Text (STT)-Tools ermöglichen es dir, Audio- und Videodateien in präzise Transkripte umzuwandeln, mit Unterstützung für mehrere Sprachen, Zeitstempel und optionaler Übersetzung.
Unterstützte Anbieter:
- **[OpenAI Whisper](https://platform.openai.com/docs/guides/speech-to-text/overview)**: Fortschrittliches Open-Source-STT-Modell von OpenAI. Unterstützt Modelle wie `whisper-1` und verarbeitet eine Vielzahl von Sprachen und Audioformaten.
- **[Deepgram](https://deepgram.com/)**: Echtzeit- und Batch-STT-API mit Deep-Learning-Modellen wie `nova-3`, `nova-2` und `whisper-large`. Bietet Funktionen wie Sprechererkennung, Intentionserkennung und branchenspezifische Anpassungen.
- **[ElevenLabs](https://elevenlabs.io/)**: Bekannt für hochwertige Sprach-KI, bietet ElevenLabs STT-Modelle mit Fokus auf Genauigkeit und natürlichem Sprachverständnis für zahlreiche Sprachen und Dialekte.
Wähle den Anbieter und das Modell, das am besten zu deiner Aufgabe passt sei es schnelle, produktionsreife Transkription (Deepgram), hochpräzise Mehrsprachenfähigkeit (Whisper) oder fortschrittliches Verständnis und Sprachabdeckung (ElevenLabs).
{/* MANUAL-CONTENT-END */}
## Nutzungsanleitung
Transkribiere Audio- und Videodateien zu Text mit führenden KI-Anbietern. Unterstützt mehrere Sprachen, Zeitstempel und Sprechererkennung.
## Tools
### `stt_whisper`
Transkribiere Audio zu Text mit OpenAI Whisper
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `provider` | string | Ja | STT-Anbieter \(whisper\) |
| `apiKey` | string | Ja | OpenAI API-Schlüssel |
| `model` | string | Nein | Zu verwendendes Whisper-Modell \(Standard: whisper-1\) |
| `audioFile` | file | Nein | Zu transkribierende Audio- oder Videodatei |
| `audioFileReference` | file | Nein | Verweis auf Audio-/Videodatei aus vorherigen Blöcken |
| `audioUrl` | string | Nein | URL zu Audio- oder Videodatei |
| `language` | string | Nein | Sprachcode \(z.B. "en", "es", "fr"\) oder "auto" für automatische Erkennung |
| `timestamps` | string | Nein | Zeitstempel-Granularität: none, sentence oder word |
| `translateToEnglish` | boolean | Nein | Audio ins Englische übersetzen |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `transcript` | string | Vollständig transkribierter Text |
| `segments` | array | Segmente mit Zeitstempeln |
| `language` | string | Erkannte oder angegebene Sprache |
| `duration` | number | Audiodauer in Sekunden |
| `confidence` | number | Gesamter Konfidenzwert |
### `stt_deepgram`
Audio mit Deepgram in Text transkribieren
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `provider` | string | Ja | STT-Anbieter (deepgram) |
| `apiKey` | string | Ja | Deepgram API-Schlüssel |
| `model` | string | Nein | Zu verwendendes Deepgram-Modell (nova-3, nova-2, whisper-large, etc.) |
| `audioFile` | file | Nein | Zu transkribierendes Audio- oder Videodatei |
| `audioFileReference` | file | Nein | Referenz auf Audio-/Videodatei aus vorherigen Blöcken |
| `audioUrl` | string | Nein | URL zu Audio- oder Videodatei |
| `language` | string | Nein | Sprachcode (z.B. "en", "es", "fr") oder "auto" für automatische Erkennung |
| `timestamps` | string | Nein | Zeitstempel-Granularität: none, sentence oder word |
| `diarization` | boolean | Nein | Sprechererkennung aktivieren |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `transcript` | string | Vollständig transkribierter Text |
| `segments` | array | Segmente mit Zeitstempeln und Sprecherkennungen |
| `language` | string | Erkannte oder angegebene Sprache |
| `duration` | number | Audiodauer in Sekunden |
| `confidence` | number | Gesamter Konfidenzwert |
### `stt_elevenlabs`
Audio in Text transkribieren mit ElevenLabs
#### Eingabe
| Parameter | Typ | Erforderlich | Beschreibung |
| --------- | ---- | -------- | ----------- |
| `provider` | string | Ja | STT-Anbieter \(elevenlabs\) |
| `apiKey` | string | Ja | ElevenLabs API-Schlüssel |
| `model` | string | Nein | Zu verwendenes ElevenLabs-Modell \(scribe_v1, scribe_v1_experimental\) |
| `audioFile` | file | Nein | Audio- oder Videodatei zur Transkription |
| `audioFileReference` | file | Nein | Referenz zu Audio-/Videodatei aus vorherigen Blöcken |
| `audioUrl` | string | Nein | URL zu Audio- oder Videodatei |
| `language` | string | Nein | Sprachcode \(z.B. "en", "es", "fr"\) oder "auto" für automatische Erkennung |
| `timestamps` | string | Nein | Zeitstempel-Granularität: none, sentence oder word |
#### Ausgabe
| Parameter | Typ | Beschreibung |
| --------- | ---- | ----------- |
| `transcript` | string | Vollständig transkribierter Text |
| `segments` | array | Segmente mit Zeitstempeln |
| `language` | string | Erkannte oder angegebene Sprache |
| `duration` | number | Audiodauer in Sekunden |
| `confidence` | number | Gesamter Konfidenzwert |
## Hinweise
- Kategorie: `tools`
- Typ: `stt`

View File

@@ -42,10 +42,10 @@ The user prompt represents the primary input data for inference processing. This
The Agent block supports multiple LLM providers through a unified inference interface. Available models include:
- **OpenAI**: GPT-5, GPT-4o, o1, o3, o4-mini, gpt-4.1
- **Anthropic**: Claude 3.7 Sonnet
- **OpenAI**: GPT-5.1, GPT-5, GPT-4o, o1, o3, o4-mini, gpt-4.1
- **Anthropic**: Claude 4.5 Sonnet, Claude Opus 4.1
- **Google**: Gemini 2.5 Pro, Gemini 2.0 Flash
- **Other Providers**: Groq, Cerebras, xAI, DeepSeek
- **Other Providers**: Groq, Cerebras, xAI, Azure OpenAI, OpenRouter
- **Local Models**: Ollama-compatible models
### Temperature

View File

@@ -0,0 +1,579 @@
---
title: Apollo
description: Search, enrich, and manage contacts with Apollo.io
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="apollo"
color="#EBF212"
/>
{/* MANUAL-CONTENT-START:intro */}
[Apollo.io](https://apollo.io/) is a leading sales intelligence and engagement platform that empowers users to find, enrich, and engage contacts and companies at scale. Apollo.io combines an extensive contact database with robust enrichment and workflow automation tools, assisting sales, marketing, and recruiting teams to accelerate growth.
With Apollo.io, you can:
- **Search millions of contacts and companies**: Find precise leads using advanced filters
- **Enrich leads and accounts**: Fill in missing details with verified data and up-to-date information
- **Manage and organize CRM records**: Keep your people and company data accurate and actionable
- **Automate outreach**: Add contacts to sequences and create follow-up tasks directly from Apollo.io
In Sim, the Apollo.io integration allows your agents to perform core Apollo operations programmatically:
- **Search people and companies**: Use `apollo_people_search` to discover new leads using flexible filters.
- **Enrich people data**: Use `apollo_people_enrich` to augment contacts with verified information.
- **Enrich people in bulk**: Use `apollo_people_bulk_enrich` for large-scale enrichment of multiple contacts at once.
- **Search and enrich companies**: Use `apollo_company_search` and `apollo_company_enrich` to discover and update key company information.
This enables your agents to build powerful workflows for prospecting, CRM enrichment, and automation without manual data entry or switching tabs. Integrate Apollo.io as a dynamic data source and CRM engine — empowering your agents to identify, qualify, and reach out to leads seamlessly as part of their daily operations.
{/* MANUAL-CONTENT-END */}
## Usage Instructions
Integrates Apollo.io into the workflow. Search for people and companies, enrich contact data, manage your CRM contacts and accounts, add contacts to sequences, and create tasks.
## Tools
### `apollo_people_search`
Search Apollo
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Yes | Apollo API key |
| `person_titles` | array | No | Job titles to search for \(e.g., \["CEO", "VP of Sales"\]\) |
| `person_locations` | array | No | Locations to search in \(e.g., \["San Francisco, CA", "New York, NY"\]\) |
| `person_seniorities` | array | No | Seniority levels \(e.g., \["senior", "executive", "manager"\]\) |
| `organization_names` | array | No | Company names to search within |
| `q_keywords` | string | No | Keywords to search for |
| `page` | number | No | Page number for pagination \(default: 1\) |
| `per_page` | number | No | Results per page \(default: 25, max: 100\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `people` | json | Array of people matching the search criteria |
| `metadata` | json | Pagination information including page, per_page, and total_entries |
### `apollo_people_enrich`
Enrich data for a single person using Apollo
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Yes | Apollo API key |
| `first_name` | string | No | First name of the person |
| `last_name` | string | No | Last name of the person |
| `email` | string | No | Email address of the person |
| `organization_name` | string | No | Company name where the person works |
| `domain` | string | No | Company domain \(e.g., apollo.io\) |
| `linkedin_url` | string | No | LinkedIn profile URL |
| `reveal_personal_emails` | boolean | No | Reveal personal email addresses \(uses credits\) |
| `reveal_phone_number` | boolean | No | Reveal phone numbers \(uses credits\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `person` | json | Enriched person data from Apollo |
| `metadata` | json | Enrichment metadata including enriched status |
### `apollo_people_bulk_enrich`
Enrich data for up to 10 people at once using Apollo
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Yes | Apollo API key |
| `people` | array | Yes | Array of people to enrich \(max 10\) |
| `reveal_personal_emails` | boolean | No | Reveal personal email addresses \(uses credits\) |
| `reveal_phone_number` | boolean | No | Reveal phone numbers \(uses credits\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `people` | json | Array of enriched people data |
| `metadata` | json | Bulk enrichment metadata including total and enriched counts |
### `apollo_organization_search`
Search Apollo
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Yes | Apollo API key |
| `organization_locations` | array | No | Company locations to search |
| `organization_num_employees_ranges` | array | No | Employee count ranges \(e.g., \["1-10", "11-50"\]\) |
| `q_organization_keyword_tags` | array | No | Industry or keyword tags |
| `q_organization_name` | string | No | Organization name to search for |
| `page` | number | No | Page number for pagination |
| `per_page` | number | No | Results per page \(max: 100\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `organizations` | json | Array of organizations matching the search criteria |
| `metadata` | json | Pagination information including page, per_page, and total_entries |
### `apollo_organization_enrich`
Enrich data for a single organization using Apollo
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Yes | Apollo API key |
| `organization_name` | string | No | Name of the organization \(at least one of organization_name or domain is required\) |
| `domain` | string | No | Company domain \(e.g., apollo.io\) \(at least one of domain or organization_name is required\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `organization` | json | Enriched organization data from Apollo |
| `metadata` | json | Enrichment metadata including enriched status |
### `apollo_organization_bulk_enrich`
Enrich data for up to 10 organizations at once using Apollo
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Yes | Apollo API key |
| `organizations` | array | Yes | Array of organizations to enrich \(max 10\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `organizations` | json | Array of enriched organization data |
| `metadata` | json | Bulk enrichment metadata including total and enriched counts |
### `apollo_contact_create`
Create a new contact in your Apollo database
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Yes | Apollo API key |
| `first_name` | string | Yes | First name of the contact |
| `last_name` | string | Yes | Last name of the contact |
| `email` | string | No | Email address of the contact |
| `title` | string | No | Job title |
| `account_id` | string | No | Apollo account ID to associate with |
| `owner_id` | string | No | User ID of the contact owner |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `contact` | json | Created contact data from Apollo |
| `metadata` | json | Creation metadata including created status |
### `apollo_contact_update`
Update an existing contact in your Apollo database
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Yes | Apollo API key |
| `contact_id` | string | Yes | ID of the contact to update |
| `first_name` | string | No | First name of the contact |
| `last_name` | string | No | Last name of the contact |
| `email` | string | No | Email address |
| `title` | string | No | Job title |
| `account_id` | string | No | Apollo account ID |
| `owner_id` | string | No | User ID of the contact owner |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `contact` | json | Updated contact data from Apollo |
| `metadata` | json | Update metadata including updated status |
### `apollo_contact_search`
Search your team
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Yes | Apollo API key |
| `q_keywords` | string | No | Keywords to search for |
| `contact_stage_ids` | array | No | Filter by contact stage IDs |
| `page` | number | No | Page number for pagination |
| `per_page` | number | No | Results per page \(max: 100\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `contacts` | json | Array of contacts matching the search criteria |
| `metadata` | json | Pagination information including page, per_page, and total_entries |
### `apollo_contact_bulk_create`
Create up to 100 contacts at once in your Apollo database. Supports deduplication to prevent creating duplicate contacts. Master key required.
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Yes | Apollo API key \(master key required\) |
| `contacts` | array | Yes | Array of contacts to create \(max 100\). Each contact should include first_name, last_name, and optionally email, title, account_id, owner_id |
| `run_dedupe` | boolean | No | Enable deduplication to prevent creating duplicate contacts. When true, existing contacts are returned without modification |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `created_contacts` | json | Array of newly created contacts |
| `existing_contacts` | json | Array of existing contacts \(when deduplication is enabled\) |
| `metadata` | json | Bulk creation metadata including counts of created and existing contacts |
### `apollo_contact_bulk_update`
Update up to 100 existing contacts at once in your Apollo database. Each contact must include an id field. Master key required.
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Yes | Apollo API key \(master key required\) |
| `contacts` | array | Yes | Array of contacts to update \(max 100\). Each contact must include id field, and optionally first_name, last_name, email, title, account_id, owner_id |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `updated_contacts` | json | Array of successfully updated contacts |
| `failed_contacts` | json | Array of contacts that failed to update |
| `metadata` | json | Bulk update metadata including counts of updated and failed contacts |
### `apollo_account_create`
Create a new account (company) in your Apollo database
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Yes | Apollo API key |
| `name` | string | Yes | Company name |
| `website_url` | string | No | Company website URL |
| `phone` | string | No | Company phone number |
| `owner_id` | string | No | User ID of the account owner |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `account` | json | Created account data from Apollo |
| `metadata` | json | Creation metadata including created status |
### `apollo_account_update`
Update an existing account in your Apollo database
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Yes | Apollo API key |
| `account_id` | string | Yes | ID of the account to update |
| `name` | string | No | Company name |
| `website_url` | string | No | Company website URL |
| `phone` | string | No | Company phone number |
| `owner_id` | string | No | User ID of the account owner |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `account` | json | Updated account data from Apollo |
| `metadata` | json | Update metadata including updated status |
### `apollo_account_search`
Search your team
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Yes | Apollo API key \(master key required\) |
| `q_keywords` | string | No | Keywords to search for in account data |
| `owner_id` | string | No | Filter by account owner user ID |
| `account_stage_ids` | array | No | Filter by account stage IDs |
| `page` | number | No | Page number for pagination |
| `per_page` | number | No | Results per page \(max: 100\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `accounts` | json | Array of accounts matching the search criteria |
| `metadata` | json | Pagination information including page, per_page, and total_entries |
### `apollo_account_bulk_create`
Create up to 100 accounts at once in your Apollo database. Note: Apollo does not apply deduplication - duplicate accounts may be created if entries share similar names or domains. Master key required.
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Yes | Apollo API key \(master key required\) |
| `accounts` | array | Yes | Array of accounts to create \(max 100\). Each account should include name \(required\), and optionally website_url, phone, owner_id |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `created_accounts` | json | Array of newly created accounts |
| `failed_accounts` | json | Array of accounts that failed to create |
| `metadata` | json | Bulk creation metadata including counts of created and failed accounts |
### `apollo_account_bulk_update`
Update up to 1000 existing accounts at once in your Apollo database (higher limit than contacts!). Each account must include an id field. Master key required.
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Yes | Apollo API key \(master key required\) |
| `accounts` | array | Yes | Array of accounts to update \(max 1000\). Each account must include id field, and optionally name, website_url, phone, owner_id |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `updated_accounts` | json | Array of successfully updated accounts |
| `failed_accounts` | json | Array of accounts that failed to update |
| `metadata` | json | Bulk update metadata including counts of updated and failed accounts |
### `apollo_opportunity_create`
Create a new deal for an account in your Apollo database (master key required)
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Yes | Apollo API key \(master key required\) |
| `name` | string | Yes | Name of the opportunity/deal |
| `account_id` | string | Yes | ID of the account this opportunity belongs to |
| `amount` | number | No | Monetary value of the opportunity |
| `stage_id` | string | No | ID of the deal stage |
| `owner_id` | string | No | User ID of the opportunity owner |
| `close_date` | string | No | Expected close date \(ISO 8601 format\) |
| `description` | string | No | Description or notes about the opportunity |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `opportunity` | json | Created opportunity data from Apollo |
| `metadata` | json | Creation metadata including created status |
### `apollo_opportunity_search`
Search and list all deals/opportunities in your team
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Yes | Apollo API key |
| `q_keywords` | string | No | Keywords to search for in opportunity names |
| `account_ids` | array | No | Filter by specific account IDs |
| `stage_ids` | array | No | Filter by deal stage IDs |
| `owner_ids` | array | No | Filter by opportunity owner IDs |
| `page` | number | No | Page number for pagination |
| `per_page` | number | No | Results per page \(max: 100\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `opportunities` | json | Array of opportunities matching the search criteria |
| `metadata` | json | Pagination information including page, per_page, and total_entries |
### `apollo_opportunity_get`
Retrieve complete details of a specific deal/opportunity by ID
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Yes | Apollo API key |
| `opportunity_id` | string | Yes | ID of the opportunity to retrieve |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `opportunity` | json | Complete opportunity data from Apollo |
| `metadata` | json | Retrieval metadata including found status |
### `apollo_opportunity_update`
Update an existing deal/opportunity in your Apollo database
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Yes | Apollo API key |
| `opportunity_id` | string | Yes | ID of the opportunity to update |
| `name` | string | No | Name of the opportunity/deal |
| `amount` | number | No | Monetary value of the opportunity |
| `stage_id` | string | No | ID of the deal stage |
| `owner_id` | string | No | User ID of the opportunity owner |
| `close_date` | string | No | Expected close date \(ISO 8601 format\) |
| `description` | string | No | Description or notes about the opportunity |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `opportunity` | json | Updated opportunity data from Apollo |
| `metadata` | json | Update metadata including updated status |
### `apollo_sequence_search`
Search for sequences/campaigns in your team
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Yes | Apollo API key \(master key required\) |
| `q_name` | string | No | Search sequences by name |
| `active` | boolean | No | Filter by active status \(true for active sequences, false for inactive\) |
| `page` | number | No | Page number for pagination |
| `per_page` | number | No | Results per page \(max: 100\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `sequences` | json | Array of sequences/campaigns matching the search criteria |
| `metadata` | json | Pagination information including page, per_page, and total_entries |
### `apollo_sequence_add_contacts`
Add contacts to an Apollo sequence
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Yes | Apollo API key \(master key required\) |
| `sequence_id` | string | Yes | ID of the sequence to add contacts to |
| `contact_ids` | array | Yes | Array of contact IDs to add to the sequence |
| `emailer_campaign_id` | string | No | Optional emailer campaign ID |
| `send_email_from_user_id` | string | No | User ID to send emails from |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `contacts_added` | json | Array of contact IDs added to the sequence |
| `metadata` | json | Sequence metadata including sequence_id and total_added count |
### `apollo_task_create`
Create a new task in Apollo
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Yes | Apollo API key \(master key required\) |
| `note` | string | Yes | Task note/description |
| `contact_id` | string | No | Contact ID to associate with |
| `account_id` | string | No | Account ID to associate with |
| `due_at` | string | No | Due date in ISO format |
| `priority` | string | No | Task priority |
| `type` | string | No | Task type |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `task` | json | Created task data from Apollo |
| `metadata` | json | Creation metadata including created status |
### `apollo_task_search`
Search for tasks in Apollo
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Yes | Apollo API key \(master key required\) |
| `contact_id` | string | No | Filter by contact ID |
| `account_id` | string | No | Filter by account ID |
| `completed` | boolean | No | Filter by completion status |
| `page` | number | No | Page number for pagination |
| `per_page` | number | No | Results per page \(max: 100\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `tasks` | json | Array of tasks matching the search criteria |
| `metadata` | json | Pagination information including page, per_page, and total_entries |
### `apollo_email_accounts`
Get list of team
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Yes | Apollo API key \(master key required\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `email_accounts` | json | Array of team email accounts linked in Apollo |
| `metadata` | json | Metadata including total count of email accounts |
## Notes
- Category: `tools`
- Type: `apollo`

View File

@@ -0,0 +1,177 @@
---
title: Calendly
description: Manage Calendly scheduling and events
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="calendly"
color="#FFFFFF"
/>
{/* MANUAL-CONTENT-START:intro */}
[Calendly](https://calendly.com/) is a popular scheduling automation platform that helps you book meetings, events, and appointments with ease. With Calendly, teams and individuals can streamline scheduling, reduce back-and-forth emails, and automate tasks around events.
With the Sim Calendly integration, your agents can:
- **Retrieve information about your account and scheduled events**: Use tools to fetch user info, event types, and scheduled events for analysis or automation.
- **Manage event types and scheduling**: Access and list available event types for users or organizations, retrieve details about specific event types, and monitor scheduled meetings and invitee data.
- **Automate follow-ups and workflows**: When users schedule, reschedule, or cancel meetings, Sim agents can automatically trigger corresponding workflows—such as sending reminders, updating CRMs, or notifying participants.
- **Integrate easily using webhooks**: Set up Sim workflows to respond to real-time Calendly webhook events, including when invitees schedule, cancel, or interact with routing forms.
Whether you want to automate meeting prep, manage invites, or run custom workflows in response to scheduling activity, the Calendly tools in Sim give you flexible and secure access. Unlock new automation by reacting instantly to scheduling changes—streamlining your team's operations and communications.
{/* MANUAL-CONTENT-END */}
## Usage Instructions
Integrate Calendly into your workflow. Manage event types, scheduled events, invitees, and webhooks. Can also trigger workflows based on Calendly webhook events (invitee scheduled, invitee canceled, routing form submitted). Requires Personal Access Token.
## Tools
### `calendly_get_current_user`
Get information about the currently authenticated Calendly user
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Yes | Calendly Personal Access Token |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `resource` | object | Current user information |
### `calendly_list_event_types`
Retrieve a list of all event types for a user or organization
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Yes | Calendly Personal Access Token |
| `user` | string | No | Return only event types that belong to this user \(URI format\) |
| `organization` | string | No | Return only event types that belong to this organization \(URI format\) |
| `count` | number | No | Number of results per page \(default: 20, max: 100\) |
| `pageToken` | string | No | Page token for pagination |
| `sort` | string | No | Sort order for results \(e.g., "name:asc", "name:desc"\) |
| `active` | boolean | No | When true, show only active event types. When false or unchecked, show all event types \(both active and inactive\). |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `collection` | array | Array of event type objects |
### `calendly_get_event_type`
Get detailed information about a specific event type
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Yes | Calendly Personal Access Token |
| `eventTypeUuid` | string | Yes | Event type UUID \(can be full URI or just the UUID\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `resource` | object | Event type details |
### `calendly_list_scheduled_events`
Retrieve a list of scheduled events for a user or organization
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Yes | Calendly Personal Access Token |
| `user` | string | No | Return events that belong to this user \(URI format\). Either "user" or "organization" must be provided. |
| `organization` | string | No | Return events that belong to this organization \(URI format\). Either "user" or "organization" must be provided. |
| `invitee_email` | string | No | Return events where invitee has this email |
| `count` | number | No | Number of results per page \(default: 20, max: 100\) |
| `max_start_time` | string | No | Return events with start time before this time \(ISO 8601 format\) |
| `min_start_time` | string | No | Return events with start time after this time \(ISO 8601 format\) |
| `pageToken` | string | No | Page token for pagination |
| `sort` | string | No | Sort order for results \(e.g., "start_time:asc", "start_time:desc"\) |
| `status` | string | No | Filter by status \("active" or "canceled"\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `collection` | array | Array of scheduled event objects |
### `calendly_get_scheduled_event`
Get detailed information about a specific scheduled event
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Yes | Calendly Personal Access Token |
| `eventUuid` | string | Yes | Scheduled event UUID \(can be full URI or just the UUID\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `resource` | object | Scheduled event details |
### `calendly_list_event_invitees`
Retrieve a list of invitees for a scheduled event
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Yes | Calendly Personal Access Token |
| `eventUuid` | string | Yes | Scheduled event UUID \(can be full URI or just the UUID\) |
| `count` | number | No | Number of results per page \(default: 20, max: 100\) |
| `email` | string | No | Filter invitees by email address |
| `pageToken` | string | No | Page token for pagination |
| `sort` | string | No | Sort order for results \(e.g., "created_at:asc", "created_at:desc"\) |
| `status` | string | No | Filter by status \("active" or "canceled"\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `collection` | array | Array of invitee objects |
### `calendly_cancel_event`
Cancel a scheduled event
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Yes | Calendly Personal Access Token |
| `eventUuid` | string | Yes | Scheduled event UUID to cancel \(can be full URI or just the UUID\) |
| `reason` | string | No | Reason for cancellation \(will be sent to invitees\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `resource` | object | Cancellation details |
## Notes
- Category: `tools`
- Type: `calendly`

View File

@@ -42,8 +42,8 @@ Fetch and filter issues from Linear
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `teamId` | string | Yes | Linear team ID |
| `projectId` | string | Yes | Linear project ID |
| `teamId` | string | No | Linear team ID to filter by |
| `projectId` | string | No | Linear project ID to filter by |
#### Output
@@ -76,7 +76,7 @@ Create a new issue in Linear
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `teamId` | string | Yes | Linear team ID |
| `projectId` | string | Yes | Linear project ID |
| `projectId` | string | No | Linear project ID |
| `title` | string | Yes | Issue title |
| `description` | string | No | Issue description |
@@ -240,7 +240,7 @@ Edit a comment in Linear
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `commentId` | string | Yes | Comment ID to update |
| `body` | string | Yes | New comment text \(supports Markdown\) |
| `body` | string | No | New comment text \(supports Markdown\) |
#### Output
@@ -640,7 +640,7 @@ Add an attachment to an issue in Linear
| --------- | ---- | -------- | ----------- |
| `issueId` | string | Yes | Issue ID to attach to |
| `url` | string | Yes | URL of the attachment |
| `title` | string | No | Attachment title |
| `title` | string | Yes | Attachment title |
| `subtitle` | string | No | Attachment subtitle/description |
#### Output
@@ -676,7 +676,7 @@ Update an attachment metadata in Linear
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `attachmentId` | string | Yes | Attachment ID to update |
| `title` | string | No | New attachment title |
| `title` | string | Yes | New attachment title |
| `subtitle` | string | No | New attachment subtitle |
#### Output

View File

@@ -26,9 +26,11 @@ Add a new memory to the database or append to existing memory with the same ID.
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `id` | string | Yes | Identifier for the memory. If a memory with this ID already exists, the new data will be appended to it. |
| `conversationId` | string | No | Conversation identifier \(e.g., user-123, session-abc\). If a memory with this conversationId already exists for this block, the new message will be appended to it. |
| `id` | string | No | Legacy parameter for conversation identifier. Use conversationId instead. Provided for backwards compatibility. |
| `role` | string | Yes | Role for agent memory \(user, assistant, or system\) |
| `content` | string | Yes | Content for agent memory |
| `blockId` | string | No | Optional block ID. If not provided, uses the current block ID from execution context, or defaults to "default". |
#### Output
@@ -40,20 +42,23 @@ Add a new memory to the database or append to existing memory with the same ID.
### `memory_get`
Retrieve a specific memory by its ID
Retrieve memory by conversationId, blockId, blockName, or a combination. Returns all matching memories.
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `id` | string | Yes | Identifier for the memory to retrieve |
| `conversationId` | string | No | Conversation identifier \(e.g., user-123, session-abc\). If provided alone, returns all memories for this conversation across all blocks. |
| `id` | string | No | Legacy parameter for conversation identifier. Use conversationId instead. Provided for backwards compatibility. |
| `blockId` | string | No | Block identifier. If provided alone, returns all memories for this block across all conversations. If provided with conversationId, returns memories for that specific conversation in this block. |
| `blockName` | string | No | Block name. Alternative to blockId. If provided alone, returns all memories for blocks with this name. If provided with conversationId, returns memories for that conversation in blocks with this name. |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Whether the memory was retrieved successfully |
| `memories` | array | Array of memory data for the requested ID |
| `memories` | array | Array of memory objects with conversationId, blockId, blockName, and data fields |
| `message` | string | Success or error message |
| `error` | string | Error message if operation failed |
@@ -71,19 +76,22 @@ Retrieve all memories from the database
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Whether all memories were retrieved successfully |
| `memories` | array | Array of all memory objects with keys, types, and data |
| `memories` | array | Array of all memory objects with key, conversationId, blockId, blockName, and data fields |
| `message` | string | Success or error message |
| `error` | string | Error message if operation failed |
### `memory_delete`
Delete a specific memory by its ID
Delete memories by conversationId, blockId, blockName, or a combination. Supports bulk deletion.
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `id` | string | Yes | Identifier for the memory to delete |
| `conversationId` | string | No | Conversation identifier \(e.g., user-123, session-abc\). If provided alone, deletes all memories for this conversation across all blocks. |
| `id` | string | No | Legacy parameter for conversation identifier. Use conversationId instead. Provided for backwards compatibility. |
| `blockId` | string | No | Block identifier. If provided alone, deletes all memories for this block across all conversations. If provided with conversationId, deletes memories for that specific conversation in this block. |
| `blockName` | string | No | Block name. Alternative to blockId. If provided alone, deletes all memories for blocks with this name. If provided with conversationId, deletes memories for that conversation in blocks with this name. |
#### Output

View File

@@ -2,9 +2,11 @@
"pages": [
"index",
"airtable",
"apollo",
"arxiv",
"asana",
"browser_use",
"calendly",
"clay",
"confluence",
"discord",
@@ -38,6 +40,7 @@
"mistral_parse",
"mongodb",
"mysql",
"neo4j",
"notion",
"onedrive",
"openai",
@@ -58,6 +61,7 @@
"stagehand",
"stagehand_agent",
"stripe",
"stt",
"supabase",
"tavily",
"telegram",

View File

@@ -27,7 +27,7 @@ In Sim, the Microsoft Excel integration provides seamless access to spreadsheet
## Usage Instructions
Integrate Microsoft Excel into the workflow. Can read, write, update, and add to table.
Integrate Microsoft Excel into the workflow. Can read, write, update, add to table, and create new worksheets.
@@ -94,6 +94,23 @@ Add new rows to a Microsoft Excel table
| `values` | array | Array of rows that were added to the table |
| `metadata` | object | Spreadsheet metadata |
### `microsoft_excel_worksheet_add`
Create a new worksheet (sheet) in a Microsoft Excel workbook
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `spreadsheetId` | string | Yes | The ID of the Excel workbook to add the worksheet to |
| `worksheetName` | string | Yes | The name of the new worksheet. Must be unique within the workbook and cannot exceed 31 characters |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `worksheet` | object | Details of the newly created worksheet |
## Notes

View File

@@ -0,0 +1,176 @@
---
title: Neo4j
description: Connect to Neo4j graph database
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="neo4j"
color="#FFFFFF"
/>
## Usage Instructions
Integrate Neo4j graph database into the workflow. Can query, create, merge, update, and delete nodes and relationships.
## Tools
### `neo4j_query`
Execute MATCH queries to read nodes and relationships from Neo4j graph database. For best performance and to prevent large result sets, include LIMIT in your query (e.g.,
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `host` | string | Yes | Neo4j server hostname or IP address |
| `port` | number | Yes | Neo4j server port \(default: 7687 for Bolt protocol\) |
| `database` | string | Yes | Database name to connect to |
| `username` | string | Yes | Neo4j username |
| `password` | string | Yes | Neo4j password |
| `encryption` | string | No | Connection encryption mode \(enabled, disabled\) |
| `cypherQuery` | string | Yes | Cypher query to execute \(typically MATCH statements\) |
| `parameters` | object | No | Parameters for the Cypher query as a JSON object. Use for any dynamic values including LIMIT \(e.g., query: "MATCH \(n\) RETURN n LIMIT $limit", parameters: \{limit: 100\}\). |
| `parameters` | string | No | No description |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `message` | string | Operation status message |
| `records` | array | Array of records returned from the query |
| `recordCount` | number | Number of records returned |
| `summary` | json | Query execution summary with timing and counters |
### `neo4j_create`
Execute CREATE statements to add new nodes and relationships to Neo4j graph database
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `host` | string | Yes | Neo4j server hostname or IP address |
| `port` | number | Yes | Neo4j server port \(default: 7687 for Bolt protocol\) |
| `database` | string | Yes | Database name to connect to |
| `username` | string | Yes | Neo4j username |
| `password` | string | Yes | Neo4j password |
| `encryption` | string | No | Connection encryption mode \(enabled, disabled\) |
| `cypherQuery` | string | Yes | Cypher CREATE statement to execute |
| `parameters` | object | No | Parameters for the Cypher query as a JSON object |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `message` | string | Operation status message |
| `summary` | json | Creation summary with counters for nodes and relationships created |
### `neo4j_merge`
Execute MERGE statements to find or create nodes and relationships in Neo4j (upsert operation)
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `host` | string | Yes | Neo4j server hostname or IP address |
| `port` | number | Yes | Neo4j server port \(default: 7687 for Bolt protocol\) |
| `database` | string | Yes | Database name to connect to |
| `username` | string | Yes | Neo4j username |
| `password` | string | Yes | Neo4j password |
| `encryption` | string | No | Connection encryption mode \(enabled, disabled\) |
| `cypherQuery` | string | Yes | Cypher MERGE statement to execute |
| `parameters` | object | No | Parameters for the Cypher query as a JSON object |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `message` | string | Operation status message |
| `summary` | json | Merge summary with counters for nodes/relationships created or matched |
### `neo4j_update`
Execute SET statements to update properties of existing nodes and relationships in Neo4j
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `host` | string | Yes | Neo4j server hostname or IP address |
| `port` | number | Yes | Neo4j server port \(default: 7687 for Bolt protocol\) |
| `database` | string | Yes | Database name to connect to |
| `username` | string | Yes | Neo4j username |
| `password` | string | Yes | Neo4j password |
| `encryption` | string | No | Connection encryption mode \(enabled, disabled\) |
| `cypherQuery` | string | Yes | Cypher query with MATCH and SET statements to update properties |
| `parameters` | object | No | Parameters for the Cypher query as a JSON object |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `message` | string | Operation status message |
| `summary` | json | Update summary with counters for properties set |
### `neo4j_delete`
Execute DELETE or DETACH DELETE statements to remove nodes and relationships from Neo4j
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `host` | string | Yes | Neo4j server hostname or IP address |
| `port` | number | Yes | Neo4j server port \(default: 7687 for Bolt protocol\) |
| `database` | string | Yes | Database name to connect to |
| `username` | string | Yes | Neo4j username |
| `password` | string | Yes | Neo4j password |
| `encryption` | string | No | Connection encryption mode \(enabled, disabled\) |
| `cypherQuery` | string | Yes | Cypher query with MATCH and DELETE/DETACH DELETE statements |
| `parameters` | object | No | Parameters for the Cypher query as a JSON object |
| `detach` | boolean | No | Whether to use DETACH DELETE to remove relationships before deleting nodes |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `message` | string | Operation status message |
| `summary` | json | Delete summary with counters for nodes and relationships deleted |
### `neo4j_execute`
Execute arbitrary Cypher queries on Neo4j graph database for complex operations
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `host` | string | Yes | Neo4j server hostname or IP address |
| `port` | number | Yes | Neo4j server port \(default: 7687 for Bolt protocol\) |
| `database` | string | Yes | Database name to connect to |
| `username` | string | Yes | Neo4j username |
| `password` | string | Yes | Neo4j password |
| `encryption` | string | No | Connection encryption mode \(enabled, disabled\) |
| `cypherQuery` | string | Yes | Cypher query to execute \(any valid Cypher statement\) |
| `parameters` | object | No | Parameters for the Cypher query as a JSON object |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `message` | string | Operation status message |
| `records` | array | Array of records returned from the query |
| `recordCount` | number | Number of records returned |
| `summary` | json | Execution summary with timing and counters |
## Notes
- Category: `tools`
- Type: `neo4j`

View File

@@ -73,8 +73,10 @@ Send messages to Slack channels or users through the Slack API. Supports Slack m
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `message` | object | Complete message object with all properties returned by Slack |
| `ts` | string | Message timestamp |
| `channel` | string | Channel ID where message was sent |
| `fileCount` | number | Number of files uploaded \(when files are attached\) |
### `slack_canvas`
@@ -157,6 +159,7 @@ Update a message previously sent by the bot in Slack
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `message` | object | Complete updated message object with all properties returned by Slack |
| `content` | string | Success message |
| `metadata` | object | Updated message metadata |

View File

@@ -0,0 +1,122 @@
---
title: Speech-to-Text
description: Convert speech to text using AI
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="stt"
color="#181C1E"
/>
{/* MANUAL-CONTENT-START:intro */}
Transcribe speech to text using state-of-the-art AI models from leading providers. The Sim Speech-to-Text (STT) tools allow you to convert audio and video files into accurate transcripts, supporting multiple languages, timestamps, and optional translation.
Supported providers:
- **[OpenAI Whisper](https://platform.openai.com/docs/guides/speech-to-text/overview)**: Advanced open-source STT model from OpenAI. Supports models such as `whisper-1` and handles a wide variety of languages and audio formats.
- **[Deepgram](https://deepgram.com/)**: Real-time and batch STT API with deep learning models like `nova-3`, `nova-2`, and `whisper-large`. Offers features like diarization, intent recognition, and industry-specific tuning.
- **[ElevenLabs](https://elevenlabs.io/)**: Known for high-quality speech AI, ElevenLabs provides STT models focused on accuracy and natural language understanding for numerous languages and dialects.
Choose the provider and model best suited to your task—whether fast, production-grade transcription (Deepgram), highly accurate multi-language capability (Whisper), or advanced understanding and language coverage (ElevenLabs).
{/* MANUAL-CONTENT-END */}
## Usage Instructions
Transcribe audio and video files to text using leading AI providers. Supports multiple languages, timestamps, and speaker diarization.
## Tools
### `stt_whisper`
Transcribe audio to text using OpenAI Whisper
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `provider` | string | Yes | STT provider \(whisper\) |
| `apiKey` | string | Yes | OpenAI API key |
| `model` | string | No | Whisper model to use \(default: whisper-1\) |
| `audioFile` | file | No | Audio or video file to transcribe |
| `audioFileReference` | file | No | Reference to audio/video file from previous blocks |
| `audioUrl` | string | No | URL to audio or video file |
| `language` | string | No | Language code \(e.g., "en", "es", "fr"\) or "auto" for auto-detection |
| `timestamps` | string | No | Timestamp granularity: none, sentence, or word |
| `translateToEnglish` | boolean | No | Translate audio to English |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `transcript` | string | Full transcribed text |
| `segments` | array | Timestamped segments |
| `language` | string | Detected or specified language |
| `duration` | number | Audio duration in seconds |
| `confidence` | number | Overall confidence score |
### `stt_deepgram`
Transcribe audio to text using Deepgram
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `provider` | string | Yes | STT provider \(deepgram\) |
| `apiKey` | string | Yes | Deepgram API key |
| `model` | string | No | Deepgram model to use \(nova-3, nova-2, whisper-large, etc.\) |
| `audioFile` | file | No | Audio or video file to transcribe |
| `audioFileReference` | file | No | Reference to audio/video file from previous blocks |
| `audioUrl` | string | No | URL to audio or video file |
| `language` | string | No | Language code \(e.g., "en", "es", "fr"\) or "auto" for auto-detection |
| `timestamps` | string | No | Timestamp granularity: none, sentence, or word |
| `diarization` | boolean | No | Enable speaker diarization |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `transcript` | string | Full transcribed text |
| `segments` | array | Timestamped segments with speaker labels |
| `language` | string | Detected or specified language |
| `duration` | number | Audio duration in seconds |
| `confidence` | number | Overall confidence score |
### `stt_elevenlabs`
Transcribe audio to text using ElevenLabs
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `provider` | string | Yes | STT provider \(elevenlabs\) |
| `apiKey` | string | Yes | ElevenLabs API key |
| `model` | string | No | ElevenLabs model to use \(scribe_v1, scribe_v1_experimental\) |
| `audioFile` | file | No | Audio or video file to transcribe |
| `audioFileReference` | file | No | Reference to audio/video file from previous blocks |
| `audioUrl` | string | No | URL to audio or video file |
| `language` | string | No | Language code \(e.g., "en", "es", "fr"\) or "auto" for auto-detection |
| `timestamps` | string | No | Timestamp granularity: none, sentence, or word |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `transcript` | string | Full transcribed text |
| `segments` | array | Timestamped segments |
| `language` | string | Detected or specified language |
| `duration` | number | Audio duration in seconds |
| `confidence` | number | Overall confidence score |
## Notes
- Category: `tools`
- Type: `stt`

View File

@@ -42,11 +42,11 @@ El prompt del usuario representa los datos de entrada principales para el proces
El bloque Agente admite múltiples proveedores de LLM a través de una interfaz de inferencia unificada. Los modelos disponibles incluyen:
- **OpenAI**: GPT-5, GPT-4o, o1, o3, o4-mini, gpt-4.1
- **Anthropic**: Claude 3.7 Sonnet
- **OpenAI**: GPT-5.1, GPT-5, GPT-4o, o1, o3, o4-mini, gpt-4.1
- **Anthropic**: Claude 4.5 Sonnet, Claude Opus 4.1
- **Google**: Gemini 2.5 Pro, Gemini 2.0 Flash
- **Otros proveedores**: Groq, Cerebras, xAI, DeepSeek
- **Modelos locales**: Modelos compatibles con Ollama
- **Otros proveedores**: Groq, Cerebras, xAI, Azure OpenAI, OpenRouter
- **Modelos locales**: modelos compatibles con Ollama
### Temperatura

View File

@@ -0,0 +1,574 @@
---
title: Apollo
description: Busca, enriquece y gestiona contactos con Apollo.io
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="apollo"
color="#EBF212"
/>
{/* MANUAL-CONTENT-START:intro */}
[Apollo.io](https://apollo.io/) es una plataforma líder de inteligencia y participación de ventas que permite a los usuarios encontrar, enriquecer e interactuar con contactos y empresas a gran escala. Apollo.io combina una extensa base de datos de contactos con sólidas herramientas de enriquecimiento y automatización de flujos de trabajo, ayudando a los equipos de ventas, marketing y reclutamiento a acelerar el crecimiento.
Con Apollo.io, puedes:
- **Buscar millones de contactos y empresas**: Encuentra leads precisos utilizando filtros avanzados
- **Enriquecer leads y cuentas**: Completa detalles faltantes con datos verificados e información actualizada
- **Gestionar y organizar registros CRM**: Mantén tus datos de personas y empresas precisos y accionables
- **Automatizar el alcance**: Añade contactos a secuencias y crea tareas de seguimiento directamente desde Apollo.io
En Sim, la integración de Apollo.io permite a tus agentes realizar operaciones básicas de Apollo de forma programática:
- **Buscar personas y empresas**: Usa `apollo_people_search` para descubrir nuevos leads utilizando filtros flexibles.
- **Enriquecer datos de personas**: Usa `apollo_people_enrich` para aumentar contactos con información verificada.
- **Enriquecer personas en masa**: Usa `apollo_people_bulk_enrich` para el enriquecimiento a gran escala de múltiples contactos a la vez.
- **Buscar y enriquecer empresas**: Usa `apollo_company_search` y `apollo_company_enrich` para descubrir y actualizar información clave de empresas.
Esto permite a tus agentes construir flujos de trabajo potentes para prospección, enriquecimiento de CRM y automatización sin entrada manual de datos o cambio de pestañas. Integra Apollo.io como una fuente dinámica de datos y motor CRM — capacitando a tus agentes para identificar, calificar y contactar leads sin problemas como parte de sus operaciones diarias.
{/* MANUAL-CONTENT-END */}
## Instrucciones de uso
Integra Apollo.io en el flujo de trabajo. Busca personas y empresas, enriquece datos de contacto, gestiona tus contactos y cuentas de CRM, añade contactos a secuencias y crea tareas.
## Herramientas
### `apollo_people_search`
Buscar en Apollo
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Sí | Clave API de Apollo |
| `person_titles` | array | No | Títulos de trabajo para buscar (p. ej., ["CEO", "VP of Sales"]) |
| `person_locations` | array | No | Ubicaciones donde buscar (p. ej., ["San Francisco, CA", "New York, NY"]) |
| `person_seniorities` | array | No | Niveles de antigüedad (p. ej., ["senior", "executive", "manager"]) |
| `organization_names` | array | No | Nombres de empresas donde buscar |
| `q_keywords` | string | No | Palabras clave para buscar |
| `page` | number | No | Número de página para paginación (predeterminado: 1) |
| `per_page` | number | No | Resultados por página (predeterminado: 25, máx: 100) |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `people` | json | Array de personas que coinciden con los criterios de búsqueda |
| `metadata` | json | Información de paginación incluyendo página, por_página y total_entradas |
### `apollo_people_enrich`
Enriquecer datos de una persona usando Apollo
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Sí | Clave API de Apollo |
| `first_name` | string | No | Nombre de la persona |
| `last_name` | string | No | Apellido de la persona |
| `email` | string | No | Dirección de correo electrónico de la persona |
| `organization_name` | string | No | Nombre de la empresa donde trabaja la persona |
| `domain` | string | No | Dominio de la empresa (p. ej., apollo.io) |
| `linkedin_url` | string | No | URL del perfil de LinkedIn |
| `reveal_personal_emails` | boolean | No | Revelar direcciones de correo electrónico personales (usa créditos) |
| `reveal_phone_number` | boolean | No | Revelar números de teléfono (usa créditos) |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `person` | json | Datos enriquecidos de la persona desde Apollo |
| `metadata` | json | Metadatos de enriquecimiento incluyendo estado de enriquecimiento |
### `apollo_people_bulk_enrich`
Enriquece datos de hasta 10 personas a la vez usando Apollo
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Sí | Clave API de Apollo |
| `people` | array | Sí | Array de personas para enriquecer \(máximo 10\) |
| `reveal_personal_emails` | boolean | No | Revelar direcciones de correo electrónico personales \(usa créditos\) |
| `reveal_phone_number` | boolean | No | Revelar números de teléfono \(usa créditos\) |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `people` | json | Array de datos de personas enriquecidos |
| `metadata` | json | Metadatos de enriquecimiento masivo incluyendo recuentos totales y enriquecidos |
### `apollo_organization_search`
Buscar en Apollo
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Sí | Clave API de Apollo |
| `organization_locations` | array | No | Ubicaciones de empresas para buscar |
| `organization_num_employees_ranges` | array | No | Rangos de número de empleados \(p. ej., \["1-10", "11-50"\]\) |
| `q_organization_keyword_tags` | array | No | Etiquetas de industria o palabras clave |
| `q_organization_name` | string | No | Nombre de la organización a buscar |
| `page` | number | No | Número de página para paginación |
| `per_page` | number | No | Resultados por página \(máx: 100\) |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `organizations` | json | Array de organizaciones que coinciden con los criterios de búsqueda |
| `metadata` | json | Información de paginación que incluye page, per_page y total_entries |
### `apollo_organization_enrich`
Enriquecer datos para una sola organización usando Apollo
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Sí | Clave API de Apollo |
| `organization_name` | string | No | Nombre de la organización \(se requiere al menos uno de organization_name o domain\) |
| `domain` | string | No | Dominio de la empresa \(por ejemplo, apollo.io\) \(se requiere al menos uno de domain u organization_name\) |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `organization` | json | Datos enriquecidos de la organización desde Apollo |
| `metadata` | json | Metadatos de enriquecimiento que incluyen el estado de enriquecimiento |
### `apollo_organization_bulk_enrich`
Enriquecer datos para hasta 10 organizaciones a la vez usando Apollo
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Sí | Clave API de Apollo |
| `organizations` | array | Sí | Array de organizaciones para enriquecer \(máximo 10\) |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `organizations` | json | Array de datos de organizaciones enriquecidos |
| `metadata` | json | Metadatos de enriquecimiento masivo que incluyen recuentos totales y enriquecidos |
### `apollo_contact_create`
Crear un nuevo contacto en tu base de datos de Apollo
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Sí | Clave API de Apollo |
| `first_name` | string | Sí | Nombre del contacto |
| `last_name` | string | Sí | Apellido del contacto |
| `email` | string | No | Dirección de correo electrónico del contacto |
| `title` | string | No | Cargo laboral |
| `account_id` | string | No | ID de cuenta de Apollo para asociar |
| `owner_id` | string | No | ID de usuario del propietario del contacto |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `contact` | json | Datos del contacto creado en Apollo |
| `metadata` | json | Metadatos de creación incluyendo estado de creación |
### `apollo_contact_update`
Actualizar un contacto existente en tu base de datos de Apollo
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Sí | Clave API de Apollo |
| `contact_id` | string | Sí | ID del contacto a actualizar |
| `first_name` | string | No | Nombre del contacto |
| `last_name` | string | No | Apellido del contacto |
| `email` | string | No | Dirección de correo electrónico |
| `title` | string | No | Cargo laboral |
| `account_id` | string | No | ID de cuenta de Apollo |
| `owner_id` | string | No | ID de usuario del propietario del contacto |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `contact` | json | Datos de contacto actualizados de Apollo |
| `metadata` | json | Metadatos de actualización incluyendo estado actualizado |
### `apollo_contact_search`
Buscar tu equipo
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Sí | Clave API de Apollo |
| `q_keywords` | string | No | Palabras clave para buscar |
| `contact_stage_ids` | array | No | Filtrar por IDs de etapa de contacto |
| `page` | number | No | Número de página para paginación |
| `per_page` | number | No | Resultados por página \(máx: 100\) |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `contacts` | json | Array de contactos que coinciden con los criterios de búsqueda |
| `metadata` | json | Información de paginación incluyendo page, per_page y total_entries |
### `apollo_contact_bulk_create`
Crea hasta 100 contactos a la vez en tu base de datos de Apollo. Admite deduplicación para evitar crear contactos duplicados. Se requiere clave maestra.
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Sí | Clave API de Apollo \(se requiere clave maestra\) |
| `contacts` | array | Sí | Array de contactos para crear \(máx 100\). Cada contacto debe incluir first_name, last_name y opcionalmente email, title, account_id, owner_id |
| `run_dedupe` | boolean | No | Habilitar deduplicación para evitar crear contactos duplicados. Cuando es true, los contactos existentes se devuelven sin modificación |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `created_contacts` | json | Array de contactos recién creados |
| `existing_contacts` | json | Array de contactos existentes \(cuando la deduplicación está habilitada\) |
| `metadata` | json | Metadatos de creación masiva que incluyen recuentos de contactos creados y existentes |
### `apollo_contact_bulk_update`
Actualiza hasta 100 contactos existentes a la vez en tu base de datos de Apollo. Cada contacto debe incluir un campo id. Se requiere clave maestra.
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Sí | Clave API de Apollo \(se requiere clave maestra\) |
| `contacts` | array | Sí | Array de contactos para actualizar \(máximo 100\). Cada contacto debe incluir campo id, y opcionalmente first_name, last_name, email, title, account_id, owner_id |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `updated_contacts` | json | Array de contactos actualizados correctamente |
| `failed_contacts` | json | Array de contactos cuya actualización falló |
| `metadata` | json | Metadatos de actualización masiva que incluyen recuentos de contactos actualizados y fallidos |
### `apollo_account_create`
Crea una nueva cuenta (empresa) en tu base de datos de Apollo
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Sí | Clave API de Apollo |
| `name` | string | Sí | Nombre de la empresa |
| `website_url` | string | No | URL del sitio web de la empresa |
| `phone` | string | No | Número de teléfono de la empresa |
| `owner_id` | string | No | ID de usuario del propietario de la cuenta |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `account` | json | Datos de la cuenta creada desde Apollo |
| `metadata` | json | Metadatos de creación incluyendo el estado de creación |
### `apollo_account_update`
Actualizar una cuenta existente en tu base de datos de Apollo
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Sí | Clave API de Apollo |
| `account_id` | string | Sí | ID de la cuenta a actualizar |
| `name` | string | No | Nombre de la empresa |
| `website_url` | string | No | URL del sitio web de la empresa |
| `phone` | string | No | Número de teléfono de la empresa |
| `owner_id` | string | No | ID de usuario del propietario de la cuenta |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `account` | json | Datos de la cuenta actualizada desde Apollo |
| `metadata` | json | Metadatos de actualización incluyendo el estado de actualización |
### `apollo_account_search`
Buscar en tu equipo
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Sí | Clave API de Apollo \(se requiere clave maestra\) |
| `q_keywords` | string | No | Palabras clave para buscar en los datos de la cuenta |
| `owner_id` | string | No | Filtrar por ID de usuario propietario de la cuenta |
| `account_stage_ids` | array | No | Filtrar por IDs de etapa de cuenta |
| `page` | number | No | Número de página para paginación |
| `per_page` | number | No | Resultados por página \(máx: 100\) |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `accounts` | json | Array de cuentas que coinciden con los criterios de búsqueda |
| `metadata` | json | Información de paginación que incluye page, per_page y total_entries |
### `apollo_account_bulk_create`
Crea hasta 100 cuentas a la vez en tu base de datos de Apollo. Nota: Apollo no aplica deduplicación - se pueden crear cuentas duplicadas si las entradas comparten nombres o dominios similares. Se requiere clave maestra.
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Sí | Clave API de Apollo \(se requiere clave maestra\) |
| `accounts` | array | Sí | Array de cuentas para crear \(máximo 100\). Cada cuenta debe incluir name \(obligatorio\), y opcionalmente website_url, phone, owner_id |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `created_accounts` | json | Array de cuentas recién creadas |
| `failed_accounts` | json | Array de cuentas que no se pudieron crear |
| `metadata` | json | Metadatos de creación masiva que incluyen recuentos de cuentas creadas y fallidas |
### `apollo_account_bulk_update`
Actualiza hasta 1000 cuentas existentes a la vez en tu base de datos de Apollo (¡límite más alto que para contactos!). Cada cuenta debe incluir un campo id. Se requiere clave maestra.
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Sí | Clave API de Apollo \(se requiere clave maestra\) |
| `accounts` | array | Sí | Array de cuentas para actualizar \(máximo 1000\). Cada cuenta debe incluir el campo id, y opcionalmente name, website_url, phone, owner_id |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `updated_accounts` | json | Array de cuentas actualizadas con éxito |
| `failed_accounts` | json | Array de cuentas que no se pudieron actualizar |
| `metadata` | json | Metadatos de actualización masiva que incluyen recuentos de cuentas actualizadas y fallidas |
### `apollo_opportunity_create`
Crear una nueva oportunidad para una cuenta en tu base de datos de Apollo (se requiere clave maestra)
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | ----------- | ----------- |
| `apiKey` | string | Sí | Clave API de Apollo \(se requiere clave maestra\) |
| `name` | string | Sí | Nombre de la oportunidad/negocio |
| `account_id` | string | Sí | ID de la cuenta a la que pertenece esta oportunidad |
| `amount` | number | No | Valor monetario de la oportunidad |
| `stage_id` | string | No | ID de la etapa del negocio |
| `owner_id` | string | No | ID de usuario del propietario de la oportunidad |
| `close_date` | string | No | Fecha de cierre prevista \(formato ISO 8601\) |
| `description` | string | No | Descripción o notas sobre la oportunidad |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `opportunity` | json | Datos de la oportunidad creada desde Apollo |
| `metadata` | json | Metadatos de creación que incluyen el estado de creación |
### `apollo_opportunity_search`
Buscar y listar todas las oportunidades/negocios en tu equipo
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Sí | Clave API de Apollo |
| `q_keywords` | string | No | Palabras clave para buscar en nombres de oportunidades |
| `account_ids` | array | No | Filtrar por IDs de cuentas específicas |
| `stage_ids` | array | No | Filtrar por IDs de etapas de negocio |
| `owner_ids` | array | No | Filtrar por IDs de propietarios de oportunidades |
| `page` | number | No | Número de página para paginación |
| `per_page` | number | No | Resultados por página \(máx: 100\) |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `opportunities` | json | Array de oportunidades que coinciden con los criterios de búsqueda |
| `metadata` | json | Información de paginación incluyendo página, por_página y total_entradas |
### `apollo_opportunity_get`
Recuperar detalles completos de un negocio/oportunidad específico por ID
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Sí | Clave API de Apollo |
| `opportunity_id` | string | Sí | ID de la oportunidad a recuperar |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `opportunity` | json | Datos completos de la oportunidad desde Apollo |
| `metadata` | json | Metadatos de recuperación incluyendo estado de búsqueda |
### `apollo_opportunity_update`
Actualizar un negocio/oportunidad existente en tu base de datos de Apollo
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Sí | Clave API de Apollo |
| `opportunity_id` | string | Sí | ID de la oportunidad a actualizar |
| `name` | string | No | Nombre de la oportunidad/acuerdo |
| `amount` | number | No | Valor monetario de la oportunidad |
| `stage_id` | string | No | ID de la etapa del acuerdo |
| `owner_id` | string | No | ID de usuario del propietario de la oportunidad |
| `close_date` | string | No | Fecha prevista de cierre (formato ISO 8601) |
| `description` | string | No | Descripción o notas sobre la oportunidad |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `opportunity` | json | Datos actualizados de la oportunidad desde Apollo |
| `metadata` | json | Metadatos de actualización incluyendo estado actualizado |
### `apollo_sequence_search`
Buscar secuencias/campañas en tu equipo
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Sí | Clave API de Apollo (se requiere clave maestra) |
| `q_name` | string | No | Buscar secuencias por nombre |
| `active` | boolean | No | Filtrar por estado activo (true para secuencias activas, false para inactivas) |
| `page` | number | No | Número de página para paginación |
| `per_page` | number | No | Resultados por página (máx: 100) |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `sequences` | json | Array de secuencias/campañas que coinciden con los criterios de búsqueda |
| `metadata` | json | Información de paginación que incluye página, por_página y total_entradas |
### `apollo_sequence_add_contacts`
Añadir contactos a una secuencia de Apollo
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Sí | Clave API de Apollo \(se requiere clave maestra\) |
| `sequence_id` | string | Sí | ID de la secuencia a la que añadir contactos |
| `contact_ids` | array | Sí | Array de IDs de contactos para añadir a la secuencia |
| `emailer_campaign_id` | string | No | ID de campaña de correo electrónico opcional |
| `send_email_from_user_id` | string | No | ID de usuario desde el que enviar correos electrónicos |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `contacts_added` | json | Array de IDs de contactos añadidos a la secuencia |
| `metadata` | json | Metadatos de la secuencia que incluyen sequence_id y recuento total_añadidos |
### `apollo_task_create`
Crear una nueva tarea en Apollo
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Sí | Clave API de Apollo \(se requiere clave maestra\) |
| `note` | string | Sí | Nota/descripción de la tarea |
| `contact_id` | string | No | ID de contacto para asociar |
| `account_id` | string | No | ID de cuenta para asociar |
| `due_at` | string | No | Fecha de vencimiento en formato ISO |
| `priority` | string | No | Prioridad de la tarea |
| `type` | string | No | Tipo de tarea |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `task` | json | Datos de la tarea creada desde Apollo |
| `metadata` | json | Metadatos de creación incluyendo el estado de creación |
### `apollo_task_search`
Buscar tareas en Apollo
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Sí | Clave API de Apollo \(se requiere clave maestra\) |
| `contact_id` | string | No | Filtrar por ID de contacto |
| `account_id` | string | No | Filtrar por ID de cuenta |
| `completed` | boolean | No | Filtrar por estado de finalización |
| `page` | number | No | Número de página para paginación |
| `per_page` | number | No | Resultados por página \(máx: 100\) |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `tasks` | json | Array de tareas que coinciden con los criterios de búsqueda |
| `metadata` | json | Información de paginación incluyendo página, por_página y total_entradas |
### `apollo_email_accounts`
Obtener lista de equipo
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Sí | Clave API de Apollo \(se requiere clave maestra\) |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `email_accounts` | json | Array de cuentas de correo electrónico del equipo vinculadas en Apollo |
| `metadata` | json | Metadatos incluyendo el recuento total de cuentas de correo electrónico |
## Notas
- Categoría: `tools`
- Tipo: `apollo`

View File

@@ -0,0 +1,172 @@
---
title: Calendly
description: Gestiona programación y eventos de Calendly
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="calendly"
color="#FFFFFF"
/>
{/* MANUAL-CONTENT-START:intro */}
[Calendly](https://calendly.com/) es una popular plataforma de automatización de programación que te ayuda a reservar reuniones, eventos y citas con facilidad. Con Calendly, los equipos e individuos pueden simplificar la programación, reducir los intercambios de correos electrónicos y automatizar tareas relacionadas con eventos.
Con la integración de Sim Calendly, tus agentes pueden:
- **Recuperar información sobre tu cuenta y eventos programados**: Utiliza herramientas para obtener información de usuario, tipos de eventos y eventos programados para análisis o automatización.
- **Gestionar tipos de eventos y programación**: Accede y lista los tipos de eventos disponibles para usuarios u organizaciones, recupera detalles sobre tipos de eventos específicos y monitorea reuniones programadas y datos de invitados.
- **Automatizar seguimientos y flujos de trabajo**: Cuando los usuarios programan, reprograman o cancelan reuniones, los agentes de Sim pueden activar automáticamente los flujos de trabajo correspondientes, como enviar recordatorios, actualizar CRMs o notificar a los participantes.
- **Integración fácil mediante webhooks**: Configura flujos de trabajo de Sim para responder a eventos de webhook de Calendly en tiempo real, incluyendo cuando los invitados programan, cancelan o interactúan con formularios de enrutamiento.
Ya sea que quieras automatizar la preparación de reuniones, gestionar invitaciones o ejecutar flujos de trabajo personalizados en respuesta a la actividad de programación, las herramientas de Calendly en Sim te brindan acceso flexible y seguro. Desbloquea nuevas automatizaciones reaccionando instantáneamente a los cambios de programación, simplificando las operaciones y comunicaciones de tu equipo.
{/* MANUAL-CONTENT-END */}
## Instrucciones de uso
Integra Calendly en tu flujo de trabajo. Gestiona tipos de eventos, eventos programados, invitados y webhooks. También puede activar flujos de trabajo basados en eventos de webhook de Calendly (invitado programado, invitado cancelado, formulario de enrutamiento enviado). Requiere un token de acceso personal.
## Herramientas
### `calendly_get_current_user`
Obtener información sobre el usuario de Calendly actualmente autenticado
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | ---------- | ----------- |
| `apiKey` | string | Sí | Token de acceso personal de Calendly |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `resource` | object | Información del usuario actual |
### `calendly_list_event_types`
Recuperar una lista de todos los tipos de eventos para un usuario u organización
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Sí | Token de acceso personal de Calendly |
| `user` | string | No | Devolver solo tipos de eventos que pertenecen a este usuario \(formato URI\) |
| `organization` | string | No | Devolver solo tipos de eventos que pertenecen a esta organización \(formato URI\) |
| `count` | number | No | Número de resultados por página \(predeterminado: 20, máximo: 100\) |
| `pageToken` | string | No | Token de página para paginación |
| `sort` | string | No | Orden de clasificación para resultados \(p. ej., "name:asc", "name:desc"\) |
| `active` | boolean | No | Cuando es verdadero, muestra solo tipos de eventos activos. Cuando es falso o no está marcado, muestra todos los tipos de eventos \(tanto activos como inactivos\). |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `collection` | array | Array de objetos de tipo de evento |
### `calendly_get_event_type`
Obtener información detallada sobre un tipo de evento específico
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Sí | Token de acceso personal de Calendly |
| `eventTypeUuid` | string | Sí | UUID del tipo de evento \(puede ser URI completa o solo el UUID\) |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `resource` | object | Detalles del tipo de evento |
### `calendly_list_scheduled_events`
Recuperar una lista de eventos programados para un usuario u organización
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Sí | Token de acceso personal de Calendly |
| `user` | string | No | Devolver eventos que pertenecen a este usuario \(formato URI\). Se debe proporcionar "usuario" u "organización". |
| `organization` | string | No | Devolver eventos que pertenecen a esta organización \(formato URI\). Se debe proporcionar "usuario" u "organización". |
| `invitee_email` | string | No | Devolver eventos donde el invitado tiene este correo electrónico |
| `count` | number | No | Número de resultados por página \(predeterminado: 20, máximo: 100\) |
| `max_start_time` | string | No | Devolver eventos con hora de inicio antes de esta hora \(formato ISO 8601\) |
| `min_start_time` | string | No | Devolver eventos con hora de inicio después de esta hora \(formato ISO 8601\) |
| `pageToken` | string | No | Token de página para paginación |
| `sort` | string | No | Orden de clasificación para resultados \(p. ej., "start_time:asc", "start_time:desc"\) |
| `status` | string | No | Filtrar por estado \("active" o "canceled"\) |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `collection` | array | Array de objetos de eventos programados |
### `calendly_get_scheduled_event`
Obtener información detallada sobre un evento programado específico
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Sí | Token de acceso personal de Calendly |
| `eventUuid` | string | Sí | UUID del evento programado \(puede ser URI completa o solo el UUID\) |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `resource` | object | Detalles del evento programado |
### `calendly_list_event_invitees`
Recuperar una lista de invitados para un evento programado
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Sí | Token de acceso personal de Calendly |
| `eventUuid` | string | Sí | UUID del evento programado \(puede ser URI completa o solo el UUID\) |
| `count` | number | No | Número de resultados por página \(predeterminado: 20, máximo: 100\) |
| `email` | string | No | Filtrar invitados por dirección de correo electrónico |
| `pageToken` | string | No | Token de página para paginación |
| `sort` | string | No | Orden de clasificación para resultados \(p. ej., "created_at:asc", "created_at:desc"\) |
| `status` | string | No | Filtrar por estado \("active" o "canceled"\) |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `collection` | array | Array de objetos de invitados |
### `calendly_cancel_event`
Cancelar un evento programado
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Sí | Token de acceso personal de Calendly |
| `eventUuid` | string | Sí | UUID del evento programado a cancelar \(puede ser URI completa o solo el UUID\) |
| `reason` | string | No | Motivo de la cancelación \(se enviará a los invitados\) |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `resource` | object | Detalles de la cancelación |
## Notas
- Categoría: `tools`
- Tipo: `calendly`

View File

@@ -24,9 +24,11 @@ Añade una nueva memoria a la base de datos o agrega a una memoria existente con
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | ----------- | ----------- |
| `id` | string | | Identificador para la memoria. Si ya existe una memoria con este ID, los nuevos datos se añadirán a ella. |
| `role` | string | | Rol para la memoria del agente \(usuario, asistente o sistema\) |
| `conversationId` | string | No | Identificador de conversación (p. ej., user-123, session-abc). Si ya existe una memoria con este conversationId para este bloque, el nuevo mensaje se añadirá a ella. |
| `id` | string | No | Parámetro heredado para el identificador de conversación. Use conversationId en su lugar. Proporcionado para compatibilidad con versiones anteriores. |
| `role` | string | Sí | Rol para la memoria del agente (user, assistant o system) |
| `content` | string | Sí | Contenido para la memoria del agente |
| `blockId` | string | No | ID de bloque opcional. Si no se proporciona, utiliza el ID del bloque actual del contexto de ejecución, o por defecto "default". |
#### Salida
@@ -38,20 +40,23 @@ Añade una nueva memoria a la base de datos o agrega a una memoria existente con
### `memory_get`
Recuperar una memoria específica por su ID
Recuperar memoria por conversationId, blockId, blockName o una combinación. Devuelve todas las memorias coincidentes.
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | ----------- | ----------- |
| `id` | string | | Identificador de la memoria a recuperar |
| `conversationId` | string | No | Identificador de conversación (p. ej., user-123, session-abc). Si se proporciona solo, devuelve todas las memorias para esta conversación en todos los bloques. |
| `id` | string | No | Parámetro heredado para el identificador de conversación. Use conversationId en su lugar. Proporcionado para compatibilidad con versiones anteriores. |
| `blockId` | string | No | Identificador de bloque. Si se proporciona solo, devuelve todas las memorias para este bloque en todas las conversaciones. Si se proporciona con conversationId, devuelve las memorias para esa conversación específica en este bloque. |
| `blockName` | string | No | Nombre del bloque. Alternativa a blockId. Si se proporciona solo, devuelve todas las memorias para bloques con este nombre. Si se proporciona con conversationId, devuelve las memorias para esa conversación en bloques con este nombre. |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `success` | boolean | Indica si la memoria se recuperó correctamente |
| `memories` | array | Array de datos de memoria para el ID solicitado |
| `success` | boolean | Si la memoria fue recuperada con éxito |
| `memories` | array | Array de objetos de memoria con campos conversationId, blockId, blockName y data |
| `message` | string | Mensaje de éxito o error |
| `error` | string | Mensaje de error si la operación falló |
@@ -68,20 +73,23 @@ Recuperar todas las memorias de la base de datos
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `success` | boolean | Indica si todas las memorias se recuperaron correctamente |
| `memories` | array | Array de todos los objetos de memoria con claves, tipos y datos |
| `success` | boolean | Si todas las memorias fueron recuperadas con éxito |
| `memories` | array | Array de todos los objetos de memoria con campos key, conversationId, blockId, blockName y data |
| `message` | string | Mensaje de éxito o error |
| `error` | string | Mensaje de error si la operación falló |
### `memory_delete`
Eliminar una memoria específica por su ID
Eliminar memorias por conversationId, blockId, blockName o una combinación. Admite eliminación masiva.
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | ----------- | ----------- |
| `id` | string | | Identificador de la memoria a eliminar |
| `conversationId` | string | No | Identificador de conversación (p. ej., user-123, session-abc). Si se proporciona solo, elimina todas las memorias para esta conversación en todos los bloques. |
| `id` | string | No | Parámetro heredado para el identificador de conversación. Use conversationId en su lugar. Proporcionado para compatibilidad con versiones anteriores. |
| `blockId` | string | No | Identificador de bloque. Si se proporciona solo, elimina todas las memorias para este bloque en todas las conversaciones. Si se proporciona con conversationId, elimina las memorias para esa conversación específica en este bloque. |
| `blockName` | string | No | Nombre del bloque. Alternativa a blockId. Si se proporciona solo, elimina todas las memorias para bloques con este nombre. Si se proporciona con conversationId, elimina las memorias para esa conversación en bloques con este nombre. |
#### Salida

View File

@@ -26,7 +26,7 @@ En Sim, la integración de Microsoft Excel proporciona acceso fluido a la funcio
## Instrucciones de uso
Integra Microsoft Excel en el flujo de trabajo. Puede leer, escribir, actualizar y añadir a la tabla. Requiere OAuth.
Integra Microsoft Excel en el flujo de trabajo. Puede leer, escribir, actualizar, añadir a tablas y crear nuevas hojas de cálculo.
## Herramientas
@@ -91,6 +91,23 @@ Añadir nuevas filas a una tabla de Microsoft Excel
| `values` | array | Matriz de filas que fueron añadidas a la tabla |
| `metadata` | object | Metadatos de la hoja de cálculo |
### `microsoft_excel_worksheet_add`
Crear una nueva hoja de cálculo en un libro de Microsoft Excel
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `spreadsheetId` | string | Sí | El ID del libro de Excel al que añadir la hoja de cálculo |
| `worksheetName` | string | Sí | El nombre de la nueva hoja de cálculo. Debe ser único dentro del libro y no puede exceder los 31 caracteres |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `worksheet` | object | Detalles de la hoja de cálculo recién creada |
## Notas
- Categoría: `tools`

View File

@@ -0,0 +1,172 @@
---
title: Neo4j
description: Conectar a la base de datos de grafos Neo4j
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="neo4j"
color="#FFFFFF"
/>
## Instrucciones de uso
Integra la base de datos de grafos Neo4j en el flujo de trabajo. Puede consultar, crear, fusionar, actualizar y eliminar nodos y relaciones.
## Herramientas
### `neo4j_query`
Ejecuta consultas MATCH para leer nodos y relaciones de la base de datos de grafos Neo4j. Para un mejor rendimiento y para evitar grandes conjuntos de resultados, incluye LIMIT en tu consulta (por ejemplo,
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | ----------- | ----------- |
| `host` | string | Sí | Nombre de host o dirección IP del servidor Neo4j |
| `port` | number | Sí | Puerto del servidor Neo4j \(predeterminado: 7687 para el protocolo Bolt\) |
| `database` | string | Sí | Nombre de la base de datos a la que conectarse |
| `username` | string | Sí | Nombre de usuario de Neo4j |
| `password` | string | Sí | Contraseña de Neo4j |
| `encryption` | string | No | Modo de cifrado de conexión \(enabled, disabled\) |
| `cypherQuery` | string | Sí | Consulta Cypher para ejecutar \(normalmente declaraciones MATCH\) |
| `parameters` | object | No | Parámetros para la consulta Cypher como un objeto JSON. Úsalo para cualquier valor dinámico incluyendo LIMIT \(por ejemplo, query: "MATCH \(n\) RETURN n LIMIT $limit", parameters: \{limit: 100\}\). |
| `parameters` | string | No | Sin descripción |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `message` | string | Mensaje de estado de la operación |
| `records` | array | Array de registros devueltos por la consulta |
| `recordCount` | number | Número de registros devueltos |
| `summary` | json | Resumen de ejecución de la consulta con tiempos y contadores |
### `neo4j_create`
Ejecuta sentencias CREATE para añadir nuevos nodos y relaciones a la base de datos de grafos Neo4j
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | ----------- | ----------- |
| `host` | string | Sí | Nombre de host o dirección IP del servidor Neo4j |
| `port` | number | Sí | Puerto del servidor Neo4j \(predeterminado: 7687 para el protocolo Bolt\) |
| `database` | string | Sí | Nombre de la base de datos a la que conectarse |
| `username` | string | Sí | Nombre de usuario de Neo4j |
| `password` | string | Sí | Contraseña de Neo4j |
| `encryption` | string | No | Modo de cifrado de conexión \(enabled, disabled\) |
| `cypherQuery` | string | Sí | Sentencia Cypher CREATE a ejecutar |
| `parameters` | object | No | Parámetros para la consulta Cypher como objeto JSON |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `message` | string | Mensaje de estado de la operación |
| `summary` | json | Resumen de creación con contadores de nodos y relaciones creados |
### `neo4j_merge`
Ejecuta sentencias MERGE para encontrar o crear nodos y relaciones en Neo4j (operación upsert)
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | ----------- | ----------- |
| `host` | string | Sí | Nombre de host o dirección IP del servidor Neo4j |
| `port` | number | Sí | Puerto del servidor Neo4j \(predeterminado: 7687 para el protocolo Bolt\) |
| `database` | string | Sí | Nombre de la base de datos a la que conectarse |
| `username` | string | Sí | Nombre de usuario de Neo4j |
| `password` | string | Sí | Contraseña de Neo4j |
| `encryption` | string | No | Modo de cifrado de conexión \(enabled, disabled\) |
| `cypherQuery` | string | Sí | Sentencia Cypher MERGE a ejecutar |
| `parameters` | object | No | Parámetros para la consulta Cypher como objeto JSON |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `message` | string | Mensaje de estado de la operación |
| `summary` | json | Resumen de fusión con contadores para nodos/relaciones creados o coincidentes |
### `neo4j_update`
Ejecuta declaraciones SET para actualizar propiedades de nodos y relaciones existentes en Neo4j
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `host` | string | Sí | Nombre de host o dirección IP del servidor Neo4j |
| `port` | number | Sí | Puerto del servidor Neo4j \(predeterminado: 7687 para protocolo Bolt\) |
| `database` | string | Sí | Nombre de la base de datos a la que conectarse |
| `username` | string | Sí | Nombre de usuario de Neo4j |
| `password` | string | Sí | Contraseña de Neo4j |
| `encryption` | string | No | Modo de cifrado de conexión \(enabled, disabled\) |
| `cypherQuery` | string | Sí | Consulta Cypher con declaraciones MATCH y SET para actualizar propiedades |
| `parameters` | object | No | Parámetros para la consulta Cypher como objeto JSON |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `message` | string | Mensaje de estado de la operación |
| `summary` | json | Resumen de actualización con contadores para propiedades establecidas |
### `neo4j_delete`
Ejecuta declaraciones DELETE o DETACH DELETE para eliminar nodos y relaciones de Neo4j
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `host` | string | Sí | Nombre de host o dirección IP del servidor Neo4j |
| `port` | number | Sí | Puerto del servidor Neo4j \(predeterminado: 7687 para protocolo Bolt\) |
| `database` | string | Sí | Nombre de la base de datos a la que conectarse |
| `username` | string | Sí | Nombre de usuario de Neo4j |
| `password` | string | Sí | Contraseña de Neo4j |
| `encryption` | string | No | Modo de cifrado de conexión \(enabled, disabled\) |
| `cypherQuery` | string | Sí | Consulta Cypher con declaraciones MATCH y DELETE/DETACH DELETE |
| `parameters` | object | No | Parámetros para la consulta Cypher como objeto JSON |
| `detach` | boolean | No | Si se debe usar DETACH DELETE para eliminar relaciones antes de eliminar nodos |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `message` | string | Mensaje de estado de la operación |
| `summary` | json | Resumen de eliminación con contadores para nodos y relaciones eliminados |
### `neo4j_execute`
Ejecuta consultas Cypher arbitrarias en la base de datos de grafos Neo4j para operaciones complejas
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `host` | string | Sí | Nombre de host o dirección IP del servidor Neo4j |
| `port` | number | Sí | Puerto del servidor Neo4j \(predeterminado: 7687 para el protocolo Bolt\) |
| `database` | string | Sí | Nombre de la base de datos a la que conectarse |
| `username` | string | Sí | Nombre de usuario de Neo4j |
| `password` | string | Sí | Contraseña de Neo4j |
| `encryption` | string | No | Modo de cifrado de conexión \(enabled, disabled\) |
| `cypherQuery` | string | Sí | Consulta Cypher a ejecutar \(cualquier declaración Cypher válida\) |
| `parameters` | object | No | Parámetros para la consulta Cypher como un objeto JSON |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `message` | string | Mensaje de estado de la operación |
| `records` | array | Array de registros devueltos por la consulta |
| `recordCount` | number | Número de registros devueltos |
| `summary` | json | Resumen de ejecución con tiempos y contadores |
## Notas
- Categoría: `tools`
- Tipo: `neo4j`

View File

@@ -71,8 +71,10 @@ Envía mensajes a canales o usuarios de Slack a través de la API de Slack. Comp
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `message` | object | Objeto de mensaje completo con todas las propiedades devueltas por Slack |
| `ts` | string | Marca de tiempo del mensaje |
| `channel` | string | ID del canal donde se envió el mensaje |
| `fileCount` | number | Número de archivos subidos (cuando se adjuntan archivos) |
### `slack_canvas`
@@ -155,6 +157,7 @@ Actualizar un mensaje enviado previamente por el bot en Slack
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `message` | object | Objeto de mensaje actualizado completo con todas las propiedades devueltas por Slack |
| `content` | string | Mensaje de éxito |
| `metadata` | object | Metadatos del mensaje actualizado |

View File

@@ -0,0 +1,117 @@
---
title: Voz a texto
description: Convierte voz a texto usando IA
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="stt"
color="#181C1E"
/>
{/* MANUAL-CONTENT-START:intro */}
Transcribe voz a texto utilizando modelos de IA de vanguardia de proveedores líderes. Las herramientas de Sim de voz a texto (STT) te permiten convertir archivos de audio y video en transcripciones precisas, con soporte para múltiples idiomas, marcas de tiempo y traducción opcional.
Proveedores compatibles:
- **[OpenAI Whisper](https://platform.openai.com/docs/guides/speech-to-text/overview)**: Modelo STT avanzado de código abierto de OpenAI. Compatible con modelos como `whisper-1` y maneja una amplia variedad de idiomas y formatos de audio.
- **[Deepgram](https://deepgram.com/)**: API de STT en tiempo real y por lotes con modelos de aprendizaje profundo como `nova-3`, `nova-2` y `whisper-large`. Ofrece características como diarización, reconocimiento de intención y ajuste específico para industrias.
- **[ElevenLabs](https://elevenlabs.io/)**: Conocido por su IA de voz de alta calidad, ElevenLabs proporciona modelos STT enfocados en precisión y comprensión del lenguaje natural para numerosos idiomas y dialectos.
Elige el proveedor y modelo que mejor se adapte a tu tarea, ya sea transcripción rápida de nivel de producción (Deepgram), capacidad multilingüe altamente precisa (Whisper) o comprensión avanzada y cobertura de idiomas (ElevenLabs).
{/* MANUAL-CONTENT-END */}
## Instrucciones de uso
Transcribe archivos de audio y video a texto utilizando proveedores de IA líderes. Compatible con múltiples idiomas, marcas de tiempo y diarización de hablantes.
## Herramientas
### `stt_whisper`
Transcribe audio a texto usando OpenAI Whisper
#### Entrada
| Parámetro | Tipo | Requerido | Descripción |
| --------- | ---- | -------- | ----------- |
| `provider` | string | Sí | Proveedor STT \(whisper\) |
| `apiKey` | string | Sí | Clave API de OpenAI |
| `model` | string | No | Modelo Whisper a utilizar \(predeterminado: whisper-1\) |
| `audioFile` | file | No | Archivo de audio o video para transcribir |
| `audioFileReference` | file | No | Referencia a archivo de audio/video de bloques anteriores |
| `audioUrl` | string | No | URL al archivo de audio o video |
| `language` | string | No | Código de idioma \(p.ej., "en", "es", "fr"\) o "auto" para detección automática |
| `timestamps` | string | No | Granularidad de marcas de tiempo: none, sentence, o word |
| `translateToEnglish` | boolean | No | Traducir audio a inglés |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `transcript` | string | Texto transcrito completo |
| `segments` | array | Segmentos con marcas de tiempo |
| `language` | string | Idioma detectado o especificado |
| `duration` | number | Duración del audio en segundos |
| `confidence` | number | Puntuación de confianza general |
### `stt_deepgram`
Transcribe audio a texto usando Deepgram
#### Entrada
| Parámetro | Tipo | Obligatorio | Descripción |
| --------- | ---- | -------- | ----------- |
| `provider` | string | Sí | Proveedor STT \(deepgram\) |
| `apiKey` | string | Sí | Clave API de Deepgram |
| `model` | string | No | Modelo de Deepgram a utilizar \(nova-3, nova-2, whisper-large, etc.\) |
| `audioFile` | file | No | Archivo de audio o video para transcribir |
| `audioFileReference` | file | No | Referencia al archivo de audio/video de bloques anteriores |
| `audioUrl` | string | No | URL al archivo de audio o video |
| `language` | string | No | Código de idioma \(p.ej., "en", "es", "fr"\) o "auto" para detección automática |
| `timestamps` | string | No | Granularidad de marcas de tiempo: none, sentence, o word |
| `diarization` | boolean | No | Habilitar diarización de hablantes |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `transcript` | string | Texto transcrito completo |
| `segments` | array | Segmentos con marcas de tiempo y etiquetas de hablantes |
| `language` | string | Idioma detectado o especificado |
| `duration` | number | Duración del audio en segundos |
| `confidence` | number | Puntuación de confianza general |
### `stt_elevenlabs`
Transcribe audio a texto usando ElevenLabs
#### Entrada
| Parámetro | Tipo | Requerido | Descripción |
| --------- | ---- | -------- | ----------- |
| `provider` | string | Sí | Proveedor STT \(elevenlabs\) |
| `apiKey` | string | Sí | Clave API de ElevenLabs |
| `model` | string | No | Modelo de ElevenLabs a utilizar \(scribe_v1, scribe_v1_experimental\) |
| `audioFile` | file | No | Archivo de audio o video para transcribir |
| `audioFileReference` | file | No | Referencia al archivo de audio/video de bloques anteriores |
| `audioUrl` | string | No | URL al archivo de audio o video |
| `language` | string | No | Código de idioma \(p.ej., "en", "es", "fr"\) o "auto" para detección automática |
| `timestamps` | string | No | Granularidad de marca de tiempo: none, sentence, o word |
#### Salida
| Parámetro | Tipo | Descripción |
| --------- | ---- | ----------- |
| `transcript` | string | Texto transcrito completo |
| `segments` | array | Segmentos con marcas de tiempo |
| `language` | string | Idioma detectado o especificado |
| `duration` | number | Duración del audio en segundos |
| `confidence` | number | Puntuación de confianza general |
## Notas
- Categoría: `tools`
- Tipo: `stt`

View File

@@ -42,10 +42,10 @@ Le prompt utilisateur représente les données d'entrée principales pour le tra
Le bloc Agent prend en charge plusieurs fournisseurs de LLM via une interface d'inférence unifiée. Les modèles disponibles comprennent :
- **OpenAI** : GPT-5, GPT-4o, o1, o3, o4-mini, gpt-4.1
- **Anthropic** : Claude 3.7 Sonnet
- **OpenAI** : GPT-5.1, GPT-5, GPT-4o, o1, o3, o4-mini, gpt-4.1
- **Anthropic** : Claude 4.5 Sonnet, Claude Opus 4.1
- **Google** : Gemini 2.5 Pro, Gemini 2.0 Flash
- **Autres fournisseurs** : Groq, Cerebras, xAI, DeepSeek
- **Autres fournisseurs** : Groq, Cerebras, xAI, Azure OpenAI, OpenRouter
- **Modèles locaux** : modèles compatibles avec Ollama
### Température

View File

@@ -0,0 +1,574 @@
---
title: Apollo
description: Recherchez, enrichissez et gérez des contacts avec Apollo.io
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="apollo"
color="#EBF212"
/>
{/* MANUAL-CONTENT-START:intro */}
[Apollo.io](https://apollo.io/) est une plateforme de premier plan en matière d'intelligence commerciale et d'engagement qui permet aux utilisateurs de trouver, d'enrichir et d'interagir avec des contacts et des entreprises à grande échelle. Apollo.io combine une vaste base de données de contacts avec des outils robustes d'enrichissement et d'automatisation des flux de travail, aidant les équipes de vente, de marketing et de recrutement à accélérer leur croissance.
Avec Apollo.io, vous pouvez :
- **Rechercher des millions de contacts et d'entreprises** : Trouvez des prospects précis à l'aide de filtres avancés
- **Enrichir les prospects et les comptes** : Complétez les informations manquantes avec des données vérifiées et des informations à jour
- **Gérer et organiser les enregistrements CRM** : Gardez vos données sur les personnes et les entreprises précises et exploitables
- **Automatiser la prospection** : Ajoutez des contacts à des séquences et créez des tâches de suivi directement depuis Apollo.io
Dans Sim, l'intégration Apollo.io permet à vos agents d'effectuer les opérations essentielles d'Apollo de manière programmatique :
- **Rechercher des personnes et des entreprises** : Utilisez `apollo_people_search` pour découvrir de nouveaux prospects à l'aide de filtres flexibles.
- **Enrichir les données des personnes** : Utilisez `apollo_people_enrich` pour augmenter les contacts avec des informations vérifiées.
- **Enrichir des personnes en masse** : Utilisez `apollo_people_bulk_enrich` pour l'enrichissement à grande échelle de plusieurs contacts à la fois.
- **Rechercher et enrichir des entreprises** : Utilisez `apollo_company_search` et `apollo_company_enrich` pour découvrir et mettre à jour des informations clés sur les entreprises.
Cela permet à vos agents de créer des flux de travail puissants pour la prospection, l'enrichissement CRM et l'automatisation sans saisie manuelle de données ou changement d'onglets. Intégrez Apollo.io comme source dynamique de données et moteur CRM — permettant à vos agents d'identifier, de qualifier et de contacter des prospects de manière transparente dans le cadre de leurs opérations quotidiennes.
{/* MANUAL-CONTENT-END */}
## Instructions d'utilisation
Intègre Apollo.io dans le flux de travail. Recherchez des personnes et des entreprises, enrichissez les données de contact, gérez vos contacts et comptes CRM, ajoutez des contacts aux séquences et créez des tâches.
## Outils
### `apollo_people_search`
Rechercher dans Apollo
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | ----------- | ----------- |
| `apiKey` | string | Oui | Clé API Apollo |
| `person_titles` | array | Non | Titres de poste à rechercher \(ex., \["CEO", "VP of Sales"\]\) |
| `person_locations` | array | Non | Lieux à rechercher \(ex., \["San Francisco, CA", "New York, NY"\]\) |
| `person_seniorities` | array | Non | Niveaux d'ancienneté \(ex., \["senior", "executive", "manager"\]\) |
| `organization_names` | array | Non | Noms d'entreprises à rechercher |
| `q_keywords` | string | Non | Mots-clés à rechercher |
| `page` | number | Non | Numéro de page pour la pagination \(par défaut : 1\) |
| `per_page` | number | Non | Résultats par page \(par défaut : 25, max : 100\) |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `people` | json | Tableau de personnes correspondant aux critères de recherche |
| `metadata` | json | Informations de pagination incluant page, par_page et total_entrées |
### `apollo_people_enrich`
Enrichir les données d'une personne en utilisant Apollo
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | ----------- | ----------- |
| `apiKey` | string | Oui | Clé API Apollo |
| `first_name` | string | Non | Prénom de la personne |
| `last_name` | string | Non | Nom de famille de la personne |
| `email` | string | Non | Adresse e-mail de la personne |
| `organization_name` | string | Non | Nom de l'entreprise où travaille la personne |
| `domain` | string | Non | Domaine de l'entreprise \(ex., apollo.io\) |
| `linkedin_url` | string | Non | URL du profil LinkedIn |
| `reveal_personal_emails` | boolean | Non | Révéler les adresses e-mail personnelles \(utilise des crédits\) |
| `reveal_phone_number` | boolean | Non | Révéler les numéros de téléphone \(utilise des crédits\) |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `person` | json | Données de personne enrichies depuis Apollo |
| `metadata` | json | Métadonnées d'enrichissement incluant le statut d'enrichissement |
### `apollo_people_bulk_enrich`
Enrichir les données pour jusqu'à 10 personnes à la fois en utilisant Apollo
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Oui | Clé API Apollo |
| `people` | array | Oui | Tableau de personnes à enrichir \(max 10\) |
| `reveal_personal_emails` | boolean | Non | Révéler les adresses e-mail personnelles \(utilise des crédits\) |
| `reveal_phone_number` | boolean | Non | Révéler les numéros de téléphone \(utilise des crédits\) |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `people` | json | Tableau de données de personnes enrichies |
| `metadata` | json | Métadonnées d'enrichissement en masse incluant les comptages totaux et enrichis |
### `apollo_organization_search`
Rechercher dans Apollo
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Oui | Clé API Apollo |
| `organization_locations` | array | Non | Emplacements d'entreprise à rechercher |
| `organization_num_employees_ranges` | array | Non | Fourchettes de nombre d'employés \(ex. \["1-10", "11-50"\]\) |
| `q_organization_keyword_tags` | array | Non | Tags d'industrie ou mots-clés |
| `q_organization_name` | string | Non | Nom de l'organisation à rechercher |
| `page` | number | Non | Numéro de page pour la pagination |
| `per_page` | number | Non | Résultats par page \(max : 100\) |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `organizations` | json | Tableau des organisations correspondant aux critères de recherche |
| `metadata` | json | Informations de pagination incluant page, par_page et total_entrées |
### `apollo_organization_enrich`
Enrichir les données pour une seule organisation en utilisant Apollo
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Oui | Clé API Apollo |
| `organization_name` | string | Non | Nom de l'organisation \(au moins un des paramètres nom_organisation ou domaine est requis\) |
| `domain` | string | Non | Domaine de l'entreprise \(par exemple, apollo.io\) \(au moins un des paramètres domaine ou nom_organisation est requis\) |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `organization` | json | Données d'organisation enrichies depuis Apollo |
| `metadata` | json | Métadonnées d'enrichissement incluant le statut d'enrichissement |
### `apollo_organization_bulk_enrich`
Enrichir les données pour jusqu'à 10 organisations à la fois en utilisant Apollo
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Oui | Clé API Apollo |
| `organizations` | array | Oui | Tableau des organisations à enrichir \(max 10\) |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `organizations` | json | Tableau des données d'organisation enrichies |
| `metadata` | json | Métadonnées d'enrichissement en masse incluant les comptages totaux et enrichis |
### `apollo_contact_create`
Créer un nouveau contact dans votre base de données Apollo
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Oui | Clé API Apollo |
| `first_name` | string | Oui | Prénom du contact |
| `last_name` | string | Oui | Nom de famille du contact |
| `email` | string | Non | Adresse e-mail du contact |
| `title` | string | Non | Titre du poste |
| `account_id` | string | Non | ID de compte Apollo à associer |
| `owner_id` | string | Non | ID utilisateur du propriétaire du contact |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `contact` | json | Données du contact créé dans Apollo |
| `metadata` | json | Métadonnées de création incluant le statut de création |
### `apollo_contact_update`
Mettre à jour un contact existant dans votre base de données Apollo
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Oui | Clé API Apollo |
| `contact_id` | string | Oui | ID du contact à mettre à jour |
| `first_name` | string | Non | Prénom du contact |
| `last_name` | string | Non | Nom de famille du contact |
| `email` | string | Non | Adresse e-mail |
| `title` | string | Non | Titre du poste |
| `account_id` | string | Non | ID de compte Apollo |
| `owner_id` | string | Non | ID utilisateur du propriétaire du contact |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `contact` | json | Données de contact mises à jour depuis Apollo |
| `metadata` | json | Métadonnées de mise à jour incluant le statut mis à jour |
### `apollo_contact_search`
Rechercher votre équipe
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Oui | Clé API Apollo |
| `q_keywords` | string | Non | Mots-clés à rechercher |
| `contact_stage_ids` | array | Non | Filtrer par IDs d'étape de contact |
| `page` | number | Non | Numéro de page pour la pagination |
| `per_page` | number | Non | Résultats par page \(max : 100\) |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `contacts` | json | Tableau de contacts correspondant aux critères de recherche |
| `metadata` | json | Informations de pagination incluant page, per_page et total_entries |
### `apollo_contact_bulk_create`
Créez jusqu'à 100 contacts à la fois dans votre base de données Apollo. Prend en charge la déduplication pour éviter de créer des contacts en double. Clé principale requise.
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Oui | Clé API Apollo \(clé principale requise\) |
| `contacts` | array | Oui | Tableau de contacts à créer \(max 100\). Chaque contact doit inclure first_name, last_name, et optionnellement email, title, account_id, owner_id |
| `run_dedupe` | boolean | Non | Activer la déduplication pour éviter de créer des contacts en double. Lorsque défini sur true, les contacts existants sont renvoyés sans modification |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `created_contacts` | json | Tableau des contacts nouvellement créés |
| `existing_contacts` | json | Tableau des contacts existants \(lorsque la déduplication est activée\) |
| `metadata` | json | Métadonnées de création en masse incluant le nombre de contacts créés et existants |
### `apollo_contact_bulk_update`
Mettez à jour jusqu'à 100 contacts existants à la fois dans votre base de données Apollo. Chaque contact doit inclure un champ id. Clé principale requise.
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Oui | Clé API Apollo \(clé principale requise\) |
| `contacts` | array | Oui | Tableau de contacts à mettre à jour \(max 100\). Chaque contact doit inclure le champ id, et optionnellement first_name, last_name, email, title, account_id, owner_id |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `updated_contacts` | json | Tableau des contacts mis à jour avec succès |
| `failed_contacts` | json | Tableau des contacts dont la mise à jour a échoué |
| `metadata` | json | Métadonnées de mise à jour en masse incluant le nombre de contacts mis à jour et en échec |
### `apollo_account_create`
Créer un nouveau compte (entreprise) dans votre base de données Apollo
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Oui | Clé API Apollo |
| `name` | string | Oui | Nom de l'entreprise |
| `website_url` | string | Non | URL du site web de l'entreprise |
| `phone` | string | Non | Numéro de téléphone de l'entreprise |
| `owner_id` | string | Non | ID utilisateur du propriétaire du compte |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `account` | json | Données du compte créé depuis Apollo |
| `metadata` | json | Métadonnées de création incluant le statut de création |
### `apollo_account_update`
Mettre à jour un compte existant dans votre base de données Apollo
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Oui | Clé API Apollo |
| `account_id` | string | Oui | ID du compte à mettre à jour |
| `name` | string | Non | Nom de l'entreprise |
| `website_url` | string | Non | URL du site web de l'entreprise |
| `phone` | string | Non | Numéro de téléphone de l'entreprise |
| `owner_id` | string | Non | ID utilisateur du propriétaire du compte |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `account` | json | Données du compte mis à jour depuis Apollo |
| `metadata` | json | Métadonnées de mise à jour incluant le statut de mise à jour |
### `apollo_account_search`
Rechercher dans votre équipe
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Oui | Clé API Apollo \(clé principale requise\) |
| `q_keywords` | string | Non | Mots-clés à rechercher dans les données du compte |
| `owner_id` | string | Non | Filtrer par ID utilisateur du propriétaire du compte |
| `account_stage_ids` | array | Non | Filtrer par IDs d'étape de compte |
| `page` | number | Non | Numéro de page pour la pagination |
| `per_page` | number | Non | Résultats par page \(max : 100\) |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `accounts` | json | Tableau des comptes correspondant aux critères de recherche |
| `metadata` | json | Informations de pagination incluant page, par_page et total_entrées |
### `apollo_account_bulk_create`
Créez jusqu'à 100 comptes à la fois dans votre base de données Apollo. Remarque : Apollo n'applique pas de déduplication - des comptes en double peuvent être créés si les entrées partagent des noms ou domaines similaires. Clé principale requise.
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Oui | Clé API Apollo \(clé principale requise\) |
| `accounts` | array | Oui | Tableau des comptes à créer \(max 100\). Chaque compte doit inclure un nom \(obligatoire\), et éventuellement website_url, téléphone, owner_id |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `created_accounts` | json | Tableau des comptes nouvellement créés |
| `failed_accounts` | json | Tableau des comptes dont la création a échoué |
| `metadata` | json | Métadonnées de création en masse incluant le nombre de comptes créés et échoués |
### `apollo_account_bulk_update`
Mettez à jour jusqu'à 1000 comptes existants à la fois dans votre base de données Apollo (limite plus élevée que pour les contacts !). Chaque compte doit inclure un champ id. Clé principale requise.
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Oui | Clé API Apollo \(clé principale requise\) |
| `accounts` | array | Oui | Tableau des comptes à mettre à jour \(max 1000\). Chaque compte doit inclure un champ id, et éventuellement name, website_url, phone, owner_id |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `updated_accounts` | json | Tableau des comptes mis à jour avec succès |
| `failed_accounts` | json | Tableau des comptes dont la mise à jour a échoué |
| `metadata` | json | Métadonnées de mise à jour en masse incluant le nombre de comptes mis à jour et échoués |
### `apollo_opportunity_create`
Créer une nouvelle opportunité pour un compte dans votre base de données Apollo (clé principale requise)
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | ---------- | ----------- |
| `apiKey` | string | Oui | Clé API Apollo \(clé principale requise\) |
| `name` | string | Oui | Nom de l'opportunité/affaire |
| `account_id` | string | Oui | ID du compte auquel cette opportunité appartient |
| `amount` | number | Non | Valeur monétaire de l'opportunité |
| `stage_id` | string | Non | ID de l'étape de l'affaire |
| `owner_id` | string | Non | ID utilisateur du propriétaire de l'opportunité |
| `close_date` | string | Non | Date de clôture prévue \(format ISO 8601\) |
| `description` | string | Non | Description ou notes concernant l'opportunité |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `opportunity` | json | Données de l'opportunité créée depuis Apollo |
| `metadata` | json | Métadonnées de création incluant le statut de création |
### `apollo_opportunity_search`
Rechercher et lister toutes les affaires/opportunités dans votre équipe
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | ---------- | ----------- |
| `apiKey` | string | Oui | Clé API Apollo |
| `q_keywords` | string | Non | Mots-clés à rechercher dans les noms d'opportunités |
| `account_ids` | array | Non | Filtrer par identifiants de compte spécifiques |
| `stage_ids` | array | Non | Filtrer par identifiants d'étape de transaction |
| `owner_ids` | array | Non | Filtrer par identifiants de propriétaires d'opportunités |
| `page` | number | Non | Numéro de page pour la pagination |
| `per_page` | number | Non | Résultats par page \(max : 100\) |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `opportunities` | json | Tableau d'opportunités correspondant aux critères de recherche |
| `metadata` | json | Informations de pagination incluant page, par_page et total_entrées |
### `apollo_opportunity_get`
Récupérer les détails complets d'une transaction/opportunité spécifique par ID
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | ---------- | ----------- |
| `apiKey` | string | Oui | Clé API Apollo |
| `opportunity_id` | string | Oui | ID de l'opportunité à récupérer |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `opportunity` | json | Données complètes de l'opportunité depuis Apollo |
| `metadata` | json | Métadonnées de récupération incluant le statut trouvé |
### `apollo_opportunity_update`
Mettre à jour une transaction/opportunité existante dans votre base de données Apollo
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | ---------- | ----------- |
| `apiKey` | string | Oui | Clé API Apollo |
| `opportunity_id` | string | Oui | ID de l'opportunité à mettre à jour |
| `name` | string | Non | Nom de l'opportunité/affaire |
| `amount` | number | Non | Valeur monétaire de l'opportunité |
| `stage_id` | string | Non | ID de l'étape de l'affaire |
| `owner_id` | string | Non | ID utilisateur du propriétaire de l'opportunité |
| `close_date` | string | Non | Date de clôture prévue (format ISO 8601) |
| `description` | string | Non | Description ou notes concernant l'opportunité |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `opportunity` | json | Données d'opportunité mises à jour depuis Apollo |
| `metadata` | json | Métadonnées de mise à jour incluant le statut de mise à jour |
### `apollo_sequence_search`
Rechercher des séquences/campagnes dans votre équipe
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | ---------- | ----------- |
| `apiKey` | string | Oui | Clé API Apollo (clé principale requise) |
| `q_name` | string | Non | Rechercher des séquences par nom |
| `active` | boolean | Non | Filtrer par statut actif (true pour les séquences actives, false pour les inactives) |
| `page` | number | Non | Numéro de page pour la pagination |
| `per_page` | number | Non | Résultats par page (max : 100) |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `sequences` | json | Tableau de séquences/campagnes correspondant aux critères de recherche |
| `metadata` | json | Informations de pagination incluant page, par_page et total_entrées |
### `apollo_sequence_add_contacts`
Ajouter des contacts à une séquence Apollo
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Oui | Clé API Apollo (clé principale requise) |
| `sequence_id` | string | Oui | ID de la séquence à laquelle ajouter des contacts |
| `contact_ids` | array | Oui | Tableau d'ID de contacts à ajouter à la séquence |
| `emailer_campaign_id` | string | Non | ID de campagne d'e-mailing optionnel |
| `send_email_from_user_id` | string | Non | ID utilisateur pour l'envoi des e-mails |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `contacts_added` | json | Tableau d'ID de contacts ajoutés à la séquence |
| `metadata` | json | Métadonnées de séquence incluant sequence_id et nombre total_added |
### `apollo_task_create`
Créer une nouvelle tâche dans Apollo
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Oui | Clé API Apollo (clé principale requise) |
| `note` | string | Oui | Note/description de la tâche |
| `contact_id` | string | Non | ID du contact à associer |
| `account_id` | string | Non | ID du compte à associer |
| `due_at` | string | Non | Date d'échéance au format ISO |
| `priority` | string | Non | Priorité de la tâche |
| `type` | string | Non | Type de tâche |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `task` | json | Données de tâche créées depuis Apollo |
| `metadata` | json | Métadonnées de création incluant le statut de création |
### `apollo_task_search`
Rechercher des tâches dans Apollo
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Oui | Clé API Apollo (clé principale requise) |
| `contact_id` | string | Non | Filtrer par ID de contact |
| `account_id` | string | Non | Filtrer par ID de compte |
| `completed` | boolean | Non | Filtrer par statut d'achèvement |
| `page` | number | Non | Numéro de page pour la pagination |
| `per_page` | number | Non | Résultats par page (max : 100) |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `tasks` | json | Tableau des tâches correspondant aux critères de recherche |
| `metadata` | json | Informations de pagination incluant page, par_page et total_entrées |
### `apollo_email_accounts`
Obtenir la liste de l'équipe
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Oui | Clé API Apollo (clé principale requise) |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `email_accounts` | json | Tableau des comptes email d'équipe liés dans Apollo |
| `metadata` | json | Métadonnées incluant le nombre total de comptes email |
## Notes
- Catégorie : `tools`
- Type : `apollo`

View File

@@ -0,0 +1,172 @@
---
title: Calendly
description: Gérer la planification et les événements Calendly
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="calendly"
color="#FFFFFF"
/>
{/* MANUAL-CONTENT-START:intro */}
[Calendly](https://calendly.com/) est une plateforme populaire d'automatisation de planification qui vous aide à organiser des réunions, des événements et des rendez-vous facilement. Avec Calendly, les équipes et les individus peuvent simplifier la planification, réduire les échanges d'e-mails et automatiser les tâches liées aux événements.
Avec l'intégration Sim Calendly, vos agents peuvent :
- **Récupérer des informations sur votre compte et les événements programmés** : Utilisez des outils pour obtenir des informations utilisateur, des types d'événements et des événements programmés pour analyse ou automatisation.
- **Gérer les types d'événements et la planification** : Accédez et listez les types d'événements disponibles pour les utilisateurs ou les organisations, récupérez des détails sur des types d'événements spécifiques, et surveillez les réunions programmées et les données des invités.
- **Automatiser les suivis et les flux de travail** : Lorsque les utilisateurs planifient, replanifient ou annulent des réunions, les agents Sim peuvent automatiquement déclencher les flux de travail correspondants—comme l'envoi de rappels, la mise à jour des CRM ou la notification des participants.
- **S'intégrer facilement à l'aide de webhooks** : Configurez des flux de travail Sim pour répondre aux événements webhook de Calendly en temps réel, notamment lorsque les invités planifient, annulent ou interagissent avec des formulaires de routage.
Que vous souhaitiez automatiser la préparation des réunions, gérer les invitations ou exécuter des flux de travail personnalisés en réponse à l'activité de planification, les outils Calendly dans Sim vous offrent un accès flexible et sécurisé. Débloquez de nouvelles automatisations en réagissant instantanément aux changements de planification—simplifiant les opérations et les communications de votre équipe.
{/* MANUAL-CONTENT-END */}
## Instructions d'utilisation
Intégrez Calendly dans votre flux de travail. Gérez les types d'événements, les événements programmés, les invités et les webhooks. Peut également déclencher des flux de travail basés sur les événements webhook de Calendly (invité programmé, invité annulé, formulaire de routage soumis). Nécessite un jeton d'accès personnel.
## Outils
### `calendly_get_current_user`
Obtenir des informations sur l'utilisateur Calendly actuellement authentifié
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | ---------- | ----------- |
| `apiKey` | string | Oui | Jeton d'accès personnel Calendly |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `resource` | object | Informations sur l'utilisateur actuel |
### `calendly_list_event_types`
Récupérer une liste de tous les types d'événements pour un utilisateur ou une organisation
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Oui | Jeton d'accès personnel Calendly |
| `user` | string | Non | Renvoie uniquement les types d'événements appartenant à cet utilisateur \(format URI\) |
| `organization` | string | Non | Renvoie uniquement les types d'événements appartenant à cette organisation \(format URI\) |
| `count` | number | Non | Nombre de résultats par page \(par défaut : 20, max : 100\) |
| `pageToken` | string | Non | Jeton de page pour la pagination |
| `sort` | string | Non | Ordre de tri pour les résultats \(par ex., "name:asc", "name:desc"\) |
| `active` | boolean | Non | Lorsque true, affiche uniquement les types d'événements actifs. Lorsque false ou non coché, affiche tous les types d'événements \(actifs et inactifs\). |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `collection` | array | Tableau d'objets de type d'événement |
### `calendly_get_event_type`
Obtenir des informations détaillées sur un type d'événement spécifique
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Oui | Jeton d'accès personnel Calendly |
| `eventTypeUuid` | string | Oui | UUID du type d'événement \(peut être l'URI complète ou simplement l'UUID\) |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `resource` | object | Détails du type d'événement |
### `calendly_list_scheduled_events`
Récupérer une liste des événements programmés pour un utilisateur ou une organisation
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Oui | Jeton d'accès personnel Calendly |
| `user` | string | Non | Renvoyer les événements appartenant à cet utilisateur \(format URI\). Soit "user" soit "organization" doit être fourni. |
| `organization` | string | Non | Renvoyer les événements appartenant à cette organisation \(format URI\). Soit "user" soit "organization" doit être fourni. |
| `invitee_email` | string | Non | Renvoyer les événements où l'invité a cette adresse e-mail |
| `count` | number | Non | Nombre de résultats par page \(par défaut : 20, max : 100\) |
| `max_start_time` | string | Non | Renvoyer les événements avec une heure de début avant cette heure \(format ISO 8601\) |
| `min_start_time` | string | Non | Renvoyer les événements avec une heure de début après cette heure \(format ISO 8601\) |
| `pageToken` | string | Non | Jeton de page pour la pagination |
| `sort` | string | Non | Ordre de tri pour les résultats \(par ex., "start_time:asc", "start_time:desc"\) |
| `status` | string | Non | Filtrer par statut \("active" ou "canceled"\) |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `collection` | array | Tableau d'objets d'événements programmés |
### `calendly_get_scheduled_event`
Obtenir des informations détaillées sur un événement programmé spécifique
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Oui | Jeton d'accès personnel Calendly |
| `eventUuid` | string | Oui | UUID de l'événement programmé \(peut être l'URI complète ou simplement l'UUID\) |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `resource` | object | Détails de l'événement programmé |
### `calendly_list_event_invitees`
Récupérer une liste des invités pour un événement programmé
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Oui | Jeton d'accès personnel Calendly |
| `eventUuid` | string | Oui | UUID de l'événement programmé \(peut être l'URI complète ou simplement l'UUID\) |
| `count` | number | Non | Nombre de résultats par page \(par défaut : 20, max : 100\) |
| `email` | string | Non | Filtrer les invités par adresse email |
| `pageToken` | string | Non | Jeton de page pour la pagination |
| `sort` | string | Non | Ordre de tri pour les résultats \(par ex., "created_at:asc", "created_at:desc"\) |
| `status` | string | Non | Filtrer par statut \("active" ou "canceled"\) |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `collection` | array | Tableau d'objets invités |
### `calendly_cancel_event`
Annuler un événement programmé
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Oui | Jeton d'accès personnel Calendly |
| `eventUuid` | string | Oui | UUID de l'événement programmé à annuler \(peut être l'URI complète ou simplement l'UUID\) |
| `reason` | string | Non | Motif d'annulation \(sera envoyé aux invités\) |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `resource` | object | Détails de l'annulation |
## Remarques
- Catégorie : `tools`
- Type : `calendly`

View File

@@ -23,10 +23,12 @@ Ajoutez une nouvelle mémoire à la base de données ou complétez une mémoire
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | ----------- | ----------- |
| `id` | string | Oui | Identifiant pour la mémoire. Si une mémoire avec cet ID existe déjà, les nouvelles données y seront ajoutées. |
| `role` | string | Oui | Rôle pour la mémoire de l'agent \(user, assistant, ou system\) |
| `content` | string | Oui | Contenu pour la mémoire de l'agent |
| --------- | ---- | ---------- | ----------- |
| `conversationId` | chaîne | Non | Identifiant de conversation (par ex., user-123, session-abc). Si une mémoire avec cet identifiant de conversation existe déjà pour ce bloc, le nouveau message y sera ajouté. |
| `id` | chaîne | Non | Paramètre hérité pour l'identifiant de conversation. Utilisez conversationId à la place. Fourni pour la rétrocompatibilité. |
| `role` | chaîne | Oui | Rôle pour la mémoire de l'agent (user, assistant, ou system) |
| `content` | chaîne | Oui | Contenu pour la mémoire de l'agent |
| `blockId` | chaîne | Non | ID de bloc optionnel. Si non fourni, utilise l'ID du bloc actuel du contexte d'exécution, ou par défaut "default". |
#### Sortie
@@ -38,22 +40,25 @@ Ajoutez une nouvelle mémoire à la base de données ou complétez une mémoire
### `memory_get`
Récupérer une mémoire spécifique par son identifiant
Récupérer la mémoire par conversationId, blockId, blockName, ou une combinaison. Renvoie toutes les mémoires correspondantes.
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | ----------- | ----------- |
| `id` | string | Oui | Identifiant de la mémoire à récupérer |
| --------- | ---- | ---------- | ----------- |
| `conversationId` | chaîne | Non | Identifiant de conversation (par ex., user-123, session-abc). Si fourni seul, renvoie toutes les mémoires pour cette conversation à travers tous les blocs. |
| `id` | chaîne | Non | Paramètre hérité pour l'identifiant de conversation. Utilisez conversationId à la place. Fourni pour la rétrocompatibilité. |
| `blockId` | chaîne | Non | Identifiant de bloc. Si fourni seul, renvoie toutes les mémoires pour ce bloc à travers toutes les conversations. Si fourni avec conversationId, renvoie les mémoires pour cette conversation spécifique dans ce bloc. |
| `blockName` | chaîne | Non | Nom du bloc. Alternative à blockId. Si fourni seul, renvoie toutes les mémoires pour les blocs avec ce nom. Si fourni avec conversationId, renvoie les mémoires pour cette conversation dans les blocs avec ce nom. |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Indique si la mémoire a été récupérée avec succès |
| `memories` | array | Tableau de données de mémoire pour l'identifiant demandé |
| `message` | string | Message de succès ou d'erreur |
| `error` | string | Message d'erreur si l'opération a échoué |
| `success` | booléen | Indique si la mémoire a été récupérée avec succès |
| `memories` | tableau | Tableau d'objets de mémoire avec les champs conversationId, blockId, blockName et data |
| `message` | chaîne | Message de succès ou d'erreur |
| `error` | chaîne | Message d'erreur si l'opération a échoué |
### `memory_get_all`
@@ -68,20 +73,23 @@ Récupérer toutes les mémoires de la base de données
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Indique si toutes les mémoires ont été récupérées avec succès |
| `memories` | array | Tableau de tous les objets de mémoire avec leurs clés, types et données |
| `message` | string | Message de succès ou d'erreur |
| `error` | string | Message d'erreur si l'opération a échoué |
| `success` | booléen | Indique si toutes les mémoires ont été récupérées avec succès |
| `memories` | tableau | Tableau de tous les objets de mémoire avec les champs key, conversationId, blockId, blockName et data |
| `message` | chaîne | Message de succès ou d'erreur |
| `error` | chaîne | Message d'erreur si l'opération a échoué |
### `memory_delete`
Supprimer un souvenir spécifique par son ID
Supprimer des mémoires par conversationId, blockId, blockName, ou une combinaison. Prend en charge la suppression en masse.
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | ---------- | ----------- |
| `id` | chaîne | Oui | Identifiant du souvenir à supprimer |
| --------- | ---- | ----------- | ----------- |
| `conversationId` | chaîne | Non | Identifiant de conversation \(par exemple, user-123, session-abc\). Si fourni seul, supprime toutes les mémoires pour cette conversation dans tous les blocs. |
| `id` | chaîne | Non | Paramètre hérité pour l'identifiant de conversation. Utilisez conversationId à la place. Fourni pour la rétrocompatibilité. |
| `blockId` | chaîne | Non | Identifiant de bloc. Si fourni seul, supprime toutes les mémoires pour ce bloc dans toutes les conversations. Si fourni avec conversationId, supprime les mémoires pour cette conversation spécifique dans ce bloc. |
| `blockName` | chaîne | Non | Nom du bloc. Alternative à blockId. Si fourni seul, supprime toutes les mémoires pour les blocs avec ce nom. Si fourni avec conversationId, supprime les mémoires pour cette conversation dans les blocs avec ce nom. |
#### Sortie

View File

@@ -26,7 +26,7 @@ Dans Sim, l'intégration Microsoft Excel offre un accès transparent aux fonctio
## Instructions d'utilisation
Intégrez Microsoft Excel dans le flux de travail. Peut lire, écrire, mettre à jour et ajouter au tableau. Nécessite OAuth.
Intégrez Microsoft Excel dans le flux de travail. Peut lire, écrire, mettre à jour, ajouter au tableau et créer de nouvelles feuilles de calcul.
## Outils
@@ -91,6 +91,23 @@ Ajouter de nouvelles lignes à un tableau Microsoft Excel
| `values` | array | Tableau des lignes qui ont été ajoutées au tableau |
| `metadata` | object | Métadonnées de la feuille de calcul |
### `microsoft_excel_worksheet_add`
Créer une nouvelle feuille de calcul dans un classeur Microsoft Excel
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| `spreadsheetId` | chaîne | Oui | L'identifiant du classeur Excel dans lequel ajouter la feuille de calcul |
| `worksheetName` | chaîne | Oui | Le nom de la nouvelle feuille de calcul. Doit être unique dans le classeur et ne peut pas dépasser 31 caractères |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `worksheet` | objet | Détails de la feuille de calcul nouvellement créée |
## Remarques
- Catégorie : `tools`

View File

@@ -0,0 +1,172 @@
---
title: Neo4j
description: Connexion à la base de données graphe Neo4j
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="neo4j"
color="#FFFFFF"
/>
## Instructions d'utilisation
Intégrez la base de données graphe Neo4j dans le flux de travail. Permet d'interroger, créer, fusionner, mettre à jour et supprimer des nœuds et des relations.
## Outils
### `neo4j_query`
Exécutez des requêtes MATCH pour lire les nœuds et les relations de la base de données graphe Neo4j. Pour de meilleures performances et pour éviter les grands ensembles de résultats, incluez LIMIT dans votre requête (par exemple,
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| `host` | string | Oui | Nom d'hôte ou adresse IP du serveur Neo4j |
| `port` | number | Oui | Port du serveur Neo4j \(par défaut : 7687 pour le protocole Bolt\) |
| `database` | string | Oui | Nom de la base de données à laquelle se connecter |
| `username` | string | Oui | Nom d'utilisateur Neo4j |
| `password` | string | Oui | Mot de passe Neo4j |
| `encryption` | string | Non | Mode de chiffrement de connexion \(enabled, disabled\) |
| `cypherQuery` | string | Oui | Requête Cypher à exécuter \(généralement des instructions MATCH\) |
| `parameters` | object | Non | Paramètres pour la requête Cypher sous forme d'objet JSON. À utiliser pour toutes les valeurs dynamiques, y compris LIMIT \(par exemple, query: "MATCH \(n\) RETURN n LIMIT $limit", parameters: \{limit: 100\}\). |
| `parameters` | string | Non | Pas de description |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `message` | string | Message d'état de l'opération |
| `records` | array | Tableau des enregistrements retournés par la requête |
| `recordCount` | number | Nombre d'enregistrements retournés |
| `summary` | json | Résumé de l'exécution de la requête avec timing et compteurs |
### `neo4j_create`
Exécuter des instructions CREATE pour ajouter de nouveaux nœuds et relations à la base de données graphique Neo4j
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | ---------- | ----------- |
| `host` | chaîne | Oui | Nom d'hôte ou adresse IP du serveur Neo4j |
| `port` | nombre | Oui | Port du serveur Neo4j \(par défaut : 7687 pour le protocole Bolt\) |
| `database` | chaîne | Oui | Nom de la base de données à laquelle se connecter |
| `username` | chaîne | Oui | Nom d'utilisateur Neo4j |
| `password` | chaîne | Oui | Mot de passe Neo4j |
| `encryption` | chaîne | Non | Mode de chiffrement de connexion \(enabled, disabled\) |
| `cypherQuery` | chaîne | Oui | Instruction Cypher CREATE à exécuter |
| `parameters` | objet | Non | Paramètres pour la requête Cypher sous forme d'objet JSON |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `message` | chaîne | Message d'état de l'opération |
| `summary` | json | Résumé de création avec compteurs pour les nœuds et relations créés |
### `neo4j_merge`
Exécuter des instructions MERGE pour trouver ou créer des nœuds et relations dans Neo4j (opération d'upsert)
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | ---------- | ----------- |
| `host` | chaîne | Oui | Nom d'hôte ou adresse IP du serveur Neo4j |
| `port` | nombre | Oui | Port du serveur Neo4j \(par défaut : 7687 pour le protocole Bolt\) |
| `database` | chaîne | Oui | Nom de la base de données à laquelle se connecter |
| `username` | chaîne | Oui | Nom d'utilisateur Neo4j |
| `password` | chaîne | Oui | Mot de passe Neo4j |
| `encryption` | chaîne | Non | Mode de chiffrement de connexion \(enabled, disabled\) |
| `cypherQuery` | chaîne | Oui | Instruction Cypher MERGE à exécuter |
| `parameters` | objet | Non | Paramètres pour la requête Cypher sous forme d'objet JSON |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `message` | string | Message d'état de l'opération |
| `summary` | json | Résumé de fusion avec compteurs pour les nœuds/relations créés ou correspondants |
### `neo4j_update`
Exécuter des instructions SET pour mettre à jour les propriétés des nœuds et relations existants dans Neo4j
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| `host` | string | Oui | Nom d'hôte ou adresse IP du serveur Neo4j |
| `port` | number | Oui | Port du serveur Neo4j \(par défaut : 7687 pour le protocole Bolt\) |
| `database` | string | Oui | Nom de la base de données à laquelle se connecter |
| `username` | string | Oui | Nom d'utilisateur Neo4j |
| `password` | string | Oui | Mot de passe Neo4j |
| `encryption` | string | Non | Mode de chiffrement de connexion \(enabled, disabled\) |
| `cypherQuery` | string | Oui | Requête Cypher avec instructions MATCH et SET pour mettre à jour les propriétés |
| `parameters` | object | Non | Paramètres pour la requête Cypher sous forme d'objet JSON |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `message` | string | Message d'état de l'opération |
| `summary` | json | Résumé de mise à jour avec compteurs pour les propriétés définies |
### `neo4j_delete`
Exécuter des instructions DELETE ou DETACH DELETE pour supprimer des nœuds et des relations de Neo4j
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| `host` | string | Oui | Nom d'hôte ou adresse IP du serveur Neo4j |
| `port` | number | Oui | Port du serveur Neo4j \(par défaut : 7687 pour le protocole Bolt\) |
| `database` | string | Oui | Nom de la base de données à laquelle se connecter |
| `username` | string | Oui | Nom d'utilisateur Neo4j |
| `password` | string | Oui | Mot de passe Neo4j |
| `encryption` | string | Non | Mode de chiffrement de connexion \(enabled, disabled\) |
| `cypherQuery` | string | Oui | Requête Cypher avec instructions MATCH et DELETE/DETACH DELETE |
| `parameters` | object | Non | Paramètres pour la requête Cypher sous forme d'objet JSON |
| `detach` | boolean | Non | Indique s'il faut utiliser DETACH DELETE pour supprimer les relations avant de supprimer les nœuds |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `message` | string | Message d'état de l'opération |
| `summary` | json | Résumé de suppression avec compteurs pour les nœuds et relations supprimés |
### `neo4j_execute`
Exécuter des requêtes Cypher arbitraires sur la base de données graphique Neo4j pour des opérations complexes
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | ----------- | ----------- |
| `host` | string | Oui | Nom d'hôte ou adresse IP du serveur Neo4j |
| `port` | number | Oui | Port du serveur Neo4j \(par défaut : 7687 pour le protocole Bolt\) |
| `database` | string | Oui | Nom de la base de données à laquelle se connecter |
| `username` | string | Oui | Nom d'utilisateur Neo4j |
| `password` | string | Oui | Mot de passe Neo4j |
| `encryption` | string | Non | Mode de chiffrement de connexion \(enabled, disabled\) |
| `cypherQuery` | string | Oui | Requête Cypher à exécuter \(toute instruction Cypher valide\) |
| `parameters` | object | Non | Paramètres pour la requête Cypher sous forme d'objet JSON |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `message` | string | Message d'état de l'opération |
| `records` | array | Tableau des enregistrements retournés par la requête |
| `recordCount` | number | Nombre d'enregistrements retournés |
| `summary` | json | Résumé d'exécution avec chronométrage et compteurs |
## Notes
- Catégorie : `tools`
- Type : `neo4j`

View File

@@ -71,8 +71,10 @@ Envoyez des messages aux canaux ou utilisateurs Slack via l'API Slack. Prend en
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `message` | objet | Objet de message complet avec toutes les propriétés renvoyées par Slack |
| `ts` | chaîne | Horodatage du message |
| `channel` | chaîne | ID du canal où le message a été envoyé |
| `fileCount` | nombre | Nombre de fichiers téléchargés \(lorsque des fichiers sont joints\) |
### `slack_canvas`
@@ -155,6 +157,7 @@ Mettre à jour un message précédemment envoyé par le bot dans Slack
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `message` | objet | Objet de message mis à jour complet avec toutes les propriétés renvoyées par Slack |
| `content` | chaîne | Message de succès |
| `metadata` | objet | Métadonnées du message mis à jour |

View File

@@ -1017,3 +1017,22 @@ Lister tous les événements
- Catégorie : `tools`
- Type : `stripe`
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | Oui | Clé API Stripe (clé secrète) |
| `limit` | number | Non | Nombre de résultats à retourner (par défaut 10, max 100) |
| `type` | string | Non | Filtrer par type d'événement (par ex., payment_intent.created) |
| `created` | json | Non | Filtrer par date de création (par ex., \{"gt": 1633024800\}) |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `events` | json | Tableau d'objets événement |
| `metadata` | json | Métadonnées de liste incluant le nombre et has_more |
## Notes
- Catégorie : `tools`
- Type : `stripe`

View File

@@ -0,0 +1,117 @@
---
title: Reconnaissance vocale
description: Convertir la parole en texte à l'aide de l'IA
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="stt"
color="#181C1E"
/>
{/* MANUAL-CONTENT-START:intro */}
Transcrivez la parole en texte en utilisant des modèles d'IA de pointe des principaux fournisseurs. Les outils Sim de reconnaissance vocale (STT) vous permettent de convertir des fichiers audio et vidéo en transcriptions précises, prenant en charge plusieurs langues, horodatages et traduction optionnelle.
Fournisseurs pris en charge :
- **[OpenAI Whisper](https://platform.openai.com/docs/guides/speech-to-text/overview)** : Modèle STT open-source avancé d'OpenAI. Prend en charge des modèles tels que `whisper-1` et gère une grande variété de langues et de formats audio.
- **[Deepgram](https://deepgram.com/)** : API STT en temps réel et par lots avec des modèles d'apprentissage profond comme `nova-3`, `nova-2` et `whisper-large`. Offre des fonctionnalités comme la diarisation, la reconnaissance d'intention et le réglage spécifique à l'industrie.
- **[ElevenLabs](https://elevenlabs.io/)** : Connu pour l'IA vocale de haute qualité, ElevenLabs fournit des modèles STT axés sur la précision et la compréhension du langage naturel pour de nombreuses langues et dialectes.
Choisissez le fournisseur et le modèle les mieux adaptés à votre tâche — que ce soit pour une transcription rapide de qualité production (Deepgram), une capacité multilingue hautement précise (Whisper), ou une compréhension avancée et une couverture linguistique étendue (ElevenLabs).
{/* MANUAL-CONTENT-END */}
## Instructions d'utilisation
Transcrivez des fichiers audio et vidéo en texte à l'aide des principaux fournisseurs d'IA. Prend en charge plusieurs langues, horodatages et diarisation des locuteurs.
## Outils
### `stt_whisper`
Transcrire l'audio en texte avec OpenAI Whisper
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| `provider` | string | Oui | Fournisseur STT \(whisper\) |
| `apiKey` | string | Oui | Clé API OpenAI |
| `model` | string | Non | Modèle Whisper à utiliser \(par défaut : whisper-1\) |
| `audioFile` | file | Non | Fichier audio ou vidéo à transcrire |
| `audioFileReference` | file | Non | Référence au fichier audio/vidéo des blocs précédents |
| `audioUrl` | string | Non | URL vers un fichier audio ou vidéo |
| `language` | string | Non | Code de langue \(ex. "en", "es", "fr"\) ou "auto" pour la détection automatique |
| `timestamps` | string | Non | Granularité des horodatages : none, sentence, ou word |
| `translateToEnglish` | boolean | Non | Traduire l'audio en anglais |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `transcript` | string | Texte transcrit complet |
| `segments` | array | Segments horodatés |
| `language` | string | Langue détectée ou spécifiée |
| `duration` | number | Durée audio en secondes |
| `confidence` | number | Score de confiance global |
### `stt_deepgram`
Transcrire l'audio en texte en utilisant Deepgram
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | -------- | ----------- |
| `provider` | string | Oui | Fournisseur STT \(deepgram\) |
| `apiKey` | string | Oui | Clé API Deepgram |
| `model` | string | Non | Modèle Deepgram à utiliser \(nova-3, nova-2, whisper-large, etc.\) |
| `audioFile` | file | Non | Fichier audio ou vidéo à transcrire |
| `audioFileReference` | file | Non | Référence au fichier audio/vidéo des blocs précédents |
| `audioUrl` | string | Non | URL vers un fichier audio ou vidéo |
| `language` | string | Non | Code de langue \(ex. "en", "es", "fr"\) ou "auto" pour la détection automatique |
| `timestamps` | string | Non | Granularité des horodatages : none, sentence, ou word |
| `diarization` | boolean | Non | Activer la diarisation des locuteurs |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `transcript` | string | Texte transcrit complet |
| `segments` | array | Segments horodatés avec étiquettes de locuteurs |
| `language` | string | Langue détectée ou spécifiée |
| `duration` | number | Durée audio en secondes |
| `confidence` | number | Score de confiance global |
### `stt_elevenlabs`
Transcrire l'audio en texte avec ElevenLabs
#### Entrée
| Paramètre | Type | Obligatoire | Description |
| --------- | ---- | ---------- | ----------- |
| `provider` | chaîne | Oui | Fournisseur STT \(elevenlabs\) |
| `apiKey` | chaîne | Oui | Clé API ElevenLabs |
| `model` | chaîne | Non | Modèle ElevenLabs à utiliser \(scribe_v1, scribe_v1_experimental\) |
| `audioFile` | fichier | Non | Fichier audio ou vidéo à transcrire |
| `audioFileReference` | fichier | Non | Référence au fichier audio/vidéo des blocs précédents |
| `audioUrl` | chaîne | Non | URL vers un fichier audio ou vidéo |
| `language` | chaîne | Non | Code de langue \(ex. "en", "es", "fr"\) ou "auto" pour la détection automatique |
| `timestamps` | chaîne | Non | Granularité des horodatages : none, sentence, ou word |
#### Sortie
| Paramètre | Type | Description |
| --------- | ---- | ----------- |
| `transcript` | chaîne | Texte transcrit complet |
| `segments` | tableau | Segments horodatés |
| `language` | chaîne | Langue détectée ou spécifiée |
| `duration` | nombre | Durée audio en secondes |
| `confidence` | nombre | Score de confiance global |
## Remarques
- Catégorie : `tools`
- Type : `stt`

View File

@@ -42,10 +42,10 @@ When responding to questions about investments, include risk disclaimers.
エージェントブロックは統一された推論インターフェースを通じて複数のLLMプロバイダーをサポートしています。利用可能なモデルには以下が含まれます
- **OpenAI**: GPT-5、GPT-4o、o1、o3、o4-mini、gpt-4.1
- **Anthropic**: Claude 3.7 Sonnet
- **OpenAI**: GPT-5.1、GPT-5、GPT-4o、o1、o3、o4-mini、gpt-4.1
- **Anthropic**: Claude 4.5 Sonnet、Claude Opus 4.1
- **Google**: Gemini 2.5 Pro、Gemini 2.0 Flash
- **その他のプロバイダー**: Groq、Cerebras、xAI、DeepSeek
- **その他のプロバイダー**: Groq、Cerebras、xAI、Azure OpenAI、OpenRouter
- **ローカルモデル**: Ollama互換モデル
### 温度

View File

@@ -0,0 +1,574 @@
---
title: Apollo
description: Apollo.ioで連絡先の検索、情報強化、管理を行う
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="apollo"
color="#EBF212"
/>
{/* MANUAL-CONTENT-START:intro */}
[Apollo.io](https://apollo.io/)は、ユーザーが大規模に連絡先や企業を見つけ、情報を強化し、エンゲージメントを行うことができる、先進的な営業インテリジェンスおよびエンゲージメントプラットフォームです。Apollo.ioは、広範な連絡先データベースと堅牢な情報強化およびワークフロー自動化ツールを組み合わせ、営業、マーケティング、採用チームの成長を加速させるのに役立ちます。
Apollo.ioでは、以下のことが可能です
- **数百万の連絡先と企業を検索**: 高度なフィルターを使用して正確なリードを見つける
- **リードとアカウントの情報を強化**: 検証済みデータと最新情報で不足している詳細を補完
- **CRMレコードの管理と整理**: 人物と企業のデータを正確かつ実用的に保つ
- **アウトリーチの自動化**: Apollo.ioから直接連絡先をシーケンスに追加し、フォローアップタスクを作成
Simでは、Apollo.io統合により、エージェントがプログラムによって主要なApollo操作を実行できます
- **人物と企業の検索**: `apollo_people_search`を使用して、柔軟なフィルターで新しいリードを発見します。
- **人物データの強化**: `apollo_people_enrich`を使用して、連絡先を検証済み情報で補強します。
- **人物の一括強化**: `apollo_people_bulk_enrich`を使用して、複数の連絡先を一度に大規模に強化します。
- **企業の検索と強化**: `apollo_company_search`と`apollo_company_enrich`を使用して、主要な企業情報を発見し更新します。
これにより、エージェントは手動でのデータ入力やタブの切り替えなしに、見込み客の発掘、CRM情報強化、自動化のための強力なワークフローを構築できます。Apollo.ioを動的なデータソースとCRMエンジンとして統合することで、エージェントが日常業務の一部として、リードを特定し、資格を評価し、シームレスにアプローチすることができます。
{/* MANUAL-CONTENT-END */}
## 使用手順
Apollo.ioをワークフローに統合します。人物や企業を検索し、連絡先データを充実させ、CRMの連絡先やアカウントを管理し、連絡先をシーケンスに追加し、タスクを作成できます。
## ツール
### `apollo_people_search`
Apolloを検索
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | はい | Apollo APIキー |
| `person_titles` | array | いいえ | 検索する役職(例:["CEO", "VP of Sales"] |
| `person_locations` | array | いいえ | 検索する場所(例:["San Francisco, CA", "New York, NY"] |
| `person_seniorities` | array | いいえ | 役職レベル(例:["senior", "executive", "manager"] |
| `organization_names` | array | いいえ | 検索対象の企業名 |
| `q_keywords` | string | いいえ | 検索するキーワード |
| `page` | number | いいえ | ページネーションのページ番号デフォルト1 |
| `per_page` | number | いいえ | 1ページあたりの結果数デフォルト25、最大100 |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `people` | json | 検索条件に一致する人物の配列 |
| `metadata` | json | ページ、per_page、total_entriesを含むページネーション情報 |
### `apollo_people_enrich`
Apolloを使用して1人のデータを充実させる
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | はい | Apollo APIキー |
| `first_name` | string | いいえ | 人物の名 |
| `last_name` | string | いいえ | 人物の姓 |
| `email` | string | いいえ | 人物のメールアドレス |
| `organization_name` | string | いいえ | 人物が勤務する企業名 |
| `domain` | string | いいえ | 企業ドメインapollo.io |
| `linkedin_url` | string | いいえ | LinkedInプロフィールURL |
| `reveal_personal_emails` | boolean | いいえ | 個人メールアドレスを表示(クレジットを使用) |
| `reveal_phone_number` | boolean | いいえ | 電話番号を表示(クレジットを使用) |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `person` | json | Apolloからの充実した人物データ |
| `metadata` | json | 充実ステータスを含むエンリッチメントメタデータ |
### `apollo_people_bulk_enrich`
Apolloを使用して一度に最大10人のデータを充実させる
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | はい | Apollo APIキー |
| `people` | array | はい | 充実させる人物の配列最大10人 |
| `reveal_personal_emails` | boolean | いいえ | 個人メールアドレスを表示(クレジットを使用) |
| `reveal_phone_number` | boolean | いいえ | 電話番号を表示(クレジットを使用) |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `people` | json | 充実した人物データの配列 |
| `metadata` | json | 合計数と充実数を含む一括充実メタデータ |
### `apollo_organization_search`
Apolloを検索
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | はい | Apollo APIキー |
| `organization_locations` | array | いいえ | 検索する会社の所在地 |
| `organization_num_employees_ranges` | array | いいえ | 従業員数の範囲(例:["1-10", "11-50"] |
| `q_organization_keyword_tags` | array | いいえ | 業界またはキーワードタグ |
| `q_organization_name` | string | いいえ | 検索する組織名 |
| `page` | number | いいえ | ページネーションのページ番号 |
| `per_page` | number | いいえ | ページあたりの結果数最大100 |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `organizations` | json | 検索条件に一致する組織の配列 |
| `metadata` | json | ページ、per_page、total_entriesを含むページネーション情報 |
### `apollo_organization_enrich`
Apolloを使用して単一の組織のデータを充実させる
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | はい | Apollo APIキー |
| `organization_name` | string | いいえ | 組織名organization_nameまたはdomainの少なくとも1つが必要 |
| `domain` | string | いいえ | 会社ドメインapollo.iodomainまたはorganization_nameの少なくとも1つが必要 |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `organization` | json | Apolloからの充実した組織データ |
| `metadata` | json | 充実ステータスを含むエンリッチメントメタデータ |
### `apollo_organization_bulk_enrich`
Apolloを使用して最大10の組織のデータを一度に充実させる
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | はい | Apollo APIキー |
| `organizations` | array | はい | 充実させる組織の配列最大10 |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `organizations` | json | 充実した組織データの配列 |
| `metadata` | json | 合計数と充実数を含む一括エンリッチメントメタデータ |
### `apollo_contact_create`
Apolloデータベースに新しい連絡先を作成する
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | はい | Apollo APIキー |
| `first_name` | string | はい | 連絡先の名 |
| `last_name` | string | はい | 連絡先の姓 |
| `email` | string | いいえ | 連絡先のメールアドレス |
| `title` | string | いいえ | 役職 |
| `account_id` | string | いいえ | 関連付けるApolloアカウントID |
| `owner_id` | string | いいえ | 連絡先所有者のユーザーID |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `contact` | json | Apolloから作成された連絡先データ |
| `metadata` | json | 作成ステータスを含む作成メタデータ |
### `apollo_contact_update`
Apolloデータベースの既存の連絡先を更新する
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | はい | Apollo APIキー |
| `contact_id` | string | はい | 更新する連絡先のID |
| `first_name` | string | いいえ | 連絡先の名 |
| `last_name` | string | いいえ | 連絡先の姓 |
| `email` | string | いいえ | メールアドレス |
| `title` | string | いいえ | 役職 |
| `account_id` | string | いいえ | Apolloアカウント ID |
| `owner_id` | string | いいえ | 連絡先所有者のユーザーID |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `contact` | json | Apolloから更新された連絡先データ |
| `metadata` | json | 更新ステータスを含む更新メタデータ |
### `apollo_contact_search`
チームを検索
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | はい | Apollo APIキー |
| `q_keywords` | string | いいえ | 検索するキーワード |
| `contact_stage_ids` | array | いいえ | 連絡先ステージIDでフィルタリング |
| `page` | number | いいえ | ページネーションのページ番号 |
| `per_page` | number | いいえ | 1ページあたりの結果数最大100 |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `contacts` | json | 検索条件に一致する連絡先の配列 |
| `metadata` | json | ページ、per_page、total_entriesを含むページネーション情報 |
### `apollo_contact_bulk_create`
Apolloデータベースに一度に最大100件の連絡先を作成します。重複を防ぐための重複排除をサポートしています。マスターキーが必要です。
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | はい | Apollo APIキーマスターキーが必要 |
| `contacts` | array | はい | 作成する連絡先の配列最大100件。各連絡先にはfirst_name、last_nameを含め、オプションでemail、title、account_id、owner_idを含めることができます |
| `run_dedupe` | boolean | いいえ | 重複する連絡先の作成を防ぐための重複排除を有効にします。trueの場合、既存の連絡先は変更せずに返されます |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `created_contacts` | json | 新しく作成された連絡先の配列 |
| `existing_contacts` | json | 既存の連絡先の配列(重複排除が有効な場合) |
| `metadata` | json | 作成された連絡先と既存の連絡先の数を含む一括作成メタデータ |
### `apollo_contact_bulk_update`
Apolloデータベース内の最大100件の既存の連絡先を一度に更新します。各連絡先にはidフィールドが含まれている必要があります。マスターキーが必要です。
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | はい | Apollo APIキーマスターキーが必要 |
| `contacts` | array | はい | 更新する連絡先の配列最大100件。各連絡先にはidフィールドが必須で、オプションでfirst_name、last_name、email、title、account_id、owner_idを含めることができます |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `updated_contacts` | json | 正常に更新された連絡先の配列 |
| `failed_contacts` | json | 更新に失敗した連絡先の配列 |
| `metadata` | json | 更新された連絡先と失敗した連絡先の数を含む一括更新メタデータ |
### `apollo_account_create`
Apolloデータベースに新しいアカウント会社を作成します
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | はい | Apollo APIキー |
| `name` | string | はい | 会社名 |
| `website_url` | string | いいえ | 会社のウェブサイトURL |
| `phone` | string | いいえ | 会社の電話番号 |
| `owner_id` | string | いいえ | アカウント所有者のユーザーID |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `account` | json | Apolloから作成されたアカウントデータ |
| `metadata` | json | 作成ステータスを含む作成メタデータ |
### `apollo_account_update`
Apolloデータベース内の既存のアカウントを更新する
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | はい | Apollo APIキー |
| `account_id` | string | はい | 更新するアカウントのID |
| `name` | string | いいえ | 会社名 |
| `website_url` | string | いいえ | 会社のウェブサイトURL |
| `phone` | string | いいえ | 会社の電話番号 |
| `owner_id` | string | いいえ | アカウント所有者のユーザーID |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `account` | json | Apolloから更新されたアカウントデータ |
| `metadata` | json | 更新ステータスを含む更新メタデータ |
### `apollo_account_search`
チームを検索する
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | はい | Apollo APIキーマスターキーが必要 |
| `q_keywords` | string | いいえ | アカウントデータで検索するキーワード |
| `owner_id` | string | いいえ | アカウント所有者のユーザーIDでフィルタリング |
| `account_stage_ids` | array | いいえ | アカウントステージIDでフィルタリング |
| `page` | number | いいえ | ページネーションのページ番号 |
| `per_page` | number | いいえ | 1ページあたりの結果数最大100 |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `accounts` | json | 検索条件に一致するアカウントの配列 |
| `metadata` | json | ページ、per_page、total_entriesを含むページネーション情報 |
### `apollo_account_bulk_create`
Apolloデータベースに一度に最大100のアカウントを作成できます。注意Apolloは重複排除を適用しないため、エントリが類似した名前やドメインを共有している場合、重複アカウントが作成される可能性があります。マスターキーが必要です。
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | はい | Apollo APIキーマスターキーが必要 |
| `accounts` | array | はい | 作成するアカウントの配列最大100。各アカウントには名前必須、およびオプションでwebsite_url、phone、owner_idを含める必要があります |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `created_accounts` | json | 新しく作成されたアカウントの配列 |
| `failed_accounts` | json | 作成に失敗したアカウントの配列 |
| `metadata` | json | 作成されたアカウントと失敗したアカウントの数を含む一括作成メタデータ |
### `apollo_account_bulk_update`
Apolloデータベースで一度に最大1000の既存アカウントを更新します連絡先よりも高い制限。各アカウントにはidフィールドを含める必要があります。マスターキーが必要です。
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | はい | Apollo APIキーマスターキーが必要 |
| `accounts` | array | はい | 更新するアカウントの配列最大1000。各アカウントにはidフィールドを含め、オプションでname、website_url、phone、owner_idを含める必要があります |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `updated_accounts` | json | 正常に更新されたアカウントの配列 |
| `failed_accounts` | json | 更新に失敗したアカウントの配列 |
| `metadata` | json | 更新および失敗したアカウント数を含む一括更新メタデータ |
### `apollo_opportunity_create`
Apolloデータベースのアカウントに新しい取引を作成しますマスターキーが必要
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | はい | Apollo APIキーマスターキーが必要 |
| `name` | string | はい | 商談/取引の名前 |
| `account_id` | string | はい | この商談が属するアカウントのID |
| `amount` | number | いいえ | 商談の金銭的価値 |
| `stage_id` | string | いいえ | 取引ステージのID |
| `owner_id` | string | いいえ | 商談所有者のユーザーID |
| `close_date` | string | いいえ | 予想クローズ日ISO 8601形式 |
| `description` | string | いいえ | 商談に関する説明またはメモ |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `opportunity` | json | Apolloから作成された商談データ |
| `metadata` | json | 作成ステータスを含む作成メタデータ |
### `apollo_opportunity_search`
チーム内のすべての取引/商談を検索してリスト表示する
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | はい | Apollo APIキー |
| `q_keywords` | string | いいえ | 案件名で検索するキーワード |
| `account_ids` | array | いいえ | 特定のアカウントIDでフィルタリング |
| `stage_ids` | array | いいえ | 商談ステージIDでフィルタリング |
| `owner_ids` | array | いいえ | 案件担当者IDでフィルタリング |
| `page` | number | いいえ | ページネーション用のページ番号 |
| `per_page` | number | いいえ | 1ページあたりの結果数最大100 |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `opportunities` | json | 検索条件に一致する案件の配列 |
| `metadata` | json | ページ、per_page、total_entriesを含むページネーション情報 |
### `apollo_opportunity_get`
IDで特定の商談/案件の詳細情報を取得する
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | はい | Apollo APIキー |
| `opportunity_id` | string | はい | 取得する案件のID |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `opportunity` | json | Apolloからの完全な案件データ |
| `metadata` | json | 検索状態を含む取得メタデータ |
### `apollo_opportunity_update`
Apolloデータベース内の既存の商談/案件を更新する
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | はい | Apollo APIキー |
| `opportunity_id` | string | はい | 更新する案件のID |
| `name` | string | いいえ | 案件/取引の名前 |
| `amount` | number | いいえ | 案件の金銭的価値 |
| `stage_id` | string | いいえ | 取引ステージのID |
| `owner_id` | string | いいえ | 案件所有者のユーザーID |
| `close_date` | string | いいえ | 予定成約日ISO 8601形式 |
| `description` | string | いいえ | 案件に関する説明やメモ |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `opportunity` | json | Apolloからの更新された案件データ |
| `metadata` | json | 更新ステータスを含む更新メタデータ |
### `apollo_sequence_search`
チーム内のシーケンス/キャンペーンを検索する
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | はい | Apollo APIキーマスターキーが必要 |
| `q_name` | string | いいえ | 名前でシーケンスを検索 |
| `active` | boolean | いいえ | アクティブステータスでフィルタリングアクティブなシーケンスはtrue、非アクティブはfalse |
| `page` | number | いいえ | ページネーションのページ番号 |
| `per_page` | number | いいえ | 1ページあたりの結果数最大100 |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `sequences` | json | 検索条件に一致するシーケンス/キャンペーンの配列 |
| `metadata` | json | ページ、per_page、total_entriesを含むページネーション情報 |
### `apollo_sequence_add_contacts`
Apolloシーケンスに連絡先を追加する
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | はい | Apollo APIキーマスターキーが必要 |
| `sequence_id` | string | はい | 連絡先を追加するシーケンスのID |
| `contact_ids` | array | はい | シーケンスに追加する連絡先IDの配列 |
| `emailer_campaign_id` | string | いいえ | オプションのメーラーキャンペーンID |
| `send_email_from_user_id` | string | いいえ | メールの送信元となるユーザーID |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `contacts_added` | json | シーケンスに追加された連絡先IDの配列 |
| `metadata` | json | sequence_idとtotal_added数を含むシーケンスメタデータ |
### `apollo_task_create`
Apolloで新しいタスクを作成する
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | はい | Apollo APIキーマスターキーが必要 |
| `note` | string | はい | タスクのメモ/説明 |
| `contact_id` | string | いいえ | 関連付ける連絡先ID |
| `account_id` | string | いいえ | 関連付けるアカウントID |
| `due_at` | string | いいえ | ISO形式の期日 |
| `priority` | string | いいえ | タスクの優先度 |
| `type` | string | いいえ | タスクのタイプ |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `task` | json | Apolloから作成されたタスクデータ |
| `metadata` | json | 作成ステータスを含む作成メタデータ |
### `apollo_task_search`
Apolloでタスクを検索する
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | はい | Apollo APIキーマスターキーが必要 |
| `contact_id` | string | いいえ | 連絡先IDでフィルタリング |
| `account_id` | string | いいえ | アカウントIDでフィルタリング |
| `completed` | boolean | いいえ | 完了ステータスでフィルタリング |
| `page` | number | いいえ | ページネーション用のページ番号 |
| `per_page` | number | いいえ | 1ページあたりの結果数最大100 |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `tasks` | json | 検索条件に一致するタスクの配列 |
| `metadata` | json | ページ、per_page、total_entriesを含むページネーション情報 |
### `apollo_email_accounts`
チームのリストを取得する
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | はい | Apollo APIキーマスターキーが必要 |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `email_accounts` | json | Apolloにリンクされているチームのメールアカウントの配列 |
| `metadata` | json | メールアカウントの総数を含むメタデータ |
## メモ
- カテゴリー: `tools`
- タイプ: `apollo`

View File

@@ -0,0 +1,172 @@
---
title: Calendly
description: Calendlyのスケジュール管理とイベント管理
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="calendly"
color="#FFFFFF"
/>
{/* MANUAL-CONTENT-START:intro */}
[Calendly](https://calendly.com/)は、会議、イベント、予約を簡単に設定できる人気のスケジューリング自動化プラットフォームです。Calendlyを使用すると、チームや個人はスケジューリングを効率化し、メールのやり取りを減らし、イベント周りのタスクを自動化できます。
Sim Calendly統合により、エージェントは以下のことができます
- **アカウントや予定されたイベントに関する情報を取得する**:ツールを使用してユーザー情報、イベントタイプ、予定されたイベントを分析や自動化のために取得します。
- **イベントタイプとスケジューリングを管理する**:ユーザーや組織の利用可能なイベントタイプにアクセスしてリスト化し、特定のイベントタイプの詳細を取得し、予定されている会議や招待者データを監視します。
- **フォローアップとワークフローを自動化する**ユーザーが会議をスケジュール、再スケジュール、またはキャンセルした場合、Simエージェントは自動的に対応するワークフローリマインダーの送信、CRMの更新、参加者への通知などをトリガーできます。
- **webhookを使用して簡単に統合する**招待者がスケジュール、キャンセル、またはルーティングフォームとやり取りする場合など、リアルタイムのCalendly webhookイベントに応答するSimワークフローを設定します。
会議の準備を自動化したい場合でも、招待を管理したい場合でも、スケジューリングアクティビティに応じてカスタムワークフローを実行したい場合でも、SimのCalendlyツールは柔軟で安全なアクセスを提供します。スケジュール変更に即座に反応する新しい自動化を解放し、チームの運用とコミュニケーションを効率化します。
{/* MANUAL-CONTENT-END */}
## 使用方法
Calendlyをワークフローに統合します。イベントタイプ、予定されたイベント、招待者、webhookを管理します。Calendly webhookイベント招待者がスケジュール、招待者がキャンセル、ルーティングフォームが送信されたに基づいてワークフローをトリガーすることもできます。個人アクセストークンが必要です。
## ツール
### `calendly_get_current_user`
現在認証されているCalendlyユーザーに関する情報を取得する
#### 入力
| パラメータ | タイプ | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | はい | Calendly個人アクセストークン |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `resource` | object | 現在のユーザー情報 |
### `calendly_list_event_types`
ユーザーまたは組織のすべてのイベントタイプのリストを取得する
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | はい | Calendly個人アクセストークン |
| `user` | string | いいえ | このユーザーに属するイベントタイプのみを返すURI形式 |
| `organization` | string | いいえ | この組織に属するイベントタイプのみを返すURI形式 |
| `count` | number | いいえ | ページあたりの結果数デフォルト20、最大100 |
| `pageToken` | string | いいえ | ページネーション用のページトークン |
| `sort` | string | いいえ | 結果のソート順「name:asc」、「name:desc」 |
| `active` | boolean | いいえ | trueの場合、アクティブなイベントタイプのみを表示。falseまたはチェックされていない場合、すべてのイベントタイプアクティブと非アクティブの両方を表示。 |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `collection` | array | イベントタイプオブジェクトの配列 |
### `calendly_get_event_type`
特定のイベントタイプに関する詳細情報を取得する
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | はい | Calendly個人アクセストークン |
| `eventTypeUuid` | string | はい | イベントタイプUUID完全なURIまたはUUIDのみ |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `resource` | object | イベントタイプの詳細 |
### `calendly_list_scheduled_events`
ユーザーまたは組織の予定されたイベントのリストを取得する
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | はい | Calendly個人アクセストークン |
| `user` | string | いいえ | このユーザーに属するイベントを返しますURI形式。「ユーザー」または「組織」のいずれかを提供する必要があります。 |
| `organization` | string | いいえ | この組織に属するイベントを返しますURI形式。「ユーザー」または「組織」のいずれかを提供する必要があります。 |
| `invitee_email` | string | いいえ | 招待者がこのメールアドレスを持つイベントを返します |
| `count` | number | いいえ | ページあたりの結果数デフォルト20、最大100 |
| `max_start_time` | string | いいえ | この時間より前に開始時間があるイベントを返しますISO 8601形式 |
| `min_start_time` | string | いいえ | この時間より後に開始時間があるイベントを返しますISO 8601形式 |
| `pageToken` | string | いいえ | ページネーション用のページトークン |
| `sort` | string | いいえ | 結果の並べ替え順序(例:"start_time:asc"、"start_time:desc" |
| `status` | string | いいえ | ステータスでフィルタリング("active"または"canceled" |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `collection` | array | 予定されたイベントオブジェクトの配列 |
### `calendly_get_scheduled_event`
特定のスケジュールされたイベントに関する詳細情報を取得する
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | はい | Calendly個人アクセストークン |
| `eventUuid` | string | はい | スケジュールされたイベントUUID完全なURIまたはUUIDのみ |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `resource` | object | スケジュールされたイベントの詳細 |
### `calendly_list_event_invitees`
スケジュールされたイベントの招待者リストを取得する
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | はい | Calendly個人アクセストークン |
| `eventUuid` | string | はい | スケジュールされたイベントUUID完全なURIまたはUUIDのみ |
| `count` | number | いいえ | ページあたりの結果数デフォルト20、最大100 |
| `email` | string | いいえ | メールアドレスで招待者をフィルタリング |
| `pageToken` | string | いいえ | ページネーション用のページトークン |
| `sort` | string | いいえ | 結果のソート順(例:"created_at:asc"、"created_at:desc" |
| `status` | string | いいえ | ステータスによるフィルタリング("active"または"canceled" |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `collection` | array | 招待者オブジェクトの配列 |
### `calendly_cancel_event`
スケジュールされたイベントをキャンセルする
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | はい | Calendly個人アクセストークン |
| `eventUuid` | string | はい | キャンセルするスケジュールされたイベントのUUID完全なURIまたはUUIDのみ |
| `reason` | string | いいえ | キャンセルの理由(招待者に送信されます) |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `resource` | object | キャンセルの詳細 |
## 注意事項
- カテゴリー: `tools`
- タイプ: `calendly`

View File

@@ -24,9 +24,11 @@ import { BlockInfoCard } from "@/components/ui/block-info-card"
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `id` | string | はい | メモリーの識別子。このIDのメモリーが既に存在する場合、新しいデータはそれに追加されます。 |
| `role` | string | はい | エージェントメモリーの役割user、assistant、またはsystem |
| `content` | string | はい | エージェントメモリーのコンテンツ |
| `conversationId` | string | いいえ | 会話識別子user-123、session-abc。このブロックに対してこの会話IDのメモリがすでに存在する場合、新しいメッセージはそれに追加されます。 |
| `id` | string | いいえ | 会話識別子のレガシーパラメータ。代わりにconversationIdを使用してください。後方互換性のために提供されています。 |
| `role` | string | はい | エージェントメモリの役割user、assistant、またはsystem |
| `content` | string | はい | エージェントメモリのコンテンツ |
| `blockId` | string | いいえ | オプションのブロックID。提供されない場合、実行コンテキストから現在のブロックIDを使用するか、デフォルトで「default」になります。 |
#### 出力
@@ -38,20 +40,23 @@ import { BlockInfoCard } from "@/components/ui/block-info-card"
### `memory_get`
IDで特定のメモリを取得する
conversationId、blockId、blockName、またはそれらの組み合わせによってメモリを取得します。一致するすべてのメモリを返します。
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `id` | string | はい | 取得するメモリの識別子 |
| `conversationId` | string | いいえ | 会話識別子user-123、session-abc。単独で提供された場合、すべてのブロックにわたるこの会話のすべてのメモリを返します。 |
| `id` | string | いいえ | 会話識別子のレガシーパラメータ。代わりにconversationIdを使用してください。後方互換性のために提供されています。 |
| `blockId` | string | いいえ | ブロック識別子。単独で提供された場合、すべての会話にわたるこのブロックのすべてのメモリを返します。conversationIdと一緒に提供された場合、そのブロック内の特定の会話のメモリを返します。 |
| `blockName` | string | いいえ | ブロック名。blockIdの代替。単独で提供された場合、この名前を持つブロックのすべてのメモリを返します。conversationIdと一緒に提供された場合、この名前を持つブロック内のその会話のメモリを返します。 |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `success` | boolean | メモリが正常に取得されたかどうか |
| `memories` | array | リクエストされたIDのメモリデータの配列 |
| `memories` | array | conversationId、blockId、blockName、およびdataフィールドを含むメモリオブジェクトの配列 |
| `message` | string | 成功またはエラーメッセージ |
| `error` | string | 操作が失敗した場合のエラーメッセージ |
@@ -69,19 +74,22 @@ IDで特定のメモリを取得する
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `success` | boolean | すべてのメモリが正常に取得されたかどうか |
| `memories` | array | キー、型、データを含むすべてのメモリオブジェクトの配列 |
| `memories` | array | key、conversationId、blockId、blockName、およびdataフィールドを含むすべてのメモリオブジェクトの配列 |
| `message` | string | 成功またはエラーメッセージ |
| `error` | string | 操作が失敗した場合のエラーメッセージ |
### `memory_delete`
IDで特定のメモリを削除する
conversationId、blockId、blockName、またはそれらの組み合わせによってメモリを削除します。一括削除をサポートしています。
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `id` | string | はい | 削除するメモリの識別子 |
| `conversationId` | string | いいえ | 会話識別子user-123、session-abc。単独で提供された場合、すべてのブロックにわたるこの会話のすべてのメモリを削除します。 |
| `id` | string | いいえ | 会話識別子のレガシーパラメータ。代わりにconversationIdを使用してください。後方互換性のために提供されています。 |
| `blockId` | string | いいえ | ブロック識別子。単独で提供された場合、すべての会話にわたるこのブロックのすべてのメモリを削除します。conversationIdと共に提供された場合、そのブロック内の特定の会話のメモリを削除します。 |
| `blockName` | string | いいえ | ブロック名。blockIdの代替。単独で提供された場合、この名前を持つブロックのすべてのメモリを削除します。conversationIdと共に提供された場合、この名前を持つブロック内のその会話のメモリを削除します。 |
#### 出力

View File

@@ -26,7 +26,7 @@ Simでは、Microsoft Excel統合によりOAuth認証を通じてスプレッド
## 使用方法
Microsoft Excelをワークフローに統合します。テーブルの読み取り、書き込み、更新、追加が可能です。OAuthが必要です。
Microsoft Excelをワークフローに統合します。読み取り、書き込み、更新、テーブルへの追加、新しいワークシートの作成が可能です。
## ツール
@@ -91,6 +91,23 @@ Microsoft Excelテーブルに新しい行を追加する
| `values` | array | テーブルに追加された行の配列 |
| `metadata` | object | スプレッドシートのメタデータ |
### `microsoft_excel_worksheet_add`
Microsoft Excelブックに新しいワークシートシートを作成する
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `spreadsheetId` | string | はい | ワークシートを追加するExcelブックのID |
| `worksheetName` | string | はい | 新しいワークシートの名前。ブック内で一意である必要があり、31文字を超えることはできません |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `worksheet` | object | 新しく作成されたワークシートの詳細 |
## 注意事項
- カテゴリー: `tools`

View File

@@ -0,0 +1,172 @@
---
title: Neo4j
description: Neo4jグラフデータベースに接続する
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="neo4j"
color="#FFFFFF"
/>
## 使用方法
Neo4jグラフデータベースをワークフローに統合します。ードとリレーションシップのクエリ、作成、マージ、更新、削除が可能です。
## ツール
### `neo4j_query`
MATCHクエリを実行してNeo4jグラフデータベースからードとリレーションシップを読み取ります。最適なパフォーマンスを得るため、また大きな結果セットを防ぐために、クエリにLIMITを含めてください
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `host` | string | はい | Neo4jサーバーのホスト名またはIPアドレス |
| `port` | number | はい | Neo4jサーバーのポートデフォルトBoltプロトコル用に7687 |
| `database` | string | はい | 接続先のデータベース名 |
| `username` | string | はい | Neo4jユーザー名 |
| `password` | string | はい | Neo4jパスワード |
| `encryption` | string | いいえ | 接続暗号化モードenabled、disabled |
| `cypherQuery` | string | はい | 実行するCypherクエリ通常はMATCH文 |
| `parameters` | object | いいえ | CypherクエリのパラメータをJSONオブジェクトとして指定。LIMITを含む動的な値に使用しますquery: "MATCH \(n\) RETURN n LIMIT $limit"、parameters: \{limit: 100\} |
| `parameters` | string | いいえ | 説明なし |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `message` | string | 操作ステータスメッセージ |
| `records` | array | クエリから返されたレコードの配列 |
| `recordCount` | number | 返されたレコード数 |
| `summary` | json | タイミングとカウンターを含むクエリ実行の概要 |
### `neo4j_create`
CREATE文を実行してNeo4jグラフデータベースに新しいードとリレーションシップを追加する
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `host` | string | はい | Neo4jサーバーのホスト名またはIPアドレス |
| `port` | number | はい | Neo4jサーバーのポート番号 \(デフォルト: Boltプロトコル用に7687\) |
| `database` | string | はい | 接続先のデータベース名 |
| `username` | string | はい | Neo4jのユーザー名 |
| `password` | string | はい | Neo4jのパスワード |
| `encryption` | string | いいえ | 接続の暗号化モード \(enabled, disabled\) |
| `cypherQuery` | string | はい | 実行するCypher CREATE文 |
| `parameters` | object | いいえ | CypherクエリのパラメータをJSONオブジェクトとして指定 |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `message` | string | 操作のステータスメッセージ |
| `summary` | json | 作成されたノードとリレーションシップの数を含む作成サマリー |
### `neo4j_merge`
MERGE文を実行してNeo4jでードとリレーションシップを検索または作成するアップサート操作
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `host` | string | はい | Neo4jサーバーのホスト名またはIPアドレス |
| `port` | number | はい | Neo4jサーバーのポート番号 \(デフォルト: Boltプロトコル用に7687\) |
| `database` | string | はい | 接続先のデータベース名 |
| `username` | string | はい | Neo4jのユーザー名 |
| `password` | string | はい | Neo4jのパスワード |
| `encryption` | string | いいえ | 接続の暗号化モード \(enabled, disabled\) |
| `cypherQuery` | string | はい | 実行するCypher MERGE文 |
| `parameters` | object | いいえ | CypherクエリのパラメータをJSONオブジェクトとして指定 |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `message` | string | 操作ステータスメッセージ |
| `summary` | json | 作成またはマッチしたノード/リレーションシップのカウンターを含むマージ概要 |
### `neo4j_update`
Neo4jの既存ードとリレーションシップのプロパティを更新するためのSETステートメントを実行します
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `host` | string | はい | Neo4jサーバーのホスト名またはIPアドレス |
| `port` | number | はい | Neo4jサーバーポートデフォルトBoltプロトコル用7687 |
| `database` | string | はい | 接続先のデータベース名 |
| `username` | string | はい | Neo4jユーザー名 |
| `password` | string | はい | Neo4jパスワード |
| `encryption` | string | いいえ | 接続暗号化モードenabled、disabled |
| `cypherQuery` | string | はい | プロパティを更新するためのMATCHとSETステートメントを含むCypherクエリ |
| `parameters` | object | いいえ | JSONオブジェクトとしてのCypherクエリのパラメータ |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `message` | string | 操作ステータスメッセージ |
| `summary` | json | 設定されたプロパティのカウンターを含む更新概要 |
### `neo4j_delete`
Neo4jからードとリレーションシップを削除するためのDELETEまたはDETACH DELETEステートメントを実行します
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `host` | string | はい | Neo4jサーバーのホスト名またはIPアドレス |
| `port` | number | はい | Neo4jサーバーポートデフォルトBoltプロトコル用7687 |
| `database` | string | はい | 接続先のデータベース名 |
| `username` | string | はい | Neo4jユーザー名 |
| `password` | string | はい | Neo4jパスワード |
| `encryption` | string | いいえ | 接続暗号化モードenabled、disabled |
| `cypherQuery` | string | はい | MATCHとDELETE/DETACH DELETEステートメントを含むCypherクエリ |
| `parameters` | object | いいえ | JSONオブジェクトとしてのCypherクエリのパラメータ |
| `detach` | boolean | いいえ | ードを削除する前にリレーションシップを削除するためにDETACH DELETEを使用するかどうか |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `message` | string | 操作ステータスメッセージ |
| `summary` | json | 削除されたノードとリレーションシップのカウンターを含む削除サマリー |
### `neo4j_execute`
複雑な操作のためにNeo4jグラフデータベースで任意のCypherクエリを実行する
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `host` | string | はい | Neo4jサーバーのホスト名またはIPアドレス |
| `port` | number | はい | Neo4jサーバーポートデフォルトBoltプロトコル用の7687 |
| `database` | string | はい | 接続先のデータベース名 |
| `username` | string | はい | Neo4jユーザー名 |
| `password` | string | はい | Neo4jパスワード |
| `encryption` | string | いいえ | 接続暗号化モードenabled、disabled |
| `cypherQuery` | string | はい | 実行するCypherクエリ任意の有効なCypher文 |
| `parameters` | object | いいえ | JSONオブジェクトとしてのCypherクエリのパラメータ |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `message` | string | 操作ステータスメッセージ |
| `records` | array | クエリから返されたレコードの配列 |
| `recordCount` | number | 返されたレコードの数 |
| `summary` | json | タイミングとカウンターを含む実行サマリー |
## 注意事項
- カテゴリ: `tools`
- タイプ: `neo4j`

View File

@@ -70,8 +70,10 @@ Slack APIを通じてSlackチャンネルまたはユーザーにメッセージ
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `message` | object | Slackから返されたすべてのプロパティを含む完全なメッセージオブジェクト |
| `ts` | string | メッセージのタイムスタンプ |
| `channel` | string | メッセージが送信されたチャンネルID |
| `fileCount` | number | アップロードされたファイル数(ファイルが添付されている場合) |
### `slack_canvas`
@@ -154,6 +156,7 @@ Slackでボットが以前送信したメッセージを更新する
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `message` | object | Slackから返されたすべてのプロパティを含む完全に更新されたメッセージオブジェクト |
| `content` | string | 成功メッセージ |
| `metadata` | object | 更新されたメッセージのメタデータ |

View File

@@ -0,0 +1,117 @@
---
title: 音声テキスト変換
description: AIを使用して音声をテキストに変換
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="stt"
color="#181C1E"
/>
{/* MANUAL-CONTENT-START:intro */}
最先端のAIモデルを使用して音声をテキストに変換します。Sim音声テキスト変換STTツールを使用すると、音声ファイルや動画ファイルを正確な文字起こしに変換でき、複数の言語、タイムスタンプ、およびオプションの翻訳をサポートしています。
対応プロバイダー:
- **[OpenAI Whisper](https://platform.openai.com/docs/guides/speech-to-text/overview)**: OpenAIによる先進的なオープンソースSTTモデル。`whisper-1`などのモデルをサポートし、様々な言語と音声フォーマットに対応しています。
- **[Deepgram](https://deepgram.com/)**: `nova-3`、`nova-2`、`whisper-large`などのディープラーニングモデルを使用したリアルタイムおよびバッチSTT API。話者分離、意図認識、業界特化型チューニングなどの機能を提供します。
- **[ElevenLabs](https://elevenlabs.io/)**: 高品質な音声AIで知られるElevenLabsは、多数の言語や方言に対応した精度と自然言語理解に焦点を当てたSTTモデルを提供しています。
タスクに最適なプロバイダーとモデルを選択してください—高速で本番環境向けの文字起こしDeepgram、高精度の多言語対応Whisper、または高度な理解と言語カバレッジElevenLabsなど。
{/* MANUAL-CONTENT-END */}
## 使用方法
主要なAIプロバイダーを使用して音声ファイルや動画ファイルをテキストに変換します。複数の言語、タイムスタンプ、および話者分離をサポートしています。
## ツール
### `stt_whisper`
OpenAI Whisperを使用して音声をテキストに変換
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `provider` | string | はい | STTプロバイダーwhisper |
| `apiKey` | string | はい | OpenAI APIキー |
| `model` | string | いいえ | 使用するWhisperモデルデフォルトwhisper-1 |
| `audioFile` | file | いいえ | 文字起こしする音声または動画ファイル |
| `audioFileReference` | file | いいえ | 前のブロックからの音声/動画ファイルへの参照 |
| `audioUrl` | string | いいえ | 音声または動画ファイルのURL |
| `language` | string | いいえ | 言語コード(例:"en"、"es"、"fr")または自動検出の場合は"auto" |
| `timestamps` | string | いいえ | タイムスタンプの粒度none、sentence、またはword |
| `translateToEnglish` | boolean | いいえ | 音声を英語に翻訳 |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `transcript` | string | 完全な文字起こしテキスト |
| `segments` | array | タイムスタンプ付きセグメント |
| `language` | string | 検出または指定された言語 |
| `duration` | number | 音声の長さ(秒) |
| `confidence` | number | 全体的な信頼度スコア |
### `stt_deepgram`
Deepgramを使用して音声をテキストに文字起こし
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `provider` | string | はい | STTプロバイダーdeepgram |
| `apiKey` | string | はい | Deepgram APIキー |
| `model` | string | いいえ | 使用するDeepgramモデルnova-3、nova-2、whisper-largeなど |
| `audioFile` | file | いいえ | 文字起こしする音声またはビデオファイル |
| `audioFileReference` | file | いいえ | 前のブロックからの音声/ビデオファイルの参照 |
| `audioUrl` | string | いいえ | 音声またはビデオファイルのURL |
| `language` | string | いいえ | 言語コード(例:"en"、"es"、"fr")または自動検出の場合は"auto" |
| `timestamps` | string | いいえ | タイムスタンプの粒度none、sentence、またはword |
| `diarization` | boolean | いいえ | 話者分離を有効にする |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `transcript` | string | 完全な文字起こしテキスト |
| `segments` | array | 話者ラベル付きのタイムスタンプセグメント |
| `language` | string | 検出または指定された言語 |
| `duration` | number | 音声の長さ(秒) |
| `confidence` | number | 全体的な信頼度スコア |
### `stt_elevenlabs`
ElevenLabsを使用して音声をテキストに変換する
#### 入力
| パラメータ | 型 | 必須 | 説明 |
| --------- | ---- | -------- | ----------- |
| `provider` | string | はい | STTプロバイダーelevenlabs |
| `apiKey` | string | はい | ElevenLabs APIキー |
| `model` | string | いいえ | 使用するElevenLabsモデルscribe_v1, scribe_v1_experimental |
| `audioFile` | file | いいえ | 文字起こしする音声またはビデオファイル |
| `audioFileReference` | file | いいえ | 前のブロックからの音声/ビデオファイルの参照 |
| `audioUrl` | string | いいえ | 音声またはビデオファイルのURL |
| `language` | string | いいえ | 言語コード(例:"en"、"es"、"fr")または自動検出の場合は"auto" |
| `timestamps` | string | いいえ | タイムスタンプの粒度none、sentence、またはword |
#### 出力
| パラメータ | 型 | 説明 |
| --------- | ---- | ----------- |
| `transcript` | string | 完全な文字起こしテキスト |
| `segments` | array | タイムスタンプ付きセグメント |
| `language` | string | 検出または指定された言語 |
| `duration` | number | 音声の長さ(秒) |
| `confidence` | number | 全体的な信頼度スコア |
## 注意事項
- カテゴリー: `tools`
- タイプ: `stt`

View File

@@ -42,10 +42,10 @@ When responding to questions about investments, include risk disclaimers.
代理模块通过统一的推理接口支持多个 LLM 提供商。可用模型包括:
- **OpenAI**GPT-5、GPT-4o、o1、o3、o4-mini、gpt-4.1
- **Anthropic**Claude 3.7 Sonnet
- **OpenAI**GPT-5.1、GPT-5、GPT-4o、o1、o3、o4-mini、gpt-4.1
- **Anthropic**Claude 4.5 Sonnet、Claude Opus 4.1
- **Google**Gemini 2.5 Pro、Gemini 2.0 Flash
- **其他提供商**Groq、Cerebras、xAI、DeepSeek
- **其他提供商**Groq、Cerebras、xAI、Azure OpenAI、OpenRouter
- **本地模型**:兼容 Ollama 的模型
### 温度

View File

@@ -0,0 +1,574 @@
---
title: Apollo
description: 使用 Apollo.io 搜索、丰富和管理联系人
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="apollo"
color="#EBF212"
/>
{/* MANUAL-CONTENT-START:intro */}
[Apollo.io](https://apollo.io/) 是一个领先的销售情报和互动平台帮助用户大规模地查找、丰富和互动联系人及公司。Apollo.io 将广泛的联系人数据库与强大的数据丰富和工作流自动化工具相结合,帮助销售、市场营销和招聘团队加速增长。
使用 Apollo.io您可以
- **搜索数百万联系人和公司**:使用高级筛选器找到精准的潜在客户
- **丰富潜在客户和账户信息**:用经过验证的数据和最新信息补充缺失的细节
- **管理和组织 CRM 记录**:保持人员和公司数据的准确性和可操作性
- **自动化外联**:直接从 Apollo.io 将联系人添加到序列中并创建后续任务
在 Sim 中Apollo.io 集成允许您的代理以编程方式执行核心 Apollo 操作:
- **搜索人员和公司**:使用 `apollo_people_search` 通过灵活的筛选器发现新的潜在客户。
- **丰富人员数据**:使用 `apollo_people_enrich` 为联系人补充经过验证的信息。
- **批量丰富人员数据**:使用 `apollo_people_bulk_enrich` 一次性大规模丰富多个联系人。
- **搜索和丰富公司信息**:使用 `apollo_company_search` 和 `apollo_company_enrich` 发现和更新关键的公司信息。
这使您的代理能够构建强大的工作流用于潜在客户开发、CRM 数据丰富和自动化,而无需手动输入数据或切换标签页。将 Apollo.io 集成为动态数据源和 CRM 引擎,帮助您的代理在日常操作中无缝识别、筛选和联系潜在客户。
{/* MANUAL-CONTENT-END */}
## 使用说明
将 Apollo.io 集成到工作流程中。搜索人员和公司,丰富联系数据,管理您的 CRM 联系人和账户,将联系人添加到序列中,并创建任务。
## 工具
### `apollo_people_search`
搜索 Apollo
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | 是 | Apollo API 密钥 |
| `person_titles` | array | 否 | 要搜索的职位 \(例如,\["CEO", "VP of Sales"\]\) |
| `person_locations` | array | 否 | 要搜索的地点 \(例如,\["San Francisco, CA", "New York, NY"\]\) |
| `person_seniorities` | array | 否 | 职级 \(例如,\["senior", "executive", "manager"\]\) |
| `organization_names` | array | 否 | 要搜索的公司名称 |
| `q_keywords` | string | 否 | 要搜索的关键词 |
| `page` | number | 否 | 分页的页码 \(默认值1\) |
| `per_page` | number | 否 | 每页的结果数 \(默认值25最大值100\) |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `people` | json | 符合搜索条件的人员数组 |
| `metadata` | json | 包括页码、每页条目数和总条目数的分页信息 |
### `apollo_people_enrich`
使用 Apollo 丰富单个人的数据
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | 是 | Apollo API 密钥 |
| `first_name` | string | 否 | 该人的名字 |
| `last_name` | string | 否 | 该人的姓氏 |
| `email` | string | 否 | 该人的电子邮件地址 |
| `organization_name` | string | 否 | 该人工作的公司名称 |
| `domain` | string | 否 | 公司域名 \(例如apollo.io\) |
| `linkedin_url` | string | 否 | LinkedIn 个人资料 URL |
| `reveal_personal_emails` | boolean | 否 | 显示个人电子邮件地址 \(使用积分\) |
| `reveal_phone_number` | boolean | 否 | 显示电话号码 \(使用积分\) |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `person` | json | 来自 Apollo 的丰富人员数据 |
| `metadata` | json | 包括丰富状态的元数据 |
### `apollo_people_bulk_enrich`
使用 Apollo 一次丰富最多 10 人的数据
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | 是 | Apollo API 密钥 |
| `people` | array | 是 | 要丰富的人员数组(最多 10 人) |
| `reveal_personal_emails` | boolean | 否 | 显示个人电子邮件地址(使用积分) |
| `reveal_phone_number` | boolean | 否 | 显示电话号码(使用积分) |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `people` | json | 丰富的人员数据数组 |
| `metadata` | json | 批量丰富元数据,包括总数和丰富计数 |
### `apollo_organization_search`
搜索 Apollo
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | 是 | Apollo API 密钥 |
| `organization_locations` | array | 否 | 要搜索的公司位置 |
| `organization_num_employees_ranges` | array | 否 | 员工数量范围(例如,\["1-10", "11-50"\] |
| `q_organization_keyword_tags` | array | 否 | 行业或关键词标签 |
| `q_organization_name` | string | 否 | 要搜索的组织名称 |
| `page` | number | 否 | 分页的页码 |
| `per_page` | number | 否 | 每页结果数最多100 |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `organizations` | json | 符合搜索条件的组织数组 |
| `metadata` | json | 分页信息,包括页面、每页条目数和总条目数 |
### `apollo_organization_enrich`
使用 Apollo 为单个组织丰富数据
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | 是 | Apollo API 密钥 |
| `organization_name` | string | 否 | 组织名称(组织名称或域名至少需要一个) |
| `domain` | string | 否 | 公司域名例如apollo.io域名或组织名称至少需要一个 |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `organization` | json | 来自 Apollo 的丰富组织数据 |
| `metadata` | json | 丰富的元数据,包括丰富状态 |
### `apollo_organization_bulk_enrich`
使用 Apollo 一次为最多 10 个组织丰富数据
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | 是 | Apollo API 密钥 |
| `organizations` | array | 是 | 要丰富的组织数组(最多 10 个) |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `organizations` | json | 丰富的组织数据数组 |
| `metadata` | json | 批量丰富的元数据,包括总数和丰富的计数 |
### `apollo_contact_create`
在您的 Apollo 数据库中创建一个新联系人
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | 是 | Apollo API 密钥 |
| `first_name` | string | 是 | 联系人的名字 |
| `last_name` | string | 是 | 联系人的姓氏 |
| `email` | string | 否 | 联系人的电子邮件地址 |
| `title` | string | 否 | 职位名称 |
| `account_id` | string | 否 | 要关联的 Apollo 账户 ID |
| `owner_id` | string | 否 | 联系人所有者的用户 ID |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `contact` | json | 从 Apollo 创建的联系人数据 |
| `metadata` | json | 创建元数据,包括创建状态 |
### `apollo_contact_update`
更新您 Apollo 数据库中的现有联系人
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | 是 | Apollo API 密钥 |
| `contact_id` | string | 是 | 要更新的联系人的 ID |
| `first_name` | string | 否 | 联系人的名字 |
| `last_name` | string | 否 | 联系人的姓氏 |
| `email` | string | 否 | 电子邮件地址 |
| `title` | string | 否 | 职位名称 |
| `account_id` | string | 否 | Apollo 账户 ID |
| `owner_id` | string | 否 | 联系人所有者的用户 ID |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `contact` | json | 来自 Apollo 的更新联系人数据 |
| `metadata` | json | 更新元数据,包括更新状态 |
### `apollo_contact_search`
搜索您的团队
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | 是 | Apollo API 密钥 |
| `q_keywords` | string | 否 | 要搜索的关键字 |
| `contact_stage_ids` | array | 否 | 按联系人阶段 ID 过滤 |
| `page` | number | 否 | 分页的页码 |
| `per_page` | number | 否 | 每页结果数 \(最大值100\) |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `contacts` | json | 符合搜索条件的联系人数组 |
| `metadata` | json | 分页信息,包括页码、每页条目数和总条目数 |
### `apollo_contact_bulk_create`
在您的 Apollo 数据库中一次创建最多 100 个联系人。支持去重以防止创建重复联系人。需要主密钥。
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | 是 | Apollo API 密钥 \(需要主密钥\) |
| `contacts` | array | 是 | 要创建的联系人数组 \(最多 100 个\)。每个联系人应包括 first_name、last_name以及可选的 email、title、account_id、owner_id |
| `run_dedupe` | boolean | 否 | 启用去重以防止创建重复联系人。当为 true 时,返回现有联系人而不进行修改 |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `created_contacts` | json | 新创建联系人数组 |
| `existing_contacts` | json | 已存在联系人数组(当启用去重时) |
| `metadata` | json | 批量创建元数据,包括创建和已存在联系人的计数 |
### `apollo_contact_bulk_update`
一次更新最多 100 个现有联系人到您的 Apollo 数据库中。每个联系人必须包含一个 id 字段。需要主密钥。
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | 是 | Apollo API 密钥(需要主密钥) |
| `contacts` | array | 是 | 要更新的联系人数组(最多 100 个)。每个联系人必须包含 id 字段,并可选包含 first_name、last_name、email、title、account_id、owner_id |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `updated_contacts` | json | 成功更新的联系人数组 |
| `failed_contacts` | json | 更新失败的联系人数组 |
| `metadata` | json | 批量更新元数据,包括更新和失败联系人的计数 |
### `apollo_account_create`
在您的 Apollo 数据库中创建一个新账户(公司)
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | 是 | Apollo API 密钥 |
| `name` | string | 是 | 公司名称 |
| `website_url` | string | 否 | 公司网站 URL |
| `phone` | string | 否 | 公司电话号码 |
| `owner_id` | string | 否 | 账户所有者的用户 ID |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `account` | json | 从 Apollo 创建的账户数据 |
| `metadata` | json | 包括创建状态的元数据 |
### `apollo_account_update`
更新 Apollo 数据库中的现有账户
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | 是 | Apollo API 密钥 |
| `account_id` | string | 是 | 要更新的账户 ID |
| `name` | string | 否 | 公司名称 |
| `website_url` | string | 否 | 公司网站 URL |
| `phone` | string | 否 | 公司电话号码 |
| `owner_id` | string | 否 | 账户所有者的用户 ID |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `account` | json | 从 Apollo 更新的账户数据 |
| `metadata` | json | 包括更新状态的元数据 |
### `apollo_account_search`
搜索您的团队
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | 是 | Apollo API 密钥(需要主密钥) |
| `q_keywords` | string | 否 | 在账户数据中搜索的关键字 |
| `owner_id` | string | 否 | 按账户所有者用户 ID 过滤 |
| `account_stage_ids` | array | 否 | 按账户阶段 ID 过滤 |
| `page` | number | 否 | 分页的页码 |
| `per_page` | number | 否 | 每页结果数最大值100 |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `accounts` | json | 符合搜索条件的账户数组 |
| `metadata` | json | 分页信息,包括页面、每页条目数和总条目数 |
### `apollo_account_bulk_create`
在您的 Apollo 数据库中一次最多创建 100 个账户。注意Apollo 不会进行去重处理——如果条目具有相似的名称或域名,可能会创建重复账户。需要主密钥。
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | 是 | Apollo API 密钥(需要主密钥) |
| `accounts` | array | 是 | 要创建的账户数组(最多 100 个)。每个账户应包括名称(必需),以及可选的 website_url、phone、owner_id |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `created_accounts` | json | 新创建账户的数组 |
| `failed_accounts` | json | 创建失败的账户数组 |
| `metadata` | json | 批量创建的元数据,包括创建和失败账户的计数 |
### `apollo_account_bulk_update`
在您的 Apollo 数据库中一次最多更新 1000 个现有账户(比联系人限制更高!)。每个账户必须包含一个 id 字段。需要主密钥。
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | 是 | Apollo API 密钥(需要主密钥) |
| `accounts` | array | 是 | 要更新的账户数组(最多 1000 个)。每个账户必须包含 id 字段,以及可选的 name、website_url、phone、owner_id |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `updated_accounts` | json | 成功更新的账户数组 |
| `failed_accounts` | json | 更新失败的账户数组 |
| `metadata` | json | 批量更新的元数据,包括更新和失败账户的计数 |
### `apollo_opportunity_create`
在您的 Apollo 数据库中为一个账户创建一个新交易(需要主密钥)
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | 是 | Apollo API 密钥(需要主密钥) |
| `name` | string | 是 | 机会/交易的名称 |
| `account_id` | string | 是 | 此机会所属账户的 ID |
| `amount` | number | 否 | 机会的货币价值 |
| `stage_id` | string | 否 | 交易阶段的 ID |
| `owner_id` | string | 否 | 机会所有者的用户 ID |
| `close_date` | string | 否 | 预期的关闭日期ISO 8601 格式) |
| `description` | string | 否 | 关于机会的描述或备注 |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `opportunity` | json | 来自 Apollo 的已创建机会数据 |
| `metadata` | json | 创建元数据,包括创建状态 |
### `apollo_opportunity_search`
搜索并列出您团队中的所有交易/机会
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | 是 | Apollo API 密钥 |
| `q_keywords` | string | 否 | 在机会名称中搜索的关键字 |
| `account_ids` | array | 否 | 按特定账户 ID 过滤 |
| `stage_ids` | array | 否 | 按交易阶段 ID 过滤 |
| `owner_ids` | array | 否 | 按机会所有者 ID 过滤 |
| `page` | number | 否 | 分页的页码 |
| `per_page` | number | 否 | 每页结果数 \(最大值: 100\) |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `opportunities` | json | 符合搜索条件的机会数组 |
| `metadata` | json | 分页信息,包括页码、每页条目数和总条目数 |
### `apollo_opportunity_get`
通过 ID 检索特定交易/机会的完整详细信息
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | 是 | Apollo API 密钥 |
| `opportunity_id` | string | 是 | 要检索的机会 ID |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `opportunity` | json | Apollo 提供的完整机会数据 |
| `metadata` | json | 检索元数据,包括找到的状态 |
### `apollo_opportunity_update`
更新 Apollo 数据库中现有的交易/机会
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | 是 | Apollo API 密钥 |
| `opportunity_id` | string | 是 | 要更新的机会 ID |
| `name` | string | 否 | 机会/交易的名称 |
| `amount` | number | 否 | 机会的货币价值 |
| `stage_id` | string | 否 | 交易阶段的 ID |
| `owner_id` | string | 否 | 机会所有者的用户 ID |
| `close_date` | string | 否 | 预期的结束日期ISO 8601 格式) |
| `description` | string | 否 | 关于机会的描述或备注 |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `opportunity` | json | 来自 Apollo 的更新机会数据 |
| `metadata` | json | 更新的元数据,包括更新状态 |
### `apollo_sequence_search`
在您的团队中搜索序列/活动
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | 是 | Apollo API 密钥(需要主密钥) |
| `q_name` | string | 否 | 按名称搜索序列 |
| `active` | boolean | 否 | 按活动状态筛选true 表示活动序列false 表示非活动序列) |
| `page` | number | 否 | 分页的页码 |
| `per_page` | number | 否 | 每页结果数最大值100 |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `sequences` | json | 符合搜索条件的序列/活动数组 |
| `metadata` | json | 分页信息,包括页面、每页条目数和总条目数 |
### `apollo_sequence_add_contacts`
将联系人添加到 Apollo 序列
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | 是 | Apollo API 密钥(需要主密钥) |
| `sequence_id` | string | 是 | 要添加联系人的序列 ID |
| `contact_ids` | array | 是 | 要添加到序列的联系人 ID 数组 |
| `emailer_campaign_id` | string | 否 | 可选的电子邮件活动 ID |
| `send_email_from_user_id` | string | 否 | 发送电子邮件的用户 ID |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `contacts_added` | json | 添加到序列的联系人 ID 数组 |
| `metadata` | json | 序列元数据,包括 sequence_id 和 total_added 计数 |
### `apollo_task_create`
在 Apollo 中创建新任务
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | 是 | Apollo API 密钥(需要主密钥) |
| `note` | string | 是 | 任务备注/描述 |
| `contact_id` | string | 否 | 要关联的联系人 ID |
| `account_id` | string | 否 | 要关联的账户 ID |
| `due_at` | string | 否 | ISO 格式的截止日期 |
| `priority` | string | 否 | 任务优先级 |
| `type` | string | 否 | 任务类型 |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `task` | json | 从 Apollo 创建的任务数据 |
| `metadata` | json | 包括创建状态的元数据 |
### `apollo_task_search`
在 Apollo 中搜索任务
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | 是 | Apollo API 密钥(需要主密钥) |
| `contact_id` | string | 否 | 按联系人 ID 过滤 |
| `account_id` | string | 否 | 按账户 ID 过滤 |
| `completed` | boolean | 否 | 按完成状态过滤 |
| `page` | number | 否 | 分页的页码 |
| `per_page` | number | 否 | 每页结果数最大值100 |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `tasks` | json | 符合搜索条件的任务数组 |
| `metadata` | json | 分页信息,包括页码、每页数量和总条目数 |
### `apollo_email_accounts`
获取团队列表
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | 是 | Apollo API 密钥(需要主密钥) |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `email_accounts` | json | 在 Apollo 中链接的团队电子邮件账户数组 |
| `metadata` | json | 元数据,包括电子邮件账户的总数 |
## 注意事项
- 类别:`tools`
- 类型:`apollo`

View File

@@ -0,0 +1,172 @@
---
title: Calendly
description: 管理 Calendly 的日程安排和事件
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="calendly"
color="#FFFFFF"
/>
{/* MANUAL-CONTENT-START:intro */}
[Calendly](https://calendly.com/) 是一个流行的日程安排自动化平台,可以帮助您轻松预订会议、活动和预约。通过 Calendly团队和个人可以简化日程安排减少来回邮件并自动化与活动相关的任务。
通过 Sim 的 Calendly 集成,您的代理可以:
- **检索有关您的账户和已安排事件的信息**:使用工具获取用户信息、事件类型和已安排事件,以便进行分析或自动化。
- **管理事件类型和日程安排**:访问并列出用户或组织的可用事件类型,检索特定事件类型的详细信息,并监控已安排的会议和受邀者数据。
- **自动化跟进和工作流程**当用户安排、重新安排或取消会议时Sim 代理可以自动触发相应的工作流程,例如发送提醒、更新 CRM 或通知参与者。
- **通过 Webhook 轻松集成**:设置 Sim 工作流程以响应实时 Calendly Webhook 事件,包括当受邀者安排、取消或与路由表单交互时。
无论您是想自动化会议准备、管理邀请还是根据日程安排活动运行自定义工作流程Sim 中的 Calendly 工具都为您提供灵活且安全的访问权限。通过即时响应日程安排的变化,解锁新的自动化功能——简化您的团队运营和沟通。
{/* MANUAL-CONTENT-END */}
## 使用说明
将 Calendly 集成到您的工作流程中。管理事件类型、已安排事件、受邀者和 Webhook。还可以基于 Calendly Webhook 事件(受邀者已安排、受邀者已取消、路由表单已提交)触发工作流程。需要个人访问令牌。
## 工具
### `calendly_get_current_user`
获取当前已认证的 Calendly 用户的信息
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | 是 | Calendly 个人访问令牌 |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `resource` | object | 当前用户信息 |
### `calendly_list_event_types`
检索用户或组织的所有事件类型列表
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | 是 | Calendly 个人访问令牌 |
| `user` | string | 否 | 仅返回属于该用户的事件类型URI 格式) |
| `organization` | string | 否 | 仅返回属于该组织的事件类型URI 格式) |
| `count` | number | 否 | 每页结果数量默认20最大100 |
| `pageToken` | string | 否 | 分页的页面令牌 |
| `sort` | string | 否 | 结果的排序顺序例如“name:asc”、“name:desc” |
| `active` | boolean | 否 | 如果为 true仅显示活动的事件类型。如果为 false 或未选中,则显示所有事件类型(包括活动和非活动)。 |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `collection` | array | 事件类型对象数组 |
### `calendly_get_event_type`
获取特定事件类型的详细信息
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | 是 | Calendly 个人访问令牌 |
| `eventTypeUuid` | string | 是 | 事件类型 UUID可以是完整 URI 或仅是 UUID |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `resource` | object | 事件类型详情 |
### `calendly_list_scheduled_events`
检索用户或组织的已安排事件列表
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | 是 | Calendly 个人访问令牌 |
| `user` | string | 否 | 返回属于该用户的事件 \(URI 格式\)。必须提供 "user" 或 "organization" 之一。 |
| `organization` | string | 否 | 返回属于该组织的事件 \(URI 格式\)。必须提供 "user" 或 "organization" 之一。 |
| `invitee_email` | string | 否 | 返回受邀者具有此电子邮件的事件 |
| `count` | number | 否 | 每页结果数量 \(默认: 20, 最大: 100\) |
| `max_start_time` | string | 否 | 返回开始时间早于此时间的事件 \(ISO 8601 格式\) |
| `min_start_time` | string | 否 | 返回开始时间晚于此时间的事件 \(ISO 8601 格式\) |
| `pageToken` | string | 否 | 分页的页面令牌 |
| `sort` | string | 否 | 结果的排序顺序 \(例如: "start_time:asc", "start_time:desc"\) |
| `status` | string | 否 | 按状态筛选 \("active" 或 "canceled"\) |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `collection` | array | 已安排事件对象的数组 |
### `calendly_get_scheduled_event`
获取特定计划事件的详细信息
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | 是 | Calendly 个人访问令牌 |
| `eventUuid` | string | 是 | 计划事件 UUID可以是完整 URI 或仅是 UUID |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `resource` | object | 计划事件详情 |
### `calendly_list_event_invitees`
检索计划事件的受邀者列表
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | 是 | Calendly 个人访问令牌 |
| `eventUuid` | string | 是 | 计划事件 UUID可以是完整 URI 或仅是 UUID |
| `count` | number | 否 | 每页结果数量(默认: 20最大: 100 |
| `email` | string | 否 | 按电子邮件地址筛选受邀者 |
| `pageToken` | string | 否 | 分页的页面令牌 |
| `sort` | string | 否 | 结果的排序顺序(例如: "created_at:asc", "created_at:desc" |
| `status` | string | 否 | 按状态筛选("active" 或 "canceled" |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `collection` | array | 受邀者对象数组 |
### `calendly_cancel_event`
取消计划事件
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `apiKey` | string | 是 | Calendly 个人访问令牌 |
| `eventUuid` | string | 是 | 要取消的计划事件 UUID \(可以是完整 URI 或仅是 UUID\) |
| `reason` | string | 否 | 取消原因 \(将发送给受邀者\) |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `resource` | object | 取消详情 |
## 注意事项
- 类别: `tools`
- 类型: `calendly`

View File

@@ -24,9 +24,11 @@ import { BlockInfoCard } from "@/components/ui/block-info-card"
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `id` | string | | 内存的标识符。如果具有此 ID 的内存已存在,新数据将追加到其中。 |
| `role` | string | | 代理内存的角色 \(用户、助手或系统\) |
| `conversationId` | string | | 会话标识符例如user-123session-abc。如果此 block 已存在具有该 conversationId 的内存,新消息将附加到该内存中。 |
| `id` | string | | 会话标识符的旧参数。请改用 conversationId。为向后兼容而提供。 |
| `role` | string | 是 | 代理内存的角色user、assistant 或 system |
| `content` | string | 是 | 代理内存的内容 |
| `blockId` | string | 否 | 可选的 block ID。如果未提供将使用执行上下文中的当前 block ID或默认为 "default"。 |
#### 输出
@@ -38,22 +40,25 @@ import { BlockInfoCard } from "@/components/ui/block-info-card"
### `memory_get`
通过 ID 检索特定内存
通过 conversationId、blockId、blockName 或其组合检索内存。返回所有匹配的内存。
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `id` | 字符串 | | 要检索的内存标识符 |
| `conversationId` | string | | 会话标识符例如user-123session-abc。如果单独提供将返回此会话在所有 block 中的所有内存。 |
| `id` | string | 否 | 会话标识符的旧参数。请改用 conversationId。为向后兼容而提供。 |
| `blockId` | string | 否 | block 标识符。如果单独提供,将返回此 block 中所有会话的所有内存。如果与 conversationId 一起提供,将返回此 block 中该特定会话的内存。 |
| `blockName` | string | 否 | block 名称。blockId 的替代选项。如果单独提供,将返回具有此名称的 block 的所有内存。如果与 conversationId 一起提供,将返回具有此名称的 block 中该会话的内存。 |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `success` | 布尔值 | 是否成功检索到内存 |
| `memories` | 数组 | 请求 ID 的内存数据数组 |
| `message` | 字符串 | 成功或错误信息 |
| `error` | 字符串 | 如果操作失败,显示错误信息 |
| `success` | boolean | 内存是否成功检索 |
| `memories` | array | 包含 conversationId、blockId、blockName 和 data 字段的内存对象数组 |
| `message` | string | 成功或错误信息 |
| `error` | string | 如果操作失败错误信息 |
### `memory_get_all`
@@ -68,20 +73,23 @@ import { BlockInfoCard } from "@/components/ui/block-info-card"
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `success` | 布尔值 | 是否成功检索到所有内存 |
| `memories` | 数组 | 包含键、类型和数据的所有内存对象数组 |
| `message` | 字符串 | 成功或错误信息 |
| `error` | 字符串 | 如果操作失败,显示错误信息 |
| `success` | boolean | 是否成功检索到所有内存 |
| `memories` | array | 包含 key、conversationId、blockId、blockName 和 data 字段的所有内存对象数组 |
| `message` | string | 成功或错误信息 |
| `error` | string | 如果操作失败错误信息 |
### `memory_delete`
通过其 ID 删除特定的内存
通过 conversationId、blockId、blockName 或其组合删除内存。支持批量删除。
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `id` | string | | 要删除的内存标识符 |
| `conversationId` | string | | 会话标识符 \(例如user-123session-abc\)。如果单独提供,将删除此会话在所有块中的所有内存。 |
| `id` | string | 否 | 会话标识符的旧参数。请改用 conversationId。为向后兼容而提供。 |
| `blockId` | string | 否 | 块标识符。如果单独提供,将删除此块中所有会话的所有内存。如果与 conversationId 一起提供,将删除此块中特定会话的内存。 |
| `blockName` | string | 否 | 块名称。是 blockId 的替代项。如果单独提供,将删除具有此名称的块的所有内存。如果与 conversationId 一起提供,将删除此名称的块中该会话的内存。 |
#### 输出

View File

@@ -26,7 +26,7 @@ import { BlockInfoCard } from "@/components/ui/block-info-card"
## 使用说明
将 Microsoft Excel 集成到工作流程中。可以读取、写入、更新添加到表格中。需要 OAuth
将 Microsoft Excel 集成到工作流程中。可以读取、写入、更新添加到表格以及创建新工作表
## 工具
@@ -91,6 +91,23 @@ import { BlockInfoCard } from "@/components/ui/block-info-card"
| `values` | array | 添加到表格的行数组 |
| `metadata` | object | 电子表格元数据 |
### `microsoft_excel_worksheet_add`
在 Microsoft Excel 工作簿中创建一个新工作表
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `spreadsheetId` | string | 是 | 要添加工作表的 Excel 工作簿的 ID |
| `worksheetName` | string | 是 | 新工作表的名称。必须在工作簿中唯一,且不能超过 31 个字符 |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `worksheet` | object | 新创建工作表的详细信息 |
## 注意
- 类别:`tools`

View File

@@ -0,0 +1,172 @@
---
title: Neo4j
description: 连接到 Neo4j 图数据库
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="neo4j"
color="#FFFFFF"
/>
## 使用说明
将 Neo4j 图数据库集成到工作流程中。可以查询、创建、合并、更新和删除节点及关系。
## 工具
### `neo4j_query`
执行 MATCH 查询以从 Neo4j 图数据库中读取节点和关系。为了获得最佳性能并防止结果集过大,请在查询中包含 LIMIT例如
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `host` | string | 是 | Neo4j 服务器主机名或 IP 地址 |
| `port` | number | 是 | Neo4j 服务器端口 \(默认Bolt 协议为 7687\) |
| `database` | string | 是 | 要连接的数据库名称 |
| `username` | string | 是 | Neo4j 用户名 |
| `password` | string | 是 | Neo4j 密码 |
| `encryption` | string | 否 | 连接加密模式 \(启用,禁用\) |
| `cypherQuery` | string | 是 | 要执行的 Cypher 查询 \(通常是 MATCH 语句\) |
| `parameters` | object | 否 | Cypher 查询的参数,格式为 JSON 对象。用于任何动态值,包括 LIMIT \(例如,查询:"MATCH \(n\) RETURN n LIMIT $limit", 参数:\{limit: 100\}\)。 |
| `parameters` | string | 否 | 无描述 |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `message` | string | 操作状态消息 |
| `records` | array | 查询返回的记录数组 |
| `recordCount` | number | 返回的记录数量 |
| `summary` | json | 查询执行摘要,包括时间和计数器 |
### `neo4j_create`
执行 CREATE 语句以向 Neo4j 图数据库添加新节点和关系
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `host` | string | 是 | Neo4j 服务器主机名或 IP 地址 |
| `port` | number | 是 | Neo4j 服务器端口 \(默认Bolt 协议为 7687\) |
| `database` | string | 是 | 要连接的数据库名称 |
| `username` | string | 是 | Neo4j 用户名 |
| `password` | string | 是 | Neo4j 密码 |
| `encryption` | string | 否 | 连接加密模式 \(启用,禁用\) |
| `cypherQuery` | string | 是 | 要执行的 Cypher CREATE 语句 |
| `parameters` | object | 否 | Cypher 查询的参数,格式为 JSON 对象 |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `message` | string | 操作状态消息 |
| `summary` | json | 创建摘要,包括创建的节点和关系的计数 |
### `neo4j_merge`
执行 MERGE 语句以在 Neo4j 中查找或创建节点和关系(插入或更新操作)
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `host` | string | 是 | Neo4j 服务器主机名或 IP 地址 |
| `port` | number | 是 | Neo4j 服务器端口 \(默认Bolt 协议为 7687\) |
| `database` | string | 是 | 要连接的数据库名称 |
| `username` | string | 是 | Neo4j 用户名 |
| `password` | string | 是 | Neo4j 密码 |
| `encryption` | string | 否 | 连接加密模式 \(启用,禁用\) |
| `cypherQuery` | string | 是 | 要执行的 Cypher MERGE 语句 |
| `parameters` | object | 否 | Cypher 查询的参数,格式为 JSON 对象 |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `message` | string | 操作状态消息 |
| `summary` | json | 包含节点/关系创建或匹配计数的合并摘要 |
### `neo4j_update`
执行 SET 语句以更新 Neo4j 中现有节点和关系的属性
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `host` | string | 是 | Neo4j 服务器主机名或 IP 地址 |
| `port` | number | 是 | Neo4j 服务器端口 \(默认Bolt 协议为 7687\) |
| `database` | string | 是 | 要连接的数据库名称 |
| `username` | string | 是 | Neo4j 用户名 |
| `password` | string | 是 | Neo4j 密码 |
| `encryption` | string | 否 | 连接加密模式 \(启用,禁用\) |
| `cypherQuery` | string | 是 | 包含 MATCH 和 SET 语句的 Cypher 查询以更新属性 |
| `parameters` | object | 否 | Cypher 查询的参数,格式为 JSON 对象 |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `message` | string | 操作状态消息 |
| `summary` | json | 包含已设置属性计数的更新摘要 |
### `neo4j_delete`
执行 DELETE 或 DETACH DELETE 语句以从 Neo4j 中删除节点和关系
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `host` | string | 是 | Neo4j 服务器主机名或 IP 地址 |
| `port` | number | 是 | Neo4j 服务器端口 \(默认Bolt 协议为 7687\) |
| `database` | string | 是 | 要连接的数据库名称 |
| `username` | string | 是 | Neo4j 用户名 |
| `password` | string | 是 | Neo4j 密码 |
| `encryption` | string | 否 | 连接加密模式 \(启用,禁用\) |
| `cypherQuery` | string | 是 | 包含 MATCH 和 DELETE/DETACH DELETE 语句的 Cypher 查询 |
| `parameters` | object | 否 | Cypher 查询的参数,格式为 JSON 对象 |
| `detach` | boolean | 否 | 是否使用 DETACH DELETE 在删除节点前移除关系 |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `message` | string | 操作状态消息 |
| `summary` | json | 删除摘要,包括已删除的节点和关系的计数 |
### `neo4j_execute`
在 Neo4j 图数据库上执行任意 Cypher 查询以进行复杂操作
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `host` | string | 是 | Neo4j 服务器主机名或 IP 地址 |
| `port` | number | 是 | Neo4j 服务器端口 \(默认Bolt 协议为 7687\) |
| `database` | string | 是 | 要连接的数据库名称 |
| `username` | string | 是 | Neo4j 用户名 |
| `password` | string | 是 | Neo4j 密码 |
| `encryption` | string | 否 | 连接加密模式 \(启用,禁用\) |
| `cypherQuery` | string | 是 | 要执行的 Cypher 查询 \(任何有效的 Cypher 语句\) |
| `parameters` | object | 否 | Cypher 查询的参数,格式为 JSON 对象 |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `message` | string | 操作状态消息 |
| `records` | array | 查询返回的记录数组 |
| `recordCount` | number | 返回的记录数量 |
| `summary` | json | 执行摘要,包括时间和计数 |
## 注意
- 分类:`tools`
- 类型:`neo4j`

View File

@@ -69,8 +69,10 @@ import { BlockInfoCard } from "@/components/ui/block-info-card"
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `message` | object | 包含 Slack 返回的所有属性的完整消息对象 |
| `ts` | string | 消息时间戳 |
| `channel` | string | 消息发送的频道 ID |
| `channel` | string | 发送消息的频道 ID |
| `fileCount` | number | 上传的文件数量(当附加文件时) |
### `slack_canvas`
@@ -153,8 +155,9 @@ import { BlockInfoCard } from "@/components/ui/block-info-card"
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `message` | object | 包含 Slack 返回的所有属性的完整更新消息对象 |
| `content` | string | 成功消息 |
| `metadata` | object | 更新的消息元数据 |
| `metadata` | object | 更新的消息元数据 |
### `slack_delete_message`

View File

@@ -0,0 +1,117 @@
---
title: 语音转文字
description: 使用 AI 将语音转换为文字
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="stt"
color="#181C1E"
/>
{/* MANUAL-CONTENT-START:intro */}
使用领先提供商的最先进 AI 模型将语音转录为文字。Sim 语音转文字 (STT) 工具可以将音频和视频文件转换为准确的文字记录,支持多种语言、时间戳以及可选的翻译功能。
支持的提供商:
- **[OpenAI Whisper](https://platform.openai.com/docs/guides/speech-to-text/overview)**:来自 OpenAI 的先进开源 STT 模型。支持 `whisper-1` 等模型,能够处理多种语言和音频格式。
- **[Deepgram](https://deepgram.com/)**:基于深度学习模型的实时和批量 STT API例如 `nova-3`、`nova-2` 和 `whisper-large`。提供诸如说话人分离、意图识别和行业特定调优等功能。
- **[ElevenLabs](https://elevenlabs.io/)**:以高质量语音 AI 闻名ElevenLabs 提供专注于准确性和自然语言理解的 STT 模型,支持多种语言和方言。
选择最适合您任务的提供商和模型——无论是快速、生产级转录 (Deepgram),高精度多语言能力 (Whisper),还是高级理解和语言覆盖 (ElevenLabs)。
{/* MANUAL-CONTENT-END */}
## 使用说明
使用领先的 AI 提供商将音频和视频文件转录为文字。支持多种语言、时间戳和说话人分离。
## 工具
### `stt_whisper`
使用 OpenAI Whisper 将音频转录为文字
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `provider` | string | 是 | STT 提供商 \(whisper\) |
| `apiKey` | string | 是 | OpenAI API 密钥 |
| `model` | string | 否 | 使用的 Whisper 模型 \(默认值whisper-1\) |
| `audioFile` | file | 否 | 要转录的音频或视频文件 |
| `audioFileReference` | file | 否 | 来自前一个模块的音频/视频文件引用 |
| `audioUrl` | string | 否 | 音频或视频文件的 URL |
| `language` | string | 否 | 语言代码 \(例如:"en"、"es"、"fr"\) 或 "auto" 进行自动检测 |
| `timestamps` | string | 否 | 时间戳粒度:无、句子或单词 |
| `translateToEnglish` | boolean | 否 | 将音频翻译为英语 |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `transcript` | string | 完整的转录文本 |
| `segments` | array | 带时间戳的片段 |
| `language` | string | 检测到的或指定的语言 |
| `duration` | number | 音频时长(以秒为单位) |
| `confidence` | number | 总体置信度评分 |
### `stt_deepgram`
使用 Deepgram 将音频转录为文本
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `provider` | string | 是 | STT 提供商 \(deepgram\) |
| `apiKey` | string | 是 | Deepgram API 密钥 |
| `model` | string | 否 | 要使用的 Deepgram 模型 \(nova-3, nova-2, whisper-large 等\) |
| `audioFile` | file | 否 | 要转录的音频或视频文件 |
| `audioFileReference` | file | 否 | 来自前面模块的音频/视频文件引用 |
| `audioUrl` | string | 否 | 音频或视频文件的 URL |
| `language` | string | 否 | 语言代码 \(例如:"en", "es", "fr"\) 或 "auto" 进行自动检测 |
| `timestamps` | string | 否 | 时间戳粒度:无、句子或单词 |
| `diarization` | boolean | 否 | 启用说话人分离 |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `transcript` | string | 完整的转录文本 |
| `segments` | array | 带有说话人标签的时间戳片段 |
| `language` | string | 检测到的或指定的语言 |
| `duration` | number | 音频时长(以秒为单位) |
| `confidence` | number | 总体置信度评分 |
### `stt_elevenlabs`
使用 ElevenLabs 将音频转录为文本
#### 输入
| 参数 | 类型 | 必需 | 描述 |
| --------- | ---- | -------- | ----------- |
| `provider` | string | 是 | STT 提供商 \(elevenlabs\) |
| `apiKey` | string | 是 | ElevenLabs API 密钥 |
| `model` | string | 否 | 要使用的 ElevenLabs 模型 \(scribe_v1, scribe_v1_experimental\) |
| `audioFile` | file | 否 | 要转录的音频或视频文件 |
| `audioFileReference` | file | 否 | 来自前面模块的音频/视频文件引用 |
| `audioUrl` | string | 否 | 音频或视频文件的 URL |
| `language` | string | 否 | 语言代码 \(例如 "en", "es", "fr"\) 或 "auto" 进行自动检测 |
| `timestamps` | string | 否 | 时间戳粒度:无、句子或单词 |
#### 输出
| 参数 | 类型 | 描述 |
| --------- | ---- | ----------- |
| `transcript` | string | 完整的转录文本 |
| `segments` | array | 带时间戳的片段 |
| `language` | string | 检测到或指定的语言 |
| `duration` | number | 音频时长(秒) |
| `confidence` | number | 总体置信度评分 |
## 注意
- 类别: `tools`
- 类型: `stt`

View File

@@ -894,7 +894,7 @@ checksums:
content/14: 371d0e46b4bd2c23f559b8bc112f6955
content/15: 2f696275726cdeefd7d7280b5bb43b21
content/16: bcadfc362b69078beee0088e5936c98b
content/17: 1f31e78210417a7f251f29e0b93a8528
content/17: bb43e4f36fdc1eb6211f46ddeed9e0aa
content/18: 05540cb3028d4d781521c14e5f9e3835
content/19: 14583a25c48ebea2cef414b4758b883d
content/20: 371d0e46b4bd2c23f559b8bc112f6955
@@ -918,7 +918,7 @@ checksums:
content/38: 371d0e46b4bd2c23f559b8bc112f6955
content/39: 5319bf5409aced353e6b9d67f597ffef
content/40: bcadfc362b69078beee0088e5936c98b
content/41: bc5ec1d17d0dbc502ad0f27b6b8b1242
content/41: d67f49be147c5ea63f88554f3b8eaed1
content/42: e10ecb501eb65fd1a59501a40b707c7a
content/43: d829a82e9bcbcfb6239ca2ed9e10ba77
content/44: 371d0e46b4bd2c23f559b8bc112f6955
@@ -1834,7 +1834,7 @@ checksums:
content/4: 840a65d7676f756ba632bd7828c53024
content/5: 1ee7d3e935ef2c7c535da8c12ee25b56
content/6: 821e6394b0a953e2b0842b04ae8f3105
content/7: 513b14c6b4501f4814c256edc9967883
content/7: d064a1edf0d7fdad9ff5974815de9a61
content/8: 9c8aa3f09c9b2bd50ea4cdff3598ea4e
content/9: 5a447127a97cfcaa65d3b989fede92e5
content/10: d06a280df6a38b6a382231c8eb602d1d
@@ -1854,8 +1854,14 @@ checksums:
content/24: 3c13f3daa829266960e367a017cceca5
content/25: bcadfc362b69078beee0088e5936c98b
content/26: 0c3f7b891315dec911a9c651c2859661
content/27: b3f310d5ef115bea5a8b75bf25d7ea9a
content/28: 93be16cbc63507a9568584e2a30df4b4
content/27: 70ca4ee3b2869738e6184f506706ff30
content/28: 4414625e16d30b342cfa5684a1f5cef8
content/29: 371d0e46b4bd2c23f559b8bc112f6955
content/30: 2a43280485faf5248aaee7b457a2ea58
content/31: bcadfc362b69078beee0088e5936c98b
content/32: 34d56bbba4787024eabd08affc03d847
content/33: b3f310d5ef115bea5a8b75bf25d7ea9a
content/34: 93be16cbc63507a9568584e2a30df4b4
4fea5b273049862aed6ad597bfc35c3f:
meta/title: 7e91fe4b762eaa7410fa882788e1504b
meta/description: eb391c869e4d86d21e4ee08ffff2a318
@@ -1867,25 +1873,25 @@ checksums:
content/5: b061763378e5f0aca9a25f819d03961d
content/6: 75972cfff5aa2f1d4c24f2a1c867cfb7
content/7: 371d0e46b4bd2c23f559b8bc112f6955
content/8: 78ecf15af10a2da337ea4f40d9bdafff
content/8: 8579c5fe58782fed019acfd5019c515e
content/9: bcadfc362b69078beee0088e5936c98b
content/10: 467bff9c1a90c96930d1b05286dd4bf8
content/11: ba06fa96a9fe3d308546a32490e5a8d8
content/12: 85a73e0898e297bea5a887454c79d79b
content/12: 58490686b3358445d2fa89e8a048fb51
content/13: 371d0e46b4bd2c23f559b8bc112f6955
content/14: c76f8eba321f747b91442e808d4acbd8
content/14: 9acf9c7ac7b83db796a143abc8f8de0f
content/15: bcadfc362b69078beee0088e5936c98b
content/16: c02f50f62772f7bc48ec6a6865a440a8
content/16: d4ac7483993edc4308e6034d4bd551bd
content/17: e13dff194d0bc1cecec833cb9805ceaa
content/18: 8813ba0bc9fbf636f3a38e59667df896
content/19: 371d0e46b4bd2c23f559b8bc112f6955
content/20: d71b6bb8e2dd6ce98101aec6a1dd77f2
content/21: bcadfc362b69078beee0088e5936c98b
content/22: 4b2fa576e3f210461b1b7e72afa3860d
content/22: d2f04b0f593a08f7656e7431a6b4e5e5
content/23: 9eebc263273839cc24231b56fd90b71d
content/24: dc02aaf385a0d428f9e88f652291d3e7
content/24: 9acb060c11b48ae498d55aceb053b996
content/25: 371d0e46b4bd2c23f559b8bc112f6955
content/26: 3819fef1e4ff4d33f6bd53762b6a230f
content/26: 707c54d664fcfc307cea6027721b940b
content/27: bcadfc362b69078beee0088e5936c98b
content/28: b48618ae66e09c34074972d091ceaef0
content/29: b3f310d5ef115bea5a8b75bf25d7ea9a
@@ -5117,7 +5123,7 @@ checksums:
content/9: e688b523909d6d6e9966c17892a18c96
content/10: e50bd5107ca3410126cf0252b3c47eca
content/11: d03d17960348dea95c6df8f46114bd0a
content/12: 3850cfbd618a9d1c836fc7086da0f9b4
content/12: 80da7e96414b75bb5b910c437bf7894a
content/13: 6a7479225be3a7c7a42ba557ece50d03
content/14: c64f9cd5168b3e592fe3341cbe1a41fe
content/15: 87d6b6280da1c98b1bc291483459c8cf
@@ -45028,3 +45034,303 @@ checksums:
content/38: 6140e8df144c799f9ad293cab91f87b5
content/39: ebbaea1438438f691d0f84ad89bcfc18
content/40: ac72cc2c55acf316557607a817dce4db
fd4428447037efb6f1fdcdb1cb0c0019:
meta/title: d322235b2ee086191aa5bc73646c7ebd
meta/description: eca9d4e0907d689f1dec8397acdff5f2
content/0: 1b031fb0c62c46b177aeed5c3d3f8f80
content/1: 6335dab76a38445c8367a069fc035a9a
content/2: 0385e919444c586c63091d3ee20bce90
content/3: aceaaf0857904513c19857cdf7f309d6
content/4: 9091fba2c80a89bf3a36ce581831e9ad
content/5: da00278f849ef04f7a6ed713b6eba2f8
content/6: 4d860e38ee1c2551fa66f9b088226f38
content/7: b778e4673a3415dcf105121f25deb1ea
content/8: 821e6394b0a953e2b0842b04ae8f3105
content/9: 4e56a0009fc320a6b2cdee2c8a42afe7
content/10: 9c8aa3f09c9b2bd50ea4cdff3598ea4e
content/11: de33e442f1f340252c811bd7c42b61b0
content/12: 334d84e6dd04c3d542912dfdfb263c05
content/13: 371d0e46b4bd2c23f559b8bc112f6955
content/14: 207ec07169d9e5d8372e1ff765aff4d3
content/15: bcadfc362b69078beee0088e5936c98b
content/16: 4901d7a460798dd849ebc6b74494264d
content/17: 5e4935360e00b6ea57291fafe15e104d
content/18: e9beb5edc9139c53754e929a6bf470a6
content/19: 371d0e46b4bd2c23f559b8bc112f6955
content/20: fc8d4286283ee9b8d374dd0b85102fdd
content/21: bcadfc362b69078beee0088e5936c98b
content/22: 6e5f8e14c30b075d46bce342c5fc7865
content/23: b8a0120d7eecedf101e1338f181feb6e
content/24: 07a1b9ee6eaef529ec9d2c30b27b5440
content/25: 371d0e46b4bd2c23f559b8bc112f6955
content/26: 50e419e7a03c621bf92d745665a4bf6a
content/27: bcadfc362b69078beee0088e5936c98b
content/28: e95c41ae76f88ac54e3fbbcebb0a88d4
content/29: 13747b857ab43cf125259d9d58da0121
content/30: 334d84e6dd04c3d542912dfdfb263c05
content/31: 371d0e46b4bd2c23f559b8bc112f6955
content/32: 9fadddb9651b5b80a01400e3fc4274db
content/33: bcadfc362b69078beee0088e5936c98b
content/34: d3df313379f8b7495f6fc81da7cb4b99
content/35: 1d3f987dc94f4fb0634910a88ab959f0
content/36: 36722410714fa3ca192ca462b48df61e
content/37: 371d0e46b4bd2c23f559b8bc112f6955
content/38: f7ec5c6fa6fe9775ab8ad27807e55a8a
content/39: bcadfc362b69078beee0088e5936c98b
content/40: b6ab50ed4e824c5d4fbbfca1d337ef1a
content/41: 15fe7951afdbbb5f6727e42e6d6e8dd1
content/42: a6d225acd601dd15cb0f5c3aa0967a34
content/43: 371d0e46b4bd2c23f559b8bc112f6955
content/44: 1ecaa277fb2a86eb3951e35950b26a2d
content/45: bcadfc362b69078beee0088e5936c98b
content/46: 698c88b8d2835f3dc0b410882b6726e6
content/47: 024ae5260640857007249003da2ecc34
content/48: 53f5ac34170fc92cbddce8e82aeec295
content/49: 371d0e46b4bd2c23f559b8bc112f6955
content/50: 5734d7d8da47574794f00a231963168d
content/51: bcadfc362b69078beee0088e5936c98b
content/52: 014668581a1f0e1300f174798e99155a
content/53: 0f266d84627c2b1afb4474bf3d29c0c2
content/54: a8d63ec1fe0f439f2b73fcdd24e8096d
content/55: 371d0e46b4bd2c23f559b8bc112f6955
content/56: d3487b6aea8c7aef255548912a1f884f
content/57: bcadfc362b69078beee0088e5936c98b
content/58: 5b013f07822152f3762efe3c3a05a525
content/59: df8fb91a0117aab1fd389fc0c45d5463
content/60: 5d37bda5eabaf494fc1b634c3ec10604
content/61: 371d0e46b4bd2c23f559b8bc112f6955
content/62: d7f063f2a50ce69a6838d5d1fed73d68
content/63: bcadfc362b69078beee0088e5936c98b
content/64: 5804cc57d55b0a2b69f663a6b6175664
content/65: b52e06780703fbc5562eeca991cda5ed
content/66: 49cdedbe6a85a50425e44edae9ab3807
content/67: 371d0e46b4bd2c23f559b8bc112f6955
content/68: 45a432ec65846ccc3d75177cf62b3327
content/69: bcadfc362b69078beee0088e5936c98b
content/70: 30c796112578f56385e527b0b510cccd
content/71: e9eeb0c45ae7667b2b7bef13d7410fea
content/72: 9cdadfeb63fc742922f59eab42508f7f
content/73: 371d0e46b4bd2c23f559b8bc112f6955
content/74: 0a8cb6c46f1a9a12bc308bacd253c029
content/75: bcadfc362b69078beee0088e5936c98b
content/76: 4c6c12405327c20da91484b6e7333706
content/77: e2a10746d92f38b473df73badd7c70b8
content/78: fe523ab7f0c1c2881cad308fe1f83872
content/79: 371d0e46b4bd2c23f559b8bc112f6955
content/80: 7a0e820a1021874d84545371628c9203
content/81: bcadfc362b69078beee0088e5936c98b
content/82: d861918462b4f32885d3e803a65cd64d
content/83: 2aa69f1e049a29229417ba6d2e3b1445
content/84: d42080a386e0e4d06f0b898df1506148
content/85: 371d0e46b4bd2c23f559b8bc112f6955
content/86: 2becb1ef7a9a19a566b799dcd21c1094
content/87: bcadfc362b69078beee0088e5936c98b
content/88: e0337ea36fc756079a94cf02dc114ec1
content/89: 88e29a7727d33d6c643a38d7a82970d8
content/90: 5d37bda5eabaf494fc1b634c3ec10604
content/91: 371d0e46b4bd2c23f559b8bc112f6955
content/92: c9c84b54a4a04fae6663adc5b2829bfd
content/93: bcadfc362b69078beee0088e5936c98b
content/94: 07b8f3c216f8ae79aa06d76be5eee802
content/95: c38cd9052e578c2d7ccbd15b1830a010
content/96: fe36912a2b796f3c4e5a2e2691c1b3e2
content/97: 371d0e46b4bd2c23f559b8bc112f6955
content/98: fc62639a1dcb33c6ef193f30b4bf0b3a
content/99: bcadfc362b69078beee0088e5936c98b
content/100: e48d2fb4e91c9e8b4358e7ac4f5093db
content/101: d3608791907fbda6daf4a17875f8a346
content/102: e177a7922b42d5070180066c7792a14f
content/103: 371d0e46b4bd2c23f559b8bc112f6955
content/104: ef4b2c847b0e6a6a8850b67405307485
content/105: bcadfc362b69078beee0088e5936c98b
content/106: 0a1e1ca063dbd230eb650d7a48641527
content/107: efec5de90c6a5a9a3581c58b29f69bb3
content/108: c32368f2b4588ccadf506e1c9ed39d75
content/109: 371d0e46b4bd2c23f559b8bc112f6955
content/110: 8cabab943e91cdd79d9bfae711f994f9
content/111: bcadfc362b69078beee0088e5936c98b
content/112: 9937f636bf6fe375c6dd6f9487dfc29b
content/113: eaac5385f11112d94f64d82c01d8aa2e
content/114: 0b0729e62563093467511ead5748d915
content/115: 371d0e46b4bd2c23f559b8bc112f6955
content/116: 76ba25e29652de483508549f8b90ab48
content/117: bcadfc362b69078beee0088e5936c98b
content/118: b4f907e7eed3be38e121c002deafe05b
content/119: 864754086908946a6c0d6bd85ad45f28
content/120: 5f33febd2cc081df4a95cd69fb78d4c9
content/121: 371d0e46b4bd2c23f559b8bc112f6955
content/122: 428a41b3a47626eb3839a17ea62d1249
content/123: bcadfc362b69078beee0088e5936c98b
content/124: 4b395627e7c1e29f76e12c33dff42807
content/125: dd774884430bc5bc1ea292e12966a2f6
content/126: df64e6a7a29140da7ef6ebc001d3b1fa
content/127: 371d0e46b4bd2c23f559b8bc112f6955
content/128: c2e58111c9310934719943f7f874e7a2
content/129: bcadfc362b69078beee0088e5936c98b
content/130: eb99048c37273bd44e33f946a1a990f9
content/131: 3398f33c56b20395e10f74d7912bd359
content/132: a257be3bbd676f5b92271bb09b6b4005
content/133: 371d0e46b4bd2c23f559b8bc112f6955
content/134: 0967329ecb6aaffbcf4808689d6c7692
content/135: bcadfc362b69078beee0088e5936c98b
content/136: 3b9ffef9f524a83ab0e6b92fa7ef5036
content/137: 9396f5c2552c1a6029d49ca65fdf3cbc
content/138: f308e8c0e6411b58416fd819faed8b17
content/139: 371d0e46b4bd2c23f559b8bc112f6955
content/140: d7376059810ebcff0f5a197096ed3e89
content/141: bcadfc362b69078beee0088e5936c98b
content/142: acba021f8dfa66acf74aef7dfa06b384
content/143: a28a71db4d9d9e3ac1306331c1498458
content/144: 290089fc05ce94f36485132a262c931e
content/145: 371d0e46b4bd2c23f559b8bc112f6955
content/146: 7607f6ceabb96a1e76be0486e81605a7
content/147: bcadfc362b69078beee0088e5936c98b
content/148: 011e17b44011848f2681d7c92d2a4193
content/149: 62d24bdd0997e5ac5fa2e948dab82b0f
content/150: 2cff4b4ece8a12f73f36dc5292625342
content/151: 371d0e46b4bd2c23f559b8bc112f6955
content/152: a770b4c0251752f171e20fbfaaca6c04
content/153: bcadfc362b69078beee0088e5936c98b
content/154: 0831b561d4286c23d0994689c97a4a04
content/155: f58c506bdc8e1c2484433ee0fcc52e2f
content/156: 2b986bfb8651602493e0e1f52b1af961
content/157: 371d0e46b4bd2c23f559b8bc112f6955
content/158: 1b1ed0ef0ad24a173d701afeaf41385b
content/159: bcadfc362b69078beee0088e5936c98b
content/160: fb835329fe9cde08d9ad9730b0305ab3
content/161: b3f310d5ef115bea5a8b75bf25d7ea9a
content/162: 0dc746c73de459c0e96845487cc48997
982e788c564de9c81fa9eaabf1a5fa49:
meta/title: d7a444976365f685817237ac05fd34f6
meta/description: 63ec640159270ed7c005a16400b82415
content/0: 1b031fb0c62c46b177aeed5c3d3f8f80
content/1: 0cfa7acc2c7996956dadcb6758bad8ec
content/2: 821e6394b0a953e2b0842b04ae8f3105
content/3: afbd33890a86dd4a6fa70f59dfff3e4a
content/4: 9c8aa3f09c9b2bd50ea4cdff3598ea4e
content/5: 297d87df4adc36167d404814ccc57aad
content/6: 9f5015e85cfa90efd866e335b60ed088
content/7: 371d0e46b4bd2c23f559b8bc112f6955
content/8: 013afc1516faf50d10da5356e347991e
content/9: bcadfc362b69078beee0088e5936c98b
content/10: 2533ecff0ae49cd92d9fac877df5d7c5
content/11: b9cb62986f654ea5f2d26da59a5afcb1
content/12: 8302cb799a95c69b688c3cc60c8ca547
content/13: 371d0e46b4bd2c23f559b8bc112f6955
content/14: 4fec31a79bd95667b6ff64056456c675
content/15: bcadfc362b69078beee0088e5936c98b
content/16: 0311d0c811d95a32fe64ada5cb6785a2
content/17: 2c73fcb5aaeb831e8445939939391d4a
content/18: 18934c5bf0a58751121da8d6ceff03c5
content/19: 371d0e46b4bd2c23f559b8bc112f6955
content/20: 31cc8071914e81be7a2c24e9803ff9c1
content/21: bcadfc362b69078beee0088e5936c98b
content/22: 8872c76c088384089a167071996e2bfe
content/23: bbfe9f1513389634ad99534fc255adcd
content/24: 2625b6a063ef4ac36ea91293d46169e7
content/25: 371d0e46b4bd2c23f559b8bc112f6955
content/26: 463d2d790179a57459e3baebc9d7b80b
content/27: bcadfc362b69078beee0088e5936c98b
content/28: b8c51b5e356e5f6887506cc119e1316c
content/29: 742f6f06d608746b75f450c9fc6c8aec
content/30: ac725c569e0800e74a78c92f2162a558
content/31: 371d0e46b4bd2c23f559b8bc112f6955
content/32: 45056fdafa5f66c3fb6e65ff566cef55
content/33: bcadfc362b69078beee0088e5936c98b
content/34: 7186145dcc99e2aa467ea3829a144ffa
content/35: 6e31697819e7e2872512d49d05879bf4
content/36: 9aa1ae985022bee500728fb2cc8540e6
content/37: 371d0e46b4bd2c23f559b8bc112f6955
content/38: b26edc7400b077817fe1cf652badb9b5
content/39: bcadfc362b69078beee0088e5936c98b
content/40: 738b71be44f845e51c37741121e7719c
content/41: b3f310d5ef115bea5a8b75bf25d7ea9a
content/42: 1585ad3bfe57b75b3f00c9bbd534b025
c3023cb2cf5ac0f87875390c70d177e3:
meta/title: c069a454d8bc35905d244eafd5c79c2f
meta/description: 3ce073a26805cb234451599729cb72ac
content/0: 1b031fb0c62c46b177aeed5c3d3f8f80
content/1: 3d83b1ab93a161fe14c7a95fdf384aef
content/2: 40ed265403d3fd3fa18fc3b98b7578c1
content/3: af9879585e299128fc4bf31f9b5dd26a
content/4: 674d6480e3f83ec48de4bffb575fc50c
content/5: 7e187025537c8856f1b7b0e9dfd46659
content/6: 821e6394b0a953e2b0842b04ae8f3105
content/7: 8671dfc4df37a8bc2c6fbe0bece84ab4
content/8: 9c8aa3f09c9b2bd50ea4cdff3598ea4e
content/9: 0d6d2999bde4b457c6ab5edd7fb339e6
content/10: c1b1e2b091366325fd2a17c38696ccd4
content/11: 371d0e46b4bd2c23f559b8bc112f6955
content/12: 4563919e59073792975160200d8a4266
content/13: bcadfc362b69078beee0088e5936c98b
content/14: 85d884f66535f05fc5a50ef18f8dbd93
content/15: 5428e789a73f56957d6132981e439cda
content/16: 695984df3b2d9e3ec48e6a3b763b97ce
content/17: 371d0e46b4bd2c23f559b8bc112f6955
content/18: 09aa4a088e0f4fa05c3f8a9a1fc12ee6
content/19: bcadfc362b69078beee0088e5936c98b
content/20: 874a488af0b8a6502cdefe09186b6e04
content/21: 674960ea439e26adab6a145ca6a849be
content/22: 781970b8ad26fab93806885d9ec2de6f
content/23: 371d0e46b4bd2c23f559b8bc112f6955
content/24: 7cf4b4ca74a58ec0547cdb4229f0a986
content/25: bcadfc362b69078beee0088e5936c98b
content/26: 5ba989b2c70cdb0882ab51c29efad4a8
content/27: ca448961a9a911d0e119dc90ca0bf79a
content/28: 113eaed5c9ad54d4b84d9ea2b15289d0
content/29: 371d0e46b4bd2c23f559b8bc112f6955
content/30: 1090a09c040aa3407b26c05fe8e06a88
content/31: bcadfc362b69078beee0088e5936c98b
content/32: d9f59b682f82dbec12ff59159edf7570
content/33: efc3e3d18ff03e50816783bca3cb327b
content/34: c0210d0639be07ce7bc9b006bf7a2e7d
content/35: 371d0e46b4bd2c23f559b8bc112f6955
content/36: 4e380133281f2e37b365762684f6878a
content/37: bcadfc362b69078beee0088e5936c98b
content/38: 597f0113a86f8510a95ab2189bc38316
content/39: 28d9a2b0d1b92fb4091a9e695b1668cd
content/40: 90fb1f55f511cb4b33fbebda2ede81a9
content/41: 371d0e46b4bd2c23f559b8bc112f6955
content/42: 21594ec9e38271cd8479b363c4533a31
content/43: bcadfc362b69078beee0088e5936c98b
content/44: 7d6ad1d154773b658dca1e75c90bbca1
content/45: 0d7c70a5ca931d324189e092d33285dd
content/46: 0bb79aa11a04fdc63fd27a25034042bc
content/47: 371d0e46b4bd2c23f559b8bc112f6955
content/48: 2fe3a0646c2c342e35e17cbf3acbca33
content/49: bcadfc362b69078beee0088e5936c98b
content/50: 6f27a3ae833363f1cd6df298979187f5
content/51: b3f310d5ef115bea5a8b75bf25d7ea9a
content/52: b80a888741afcf29ac33c9cadb9f3502
d90931017b46914e0c322d9814716544:
meta/title: 1f6052d8c66a9656710488fc9a7ea14f
meta/description: b47aabe3d468796da9356ca25b5aac0e
content/0: 1b031fb0c62c46b177aeed5c3d3f8f80
content/1: e2d2b01f5510e19c8ff30bd108d739c9
content/2: 1bde652151a4ff8bf0b3c9c782e4ac11
content/3: 89bc80328bd72ab149ec8b6845dece8b
content/4: 8158ba67c513f34de8932258e57b30f9
content/5: 90c4eca7b7524047e3ef6bc1237ad067
content/6: 821e6394b0a953e2b0842b04ae8f3105
content/7: 45fdd3ceca2128a340cafb7faba01278
content/8: 9c8aa3f09c9b2bd50ea4cdff3598ea4e
content/9: 40d2668585c0b17ab8a0e6f7c721e434
content/10: 021ca9463ef797c41485cce42b6f7709
content/11: 371d0e46b4bd2c23f559b8bc112f6955
content/12: c94fdb65974bc4c4a656f98e31fff0c6
content/13: bcadfc362b69078beee0088e5936c98b
content/14: a47b7c6ecd9d4f9623faee0f642cd09b
content/15: c054a98a01f066a22a0b76af03bba7ae
content/16: 9c04c67366eca1a253947ceb20352edf
content/17: 371d0e46b4bd2c23f559b8bc112f6955
content/18: aa0bfae1dbcf3a0721aca4cb156a5bcf
content/19: bcadfc362b69078beee0088e5936c98b
content/20: f9266172e9fb5ef06a83082fa0867e22
content/21: dbbd82e674306d7d291392ec2c9230e5
content/22: bc25f5ab4531ebc89e325ef174afdb8e
content/23: 371d0e46b4bd2c23f559b8bc112f6955
content/24: 76a9ae65d0667171ce08fa8d64afd2a3
content/25: bcadfc362b69078beee0088e5936c98b
content/26: a47b7c6ecd9d4f9623faee0f642cd09b
content/27: b3f310d5ef115bea5a8b75bf25d7ea9a
content/28: ed565ff5d3337b3e57aaec982d6775c1

View File

@@ -12,7 +12,6 @@
},
"dependencies": {
"@tabler/icons-react": "^3.31.0",
"@vercel/analytics": "1.5.0",
"@vercel/og": "^0.6.5",
"clsx": "^2.1.1",
"fumadocs-core": "15.8.2",

View File

@@ -563,6 +563,32 @@ logger.error('Operation failed', { error })
---
## Linting and Formatting
### Automated Linting
**Do not manually fix linting errors.** The project uses automated linting tools that should handle formatting and style issues.
### Rules
1. **No Manual Fixes**: Do not attempt to manually reorder CSS classes, fix formatting, or address linter warnings
2. **Use Automated Tools**: If linting errors need to be fixed, run `bun run lint` to let the automated tools handle it
3. **Focus on Logic**: Concentrate on functionality, TypeScript correctness, and architectural patterns
4. **Let Tools Handle Style**: Biome and other linters will automatically format code according to project standards
### When Linting Matters
- **Syntax Errors**: Fix actual syntax errors that prevent compilation
- **Type Errors**: Address TypeScript type errors that indicate logic issues
- **Ignore Style Warnings**: CSS class order, formatting preferences, etc. will be handled by tooling
```bash
# If linting is required
bun run lint
```
---
## Code Quality Checklist
Before considering a component/hook complete, verify:

View File

@@ -513,7 +513,7 @@ function SignupFormContent({
disabled={isLoading}
>
<span className='flex items-center gap-1'>
{isLoading ? 'Creating account...' : 'Create account'}
{isLoading ? 'Creating account' : 'Create account'}
<span className='inline-flex transition-transform duration-200 group-hover:translate-x-0.5'>
{isButtonHovered ? (
<ArrowRight className='h-4 w-4' aria-hidden='true' />

View File

@@ -215,7 +215,7 @@ export default function Hero() {
{ key: 'linear', icon: LinearIcon, label: 'Linear', style: { color: '#5E6AD2' } },
{ key: 'discord', icon: DiscordIcon, label: 'Discord', style: { color: '#5765F2' } },
{ key: 'airtable', icon: AirtableIcon, label: 'Airtable' },
{ key: 'stripe', icon: StripeIcon, label: 'Stripe' },
{ key: 'stripe', icon: StripeIcon, label: 'Stripe', style: { color: '#635BFF' } },
{ key: 'notion', icon: NotionIcon, label: 'Notion' },
{ key: 'googleSheets', icon: GoogleSheetsIcon, label: 'Google Sheets' },
{ key: 'googleDrive', icon: GoogleDriveIcon, label: 'Google Drive' },

View File

@@ -1,7 +1,6 @@
import * as Icons from '@/components/icons'
import { inter } from '@/app/fonts/inter/inter'
// AI models and providers
const modelProviderIcons = [
{ icon: Icons.OpenAIIcon, label: 'OpenAI' },
{ icon: Icons.AnthropicIcon, label: 'Anthropic' },
@@ -16,7 +15,6 @@ const modelProviderIcons = [
{ icon: Icons.ElevenLabsIcon, label: 'ElevenLabs' },
]
// Communication and productivity tools
const communicationIcons = [
{ icon: Icons.SlackIcon, label: 'Slack' },
{ icon: Icons.GmailIcon, label: 'Gmail' },
@@ -28,6 +26,7 @@ const communicationIcons = [
{ icon: Icons.ConfluenceIcon, label: 'Confluence' },
{ icon: Icons.TelegramIcon, label: 'Telegram' },
{ icon: Icons.GoogleCalendarIcon, label: 'Google Calendar' },
{ icon: Icons.CalendlyIcon, label: 'Calendly' },
{ icon: Icons.GoogleDocsIcon, label: 'Google Docs' },
{ icon: Icons.BrowserUseIcon, label: 'BrowserUse' },
{ icon: Icons.TypeformIcon, label: 'Typeform' },
@@ -37,7 +36,6 @@ const communicationIcons = [
{ icon: Icons.AirtableIcon, label: 'Airtable' },
]
// Data, storage and search services
const dataStorageIcons = [
{ icon: Icons.PineconeIcon, label: 'Pinecone' },
{ icon: Icons.SupabaseIcon, label: 'Supabase' },

View File

@@ -20,7 +20,7 @@ interface NavProps {
}
export default function Nav({ hideAuthButtons = false, variant = 'landing' }: NavProps = {}) {
const [githubStars, setGithubStars] = useState('18k')
const [githubStars, setGithubStars] = useState('18.5k')
const [isHovered, setIsHovered] = useState(false)
const [isLoginHovered, setIsLoginHovered] = useState(false)
const router = useRouter()

View File

@@ -61,6 +61,7 @@ export default async function Page({ params }: { params: Promise<{ slug: string
width={450}
height={360}
className='h-auto w-full'
sizes='(max-width: 768px) 100vw, 450px'
priority
itemProp='image'
/>
@@ -131,7 +132,7 @@ export default async function Page({ params }: { params: Promise<{ slug: string
{related.length > 0 && (
<div className='mx-auto max-w-[900px] px-6 pb-24 sm:px-8 md:px-12'>
<h2 className='mb-4 font-medium text-[24px]'>Related posts</h2>
<div className='grid grid-cols-1 gap-6 sm:grid-cols-2 lg:grid-cols-3'>
<div className='grid grid-cols-1 gap-4 sm:grid-cols-2 sm:gap-6 lg:grid-cols-3'>
{related.map((p) => (
<Link key={p.slug} href={`/studio/${p.slug}`} className='group'>
<div className='overflow-hidden rounded-lg border border-gray-200'>
@@ -141,6 +142,8 @@ export default async function Page({ params }: { params: Promise<{ slug: string
width={600}
height={315}
className='h-[160px] w-full object-cover'
sizes='(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 33vw'
loading='lazy'
/>
<div className='p-3'>
<div className='mb-1 text-gray-600 text-xs'>

View File

@@ -63,7 +63,7 @@ export default async function StudioIndex({
</div> */}
{/* Grid layout for consistent rows */}
<div className='grid grid-cols-1 gap-6 md:grid-cols-2 lg:grid-cols-3'>
<div className='grid grid-cols-1 gap-4 md:grid-cols-2 md:gap-6 lg:grid-cols-3'>
{posts.map((p, i) => {
return (
<Link key={p.slug} href={`/studio/${p.slug}`} className='group flex flex-col'>
@@ -74,6 +74,8 @@ export default async function StudioIndex({
width={800}
height={450}
className='h-48 w-full object-cover'
sizes='(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw'
loading='lazy'
/>
<div className='flex flex-1 flex-col p-4'>
<div className='mb-2 text-gray-600 text-xs'>

View File

@@ -1,12 +1,9 @@
import { db } from '@sim/db'
import { account } from '@sim/db/schema'
import { eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { getSession } from '@/lib/auth'
import { authorizeCredentialUse } from '@/lib/auth/credential-access'
import { createLogger } from '@/lib/logs/console/logger'
import { validateMicrosoftGraphId } from '@/lib/security/input-validation'
import { generateRequestId } from '@/lib/utils'
import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils'
import { getCredential, refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils'
export const dynamic = 'force-dynamic'
@@ -15,15 +12,10 @@ const logger = createLogger('MicrosoftFileAPI')
export async function GET(request: NextRequest) {
const requestId = generateRequestId()
try {
const session = await getSession()
if (!session?.user?.id) {
return NextResponse.json({ error: 'User not authenticated' }, { status: 401 })
}
const { searchParams } = new URL(request.url)
const credentialId = searchParams.get('credentialId')
const fileId = searchParams.get('fileId')
const workflowId = searchParams.get('workflowId') || undefined
if (!credentialId || !fileId) {
return NextResponse.json({ error: 'Credential ID and File ID are required' }, { status: 400 })
@@ -35,19 +27,27 @@ export async function GET(request: NextRequest) {
return NextResponse.json({ error: fileIdValidation.error }, { status: 400 })
}
const credentials = await db.select().from(account).where(eq(account.id, credentialId)).limit(1)
const authz = await authorizeCredentialUse(request, {
credentialId,
workflowId,
requireWorkflowIdForInternal: false,
})
if (!credentials.length) {
if (!authz.ok || !authz.credentialOwnerUserId) {
const status = authz.error === 'Credential not found' ? 404 : 403
return NextResponse.json({ error: authz.error || 'Unauthorized' }, { status })
}
const credential = await getCredential(requestId, credentialId, authz.credentialOwnerUserId)
if (!credential) {
return NextResponse.json({ error: 'Credential not found' }, { status: 404 })
}
const credential = credentials[0]
if (credential.userId !== session.user.id) {
return NextResponse.json({ error: 'Unauthorized' }, { status: 403 })
}
const accessToken = await refreshAccessTokenIfNeeded(credentialId, session.user.id, requestId)
const accessToken = await refreshAccessTokenIfNeeded(
credentialId,
authz.credentialOwnerUserId,
requestId
)
if (!accessToken) {
return NextResponse.json({ error: 'Failed to obtain valid access token' }, { status: 401 })

View File

@@ -1,11 +1,8 @@
import { db } from '@sim/db'
import { account } from '@sim/db/schema'
import { eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { getSession } from '@/lib/auth'
import { authorizeCredentialUse } from '@/lib/auth/credential-access'
import { createLogger } from '@/lib/logs/console/logger'
import { generateRequestId } from '@/lib/utils'
import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils'
import { getCredential, refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils'
export const dynamic = 'force-dynamic'
@@ -18,46 +15,39 @@ export async function GET(request: NextRequest) {
const requestId = generateRequestId()
try {
// Get the session
const session = await getSession()
// Check if the user is authenticated
if (!session?.user?.id) {
logger.warn(`[${requestId}] Unauthenticated request rejected`)
return NextResponse.json({ error: 'User not authenticated' }, { status: 401 })
}
// Get the credential ID from the query params
const { searchParams } = new URL(request.url)
const credentialId = searchParams.get('credentialId')
const query = searchParams.get('query') || ''
const workflowId = searchParams.get('workflowId') || undefined
if (!credentialId) {
logger.warn(`[${requestId}] Missing credential ID`)
return NextResponse.json({ error: 'Credential ID is required' }, { status: 400 })
}
// Get the credential from the database
const credentials = await db.select().from(account).where(eq(account.id, credentialId)).limit(1)
const authz = await authorizeCredentialUse(request, {
credentialId,
workflowId,
requireWorkflowIdForInternal: false,
})
if (!credentials.length) {
logger.warn(`[${requestId}] Credential not found`, { credentialId })
if (!authz.ok || !authz.credentialOwnerUserId) {
const status = authz.error === 'Credential not found' ? 404 : 403
return NextResponse.json({ error: authz.error || 'Unauthorized' }, { status })
}
const credential = await getCredential(requestId, credentialId, authz.credentialOwnerUserId)
if (!credential) {
return NextResponse.json({ error: 'Credential not found' }, { status: 404 })
}
const credential = credentials[0]
// Check if the credential belongs to the user
if (credential.userId !== session.user.id) {
logger.warn(`[${requestId}] Unauthorized credential access attempt`, {
credentialUserId: credential.userId,
requestUserId: session.user.id,
})
return NextResponse.json({ error: 'Unauthorized' }, { status: 403 })
}
// Refresh access token if needed using the utility function
const accessToken = await refreshAccessTokenIfNeeded(credentialId, session.user.id, requestId)
const accessToken = await refreshAccessTokenIfNeeded(
credentialId,
authz.credentialOwnerUserId,
requestId
)
if (!accessToken) {
return NextResponse.json({ error: 'Failed to obtain valid access token' }, { status: 401 })

View File

@@ -1,8 +1,8 @@
import { render } from '@react-email/components'
import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod'
import CareersConfirmationEmail from '@/components/emails/careers-confirmation-email'
import CareersSubmissionEmail from '@/components/emails/careers-submission-email'
import CareersConfirmationEmail from '@/components/emails/careers/careers-confirmation-email'
import CareersSubmissionEmail from '@/components/emails/careers/careers-submission-email'
import { sendEmail } from '@/lib/email/mailer'
import { createLogger } from '@/lib/logs/console/logger'
import { generateRequestId } from '@/lib/utils'

View File

@@ -1,6 +1,6 @@
import { db } from '@sim/db'
import { webhook as webhookTable, workflow as workflowTable } from '@sim/db/schema'
import { and, eq } from 'drizzle-orm'
import { and, eq, or } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { verifyCronAuth } from '@/lib/auth/internal'
import { createLogger } from '@/lib/logs/console/logger'
@@ -35,7 +35,15 @@ export async function GET(request: NextRequest) {
})
.from(webhookTable)
.innerJoin(workflowTable, eq(webhookTable.workflowId, workflowTable.id))
.where(and(eq(webhookTable.isActive, true), eq(webhookTable.provider, 'microsoftteams')))
.where(
and(
eq(webhookTable.isActive, true),
or(
eq(webhookTable.provider, 'microsoft-teams'),
eq(webhookTable.provider, 'microsoftteams')
)
)
)
logger.info(
`Found ${webhooksWithWorkflows.length} active Teams webhooks, checking for expiring subscriptions`

View File

@@ -13,21 +13,37 @@ import {
} from '@/app/api/files/utils'
const ALLOWED_EXTENSIONS = new Set([
// Documents
'pdf',
'doc',
'docx',
'txt',
'md',
'png',
'jpg',
'jpeg',
'gif',
'csv',
'xlsx',
'xls',
'json',
'yaml',
'yml',
// Images
'png',
'jpg',
'jpeg',
'gif',
// Audio
'mp3',
'm4a',
'wav',
'webm',
'ogg',
'flac',
'aac',
'opus',
// Video
'mp4',
'mov',
'avi',
'mkv',
])
function validateFileExtension(filename: string): boolean {

View File

@@ -60,7 +60,12 @@ export async function GET(request: NextRequest) {
let conditions: SQL | undefined = eq(workflow.workspaceId, params.workspaceId)
if (params.level && params.level !== 'all') {
conditions = and(conditions, eq(workflowExecutionLogs.level, params.level))
const levels = params.level.split(',').filter(Boolean)
if (levels.length === 1) {
conditions = and(conditions, eq(workflowExecutionLogs.level, levels[0]))
} else if (levels.length > 1) {
conditions = and(conditions, inArray(workflowExecutionLogs.level, levels))
}
}
if (params.workflowIds) {

View File

@@ -126,9 +126,14 @@ export async function GET(request: NextRequest) {
// Build additional conditions for the query
let conditions: SQL | undefined
// Filter by level
// Filter by level (supports comma-separated for OR conditions)
if (params.level && params.level !== 'all') {
conditions = and(conditions, eq(workflowExecutionLogs.level, params.level))
const levels = params.level.split(',').filter(Boolean)
if (levels.length === 1) {
conditions = and(conditions, eq(workflowExecutionLogs.level, levels[0]))
} else if (levels.length > 1) {
conditions = and(conditions, inArray(workflowExecutionLogs.level, levels))
}
}
// Filter by specific workflow IDs

View File

@@ -1,5 +1,5 @@
import { db } from '@sim/db'
import { memory } from '@sim/db/schema'
import { memory, workflowBlocks } from '@sim/db/schema'
import { and, eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod'
@@ -8,6 +8,43 @@ import { generateRequestId } from '@/lib/utils'
const logger = createLogger('MemoryByIdAPI')
/**
* Parse memory key into conversationId and blockId
* Key format: conversationId:blockId
*/
function parseMemoryKey(key: string): { conversationId: string; blockId: string } | null {
const parts = key.split(':')
if (parts.length !== 2) {
return null
}
return {
conversationId: parts[0],
blockId: parts[1],
}
}
/**
* Lookup block name from block ID
*/
async function getBlockName(blockId: string, workflowId: string): Promise<string | undefined> {
try {
const result = await db
.select({ name: workflowBlocks.name })
.from(workflowBlocks)
.where(and(eq(workflowBlocks.id, blockId), eq(workflowBlocks.workflowId, workflowId)))
.limit(1)
if (result.length === 0) {
return undefined
}
return result[0].name
} catch (error) {
logger.error('Error looking up block name', { error, blockId, workflowId })
return undefined
}
}
const memoryQuerySchema = z.object({
workflowId: z.string().uuid('Invalid workflow ID format'),
})
@@ -41,7 +78,6 @@ export async function GET(request: NextRequest, { params }: { params: Promise<{
try {
logger.info(`[${requestId}] Processing memory get request for ID: ${id}`)
// Get workflowId from query parameter (required)
const url = new URL(request.url)
const workflowId = url.searchParams.get('workflowId')
@@ -65,7 +101,6 @@ export async function GET(request: NextRequest, { params }: { params: Promise<{
const { workflowId: validatedWorkflowId } = validation.data
// Query the database for the memory
const memories = await db
.select()
.from(memory)
@@ -86,13 +121,36 @@ export async function GET(request: NextRequest, { params }: { params: Promise<{
)
}
const mem = memories[0]
const parsed = parseMemoryKey(mem.key)
let enrichedMemory
if (!parsed) {
enrichedMemory = {
conversationId: mem.key,
blockId: 'unknown',
blockName: 'unknown',
data: mem.data,
}
} else {
const { conversationId, blockId } = parsed
const blockName = (await getBlockName(blockId, validatedWorkflowId)) || 'unknown'
enrichedMemory = {
conversationId,
blockId,
blockName,
data: mem.data,
}
}
logger.info(
`[${requestId}] Memory retrieved successfully: ${id} for workflow: ${validatedWorkflowId}`
)
return NextResponse.json(
{
success: true,
data: memories[0],
data: enrichedMemory,
},
{ status: 200 }
)
@@ -122,7 +180,6 @@ export async function DELETE(
try {
logger.info(`[${requestId}] Processing memory delete request for ID: ${id}`)
// Get workflowId from query parameter (required)
const url = new URL(request.url)
const workflowId = url.searchParams.get('workflowId')
@@ -146,7 +203,6 @@ export async function DELETE(
const { workflowId: validatedWorkflowId } = validation.data
// Verify memory exists before attempting to delete
const existingMemory = await db
.select({ id: memory.id })
.from(memory)
@@ -166,7 +222,6 @@ export async function DELETE(
)
}
// Hard delete the memory
await db
.delete(memory)
.where(and(eq(memory.key, id), eq(memory.workflowId, validatedWorkflowId)))
@@ -241,7 +296,6 @@ export async function PUT(request: NextRequest, { params }: { params: Promise<{
)
}
// Verify memory exists before attempting to update
const existingMemories = await db
.select()
.from(memory)
@@ -261,47 +315,68 @@ export async function PUT(request: NextRequest, { params }: { params: Promise<{
)
}
const existingMemory = existingMemories[0]
// Additional validation for agent memory type
if (existingMemory.type === 'agent') {
const agentValidation = agentMemoryDataSchema.safeParse(validatedData)
if (!agentValidation.success) {
const errorMessage = agentValidation.error.errors
.map((err) => `${err.path.join('.')}: ${err.message}`)
.join(', ')
logger.warn(`[${requestId}] Agent memory validation error: ${errorMessage}`)
return NextResponse.json(
{
success: false,
error: {
message: `Invalid agent memory data: ${errorMessage}`,
},
const agentValidation = agentMemoryDataSchema.safeParse(validatedData)
if (!agentValidation.success) {
const errorMessage = agentValidation.error.errors
.map((err) => `${err.path.join('.')}: ${err.message}`)
.join(', ')
logger.warn(`[${requestId}] Agent memory validation error: ${errorMessage}`)
return NextResponse.json(
{
success: false,
error: {
message: `Invalid agent memory data: ${errorMessage}`,
},
{ status: 400 }
)
}
},
{ status: 400 }
)
}
// Update the memory with new data
const now = new Date()
await db
.delete(memory)
.update(memory)
.set({
data: validatedData,
updatedAt: now,
})
.where(and(eq(memory.key, id), eq(memory.workflowId, validatedWorkflowId)))
// Fetch the updated memory
const updatedMemories = await db
.select()
.from(memory)
.where(and(eq(memory.key, id), eq(memory.workflowId, validatedWorkflowId)))
.limit(1)
const mem = updatedMemories[0]
const parsed = parseMemoryKey(mem.key)
let enrichedMemory
if (!parsed) {
enrichedMemory = {
conversationId: mem.key,
blockId: 'unknown',
blockName: 'unknown',
data: mem.data,
}
} else {
const { conversationId, blockId } = parsed
const blockName = (await getBlockName(blockId, validatedWorkflowId)) || 'unknown'
enrichedMemory = {
conversationId,
blockId,
blockName,
data: mem.data,
}
}
logger.info(
`[${requestId}] Memory updated successfully: ${id} for workflow: ${validatedWorkflowId}`
)
return NextResponse.json(
{
success: true,
data: updatedMemories[0],
data: enrichedMemory,
},
{ status: 200 }
)

View File

@@ -1,15 +1,34 @@
import { db } from '@sim/db'
import { memory } from '@sim/db/schema'
import { and, eq, isNull, like } from 'drizzle-orm'
import { memory, workflowBlocks } from '@sim/db/schema'
import { and, eq, inArray, isNull, like } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { checkHybridAuth } from '@/lib/auth/hybrid'
import { createLogger } from '@/lib/logs/console/logger'
import { generateRequestId } from '@/lib/utils'
import { getWorkflowAccessContext } from '@/lib/workflows/utils'
const logger = createLogger('MemoryAPI')
export const dynamic = 'force-dynamic'
export const runtime = 'nodejs'
/**
* Parse memory key into conversationId and blockId
* Key format: conversationId:blockId
* @param key The memory key to parse
* @returns Object with conversationId and blockId, or null if invalid
*/
function parseMemoryKey(key: string): { conversationId: string; blockId: string } | null {
const parts = key.split(':')
if (parts.length !== 2) {
return null
}
return {
conversationId: parts[0],
blockId: parts[1],
}
}
/**
* GET handler for searching and retrieving memories
* Supports query parameters:
@@ -22,16 +41,28 @@ export async function GET(request: NextRequest) {
const requestId = generateRequestId()
try {
const authResult = await checkHybridAuth(request)
if (!authResult.success || !authResult.userId) {
logger.warn(`[${requestId}] Unauthorized memory access attempt`)
return NextResponse.json(
{
success: false,
error: {
message: authResult.error || 'Authentication required',
},
},
{ status: 401 }
)
}
logger.info(`[${requestId}] Processing memory search request`)
// Extract workflowId from query parameters
const url = new URL(request.url)
const workflowId = url.searchParams.get('workflowId')
const searchQuery = url.searchParams.get('query')
const type = url.searchParams.get('type')
const blockNameFilter = url.searchParams.get('blockName')
const limit = Number.parseInt(url.searchParams.get('limit') || '50')
// Require workflowId for security
if (!workflowId) {
logger.warn(`[${requestId}] Missing required parameter: workflowId`)
return NextResponse.json(
@@ -45,38 +76,148 @@ export async function GET(request: NextRequest) {
)
}
// Build query conditions
const conditions = []
// Only include non-deleted memories
conditions.push(isNull(memory.deletedAt))
// Filter by workflow ID (required)
conditions.push(eq(memory.workflowId, workflowId))
// Add type filter if provided
if (type) {
conditions.push(eq(memory.type, type))
const accessContext = await getWorkflowAccessContext(workflowId, authResult.userId)
if (!accessContext) {
logger.warn(`[${requestId}] Workflow ${workflowId} not found for user ${authResult.userId}`)
return NextResponse.json(
{
success: false,
error: {
message: 'Workflow not found',
},
},
{ status: 404 }
)
}
const { workspacePermission, isOwner } = accessContext
if (!isOwner && !workspacePermission) {
logger.warn(
`[${requestId}] User ${authResult.userId} denied access to workflow ${workflowId}`
)
return NextResponse.json(
{
success: false,
error: {
message: 'Access denied to this workflow',
},
},
{ status: 403 }
)
}
logger.info(
`[${requestId}] User ${authResult.userId} (${authResult.authType}) accessing memories for workflow ${workflowId}`
)
const conditions = []
conditions.push(isNull(memory.deletedAt))
conditions.push(eq(memory.workflowId, workflowId))
let blockIdsToFilter: string[] | null = null
if (blockNameFilter) {
const blocks = await db
.select({ id: workflowBlocks.id })
.from(workflowBlocks)
.where(
and(eq(workflowBlocks.workflowId, workflowId), eq(workflowBlocks.name, blockNameFilter))
)
if (blocks.length === 0) {
logger.info(
`[${requestId}] No blocks found with name "${blockNameFilter}" for workflow: ${workflowId}`
)
return NextResponse.json(
{
success: true,
data: { memories: [] },
},
{ status: 200 }
)
}
blockIdsToFilter = blocks.map((b) => b.id)
}
// Add search query if provided (leverages index on key field)
if (searchQuery) {
conditions.push(like(memory.key, `%${searchQuery}%`))
}
// Execute the query
const memories = await db
const rawMemories = await db
.select()
.from(memory)
.where(and(...conditions))
.orderBy(memory.createdAt)
.limit(limit)
logger.info(`[${requestId}] Found ${memories.length} memories for workflow: ${workflowId}`)
const filteredMemories = blockIdsToFilter
? rawMemories.filter((mem) => {
const parsed = parseMemoryKey(mem.key)
return parsed && blockIdsToFilter.includes(parsed.blockId)
})
: rawMemories
const blockIds = new Set<string>()
const parsedKeys = new Map<string, { conversationId: string; blockId: string }>()
for (const mem of filteredMemories) {
const parsed = parseMemoryKey(mem.key)
if (parsed) {
blockIds.add(parsed.blockId)
parsedKeys.set(mem.key, parsed)
}
}
const blockNameMap = new Map<string, string>()
if (blockIds.size > 0) {
const blocks = await db
.select({ id: workflowBlocks.id, name: workflowBlocks.name })
.from(workflowBlocks)
.where(
and(
eq(workflowBlocks.workflowId, workflowId),
inArray(workflowBlocks.id, Array.from(blockIds))
)
)
for (const block of blocks) {
blockNameMap.set(block.id, block.name)
}
}
const enrichedMemories = filteredMemories.map((mem) => {
const parsed = parsedKeys.get(mem.key)
if (!parsed) {
return {
conversationId: mem.key,
blockId: 'unknown',
blockName: 'unknown',
data: mem.data,
}
}
const { conversationId, blockId } = parsed
const blockName = blockNameMap.get(blockId) || 'unknown'
return {
conversationId,
blockId,
blockName,
data: mem.data,
}
})
logger.info(
`[${requestId}] Found ${enrichedMemories.length} memories for workflow: ${workflowId}`
)
return NextResponse.json(
{
success: true,
data: { memories },
data: { memories: enrichedMemories },
},
{ status: 200 }
)
@@ -105,13 +246,25 @@ export async function POST(request: NextRequest) {
const requestId = generateRequestId()
try {
const authResult = await checkHybridAuth(request)
if (!authResult.success || !authResult.userId) {
logger.warn(`[${requestId}] Unauthorized memory creation attempt`)
return NextResponse.json(
{
success: false,
error: {
message: authResult.error || 'Authentication required',
},
},
{ status: 401 }
)
}
logger.info(`[${requestId}] Processing memory creation request`)
// Parse request body
const body = await request.json()
const { key, type, data, workflowId } = body
const { key, data, workflowId } = body
// Validate required fields
if (!key) {
logger.warn(`[${requestId}] Missing required field: key`)
return NextResponse.json(
@@ -125,19 +278,6 @@ export async function POST(request: NextRequest) {
)
}
if (!type || type !== 'agent') {
logger.warn(`[${requestId}] Invalid memory type: ${type}`)
return NextResponse.json(
{
success: false,
error: {
message: 'Memory type must be "agent"',
},
},
{ status: 400 }
)
}
if (!data) {
logger.warn(`[${requestId}] Missing required field: data`)
return NextResponse.json(
@@ -164,28 +304,67 @@ export async function POST(request: NextRequest) {
)
}
// Additional validation for agent type
if (type === 'agent') {
if (!data.role || !data.content) {
logger.warn(`[${requestId}] Missing agent memory fields`)
const accessContext = await getWorkflowAccessContext(workflowId, authResult.userId)
if (!accessContext) {
logger.warn(`[${requestId}] Workflow ${workflowId} not found for user ${authResult.userId}`)
return NextResponse.json(
{
success: false,
error: {
message: 'Workflow not found',
},
},
{ status: 404 }
)
}
const { workspacePermission, isOwner } = accessContext
const hasWritePermission =
isOwner || workspacePermission === 'write' || workspacePermission === 'admin'
if (!hasWritePermission) {
logger.warn(
`[${requestId}] User ${authResult.userId} denied write access to workflow ${workflowId}`
)
return NextResponse.json(
{
success: false,
error: {
message: 'Write access denied to this workflow',
},
},
{ status: 403 }
)
}
logger.info(
`[${requestId}] User ${authResult.userId} (${authResult.authType}) creating memory for workflow ${workflowId}`
)
const dataToValidate = Array.isArray(data) ? data : [data]
for (const msg of dataToValidate) {
if (!msg || typeof msg !== 'object' || !msg.role || !msg.content) {
logger.warn(`[${requestId}] Missing required message fields`)
return NextResponse.json(
{
success: false,
error: {
message: 'Agent memory requires role and content',
message: 'Memory requires messages with role and content',
},
},
{ status: 400 }
)
}
if (!['user', 'assistant', 'system'].includes(data.role)) {
logger.warn(`[${requestId}] Invalid agent role: ${data.role}`)
if (!['user', 'assistant', 'system'].includes(msg.role)) {
logger.warn(`[${requestId}] Invalid message role: ${msg.role}`)
return NextResponse.json(
{
success: false,
error: {
message: 'Agent role must be user, assistant, or system',
message: 'Message role must be user, assistant, or system',
},
},
{ status: 400 }
@@ -193,77 +372,34 @@ export async function POST(request: NextRequest) {
}
}
// Check if memory with the same key already exists for this workflow
const existingMemory = await db
.select()
.from(memory)
.where(and(eq(memory.key, key), eq(memory.workflowId, workflowId), isNull(memory.deletedAt)))
.limit(1)
const initialData = Array.isArray(data) ? data : [data]
const now = new Date()
const id = `mem_${crypto.randomUUID().replace(/-/g, '')}`
let statusCode = 201 // Default status code for new memory
const { sql } = await import('drizzle-orm')
if (existingMemory.length > 0) {
logger.info(`[${requestId}] Memory with key ${key} exists, checking if we can append`)
// Check if types match
if (existingMemory[0].type !== type) {
logger.warn(
`[${requestId}] Memory type mismatch: existing=${existingMemory[0].type}, new=${type}`
)
return NextResponse.json(
{
success: false,
error: {
message: `Cannot append memory of type '${type}' to existing memory of type '${existingMemory[0].type}'`,
},
},
{ status: 400 }
)
}
// Handle appending for agent type
let updatedData
// For agent type
const newMessage = data
const existingData = existingMemory[0].data
// If existing data is an array, append to it
if (Array.isArray(existingData)) {
updatedData = [...existingData, newMessage]
}
// If existing data is a single message object, convert to array
else {
updatedData = [existingData, newMessage]
}
// Update the existing memory with appended data
await db
.update(memory)
.set({
data: updatedData,
updatedAt: new Date(),
})
.where(and(eq(memory.key, key), eq(memory.workflowId, workflowId)))
statusCode = 200 // Status code for updated memory
} else {
// Insert the new memory
const newMemory = {
id: `mem_${crypto.randomUUID().replace(/-/g, '')}`,
await db
.insert(memory)
.values({
id,
workflowId,
key,
type,
data: Array.isArray(data) ? data : [data],
createdAt: new Date(),
updatedAt: new Date(),
}
data: initialData,
createdAt: now,
updatedAt: now,
})
.onConflictDoUpdate({
target: [memory.workflowId, memory.key],
set: {
data: sql`${memory.data} || ${JSON.stringify(initialData)}::jsonb`,
updatedAt: now,
},
})
await db.insert(memory).values(newMemory)
logger.info(`[${requestId}] Memory created successfully: ${key} for workflow: ${workflowId}`)
}
logger.info(
`[${requestId}] Memory operation successful (atomic): ${key} for workflow: ${workflowId}`
)
// Fetch all memories with the same key for this workflow to return the complete list
const allMemories = await db
.select()
.from(memory)
@@ -271,7 +407,6 @@ export async function POST(request: NextRequest) {
.orderBy(memory.createdAt)
if (allMemories.length === 0) {
// This shouldn't happen but handle it just in case
logger.warn(`[${requestId}] No memories found after creating/updating memory: ${key}`)
return NextResponse.json(
{
@@ -284,19 +419,44 @@ export async function POST(request: NextRequest) {
)
}
// Get the memory object to return
const memoryRecord = allMemories[0]
const parsed = parseMemoryKey(memoryRecord.key)
let enrichedMemory
if (!parsed) {
enrichedMemory = {
conversationId: memoryRecord.key,
blockId: 'unknown',
blockName: 'unknown',
data: memoryRecord.data,
}
} else {
const { conversationId, blockId } = parsed
const blockName = await (async () => {
const blocks = await db
.select({ name: workflowBlocks.name })
.from(workflowBlocks)
.where(and(eq(workflowBlocks.id, blockId), eq(workflowBlocks.workflowId, workflowId)))
.limit(1)
return blocks.length > 0 ? blocks[0].name : 'unknown'
})()
enrichedMemory = {
conversationId,
blockId,
blockName,
data: memoryRecord.data,
}
}
logger.info(`[${requestId}] Memory operation successful: ${key} for workflow: ${workflowId}`)
return NextResponse.json(
{
success: true,
data: memoryRecord,
data: enrichedMemory,
},
{ status: statusCode }
{ status: 200 }
)
} catch (error: any) {
// Handle unique constraint violation
if (error.code === '23505') {
logger.warn(`[${requestId}] Duplicate key violation`)
return NextResponse.json(
@@ -321,3 +481,215 @@ export async function POST(request: NextRequest) {
)
}
}
/**
* DELETE handler for pattern-based memory deletion
* Supports query parameters:
* - workflowId: Required
* - conversationId: Optional - delete all memories for this conversation
* - blockId: Optional - delete all memories for this block
* - blockName: Optional - delete all memories for blocks with this name
*/
export async function DELETE(request: NextRequest) {
const requestId = generateRequestId()
try {
const authResult = await checkHybridAuth(request)
if (!authResult.success || !authResult.userId) {
logger.warn(`[${requestId}] Unauthorized memory deletion attempt`)
return NextResponse.json(
{
success: false,
error: {
message: authResult.error || 'Authentication required',
},
},
{ status: 401 }
)
}
logger.info(`[${requestId}] Processing memory deletion request`)
const url = new URL(request.url)
const workflowId = url.searchParams.get('workflowId')
const conversationId = url.searchParams.get('conversationId')
const blockId = url.searchParams.get('blockId')
const blockName = url.searchParams.get('blockName')
if (!workflowId) {
logger.warn(`[${requestId}] Missing required parameter: workflowId`)
return NextResponse.json(
{
success: false,
error: {
message: 'workflowId parameter is required',
},
},
{ status: 400 }
)
}
if (!conversationId && !blockId && !blockName) {
logger.warn(`[${requestId}] No filter parameters provided`)
return NextResponse.json(
{
success: false,
error: {
message: 'At least one of conversationId, blockId, or blockName must be provided',
},
},
{ status: 400 }
)
}
const accessContext = await getWorkflowAccessContext(workflowId, authResult.userId)
if (!accessContext) {
logger.warn(`[${requestId}] Workflow ${workflowId} not found for user ${authResult.userId}`)
return NextResponse.json(
{
success: false,
error: {
message: 'Workflow not found',
},
},
{ status: 404 }
)
}
const { workspacePermission, isOwner } = accessContext
const hasWritePermission =
isOwner || workspacePermission === 'write' || workspacePermission === 'admin'
if (!hasWritePermission) {
logger.warn(
`[${requestId}] User ${authResult.userId} denied delete access to workflow ${workflowId}`
)
return NextResponse.json(
{
success: false,
error: {
message: 'Write access denied to this workflow',
},
},
{ status: 403 }
)
}
logger.info(
`[${requestId}] User ${authResult.userId} (${authResult.authType}) deleting memories for workflow ${workflowId}`
)
let deletedCount = 0
if (conversationId && blockId) {
const key = `${conversationId}:${blockId}`
const result = await db
.delete(memory)
.where(and(eq(memory.key, key), eq(memory.workflowId, workflowId)))
.returning({ id: memory.id })
deletedCount = result.length
} else if (conversationId && blockName) {
const blocks = await db
.select({ id: workflowBlocks.id })
.from(workflowBlocks)
.where(and(eq(workflowBlocks.workflowId, workflowId), eq(workflowBlocks.name, blockName)))
if (blocks.length === 0) {
return NextResponse.json(
{
success: true,
data: {
message: `No blocks found with name "${blockName}"`,
deletedCount: 0,
},
},
{ status: 200 }
)
}
for (const block of blocks) {
const key = `${conversationId}:${block.id}`
const result = await db
.delete(memory)
.where(and(eq(memory.key, key), eq(memory.workflowId, workflowId)))
.returning({ id: memory.id })
deletedCount += result.length
}
} else if (conversationId) {
const pattern = `${conversationId}:%`
const result = await db
.delete(memory)
.where(and(like(memory.key, pattern), eq(memory.workflowId, workflowId)))
.returning({ id: memory.id })
deletedCount = result.length
} else if (blockId) {
const pattern = `%:${blockId}`
const result = await db
.delete(memory)
.where(and(like(memory.key, pattern), eq(memory.workflowId, workflowId)))
.returning({ id: memory.id })
deletedCount = result.length
} else if (blockName) {
const blocks = await db
.select({ id: workflowBlocks.id })
.from(workflowBlocks)
.where(and(eq(workflowBlocks.workflowId, workflowId), eq(workflowBlocks.name, blockName)))
if (blocks.length === 0) {
return NextResponse.json(
{
success: true,
data: {
message: `No blocks found with name "${blockName}"`,
deletedCount: 0,
},
},
{ status: 200 }
)
}
for (const block of blocks) {
const pattern = `%:${block.id}`
const result = await db
.delete(memory)
.where(and(like(memory.key, pattern), eq(memory.workflowId, workflowId)))
.returning({ id: memory.id })
deletedCount += result.length
}
}
logger.info(
`[${requestId}] Successfully deleted ${deletedCount} memories for workflow: ${workflowId}`
)
return NextResponse.json(
{
success: true,
data: {
message:
deletedCount > 0
? `Successfully deleted ${deletedCount} memories`
: 'No memories found matching the criteria',
deletedCount,
},
},
{ status: 200 }
)
} catch (error: any) {
logger.error(`[${requestId}] Error deleting memories`, { error })
return NextResponse.json(
{
success: false,
error: {
message: error.message || 'Failed to delete memories',
},
},
{ status: 500 }
)
}
}

View File

@@ -1,12 +1,49 @@
import { db } from '@sim/db'
import { member } from '@sim/db/schema'
import { eq } from 'drizzle-orm'
import { member, organization } from '@sim/db/schema'
import { and, eq, or } from 'drizzle-orm'
import { NextResponse } from 'next/server'
import { getSession } from '@/lib/auth'
import { createOrganizationForTeamPlan } from '@/lib/billing/organization'
import { createLogger } from '@/lib/logs/console/logger'
const logger = createLogger('CreateTeamOrganization')
const logger = createLogger('OrganizationsAPI')
export async function GET() {
try {
const session = await getSession()
if (!session?.user?.id) {
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
}
// Get organizations where user is owner or admin
const userOrganizations = await db
.select({
id: organization.id,
name: organization.name,
role: member.role,
})
.from(member)
.innerJoin(organization, eq(member.organizationId, organization.id))
.where(
and(
eq(member.userId, session.user.id),
or(eq(member.role, 'owner'), eq(member.role, 'admin'))
)
)
return NextResponse.json({
organizations: userOrganizations,
})
} catch (error) {
logger.error('Failed to fetch organizations', {
error: error instanceof Error ? error.message : 'Unknown error',
stack: error instanceof Error ? error.stack : undefined,
})
return NextResponse.json({ error: 'Internal server error' }, { status: 500 })
}
}
export async function POST(request: Request) {
try {

View File

@@ -0,0 +1,375 @@
import { type NextRequest, NextResponse } from 'next/server'
import { extractAudioFromVideo, isVideoFile } from '@/lib/audio/extractor'
import { checkHybridAuth } from '@/lib/auth/hybrid'
import { createLogger } from '@/lib/logs/console/logger'
import { downloadFileFromStorage } from '@/lib/uploads/utils/file-utils.server'
import type { UserFile } from '@/executor/types'
import type { TranscriptSegment } from '@/tools/stt/types'
const logger = createLogger('SttProxyAPI')
export const dynamic = 'force-dynamic'
export const maxDuration = 300 // 5 minutes for large files
interface SttRequestBody {
provider: 'whisper' | 'deepgram' | 'elevenlabs'
apiKey: string
model?: string
audioFile?: UserFile | UserFile[]
audioFileReference?: UserFile | UserFile[]
audioUrl?: string
language?: string
timestamps?: 'none' | 'sentence' | 'word'
diarization?: boolean
translateToEnglish?: boolean
workspaceId?: string
workflowId?: string
executionId?: string
}
export async function POST(request: NextRequest) {
const requestId = crypto.randomUUID()
logger.info(`[${requestId}] STT transcription request started`)
try {
const authResult = await checkHybridAuth(request, { requireWorkflowId: false })
if (!authResult.success) {
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
}
const body: SttRequestBody = await request.json()
const { provider, apiKey, model, language, timestamps, diarization, translateToEnglish } = body
if (!provider || !apiKey) {
return NextResponse.json(
{ error: 'Missing required fields: provider and apiKey' },
{ status: 400 }
)
}
let audioBuffer: Buffer
let audioFileName: string
let audioMimeType: string
if (body.audioFile) {
const file = Array.isArray(body.audioFile) ? body.audioFile[0] : body.audioFile
logger.info(`[${requestId}] Processing uploaded file: ${file.name}`)
audioBuffer = await downloadFileFromStorage(file, requestId, logger)
audioFileName = file.name
audioMimeType = file.type
} else if (body.audioFileReference) {
const file = Array.isArray(body.audioFileReference)
? body.audioFileReference[0]
: body.audioFileReference
logger.info(`[${requestId}] Processing referenced file: ${file.name}`)
audioBuffer = await downloadFileFromStorage(file, requestId, logger)
audioFileName = file.name
audioMimeType = file.type
} else if (body.audioUrl) {
logger.info(`[${requestId}] Downloading from URL: ${body.audioUrl}`)
const response = await fetch(body.audioUrl)
if (!response.ok) {
throw new Error(`Failed to download audio from URL: ${response.statusText}`)
}
const arrayBuffer = await response.arrayBuffer()
audioBuffer = Buffer.from(arrayBuffer)
audioFileName = body.audioUrl.split('/').pop() || 'audio_file'
audioMimeType = response.headers.get('content-type') || 'audio/mpeg'
} else {
return NextResponse.json(
{ error: 'No audio source provided. Provide audioFile, audioFileReference, or audioUrl' },
{ status: 400 }
)
}
if (isVideoFile(audioMimeType)) {
logger.info(`[${requestId}] Extracting audio from video file`)
try {
const extracted = await extractAudioFromVideo(audioBuffer, audioMimeType, {
outputFormat: 'mp3',
sampleRate: 16000,
channels: 1,
})
audioBuffer = extracted.buffer
audioMimeType = 'audio/mpeg'
audioFileName = audioFileName.replace(/\.[^.]+$/, '.mp3')
} catch (error) {
logger.error(`[${requestId}] Video extraction failed:`, error)
return NextResponse.json(
{
error: `Failed to extract audio from video: ${error instanceof Error ? error.message : 'Unknown error'}`,
},
{ status: 500 }
)
}
}
logger.info(`[${requestId}] Transcribing with ${provider}, file: ${audioFileName}`)
let transcript: string
let segments: TranscriptSegment[] | undefined
let detectedLanguage: string | undefined
let duration: number | undefined
let confidence: number | undefined
try {
if (provider === 'whisper') {
const result = await transcribeWithWhisper(
audioBuffer,
apiKey,
language,
timestamps,
translateToEnglish,
model
)
transcript = result.transcript
segments = result.segments
detectedLanguage = result.language
duration = result.duration
} else if (provider === 'deepgram') {
const result = await transcribeWithDeepgram(
audioBuffer,
apiKey,
language,
timestamps,
diarization,
model
)
transcript = result.transcript
segments = result.segments
detectedLanguage = result.language
duration = result.duration
confidence = result.confidence
} else if (provider === 'elevenlabs') {
const result = await transcribeWithElevenLabs(
audioBuffer,
apiKey,
language,
timestamps,
model
)
transcript = result.transcript
segments = result.segments
detectedLanguage = result.language
duration = result.duration
} else {
return NextResponse.json({ error: `Unknown provider: ${provider}` }, { status: 400 })
}
} catch (error) {
logger.error(`[${requestId}] Transcription failed:`, error)
const errorMessage = error instanceof Error ? error.message : 'Transcription failed'
return NextResponse.json({ error: errorMessage }, { status: 500 })
}
logger.info(`[${requestId}] Transcription completed successfully`)
return NextResponse.json({
transcript,
segments,
language: detectedLanguage,
duration,
confidence,
})
} catch (error) {
logger.error(`[${requestId}] STT proxy error:`, error)
const errorMessage = error instanceof Error ? error.message : 'Unknown error'
return NextResponse.json({ error: errorMessage }, { status: 500 })
}
}
async function transcribeWithWhisper(
audioBuffer: Buffer,
apiKey: string,
language?: string,
timestamps?: 'none' | 'sentence' | 'word',
translate?: boolean,
model?: string
): Promise<{
transcript: string
segments?: TranscriptSegment[]
language?: string
duration?: number
}> {
const formData = new FormData()
const blob = new Blob([new Uint8Array(audioBuffer)], { type: 'audio/mpeg' })
formData.append('file', blob, 'audio.mp3')
formData.append('model', model || 'whisper-1')
if (language && language !== 'auto') {
formData.append('language', language)
}
if (timestamps === 'word') {
formData.append('response_format', 'verbose_json')
formData.append('timestamp_granularities[]', 'word')
} else if (timestamps === 'sentence') {
formData.append('response_format', 'verbose_json')
formData.append('timestamp_granularities[]', 'segment')
}
const endpoint = translate ? 'translations' : 'transcriptions'
const response = await fetch(`https://api.openai.com/v1/audio/${endpoint}`, {
method: 'POST',
headers: {
Authorization: `Bearer ${apiKey}`,
},
body: formData,
})
if (!response.ok) {
const error = await response.json()
const errorMessage = error.error?.message || error.message || JSON.stringify(error)
throw new Error(`Whisper API error: ${errorMessage}`)
}
const data = await response.json()
if (timestamps === 'none') {
return {
transcript: data.text,
language: data.language,
}
}
const segments: TranscriptSegment[] = (data.segments || data.words || []).map((seg: any) => ({
text: seg.text,
start: seg.start,
end: seg.end,
}))
return {
transcript: data.text,
segments,
language: data.language,
duration: data.duration,
}
}
async function transcribeWithDeepgram(
audioBuffer: Buffer,
apiKey: string,
language?: string,
timestamps?: 'none' | 'sentence' | 'word',
diarization?: boolean,
model?: string
): Promise<{
transcript: string
segments?: TranscriptSegment[]
language?: string
duration?: number
confidence?: number
}> {
const params = new URLSearchParams({
model: model || 'nova-3',
smart_format: 'true',
punctuate: 'true',
})
if (language && language !== 'auto') {
params.append('language', language)
}
if (timestamps !== 'none') {
params.append('utterances', 'true')
}
if (diarization) {
params.append('diarize', 'true')
}
const response = await fetch(`https://api.deepgram.com/v1/listen?${params.toString()}`, {
method: 'POST',
headers: {
Authorization: `Token ${apiKey}`,
'Content-Type': 'audio/mpeg',
},
body: new Uint8Array(audioBuffer),
})
if (!response.ok) {
const error = await response.json()
const errorMessage = error.err_msg || error.message || JSON.stringify(error)
throw new Error(`Deepgram API error: ${errorMessage}`)
}
const data = await response.json()
const result = data.results?.channels?.[0]?.alternatives?.[0]
if (!result) {
throw new Error('No transcription result from Deepgram')
}
const transcript = result.transcript
const detectedLanguage = data.results?.channels?.[0]?.detected_language
const confidence = result.confidence
let segments: TranscriptSegment[] | undefined
if (timestamps !== 'none' && result.words) {
segments = result.words.map((word: any) => ({
text: word.word,
start: word.start,
end: word.end,
speaker: word.speaker !== undefined ? `Speaker ${word.speaker}` : undefined,
confidence: word.confidence,
}))
}
return {
transcript,
segments,
language: detectedLanguage,
duration: data.metadata?.duration,
confidence,
}
}
async function transcribeWithElevenLabs(
audioBuffer: Buffer,
apiKey: string,
language?: string,
timestamps?: 'none' | 'sentence' | 'word',
model?: string
): Promise<{
transcript: string
segments?: TranscriptSegment[]
language?: string
duration?: number
}> {
const formData = new FormData()
const blob = new Blob([new Uint8Array(audioBuffer)], { type: 'audio/mpeg' })
formData.append('file', blob, 'audio.mp3')
formData.append('model_id', model || 'scribe_v1')
if (language && language !== 'auto') {
formData.append('language', language)
}
const response = await fetch('https://api.elevenlabs.io/v1/speech-to-text', {
method: 'POST',
headers: {
'xi-api-key': apiKey,
},
body: formData,
})
if (!response.ok) {
const error = await response.json()
const errorMessage =
typeof error.detail === 'string'
? error.detail
: error.detail?.message || error.message || JSON.stringify(error)
throw new Error(`ElevenLabs API error: ${errorMessage}`)
}
const data = await response.json()
return {
transcript: data.text || '',
language: data.language,
duration: data.duration,
}
}

View File

@@ -70,6 +70,7 @@ describe('Custom Tools API Routes', () => {
const mockSelect = vi.fn()
const mockFrom = vi.fn()
const mockWhere = vi.fn()
const mockOrderBy = vi.fn()
const mockInsert = vi.fn()
const mockValues = vi.fn()
const mockUpdate = vi.fn()
@@ -84,10 +85,23 @@ describe('Custom Tools API Routes', () => {
// Reset all mock implementations
mockSelect.mockReturnValue({ from: mockFrom })
mockFrom.mockReturnValue({ where: mockWhere })
// where() can be called with limit() or directly awaited
// Create a mock query builder that supports both patterns
// where() can be called with orderBy(), limit(), or directly awaited
// Create a mock query builder that supports all patterns
mockWhere.mockImplementation((condition) => {
// Return an object that is both awaitable and has a limit() method
// Return an object that is both awaitable and has orderBy() and limit() methods
const queryBuilder = {
orderBy: mockOrderBy,
limit: mockLimit,
then: (resolve: (value: typeof sampleTools) => void) => {
resolve(sampleTools)
return queryBuilder
},
catch: (reject: (error: Error) => void) => queryBuilder,
}
return queryBuilder
})
mockOrderBy.mockImplementation(() => {
// orderBy returns an awaitable query builder
const queryBuilder = {
limit: mockLimit,
then: (resolve: (value: typeof sampleTools) => void) => {
@@ -120,9 +134,22 @@ describe('Custom Tools API Routes', () => {
const txMockUpdate = vi.fn().mockReturnValue({ set: mockSet })
const txMockDelete = vi.fn().mockReturnValue({ where: mockWhere })
// Transaction where() should also support the query builder pattern
// Transaction where() should also support the query builder pattern with orderBy
const txMockOrderBy = vi.fn().mockImplementation(() => {
const queryBuilder = {
limit: mockLimit,
then: (resolve: (value: typeof sampleTools) => void) => {
resolve(sampleTools)
return queryBuilder
},
catch: (reject: (error: Error) => void) => queryBuilder,
}
return queryBuilder
})
const txMockWhere = vi.fn().mockImplementation((condition) => {
const queryBuilder = {
orderBy: txMockOrderBy,
limit: mockLimit,
then: (resolve: (value: typeof sampleTools) => void) => {
resolve(sampleTools)
@@ -201,6 +228,7 @@ describe('Custom Tools API Routes', () => {
or: vi.fn().mockImplementation((...conditions) => ({ operator: 'or', conditions })),
isNull: vi.fn().mockImplementation((field) => ({ field, operator: 'isNull' })),
ne: vi.fn().mockImplementation((field, value) => ({ field, value, operator: 'ne' })),
desc: vi.fn().mockImplementation((field) => ({ field, operator: 'desc' })),
}
})
@@ -208,6 +236,11 @@ describe('Custom Tools API Routes', () => {
vi.doMock('@/lib/utils', () => ({
generateRequestId: vi.fn().mockReturnValue('test-request-id'),
}))
// Mock custom tools operations
vi.doMock('@/lib/custom-tools/operations', () => ({
upsertCustomTools: vi.fn().mockResolvedValue(sampleTools),
}))
})
afterEach(() => {
@@ -224,8 +257,10 @@ describe('Custom Tools API Routes', () => {
'http://localhost:3000/api/tools/custom?workspaceId=workspace-123'
)
// Simulate DB returning tools
mockWhere.mockReturnValueOnce(Promise.resolve(sampleTools))
// Simulate DB returning tools with orderBy chain
mockWhere.mockReturnValueOnce({
orderBy: mockOrderBy.mockReturnValueOnce(Promise.resolve(sampleTools)),
})
// Import handler after mocks are set up
const { GET } = await import('@/app/api/tools/custom/route')
@@ -243,6 +278,7 @@ describe('Custom Tools API Routes', () => {
expect(mockSelect).toHaveBeenCalled()
expect(mockFrom).toHaveBeenCalled()
expect(mockWhere).toHaveBeenCalled()
expect(mockOrderBy).toHaveBeenCalled()
})
it('should handle unauthorized access', async () => {

View File

@@ -1,9 +1,10 @@
import { db } from '@sim/db'
import { customTools, workflow } from '@sim/db/schema'
import { and, eq, isNull, ne, or } from 'drizzle-orm'
import { and, desc, eq, isNull, or } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod'
import { checkHybridAuth } from '@/lib/auth/hybrid'
import { upsertCustomTools } from '@/lib/custom-tools/operations'
import { createLogger } from '@/lib/logs/console/logger'
import { getUserEntityPermissions } from '@/lib/permissions/utils'
import { generateRequestId } from '@/lib/utils'
@@ -101,6 +102,7 @@ export async function GET(request: NextRequest) {
.select()
.from(customTools)
.where(or(...conditions))
.orderBy(desc(customTools.createdAt))
return NextResponse.json({ data: result }, { status: 200 })
} catch (error) {
@@ -150,96 +152,15 @@ export async function POST(req: NextRequest) {
return NextResponse.json({ error: 'Write permission required' }, { status: 403 })
}
// Use a transaction for multi-step database operations
return await db.transaction(async (tx) => {
// Process each tool: either update existing or create new
for (const tool of tools) {
const nowTime = new Date()
if (tool.id) {
// Check if tool exists and belongs to the workspace
const existingTool = await tx
.select()
.from(customTools)
.where(and(eq(customTools.id, tool.id), eq(customTools.workspaceId, workspaceId)))
.limit(1)
if (existingTool.length > 0) {
// Tool exists - check if name changed and if new name conflicts
if (existingTool[0].title !== tool.title) {
// Check for duplicate name in workspace (excluding current tool)
const duplicateTool = await tx
.select()
.from(customTools)
.where(
and(
eq(customTools.workspaceId, workspaceId),
eq(customTools.title, tool.title),
ne(customTools.id, tool.id)
)
)
.limit(1)
if (duplicateTool.length > 0) {
return NextResponse.json(
{
error: `A tool with the name "${tool.title}" already exists in this workspace`,
},
{ status: 400 }
)
}
}
// Update existing tool
await tx
.update(customTools)
.set({
title: tool.title,
schema: tool.schema,
code: tool.code,
updatedAt: nowTime,
})
.where(and(eq(customTools.id, tool.id), eq(customTools.workspaceId, workspaceId)))
continue
}
}
// Creating new tool - check for duplicate names in workspace
const duplicateTool = await tx
.select()
.from(customTools)
.where(and(eq(customTools.workspaceId, workspaceId), eq(customTools.title, tool.title)))
.limit(1)
if (duplicateTool.length > 0) {
return NextResponse.json(
{ error: `A tool with the name "${tool.title}" already exists in this workspace` },
{ status: 400 }
)
}
// Create new tool
const newToolId = tool.id || crypto.randomUUID()
await tx.insert(customTools).values({
id: newToolId,
workspaceId,
userId,
title: tool.title,
schema: tool.schema,
code: tool.code,
createdAt: nowTime,
updatedAt: nowTime,
})
}
// Fetch and return the created/updated tools
const resultTools = await tx
.select()
.from(customTools)
.where(eq(customTools.workspaceId, workspaceId))
return NextResponse.json({ success: true, data: resultTools })
// Use the extracted upsert function
const resultTools = await upsertCustomTools({
tools,
workspaceId,
userId,
requestId,
})
return NextResponse.json({ success: true, data: resultTools })
} catch (validationError) {
if (validationError instanceof z.ZodError) {
logger.warn(`[${requestId}] Invalid custom tools data`, {

View File

@@ -0,0 +1,118 @@
import { randomUUID } from 'crypto'
import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod'
import { createLogger } from '@/lib/logs/console/logger'
import {
convertNeo4jTypesToJSON,
createNeo4jDriver,
validateCypherQuery,
} from '@/app/api/tools/neo4j/utils'
const logger = createLogger('Neo4jCreateAPI')
const CreateSchema = z.object({
host: z.string().min(1, 'Host is required'),
port: z.coerce.number().int().positive('Port must be a positive integer'),
database: z.string().min(1, 'Database name is required'),
username: z.string().min(1, 'Username is required'),
password: z.string().min(1, 'Password is required'),
encryption: z.enum(['enabled', 'disabled']).default('disabled'),
cypherQuery: z.string().min(1, 'Cypher query is required'),
parameters: z.record(z.unknown()).nullable().optional().default({}),
})
export async function POST(request: NextRequest) {
const requestId = randomUUID().slice(0, 8)
let driver = null
let session = null
try {
const body = await request.json()
const params = CreateSchema.parse(body)
logger.info(
`[${requestId}] Executing Neo4j create on ${params.host}:${params.port}/${params.database}`
)
const validation = validateCypherQuery(params.cypherQuery)
if (!validation.isValid) {
logger.warn(`[${requestId}] Cypher query validation failed: ${validation.error}`)
return NextResponse.json(
{ error: `Query validation failed: ${validation.error}` },
{ status: 400 }
)
}
driver = await createNeo4jDriver({
host: params.host,
port: params.port,
database: params.database,
username: params.username,
password: params.password,
encryption: params.encryption,
})
session = driver.session({ database: params.database })
const result = await session.run(params.cypherQuery, params.parameters)
const records = result.records.map((record) => {
const obj: Record<string, unknown> = {}
record.keys.forEach((key) => {
if (typeof key === 'string') {
obj[key] = convertNeo4jTypesToJSON(record.get(key))
}
})
return obj
})
const summary = {
resultAvailableAfter: result.summary.resultAvailableAfter.toNumber(),
resultConsumedAfter: result.summary.resultConsumedAfter.toNumber(),
counters: {
nodesCreated: result.summary.counters.updates().nodesCreated,
nodesDeleted: result.summary.counters.updates().nodesDeleted,
relationshipsCreated: result.summary.counters.updates().relationshipsCreated,
relationshipsDeleted: result.summary.counters.updates().relationshipsDeleted,
propertiesSet: result.summary.counters.updates().propertiesSet,
labelsAdded: result.summary.counters.updates().labelsAdded,
labelsRemoved: result.summary.counters.updates().labelsRemoved,
indexesAdded: result.summary.counters.updates().indexesAdded,
indexesRemoved: result.summary.counters.updates().indexesRemoved,
constraintsAdded: result.summary.counters.updates().constraintsAdded,
constraintsRemoved: result.summary.counters.updates().constraintsRemoved,
},
}
logger.info(
`[${requestId}] Create executed successfully, created ${summary.counters.nodesCreated} nodes and ${summary.counters.relationshipsCreated} relationships, returned ${records.length} records`
)
return NextResponse.json({
message: `Created ${summary.counters.nodesCreated} nodes and ${summary.counters.relationshipsCreated} relationships`,
records,
recordCount: records.length,
summary,
})
} catch (error) {
if (error instanceof z.ZodError) {
logger.warn(`[${requestId}] Invalid request data`, { errors: error.errors })
return NextResponse.json(
{ error: 'Invalid request data', details: error.errors },
{ status: 400 }
)
}
const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred'
logger.error(`[${requestId}] Neo4j create failed:`, error)
return NextResponse.json({ error: `Neo4j create failed: ${errorMessage}` }, { status: 500 })
} finally {
if (session) {
await session.close()
}
if (driver) {
await driver.close()
}
}
}

View File

@@ -0,0 +1,103 @@
import { randomUUID } from 'crypto'
import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod'
import { createLogger } from '@/lib/logs/console/logger'
import { createNeo4jDriver, validateCypherQuery } from '@/app/api/tools/neo4j/utils'
const logger = createLogger('Neo4jDeleteAPI')
const DeleteSchema = z.object({
host: z.string().min(1, 'Host is required'),
port: z.coerce.number().int().positive('Port must be a positive integer'),
database: z.string().min(1, 'Database name is required'),
username: z.string().min(1, 'Username is required'),
password: z.string().min(1, 'Password is required'),
encryption: z.enum(['enabled', 'disabled']).default('disabled'),
cypherQuery: z.string().min(1, 'Cypher query is required'),
parameters: z.record(z.unknown()).nullable().optional().default({}),
detach: z.boolean().optional().default(false),
})
export async function POST(request: NextRequest) {
const requestId = randomUUID().slice(0, 8)
let driver = null
let session = null
try {
const body = await request.json()
const params = DeleteSchema.parse(body)
logger.info(
`[${requestId}] Executing Neo4j delete on ${params.host}:${params.port}/${params.database}`
)
const validation = validateCypherQuery(params.cypherQuery)
if (!validation.isValid) {
logger.warn(`[${requestId}] Cypher query validation failed: ${validation.error}`)
return NextResponse.json(
{ error: `Query validation failed: ${validation.error}` },
{ status: 400 }
)
}
driver = await createNeo4jDriver({
host: params.host,
port: params.port,
database: params.database,
username: params.username,
password: params.password,
encryption: params.encryption,
})
session = driver.session({ database: params.database })
const result = await session.run(params.cypherQuery, params.parameters)
const summary = {
resultAvailableAfter: result.summary.resultAvailableAfter.toNumber(),
resultConsumedAfter: result.summary.resultConsumedAfter.toNumber(),
counters: {
nodesCreated: result.summary.counters.updates().nodesCreated,
nodesDeleted: result.summary.counters.updates().nodesDeleted,
relationshipsCreated: result.summary.counters.updates().relationshipsCreated,
relationshipsDeleted: result.summary.counters.updates().relationshipsDeleted,
propertiesSet: result.summary.counters.updates().propertiesSet,
labelsAdded: result.summary.counters.updates().labelsAdded,
labelsRemoved: result.summary.counters.updates().labelsRemoved,
indexesAdded: result.summary.counters.updates().indexesAdded,
indexesRemoved: result.summary.counters.updates().indexesRemoved,
constraintsAdded: result.summary.counters.updates().constraintsAdded,
constraintsRemoved: result.summary.counters.updates().constraintsRemoved,
},
}
logger.info(
`[${requestId}] Delete executed successfully, deleted ${summary.counters.nodesDeleted} nodes and ${summary.counters.relationshipsDeleted} relationships`
)
return NextResponse.json({
message: `Deleted ${summary.counters.nodesDeleted} nodes and ${summary.counters.relationshipsDeleted} relationships`,
summary,
})
} catch (error) {
if (error instanceof z.ZodError) {
logger.warn(`[${requestId}] Invalid request data`, { errors: error.errors })
return NextResponse.json(
{ error: 'Invalid request data', details: error.errors },
{ status: 400 }
)
}
const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred'
logger.error(`[${requestId}] Neo4j delete failed:`, error)
return NextResponse.json({ error: `Neo4j delete failed: ${errorMessage}` }, { status: 500 })
} finally {
if (session) {
await session.close()
}
if (driver) {
await driver.close()
}
}
}

View File

@@ -0,0 +1,116 @@
import { randomUUID } from 'crypto'
import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod'
import { createLogger } from '@/lib/logs/console/logger'
import {
convertNeo4jTypesToJSON,
createNeo4jDriver,
validateCypherQuery,
} from '@/app/api/tools/neo4j/utils'
const logger = createLogger('Neo4jExecuteAPI')
const ExecuteSchema = z.object({
host: z.string().min(1, 'Host is required'),
port: z.coerce.number().int().positive('Port must be a positive integer'),
database: z.string().min(1, 'Database name is required'),
username: z.string().min(1, 'Username is required'),
password: z.string().min(1, 'Password is required'),
encryption: z.enum(['enabled', 'disabled']).default('disabled'),
cypherQuery: z.string().min(1, 'Cypher query is required'),
parameters: z.record(z.unknown()).nullable().optional().default({}),
})
export async function POST(request: NextRequest) {
const requestId = randomUUID().slice(0, 8)
let driver = null
let session = null
try {
const body = await request.json()
const params = ExecuteSchema.parse(body)
logger.info(
`[${requestId}] Executing Neo4j query on ${params.host}:${params.port}/${params.database}`
)
const validation = validateCypherQuery(params.cypherQuery)
if (!validation.isValid) {
logger.warn(`[${requestId}] Cypher query validation failed: ${validation.error}`)
return NextResponse.json(
{ error: `Query validation failed: ${validation.error}` },
{ status: 400 }
)
}
driver = await createNeo4jDriver({
host: params.host,
port: params.port,
database: params.database,
username: params.username,
password: params.password,
encryption: params.encryption,
})
session = driver.session({ database: params.database })
const result = await session.run(params.cypherQuery, params.parameters)
const records = result.records.map((record) => {
const obj: Record<string, unknown> = {}
record.keys.forEach((key) => {
if (typeof key === 'string') {
obj[key] = convertNeo4jTypesToJSON(record.get(key))
}
})
return obj
})
const summary = {
resultAvailableAfter: result.summary.resultAvailableAfter.toNumber(),
resultConsumedAfter: result.summary.resultConsumedAfter.toNumber(),
counters: {
nodesCreated: result.summary.counters.updates().nodesCreated,
nodesDeleted: result.summary.counters.updates().nodesDeleted,
relationshipsCreated: result.summary.counters.updates().relationshipsCreated,
relationshipsDeleted: result.summary.counters.updates().relationshipsDeleted,
propertiesSet: result.summary.counters.updates().propertiesSet,
labelsAdded: result.summary.counters.updates().labelsAdded,
labelsRemoved: result.summary.counters.updates().labelsRemoved,
indexesAdded: result.summary.counters.updates().indexesAdded,
indexesRemoved: result.summary.counters.updates().indexesRemoved,
constraintsAdded: result.summary.counters.updates().constraintsAdded,
constraintsRemoved: result.summary.counters.updates().constraintsRemoved,
},
}
logger.info(`[${requestId}] Query executed successfully, returned ${records.length} records`)
return NextResponse.json({
message: `Query executed successfully, returned ${records.length} records`,
records,
recordCount: records.length,
summary,
})
} catch (error) {
if (error instanceof z.ZodError) {
logger.warn(`[${requestId}] Invalid request data`, { errors: error.errors })
return NextResponse.json(
{ error: 'Invalid request data', details: error.errors },
{ status: 400 }
)
}
const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred'
logger.error(`[${requestId}] Neo4j execute failed:`, error)
return NextResponse.json({ error: `Neo4j execute failed: ${errorMessage}` }, { status: 500 })
} finally {
if (session) {
await session.close()
}
if (driver) {
await driver.close()
}
}
}

View File

@@ -0,0 +1,118 @@
import { randomUUID } from 'crypto'
import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod'
import { createLogger } from '@/lib/logs/console/logger'
import {
convertNeo4jTypesToJSON,
createNeo4jDriver,
validateCypherQuery,
} from '@/app/api/tools/neo4j/utils'
const logger = createLogger('Neo4jMergeAPI')
const MergeSchema = z.object({
host: z.string().min(1, 'Host is required'),
port: z.coerce.number().int().positive('Port must be a positive integer'),
database: z.string().min(1, 'Database name is required'),
username: z.string().min(1, 'Username is required'),
password: z.string().min(1, 'Password is required'),
encryption: z.enum(['enabled', 'disabled']).default('disabled'),
cypherQuery: z.string().min(1, 'Cypher query is required'),
parameters: z.record(z.unknown()).nullable().optional().default({}),
})
export async function POST(request: NextRequest) {
const requestId = randomUUID().slice(0, 8)
let driver = null
let session = null
try {
const body = await request.json()
const params = MergeSchema.parse(body)
logger.info(
`[${requestId}] Executing Neo4j merge on ${params.host}:${params.port}/${params.database}`
)
const validation = validateCypherQuery(params.cypherQuery)
if (!validation.isValid) {
logger.warn(`[${requestId}] Cypher query validation failed: ${validation.error}`)
return NextResponse.json(
{ error: `Query validation failed: ${validation.error}` },
{ status: 400 }
)
}
driver = await createNeo4jDriver({
host: params.host,
port: params.port,
database: params.database,
username: params.username,
password: params.password,
encryption: params.encryption,
})
session = driver.session({ database: params.database })
const result = await session.run(params.cypherQuery, params.parameters)
const records = result.records.map((record) => {
const obj: Record<string, unknown> = {}
record.keys.forEach((key) => {
if (typeof key === 'string') {
obj[key] = convertNeo4jTypesToJSON(record.get(key))
}
})
return obj
})
const summary = {
resultAvailableAfter: result.summary.resultAvailableAfter.toNumber(),
resultConsumedAfter: result.summary.resultConsumedAfter.toNumber(),
counters: {
nodesCreated: result.summary.counters.updates().nodesCreated,
nodesDeleted: result.summary.counters.updates().nodesDeleted,
relationshipsCreated: result.summary.counters.updates().relationshipsCreated,
relationshipsDeleted: result.summary.counters.updates().relationshipsDeleted,
propertiesSet: result.summary.counters.updates().propertiesSet,
labelsAdded: result.summary.counters.updates().labelsAdded,
labelsRemoved: result.summary.counters.updates().labelsRemoved,
indexesAdded: result.summary.counters.updates().indexesAdded,
indexesRemoved: result.summary.counters.updates().indexesRemoved,
constraintsAdded: result.summary.counters.updates().constraintsAdded,
constraintsRemoved: result.summary.counters.updates().constraintsRemoved,
},
}
logger.info(
`[${requestId}] Merge executed successfully, created ${summary.counters.nodesCreated} nodes, ${summary.counters.relationshipsCreated} relationships, returned ${records.length} records`
)
return NextResponse.json({
message: `Merge completed: ${summary.counters.nodesCreated} nodes created, ${summary.counters.relationshipsCreated} relationships created`,
records,
recordCount: records.length,
summary,
})
} catch (error) {
if (error instanceof z.ZodError) {
logger.warn(`[${requestId}] Invalid request data`, { errors: error.errors })
return NextResponse.json(
{ error: 'Invalid request data', details: error.errors },
{ status: 400 }
)
}
const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred'
logger.error(`[${requestId}] Neo4j merge failed:`, error)
return NextResponse.json({ error: `Neo4j merge failed: ${errorMessage}` }, { status: 500 })
} finally {
if (session) {
await session.close()
}
if (driver) {
await driver.close()
}
}
}

View File

@@ -0,0 +1,116 @@
import { randomUUID } from 'crypto'
import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod'
import { createLogger } from '@/lib/logs/console/logger'
import {
convertNeo4jTypesToJSON,
createNeo4jDriver,
validateCypherQuery,
} from '@/app/api/tools/neo4j/utils'
const logger = createLogger('Neo4jQueryAPI')
const QuerySchema = z.object({
host: z.string().min(1, 'Host is required'),
port: z.coerce.number().int().positive('Port must be a positive integer'),
database: z.string().min(1, 'Database name is required'),
username: z.string().min(1, 'Username is required'),
password: z.string().min(1, 'Password is required'),
encryption: z.enum(['enabled', 'disabled']).default('disabled'),
cypherQuery: z.string().min(1, 'Cypher query is required'),
parameters: z.record(z.unknown()).nullable().optional().default({}),
})
export async function POST(request: NextRequest) {
const requestId = randomUUID().slice(0, 8)
let driver = null
let session = null
try {
const body = await request.json()
const params = QuerySchema.parse(body)
logger.info(
`[${requestId}] Executing Neo4j query on ${params.host}:${params.port}/${params.database}`
)
const validation = validateCypherQuery(params.cypherQuery)
if (!validation.isValid) {
logger.warn(`[${requestId}] Cypher query validation failed: ${validation.error}`)
return NextResponse.json(
{ error: `Query validation failed: ${validation.error}` },
{ status: 400 }
)
}
driver = await createNeo4jDriver({
host: params.host,
port: params.port,
database: params.database,
username: params.username,
password: params.password,
encryption: params.encryption,
})
session = driver.session({ database: params.database })
const result = await session.run(params.cypherQuery, params.parameters)
const records = result.records.map((record) => {
const obj: Record<string, unknown> = {}
record.keys.forEach((key) => {
if (typeof key === 'string') {
obj[key] = convertNeo4jTypesToJSON(record.get(key))
}
})
return obj
})
const summary = {
resultAvailableAfter: result.summary.resultAvailableAfter.toNumber(),
resultConsumedAfter: result.summary.resultConsumedAfter.toNumber(),
counters: {
nodesCreated: result.summary.counters.updates().nodesCreated,
nodesDeleted: result.summary.counters.updates().nodesDeleted,
relationshipsCreated: result.summary.counters.updates().relationshipsCreated,
relationshipsDeleted: result.summary.counters.updates().relationshipsDeleted,
propertiesSet: result.summary.counters.updates().propertiesSet,
labelsAdded: result.summary.counters.updates().labelsAdded,
labelsRemoved: result.summary.counters.updates().labelsRemoved,
indexesAdded: result.summary.counters.updates().indexesAdded,
indexesRemoved: result.summary.counters.updates().indexesRemoved,
constraintsAdded: result.summary.counters.updates().constraintsAdded,
constraintsRemoved: result.summary.counters.updates().constraintsRemoved,
},
}
logger.info(`[${requestId}] Query executed successfully, returned ${records.length} records`)
return NextResponse.json({
message: `Found ${records.length} records`,
records,
recordCount: records.length,
summary,
})
} catch (error) {
if (error instanceof z.ZodError) {
logger.warn(`[${requestId}] Invalid request data`, { errors: error.errors })
return NextResponse.json(
{ error: 'Invalid request data', details: error.errors },
{ status: 400 }
)
}
const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred'
logger.error(`[${requestId}] Neo4j query failed:`, error)
return NextResponse.json({ error: `Neo4j query failed: ${errorMessage}` }, { status: 500 })
} finally {
if (session) {
await session.close()
}
if (driver) {
await driver.close()
}
}
}

View File

@@ -0,0 +1,118 @@
import { randomUUID } from 'crypto'
import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod'
import { createLogger } from '@/lib/logs/console/logger'
import {
convertNeo4jTypesToJSON,
createNeo4jDriver,
validateCypherQuery,
} from '@/app/api/tools/neo4j/utils'
const logger = createLogger('Neo4jUpdateAPI')
const UpdateSchema = z.object({
host: z.string().min(1, 'Host is required'),
port: z.coerce.number().int().positive('Port must be a positive integer'),
database: z.string().min(1, 'Database name is required'),
username: z.string().min(1, 'Username is required'),
password: z.string().min(1, 'Password is required'),
encryption: z.enum(['enabled', 'disabled']).default('disabled'),
cypherQuery: z.string().min(1, 'Cypher query is required'),
parameters: z.record(z.unknown()).nullable().optional().default({}),
})
export async function POST(request: NextRequest) {
const requestId = randomUUID().slice(0, 8)
let driver = null
let session = null
try {
const body = await request.json()
const params = UpdateSchema.parse(body)
logger.info(
`[${requestId}] Executing Neo4j update on ${params.host}:${params.port}/${params.database}`
)
const validation = validateCypherQuery(params.cypherQuery)
if (!validation.isValid) {
logger.warn(`[${requestId}] Cypher query validation failed: ${validation.error}`)
return NextResponse.json(
{ error: `Query validation failed: ${validation.error}` },
{ status: 400 }
)
}
driver = await createNeo4jDriver({
host: params.host,
port: params.port,
database: params.database,
username: params.username,
password: params.password,
encryption: params.encryption,
})
session = driver.session({ database: params.database })
const result = await session.run(params.cypherQuery, params.parameters)
const records = result.records.map((record) => {
const obj: Record<string, unknown> = {}
record.keys.forEach((key) => {
if (typeof key === 'string') {
obj[key] = convertNeo4jTypesToJSON(record.get(key))
}
})
return obj
})
const summary = {
resultAvailableAfter: result.summary.resultAvailableAfter.toNumber(),
resultConsumedAfter: result.summary.resultConsumedAfter.toNumber(),
counters: {
nodesCreated: result.summary.counters.updates().nodesCreated,
nodesDeleted: result.summary.counters.updates().nodesDeleted,
relationshipsCreated: result.summary.counters.updates().relationshipsCreated,
relationshipsDeleted: result.summary.counters.updates().relationshipsDeleted,
propertiesSet: result.summary.counters.updates().propertiesSet,
labelsAdded: result.summary.counters.updates().labelsAdded,
labelsRemoved: result.summary.counters.updates().labelsRemoved,
indexesAdded: result.summary.counters.updates().indexesAdded,
indexesRemoved: result.summary.counters.updates().indexesRemoved,
constraintsAdded: result.summary.counters.updates().constraintsAdded,
constraintsRemoved: result.summary.counters.updates().constraintsRemoved,
},
}
logger.info(
`[${requestId}] Update executed successfully, ${summary.counters.propertiesSet} properties set, returned ${records.length} records`
)
return NextResponse.json({
message: `Updated ${summary.counters.propertiesSet} properties`,
records,
recordCount: records.length,
summary,
})
} catch (error) {
if (error instanceof z.ZodError) {
logger.warn(`[${requestId}] Invalid request data`, { errors: error.errors })
return NextResponse.json(
{ error: 'Invalid request data', details: error.errors },
{ status: 400 }
)
}
const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred'
logger.error(`[${requestId}] Neo4j update failed:`, error)
return NextResponse.json({ error: `Neo4j update failed: ${errorMessage}` }, { status: 500 })
} finally {
if (session) {
await session.close()
}
if (driver) {
await driver.close()
}
}
}

View File

@@ -0,0 +1,164 @@
import neo4j from 'neo4j-driver'
import type { Neo4jConnectionConfig } from '@/tools/neo4j/types'
export async function createNeo4jDriver(config: Neo4jConnectionConfig) {
const isAuraHost =
config.host === 'databases.neo4j.io' || config.host.endsWith('.databases.neo4j.io')
let protocol: string
if (isAuraHost) {
protocol = 'neo4j+s'
} else {
protocol = config.encryption === 'enabled' ? 'bolt+s' : 'bolt'
}
const uri = `${protocol}://${config.host}:${config.port}`
const driverConfig: any = {
maxConnectionPoolSize: 1,
connectionTimeout: 10000,
}
if (!protocol.endsWith('+s')) {
driverConfig.encrypted = config.encryption === 'enabled' ? 'ENCRYPTION_ON' : 'ENCRYPTION_OFF'
}
const driver = neo4j.driver(uri, neo4j.auth.basic(config.username, config.password), driverConfig)
await driver.verifyConnectivity()
return driver
}
export function validateCypherQuery(
query: string,
allowDangerousOps = false
): { isValid: boolean; error?: string } {
if (!query || typeof query !== 'string') {
return {
isValid: false,
error: 'Query must be a non-empty string',
}
}
if (!allowDangerousOps) {
const dangerousPatterns = [
/DROP\s+DATABASE/i,
/DROP\s+CONSTRAINT/i,
/DROP\s+INDEX/i,
/CREATE\s+DATABASE/i,
/CREATE\s+CONSTRAINT/i,
/CREATE\s+INDEX/i,
/CALL\s+dbms\./i,
/CALL\s+db\./i,
/LOAD\s+CSV/i,
/apoc\.cypher\.run/i,
/apoc\.load/i,
/apoc\.periodic/i,
]
for (const pattern of dangerousPatterns) {
if (pattern.test(query)) {
return {
isValid: false,
error:
'Query contains potentially dangerous operations (schema changes, system procedures, or external data loading)',
}
}
}
}
const trimmedQuery = query.trim()
if (trimmedQuery.length === 0) {
return {
isValid: false,
error: 'Query cannot be empty',
}
}
return { isValid: true }
}
export function sanitizeLabelName(name: string): string {
if (!/^[a-zA-Z][a-zA-Z0-9_]*$/.test(name)) {
throw new Error(
'Invalid label name. Must start with a letter and contain only letters, numbers, and underscores.'
)
}
return name
}
export function sanitizePropertyKey(key: string): string {
if (!/^[a-zA-Z][a-zA-Z0-9_]*$/.test(key)) {
throw new Error(
'Invalid property key. Must start with a letter and contain only letters, numbers, and underscores.'
)
}
return key
}
export function sanitizeRelationshipType(type: string): string {
if (!/^[A-Z][A-Z0-9_]*$/.test(type)) {
throw new Error(
'Invalid relationship type. Must start with an uppercase letter and contain only uppercase letters, numbers, and underscores.'
)
}
return type
}
export function convertNeo4jTypesToJSON(value: unknown): unknown {
if (value === null || value === undefined) {
return value
}
if (typeof value === 'object' && value !== null && 'toNumber' in value) {
return (value as any).toNumber()
}
if (Array.isArray(value)) {
return value.map(convertNeo4jTypesToJSON)
}
if (typeof value === 'object') {
const obj = value as any
if (obj.labels && obj.properties && obj.identity) {
return {
identity: obj.identity.toNumber ? obj.identity.toNumber() : obj.identity,
labels: obj.labels,
properties: convertNeo4jTypesToJSON(obj.properties),
}
}
if (obj.type && obj.properties && obj.identity && obj.start && obj.end) {
return {
identity: obj.identity.toNumber ? obj.identity.toNumber() : obj.identity,
start: obj.start.toNumber ? obj.start.toNumber() : obj.start,
end: obj.end.toNumber ? obj.end.toNumber() : obj.end,
type: obj.type,
properties: convertNeo4jTypesToJSON(obj.properties),
}
}
if (obj.start && obj.end && obj.segments) {
return {
start: convertNeo4jTypesToJSON(obj.start),
end: convertNeo4jTypesToJSON(obj.end),
segments: obj.segments.map((seg: any) => ({
start: convertNeo4jTypesToJSON(seg.start),
relationship: convertNeo4jTypesToJSON(seg.relationship),
end: convertNeo4jTypesToJSON(seg.end),
})),
length: obj.length,
}
}
const result: Record<string, unknown> = {}
for (const [key, val] of Object.entries(obj)) {
result[key] = convertNeo4jTypesToJSON(val)
}
return result
}
return value
}

View File

@@ -6,6 +6,7 @@ import { createLogger } from '@/lib/logs/console/logger'
import { processSingleFileToUserFile } from '@/lib/uploads/utils/file-utils'
import { downloadFileFromStorage } from '@/lib/uploads/utils/file-utils.server'
import { generateRequestId } from '@/lib/utils'
import { normalizeExcelValues } from '@/tools/onedrive/utils'
export const dynamic = 'force-dynamic'
@@ -13,6 +14,14 @@ const logger = createLogger('OneDriveUploadAPI')
const MICROSOFT_GRAPH_BASE = 'https://graph.microsoft.com/v1.0'
const ExcelCellSchema = z.union([z.string(), z.number(), z.boolean(), z.null()])
const ExcelRowSchema = z.array(ExcelCellSchema)
const ExcelValuesSchema = z.union([
z.string(),
z.array(ExcelRowSchema),
z.array(z.record(ExcelCellSchema)),
])
const OneDriveUploadSchema = z.object({
accessToken: z.string().min(1, 'Access token is required'),
fileName: z.string().min(1, 'File name is required'),
@@ -20,7 +29,7 @@ const OneDriveUploadSchema = z.object({
folderId: z.string().optional().nullable(),
mimeType: z.string().optional(),
// Optional Excel write-after-create inputs
values: z.array(z.array(z.union([z.string(), z.number(), z.boolean(), z.null()]))).optional(),
values: ExcelValuesSchema.optional(),
})
export async function POST(request: NextRequest) {
@@ -46,6 +55,7 @@ export async function POST(request: NextRequest) {
const body = await request.json()
const validatedData = OneDriveUploadSchema.parse(body)
const excelValues = normalizeExcelValues(validatedData.values)
let fileBuffer: Buffer
let mimeType: string
@@ -180,7 +190,7 @@ export async function POST(request: NextRequest) {
// If this is an Excel creation and values were provided, write them using the Excel API
let excelWriteResult: any | undefined
const shouldWriteExcelContent =
isExcelCreation && Array.isArray(validatedData.values) && validatedData.values.length > 0
isExcelCreation && Array.isArray(excelValues) && excelValues.length > 0
if (shouldWriteExcelContent) {
try {
@@ -232,7 +242,7 @@ export async function POST(request: NextRequest) {
logger.warn(`[${requestId}] Error listing worksheets, using default Sheet1`, listError)
}
let processedValues: any = validatedData.values || []
let processedValues: any = excelValues || []
if (
Array.isArray(processedValues) &&

View File

@@ -78,9 +78,16 @@ export async function POST(request: NextRequest) {
}
logger.info(`[${requestId}] Message sent successfully`)
const messageObj = data.message || {
type: 'message',
ts: data.ts,
text: validatedData.text,
channel: data.channel,
}
return NextResponse.json({
success: true,
output: {
message: messageObj,
ts: data.ts,
channel: data.channel,
},
@@ -107,9 +114,16 @@ export async function POST(request: NextRequest) {
})
const data = await response.json()
const messageObj = data.message || {
type: 'message',
ts: data.ts,
text: validatedData.text,
channel: data.channel,
}
return NextResponse.json({
success: true,
output: {
message: messageObj,
ts: data.ts,
channel: data.channel,
},
@@ -174,9 +188,16 @@ export async function POST(request: NextRequest) {
})
const data = await response.json()
const messageObj = data.message || {
type: 'message',
ts: data.ts,
text: validatedData.text,
channel: data.channel,
}
return NextResponse.json({
success: true,
output: {
message: messageObj,
ts: data.ts,
channel: data.channel,
},
@@ -211,10 +232,28 @@ export async function POST(request: NextRequest) {
logger.info(`[${requestId}] Files uploaded and shared successfully`)
// For file uploads, construct a message object
const fileTs = completeData.files?.[0]?.created?.toString() || (Date.now() / 1000).toString()
const fileMessage = {
type: 'message',
ts: fileTs,
text: validatedData.text,
channel: validatedData.channel,
files: completeData.files?.map((file: any) => ({
id: file?.id,
name: file?.name,
mimetype: file?.mimetype,
size: file?.size,
url_private: file?.url_private,
permalink: file?.permalink,
})),
}
return NextResponse.json({
success: true,
output: {
ts: completeData.files?.[0]?.created || Date.now() / 1000,
message: fileMessage,
ts: fileTs,
channel: validatedData.channel,
fileCount: uploadedFileIds.length,
},

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